[smuxi/experiments/tag_messages: 41/41] (WIP) Frontend-GNOME: tag messages



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]