[gedit] Statusbar: line/col popover menu



commit 8832427bb382147afbb2106318480eca486f8ce3
Author: Sebastien Lafargue <slafargue gnome org>
Date:   Wed Apr 16 19:24:06 2014 +0200

    Statusbar: line/col popover menu
    
    https://bugzilla.gnome.org/show_bug.cgi?id=726739

 gedit/gedit-app.c                |   11 ++++
 gedit/gedit-app.h                |    2 +
 gedit/gedit-menu.ui              |   20 ++++++++
 gedit/gedit-status-menu-button.c |    2 +-
 gedit/gedit-statusbar.c          |   19 ++++++-
 gedit/gedit-statusbar.h          |    2 +
 gedit/gedit-statusbar.ui         |   14 +++--
 gedit/gedit-window-private.h     |    1 +
 gedit/gedit-window.c             |  101 +++++++++++++++++++++++++++++++++++--
 9 files changed, 157 insertions(+), 15 deletions(-)
---
diff --git a/gedit/gedit-app.c b/gedit/gedit-app.c
index 2051c5f..d23fb5f 100644
--- a/gedit/gedit-app.c
+++ b/gedit/gedit-app.c
@@ -80,6 +80,7 @@ struct _GeditAppPrivate
        GMenuModel        *window_menu;
        GMenuModel        *notebook_menu;
        GMenuModel        *tab_width_menu;
+       GMenuModel        *line_col_menu;
 
        PeasExtensionSet  *extensions;
        GNetworkMonitor   *monitor;
@@ -501,6 +502,7 @@ gedit_app_startup (GApplication *application)
 
                app->priv->notebook_menu = G_MENU_MODEL (gtk_builder_get_object (builder, "notebook_menu"));
                app->priv->tab_width_menu = G_MENU_MODEL (gtk_builder_get_object (builder, "tab_width_menu"));
+               app->priv->line_col_menu = G_MENU_MODEL (gtk_builder_get_object (builder, "line_col_menu"));
        }
 
        g_object_unref (builder);
@@ -1656,6 +1658,15 @@ _gedit_app_get_tab_width_menu (GeditApp *app)
        return app->priv->tab_width_menu;
 }
 
+GMenuModel *
+_gedit_app_get_line_col_menu (GeditApp *app)
+{
+       g_return_val_if_fail (GEDIT_IS_APP (app), NULL);
+
+       return app->priv->line_col_menu;
+}
+
+
 GeditMenuExtension *
 _gedit_app_extend_menu (GeditApp    *app,
                        const gchar *extension_point)
diff --git a/gedit/gedit-app.h b/gedit/gedit-app.h
index 5955b0e..69cec85 100644
--- a/gedit/gedit-app.h
+++ b/gedit/gedit-app.h
@@ -141,6 +141,8 @@ GMenuModel          *_gedit_app_get_notebook_menu           (GeditApp  *app);
 
 GMenuModel             *_gedit_app_get_tab_width_menu          (GeditApp  *app);
 
+GMenuModel             *_gedit_app_get_line_col_menu           (GeditApp  *app);
+
 GeditMenuExtension     *_gedit_app_extend_menu                 (GeditApp    *app,
                                                                 const gchar *extension_point);
 
diff --git a/gedit/gedit-menu.ui b/gedit/gedit-menu.ui
index 473d5ae..702a197 100644
--- a/gedit/gedit-menu.ui
+++ b/gedit/gedit-menu.ui
@@ -309,4 +309,24 @@
       </item>
     </section>
   </menu>
+  <menu id="line_col_menu">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Display line numbers</attribute>
+        <attribute name="action">win.show-line-numbers</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Display right margin</attribute>
+        <attribute name="action">win.display-right-margin</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Highlight current line</attribute>
+        <attribute name="action">win.highlight-current-line</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Text wrapping</attribute>
+        <attribute name="action">win.wrap-mode</attribute>
+      </item>
+    </section>
+  </menu>
 </interface>
