Revision: 3488 http://geany.svn.sourceforge.net/geany/?rev=3488&view=rev Author: ntrel Date: 2009-01-19 13:12:45 +0000 (Mon, 19 Jan 2009)
Log Message: ----------- Use tree for Documents sidebar, grouped by path. Remove Documents show full path pref. Use enum for documents tree store column ids.
Modified Paths: -------------- trunk/ChangeLog trunk/geany.glade trunk/src/interface.c trunk/src/keyfile.c trunk/src/plugindata.h trunk/src/prefs.c trunk/src/treeviews.c trunk/src/ui_utils.h
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2009-01-18 23:05:54 UTC (rev 3487) +++ trunk/ChangeLog 2009-01-19 13:12:45 UTC (rev 3488) @@ -1,3 +1,12 @@ +2009-01-19 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com> + + * src/interface.c, src/ui_utils.h, src/prefs.c, src/plugindata.h, + src/treeviews.c, src/keyfile.c, geany.glade: + Use tree for Documents sidebar, grouped by path. + Remove Documents show full path pref. + Use enum for documents tree store column ids. + + 2009-01-18 Frank Lanitz <frank(at)frank(dot)uvena(dot)de>
* src/utils.c: Added a missing g_free().
Modified: trunk/geany.glade =================================================================== --- trunk/geany.glade 2009-01-18 23:05:54 UTC (rev 3487) +++ trunk/geany.glade 2009-01-19 13:12:45 UTC (rev 3488) @@ -3484,25 +3484,6 @@ <property name="fill">False</property> </packing> </child> - - <child> - <widget class="GtkCheckButton" id="check_list_openfiles_fullpath"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Show full path name in documents list</property> - <property name="use_underline">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - <property name="active">False</property> - <property name="inconsistent">False</property> - <property name="draw_indicator">True</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> </widget> </child> </widget>
Modified: trunk/src/interface.c =================================================================== --- trunk/src/interface.c 2009-01-18 23:05:54 UTC (rev 3487) +++ trunk/src/interface.c 2009-01-19 13:12:45 UTC (rev 3488) @@ -2278,7 +2278,6 @@ GtkWidget *vbox11; GtkWidget *check_list_symbol; GtkWidget *check_list_openfiles; - GtkWidget *check_list_openfiles_fullpath; GtkWidget *label146; GtkWidget *frame4; GtkWidget *alignment5; @@ -2839,10 +2838,6 @@ gtk_box_pack_start (GTK_BOX (vbox11), check_list_openfiles, FALSE, FALSE, 0); gtk_tooltips_set_tip (tooltips, check_list_openfiles, _("Toggle the documents list on and off"), NULL);
- check_list_openfiles_fullpath = gtk_check_button_new_with_mnemonic (_("Show full path name in documents list")); - gtk_widget_show (check_list_openfiles_fullpath); - gtk_box_pack_start (GTK_BOX (vbox11), check_list_openfiles_fullpath, FALSE, FALSE, 0); - label146 = gtk_label_new (_("<b>Sidebar</b>")); gtk_widget_show (label146); gtk_frame_set_label_widget (GTK_FRAME (frame7), label146); @@ -4530,7 +4525,6 @@ GLADE_HOOKUP_OBJECT (prefs_dialog, vbox11, "vbox11"); GLADE_HOOKUP_OBJECT (prefs_dialog, check_list_symbol, "check_list_symbol"); GLADE_HOOKUP_OBJECT (prefs_dialog, check_list_openfiles, "check_list_openfiles"); - GLADE_HOOKUP_OBJECT (prefs_dialog, check_list_openfiles_fullpath, "check_list_openfiles_fullpath"); GLADE_HOOKUP_OBJECT (prefs_dialog, label146, "label146"); GLADE_HOOKUP_OBJECT (prefs_dialog, frame4, "frame4"); GLADE_HOOKUP_OBJECT (prefs_dialog, alignment5, "alignment5");
Modified: trunk/src/keyfile.c =================================================================== --- trunk/src/keyfile.c 2009-01-18 23:05:54 UTC (rev 3487) +++ trunk/src/keyfile.c 2009-01-19 13:12:45 UTC (rev 3488) @@ -325,7 +325,6 @@ /* interface */ g_key_file_set_boolean(config, PACKAGE, "sidebar_symbol_visible", interface_prefs.sidebar_symbol_visible); g_key_file_set_boolean(config, PACKAGE, "sidebar_openfiles_visible", interface_prefs.sidebar_openfiles_visible); - g_key_file_set_boolean(config, PACKAGE, "sidebar_openfiles_fullpath", interface_prefs.sidebar_openfiles_fullpath); g_key_file_set_string(config, PACKAGE, "editor_font", interface_prefs.editor_font); g_key_file_set_string(config, PACKAGE, "tagbar_font", interface_prefs.tagbar_font); g_key_file_set_string(config, PACKAGE, "msgwin_font", interface_prefs.msgwin_font); @@ -599,7 +598,6 @@ interface_prefs.tab_pos_sidebar = utils_get_setting_integer(config, PACKAGE, "tab_pos_sidebar", GTK_POS_TOP); interface_prefs.sidebar_symbol_visible = utils_get_setting_boolean(config, PACKAGE, "sidebar_symbol_visible", TRUE); interface_prefs.sidebar_openfiles_visible = utils_get_setting_boolean(config, PACKAGE, "sidebar_openfiles_visible", TRUE); - interface_prefs.sidebar_openfiles_fullpath = utils_get_setting_boolean(config, PACKAGE, "sidebar_openfiles_fullpath", FALSE); interface_prefs.statusbar_visible = utils_get_setting_boolean(config, PACKAGE, "statusbar_visible", TRUE); file_prefs.tab_order_ltr = utils_get_setting_boolean(config, PACKAGE, "tab_order_ltr", TRUE); interface_prefs.show_notebook_tabs = utils_get_setting_boolean(config, PACKAGE, "show_notebook_tabs", TRUE);
Modified: trunk/src/plugindata.h =================================================================== --- trunk/src/plugindata.h 2009-01-18 23:05:54 UTC (rev 3487) +++ trunk/src/plugindata.h 2009-01-19 13:12:45 UTC (rev 3488) @@ -45,13 +45,13 @@ enum { /** The Application Programming Interface (API) version, incremented * whenever any plugin data types are modified or appended to. */ - GEANY_API_VERSION = 126, + GEANY_API_VERSION = 127,
/** The Application Binary Interface (ABI) version, incremented whenever * existing fields in the plugin data types have to be changed or reordered. */ /* This should usually stay the same if fields are only appended, assuming only pointers to * structs and not structs themselves are declared by plugins. */ - GEANY_ABI_VERSION = 57 + GEANY_ABI_VERSION = 58 };
/** Check the plugin can be loaded by Geany.
Modified: trunk/src/prefs.c =================================================================== --- trunk/src/prefs.c 2009-01-18 23:05:54 UTC (rev 3487) +++ trunk/src/prefs.c 2009-01-19 13:12:45 UTC (rev 3488) @@ -88,7 +88,6 @@ static void on_show_notebook_tabs_toggled(GtkToggleButton *togglebutton, gpointer user_data); static void on_use_folding_toggled(GtkToggleButton *togglebutton, gpointer user_data); static void on_open_encoding_toggled(GtkToggleButton *togglebutton, gpointer user_data); -static void on_openfiles_visible_toggled(GtkToggleButton *togglebutton, gpointer user_data); static void on_prefs_print_radio_button_toggled(GtkToggleButton *togglebutton, gpointer user_data); static void on_prefs_print_page_header_toggled(GtkToggleButton *togglebutton, gpointer user_data);
@@ -249,11 +248,7 @@
widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_list_openfiles"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), interface_prefs.sidebar_openfiles_visible); - on_openfiles_visible_toggled(GTK_TOGGLE_BUTTON(widget), NULL);
- widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_list_openfiles_fullpath"); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), interface_prefs.sidebar_openfiles_fullpath); - widget = ui_lookup_widget(ui_widgets.prefs_dialog, "tagbar_font"); gtk_font_button_set_font_name(GTK_FONT_BUTTON(widget), interface_prefs.tagbar_font);
@@ -657,9 +652,6 @@ widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_list_openfiles"); interface_prefs.sidebar_openfiles_visible = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
- widget = ui_lookup_widget(ui_widgets.prefs_dialog, "check_list_openfiles_fullpath"); - interface_prefs.sidebar_openfiles_fullpath = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); - widget = ui_lookup_widget(ui_widgets.prefs_dialog, "radio_long_line_line"); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) editor_prefs.long_line_type = 0; else @@ -1373,14 +1365,6 @@ }
-static void on_openfiles_visible_toggled(GtkToggleButton *togglebutton, gpointer user_data) -{ - gboolean sens = gtk_toggle_button_get_active(togglebutton); - - gtk_widget_set_sensitive(ui_lookup_widget(ui_widgets.prefs_dialog, "check_list_openfiles_fullpath"), sens); -} - - static void on_prefs_print_radio_button_toggled(GtkToggleButton *togglebutton, gpointer user_data) { gboolean sens = gtk_toggle_button_get_active(togglebutton); @@ -1523,8 +1507,6 @@ "toggled", G_CALLBACK(on_use_folding_toggled), NULL); g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "check_open_encoding"), "toggled", G_CALLBACK(on_open_encoding_toggled), NULL); - g_signal_connect(ui_lookup_widget(ui_widgets.prefs_dialog, "check_list_openfiles"), - "toggled", G_CALLBACK(on_openfiles_visible_toggled), NULL); }
prefs_init_dialog();
Modified: trunk/src/treeviews.c =================================================================== --- trunk/src/treeviews.c 2009-01-18 23:05:54 UTC (rev 3487) +++ trunk/src/treeviews.c 2009-01-19 13:12:45 UTC (rev 3488) @@ -57,14 +57,16 @@ OPENFILES_ACTION_RELOAD };
-typedef struct +/* documents tree model columns */ +enum { - GtkWidget *documents_fullpath; -} menu_items; + DOCUMENTS_SHORTNAME, /* dirname for parents, basename for children */ + DOCUMENTS_DOCUMENT, + DOCUMENTS_COLOR, + DOCUMENTS_FILENAME /* full filename */ +};
-static menu_items mi; - -static GtkListStore *store_openfiles; +static GtkTreeStore *store_openfiles; static GtkWidget *tag_window; /* scrolled window that holds the symbol list GtkTreeView */
/* callback prototypes */ @@ -214,7 +216,7 @@
/* store the short filename to show, and the index as reference, * the colour (black/red/green) and the full name for the tooltip */ - store_openfiles = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_POINTER, GDK_TYPE_COLOR, G_TYPE_STRING); + store_openfiles = gtk_tree_store_new(4, G_TYPE_STRING, G_TYPE_POINTER, GDK_TYPE_COLOR, G_TYPE_STRING); gtk_tree_view_set_model(GTK_TREE_VIEW(tv.tree_openfiles), GTK_TREE_MODEL(store_openfiles)); g_object_unref(store_openfiles);
@@ -226,7 +228,7 @@
renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Documents"), renderer, - "text", 0, "foreground-gdk", 2, NULL); + "text", DOCUMENTS_SHORTNAME, "foreground-gdk", DOCUMENTS_COLOR, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(tv.tree_openfiles), column); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tv.tree_openfiles), FALSE);
@@ -234,13 +236,13 @@
/* sort opened filenames in the store_openfiles treeview */ sortable = GTK_TREE_SORTABLE(GTK_TREE_MODEL(store_openfiles)); - gtk_tree_sortable_set_sort_column_id(sortable, 0, GTK_SORT_ASCENDING); + gtk_tree_sortable_set_sort_column_id(sortable, DOCUMENTS_SHORTNAME, GTK_SORT_ASCENDING);
ui_widget_modify_font_from_string(tv.tree_openfiles, interface_prefs.tagbar_font);
/* GTK 2.12 tooltips */ if (gtk_check_version(2, 12, 0) == NULL) - g_object_set(tv.tree_openfiles, "has-tooltip", TRUE, "tooltip-column", 3, NULL); + g_object_set(tv.tree_openfiles, "has-tooltip", TRUE, "tooltip-column", DOCUMENTS_FILENAME, NULL);
g_signal_connect(tv.tree_openfiles, "button-press-event", G_CALLBACK(on_treeviews_button_press_event), GINT_TO_POINTER(TREEVIEW_OPENFILES)); @@ -252,39 +254,132 @@ }
-/* Also sets documents[idx]->iter. +/* iter should be toplevel */ +static gboolean find_tree_iter_dir(GtkTreeIter *iter, const gchar *dir) +{ + GeanyDocument *doc; + gchar *name; + + if (utils_str_equal(dir, ".")) + dir = GEANY_STRING_UNTITLED; + + gtk_tree_model_get(GTK_TREE_MODEL(store_openfiles), iter, DOCUMENTS_DOCUMENT, &doc, -1); + g_return_val_if_fail(!doc, FALSE); + + gtk_tree_model_get(GTK_TREE_MODEL(store_openfiles), iter, DOCUMENTS_SHORTNAME, &name, -1); + return utils_str_equal(name, dir); +} + + +static GtkTreeIter *get_doc_parent(GeanyDocument *doc) +{ + gchar *dirname; + static GtkTreeIter parent; + GtkTreeModel *model = GTK_TREE_MODEL(store_openfiles); + + dirname = g_path_get_dirname(DOC_FILENAME(doc)); + + if (gtk_tree_model_get_iter_first(model, &parent)) + { + do + { + if (find_tree_iter_dir(&parent, dirname)) + { + g_free(dirname); + return &parent; + } + } + while (gtk_tree_model_iter_next(model, &parent)); + } + /* no match, add dir parent */ + gtk_tree_store_append(store_openfiles, &parent, NULL); + gtk_tree_store_set(store_openfiles, &parent, DOCUMENTS_SHORTNAME, + doc->file_name ? dirname : GEANY_STRING_UNTITLED, -1); + + g_free(dirname); + return &parent; +} + + +/* Also sets doc->priv->iter. * This is called recursively in treeviews_openfiles_update_all(). */ void treeviews_openfiles_add(GeanyDocument *doc) { GtkTreeIter *iter = &doc->priv->iter; + GtkTreeIter *parent = get_doc_parent(doc); + gchar *basename; + GdkColor *color = document_get_status_color(doc); + + gtk_tree_store_append(store_openfiles, iter, parent); + + /* check if new parent */ + if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store_openfiles), parent) == 1) + { + GtkTreePath *path;
- gtk_list_store_append(store_openfiles, iter); - treeviews_openfiles_update(doc); + /* expand parent */ + path = gtk_tree_model_get_path(GTK_TREE_MODEL(store_openfiles), parent); + gtk_tree_view_expand_row(GTK_TREE_VIEW(tv.tree_openfiles), path, TRUE); + gtk_tree_path_free(path); + } + basename = g_path_get_basename(DOC_FILENAME(doc)); + gtk_tree_store_set(store_openfiles, iter, + 0, basename, 1, doc, 2, color, 3, DOC_FILENAME(doc), -1); + g_free(basename); }
-void treeviews_openfiles_update(GeanyDocument *doc) +static void openfiles_remove(GeanyDocument *doc) { - gchar *basename; - GdkColor *color = document_get_status_color(doc); + GtkTreeIter *iter = &doc->priv->iter; + GtkTreeIter parent;
- if (interface_prefs.sidebar_openfiles_fullpath) - basename = DOC_FILENAME(doc); + if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(store_openfiles), &parent, iter) && + gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store_openfiles), &parent) == 1) + gtk_tree_store_remove(store_openfiles, &parent); else - basename = g_path_get_basename(DOC_FILENAME(doc)); - gtk_list_store_set(store_openfiles, &doc->priv->iter, - 0, basename, 1, doc, 2, color, 3, DOC_FILENAME(doc), -1); - if (! interface_prefs.sidebar_openfiles_fullpath) - g_free(basename); + gtk_tree_store_remove(store_openfiles, iter); }
+void treeviews_openfiles_update(GeanyDocument *doc) +{ + GtkTreeIter *iter = &doc->priv->iter; + gchar *fname; + + gtk_tree_model_get(GTK_TREE_MODEL(store_openfiles), iter, DOCUMENTS_FILENAME, &fname, -1); + + if (utils_str_equal(fname, DOC_FILENAME(doc))) + { + /* just update color */ + GdkColor *color = document_get_status_color(doc); + + gtk_tree_store_set(store_openfiles, iter, DOCUMENTS_COLOR, color, -1); + } + else + { + /* path has changed, so remove and re-add */ + GtkTreeSelection *treesel; + gboolean sel; + + treesel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv.tree_openfiles)); + sel = gtk_tree_selection_iter_is_selected(treesel, &doc->priv->iter); + openfiles_remove(doc); + + treeviews_openfiles_add(doc); + if (sel) + gtk_tree_selection_select_iter(treesel, &doc->priv->iter); + } + g_free(fname); +} + + void treeviews_openfiles_update_all() { guint i; GeanyDocument *doc;
- gtk_list_store_clear(store_openfiles); + gtk_tree_store_clear(store_openfiles); for (i = 0; i < (guint) gtk_notebook_get_n_pages(GTK_NOTEBOOK(main_widgets.notebook)); i++) { doc = document_get_from_page(i); @@ -298,10 +393,8 @@
void treeviews_remove_document(GeanyDocument *doc) { - GtkTreeIter *iter = &doc->priv->iter; - - gtk_list_store_remove(store_openfiles, iter); - + openfiles_remove(doc); + if (GTK_IS_WIDGET(doc->priv->tag_tree)) { gtk_widget_destroy(doc->priv->tag_tree); @@ -371,13 +464,6 @@ }
-static void on_openfiles_fullpath_activate(GtkCheckMenuItem *item, gpointer user_data) -{ - interface_prefs.sidebar_openfiles_fullpath = gtk_check_menu_item_get_active(item); - treeviews_openfiles_update_all(); -} - - static void on_list_document_activate(GtkCheckMenuItem *item, gpointer user_data) { interface_prefs.sidebar_openfiles_visible = gtk_check_menu_item_get_active(item); @@ -422,17 +508,20 @@ g_signal_connect(item, "activate", G_CALLBACK(on_openfiles_document_action), GINT_TO_POINTER(OPENFILES_ACTION_RELOAD));
- item = gtk_separator_menu_item_new(); - gtk_widget_show(item); - gtk_container_add(GTK_CONTAINER(tv.popup_openfiles), item); + sidebar_add_common_menu_items(GTK_MENU(tv.popup_openfiles)); +}
- mi.documents_fullpath = gtk_check_menu_item_new_with_mnemonic(_("Show _Full Path Name")); - gtk_widget_show(mi.documents_fullpath); - gtk_container_add(GTK_CONTAINER(tv.popup_openfiles), mi.documents_fullpath); - g_signal_connect(mi.documents_fullpath, "activate", - G_CALLBACK(on_openfiles_fullpath_activate), NULL);
- sidebar_add_common_menu_items(GTK_MENU(tv.popup_openfiles)); +static void unfold_parent(GtkTreeIter *iter) +{ + GtkTreeIter parent; + GtkTreePath *path; + + gtk_tree_model_iter_parent(GTK_TREE_MODEL(store_openfiles), &parent, iter); + + path = gtk_tree_model_get_path(GTK_TREE_MODEL(store_openfiles), &parent); + gtk_tree_view_expand_row(GTK_TREE_VIEW(tv.tree_openfiles), path, TRUE); + gtk_tree_path_free(path); }
@@ -444,10 +533,13 @@ { GeanyDocument *doc;
- gtk_tree_model_get(GTK_TREE_MODEL(store_openfiles), iter, 1, &doc, -1); + gtk_tree_model_get(GTK_TREE_MODEL(store_openfiles), iter, DOCUMENTS_DOCUMENT, &doc, -1);
if (doc == data) { + /* unfolding also prevents a strange bug where the selection gets stuck on the parent + * when it is collapsed and then switching documents */ + unfold_parent(iter); gtk_tree_view_set_cursor(GTK_TREE_VIEW(tv.tree_openfiles), path, NULL, FALSE); return TRUE; } @@ -472,7 +564,7 @@
if (gtk_tree_selection_get_selected(selection, &model, &iter)) { - gtk_tree_model_get(model, &iter, 1, &doc, -1); + gtk_tree_model_get(model, &iter, DOCUMENTS_DOCUMENT, &doc, -1); if (DOC_VALID(doc)) { switch (GPOINTER_TO_INT(user_data)) @@ -524,7 +616,9 @@ /* use switch_notebook_page to ignore changing the notebook page because it is already done */ if (gtk_tree_selection_get_selected(selection, &model, &iter) && ! ignore_callback) { - gtk_tree_model_get(model, &iter, 1, &doc, -1); + gtk_tree_model_get(model, &iter, DOCUMENTS_DOCUMENT, &doc, -1); + if (!doc) + return; /* parent */ gtk_notebook_set_current_page(GTK_NOTEBOOK(main_widgets.notebook), gtk_notebook_page_num(GTK_NOTEBOOK(main_widgets.notebook), (GtkWidget*) doc->editor->sci)); @@ -613,8 +707,6 @@ { /* update & show popup menus */ if (GPOINTER_TO_INT(user_data) == TREEVIEW_OPENFILES) { - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mi.documents_fullpath), - interface_prefs.sidebar_openfiles_fullpath); gtk_menu_popup(GTK_MENU(tv.popup_openfiles), NULL, NULL, NULL, NULL, event->button, event->time); }
Modified: trunk/src/ui_utils.h =================================================================== --- trunk/src/ui_utils.h 2009-01-18 23:05:54 UTC (rev 3487) +++ trunk/src/ui_utils.h 2009-01-19 13:12:45 UTC (rev 3488) @@ -38,7 +38,6 @@ { gboolean sidebar_symbol_visible; gboolean sidebar_openfiles_visible; - gboolean sidebar_openfiles_fullpath; gchar *editor_font; gchar *tagbar_font; gchar *msgwin_font;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.