Make Split Window 'Show current document' button have a drop-down menu
to select the other documents. Add new API function ui_menu_add_document_items(). git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@4308 ea778897-0a13-0410-b9d1-a72fbfd435f5
This commit is contained in:
parent
563cca15c0
commit
39cdcac742
@ -1,3 +1,12 @@
|
||||
2009-10-13 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
|
||||
|
||||
* src/notebook.c, src/plugindata.h, src/plugins.c, src/ui_utils.c,
|
||||
src/ui_utils.h, plugins/geanyfunctions.h, plugins/splitwindow.c:
|
||||
Make Split Window 'Show current document' button have a drop-down menu
|
||||
to select the other documents.
|
||||
Add new API function ui_menu_add_document_items().
|
||||
|
||||
|
||||
2009-10-13 Lex Trotman <elextr(at)gmail(dot)com>
|
||||
|
||||
* src/build.c:
|
||||
|
@ -244,6 +244,8 @@
|
||||
geany_functions->p_ui->progress_bar_stop
|
||||
#define ui_entry_add_clear_icon \
|
||||
geany_functions->p_ui->entry_add_clear_icon
|
||||
#define ui_menu_add_document_items \
|
||||
geany_functions->p_ui->menu_add_document_items
|
||||
#define dialogs_show_question \
|
||||
geany_functions->p_dialogs->show_question
|
||||
#define dialogs_show_msgbox \
|
||||
|
@ -263,6 +263,23 @@ static void on_refresh(void)
|
||||
}
|
||||
|
||||
|
||||
static void on_doc_menu_item_clicked(gpointer item, GeanyDocument *doc)
|
||||
{
|
||||
if (doc->is_valid)
|
||||
set_editor(&edit_window, doc->editor);
|
||||
}
|
||||
|
||||
|
||||
static void on_doc_menu_show(GtkMenu *menu)
|
||||
{
|
||||
/* clear the old menu items */
|
||||
gtk_container_foreach(GTK_CONTAINER(menu), (GtkCallback) gtk_widget_destroy, NULL);
|
||||
|
||||
ui_menu_add_document_items(menu, edit_window.editor->document,
|
||||
G_CALLBACK(on_doc_menu_item_clicked));
|
||||
}
|
||||
|
||||
|
||||
static GtkWidget *create_toolbar(void)
|
||||
{
|
||||
GtkWidget *toolbar, *item;
|
||||
@ -272,11 +289,17 @@ static GtkWidget *create_toolbar(void)
|
||||
gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar), GTK_ICON_SIZE_MENU);
|
||||
gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
|
||||
|
||||
item = ui_tool_button_new(GTK_STOCK_JUMP_TO, "",
|
||||
_("Show the current document"));
|
||||
tool_item = gtk_menu_tool_button_new(NULL, NULL);
|
||||
gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(tool_item), GTK_STOCK_JUMP_TO);
|
||||
item = (GtkWidget*)tool_item;
|
||||
ui_widget_set_tooltip_text(item, _("Show the current document"));
|
||||
gtk_container_add(GTK_CONTAINER(toolbar), item);
|
||||
g_signal_connect(item, "clicked", G_CALLBACK(on_refresh), NULL);
|
||||
|
||||
item = gtk_menu_new();
|
||||
gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(tool_item), item);
|
||||
g_signal_connect(item, "show", G_CALLBACK(on_doc_menu_show), NULL);
|
||||
|
||||
tool_item = gtk_tool_item_new();
|
||||
gtk_tool_item_set_expand(tool_item, TRUE);
|
||||
gtk_container_add(GTK_CONTAINER(toolbar), GTK_WIDGET(tool_item));
|
||||
|
@ -192,45 +192,20 @@ static void tab_bar_menu_activate_cb(GtkMenuItem *menuitem, gpointer data)
|
||||
}
|
||||
|
||||
|
||||
static GtkMenu *get_tab_bar_popup_menu(void)
|
||||
static void show_tab_bar_popup_menu(GdkEventButton *event)
|
||||
{
|
||||
GtkWidget *menu_item;
|
||||
static GtkWidget *menu = NULL;
|
||||
GtkWidget *menu_item, *menu_item_label;
|
||||
const GdkColor *color;
|
||||
GeanyDocument *doc;
|
||||
guint i, len;
|
||||
gchar *base_name;
|
||||
GeanyDocument *current_doc = document_get_current();
|
||||
|
||||
if (G_UNLIKELY(menu == NULL))
|
||||
if (menu == NULL)
|
||||
menu = gtk_menu_new();
|
||||
|
||||
/* clear the old menu items */
|
||||
gtk_container_foreach(GTK_CONTAINER(menu), (GtkCallback) gtk_widget_destroy, NULL);
|
||||
|
||||
len = gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook));
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
doc = document_get_from_page(i);
|
||||
if (! DOC_VALID(doc))
|
||||
continue;
|
||||
ui_menu_add_document_items(GTK_MENU(menu), document_get_current(),
|
||||
G_CALLBACK(tab_bar_menu_activate_cb));
|
||||
|
||||
base_name = g_path_get_basename(DOC_FILENAME(doc));
|
||||
menu_item = gtk_menu_item_new_with_label(base_name);
|
||||
gtk_widget_show(menu_item);
|
||||
gtk_container_add(GTK_CONTAINER(menu), menu_item);
|
||||
g_signal_connect(menu_item, "activate", G_CALLBACK(tab_bar_menu_activate_cb), doc);
|
||||
|
||||
color = document_get_status_color(doc);
|
||||
menu_item_label = gtk_bin_get_child(GTK_BIN(menu_item));
|
||||
gtk_widget_modify_fg(menu_item_label, GTK_STATE_NORMAL, color);
|
||||
gtk_widget_modify_fg(menu_item_label, GTK_STATE_ACTIVE, color);
|
||||
|
||||
if (doc == current_doc)
|
||||
ui_label_set_markup(GTK_LABEL(menu_item_label), "<b>%s</b>", base_name);
|
||||
|
||||
g_free(base_name);
|
||||
}
|
||||
menu_item = gtk_separator_menu_item_new();
|
||||
gtk_widget_show(menu_item);
|
||||
gtk_container_add(GTK_CONTAINER(menu), menu_item);
|
||||
@ -245,7 +220,7 @@ static GtkMenu *get_tab_bar_popup_menu(void)
|
||||
gtk_container_add(GTK_CONTAINER(menu), menu_item);
|
||||
g_signal_connect(menu_item, "activate", G_CALLBACK(on_close_all1_activate), NULL);
|
||||
|
||||
return GTK_MENU(menu);
|
||||
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, event->time);
|
||||
}
|
||||
|
||||
|
||||
@ -267,8 +242,7 @@ static gboolean notebook_tab_bar_click_cb(GtkWidget *widget, GdkEventButton *eve
|
||||
}
|
||||
else if (event->button == 3)
|
||||
{
|
||||
gtk_menu_popup(get_tab_bar_popup_menu(), NULL, NULL,
|
||||
NULL, NULL, event->button, event->time);
|
||||
show_tab_bar_popup_menu(event);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -50,7 +50,7 @@
|
||||
enum {
|
||||
/** The Application Programming Interface (API) version, incremented
|
||||
* whenever any plugin data types are modified or appended to. */
|
||||
GEANY_API_VERSION = 159,
|
||||
GEANY_API_VERSION = 160,
|
||||
|
||||
/** The Application Binary Interface (ABI) version, incremented whenever
|
||||
* existing fields in the plugin data types have to be changed or reordered. */
|
||||
@ -408,10 +408,7 @@ typedef struct UIUtilsFuncs
|
||||
{
|
||||
GtkWidget* (*dialog_vbox_new) (GtkDialog *dialog);
|
||||
GtkWidget* (*frame_new_with_alignment) (const gchar *label_text, GtkWidget **alignment);
|
||||
|
||||
/* set_statusbar() also appends to the message window status tab if log is TRUE. */
|
||||
void (*set_statusbar) (gboolean log, const gchar *format, ...) G_GNUC_PRINTF (2, 3);
|
||||
|
||||
void (*table_add_row) (GtkTable *table, gint row, ...) G_GNUC_NULL_TERMINATED;
|
||||
GtkWidget* (*path_box_new) (const gchar *title, GtkFileChooserAction action, GtkEntry *entry);
|
||||
GtkWidget* (*button_new_with_image) (const gchar *stock_id, const gchar *text);
|
||||
@ -422,6 +419,8 @@ typedef struct UIUtilsFuncs
|
||||
void (*progress_bar_start) (const gchar *text);
|
||||
void (*progress_bar_stop) (void);
|
||||
void (*entry_add_clear_icon) (GtkEntry *entry);
|
||||
void (*menu_add_document_items) (GtkMenu *menu, struct GeanyDocument *active,
|
||||
GCallback callback);
|
||||
}
|
||||
UIUtilsFuncs;
|
||||
|
||||
|
@ -218,7 +218,8 @@ static UIUtilsFuncs uiutils_funcs = {
|
||||
&ui_lookup_widget,
|
||||
&ui_progress_bar_start,
|
||||
&ui_progress_bar_stop,
|
||||
&ui_entry_add_clear_icon
|
||||
&ui_entry_add_clear_icon,
|
||||
&ui_menu_add_document_items
|
||||
};
|
||||
|
||||
static DialogFuncs dialog_funcs = {
|
||||
|
@ -2108,3 +2108,43 @@ GtkWidget *ui_label_set_markup(GtkLabel *label, const gchar *format, ...)
|
||||
}
|
||||
|
||||
|
||||
/** Add a list of document items to @a menu.
|
||||
* @param menu Menu.
|
||||
* @param active Which document to highlight, or @c NULL.
|
||||
* @param callback is used for each menu item's @c "activate" signal and will be passed
|
||||
* the corresponding document pointer as @c user_data.
|
||||
* @warning You should check @c doc->is_valid in the callback. */
|
||||
void ui_menu_add_document_items(GtkMenu *menu, GeanyDocument *active, GCallback callback)
|
||||
{
|
||||
GtkWidget *menu_item, *menu_item_label;
|
||||
const GdkColor *color;
|
||||
GeanyDocument *doc;
|
||||
guint i, len;
|
||||
gchar *base_name;
|
||||
|
||||
len = gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook));
|
||||
for (i = 0; i < len; i++)
|
||||
{
|
||||
doc = document_get_from_page(i);
|
||||
if (! DOC_VALID(doc))
|
||||
continue;
|
||||
|
||||
base_name = g_path_get_basename(DOC_FILENAME(doc));
|
||||
menu_item = gtk_menu_item_new_with_label(base_name);
|
||||
gtk_widget_show(menu_item);
|
||||
gtk_container_add(GTK_CONTAINER(menu), menu_item);
|
||||
g_signal_connect(menu_item, "activate", callback, doc);
|
||||
|
||||
color = document_get_status_color(doc);
|
||||
menu_item_label = gtk_bin_get_child(GTK_BIN(menu_item));
|
||||
gtk_widget_modify_fg(menu_item_label, GTK_STATE_NORMAL, color);
|
||||
gtk_widget_modify_fg(menu_item_label, GTK_STATE_ACTIVE, color);
|
||||
|
||||
if (doc == active)
|
||||
ui_label_set_markup(GTK_LABEL(menu_item_label), "<b>%s</b>", base_name);
|
||||
|
||||
g_free(base_name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -216,6 +216,8 @@ void ui_init_stock_items(void);
|
||||
void ui_add_config_file_menu_item(const gchar *real_path, const gchar *label,
|
||||
GtkContainer *parent);
|
||||
|
||||
void ui_menu_add_document_items(GtkMenu *menu, GeanyDocument *active, GCallback callback);
|
||||
|
||||
|
||||
void ui_set_statusbar(gboolean log, const gchar *format, ...) G_GNUC_PRINTF (2, 3);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user