]> git.tdb.fi Git - r2c2.git/blobdiff - source/designer/zonebar.cpp
Add support for named zones
[r2c2.git] / source / designer / zonebar.cpp
diff --git a/source/designer/zonebar.cpp b/source/designer/zonebar.cpp
new file mode 100644 (file)
index 0000000..d4e0492
--- /dev/null
@@ -0,0 +1,167 @@
+/* $Id$
+
+This file is part of R²C²
+Copyright © 2010 Mikkosoft Productions, Mikko Rasa
+Distributed under the GPL
+*/
+
+#include <msp/strings/formatter.h>
+#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<zones.size())
+               designer.edit_zone(zones[index]);
+}
+
+void Zonebar::delete_zone_clicked()
+{
+       Zone *cur = designer.get_current_zone();
+       designer.edit_zone(0);
+       delete cur;
+}
+
+void Zonebar::update_groups()
+{
+       const Layout::ZoneSet &zones = designer.get_layout().get_zones();
+       set<string> 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<string>::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);
+}