#include "gui_thread.h"
#include "mixer_group_tabs.h"
#include "timers.h"
+#include "ui_config.h"
#include "i18n.h"
Mixer_UI* Mixer_UI::_instance = 0;
Mixer_UI*
-Mixer_UI::instance ()
+Mixer_UI::instance ()
{
if (!_instance) {
_instance = new Mixer_UI;
- }
+ }
return _instance;
}
, track_menu (0)
, _monitor_section (0)
, _plugin_selector (0)
- , _strip_width (ARDOUR_UI::config()->get_default_narrow_ms() ? Narrow : Wide)
+ , _strip_width (UIConfiguration::instance().get_default_narrow_ms() ? Narrow : Wide)
, ignore_reorder (false)
, _in_group_rebuild_or_clear (false)
, _route_deletion_in_progress (false)
group_display.set_reorderable (true);
group_display.set_headers_visible (true);
group_display.set_rules_hint (true);
+ group_display.set_can_focus(false);
/* name is directly editable */
#else
global_hpacker.pack_start (out_packer, false, false, 12);
#endif
- list_hpane.pack1(list_vpacker, false, false);
+ list_hpane.pack1(list_vpacker, false, true);
list_hpane.pack2(global_hpacker, true, false);
rhs_pane1.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::pane_allocation_handler),
ms->parameter_changed (X_("mixer-element-visibility"));
}
}
-
+
/* force focus into main area */
scroller_base.grab_focus ();
for (RouteList::iterator x = routes.begin(); x != routes.end(); ++x) {
boost::shared_ptr<Route> route = (*x);
-
+
if (route->is_auditioner()) {
continue;
}
-
+
if (route->is_monitor()) {
-
+
if (!_monitor_section) {
_monitor_section = new MonitorSection (_session);
-
+
XMLNode* mnode = ARDOUR_UI::instance()->tearoff_settings (X_("monitor-section"));
if (mnode) {
_monitor_section->tearoff().set_state (*mnode);
}
- }
-
+ }
+
out_packer.pack_end (_monitor_section->tearoff(), false, false);
_monitor_section->set_session (_session);
_monitor_section->tearoff().show_all ();
-
+
route->DropReferences.connect (*this, invalidator(*this), boost::bind (&Mixer_UI::monitor_section_going_away, this), gui_context());
-
+
/* no regular strip shown for control out */
-
+
continue;
}
-
+
strip = new MixerStrip (*this, _session, route);
strips.push_back (strip);
- ARDOUR_UI::config()->get_default_narrow_ms() ? _strip_width = Narrow : _strip_width = Wide;
-
+ UIConfiguration::instance().get_default_narrow_ms() ? _strip_width = Narrow : _strip_width = Wide;
+
if (strip->width_owner() != strip) {
strip->set_width_enum (_strip_width, this);
}
-
+
show_strip (strip);
-
+
TreeModel::Row row = *(track_model->insert(insert_iter));
row[track_columns.text] = route->name();
row[track_columns.visible] = strip->route()->is_master() ? true : strip->marked_for_display();
if (!from_scratch) {
_selection.add (strip);
}
-
+
route->PropertyChanged.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::strip_property_changed, this, _1, strip), gui_context());
-
+
strip->WidthChanged.connect (sigc::mem_fun(*this, &Mixer_UI::strip_width_changed));
strip->signal_button_release_event().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::strip_button_release_event), strip));
}
no_track_list_redisplay = false;
track_display.set_model (track_model);
-
+
sync_order_keys_from_treeview ();
redisplay_track_list ();
}
TreeModel::Children rows = track_model->children();
TreeModel::Children::iterator ri;
list<MixerStrip *>::iterator i;
-
+
if ((i = find (strips.begin(), strips.end(), strip)) != strips.end()) {
strips.erase (i);
}
-
+
for (ri = rows.begin(); ri != rows.end(); ++ri) {
if ((*ri)[track_columns.strip] == strip) {
PBD::Unwinder<bool> uw (_route_deletion_in_progress, true);
}
TreeModel::Children rows = track_model->children();
-
+
if (rows.empty()) {
return;
}
for (ri = rows.begin(); ri != rows.end(); ++ri) {
/* skip two special values */
-
+
if (rid == Route::MasterBusRemoteControlID) {
rid++;
}
-
+
if (rid == Route::MonitorBusRemoteControlID) {
rid++;
}
bool visible = (*ri)[track_columns.visible];
if (!route->is_master() && !route->is_monitor()) {
-
+
uint32_t new_rid = (visible ? rid : invisible_key--);
-
+
if (new_rid != route->remote_control_id()) {
- route->set_remote_control_id_explicit (new_rid);
+ route->set_remote_control_id_explicit (new_rid);
rid_change = true;
}
-
+
if (visible) {
rid++;
}
}
TreeModel::Children rows = track_model->children();
-
+
if (rows.empty()) {
return;
}
uint32_t new_rid = (visible ? rid : invisible_key--);
if (new_rid != route->remote_control_id()) {
- route->set_remote_control_id_explicit (new_rid);
+ route->set_remote_control_id_explicit (new_rid);
rid_change = true;
}
-
+
if (visible) {
rid++;
}
neworder.assign (sorted_routes.size(), 0);
uint32_t n = 0;
-
+
for (OrderKeySortedRoutes::iterator sr = sorted_routes.begin(); sr != sorted_routes.end(); ++sr, ++n) {
neworder[n] = sr->old_display_order;
_following_editor_selection = true;
_selection.block_routes_changed (true);
-
+
TrackSelection& s (PublicEditor::instance().get_selection().tracks);
_selection.clear_routes ();
} else if (Keyboard::modifier_state_equals (ev->state, Keyboard::RangeSelectModifier)) {
if (!_selection.selected(strip)) {
-
+
/* extend selection */
-
+
vector<MixerStrip*> tmp;
bool accumulate = false;
bool found_another = false;
-
+
tmp.push_back (strip);
for (list<MixerStrip*>::iterator i = strips.begin(); i != strips.end(); ++i) {
if ((*i) == strip) {
- /* hit clicked strip, start accumulating till we hit the first
+ /* hit clicked strip, start accumulating till we hit the first
selected strip
*/
if (accumulate) {
{
Unwinder<bool> uw (no_track_list_redisplay, true);
-
+
for (i = rows.begin(); i != rows.end(); ++i) {
MixerStrip *strip = (*i)[track_columns.strip];
(*i)[track_columns.visible] = strip->marked_for_display ();
}
-
+
/* force route order keys catch up with visibility changes
*/
-
+
sync_order_keys_from_treeview ();
}
{
Unwinder<bool> uw (no_track_list_redisplay, true);
-
+
for (i = rows.begin(); i != rows.end(); ++i) {
-
+
TreeModel::Row row = (*i);
MixerStrip* strip = row[track_columns.strip];
-
+
if (strip == 0) {
continue;
}
-
+
if (strip->route()->is_master() || strip->route()->is_monitor()) {
continue;
}
-
+
(*i)[track_columns.visible] = yn;
}
}
{
Unwinder<bool> uw (no_track_list_redisplay, true);
-
+
for (i = rows.begin(); i != rows.end(); ++i) {
TreeModel::Row row = (*i);
MixerStrip* strip = row[track_columns.strip];
-
+
if (strip == 0) {
continue;
}
-
+
if (strip->route()->is_master() || strip->route()->is_monitor()) {
continue;
}
-
+
boost::shared_ptr<AudioTrack> at = strip->audio_track();
boost::shared_ptr<MidiTrack> mt = strip->midi_track();
-
+
switch (tracks) {
case 0:
(*i)[track_columns.visible] = yn;
break;
-
+
case 1:
if (at) { /* track */
(*i)[track_columns.visible] = yn;
}
break;
-
+
case 2:
if (!at && !mt) { /* bus */
(*i)[track_columns.visible] = yn;
{
/* this happens as the second step of a DnD within the treeview as well
as when a row/route is actually deleted.
-
+
if it was a deletion then we have to force a redisplay because
order keys may not have changed.
*/
{
TreeModel::Children rows = track_model->children();
TreeModel::Children::iterator i;
-
+
if (no_track_list_redisplay) {
return;
}
track_model->clear ();
add_strips (copy);
}
-
+
_session->sync_order_keys ();
redisplay_track_list ();
return;
}
- if (!geometry || (prop = geometry->property("mixer-list-hpane-pos")) == 0) {
- pos = 75;
+ if (!geometry) {
+ pos = 0;
snprintf (buf, sizeof(buf), "%d", pos);
} else {
+ prop = geometry->property("mixer-list-hpane-pos");
pos = atoi (prop->value());
}
}
KeyboardKey k (ev->state, ev->keyval);
-
+
if (bindings.activate (k, Bindings::Release)) {
return true;
}
_group_tabs->hide ();
}
} else if (p == "default-narrow_ms") {
- bool const s = ARDOUR_UI::config()->get_default_narrow_ms ();
+ bool const s = UIConfiguration::instance().get_default_narrow_ms ();
for (list<MixerStrip*>::iterator i = strips.begin(); i != strips.end(); ++i) {
(*i)->set_width_enum (s ? Narrow : Wide, this);
}
track_display.get_selection()->set_mode (Gtk::SELECTION_NONE);
track_display.set_reorderable (true);
track_display.set_headers_visible (true);
+ track_display.set_can_focus(false);
track_model->signal_row_deleted().connect (sigc::mem_fun (*this, &Mixer_UI::track_list_delete));
track_model->signal_rows_reordered().connect (sigc::mem_fun (*this, &Mixer_UI::track_list_reorder));
{
if (_session) {
string n;
-
+
if (_session->snap_name() != _session->name()) {
n = _session->snap_name ();
} else {
if (_session->dirty ()) {
n = "*" + n;
}
-
+
WindowTitle title (n);
title += S_("Window|Mixer");
title += Glib::get_application_name ();
set_title (title.get_string());
} else {
-
+
WindowTitle title (S_("Window|Mixer"));
title += Glib::get_application_name ();
set_title (title.get_string());
onoff = !mt->input_active();
}
}
-
+
_session->set_exclusive_input_active (rl, onoff, flip_others);
}