Allow edit group creation from the route UI's menu. Allow new tracks to be put in particular edit groups.

git-svn-id: svn://localhost/ardour2/branches/3.0@5226 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2009-06-20 15:40:26 +00:00
parent 6b20256ad4
commit f0bf3a0c19
16 changed files with 210 additions and 96 deletions

View File

@ -23,12 +23,14 @@
#include <sigc++/bind.h>
#include <gtkmm/stock.h>
#include <gtkmm/separator.h>
#include <gtkmm/table.h>
#include "pbd/error.h"
#include "pbd/convert.h"
#include "gtkmm2ext/utils.h"
#include "ardour/profile.h"
#include "ardour/template_utils.h"
#include "ardour/route_group.h"
#include "ardour/session.h"
#include "utils.h"
@ -49,8 +51,9 @@ static const char* track_mode_names[] = {
0
};
AddRouteDialog::AddRouteDialog ()
AddRouteDialog::AddRouteDialog (Session & s)
: Dialog (_("ardour: add track/bus")),
_session (s),
track_button (_("Tracks")),
bus_button (_("Busses")),
routes_adjustment (1, 1, 128, 1, 4),
@ -77,65 +80,65 @@ AddRouteDialog::AddRouteDialog ()
track_button.set_name ("AddRouteDialogRadioButton");
bus_button.set_name ("AddRouteDialogRadioButton");
routes_spinner.set_name ("AddRouteDialogSpinner");
RadioButton::Group g = track_button.get_group();
bus_button.set_group (g);
track_button.set_active (true);
/* add */
HBox* hbox1 = manage (new HBox);
hbox1->set_spacing (6);
Label* label1 = manage (new Label (_("Add this many:")));
hbox1->pack_start (*label1, PACK_SHRINK);
hbox1->pack_start (routes_spinner, PACK_SHRINK);
HBox* hbox2 = manage (new HBox);
hbox2->set_spacing (6);
hbox2->set_border_width (6);
hbox2->pack_start (*hbox1, PACK_EXPAND_WIDGET);
/* track/bus choice & modes */
HBox* hbox5 = manage (new HBox);
hbox5->set_spacing (6);
hbox5->pack_start (track_button, PACK_EXPAND_PADDING);
hbox5->pack_start (bus_button, PACK_EXPAND_PADDING);
channel_combo.set_name (X_("ChannelCountSelector"));
track_mode_combo.set_name (X_("ChannelCountSelector"));
refill_channel_setups ();
set_popdown_strings (track_mode_combo, track_mode_strings, true);
edit_group_combo.append_text (_("No group"));
_session.foreach_edit_group (mem_fun (*this, &AddRouteDialog::add_edit_group));
channel_combo.set_active_text (channel_combo_strings.front());
track_mode_combo.set_active_text (track_mode_strings.front());
edit_group_combo.set_active (0);
RadioButton::Group g = track_button.get_group();
bus_button.set_group (g);
track_button.set_active (true);
Table* table = manage (new Table (5, 2));
table->set_spacings (4);
/* add */
Label* l = manage (new Label (_("Add this many:")));
l->set_alignment (1, 0.5);
table->attach (*l, 0, 1, 0, 1);
table->attach (routes_spinner, 1, 2, 0, 1, FILL | EXPAND);
/* track/bus choice & modes */
HBox* hbox = manage (new HBox);
hbox->set_spacing (6);
hbox->pack_start (track_button, PACK_EXPAND_PADDING);
hbox->pack_start (bus_button, PACK_EXPAND_PADDING);
table->attach (*hbox, 0, 2, 1, 2);
channel_combo.set_name (X_("ChannelCountSelector"));
track_mode_combo.set_name (X_("ChannelCountSelector"));
track_button.signal_clicked().connect (mem_fun (*this, &AddRouteDialog::track_type_chosen));
bus_button.signal_clicked().connect (mem_fun (*this, &AddRouteDialog::track_type_chosen));
VBox* vbox1 = manage (new VBox);
vbox1->set_spacing (6);
vbox1->set_border_width (6);
Frame* frame1 = manage (new Frame (_("Channel Configuration")));
frame1->add (channel_combo);
Frame* frame2 = manage (new Frame (_("Track Mode")));
frame2->add (track_mode_combo);
l = manage (new Label (_("Channel configuration:")));
l->set_alignment (1, 0.5);
table->attach (*l, 0, 1, 2, 3);
table->attach (channel_combo, 1, 2, 2, 3, FILL | EXPAND);
vbox1->pack_start (*hbox5, PACK_SHRINK);
vbox1->pack_start (*frame1, PACK_SHRINK);
if (!ARDOUR::Profile->get_sae()) {
vbox1->pack_start (*frame2, PACK_SHRINK);
if (!ARDOUR::Profile->get_sae ()) {
l = manage (new Label (_("Track mode:")));
l->set_alignment (1, 0.5);
table->attach (*l, 0, 1, 3, 4);
table->attach (track_mode_combo, 1, 2, 3, 4, FILL | EXPAND);
}
l = manage (new Label (_("Add to edit group:")));
l->set_alignment (1, 0.5);
table->attach (*l, 0, 1, 4, 5);
table->attach (edit_group_combo, 1, 2, 4, 5, FILL | EXPAND);
get_vbox()->pack_start (*table);
get_vbox()->set_spacing (6);
get_vbox()->set_border_width (6);
get_vbox()->pack_start (*hbox2, PACK_SHRINK);
get_vbox()->pack_start (*vbox1, PACK_SHRINK);
get_vbox()->show_all ();
/* track template info will be managed whenever
@ -320,3 +323,19 @@ AddRouteDialog::refill_channel_setups ()
set_popdown_strings (channel_combo, channel_combo_strings, true);
channel_combo.set_active_text (channel_combo_strings.front());
}
void
AddRouteDialog::add_edit_group (RouteGroup* g)
{
edit_group_combo.append_text (g->name ());
}
RouteGroup*
AddRouteDialog::edit_group ()
{
if (edit_group_combo.get_active_row_number () == 0) {
return 0;
}
return _session.edit_group_by_name (edit_group_combo.get_active_text());
}

View File

@ -38,7 +38,7 @@
class AddRouteDialog : public Gtk::Dialog
{
public:
AddRouteDialog ();
AddRouteDialog (ARDOUR::Session &);
~AddRouteDialog ();
bool track ();
@ -50,8 +50,10 @@ class AddRouteDialog : public Gtk::Dialog
ARDOUR::DataType type();
ARDOUR::TrackMode mode();
ARDOUR::RouteGroup* edit_group ();
private:
ARDOUR::Session& _session;
Gtk::Entry name_template_entry;
Gtk::RadioButton track_button;
Gtk::RadioButton bus_button;
@ -59,11 +61,13 @@ class AddRouteDialog : public Gtk::Dialog
Gtk::SpinButton routes_spinner;
Gtk::ComboBoxText channel_combo;
Gtk::ComboBoxText track_mode_combo;
Gtk::ComboBoxText edit_group_combo;
std::vector<ARDOUR::TemplateInfo> route_templates;
void track_type_chosen ();
void refill_channel_setups ();
void add_edit_group (ARDOUR::RouteGroup *);
void reset_template_option_visibility ();

View File

@ -1242,7 +1242,7 @@ ARDOUR_UI::open_session ()
void
ARDOUR_UI::session_add_midi_route (bool disk, uint32_t how_many)
ARDOUR_UI::session_add_midi_route (bool disk, RouteGroup* edit_group, uint32_t how_many)
{
list<boost::shared_ptr<MidiTrack> > tracks;
@ -1254,7 +1254,7 @@ ARDOUR_UI::session_add_midi_route (bool disk, uint32_t how_many)
try {
if (disk) {
tracks = session->new_midi_track (ARDOUR::Normal, how_many);
tracks = session->new_midi_track (ARDOUR::Normal, edit_group, how_many);
if (tracks.size() != how_many) {
if (how_many == 1) {
@ -1282,7 +1282,7 @@ restart JACK with more ports."));
void
ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many)
ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, RouteGroup* edit_group, uint32_t how_many)
{
list<boost::shared_ptr<AudioTrack> > tracks;
RouteList routes;
@ -1294,7 +1294,7 @@ ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t
try {
if (track) {
tracks = session->new_audio_track (input_channels, output_channels, mode, how_many);
tracks = session->new_audio_track (input_channels, output_channels, mode, edit_group, how_many);
if (tracks.size() != how_many) {
if (how_many == 1) {
@ -1307,7 +1307,7 @@ ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t
} else {
routes = session->new_audio_route (input_channels, output_channels, how_many);
routes = session->new_audio_route (input_channels, output_channels, edit_group, how_many);
if (routes.size() != how_many) {
if (how_many == 1) {
@ -2764,7 +2764,7 @@ ARDOUR_UI::add_route (Gtk::Window* float_window)
}
if (add_route_dialog == 0) {
add_route_dialog = new AddRouteDialog;
add_route_dialog = new AddRouteDialog (*session);
if (float_window) {
add_route_dialog->set_transient_for (*float_window);
}
@ -2802,6 +2802,7 @@ ARDOUR_UI::add_route (Gtk::Window* float_window)
uint32_t output_chan;
string name_template = add_route_dialog->name_template ();
bool track = add_route_dialog->track ();
RouteGroup* edit_group = add_route_dialog->edit_group ();
AutoConnectOption oac = Config->get_output_auto_connect();
@ -2815,7 +2816,7 @@ ARDOUR_UI::add_route (Gtk::Window* float_window)
if (add_route_dialog->type() == ARDOUR::DataType::MIDI) {
if (track) {
session_add_midi_track(count);
session_add_midi_track(edit_group, count);
} else {
MessageDialog msg (*editor,
_("Sorry, MIDI Busses are not supported at this time."));
@ -2824,9 +2825,9 @@ ARDOUR_UI::add_route (Gtk::Window* float_window)
}
} else {
if (track) {
session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count);
session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), edit_group, count);
} else {
session_add_audio_bus (input_chan, output_chan, count);
session_add_audio_bus (input_chan, output_chan, edit_group, count);
}
}
}

View File

@ -198,16 +198,16 @@ class ARDOUR_UI : public Gtkmm2ext::UI
void add_route (Gtk::Window* float_window);
void session_add_audio_track (int input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many) {
session_add_audio_route (true, input_channels, output_channels, mode, how_many);
void session_add_audio_track (int input_channels, int32_t output_channels, ARDOUR::TrackMode mode, ARDOUR::RouteGroup* edit_group, uint32_t how_many) {
session_add_audio_route (true, input_channels, output_channels, mode, edit_group, how_many);
}
void session_add_audio_bus (int input_channels, int32_t output_channels, uint32_t how_many) {
session_add_audio_route (false, input_channels, output_channels, ARDOUR::Normal, how_many);
void session_add_audio_bus (int input_channels, int32_t output_channels, ARDOUR::RouteGroup* edit_group, uint32_t how_many) {
session_add_audio_route (false, input_channels, output_channels, ARDOUR::Normal, edit_group, how_many);
}
void session_add_midi_track (uint32_t how_many) {
session_add_midi_route (true, how_many);
void session_add_midi_track (ARDOUR::RouteGroup* edit_group, uint32_t how_many) {
session_add_midi_route (true, edit_group, how_many);
}
/*void session_add_midi_bus () {
@ -524,8 +524,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI
void edit_metadata ();
void import_metadata ();
void session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many);
void session_add_midi_route (bool disk, uint32_t how_many);
void session_add_audio_route (bool disk, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, ARDOUR::RouteGroup *, uint32_t how_many);
void session_add_midi_route (bool disk, ARDOUR::RouteGroup *, uint32_t how_many);
void set_transport_sensitivity (bool);

View File

@ -215,11 +215,11 @@ ARDOUR_UI::install_actions ()
ActionManager::register_toggle_action (common_actions, X_("ToggleKeyEditor"), _("Keybindings"), mem_fun(*this, &ARDOUR_UI::toggle_key_editor));
ActionManager::register_toggle_action (common_actions, X_("ToggleBundleManager"), _("Bundle Manager"), mem_fun(*this, &ARDOUR_UI::toggle_bundle_manager));
act = ActionManager::register_action (common_actions, X_("AddAudioTrack"), _("Add Audio Track"), bind (mem_fun(*this, &ARDOUR_UI::session_add_audio_track), 1, 1, ARDOUR::Normal, 1));
act = ActionManager::register_action (common_actions, X_("AddAudioTrack"), _("Add Audio Track"), bind (mem_fun(*this, &ARDOUR_UI::session_add_audio_track), 1, 1, ARDOUR::Normal, (ARDOUR::RouteGroup *) 0, 1));
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_action (common_actions, X_("AddAudioBus"), _("Add Audio Bus"), bind (mem_fun(*this, &ARDOUR_UI::session_add_audio_bus), 1, 1, 1));
act = ActionManager::register_action (common_actions, X_("AddAudioBus"), _("Add Audio Bus"), bind (mem_fun(*this, &ARDOUR_UI::session_add_audio_bus), 1, 1, (ARDOUR::RouteGroup *) 0, 1));
ActionManager::session_sensitive_actions.push_back (act);
act = ActionManager::register_action (common_actions, X_("AddMIDITrack"), _("Add MIDI Track"), bind (mem_fun(*this, &ARDOUR_UI::session_add_midi_track), 1));
act = ActionManager::register_action (common_actions, X_("AddMIDITrack"), _("Add MIDI Track"), bind (mem_fun(*this, &ARDOUR_UI::session_add_midi_track), (ARDOUR::RouteGroup *) 0, 1));
ActionManager::session_sensitive_actions.push_back (act);
//act = ActionManager::register_action (common_actions, X_("AddMidiBus"), _("Add Midi Bus"), mem_fun(*this, &ARDOUR_UI::session_add_midi_bus));
//ActionManager::session_sensitive_actions.push_back (act);

View File

@ -835,7 +835,7 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region, uint32_t
{
if (!existing_track) {
if (ar) {
list<boost::shared_ptr<AudioTrack> > at (session->new_audio_track (in_chans, out_chans, Normal, 1));
list<boost::shared_ptr<AudioTrack> > at (session->new_audio_track (in_chans, out_chans, Normal, 0, 1));
if (at.empty()) {
return -1;
@ -843,7 +843,7 @@ Editor::finish_bringing_in_material (boost::shared_ptr<Region> region, uint32_t
existing_track = at.front();
} else if (mr) {
list<boost::shared_ptr<MidiTrack> > mt (session->new_midi_track (Normal, 1));
list<boost::shared_ptr<MidiTrack> > mt (session->new_midi_track (Normal, 0, 1));
if (mt.empty()) {
return -1;

View File

@ -79,7 +79,7 @@ Editor::disable_all_edit_groups ()
void
Editor::new_edit_group ()
{
session->add_edit_group ("");
session->add_edit_group (new RouteGroup (*session, ""));
}
void

View File

@ -1125,7 +1125,7 @@ Mixer_UI::mix_groups_changed ()
void
Mixer_UI::new_mix_group ()
{
session->add_mix_group ("");
session->add_mix_group (new RouteGroup (*session, ""));
}
void

View File

@ -0,0 +1,42 @@
#include <gtkmm/stock.h>
#include "ardour/route_group.h"
#include "route_group_dialog.h"
#include "i18n.h"
using namespace Gtk;
using namespace ARDOUR;
RouteGroupDialog::RouteGroupDialog (RouteGroup* g)
: Dialog (_("Route group")),
_group (g),
_active (_("Active"))
{
_name.set_text (_group->name ());
_active.set_active (_group->is_active ());
HBox* h = manage (new HBox);
h->pack_start (*manage (new Label (_("Name:"))));
h->pack_start (_name);
get_vbox()->pack_start (*h);
get_vbox()->pack_start (_active);
add_button (Stock::CANCEL, RESPONSE_CANCEL);
/* XXX: change this depending on context */
add_button (Stock::OK, RESPONSE_OK);
show_all ();
}
int
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);
}
return r;
}

