#include "gui_thread.h"
#include "keyeditor.h"
#include "location_ui.h"
+#include "lua_script_manager.h"
#include "luawindow.h"
#include "main_clock.h"
#include "meterbridge.h"
#include "meter_patterns.h"
+#include "monitor_section.h"
#include "midi_tracer.h"
#include "mixer_ui.h"
#include "public_editor.h"
+#include "processor_box.h"
#include "rc_option_editor.h"
#include "route_params_ui.h"
#include "shuttle_control.h"
#include "time_info_box.h"
#include "timers.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace ARDOUR;
using namespace PBD;
ARDOUR_UI::toggle_editor_and_mixer ()
{
if (editor->tabbed() && mixer->tabbed()) {
+ /* both in the same window */
if (_tabs.get_current_page() == _tabs.page_num (editor->contents())) {
_tabs.set_current_page (_tabs.page_num (mixer->contents()));
} else if (_tabs.get_current_page() == _tabs.page_num (mixer->contents())) {
_tabs.set_current_page (_tabs.page_num (editor->contents()));
} else {
- /* do nothing */
+ /* go to mixer */
+ _tabs.set_current_page (_tabs.page_num (mixer->contents()));
}
return;
}
+
if (editor->tabbed() && !mixer->tabbed()) {
- if (!editor->fully_visible()) {
- if (_tabs.get_current_page() == _tabs.page_num (editor->contents())) {
+ /* editor is tabbed, mixer is not */
+
+ Gtk::Window* mwin = mixer->current_toplevel ();
+
+ if (!mwin) {
+ /* mixer's own window doesn't exist */
+ mixer->make_visible ();
+ } else if (!mwin->is_mapped ()) {
+ /* mixer's own window exists but isn't mapped */
+ mixer->make_visible ();
+ } else {
+ /* mixer window is mapped, editor is visible as tab */
+ Gtk::Widget* f = mwin->get_focus();
+ if (f && f->has_focus()) {
+ /* mixer has focus, switch to editor */
+ editor->make_visible ();
+ } else {
mixer->make_visible ();
}
- } else {
- _main_window.present ();
}
return;
}
- if (mixer->tabbed () && !editor->tabbed()) {
- if (!editor->fully_visible()) {
- if (_tabs.get_current_page() == _tabs.page_num (mixer->contents())) {
+ if (!editor->tabbed() && mixer->tabbed()) {
+ /* mixer is tabbed, editor is not */
+
+ Gtk::Window* ewin = editor->current_toplevel ();
+
+ if (!ewin) {
+ /* mixer's own window doesn't exist */
+ editor->make_visible ();
+ } else if (!ewin->is_mapped ()) {
+ /* editor's own window exists but isn't mapped */
+ editor->make_visible ();
+ } else {
+ /* editor window is mapped, mixer is visible as tab */
+ Gtk::Widget* f = ewin->get_focus();
+ if (f && f->has_focus()) {
+ /* editor has focus, switch to mixer */
+ mixer->make_visible ();
+ } else {
editor->make_visible ();
}
- } else {
- _main_window.present ();
}
return;
}
+}
- if (editor->fully_visible()) {
- mixer->make_visible ();
- } else {
- editor->make_visible ();
+void
+ARDOUR_UI::step_up_through_tabs ()
+{
+ std::vector<Tabbable*> candidates;
+
+ /* this list must match the order of visibility buttons */
+
+ if (!editor->window_visible()) {
+ candidates.push_back (editor);
+ }
+
+ if (!mixer->window_visible()) {
+ candidates.push_back (mixer);
+ }
+
+ if (!rc_option_editor->window_visible()) {
+ candidates.push_back (rc_option_editor);
+ }
+
+ if (candidates.size() < 2) {
+ /* nothing to be done with zero or one visible in tabs */
+ return;
+ }
+
+ std::vector<Tabbable*>::iterator prev = candidates.end();
+ std::vector<Tabbable*>::iterator i;
+ Gtk::Widget* w = _tabs.get_nth_page (_tabs.get_current_page ());
+
+ for (i = candidates.begin(); i != candidates.end(); ++i) {
+ if (w == &(*i)->contents()) {
+ if (prev != candidates.end()) {
+ _tabs.set_current_page (_tabs.page_num ((*prev)->contents()));
+ } else {
+ _tabs.set_current_page (_tabs.page_num (candidates.back()->contents()));
+ }
+ return;
+ }
+ prev = i;
+ }
+}
+
+void
+ARDOUR_UI::step_down_through_tabs ()
+{
+ std::vector<Tabbable*> candidates;
+
+ /* this list must match the order of visibility buttons */
+
+ if (!editor->window_visible()) {
+ candidates.push_back (editor);
+ }
+
+ if (!mixer->window_visible()) {
+ candidates.push_back (mixer);
+ }
+
+ if (!rc_option_editor->window_visible()) {
+ candidates.push_back (rc_option_editor);
+ }
+
+ if (candidates.size() < 2) {
+ /* nothing to be done with zero or one visible in tabs */
+ return;
+ }
+
+ std::vector<Tabbable*>::reverse_iterator next = candidates.rend();
+ std::vector<Tabbable*>::reverse_iterator i;
+ Gtk::Widget* w = _tabs.get_nth_page (_tabs.get_current_page ());
+
+ for (i = candidates.rbegin(); i != candidates.rend(); ++i) {
+ if (w == &(*i)->contents()) {
+ if (next != candidates.rend()) {
+ _tabs.set_current_page (_tabs.page_num ((*next)->contents()));
+ } else {
+ _tabs.set_current_page (_tabs.page_num (candidates.front()->contents()));
+ }
+ break;
+ }
+ next = i;
}
}
void
ARDOUR_UI::tabs_switch (GtkNotebookPage*, guint page)
{
- if (page == (guint) _tabs.page_num (editor->contents())) {
+ if (editor && (page == (guint) _tabs.page_num (editor->contents()))) {
editor_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
+
if (mixer && (mixer->tabbed() || mixer->tabbed_by_default())) {
mixer_visibility_button.set_active_state (Gtkmm2ext::Off);
}
+
if (rc_option_editor && (rc_option_editor->tabbed() || rc_option_editor->tabbed_by_default())) {
prefs_visibility_button.set_active_state (Gtkmm2ext::Off);
}
- } else if (page == (guint) _tabs.page_num (mixer->contents())) {
+ } else if (mixer && (page == (guint) _tabs.page_num (mixer->contents()))) {
+
if (editor && (editor->tabbed() || editor->tabbed_by_default())) {
editor_visibility_button.set_active_state (Gtkmm2ext::Off);
}
+
mixer_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
if (rc_option_editor && (rc_option_editor->tabbed() || rc_option_editor->tabbed_by_default())) {
prefs_visibility_button.set_active_state (Gtkmm2ext::Off);
}
- } else {
+
+ } else if (page == (guint) _tabs.page_num (rc_option_editor->contents())) {
+
if (editor && (editor->tabbed() || editor->tabbed_by_default())) {
editor_visibility_button.set_active_state (Gtkmm2ext::Off);
}
+
if (mixer && (mixer->tabbed() || mixer->tabbed_by_default())) {
mixer_visibility_button.set_active_state (Gtkmm2ext::Off);
}
+
prefs_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
}
vis_button = &mixer_visibility_button;
other_vis_buttons.push_back (&editor_visibility_button);
other_vis_buttons.push_back (&prefs_visibility_button);
- } else {
+ } else if (&t == rc_option_editor) {
vis_button = &prefs_visibility_button;
other_vis_buttons.push_back (&editor_visibility_button);
other_vis_buttons.push_back (&mixer_visibility_button);
assert (editor && luawindow);
bool show = false;
- bool obscuring = false;
if (luawindow->not_visible ()) {
show = true;
{
KeyEditor* kedit = new KeyEditor;
- if (global_bindings) {
- kedit->add_tab (_("Global"), *global_bindings);
- }
-
- if (editor->bindings) {
- kedit->add_tab (_("Editing"), *editor->bindings);
- }
-
- if (mixer->bindings) {
- kedit->add_tab (_("Mixing"), *mixer->bindings);
+ for (std::list<Bindings*>::iterator b = Bindings::bindings.begin(); b != Bindings::bindings.end(); ++b) {
+ kedit->add_tab ((*b)->name(), **b);
}
return kedit;