Changeset 0958ce6e3faf508d641138f02672d19883e39604
- Timestamp:
- 05/09/08 21:07:58 (5 years ago)
- Parents:
- dddf956080b7fa0418b32a1b5b9d4003a4f239cc
- Children:
- da28543bdf240dd0748b7d40e2f9768951e90431
- git-committer:
- Armin Burgmeier <armin@arbur.net> / 2008-05-09T21:07:58Z+0200
- Files:
-
- 4 modified
-
ChangeLog (modified) (1 diff)
-
inc/dialogs/documentlocationdialog.hpp (modified) (1 diff)
-
src/commands/file-commands.cpp (modified) (2 diffs)
-
src/dialogs/documentlocationdialog.cpp (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
ChangeLog
rdddf956 r0958ce6 1 2008-05-09 Armin Burgmeier <armin@0x539.de> 2 3 * inc/dialogs/documentlocationdialog.hpp: 4 * src/dialogs/documentlocationdialog.cpp: Only allow ACCEPT response 5 when a subdirectory is selected, filter all nodes but subdirectories. 6 7 * src/commands/file-commands.cpp: Hide DocumentLocationDialog after 8 usage. 9 1 10 2008-05-09 Armin Burgmeier <armin@0x539.de> 2 11 -
inc/dialogs/documentlocationdialog.hpp
rdddf956 r0958ce6 47 47 virtual void on_show(); 48 48 49 static void on_selection_changed_static(InfGtkBrowserView* view, 50 GtkTreeIter* iter, 51 gpointer user_data) 52 { 53 static_cast<DocumentLocationDialog*>( 54 user_data)->on_selection_changed(iter); 55 } 56 57 static void on_row_changed_static(GtkTreeModel* model, 58 GtkTreePath* path, 59 GtkTreeIter* iter, 60 gpointer user_data) 61 { 62 static_cast<DocumentLocationDialog*>( 63 user_data)->on_row_changed(path, iter); 64 } 65 66 static gboolean filter_visible_func_static(GtkTreeModel* model, 67 GtkTreeIter* iter, 68 gpointer user_data) 69 { 70 return static_cast<DocumentLocationDialog*>( 71 user_data)->filter_visible_func(model, iter); 72 } 73 74 void on_selection_changed(GtkTreeIter* iter); 75 void on_row_changed(GtkTreePath* path, GtkTreeIter* iter); 76 77 bool filter_visible_func(GtkTreeModel* model, GtkTreeIter* iter); 78 49 79 Gtk::Table m_table; 50 80 Gtk::Label m_name_label; -
src/commands/file-commands.cpp
rdddf956 r0958ce6 52 52 void Gobby::FileCommands::on_location_dialog_response(int id) 53 53 { 54 if(id = Gtk::RESPONSE_ACCEPT)54 if(id == Gtk::RESPONSE_ACCEPT) 55 55 { 56 56 InfcBrowserIter iter; … … 66 66 // TODO: Info in statusbar, map, etc. 67 67 } 68 69 m_location_dialog->hide(); 68 70 } -
src/dialogs/documentlocationdialog.cpp
rdddf956 r0958ce6 22 22 #include <gtkmm/stock.h> 23 23 24 namespace 25 { 26 bool operator==(const GtkTreeIter& iter1, const GtkTreeIter& iter2) 27 { 28 return iter1.stamp == iter2.stamp && 29 iter1.user_data == iter2.user_data && 30 iter1.user_data2 == iter2.user_data2 && 31 iter1.user_data3 == iter2.user_data3; 32 } 33 } 34 24 35 Gobby::DocumentLocationDialog::DocumentLocationDialog(Gtk::Window& parent, 25 36 InfGtkBrowserModel* m): … … 34 45 m_name_label.show(); 35 46 m_name_entry.show(); 47 m_name_entry.set_activates_default(true); 36 48 m_location_label.show(); 37 49 gtk_widget_show(GTK_WIDGET(m_view)); … … 53 65 m_table.show(); 54 66 67 g_signal_connect(m_view, "selection-changed", 68 G_CALLBACK(on_selection_changed_static), this); 69 g_signal_connect(m_filter_model, "row-changed", 70 G_CALLBACK(on_row_changed_static), this); 71 72 // Hide non-subdirectories: 73 gtk_tree_model_filter_set_visible_func( 74 GTK_TREE_MODEL_FILTER(m_filter_model), 75 filter_visible_func_static, this, NULL); 76 55 77 get_vbox()->pack_start(m_table, Gtk::PACK_EXPAND_WIDGET); 56 78 57 // TODO: Make ACCEPT insensitive if nothing is selected58 79 add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); 59 80 add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT); 60 81 82 set_response_sensitive(Gtk::RESPONSE_ACCEPT, false); 83 set_default_response(Gtk::RESPONSE_ACCEPT); 61 84 set_default_size(-1, 480); 62 85 set_title(_("Select document's target location")); … … 84 107 { 85 108 GtkTreeIter tree_iter; 86 InfcBrowserIter* browser_iter;87 InfcBrowser* browser;88 89 109 if(inf_gtk_browser_view_get_selected(m_view, &tree_iter)) 90 110 { 111 InfGtkBrowserModelStatus status = 112 INF_GTK_BROWSER_MODEL_CONNECTED; 113 114 GtkTreeIter dummy_iter; 115 if(!gtk_tree_model_iter_parent(GTK_TREE_MODEL(m_filter_model), 116 &dummy_iter, &tree_iter)) 117 { 118 gtk_tree_model_get( 119 GTK_TREE_MODEL(m_filter_model), 120 &tree_iter, 121 INF_GTK_BROWSER_MODEL_COL_STATUS, &status, 122 -1); 123 } 124 125 if(status == INF_GTK_BROWSER_MODEL_CONNECTED) 126 { 127 InfcBrowserIter* browser_iter; 128 InfcBrowser* browser; 129 130 gtk_tree_model_get( 131 GTK_TREE_MODEL(m_filter_model), 132 &tree_iter, 133 INF_GTK_BROWSER_MODEL_COL_BROWSER, &browser, 134 INF_GTK_BROWSER_MODEL_COL_NODE, &browser_iter, 135 -1); 136 137 *iter = *browser_iter; 138 infc_browser_iter_free(browser_iter); 139 g_object_unref(browser); 140 return browser; 141 } 142 else 143 { 144 return NULL; 145 } 146 } 147 else 148 { 149 return NULL; 150 } 151 } 152 153 void Gobby::DocumentLocationDialog::on_show() 154 { 155 Gtk::Dialog::on_show(); 156 157 m_name_entry.select_region(0, m_name_entry.get_text_length()); 158 m_name_entry.grab_focus(); 159 } 160 161 void Gobby::DocumentLocationDialog::on_selection_changed(GtkTreeIter* iter) 162 { 163 gboolean accept_sensitive = false; 164 if(iter != NULL) 165 { 166 GtkTreeIter dummy_iter; 167 if(gtk_tree_model_iter_parent(GTK_TREE_MODEL(m_filter_model), 168 &dummy_iter, iter)) 169 { 170 // Child: Always OK 171 accept_sensitive = true; 172 } 173 else 174 { 175 // Top-level node: Check status 176 InfGtkBrowserModelStatus status; 177 gtk_tree_model_get(GTK_TREE_MODEL(m_filter_model), 178 iter, 179 INF_GTK_BROWSER_MODEL_COL_STATUS, 180 &status, 181 -1); 182 183 accept_sensitive = 184 (status == INF_GTK_BROWSER_MODEL_CONNECTED); 185 } 186 } 187 188 set_response_sensitive(Gtk::RESPONSE_ACCEPT, accept_sensitive); 189 } 190 191 void Gobby::DocumentLocationDialog::on_row_changed(GtkTreePath* path, 192 GtkTreeIter* iter) 193 { 194 // If a toplevel entry is selected, and the status changed to 195 // connected, then make the Accept button sensitive. On the other 196 // hand, if status changed to something else, then 197 // make it insensitive. 198 GtkTreeIter sel_iter; 199 200 if(inf_gtk_browser_view_get_selected(m_view, &sel_iter)) 201 { 202 // We cannot compare the iterators directly here, since 203 // GtkTreeModelFilter seems to allow two iterators pointing to 204 // the same row but having a different user_data3 field. We 205 // therefore compare the paths instead. 206 GtkTreePath* sel_path = gtk_tree_model_get_path( 207 GTK_TREE_MODEL(m_filter_model), &sel_iter); 208 if(gtk_tree_path_compare(path, sel_path) == 0) 209 { 210 GtkTreeIter dummy_iter; 211 if(!gtk_tree_model_iter_parent( 212 GTK_TREE_MODEL(m_filter_model), &dummy_iter, 213 iter)) 214 { 215 InfGtkBrowserModelStatus s; 216 gtk_tree_model_get( 217 GTK_TREE_MODEL(m_filter_model), iter, 218 INF_GTK_BROWSER_MODEL_COL_STATUS, &s, 219 -1); 220 221 set_response_sensitive( 222 Gtk::RESPONSE_ACCEPT, 223 s == INF_GTK_BROWSER_MODEL_CONNECTED 224 ); 225 } 226 } 227 228 gtk_tree_path_free(sel_path); 229 } 230 } 231 232 bool Gobby::DocumentLocationDialog::filter_visible_func(GtkTreeModel* model, 233 GtkTreeIter* iter) 234 { 235 GtkTreeIter dummy_iter; 236 if(!gtk_tree_model_iter_parent(model, &dummy_iter, iter)) 237 { 238 return true; 239 } 240 else 241 { 242 InfcBrowserIter* browser_iter; 243 InfcBrowser* browser; 244 91 245 gtk_tree_model_get( 92 GTK_TREE_MODEL(m_filter_model), 93 &tree_iter, 246 model, iter, 94 247 INF_GTK_BROWSER_MODEL_COL_BROWSER, &browser, 95 248 INF_GTK_BROWSER_MODEL_COL_NODE, &browser_iter, 96 249 -1); 97 250 98 *iter = *browser_iter; 251 bool result = infc_browser_iter_is_subdirectory(browser, 252 browser_iter); 99 253 100 254 infc_browser_iter_free(browser_iter); 101 255 g_object_unref(browser); 102 256 103 return browser; 104 } 105 else 106 { 107 return NULL; 108 } 109 } 110 111 void Gobby::DocumentLocationDialog::on_show() 112 { 113 Gtk::Dialog::on_show(); 114 115 m_name_entry.select_region(0, m_name_entry.get_text_length()); 116 m_name_entry.grab_focus(); 117 } 257 return result; 258 } 259 }