diff --git a/gedit/gedit-status-menu-button.c b/gedit/gedit-status-menu-button.c
index d091923..8b58743 100644
--- a/gedit/gedit-status-menu-button.c
+++ b/gedit/gedit-status-menu-button.c
@@ -104,7 +104,7 @@ gedit_status_menu_button_class_init (GeditStatusMenuButtonClass *klass)
        /* Bind class to template */
        gtk_widget_class_set_template_from_resource (widget_class,
                                                     "/org/gnome/gedit/ui/gedit-status-menu-button.ui");
-       gtk_widget_class_bind_template_child_private (widget_class, GeditStatusMenuButton, label);
+       gtk_widget_class_bind_template_child_internal_private (widget_class, GeditStatusMenuButton, label);
 
        klass->priv = G_TYPE_CLASS_GET_PRIVATE (klass, GEDIT_TYPE_STATUS_MENU_BUTTON, 
GeditStatusMenuButtonClassPrivate);
 
diff --git a/gedit/gedit-statusbar.c b/gedit/gedit-statusbar.c
index 081f930..c7e1ab5 100644
--- a/gedit/gedit-statusbar.c
+++ b/gedit/gedit-statusbar.c
@@ -26,6 +26,8 @@
 #include <glib/gi18n.h>
 #include <gtk/gtk.h>
 #include "gedit-statusbar.h"
+#include "gedit-app.h"
+#include "gedit-status-menu-button.h"
 
 struct _GeditStatusbarPrivate
 {
@@ -35,7 +37,7 @@ struct _GeditStatusbarPrivate
        GtkWidget     *load_image;
        GtkWidget     *save_image;
        GtkWidget     *print_image;
-       GtkWidget     *cursor_position_label;
+       GtkWidget     *line_col_button;
        GtkWidget     *overwrite_mode_label;
 
        /* tmp flash timeout data */
@@ -90,7 +92,7 @@ gedit_statusbar_class_init (GeditStatusbarClass *klass)
        gtk_widget_class_bind_template_child_private (widget_class, GeditStatusbar, load_image);
        gtk_widget_class_bind_template_child_private (widget_class, GeditStatusbar, save_image);
        gtk_widget_class_bind_template_child_private (widget_class, GeditStatusbar, print_image);
-       gtk_widget_class_bind_template_child_private (widget_class, GeditStatusbar, cursor_position_label);
+       gtk_widget_class_bind_template_child_private (widget_class, GeditStatusbar, line_col_button);
        gtk_widget_class_bind_template_child_private (widget_class, GeditStatusbar, overwrite_mode_label);
 }
 
@@ -103,6 +105,10 @@ gedit_statusbar_init (GeditStatusbar *statusbar)
 
        gtk_label_set_width_chars (GTK_LABEL (statusbar->priv->overwrite_mode_label),
                                   get_overwrite_mode_length ());
