X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fdesigner%2Fzonebar.cpp;h=3b6b2125804b996467e8b0d03230ff43748ee3f1;hb=HEAD;hp=88119c72166f4cb23e93afc9d2595a15fdd3bbd7;hpb=629ded2c61ef25ec34cc52b03fe69d02e72db50f;p=r2c2.git diff --git a/source/designer/zonebar.cpp b/source/designer/zonebar.cpp index 88119c7..3b6b212 100644 --- a/source/designer/zonebar.cpp +++ b/source/designer/zonebar.cpp @@ -1,11 +1,4 @@ -/* $Id$ - -This file is part of R²C² -Copyright © 2010-2011 Mikkosoft Productions, Mikko Rasa -Distributed under the GPL -*/ - -#include +#include #include "libr2c2/zone.h" #include "designer.h" #include "zonebar.h" @@ -14,102 +7,189 @@ using namespace std; using namespace Msp; using namespace R2C2; +string zone_detail(Zone *const &zone) +{ + return zone ? format("%s %d", zone->get_qualifier(), zone->get_number()) : "(new)"; +} + Zonebar::Zonebar(Designer &d): - Toolbar("Zone", 420), - designer(d) + Toolbar("Zone"), + designer(d), + zones(&zone_detail) { - pnl_content->add(*(drp_groups = new GLtk::Dropdown)); - drp_groups->set_geometry(GLtk::Geometry(0, 10, 195, 20)); + pnl_content->add(*(drp_groups = new GLtk::Dropdown(groups))); drp_groups->set_tooltip("Select zone group to edit"); drp_groups->signal_item_selected.connect(sigc::mem_fun(this, &Zonebar::group_selected)); - pnl_content->add(*(drp_numbers = new GLtk::Dropdown)); - drp_numbers->set_geometry(GLtk::Geometry(200, 10, 100, 20)); + pnl_content->add(*(drp_numbers = new GLtk::Dropdown(zones))); drp_groups->set_tooltip("Select zone to edit"); drp_numbers->signal_item_selected.connect(sigc::mem_fun(this, &Zonebar::number_selected)); GLtk::Button *btn; pnl_content->add(*(btn = new GLtk::Button("Del"))); - btn->set_geometry(GLtk::Geometry(300, 10, 40, 24)); btn->set_style("red"); btn->set_tooltip("Delete selected zone"); btn->signal_clicked.connect(sigc::mem_fun(this, &Zonebar::delete_zone_clicked)); pnl_content->add(*(btn = new GLtk::Button("Prop"))); - btn->set_geometry(GLtk::Geometry(340, 10, 40, 24)); btn->set_tooltip("Change properties of the selected zone"); btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::zone_properties)); pnl_content->add(*(btn = new GLtk::Button("AddT"))); - btn->set_geometry(GLtk::Geometry(380, 10, 40, 24)); btn->set_tooltip("Add selected tracks to zone"); btn->signal_clicked.connect(sigc::mem_fun(&designer, &Designer::add_selection_to_zone)); Layout &rlayout = designer.get_layout(); - rlayout.signal_zone_added.connect(sigc::mem_fun(this, &Zonebar::zone_added)); - rlayout.signal_zone_removed.connect(sigc::hide(sigc::mem_fun(this, &Zonebar::update_groups))); + rlayout.signal_track_chain_added.connect(sigc::mem_fun(this, &Zonebar::track_chain_added)); + rlayout.signal_track_chain_removed.connect(sigc::mem_fun(this, &Zonebar::track_chain_removed)); - const Layout::ZoneSet &zones = rlayout.get_zones(); - for(Layout::ZoneSet::const_iterator i=zones.begin(); i!=zones.end(); ++i) - (*i)->signal_name_changed.connect(sigc::mem_fun(this, &Zonebar::zone_renamed)); + const set &lzones = rlayout.get_all(); + set group_names; + for(set::const_iterator i=lzones.begin(); i!=lzones.end(); ++i) + { + (*i)->signal_name_changed.connect(sigc::bind<0>(sigc::mem_fun(this, &Zonebar::zone_renamed), sigc::ref(**i))); + if(!group_names.count((*i)->get_group())) + { + groups.append((*i)->get_group()); + group_names.insert((*i)->get_group()); + } + } + groups.append("(new)"); +} - update_groups(); +void Zonebar::track_chain_added(TrackChain &chain) +{ + if(Zone *zone = dynamic_cast(&chain)) + zone->signal_name_changed.connect(sigc::bind<0>(sigc::mem_fun(this, &Zonebar::zone_renamed), sigc::ref(*zone))); } -void Zonebar::zone_added(Zone &zone) +void Zonebar::track_chain_removed(TrackChain &chain) { - zone.signal_name_changed.connect(sigc::mem_fun(this, &Zonebar::zone_renamed)); - update_groups(); + if(Zone *zone = dynamic_cast(&chain)) + { + bool keep_group = false; + const set &lzones = designer.get_layout().get_all(); + for(set::const_iterator j=lzones.begin(); (!keep_group && j!=lzones.end()); ++j) + keep_group = (*j)->get_group()==zone->get_group(); + + if(!keep_group) + { + for(unsigned i=0; iget_group()) + { + groups.remove(i); + break; + } + } + + for(unsigned i=0; i &lzones = designer.get_layout().get_all(); + set group_names; + for(set::const_iterator i=lzones.begin(); i!=lzones.end(); ++i) + group_names.insert((*i)->get_group()); + + bool new_group = true; + for(unsigned i=0; i+1get_selected_index(); + if(sel>=0 && groups.get(sel)==group) + { + int i = zones.find(&zone); + if(i<0) + zones.insert(zones.size()-1, &zone); + else + zones.refresh(i); + } } -void Zonebar::group_selected(unsigned index, const string &group) +void Zonebar::group_selected(unsigned index) { - if(index==drp_groups->get_n_items()-1) + if(index==groups.size()-1) { Zone *zone = new Zone(designer.get_layout()); zone->set_name("New zone", "track", 1); + + for(unsigned i=0; iset_selected_index(i); + break; + } + + for(unsigned i=0; iset_selected_index(i); + break; + } + designer.edit_zone(zone); - update_groups(); } else { Zone *cur = designer.get_current_zone(); - if(cur && group==cur->get_group()) + if(cur && groups.get(index)==cur->get_group()) return; designer.edit_zone(0); - update_numbers(group); + + zones.clear(); + Layout::ZoneArray lzones = designer.get_layout().get_zones(groups.get(index)); + for(Layout::ZoneArray::iterator i=lzones.begin(); i!=lzones.end(); ++i) + zones.append(*i); + zones.append(0); } } -void Zonebar::number_selected(unsigned index, const string &) +void Zonebar::number_selected(unsigned index) { if(drp_groups->get_selected_index()<0) return; - string group = drp_groups->get_selected(); - Layout::ZoneArray zones = designer.get_layout().get_zones(group); - if(index==drp_numbers->get_n_items()-1) + string group = groups.get(drp_groups->get_selected_index()); + if(index==zones.size()-1) { Zone *cur = designer.get_current_zone(); string qualifier = (cur ? cur->get_qualifier() : "track"); Zone *zone = new Zone(designer.get_layout()); - zone->set_name(group, qualifier, zones.size()+1); + zone->set_name(group, qualifier, index+1); designer.edit_zone(zone); - if(cur) - update_numbers(group); - else - update_groups(); + + for(unsigned i=0; iset_selected_index(i); + break; + } } - else if(index groups; - for(Layout::ZoneSet::const_iterator i=zones.begin(); i!=zones.end(); ++i) - groups.insert((*i)->get_group()); - - Zone *cur = designer.get_current_zone(); - - drp_groups->clear(); - int selected = -1; - unsigned n = 0; - for(set::iterator i=groups.begin(); i!=groups.end(); ++i, ++n) - { - drp_groups->append(*i); - if(cur && *i==cur->get_group()) - selected = n; - } - drp_groups->append("(new)"); - drp_groups->set_selected_index(selected); - - if(cur) - update_numbers(cur->get_group()); - else - drp_numbers->clear(); -} - -void Zonebar::update_numbers(const string &group) -{ - Layout::ZoneArray zones = designer.get_layout().get_zones(group); - Zone *cur = designer.get_current_zone(); - - drp_numbers->clear(); - int selected = -1; - unsigned n = 0; - for(Layout::ZoneArray::iterator i=zones.begin(); i!=zones.end(); ++i, ++n) - { - drp_numbers->append(format("%s %d", (*i)->get_qualifier(), (*i)->get_number())); - if(cur && *i==cur) - selected = n; - } - drp_numbers->append("(new)"); - drp_numbers->set_selected_index(selected); -}