Use popover with highlight selector instead loooong menu in statusbar.

This commit is contained in:
Tomasz Gąsior 2018-07-22 16:49:55 +02:00
parent 66c155a386
commit 06a20265ea
2 changed files with 55 additions and 93 deletions

View File

@ -56,7 +56,8 @@ struct _XedWindowPrivate
GtkWidget *vpaned; GtkWidget *vpaned;
GtkWidget *tab_width_combo; GtkWidget *tab_width_combo;
GtkWidget *language_combo; GtkWidget *language_button;
GtkWidget *language_popover;
GtkWidget *show_side_pane_button; GtkWidget *show_side_pane_button;
GtkWidget *show_bottom_pane_button; GtkWidget *show_bottom_pane_button;
GtkWidget *bottom_pane_button_revealer; GtkWidget *bottom_pane_button_revealer;

View File

@ -29,6 +29,8 @@
#include "xed-enum-types.h" #include "xed-enum-types.h"
#include "xed-dirs.h" #include "xed-dirs.h"
#include "xed-status-combo-box.h" #include "xed-status-combo-box.h"
#include "xed-status-menu-button.h"
#include "xed-highlight-mode-selector.h"
#include "xed-settings.h" #include "xed-settings.h"
#define LANGUAGE_NONE (const gchar *)"LangNone" #define LANGUAGE_NONE (const gchar *)"LangNone"
@ -1333,28 +1335,6 @@ use_spaces_toggled (GtkCheckMenuItem *item,
g_signal_handler_unblock (view, window->priv->spaces_instead_of_tabs_id); g_signal_handler_unblock (view, window->priv->spaces_instead_of_tabs_id);
} }
static void
language_combo_changed (XedStatusComboBox *combo,
GtkMenuItem *item,
XedWindow *window)
{
XedDocument *doc;
GtkSourceLanguage *language;
doc = xed_window_get_active_document (window);
if (!doc)
{
return;
}
language = GTK_SOURCE_LANGUAGE(g_object_get_data (G_OBJECT (item), LANGUAGE_DATA));
g_signal_handler_block (doc, window->priv->language_changed_id);
xed_document_set_language (doc, language);
g_signal_handler_unblock (doc, window->priv->language_changed_id);
}
typedef struct typedef struct
{ {
const gchar *label; const gchar *label;
@ -1398,42 +1378,33 @@ fill_tab_width_combo (XedWindow *window)
} }
static void static void
fill_language_combo (XedWindow *window) on_language_selector_shown (XedHighlightModeSelector *sel,
XedWindow *window)
{ {
GtkSourceLanguageManager *lm; XedDocument *doc;
const gchar * const *ids;
const gchar *name;
GtkWidget *menu_item;
gint i;
name = _("Plain Text"); doc = xed_window_get_active_document (window);
menu_item = gtk_menu_item_new_with_label (name); if (doc)
gtk_widget_show (menu_item);
g_object_set_data (G_OBJECT(menu_item), LANGUAGE_DATA, NULL);
xed_status_combo_box_add_item (XED_STATUS_COMBO_BOX (window->priv->language_combo), GTK_MENU_ITEM (menu_item), name);
lm = gtk_source_language_manager_get_default ();
ids = gtk_source_language_manager_get_language_ids (lm);
for (i = 0; ids[i] != NULL; i++)
{ {
GtkSourceLanguage *lang; xed_highlight_mode_selector_select_language (sel,
xed_document_get_language (doc));
}
}
lang = gtk_source_language_manager_get_language (lm, ids[i]); static void
on_language_selected (XedHighlightModeSelector *sel,
GtkSourceLanguage *language,
XedWindow *window)
{
XedDocument *doc;
if (!gtk_source_language_get_hidden (lang)) doc = xed_window_get_active_document (window);
if (doc)
{ {
name = gtk_source_language_get_name (lang); xed_document_set_language (doc, language);
menu_item = gtk_menu_item_new_with_label (name); }
gtk_widget_show (menu_item);
g_object_set_data_full (G_OBJECT (menu_item), LANGUAGE_DATA, g_object_ref (lang), gtk_widget_hide (GTK_WIDGET (window->priv->language_popover));
(GDestroyNotify) g_object_unref);
xed_status_combo_box_add_item (XED_STATUS_COMBO_BOX (window->priv->language_combo),
GTK_MENU_ITEM (menu_item), name);
}
}
} }
static void static void
@ -1443,6 +1414,7 @@ create_statusbar (XedWindow *window,
GtkWidget *image; GtkWidget *image;
GtkWidget *button_box; GtkWidget *button_box;
GtkAction *action; GtkAction *action;
XedHighlightModeSelector *sel;
xed_debug (DEBUG_WINDOW); xed_debug (DEBUG_WINDOW);
@ -1470,16 +1442,28 @@ create_statusbar (XedWindow *window,
g_signal_connect(G_OBJECT (window->priv->tab_width_combo), "changed", g_signal_connect(G_OBJECT (window->priv->tab_width_combo), "changed",
G_CALLBACK (tab_width_combo_changed), window); G_CALLBACK (tab_width_combo_changed), window);
window->priv->language_combo = xed_status_combo_box_new (NULL); window->priv->language_button = xed_status_menu_button_new ();
gtk_widget_show (window->priv->language_combo); gtk_widget_show (window->priv->language_button);
gtk_widget_set_margin_bottom (GTK_WIDGET (window->priv->language_combo), 2); gtk_widget_set_margin_bottom (GTK_WIDGET (window->priv->language_button), 2);
gtk_widget_set_margin_top (GTK_WIDGET (window->priv->language_combo), 2); gtk_widget_set_margin_top (GTK_WIDGET (window->priv->language_button), 2);
gtk_box_pack_end (GTK_BOX(window->priv->statusbar), window->priv->language_combo, FALSE, FALSE, 0); gtk_box_pack_end (GTK_BOX(window->priv->statusbar), window->priv->language_button, FALSE, FALSE, 0);
fill_language_combo (window); window->priv->language_popover = gtk_popover_new (window->priv->language_button);
gtk_menu_button_set_popover (GTK_MENU_BUTTON (window->priv->language_button),
window->priv->language_popover);
g_signal_connect(G_OBJECT (window->priv->language_combo), "changed", sel = xed_highlight_mode_selector_new ();
G_CALLBACK (language_combo_changed), window); g_signal_connect (sel,
"show",
G_CALLBACK (on_language_selector_shown),
window);
g_signal_connect (sel,
"language-selected",
G_CALLBACK (on_language_selected),
window);
gtk_container_add (GTK_CONTAINER (window->priv->language_popover), GTK_WIDGET (sel));
gtk_widget_show (GTK_WIDGET (sel));
button_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4); button_box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4);
gtk_widget_set_margin_top (button_box, 4); gtk_widget_set_margin_top (button_box, 4);
@ -1832,40 +1816,17 @@ language_changed (GObject *object,
GParamSpec *pspec, GParamSpec *pspec,
XedWindow *window) XedWindow *window)
{ {
GList *items;
GList *item;
XedStatusComboBox *combo = XED_STATUS_COMBO_BOX(window->priv->language_combo);
GtkSourceLanguage *new_language; GtkSourceLanguage *new_language;
const gchar *new_id; const gchar *label;
items = xed_status_combo_box_get_items (combo); new_language = gtk_source_buffer_get_language (GTK_SOURCE_BUFFER (object));
new_language = gtk_source_buffer_get_language (GTK_SOURCE_BUFFER(object));
if (new_language) if (new_language)
{ label = gtk_source_language_get_name (new_language);
new_id = gtk_source_language_get_id (new_language);
}
else else
{ label = _("Plain Text");
new_id = NULL;
}
for (item = items; item; item = item->next) xed_status_menu_button_set_label (XED_STATUS_MENU_BUTTON (window->priv->language_button), label);
{
GtkSourceLanguage *lang = g_object_get_data (G_OBJECT(item->data),
LANGUAGE_DATA);
if ((new_id == NULL && lang == NULL)
|| (new_id != NULL && lang != NULL && strcmp (gtk_source_language_get_id (lang), new_id) == 0))
{
g_signal_handlers_block_by_func(window->priv->language_combo, language_combo_changed, window);
xed_status_combo_box_set_item (XED_STATUS_COMBO_BOX(window->priv->language_combo),
GTK_MENU_ITEM(item->data));
g_signal_handlers_unblock_by_func(window->priv->language_combo, language_combo_changed, window);
}
}
g_list_free (items);
} }
static void static void
@ -1996,7 +1957,7 @@ notebook_switch_page (GtkNotebook *book,
gtk_text_view_get_overwrite (GTK_TEXT_VIEW(view))); gtk_text_view_get_overwrite (GTK_TEXT_VIEW(view)));
gtk_widget_show (window->priv->tab_width_combo); gtk_widget_show (window->priv->tab_width_combo);
gtk_widget_show (window->priv->language_combo); gtk_widget_show (window->priv->language_button);
window->priv->tab_width_id = g_signal_connect(view, "notify::tab-width", G_CALLBACK (tab_width_changed), window); window->priv->tab_width_id = g_signal_connect(view, "notify::tab-width", G_CALLBACK (tab_width_changed), window);
@ -2732,7 +2693,7 @@ notebook_tab_removed (XedNotebook *notebook,
/* hide the combos */ /* hide the combos */
gtk_widget_hide (window->priv->tab_width_combo); gtk_widget_hide (window->priv->tab_width_combo);
gtk_widget_hide (window->priv->language_combo); gtk_widget_hide (window->priv->language_button);
} }
if (!window->priv->removing_tabs) if (!window->priv->removing_tabs)