+
+       /* Line Col button */
+       gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (statusbar->priv->line_col_button),
+                                       _gedit_app_get_line_col_menu (GEDIT_APP (g_application_get_default 
())));
 }
 
 /**
@@ -118,6 +124,13 @@ gedit_statusbar_new (void)
        return GTK_WIDGET (g_object_new (GEDIT_TYPE_STATUSBAR, NULL));
 }
 
+void
+_gedit_statusbar_line_col_button_set_visible (GeditStatusbar *statusbar,
+                                              gboolean        visible)
+{
+       gtk_widget_set_visible (statusbar->priv->line_col_button, visible);
+}
+
 /**
  * gedit_statusbar_set_overwrite:
  * @statusbar: a #GeditStatusbar
@@ -170,7 +183,7 @@ gedit_statusbar_set_cursor_position (GeditStatusbar *statusbar,
                msg = g_strdup_printf (_("  Ln %d, Col %d"), line, col);
        }
 
-       gtk_label_set_text (GTK_LABEL (statusbar->priv->cursor_position_label), msg);
+       gedit_status_menu_button_set_label (GEDIT_STATUS_MENU_BUTTON (statusbar->priv->line_col_button), msg);
 
        g_free (msg);
 }
diff --git a/gedit/gedit-statusbar.h b/gedit/gedit-statusbar.h
index d9ba761..d1a2ca6 100644
--- a/gedit/gedit-statusbar.h
+++ b/gedit/gedit-statusbar.h
@@ -72,6 +72,8 @@ void           gedit_statusbar_flash_message          (GeditStatusbar   *statusbar,
                                                         const gchar      *format,
                                                         ...) G_GNUC_PRINTF(3, 4);
 
+void _gedit_statusbar_line_col_button_set_visible      (GeditStatusbar *statusbar,
+                                                         gboolean        visible);
 G_END_DECLS
 
 #endif
diff --git a/gedit/gedit-statusbar.ui b/gedit/gedit-statusbar.ui
index e07ed14..c144121 100644
--- a/gedit/gedit-statusbar.ui
+++ b/gedit/gedit-statusbar.ui
@@ -99,16 +99,20 @@
       </packing>
     </child>
     <child>
-      <object class="GtkLabel" id="cursor_position_label">
+      <object class="GeditStatusMenuButton" id="line_col_button">
         <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="width_chars">18</property>
+        <property name="use_popover">True</property>
+        <child internal-child="label">
+          <object class="GtkLabel">
+            <property name="width_chars">18</property>
+            <property name="can_focus">False</property>
+          </object>
+        </child>
       </object>
       <packing>
         <property name="expand">False</property>
-        <property name="fill">True</property>
+        <property name="fill">False</property>
         <property name="pack_type">end</property>
-        <property name="position">1</property>
       </packing>
     </child>
   </template>
diff --git a/gedit/gedit-window-private.h b/gedit/gedit-window-private.h
index 84abee6..cf116ee 100644
--- a/gedit/gedit-window-private.h
+++ b/gedit/gedit-window-private.h
@@ -74,6 +74,7 @@ struct _GeditWindowPrivate
        guint           bracket_match_message_cid;
        guint           tab_width_id;
        guint           language_changed_id;
+       guint           wrap_mode_changed_id;
 
        /* Headerbars */
        GtkWidget      *titlebar_paned;
diff --git a/gedit/gedit-window.c b/gedit/gedit-window.c
index 645b3a6..55e930f 100644
--- a/gedit/gedit-window.c
+++ b/gedit/gedit-window.c
@@ -1126,6 +1126,67 @@ language_changed (GObject     *object,
 }
 
 static void
+update_statusbar_wrap_mode_checkbox_from_view (GeditWindow *window,
+                                               GeditView   *view)
+{
+       GtkWrapMode wrap_mode;
+       GSimpleAction *simple_action;
+
+       wrap_mode = gtk_text_view_get_wrap_mode (GTK_TEXT_VIEW (view));
+
+       simple_action = G_SIMPLE_ACTION (g_action_map_lookup_action (G_ACTION_MAP (window), "wrap-mode"));
+       g_simple_action_set_state (simple_action, g_variant_new_boolean (wrap_mode != GTK_WRAP_NONE));
+}
+static void
+on_view_wrap_mode_changed (GObject     *object,
+                           GParamSpec  *pspec,
+                           GeditWindow *window)
+{
+       GeditView *view = gedit_window_get_active_view (window);
+
+       update_statusbar_wrap_mode_checkbox_from_view (window, view);
+}
+
+static void
+_gedit_window_text_wrapping_change_state (GSimpleAction *simple,
+                                          GVariant      *value,
+                                          gpointer       window)
+{
+       gboolean result;
+       GeditView *view;
+       GtkWrapMode wrap_mode;
+       GtkWrapMode current_wrap_mode;
+
+       g_simple_action_set_state (simple, value);
+
+       wrap_mode = g_settings_get_enum (GEDIT_WINDOW (window)->priv->editor_settings,
+                                        GEDIT_SETTINGS_WRAP_MODE);
+
+       current_wrap_mode = wrap_mode;
+       result = g_variant_get_boolean (value);
+
+       if (result && wrap_mode == GTK_WRAP_NONE)
+       {
+               current_wrap_mode = g_settings_get_enum (GEDIT_WINDOW (window)->priv->editor_settings,
+                                                        GEDIT_SETTINGS_WRAP_LAST_SPLIT_MODE);
+       }
+       else if (!result)
+       {
+               current_wrap_mode = GTK_WRAP_NONE;
+       }
+
+       view = gedit_window_get_active_view (GEDIT_WINDOW (window));
+
+       g_signal_handler_block (view, GEDIT_WINDOW (window)->priv->wrap_mode_changed_id);
+       gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), current_wrap_mode);
+       g_signal_handler_unblock (view, GEDIT_WINDOW (window)->priv->wrap_mode_changed_id);
+}
+
+static GActionEntry text_wrapping_entrie[] = {
+       {"wrap-mode", NULL, NULL, "false", _gedit_window_text_wrapping_change_state},
+};
+
+static void
 sync_current_tab_actions (GeditWindow *window,
                          GeditView   *old_view,
                          GeditView   *new_view)
