#include "ardour/midi_track.h"
#include "ardour/plugin_manager.h"
#include "ardour/route_group.h"
+#include "ardour/route_sorters.h"
#include "ardour/session.h"
#include "keyboard.h"
#include "actions.h"
#include "gui_thread.h"
#include "mixer_group_tabs.h"
+#include "timers.h"
#include "i18n.h"
using namespace ARDOUR;
+using namespace ARDOUR_UI_UTILS;
using namespace PBD;
using namespace Gtk;
using namespace Glib;
, in_group_row_change (false)
, track_menu (0)
, _monitor_section (0)
- , _strip_width (Config->get_default_narrow_ms() ? Narrow : Wide)
+ , _strip_width (ARDOUR_UI::config()->get_default_narrow_ms() ? Narrow : Wide)
, ignore_reorder (false)
- , _following_editor_selection (false)
, _in_group_rebuild_or_clear (false)
, _route_deletion_in_progress (false)
+ , _following_editor_selection (false)
, _maximised (false)
{
/* allow this window to become the key focus window */
b->show_all ();
scroller.add (*b);
- scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
+ scroller.set_policy (Gtk::POLICY_ALWAYS, Gtk::POLICY_AUTOMATIC);
setup_track_display ();
#else
global_hpacker.pack_start (out_packer, false, false, 12);
#endif
- list_hpane.pack1(list_vpacker, true, true);
+ list_hpane.pack1(list_vpacker, false, false);
list_hpane.pack2(global_hpacker, true, false);
rhs_pane1.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::pane_allocation_handler),
MixerStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::remove_strip, this, _1), gui_context());
- MonitorSection::setup_knob_images ();
-
#ifndef DEFER_PLUGIN_SELECTOR_LOAD
_plugin_selector = new PluginSelector (PluginManager::instance ());
#endif
ms = (*ri)[track_columns.strip];
ms->set_width_enum (ms->get_width_enum (), ms->width_owner());
/* Fix visibility of mixer strip stuff */
- ms->parameter_changed (X_("mixer-strip-visibility"));
+ ms->parameter_changed (X_("mixer-element-visibility"));
}
}
strip = new MixerStrip (*this, _session, route);
strips.push_back (strip);
- Config->get_default_narrow_ms() ? _strip_width = Narrow : _strip_width = Wide;
+ ARDOUR_UI::config()->get_default_narrow_ms() ? _strip_width = Narrow : _strip_width = Wide;
if (strip->width_owner() != strip) {
strip->set_width_enum (_strip_width, this);
redisplay_track_list ();
}
+void
+Mixer_UI::deselect_all_strip_processors ()
+{
+ for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
+ (*i)->deselect_all_processors();
+ }
+}
+
+void
+Mixer_UI::select_none ()
+{
+ _selection.clear_routes();
+ deselect_all_strip_processors();
+}
+
+void
+Mixer_UI::delete_processors ()
+{
+ for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
+ (*i)->delete_processors();
+ }
+}
+
+
void
Mixer_UI::remove_strip (MixerStrip* strip)
{
uint32_t invisible_key = UINT32_MAX;
for (ri = rows.begin(); ri != rows.end(); ++ri) {
+
+ /* skip two special values */
+
+ if (rid == Route::MasterBusRemoteControlID) {
+ rid++;
+ }
+
+ if (rid == Route::MonitorBusRemoteControlID) {
+ rid++;
+ }
+
boost::shared_ptr<Route> route = (*ri)[track_columns.route];
bool visible = (*ri)[track_columns.visible];
void
Mixer_UI::follow_editor_selection ()
{
- if (!Config->get_link_editor_and_mixer_selection() || _following_editor_selection) {
+ if (!ARDOUR_UI::config()->get_link_editor_and_mixer_selection() || _following_editor_selection) {
return;
}
vector<MixerStrip*> tmp;
bool accumulate = false;
+ bool found_another = false;
tmp.push_back (strip);
/* hit selected strip. if currently accumulating others,
we're done. if not accumulating others, start doing so.
*/
+ found_another = true;
if (accumulate) {
/* done */
break;
}
}
- for (vector<MixerStrip*>::iterator i = tmp.begin(); i != tmp.end(); ++i) {
- _selection.add (*i);
- }
+ if (found_another) {
+ for (vector<MixerStrip*>::iterator i = tmp.begin(); i != tmp.end(); ++i) {
+ _selection.add (*i);
+ }
+ } else
+ _selection.set (strip); //user wants to start a range selection, but there aren't any others selected yet
}
} else {
gint
Mixer_UI::start_updating ()
{
- fast_screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (sigc::mem_fun(*this, &Mixer_UI::fast_update_strips));
+ fast_screen_update_connection = Timers::super_rapid_connect (sigc::mem_fun(*this, &Mixer_UI::fast_update_strips));
return 0;
}
}
-struct SignalOrderRouteSorter {
- bool operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b) {
- if (a->is_master() || a->is_monitor()) {
- /* "a" is a special route (master, monitor, etc), and comes
- * last in the mixer ordering
- */
- return false;
- } else if (b->is_master() || b->is_monitor()) {
- /* everything comes before b */
- return true;
- }
- return a->order_key () < b->order_key ();
-
- }
-};
-
void
Mixer_UI::initial_track_display ()
{
boost::shared_ptr<RouteList> routes = _session->get_routes();
RouteList copy (*routes);
- SignalOrderRouteSorter sorter;
+ ARDOUR::SignalOrderRouteSorter sorter;
copy.sort (sorter);
group_model->clear ();
+#if 0
+ /* this is currently not used,
+ * Mixer_UI::group_display_button_press() has a case for it,
+ * and a commented edit_route_group() but that's n/a since 2011.
+ *
+ * This code is left as reminder that
+ * row[group_columns.group] = 0 has special meaning.
+ */
{
TreeModel::Row row;
row = *(group_model->append());
row[group_columns.text] = (_("-all-"));
row[group_columns.group] = 0;
}
+#endif
_session->foreach_route_group (sigc::mem_fun (*this, &Mixer_UI::add_route_group));
_group_tabs->hide ();
}
} else if (p == "default-narrow_ms") {
- bool const s = Config->get_default_narrow_ms ();
+ bool const s = ARDOUR_UI::config()->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_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
track_display.get_column (0)->set_expand(true);
track_display.get_column (1)->set_expand(false);
+ track_display.get_column (0)->set_sizing (Gtk::TREE_VIEW_COLUMN_FIXED);
track_display.set_name (X_("EditGroupList"));
track_display.get_selection()->set_mode (Gtk::SELECTION_NONE);
track_display.set_reorderable (true);
return;
}
- /* nothing selected ... try to get mixer strip at mouse */
+// removed "implicit" selections of strips, after discussion on IRC
- int x, y;
- get_pointer (x, y);
-
- MixerStrip* ms = strip_by_x (x);
-
- if (ms) {
- _route_targets.insert (ms);
- }
}
void