/*
- Copyright (C) 2000 Paul Davis
+ Copyright (C) 2000 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
#include "editor_route_groups.h"
#include "ardour/route.h"
+#include "ardour/session.h"
#include "i18n.h"
using namespace std;
-using namespace sigc;
using namespace ARDOUR;
using namespace PBD;
using namespace Gtk;
+using Gtkmm2ext::Keyboard;
EditorRouteGroups::EditorRouteGroups (Editor* e)
: EditorComponent (e),
CellRendererText* name_cell = dynamic_cast<CellRendererText*>(_display.get_column_cell_renderer (0));
name_cell->property_editable() = true;
- name_cell->signal_edited().connect (mem_fun (*this, &EditorRouteGroups::name_edit));
+ name_cell->signal_edited().connect (sigc::mem_fun (*this, &EditorRouteGroups::name_edit));
/* use checkbox for the active + visible columns */
active_cell->property_activatable() = true;
active_cell->property_radio() = false;
- _model->signal_row_changed().connect (mem_fun (*this, &EditorRouteGroups::row_change));
+ _model->signal_row_changed().connect (sigc::mem_fun (*this, &EditorRouteGroups::row_change));
_display.set_name ("EditGroupList");
_display.get_selection()->set_mode (SELECTION_SINGLE);
_scroller.add (_display);
_scroller.set_policy (POLICY_AUTOMATIC, POLICY_AUTOMATIC);
- _display.signal_button_press_event().connect (mem_fun(*this, &EditorRouteGroups::button_press_event), false);
+ _display.signal_button_press_event().connect (sigc::mem_fun(*this, &EditorRouteGroups::button_press_event), false);
_display_packer = new VBox;
HBox* button_box = manage (new HBox());
w->show();
remove_button->add (*w);
- add_button->signal_clicked().connect (mem_fun (*this, &EditorRouteGroups::new_route_group));
- remove_button->signal_clicked().connect (mem_fun (*this, &EditorRouteGroups::remove_selected));
-
+ add_button->signal_clicked().connect (hide_return (sigc::mem_fun (*this, &EditorRouteGroups::new_route_group)));
+ remove_button->signal_clicked().connect (sigc::mem_fun (*this, &EditorRouteGroups::remove_selected));
+
button_box->pack_start (*add_button);
button_box->pack_start (*remove_button);
_display_packer->pack_start (_scroller, true, true);
_display_packer->pack_start (*button_box, false, false);
}
-
+
Gtk::Menu*
EditorRouteGroups::menu (RouteGroup* g)
Menu* new_from = new Menu;
MenuList& f = new_from->items ();
- f.push_back (MenuElem (_("Selection..."), mem_fun (*this, &EditorRouteGroups::new_from_selection)));
- f.push_back (MenuElem (_("Record Enabled..."), mem_fun (*this, &EditorRouteGroups::new_from_rec_enabled)));
- f.push_back (MenuElem (_("Soloed..."), mem_fun (*this, &EditorRouteGroups::new_from_soloed)));
+ f.push_back (MenuElem (_("Selection..."), sigc::mem_fun (*this, &EditorRouteGroups::new_from_selection)));
+ f.push_back (MenuElem (_("Record Enabled..."), sigc::mem_fun (*this, &EditorRouteGroups::new_from_rec_enabled)));
+ f.push_back (MenuElem (_("Soloed..."), sigc::mem_fun (*this, &EditorRouteGroups::new_from_soloed)));
_menu = new Menu;
_menu->set_name ("ArdourContextMenu");
MenuList& items = _menu->items();
- items.push_back (MenuElem (_("New..."), mem_fun(*this, &EditorRouteGroups::new_route_group)));
+ items.push_back (MenuElem (_("New..."), hide_return (sigc::mem_fun(*this, &EditorRouteGroups::new_route_group))));
items.push_back (MenuElem (_("New From"), *new_from));
if (g) {
- items.push_back (MenuElem (_("Edit..."), bind (mem_fun (*this, &EditorRouteGroups::edit), g)));
- items.push_back (MenuElem (_("Fit to Window"), bind (mem_fun (*_editor, &Editor::fit_route_group), g)));
- items.push_back (MenuElem (_("Subgroup"), bind (mem_fun (*this, &EditorRouteGroups::subgroup), g)));
- items.push_back (MenuElem (_("Collect"), bind (mem_fun (*this, &EditorRouteGroups::collect), g)));
+ items.push_back (MenuElem (_("Edit..."), sigc::bind (sigc::mem_fun (*this, &EditorRouteGroups::edit), g)));
+ items.push_back (MenuElem (_("Fit to Window"), sigc::bind (sigc::mem_fun (*_editor, &Editor::fit_route_group), g)));
+ items.push_back (MenuElem (_("Subgroup"), sigc::bind (sigc::mem_fun (*this, &EditorRouteGroups::subgroup), g)));
+ items.push_back (MenuElem (_("Collect"), sigc::bind (sigc::mem_fun (*this, &EditorRouteGroups::collect), g)));
}
items.push_back (SeparatorElem());
- items.push_back (MenuElem (_("Activate All"), mem_fun(*this, &EditorRouteGroups::activate_all)));
- items.push_back (MenuElem (_("Disable All"), mem_fun(*this, &EditorRouteGroups::disable_all)));
+ items.push_back (MenuElem (_("Activate All"), sigc::mem_fun(*this, &EditorRouteGroups::activate_all)));
+ items.push_back (MenuElem (_("Disable All"), sigc::mem_fun(*this, &EditorRouteGroups::disable_all)));
return _menu;
}
EditorRouteGroups::activate_all ()
{
_session->foreach_route_group (
- bind (mem_fun (*this, &EditorRouteGroups::set_activation), true)
+ sigc::bind (sigc::mem_fun (*this, &EditorRouteGroups::set_activation), true)
);
}
EditorRouteGroups::disable_all ()
{
_session->foreach_route_group (
- bind (mem_fun (*this, &EditorRouteGroups::set_activation), false)
+ sigc::bind (sigc::mem_fun (*this, &EditorRouteGroups::set_activation), false)
);
}
g->set_active (a, this);
}
-void
-EditorRouteGroups::new_route_group ()
+ARDOUR::RouteGroup *
+EditorRouteGroups::new_route_group () const
{
- RouteGroup* g = new RouteGroup (
- *_session,
- "",
- RouteGroup::Active,
- (RouteGroup::Property) (RouteGroup::Mute | RouteGroup::Solo | RouteGroup::Edit)
- );
+ PropertyList plist;
+
+ plist.add (Properties::active, true);
+ plist.add (Properties::mute, true);
+ plist.add (Properties::solo, true);
+ plist.add (Properties::edit, true);
+
+ RouteGroup* g = new RouteGroup (*_session, "");
+
+ g->set_properties (plist);
RouteGroupDialog d (g, Gtk::Stock::NEW);
int const r = d.do_run ();
- if (r == Gtk::RESPONSE_OK) {
- _session->add_route_group (g);
- } else {
+ if (r != Gtk::RESPONSE_OK) {
delete g;
+ return 0;
}
+
+ _session->add_route_group (g);
+ return g;
}
-
void
-EditorRouteGroups::new_from_selection ()
+EditorRouteGroups::run_new_group_dialog (const RouteList& rl)
{
- RouteGroup* g = new RouteGroup (
- *_session,
- "",
- RouteGroup::Active,
- (RouteGroup::Property) (RouteGroup::Mute | RouteGroup::Solo | RouteGroup::Edit | RouteGroup::Select)
- );
+ PropertyList plist;
+
+ plist.add (Properties::active, true);
+ plist.add (Properties::mute, true);
+ plist.add (Properties::solo, true);
+ plist.add (Properties::recenable, true);
+ plist.add (Properties::edit, true);
+
+ RouteGroup* g = new RouteGroup (*_session, "");
+ g->set_properties (plist);
RouteGroupDialog d (g, Gtk::Stock::NEW);
int const r = d.do_run ();
- if (r == Gtk::RESPONSE_OK) {
+ switch (r) {
+ case Gtk::RESPONSE_OK:
+ case Gtk::RESPONSE_ACCEPT:
_session->add_route_group (g);
-
- for (TrackSelection::iterator i = _editor->get_selection().tracks.begin(); i != _editor->get_selection().tracks.end(); ++i) {
- RouteTimeAxisViewPtr rtv = boost::dynamic_pointer_cast<RouteTimeAxisView> (*i);
- if (rtv) {
- rtv->route()->set_route_group (g, this);
- }
+ for (RouteList::const_iterator i = rl.begin(); i != rl.end(); ++i) {
+ g->add (*i);
}
-
- } else {
+ break;
+ default:
delete g;
}
}
void
-EditorRouteGroups::new_from_rec_enabled ()
+EditorRouteGroups::new_from_selection ()
{
- 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 ();
+ if (_editor->get_selection().tracks.empty()) {
+ return;
+ }
- if (r == Gtk::RESPONSE_OK) {
- _session->add_route_group (g);
+ RouteList rl;
- for (Editor::TrackViewList::const_iterator i = _editor->get_track_views().begin(); i != _editor->get_track_views().end(); ++i) {
- RouteTimeAxisViewPtr rtv = boost::dynamic_pointer_cast<RouteTimeAxisView> (*i);
- if (rtv && rtv->route()->record_enabled()) {
- rtv->route()->set_route_group (g, this);
- }
+ for (TrackSelection::iterator i = _editor->get_selection().tracks.begin(); i != _editor->get_selection().tracks.end(); ++i) {
+ RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
+ if (rtv) {
+ rl.push_back (rtv->route());
}
-
- } else {
- delete g;
}
+
+ if (rl.empty()) {
+ return;
+ }
+
+ run_new_group_dialog (rl);
}
void
-EditorRouteGroups::new_from_soloed ()
+EditorRouteGroups::new_from_rec_enabled ()
{
- RouteGroup* g = new RouteGroup (
- *_session,
- "",
- RouteGroup::Active,
- (RouteGroup::Property) (RouteGroup::Mute | RouteGroup::Solo | RouteGroup::Edit)
- );
+ RouteList rl;
- RouteGroupDialog d (g, Gtk::Stock::NEW);
- int const r = d.do_run ();
+ for (TrackViewList::const_iterator i = _editor->get_track_views().begin(); i != _editor->get_track_views().end(); ++i) {
+ RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
+ if (rtv && rtv->route()->record_enabled()) {
+ rl.push_back (rtv->route());
+ }
+ }
- if (r == Gtk::RESPONSE_OK) {
- _session->add_route_group (g);
+ if (rl.empty()) {
+ return;
+ }
- for (Editor::TrackViewList::const_iterator i = _editor->get_track_views().begin(); i != _editor->get_track_views().end(); ++i) {
- RouteTimeAxisViewPtr rtv = boost::dynamic_pointer_cast<RouteTimeAxisView> (*i);
- if (rtv && !rtv->route()->is_master() && rtv->route()->soloed()) {
- rtv->route()->set_route_group (g, this);
- }
+ run_new_group_dialog (rl);
+}
+
+void
+EditorRouteGroups::new_from_soloed ()
+{
+ RouteList rl;
+
+ for (TrackViewList::const_iterator i = _editor->get_track_views().begin(); i != _editor->get_track_views().end(); ++i) {
+ RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
+ if (rtv && !rtv->route()->is_master() && rtv->route()->soloed()) {
+ rl.push_back (rtv->route());
}
-
- } else {
- delete g;
}
+
+ if (rl.empty()) {
+ return;
+ }
+
+ run_new_group_dialog (rl);
}
void
TreeView::Selection::ListHandle_Path::iterator i = rows.begin();
TreeIter iter;
-
+
/* selection mode is single, so rows.begin() is it */
if ((iter = _model->get_iter (*i))) {
if (p) {
iter = _model->get_iter (path);
}
-
+
if (iter) {
group = (*iter)[_columns.routegroup];
}
return true;
}
}
-
- }
+
+ }
break;
case 1:
default:
break;
}
-
+
return false;
}
-void
-EditorRouteGroups::row_change (const Gtk::TreeModel::Path& path,const Gtk::TreeModel::iterator& iter)
+void
+EditorRouteGroups::row_change (const Gtk::TreeModel::Path&, const Gtk::TreeModel::iterator& iter)
{
RouteGroup* group;
}
if ((*iter)[_columns.is_visible]) {
- for (Editor::TrackViewList::const_iterator j = _editor->get_track_views().begin(); j != _editor->get_track_views().end(); ++j) {
+ for (TrackViewList::const_iterator j = _editor->get_track_views().begin(); j != _editor->get_track_views().end(); ++j) {
if ((*j)->route_group() == group) {
- _editor->_routes->show_track_in_display (*j);
+ _editor->_routes->show_track_in_display (**j);
}
}
} else {
- for (Editor::TrackViewList::const_iterator j = _editor->get_track_views().begin(); j != _editor->get_track_views().end(); ++j) {
+ for (TrackViewList::const_iterator j = _editor->get_track_views().begin(); j != _editor->get_track_views().end(); ++j) {
if ((*j)->route_group() == group) {
- _editor->hide_track_in_display (*j);
+ _editor->hide_track_in_display (**j);
}
}
}
- group->set_property (RouteGroup::Gain, (*iter)[_columns.gain]);
- group->set_property (RouteGroup::RecEnable, (*iter)[_columns.record]);
- group->set_property (RouteGroup::Mute, (*iter)[_columns.mute]);
- group->set_property (RouteGroup::Solo, (*iter)[_columns.solo]);
- group->set_property (RouteGroup::Select, (*iter)[_columns.select]);
- group->set_property (RouteGroup::Edit, (*iter)[_columns.edits]);
-
- string name = (*iter)[_columns.text];
-
- if (name != group->name()) {
- group->set_name (name);
- }
+ PropertyList plist;
+ bool val = (*iter)[_columns.gain];
+ plist.add (Properties::gain, val);
+ val = (*iter)[_columns.record];
+ plist.add (Properties::recenable, val);
+ val = (*iter)[_columns.mute];
+ plist.add (Properties::mute, val);
+ val = (*iter)[_columns.solo];
+ plist.add (Properties::solo, val);
+ val = (*iter)[_columns.select];
+ plist.add (Properties::select, val);
+ val = (*iter)[_columns.edits];
+ plist.add (Properties::edit, val);
+ plist.add (Properties::name, string ((*iter)[_columns.text]));
+
+ group->set_properties (plist);
}
void
EditorRouteGroups::add (RouteGroup* group)
{
- ENSURE_GUI_THREAD (bind (mem_fun(*this, &EditorRouteGroups::add), group));
+ ENSURE_GUI_THREAD (*this, &EditorRouteGroups::add, group)
bool focus = false;
TreeModel::Row row = *(_model->append());
-
+
row[_columns.is_visible] = !group->is_hidden();
- row[_columns.gain] = group->property(RouteGroup::Gain);
- row[_columns.record] = group->property(RouteGroup::RecEnable);
- row[_columns.mute] = group->property(RouteGroup::Mute);
- row[_columns.solo] = group->property(RouteGroup::Solo);
- row[_columns.select] = group->property(RouteGroup::Select);
- row[_columns.edits] = group->property(RouteGroup::Edit);
+ row[_columns.gain] = group->is_gain ();
+ row[_columns.record] = group->is_recenable();
+ row[_columns.mute] = group->is_mute ();
+ row[_columns.solo] = group->is_solo ();
+ row[_columns.select] = group->is_select ();
+ row[_columns.edits] = group->is_edit ();
_in_row_change = true;
focus = true;
}
- group->FlagsChanged.connect (bind (mem_fun (*this, &EditorRouteGroups::flags_changed), group));
+ group->FlagsChanged.connect (flags_connection, ui_bind (&EditorRouteGroups::flags_changed, this, _1, group), gui_context());
- if (focus) {
+ if (focus) {
TreeViewColumn* col = _display.get_column (0);
CellRendererText* name_cell = dynamic_cast<CellRendererText*>(_display.get_column_cell_renderer (0));
_display.set_cursor (_model->get_path (row), *col, *name_cell, true);
void
EditorRouteGroups::groups_changed ()
{
- ENSURE_GUI_THREAD (mem_fun (*this, &EditorRouteGroups::groups_changed));
+ ENSURE_GUI_THREAD (*this, &EditorRouteGroups::groups_changed)
/* just rebuild the while thing */
row[_columns.routegroup] = 0;
}
- _session->foreach_route_group (mem_fun (*this, &EditorRouteGroups::add));
+ if (_session) {
+ _session->foreach_route_group (sigc::mem_fun (*this, &EditorRouteGroups::add));
+ }
}
void
-EditorRouteGroups::flags_changed (void* src, RouteGroup* group)
+EditorRouteGroups::flags_changed (void*, RouteGroup* group)
{
- ENSURE_GUI_THREAD (bind (mem_fun(*this, &EditorRouteGroups::flags_changed), src, group));
+ ENSURE_GUI_THREAD (*this, &EditorRouteGroups::flags_changed, src, group)
_in_row_change = true;
if (group == (*iter)[_columns.routegroup]) {
(*iter)[_columns.is_visible] = !group->is_hidden();
(*iter)[_columns.text] = group->name();
- (*iter)[_columns.gain] = group->property(RouteGroup::Gain);
- (*iter)[_columns.record] = group->property(RouteGroup::RecEnable);
- (*iter)[_columns.mute] = group->property(RouteGroup::Mute);
- (*iter)[_columns.solo] = group->property(RouteGroup::Solo);
- (*iter)[_columns.select] = group->property(RouteGroup::Select);
- (*iter)[_columns.edits] = group->property(RouteGroup::Edit);
+ (*iter)[_columns.gain] = group->is_gain ();
+ (*iter)[_columns.record] = group->is_recenable ();
+ (*iter)[_columns.mute] = group->is_mute ();
+ (*iter)[_columns.solo] = group->is_solo ();
+ (*iter)[_columns.select] = group->is_select ();
+ (*iter)[_columns.edits] = group->is_edit ();
}
}
{
RouteGroup* group;
TreeIter iter;
-
+
if ((iter = _model->get_iter (path))) {
-
+
if ((group = (*iter)[_columns.routegroup]) == 0) {
return;
}
-
+
if (new_text != group->name()) {
group->set_name (new_text);
}
}
void
-EditorRouteGroups::connect_to_session (Session* s)
+EditorRouteGroups::set_session (Session* s)
{
- EditorComponent::connect_to_session (s);
+ EditorComponent::set_session (s);
- _session_connections.push_back (_session->route_group_added.connect (mem_fun (*this, &EditorRouteGroups::add)));
- _session_connections.push_back (_session->route_group_removed.connect (mem_fun (*this, &EditorRouteGroups::groups_changed)));
+ if (_session) {
+ _session->route_group_added.connect (_session_connections, ui_bind (&EditorRouteGroups::add, this, _1), gui_context());
+ _session->route_group_removed.connect (_session_connections, boost::bind (&EditorRouteGroups::groups_changed, this), gui_context());
+ }
groups_changed ();
}
struct CollectSorter {
- bool operator () (Route* a, Route* b) {
+ bool operator () (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
return a->order_key (N_ ("editor")) < b->order_key (N_ ("editor"));
}
};
void
EditorRouteGroups::collect (RouteGroup* g)
{
- list<Route*> routes = g->route_list ();
- routes.sort (CollectSorter ());
- int const N = routes.size ();
+ boost::shared_ptr<RouteList> routes = g->route_list ();
+ routes->sort (CollectSorter ());
+ int const N = routes->size ();
- list<Route*>::iterator i = routes.begin ();
- Editor::TrackViewList::const_iterator j = _editor->get_track_views().begin();
+ RouteList::iterator i = routes->begin ();
+ TrackViewList::const_iterator j = _editor->get_track_views().begin();
int diff = 0;
int coll = -1;
- while (i != routes.end() && j != _editor->get_track_views().end()) {
+ while (i != routes->end() && j != _editor->get_track_views().end()) {
- RouteTimeAxisViewPtr rtv = boost::dynamic_pointer_cast<RouteTimeAxisView> (*j);
+ RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*j);
if (rtv) {
boost::shared_ptr<Route> r = rtv->route ();
int const k = r->order_key (N_ ("editor"));
-
- if (*i == r.get()) {
+
+ if (*i == r) {
if (coll == -1) {
coll = k;
} else {
--diff;
}
-
+
r->set_order_key (N_ ("editor"), coll);
-
+
++coll;
++i;
-
+
} else {
-
+
r->set_order_key (N_ ("editor"), k + diff);
-
+
}
}
-
+
++j;
}
- _editor->_routes->sync_order_keys (N_ ("editor"));
+ _editor->_routes->sync_order_keys ("");
}