View File

@ -0,0 +1,22 @@
#ifndef __gtk_ardour_route_group_dialog_h__
#define __gtk_ardour_route_group_dialog_h__
#include <gtkmm/dialog.h>
#include <gtkmm/entry.h>
#include <gtkmm/checkbutton.h>
class RouteGroupDialog : public Gtk::Dialog
{
public:
RouteGroupDialog (ARDOUR::RouteGroup *);
int do_run ();
private:
ARDOUR::RouteGroup* _group;
Gtk::Entry _name;
Gtk::CheckButton _active;
};
#endif

View File

@ -75,6 +75,7 @@
#include "simplerect.h"
#include "streamview.h"
#include "utils.h"
#include "route_group_dialog.h"
#include "ardour/track.h"
@ -320,13 +321,18 @@ RouteTimeAxisView::edit_click (GdkEventButton *ev)
RadioMenuItem::Group group;
items.clear ();
items.push_back (MenuElem (_("New group..."), mem_fun (*this, &RouteTimeAxisView::set_edit_group_to_new)));
items.push_back (SeparatorElem ());
items.push_back (RadioMenuElem (group, _("No group"),
bind (mem_fun(*this, &RouteTimeAxisView::set_edit_group_from_menu), (RouteGroup *) 0)));
if (_route->edit_group() == 0) {
static_cast<RadioMenuItem*>(&items.back())->set_active ();
}
_session.foreach_edit_group (bind (mem_fun (*this, &RouteTimeAxisView::add_edit_group_menu_item), &group));
edit_group_menu.popup (ev->button, ev->time);
@ -2401,3 +2407,19 @@ RouteTimeAxisView::remove_underlay(StreamView* v)
}
}
void
RouteTimeAxisView::set_edit_group_to_new ()
{
RouteGroup* g = new RouteGroup (_session, "", RouteGroup::Active);
g->set_active (true, this);
RouteGroupDialog d (g);
int const r = d.do_run ();
if (r == Gtk::RESPONSE_OK) {
_session.add_edit_group (g);
_route->set_edit_group (g, this);
} else {
delete g;
}
}

