Changeset 0958ce6e3faf508d641138f02672d19883e39604

Show
Ignore:
Timestamp:
05/09/08 21:07:58 (5 years ago)
Author:
Armin Burgmeier <armin@…>
Parents:
dddf956080b7fa0418b32a1b5b9d4003a4f239cc
Children:
da28543bdf240dd0748b7d40e2f9768951e90431
git-committer:
Armin Burgmeier <armin@arbur.net> / 2008-05-09T21:07:58Z+0200
Message:

Only allow ACCEPT response when a subdirectory is selected, hide after usage

2008-05-09 Armin Burgmeier <armin@…>

  • inc/dialogs/documentlocationdialog.hpp:
  • src/dialogs/documentlocationdialog.cpp: Only allow ACCEPT response when a subdirectory is selected, filter all nodes but subdirectories.
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • ChangeLog

    rdddf956 r0958ce6  
     12008-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 
    1102008-05-09  Armin Burgmeier  <armin@0x539.de> 
    211 
  • inc/dialogs/documentlocationdialog.hpp

    rdddf956 r0958ce6  
    4747        virtual void on_show(); 
    4848 
     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 
    4979        Gtk::Table m_table; 
    5080        Gtk::Label m_name_label; 
  • src/commands/file-commands.cpp

    rdddf956 r0958ce6  
    5252void Gobby::FileCommands::on_location_dialog_response(int id) 
    5353{ 
    54         if(id = Gtk::RESPONSE_ACCEPT) 
     54        if(id == Gtk::RESPONSE_ACCEPT) 
    5555        { 
    5656                InfcBrowserIter iter; 
     
    6666                // TODO: Info in statusbar, map, etc. 
    6767        } 
     68 
     69        m_location_dialog->hide(); 
    6870} 
  • src/dialogs/documentlocationdialog.cpp

    rdddf956 r0958ce6  
    2222#include <gtkmm/stock.h> 
    2323 
     24namespace 
     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 
    2435Gobby::DocumentLocationDialog::DocumentLocationDialog(Gtk::Window& parent, 
    2536                                                      InfGtkBrowserModel* m): 
     
    3445        m_name_label.show(); 
    3546        m_name_entry.show(); 
     47        m_name_entry.set_activates_default(true); 
    3648        m_location_label.show(); 
    3749        gtk_widget_show(GTK_WIDGET(m_view)); 
     
    5365        m_table.show(); 
    5466 
     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 
    5577        get_vbox()->pack_start(m_table, Gtk::PACK_EXPAND_WIDGET); 
    5678 
    57         // TODO: Make ACCEPT insensitive if nothing is selected 
    5879        add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); 
    5980        add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT); 
    6081 
     82        set_response_sensitive(Gtk::RESPONSE_ACCEPT, false); 
     83        set_default_response(Gtk::RESPONSE_ACCEPT); 
    6184        set_default_size(-1, 480); 
    6285        set_title(_("Select document's target location")); 
     
    84107{ 
    85108        GtkTreeIter tree_iter; 
    86         InfcBrowserIter* browser_iter; 
    87         InfcBrowser* browser; 
    88  
    89109        if(inf_gtk_browser_view_get_selected(m_view, &tree_iter)) 
    90110        { 
     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 
     153void 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 
     161void 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 
     191void 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 
     232bool 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 
    91245                gtk_tree_model_get( 
    92                         GTK_TREE_MODEL(m_filter_model), 
    93                         &tree_iter, 
     246                        model, iter, 
    94247                        INF_GTK_BROWSER_MODEL_COL_BROWSER, &browser, 
    95248                        INF_GTK_BROWSER_MODEL_COL_NODE, &browser_iter, 
    96249                        -1); 
    97250 
    98                 *iter = *browser_iter; 
     251                bool result = infc_browser_iter_is_subdirectory(browser, 
     252                                                                browser_iter); 
    99253 
    100254                infc_browser_iter_free(browser_iter); 
    101255                g_object_unref(browser); 
    102256 
    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}