[smuxi/experiments/tag_messages: 41/41] (WIP) Frontend-GNOME: tag messages
- From: Mirco M. M. Bauer <mmmbauer src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [smuxi/experiments/tag_messages: 41/41] (WIP) Frontend-GNOME: tag messages
- Date: Sun, 3 Apr 2016 10:58:40 +0000 (UTC)
commit 1dd2b7dab36fe6560f740d360b79d00a573b1c53
Author: Mirco Bauer <meebey meebey net>
Date: Sun Apr 3 12:33:01 2016 +0200
(WIP) Frontend-GNOME: tag messages
TODO: re-calculate seen message/highlight counters from cached messages
https://github.com/cyotek/Cyotek.Collections.Generic.CircularBuffer
src/Frontend-GNOME/Frontend-GNOME.csproj | 1 +
src/Frontend-GNOME/Makefile.am | 1 +
src/Frontend-GNOME/Views/Chats/ChatView.cs | 9 ++-
src/Frontend-GNOME/Views/MessageTextView.cs | 88 ++++++++++++++++++++++++++-
src/Frontend-GNOME/Views/Tags/MessageTag.cs | 48 +++++++++++++++
5 files changed, 140 insertions(+), 7 deletions(-)
---
diff --git a/src/Frontend-GNOME/Frontend-GNOME.csproj b/src/Frontend-GNOME/Frontend-GNOME.csproj
index 995797f..a0682ed 100644
--- a/src/Frontend-GNOME/Frontend-GNOME.csproj
+++ b/src/Frontend-GNOME/Frontend-GNOME.csproj
@@ -165,6 +165,7 @@
<Compile Include="Views\Tags\PersonTag.cs" />
<Compile Include="Views\ChatTreeView.cs" />
<Compile Include="Views\Tags\EmojiTag.cs" />
+ <Compile Include="Views\Tags\MessageTag.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="smuxi-frontend-gnome.exe.config">
diff --git a/src/Frontend-GNOME/Makefile.am b/src/Frontend-GNOME/Makefile.am
index 1763f66..5a384a4 100644
--- a/src/Frontend-GNOME/Makefile.am
+++ b/src/Frontend-GNOME/Makefile.am
@@ -162,6 +162,7 @@ FILES = \
Views/Assistants/Engine/EngineAssistant.cs \
Views/Tags/EmojiTag.cs \
Views/Tags/LinkTag.cs \
+ Views/Tags/MessageTag.cs \
Views/Tags/PersonTag.cs \
QuickConnectDialog.cs \
SteticPreferencesDialog.cs \
diff --git a/src/Frontend-GNOME/Views/Chats/ChatView.cs b/src/Frontend-GNOME/Views/Chats/ChatView.cs
index 25c8de2..0e20b99 100644
--- a/src/Frontend-GNOME/Views/Chats/ChatView.cs
+++ b/src/Frontend-GNOME/Views/Chats/ChatView.cs
@@ -562,12 +562,13 @@ namespace Smuxi.Frontend.Gnome
// GTK+ in between for blocking the GUI thread less
foreach (MessageModel msg in SyncedMessages) {
AddMessage(msg);
- if (msg.TimeStamp <= SyncedLastSeenMessage) {
- // let the user know at which position new messages start
- _OutputMessageTextView.UpdateMarkerline();
- }
}
}
+ var lastSeenMessage = SyncedLastSeenMessage;
+ if (lastSeenMessage != DateTime.MinValue) {
+ // let the user know at which position new messages start
+ _OutputMessageTextView.UpdateMarkerline(lastSeenMessage);
+ }
}
// as we don't track which events have already been seen it would
diff --git a/src/Frontend-GNOME/Views/MessageTextView.cs b/src/Frontend-GNOME/Views/MessageTextView.cs
index 6a00445..7e2ece8 100644
--- a/src/Frontend-GNOME/Views/MessageTextView.cs
+++ b/src/Frontend-GNOME/Views/MessageTextView.cs
@@ -44,6 +44,9 @@ namespace Smuxi.Frontend.Gnome
private Gtk.TextTagTable _MessageTextTagTable;
private MessageModel _LastMessage;
private bool _ShowTimestamps;
+ // TODO: use list that limits of the number of items and discards the oldest entry
+ // a circle buffer
+ List<MessageModel> Messages { get; set; }
private bool _ShowHighlight;
private bool _ShowMarkerline;
private bool _AtLinkTag;
@@ -160,6 +163,7 @@ namespace Smuxi.Frontend.Gnome
_MessageTextTagTable = BuildTagTable();
_ThemeSettings = new ThemeSettings();
+ Messages = new List<MessageModel>();
EmojiCache = new IconCache("emoji");
Buffer = new Gtk.TextBuffer(_MessageTextTagTable);
@@ -482,11 +486,15 @@ namespace Smuxi.Frontend.Gnome
buffer.ApplyTag(PersonTag, msgStartIter, nickEndIter);
buffer.ApplyTag(personTag, msgStartIter, nickEndIter);
}
- buffer.DeleteMark(startMark);
- buffer.DeleteMark(msgStartMark);
if (addLinebreak) {
buffer.Insert(ref iter, "\n");
}
+ var msgTag = new MessageTag(startMark, msg);
+ _MessageTextTagTable.Add(msgTag);
+ startIter = buffer.GetIterAtMark(startMark);
+ buffer.ApplyTag(msgTag, startIter, iter);
+ //buffer.DeleteMark(startMark);
+ buffer.DeleteMark(msgStartMark);
CheckBufferSize();
@@ -628,6 +636,76 @@ namespace Smuxi.Frontend.Gnome
QueueDraw();
}
+ public void UpdateMarkerline(DateTime timestamp)
+ {
+ Trace.Call(timestamp);
+
+ MessageTag foundTag = null;
+ _MessageTextTagTable.Foreach(tag => {
+ if (!(tag is MessageTag) || foundTag != null) {
+ return;
+ }
+
+ var msgTag = (MessageTag) tag;
+ if (msgTag.Message.TimeStamp == timestamp) {
+ foundTag = msgTag;
+ }
+ });
+ if (foundTag == null) {
+ // tag not found
+ return;
+ }
+
+ var buffer = Buffer;
+ var msg_begin_iter = buffer.GetIterAtMark(foundTag.BeginMark);
+ var msg_end_iter = msg_begin_iter;
+ // move to end of tag
+ if (!msg_end_iter.ForwardToTagToggle(foundTag)) {
+ // tag end not found
+ return;
+ }
+
+ _MarkerlineBufferPosition = msg_end_iter.Offset - 1;
+ QueueDraw();
+ }
+
+ public void UpdateMarkerline(MessageModel msg)
+ {
+ Trace.Call(msg);
+
+ if (msg == null) {
+ throw new ArgumentNullException("msg");
+ }
+
+ MessageTag foundTag = null;
+ _MessageTextTagTable.Foreach(tag => {
+ if (!(tag is MessageTag) || foundTag != null) {
+ return;
+ }
+
+ var msgTag = (MessageTag) tag;
+ if (msgTag.Message == msg) {
+ foundTag = msgTag;
+ }
+ });
+ if (foundTag == null) {
+ // tag not found
+ return;
+ }
+
+ var buffer = Buffer;
+ var msg_begin_iter = buffer.GetIterAtMark(foundTag.BeginMark);
+ var msg_end_iter = msg_begin_iter;
+ // move to end of tag
+ if (!msg_end_iter.ForwardToTagToggle(foundTag)) {
+ // tag end not found
+ return;
+ }
+
+ _MarkerlineBufferPosition = msg_end_iter.Offset - 1;
+ QueueDraw();
+ }
+
public override void Dispose()
{
// HACK: this shouldn't be needed but GTK# keeps GC handles
@@ -947,7 +1025,11 @@ namespace Smuxi.Frontend.Gnome
tagName.StartsWith("bg_color:"))) {
continue;
}
- if (tag.IndentSet || tag is LinkTag || tag is PersonTag || tag is EmojiTag) {
+ if (tag.IndentSet ||
+ tag is LinkTag ||
+ tag is PersonTag ||
+ tag is EmojiTag ||
+ tag is MessageTag) {
buffer.RemoveTag(tag, start_iter, end_iter);
_MessageTextTagTable.Remove(tag);
tag.Dispose();
diff --git a/src/Frontend-GNOME/Views/Tags/MessageTag.cs b/src/Frontend-GNOME/Views/Tags/MessageTag.cs
new file mode 100644
index 0000000..5176b1e
--- /dev/null
+++ b/src/Frontend-GNOME/Views/Tags/MessageTag.cs
@@ -0,0 +1,48 @@
+// Smuxi - Smart MUltipleXed Irc
+//
+// Copyright (c) 2016 Mirco Bauer <meebey meebey net>
+//
+// Full GPL License: <http://www.gnu.org/licenses/gpl.txt>
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+using System;
+using Smuxi.Engine;
+
+namespace Smuxi.Frontend.Gnome
+{
+ public class MessageTag : Gtk.TextTag
+ {
+ public Gtk.TextMark BeginMark { get; private set; }
+ public MessageModel Message { get; private set; }
+
+ public MessageTag(Gtk.TextMark beginMark, MessageModel msg) : base(null)
+ {
+ if (beginMark == null) {
+ throw new ArgumentNullException("beginMark");
+ }
+ if (msg == null) {
+ throw new ArgumentNullException("msg");
+ }
+
+ BeginMark = beginMark;
+ Message = msg;
+ }
+
+ protected MessageTag(IntPtr handle) : base(handle)
+ {
+ }
+ }
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]