13
0

lincoln's patch from mantis 2757 to add route group property checkboxes in the route groups

editor list, and to initialise new route groups with some appropriate properties.


git-svn-id: svn://localhost/ardour2/branches/3.0@5295 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2009-06-29 00:57:27 +00:00
parent da148faf00
commit 26328c9ef1
11 changed files with 303 additions and 26 deletions

View File

@ -558,6 +558,7 @@ Editor::Editor ()
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");
@ -577,12 +578,36 @@ Editor::Editor ()
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 */
@ -597,12 +622,33 @@ Editor::Editor ()
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);

View File

@ -1600,7 +1600,8 @@ public:
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;
@ -1844,17 +1845,32 @@ public:
/* 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;

View File

@ -106,7 +106,7 @@ Editor::set_route_group_activation (RouteGroup* g, bool a)
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 ();
@ -121,7 +121,7 @@ Editor::new_route_group ()
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 ();
@ -144,7 +144,7 @@ Editor::new_route_group_from_selection ()
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 ();
@ -167,7 +167,7 @@ Editor::new_route_group_from_rec_enabled ()
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 ();
@ -272,6 +272,72 @@ Editor::route_group_list_button_press_event (GdkEventButton* ev)
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;
@ -316,6 +382,90 @@ Editor::route_group_row_change (const Gtk::TreeModel::Path& path,const Gtk::Tree
}
}
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()) {
@ -330,7 +480,14 @@ Editor::add_route_group (RouteGroup* group)
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;
@ -345,7 +502,7 @@ Editor::add_route_group (RouteGroup* group)
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);
@ -384,10 +541,17 @@ Editor::group_flags_changed (void* src, RouteGroup* group)
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);
}
}

View File

@ -1068,7 +1068,12 @@ MixerStrip::select_route_group (GdkEventButton *ev)
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));
}

View File

@ -1112,7 +1112,7 @@ Mixer_UI::route_groups_changed ()
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

View File

@ -2,9 +2,11 @@
#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")),
@ -35,9 +37,9 @@ RouteGroupDialog::RouteGroupDialog (RouteGroup* g, StockID const & s)
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);
@ -61,15 +63,14 @@ RouteGroupDialog::do_run ()
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);
}

View File

@ -1,3 +1,22 @@
/*
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"
@ -9,8 +28,9 @@
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);
}
@ -57,7 +77,7 @@ RouteGroupMenu::set_group (RouteGroup* g)
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 ();

View File

@ -1,12 +1,32 @@
/*
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 *);
@ -18,4 +38,5 @@ private:
void set_group (ARDOUR::RouteGroup *);
ARDOUR::Session& _session;
ARDOUR::RouteGroup::Property _default_properties;
};

View File

@ -253,7 +253,11 @@ RouteTimeAxisView::RouteTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
_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);

View File

@ -52,7 +52,7 @@ public:
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);

View File

@ -38,8 +38,8 @@ using namespace ARDOUR;
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))
{
}