Changeset 2084

Show
Ignore:
Timestamp:
06/03/09 13:31:22 (15 months ago)
Author:
drobilla
Message:

Hide empty classes in plugin context menu (ticket #295).

Location:
trunk/ingen/src/gui
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/ingen/src/gui/PatchCanvas.cpp

    r2080 r2084  
    183183        const char* class_uri_str = slv2_value_as_string(class_uri); 
    184184 
    185         _class_menus.insert(make_pair(class_uri_str, menu)); 
    186  
    187185        const std::pair<LV2Children::const_iterator, LV2Children::const_iterator> kids 
    188186                        = children.equal_range(class_uri_str); 
     
    194192        for (LV2Children::const_iterator i = kids.first; i != kids.second; ++i) { 
    195193                SLV2PluginClass c = i->second; 
    196                 Gtk::Menu_Helpers::MenuElem menu_elem = Gtk::Menu_Helpers::MenuElem( 
    197                                 slv2_value_as_string(slv2_plugin_class_get_label(c))); 
    198  
     194                const char* sub_label_str = slv2_value_as_string(slv2_plugin_class_get_label(c)); 
     195                const char* sub_uri_str   = slv2_value_as_string(slv2_plugin_class_get_uri(c)); 
     196 
     197                Gtk::Menu_Helpers::MenuElem menu_elem = Gtk::Menu_Helpers::MenuElem(sub_label_str); 
    199198                menu->items().push_back(menu_elem); 
    200199                Gtk::MenuItem* menu_item = &(menu->items().back()); 
    201200 
    202201                Gtk::Menu* submenu = Gtk::manage(new Gtk::Menu()); 
    203                 size_t num_items = build_plugin_class_menu(submenu, c, classes, children); 
    204  
    205202                menu_item->set_submenu(*submenu); 
     203 
     204                size_t num_child_items = build_plugin_class_menu(submenu, c, classes, children); 
     205 
     206                _class_menus.insert(make_pair(sub_uri_str, MenuRecord(menu_item, submenu))); 
     207                if (num_child_items == 0) 
     208                        menu_item->hide(); 
     209 
    206210                ++num_items; 
    207211        } 
     
    324328 
    325329                pair<iterator,iterator> range = _class_menus.equal_range(class_uri_str); 
    326                 if (range.first == _class_menus.end() || range.first->second == _plugin_menu) { 
     330                if (range.first == _class_menus.end() || range.first == range.second 
     331                                || range.first->second.menu == _plugin_menu) { 
    327332                        _classless_menu->items().push_back(Gtk::Menu_Helpers::MenuElem(p->human_name(), 
    328333                                        sigc::bind(sigc::mem_fun(this, &PatchCanvas::load_plugin), p))); 
    329                         _classless_menu->show(); 
     334                        if (!_classless_menu->is_visible()) 
     335                                _classless_menu->show(); 
    330336                } else { 
    331337                        // For each menu that represents plugin's class (possibly several) 
    332338                        for (iterator i = range.first; i != range.second ; ++i) { 
    333                                 Gtk::Menu* menu = i->second; 
     339                                Gtk::Menu* menu = i->second.menu; 
    334340                                if (icon) { 
    335341                                        Gtk::Image* image = new Gtk::Image(icon); 
     
    341347                                                        sigc::bind(sigc::mem_fun(this, &PatchCanvas::load_plugin), p))); 
    342348                                } 
     349                                if (!i->second.item->is_visible()) 
     350                                        i->second.item->show(); 
    343351                        } 
    344352                } 
  • trunk/ingen/src/gui/PatchCanvas.hpp

    r2011 r2084  
    137137        int _paste_count; 
    138138 
    139         typedef std::multimap<const std::string, Gtk::Menu*> ClassMenus; 
     139        struct MenuRecord { 
     140                MenuRecord(Gtk::MenuItem* i, Gtk::Menu* m) : item(i), menu(m) {} 
     141                Gtk::MenuItem* item; 
     142                Gtk::Menu*     menu; 
     143        }; 
     144 
     145        typedef std::multimap<const std::string, MenuRecord> ClassMenus; 
     146 
    140147        ClassMenus _class_menus; 
    141148