@@ -1135,6 +1196,11 @@ sync_current_tab_actions (GeditWindow *window,
                g_action_map_remove_action (G_ACTION_MAP (window), "auto-indent");
                g_action_map_remove_action (G_ACTION_MAP (window), "tab-width");
                g_action_map_remove_action (G_ACTION_MAP (window), "use-spaces");
+               g_action_map_remove_action (G_ACTION_MAP (window), "show-line-numbers");
+               g_action_map_remove_action (G_ACTION_MAP (window), "display-right-margin");
+               g_action_map_remove_action (G_ACTION_MAP (window), "wrap-mode");
+
+               g_signal_handler_disconnect (old_view, window->priv->wrap_mode_changed_id);
        }
 
        if (new_view)
@@ -1152,6 +1218,30 @@ sync_current_tab_actions (GeditWindow *window,
                action = g_property_action_new ("use-spaces", new_view, "insert-spaces-instead-of-tabs");
                g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (action));
                g_object_unref (action);
+
+               action = g_property_action_new ("show-line-numbers", new_view, "show-line-numbers");
+               g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (action));
+               g_object_unref (action);
+
+               action = g_property_action_new ("display-right-margin", new_view, "show-right-margin");
+               g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (action));
+               g_object_unref (action);
+
+               action = g_property_action_new ("highlight-current-line", new_view, "highlight-current-line");
+               g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (action));
+               g_object_unref (action);
+
+               g_action_map_add_action_entries (G_ACTION_MAP (window),
+                                                text_wrapping_entrie,
+                                                G_N_ELEMENTS (text_wrapping_entrie),
+                                                window);
+
+               update_statusbar_wrap_mode_checkbox_from_view (window, new_view);
+
+               window->priv->wrap_mode_changed_id = g_signal_connect (new_view,
+                                                                      "notify::wrap-mode",
+                                                                      G_CALLBACK (on_view_wrap_mode_changed),
+                                                                      window);
        }
 }
 
@@ -1194,6 +1284,8 @@ update_statusbar (GeditWindow *window,
 
                gtk_widget_show (window->priv->tab_width_combo);
                gtk_widget_show (window->priv->language_button);
+               _gedit_statusbar_line_col_button_set_visible (GEDIT_STATUSBAR (window->priv->statusbar),
+                                                             TRUE);
 
                window->priv->tab_width_id = g_signal_connect (new_view,
                                                               "notify::tab-width",
@@ -2161,18 +2253,15 @@ on_tab_removed (GeditMultiNotebook *multi,
        {
                set_title (window);
 
-               /* Remove line and col info */
-               gedit_statusbar_set_cursor_position (
-                               GEDIT_STATUSBAR (window->priv->statusbar),
-                               -1,
-                               -1);
-
                gedit_statusbar_clear_overwrite (
                                GEDIT_STATUSBAR (window->priv->statusbar));
 
                /* hide the combos */
                gtk_widget_hide (window->priv->tab_width_combo);
                gtk_widget_hide (window->priv->language_button);
+
+               _gedit_statusbar_line_col_button_set_visible (GEDIT_STATUSBAR (window->priv->statusbar),
+                                                             FALSE);
        }
 
        if (!window->priv->dispose_has_run)


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