[gedit] Statusbar: line/col popover menu
- From: Sebastien Lafargue <slafargue src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gedit] Statusbar: line/col popover menu
- Date: Wed, 16 Apr 2014 18:45:52 +0000 (UTC)
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]