X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fdesigner%2Fzonebar.cpp;fp=source%2Fdesigner%2Fzonebar.cpp;h=d4e049294fdc2b8dd600da4f24b188667c434275;hb=7e27b311e33beda1746eb63e0945633f262427f6;hp=0000000000000000000000000000000000000000;hpb=2abb7008a1e2b93b77742693becf6fe0b8567d6e;p=r2c2.git diff --git a/source/designer/zonebar.cpp b/source/designer/zonebar.cpp new file mode 100644 index 0000000..d4e0492 --- /dev/null +++ b/source/designer/zonebar.cpp @@ -0,0 +1,167 @@ +/* $Id$ + +This file is part of R²C² +Copyright © 2010 Mikkosoft Productions, Mikko Rasa +Distributed under the GPL +*/ + +#include +#include "libr2c2/zone.h" +#include "designer.h" +#include "zonebar.h" + +using namespace std; +using namespace Msp; +using namespace R2C2; + +Zonebar::Zonebar(Designer &d): + Toolbar("Zone", 420), + designer(d) +{ + pnl_content->add(*(drp_groups = new GLtk::Dropdown)); + drp_groups->set_geometry(GLtk::Geometry(0, 10, 195, 20)); + 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)); + 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 &layout = designer.get_layout(); + layout.signal_zone_added.connect(sigc::mem_fun(this, &Zonebar::zone_added)); + layout.signal_zone_removed.connect(sigc::hide(sigc::mem_fun(this, &Zonebar::update_groups))); + + const Layout::ZoneSet &zones = layout.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)); + + update_groups(); +} + +void Zonebar::zone_added(Zone &zone) +{ + zone.signal_name_changed.connect(sigc::mem_fun(this, &Zonebar::zone_renamed)); + update_groups(); +} + +void Zonebar::zone_renamed(const string &, const string &, unsigned) +{ + update_groups(); +} + +void Zonebar::group_selected(unsigned index, const string &group) +{ + if(index==drp_groups->get_n_items()-1) + { + Layout &layout = designer.get_layout(); + Zone *zone = new Zone(layout); + zone->set_name("New zone", "track", 1); + designer.edit_zone(zone); + update_groups(); + } + else + { + Zone *cur = designer.get_current_zone(); + if(cur && group==cur->get_group()) + return; + + designer.edit_zone(0); + update_numbers(group); + } +} + +void Zonebar::number_selected(unsigned index, const string &) +{ + 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) + { + Zone *cur = designer.get_current_zone(); + string qualifier = (cur ? cur->get_qualifier() : "track"); + + Layout &layout = designer.get_layout(); + Zone *zone = new Zone(layout); + zone->set_name(group, qualifier, zones.size()+1); + designer.edit_zone(zone); + if(cur) + update_numbers(group); + else + update_groups(); + } + 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); +}