View File

@ -224,6 +224,7 @@ protected:
void add_edit_group_menu_item (ARDOUR::RouteGroup *, Gtk::RadioMenuItem::Group*);
void set_edit_group_from_menu (ARDOUR::RouteGroup *);
void set_edit_group_to_new ();
void reset_samples_per_unit ();

View File

@ -189,6 +189,7 @@ def build(bld):
region_view.cc
return_ui.cc
rhythm_ferret.cc
route_group_dialog.cc
route_params_ui.cc
route_processor_selection.cc
route_time_axis.cc

View File

@ -486,8 +486,8 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
StateOfTheState state_of_the_state() const { return _state_of_the_state; }
RouteGroup* add_edit_group (std::string);
RouteGroup* add_mix_group (std::string);
void add_edit_group (RouteGroup *);
void add_mix_group (RouteGroup *);
void remove_edit_group (RouteGroup&);
void remove_mix_group (RouteGroup&);
@ -515,12 +515,14 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable
/* fundamental operations. duh. */
std::list<boost::shared_ptr<AudioTrack> > new_audio_track (
int input_channels, int output_channels, TrackMode mode = Normal, uint32_t how_many = 1);
int input_channels, int output_channels, TrackMode mode = Normal, RouteGroup* edit_group = 0, uint32_t how_many = 1
);
RouteList new_audio_route (int input_channels, int output_channels, uint32_t how_many);
RouteList new_audio_route (int input_channels, int output_channels, RouteGroup* edit_group, uint32_t how_many);
std::list<boost::shared_ptr<MidiTrack> > new_midi_track (
TrackMode mode = Normal, uint32_t how_many = 1);
TrackMode mode = Normal, RouteGroup* edit_group = 0, uint32_t how_many = 1
);
void remove_route (boost::shared_ptr<Route>);
void resort_routes ();

