route_list_display.set_name ("TrackListDisplay");
route_list_display.get_selection()->set_mode (SELECTION_NONE);
route_list_display.set_reorderable (true);
+ route_list_display.set_rules_hint (true);
route_list_display.set_size_request (100,-1);
route_list_display.add_object_drag (route_display_columns.route.index(), "routes");
group_model = ListStore::create(group_columns);
route_group_display.set_model (group_model);
+
route_group_display.append_column (_("Name"), group_columns.text);
+
+ route_group_display.append_column (_("G"), group_columns.gain);
+ route_group_display.append_column (_("R"), group_columns.record);
+ route_group_display.append_column (_("M"), group_columns.mute);
+ route_group_display.append_column (_("S"), group_columns.solo);
+ route_group_display.append_column (_("Sel"), group_columns.select);
+ route_group_display.append_column (_("E"), group_columns.edits);
+
route_group_display.append_column (_("Show"), group_columns.is_visible);
+
route_group_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
route_group_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
+ route_group_display.get_column (2)->set_data (X_("colnum"), GUINT_TO_POINTER(2));
+ route_group_display.get_column (3)->set_data (X_("colnum"), GUINT_TO_POINTER(3));
+ route_group_display.get_column (4)->set_data (X_("colnum"), GUINT_TO_POINTER(4));
+ route_group_display.get_column (5)->set_data (X_("colnum"), GUINT_TO_POINTER(5));
+ route_group_display.get_column (6)->set_data (X_("colnum"), GUINT_TO_POINTER(6));
+ route_group_display.get_column (7)->set_data (X_("colnum"), GUINT_TO_POINTER(7));
+
route_group_display.get_column (0)->set_expand (true);
route_group_display.get_column (1)->set_expand (false);
+ route_group_display.get_column (2)->set_expand (false);
+ route_group_display.get_column (3)->set_expand (false);
+ route_group_display.get_column (4)->set_expand (false);
+ route_group_display.get_column (5)->set_expand (false);
+ route_group_display.get_column (6)->set_expand (false);
+ route_group_display.get_column (7)->set_expand (false);
+
route_group_display.set_headers_visible (true);
/* name is directly editable */
active_cell->property_activatable() = true;
active_cell->property_radio() = false;
- active_cell = dynamic_cast<CellRendererToggle*>(route_group_display.get_column_cell_renderer (1));
+ active_cell = dynamic_cast<CellRendererToggle*>(route_group_display.get_column_cell_renderer (2));
+ active_cell->property_activatable() = true;
+ active_cell->property_radio() = false;
+
+ active_cell = dynamic_cast<CellRendererToggle*>(route_group_display.get_column_cell_renderer (3));
+ active_cell->property_activatable() = true;
+ active_cell->property_radio() = false;
+
+ active_cell = dynamic_cast<CellRendererToggle*>(route_group_display.get_column_cell_renderer (4));
+ active_cell->property_activatable() = true;
+ active_cell->property_radio() = false;
+
+ active_cell = dynamic_cast<CellRendererToggle*>(route_group_display.get_column_cell_renderer (5));
+ active_cell->property_activatable() = true;
+ active_cell->property_radio() = false;
+
+ active_cell = dynamic_cast<CellRendererToggle*>(route_group_display.get_column_cell_renderer (6));
+ active_cell->property_activatable() = true;
+ active_cell->property_radio() = false;
+
+ active_cell = dynamic_cast<CellRendererToggle*>(route_group_display.get_column_cell_renderer (7));
active_cell->property_activatable() = true;
active_cell->property_radio() = false;
group_model->signal_row_changed().connect (mem_fun (*this, &Editor::route_group_row_change));
+
route_group_display.set_name ("EditGroupList");
route_group_display.get_selection()->set_mode (SELECTION_SINGLE);
route_group_display.set_headers_visible (true);
void redisplay_tempo (bool immediate_redraw);
void snap_to (nframes64_t& first, int32_t direction = 0, bool for_mark = false);
-
+ void snap_to (nframes64_t& first, nframes64_t& last, int32_t direction = 0, bool for_mark = false);
+
double snap_length_beats (nframes64_t start);
uint32_t bbt_beat_subdivision;
/* edit group management */
struct GroupListModelColumns : public Gtk::TreeModel::ColumnRecord {
+
GroupListModelColumns () {
- add (is_visible);
- add (text);
- add (routegroup);
+ add (is_visible);
+ add (gain);
+ add (record);
+ add (mute);
+ add (solo);
+ add (select);
+ add (edits);
+ add (text);
+ add (routegroup);
}
+
Gtk::TreeModelColumn<bool> is_visible;
+ Gtk::TreeModelColumn<bool> gain;
+ Gtk::TreeModelColumn<bool> record;
+ Gtk::TreeModelColumn<bool> mute;
+ Gtk::TreeModelColumn<bool> solo;
+ Gtk::TreeModelColumn<bool> select;
+ Gtk::TreeModelColumn<bool> edits;
Gtk::TreeModelColumn<std::string> text;
- Gtk::TreeModelColumn<ARDOUR::RouteGroup*> routegroup;
+ Gtk::TreeModelColumn<ARDOUR::RouteGroup*> routegroup;
};
GroupListModelColumns group_columns;
+
Glib::RefPtr<Gtk::ListStore> group_model;
Glib::RefPtr<Gtk::TreeSelection> group_selection;
void
Editor::new_route_group ()
{
- RouteGroup* g = new RouteGroup (*session, "", RouteGroup::Active);
+ RouteGroup* g = new RouteGroup (*session, "", RouteGroup::Active, (RouteGroup::Property) (RouteGroup::Mute | RouteGroup::Solo | RouteGroup::Edit));
RouteGroupDialog d (g, Gtk::Stock::NEW);
int const r = d.do_run ();
void
Editor::new_route_group_from_selection ()
{
- RouteGroup* g = new RouteGroup (*session, "", RouteGroup::Active);
+ RouteGroup* g = new RouteGroup (*session, "", RouteGroup::Active, (RouteGroup::Property) (RouteGroup::Mute | RouteGroup::Solo | RouteGroup::Edit | RouteGroup::Select));
RouteGroupDialog d (g, Gtk::Stock::NEW);
int const r = d.do_run ();
void
Editor::new_route_group_from_rec_enabled ()
{
- RouteGroup* g = new RouteGroup (*session, "", RouteGroup::Active);
+ RouteGroup* g = new RouteGroup (*session, "", RouteGroup::Active, (RouteGroup::Property) (RouteGroup::Mute | RouteGroup::Solo | RouteGroup::Edit | RouteGroup::RecEnable));
RouteGroupDialog d (g, Gtk::Stock::NEW);
int const r = d.do_run ();
void
Editor::new_route_group_from_soloed ()
{
- RouteGroup* g = new RouteGroup (*session, "", RouteGroup::Active);
+ RouteGroup* g = new RouteGroup (*session, "", RouteGroup::Active, (RouteGroup::Property) (RouteGroup::Mute | RouteGroup::Solo | RouteGroup::Edit));
RouteGroupDialog d (g, Gtk::Stock::NEW);
int const r = d.do_run ();
break;
case 1:
+ if ((iter = group_model->get_iter (path))) {
+ bool gain = (*iter)[group_columns.gain];
+ (*iter)[group_columns.gain] = !gain;
+#ifdef GTKOSX
+ route_group_display.queue_draw();
+#endif
+ return true;
+ }
+ break;
+
+ case 2:
+ if ((iter = group_model->get_iter (path))) {
+ bool record = (*iter)[group_columns.record];
+ (*iter)[group_columns.record] = !record;
+#ifdef GTKOSX
+ route_group_display.queue_draw();
+#endif
+ return true;
+ }
+ break;
+
+ case 3:
+ if ((iter = group_model->get_iter (path))) {
+ bool mute = (*iter)[group_columns.mute];
+ (*iter)[group_columns.mute] = !mute;
+#ifdef GTKOSX
+ route_group_display.queue_draw();
+#endif
+ return true;
+ }
+ break;
+
+ case 4:
+ if ((iter = group_model->get_iter (path))) {
+ bool solo = (*iter)[group_columns.solo];
+ (*iter)[group_columns.solo] = !solo;
+#ifdef GTKOSX
+ route_group_display.queue_draw();
+#endif
+ return true;
+ }
+ break;
+
+ case 5:
+ if ((iter = group_model->get_iter (path))) {
+ bool select = (*iter)[group_columns.select];
+ (*iter)[group_columns.select] = !select;
+#ifdef GTKOSX
+ route_group_display.queue_draw();
+#endif
+ return true;
+ }
+ break;
+
+ case 6:
+ if ((iter = group_model->get_iter (path))) {
+ bool edits = (*iter)[group_columns.edits];
+ (*iter)[group_columns.edits] = !edits;
+#ifdef GTKOSX
+ route_group_display.queue_draw();
+#endif
+ return true;
+ }
+ break;
+
+ case 7:
if ((iter = group_model->get_iter (path))) {
bool visible = (*iter)[group_columns.is_visible];
(*iter)[group_columns.is_visible] = !visible;
}
}
+ if ((*iter)[group_columns.gain]) {
+ for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) {
+ if ((*j)->route_group() == group) {
+ group->set_property (RouteGroup::Gain, true);
+ }
+ }
+ } else {
+ for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) {
+ if ((*j)->route_group() == group) {
+ group->set_property (RouteGroup::Gain, false);
+ }
+ }
+ }
+
+ if ((*iter)[group_columns.record]) {
+ for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) {
+ if ((*j)->route_group() == group) {
+ group->set_property (RouteGroup::RecEnable, true);
+ }
+ }
+ } else {
+ for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) {
+ if ((*j)->route_group() == group) {
+ group->set_property (RouteGroup::RecEnable, false);
+ }
+ }
+ }
+
+ if ((*iter)[group_columns.mute]) {
+ for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) {
+ if ((*j)->route_group() == group) {
+ group->set_property (RouteGroup::Mute, true);
+ }
+ }
+ } else {
+ for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) {
+ if ((*j)->route_group() == group) {
+ group->set_property (RouteGroup::Mute, false);
+ }
+ }
+ }
+
+ if ((*iter)[group_columns.solo]) {
+ for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) {
+ if ((*j)->route_group() == group) {
+ group->set_property (RouteGroup::Solo, true);
+ }
+ }
+ } else {
+ for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) {
+ if ((*j)->route_group() == group) {
+ group->set_property (RouteGroup::Solo, false);
+ }
+ }
+ }
+
+ if ((*iter)[group_columns.select]) {
+ for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) {
+ if ((*j)->route_group() == group) {
+ group->set_property (RouteGroup::Select, true);
+ }
+ }
+ } else {
+ for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) {
+ if ((*j)->route_group() == group) {
+ group->set_property (RouteGroup::Select, false);
+ }
+ }
+ }
+
+ if ((*iter)[group_columns.edits]) {
+ for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) {
+ if ((*j)->route_group() == group) {
+ group->set_property (RouteGroup::Edit, true);
+ }
+ }
+ } else {
+ for (TrackViewList::iterator j = track_views.begin(); j != track_views.end(); ++j) {
+ if ((*j)->route_group() == group) {
+ group->set_property (RouteGroup::Edit, false);
+ }
+ }
+ }
+
string name = (*iter)[group_columns.text];
if (name != group->name()) {
bool focus = false;
TreeModel::Row row = *(group_model->append());
+
row[group_columns.is_visible] = !group->is_hidden();
+ row[group_columns.gain] = group->property(RouteGroup::Gain);
+ row[group_columns.record] = group->property(RouteGroup::RecEnable);
+ row[group_columns.mute] = group->property(RouteGroup::Mute);
+ row[group_columns.solo] = group->property(RouteGroup::Solo);
+ row[group_columns.select] = group->property(RouteGroup::Select);
+ row[group_columns.edits] = group->property(RouteGroup::Edit);
in_route_group_row_change = true;
group->FlagsChanged.connect (bind (mem_fun(*this, &Editor::group_flags_changed), group));
- if (focus) {
+ if (focus) {
TreeViewColumn* col = route_group_display.get_column (0);
CellRendererText* name_cell = dynamic_cast<CellRendererText*>(route_group_display.get_column_cell_renderer (0));
route_group_display.set_cursor (group_model->get_path (row), *col, *name_cell, true);
in_route_group_row_change = true;
Gtk::TreeModel::Children children = group_model->children();
+
for(Gtk::TreeModel::Children::iterator iter = children.begin(); iter != children.end(); ++iter) {
if (group == (*iter)[group_columns.routegroup]) {
(*iter)[group_columns.is_visible] = !group->is_hidden();
(*iter)[group_columns.text] = group->name();
+ (*iter)[group_columns.gain] = group->property(RouteGroup::Gain);
+ (*iter)[group_columns.record] = group->property(RouteGroup::RecEnable);
+ (*iter)[group_columns.mute] = group->property(RouteGroup::Mute);
+ (*iter)[group_columns.solo] = group->property(RouteGroup::Solo);
+ (*iter)[group_columns.select] = group->property(RouteGroup::Select);
+ (*iter)[group_columns.edits] = group->property(RouteGroup::Edit);
}
}
if (ev->button == 1) {
if (group_menu == 0) {
- group_menu = new RouteGroupMenu (_session);
+
+ group_menu = new RouteGroupMenu (
+ _session,
+ (RouteGroup::Property) (RouteGroup::Gain | RouteGroup::Mute | RouteGroup::Solo)
+ );
+
group_menu->GroupSelected.connect (mem_fun (*this, &MixerStrip::set_route_group));
}
void
Mixer_UI::new_route_group ()
{
- session->add_route_group (new RouteGroup (*session, ""));
+ session->add_route_group (new RouteGroup (*session, "", RouteGroup::Active, (RouteGroup::Property) (RouteGroup::Gain |RouteGroup::Mute | RouteGroup::Solo)));
}
void
#include "ardour/route_group.h"
#include "route_group_dialog.h"
#include "i18n.h"
+#include <iostream>
using namespace Gtk;
using namespace ARDOUR;
+using namespace std;
RouteGroupDialog::RouteGroupDialog (RouteGroup* g, StockID const & s)
: Dialog (_("Route group")),
get_vbox()->pack_start (*h);
get_vbox()->pack_start (_active);
- get_vbox()->pack_start (_gain);
h = manage (new HBox);
+ h->pack_start (_gain);
h->pack_start (_relative, PACK_EXPAND_PADDING);
get_vbox()->pack_start (*h);
int const r = run ();
if (r == Gtk::RESPONSE_OK) {
- _group->set_name (_name.get_text ());
- _group->set_active (_active.get_active (), this);
-
_group->set_property (RouteGroup::Gain, _gain.get_active ());
_group->set_property (RouteGroup::Mute, _mute.get_active ());
_group->set_property (RouteGroup::Solo, _solo.get_active ());
_group->set_property (RouteGroup::RecEnable, _rec_enable.get_active ());
_group->set_property (RouteGroup::Select, _select.get_active ());
_group->set_property (RouteGroup::Edit, _edit.get_active ());
+ _group->set_name (_name.get_text ()); // This emits changed signal
+ _group->set_active (_active.get_active (), this);
_group->set_relative (_relative.get_active(), this);
}
+/*
+ Copyright (C) 2009 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
#include <gtkmm/menu.h>
#include <gtkmm/stock.h>
#include "ardour/session.h"
using namespace Gtk;
using namespace ARDOUR;
-RouteGroupMenu::RouteGroupMenu (Session& s)
- : _session (s)
+RouteGroupMenu::RouteGroupMenu (Session& s, RouteGroup::Property p)
+ : _session (s),
+ _default_properties (p)
{
rebuild (0);
}
void
RouteGroupMenu::new_group ()
{
- RouteGroup* g = new RouteGroup (_session, "", RouteGroup::Active);
+ RouteGroup* g = new RouteGroup (_session, "", RouteGroup::Active, _default_properties);
RouteGroupDialog d (g, Gtk::Stock::NEW);
int const r = d.do_run ();
+/*
+ Copyright (C) 2009 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "ardour/route_group.h"
+
namespace ARDOUR {
class Session;
- class RouteGroup;
}
class RouteGroupMenu : public Gtk::Menu
{
public:
- RouteGroupMenu (ARDOUR::Session &);
+ RouteGroupMenu (ARDOUR::Session &, ARDOUR::RouteGroup::Property);
void rebuild (ARDOUR::RouteGroup *);
void set_group (ARDOUR::RouteGroup *);
ARDOUR::Session& _session;
+ ARDOUR::RouteGroup::Property _default_properties;
};
_editor.ZoomChanged.connect (mem_fun(*this, &RouteTimeAxisView::reset_samples_per_unit));
ColorsChanged.connect (mem_fun (*this, &RouteTimeAxisView::color_handler));
- route_group_menu = new RouteGroupMenu (_session);
+ route_group_menu = new RouteGroupMenu (
+ _session,
+ (RouteGroup::Property) (RouteGroup::Mute | RouteGroup::Solo | RouteGroup::Edit)
+ );
+
route_group_menu->GroupSelected.connect (mem_fun (*this, &RouteTimeAxisView::set_route_group_from_menu));
gm.get_gain_slider().signal_scroll_event().connect(mem_fun(*this, &RouteTimeAxisView::controls_ebox_scroll), false);
Edit = 0x20
};
- RouteGroup (Session& s, const std::string &n, Flag f = Flag(0));
+ RouteGroup (Session& s, const std::string &n, Flag f = Flag(0), Property p = Property(0));
const std::string& name() { return _name; }
void set_name (std::string str);
using namespace sigc;
using namespace std;
-RouteGroup::RouteGroup (Session& s, const string &n, Flag f)
- : _session (s), _name (n), _flags (f), _properties (Property (0))
+RouteGroup::RouteGroup (Session& s, const string &n, Flag f, Property p)
+ : _session (s), _name (n), _flags (f), _properties (Property (p))
{
}