[gitg] Highlight subject and right margin



commit 69352ca4138ab42db675667a44186428c601e6a8
Author: Jesse van den Kieboom <jessevdk gmail com>
Date:   Sat Jul 6 21:47:15 2013 +0200

    Highlight subject and right margin

 data/org.gnome.gitg.gschema.xml.in.in |    8 ++
 gitg/commit/gitg-commit-dialog.vala   |  120 +++++++++++++++++++++++++++++++++
 2 files changed, 128 insertions(+), 0 deletions(-)
---
diff --git a/data/org.gnome.gitg.gschema.xml.in.in b/data/org.gnome.gitg.gschema.xml.in.in
index db26536..c9cdb5f 100644
--- a/data/org.gnome.gitg.gschema.xml.in.in
+++ b/data/org.gnome.gitg.gschema.xml.in.in
@@ -94,6 +94,14 @@
         preference is set to TRUE.
       </_description>
     </key>
+    <key name="subject-right-margin-at" type="i">
+      <default>50</default>
+      <_summary>Column at Which Subject Right Margin is Shown</_summary>
+      <_description>
+        The column at which the right margin is shown for the subject
+        if the right-margin preference is set to TRUE.
+      </_description>
+    </key>
   </schema>
   <schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.gitg.preferences.diff" 
path="/org/gnome/gitg/preferences/diff/">
     <key name="external" type="b">
diff --git a/gitg/commit/gitg-commit-dialog.vala b/gitg/commit/gitg-commit-dialog.vala
index f20bbec..ae73a5e 100644
--- a/gitg/commit/gitg-commit-dialog.vala
+++ b/gitg/commit/gitg-commit-dialog.vala
@@ -104,6 +104,9 @@ class Dialog : Gtk.Dialog
                }
        }
 
+       [Notify]
+       public int subject_right_margin_position { get; set; }
+
        private void load_author_info()
        {
                if (d_cancel_avatar != null)
@@ -189,6 +192,123 @@ class Dialog : Gtk.Dialog
                                      "right-margin-position",
                                      SettingsBindFlags.GET |
                                      SettingsBindFlags.SET);
+
+               message_settings.bind("subject-right-margin-at",
+                                     this,
+                                     "subject-right-margin-position",
+                                     SettingsBindFlags.GET |
+                                     SettingsBindFlags.SET);
+
+               init_message_area();
+       }
+
+       private Gtk.TextTag d_subject_tag;
+       private Gtk.TextTag d_too_long_tag;
+
+       private void init_message_area()
+       {
+               var b = d_source_view_message.buffer;
+
+               var ctx = d_source_view_message.get_style_context();
+               ctx.save();
+               ctx.add_class("warning");
+               var fg = ctx.get_color(Gtk.StateFlags.NORMAL);
+               var bg = ctx.get_background_color(Gtk.StateFlags.NORMAL);
+               ctx.restore();
+
+               d_subject_tag = b.create_tag("subject",
+                                            "weight", Pango.Weight.BOLD);
+
+               d_too_long_tag = b.create_tag("too-long",
+                                             "background-rgba", bg,
+                                             "foreground-rgba", fg);
+
+               b.changed.connect(() => {
+                       do_highlight();
+               });
+
+               d_source_view_message.notify["show-right-margin"].connect(() => {
+                       do_highlight();
+               });
+       }
+
+       private void do_highlight()
+       {
+               var b = d_source_view_message.buffer;
+
+               Gtk.TextIter start;
+               Gtk.TextIter end;
+
+               b.get_bounds(out start, out end);
+               b.remove_tag(d_subject_tag, start, end);
+               b.remove_tag(d_too_long_tag, start, end);
+
+               if (!d_source_view_message.show_right_margin)
+               {
+                       return;
+               }
+
+               Gtk.TextIter sstart;
+               Gtk.TextIter send;
+
+               if (!start.forward_search("\n\n",
+                                         Gtk.TextSearchFlags.TEXT_ONLY,
+                                         out sstart,
+                                         out send,
+                                         null))
+               {
+                       sstart = end;
+                       send = end;
+               }
+
+               b.apply_tag(d_subject_tag, start, sstart);
+
+               var toolong = sstart;
+               var smargin = subject_right_margin_position;
+
+               while (true)
+               {
+                       var off = toolong.get_line_offset();
+
+                       if (off > smargin)
+                       {
+                               var border = toolong;
+                               border.set_line_offset(smargin);
+
+                               b.apply_tag(d_too_long_tag, border, toolong);
+                       }
+
+                       if (toolong.get_line() == 0)
+                       {
+                               break;
+                       }
+
+                       toolong.backward_line();
+                       toolong.forward_to_line_end();
+               }
+
+               var rmargin = (int)d_source_view_message.right_margin_position;
+
+               while (!send.equal(end))
+               {
+                       if (!send.ends_line())
+                       {
+                               send.forward_to_line_end();
+                       }
+
+                       if (send.get_line_offset() > rmargin)
+                       {
+                               var lstart = send;
+                               lstart.set_line_offset(rmargin);
+
+                               b.apply_tag(d_too_long_tag, lstart, send);
+                       }
+
+                       if (!send.forward_line())
+                       {
+                               break;
+                       }
+               }
        }
 
        public Dialog(Ggit.Signature author)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]