View File

@ -1480,7 +1480,7 @@ Session::resort_routes_using (shared_ptr<RouteList> r)
}
list<boost::shared_ptr<MidiTrack> >
Session::new_midi_track (TrackMode mode, uint32_t how_many)
Session::new_midi_track (TrackMode mode, RouteGroup* edit_group, uint32_t how_many)
{
char track_name[32];
uint32_t track_id = 0;
@ -1589,6 +1589,7 @@ Session::new_midi_track (TrackMode mode, uint32_t how_many)
*/
track->midi_diskstream()->non_realtime_input_change();
track->set_edit_group (edit_group, 0);
track->DiskstreamChanged.connect (mem_fun (this, &Session::resort_routes));
//track->set_remote_control_id (control_id);
@ -1645,7 +1646,7 @@ Session::new_midi_track (TrackMode mode, uint32_t how_many)
}
list<boost::shared_ptr<AudioTrack> >
Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, uint32_t how_many)
Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* edit_group, uint32_t how_many)
{
char track_name[32];
uint32_t track_id = 0;
@ -1757,6 +1758,8 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
channels_used += track->n_inputs ().n_audio();
track->set_edit_group (edit_group, 0);
track->audio_diskstream()->non_realtime_input_change();
track->DiskstreamChanged.connect (mem_fun (this, &Session::resort_routes));
@ -1835,7 +1838,7 @@ Session::set_remote_control_ids ()
RouteList
Session::new_audio_route (int input_channels, int output_channels, uint32_t how_many)
Session::new_audio_route (int input_channels, int output_channels, RouteGroup* edit_group, uint32_t how_many)
{
char bus_name[32];
uint32_t bus_id = 1;
@ -1934,6 +1937,7 @@ Session::new_audio_route (int input_channels, int output_channels, uint32_t how_
channels_used += bus->n_inputs ().n_audio();
bus->set_edit_group (edit_group, 0);
bus->set_remote_control_id (control_id);
++control_id;

View File

@ -2058,17 +2058,17 @@ Session::load_route_groups (const XMLNode& node, bool edit)
{
XMLNodeList nlist = node.children();
XMLNodeConstIterator niter;
RouteGroup* rg;
set_dirty();
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
if ((*niter)->name() == "RouteGroup") {
RouteGroup* rg = new RouteGroup (*this, "");
if (edit) {
rg = add_edit_group ("");
add_edit_group (rg);
rg->set_state (**niter);
} else {
rg = add_mix_group ("");
add_mix_group (rg);
rg->set_state (**niter);
}
}
@ -2133,24 +2133,20 @@ Session::possible_states () const
return possible_states(_path);
}
RouteGroup *
Session::add_edit_group (string name)
void
Session::add_edit_group (RouteGroup* g)
{
RouteGroup* rg = new RouteGroup (*this, name);
edit_groups.push_back (rg);
edit_group_added (rg); /* EMIT SIGNAL */
set_dirty();
return rg;
edit_groups.push_back (g);
edit_group_added (g); /* EMIT SIGNAL */
set_dirty ();
}
RouteGroup *
Session::add_mix_group (string name)
void
Session::add_mix_group (RouteGroup* g)
{
RouteGroup* rg = new RouteGroup (*this, name, RouteGroup::Relative);
mix_groups.push_back (rg);
mix_group_added (rg); /* EMIT SIGNAL */
set_dirty();
return rg;
mix_groups.push_back (g);
mix_group_added (g); /* EMIT SIGNAL */
set_dirty ();
}
void