the basics of tabbed

This commit is contained in:
Paul Davis 2015-04-21 15:10:49 -04:00
parent b2dc5a52b7
commit 02c8d6d648
15 changed files with 284 additions and 111 deletions

View File

@ -45,7 +45,6 @@
<menuitem action='toggle-session-options-editor'/>
#ifdef GTKOSX
<menuitem action='toggle-about'/>
<menuitem action='toggle-rc-options-editor'/>
#endif
<separator/>
<menuitem action='lock'/>
@ -276,10 +275,6 @@
<menuitem action='set-tempo-from-edit-range'/>
</menu>
<menuitem action='set-mouse-mode-object-range'/>
#ifndef GTKOSX
<separator/>
<menuitem action='toggle-rc-options-editor'/>
#endif
</menu>
<menu name='RegionMenu' action='RegionMenu'>

View File

@ -261,9 +261,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
, last_key_press_time (0)
, save_as_dialog (0)
, meterbridge (0)
, rc_option_editor (0)
, speaker_config_window (X_("speaker-config"), _("Speaker Configuration"))
, key_editor (X_("key-editor"), _("Key Bindings"))
, rc_option_editor (X_("rc-options-editor"), _("Preferences"))
, add_route_dialog (X_("add-routes"), _("Add Tracks/Busses"))
, about (X_("about"), _("About"))
, location_ui (X_("locations"), _("Locations"))
@ -408,7 +408,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
if (ui_xml) {
key_editor.set_state (*ui_xml);
rc_option_editor.set_state (*ui_xml);
// rc_option_editor.set_state (*ui_xml);
session_option_editor.set_state (*ui_xml);
speaker_config_window.set_state (*ui_xml);
about.set_state (*ui_xml);
@ -424,7 +424,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
}
WM::Manager::instance().register_window (&key_editor);
WM::Manager::instance().register_window (&rc_option_editor);
// WM::Manager::instance().register_window (&rc_option_editor);
WM::Manager::instance().register_window (&session_option_editor);
WM::Manager::instance().register_window (&speaker_config_window);
WM::Manager::instance().register_window (&about);

View File

@ -320,6 +320,15 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void hide_application ();
Gtk::Notebook& tabs();
/* called from a static C function */
Gtk::Notebook* tab_window_root_drop (GtkNotebook* src,
GtkWidget* w,
gint x,
gint y,
gpointer user_data);
protected:
friend class PublicEditor;
@ -340,7 +349,6 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void toggle_session_options_window ();
private:
PublicEditor* editor;
Mixer_UI* mixer;
NSM_Client* nsm;
bool _was_dirty;
@ -619,15 +627,19 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
void setup_order_hint (AddRouteDialog::InsertAt);
int create_mixer ();
PublicEditor *editor;
int create_editor ();
Meterbridge *meterbridge;
int create_meterbridge ();
RCOptionEditor* rc_option_editor;
Gtk::HBox rc_option_editor_placeholder;
/* Dialogs that can be created via new<T> */
WM::Proxy<SpeakerDialog> speaker_config_window;
WM::Proxy<KeyEditor> key_editor;
WM::Proxy<RCOptionEditor> rc_option_editor;
WM::Proxy<AddRouteDialog> add_route_dialog;
WM::Proxy<About> about;
WM::Proxy<LocationUIWindow> location_ui;
@ -797,6 +809,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
DuplicateRouteDialog* duplicate_routes_dialog;
void grab_focus_after_dialog ();
void tabs_switch (GtkNotebookPage*, guint page_number);
};
#endif /* __ardour_gui_h__ */

View File

@ -66,6 +66,22 @@ using namespace Gtk;
using namespace Glib;
using namespace ARDOUR_UI_UTILS;
static GtkNotebook*
tab_window_root_drop (GtkNotebook* src,
GtkWidget* w,
gint x,
gint y,
gpointer user_data)
{
Gtk::Notebook* nb = ARDOUR_UI::instance()->tab_window_root_drop (src, w, x, y, user_data);
if (nb) {
return nb->gobj();
} else {
return 0;
}
}
int
ARDOUR_UI::setup_windows ()
{
@ -112,6 +128,15 @@ ARDOUR_UI::setup_windows ()
editor->add_toplevel_menu (top_packer);
editor->add_transport_frame (transport_frame);
editor->tabs().append_page (rc_option_editor_placeholder, _("Preferences"));
editor->tabs().signal_switch_page().connect (sigc::mem_fun (*this, &ARDOUR_UI::tabs_switch));
/* It would be nice if Gtkmm had wrapped this rather than just
* deprecating the old set_window_creation_hook() method, but oh well...
*/
g_signal_connect (editor->tabs().gobj(), "create-window",
(GCallback) ::tab_window_root_drop, this);
setup_transport();
@ -122,6 +147,18 @@ ARDOUR_UI::setup_windows ()
return 0;
}
void
ARDOUR_UI::tabs_switch (GtkNotebookPage*, guint page_number)
{
if (page_number == 2) {
if (!rc_option_editor) {
rc_option_editor = new RCOptionEditor;
rc_option_editor_placeholder.pack_start (*rc_option_editor, true, true);
rc_option_editor_placeholder.show_all ();
}
}
}
void
ARDOUR_UI::setup_tooltips ()
{
@ -696,11 +733,7 @@ ARDOUR_UI::restore_editing_space ()
void
ARDOUR_UI::show_ui_prefs ()
{
RefPtr<Action> act = ActionManager::get_action (X_("Window"), X_("toggle-rc-options-editor"));
assert (act);
act->activate();
tabs().set_current_page (2);
rc_option_editor->set_current_page (_("GUI"));
}
@ -713,11 +746,7 @@ ARDOUR_UI::click_button_clicked (GdkEventButton* ev)
return false;
}
RefPtr<Action> act = ActionManager::get_action (X_("Window"), X_("toggle-rc-options-editor"));
assert (act);
act->activate();
tabs().set_current_page (2);
rc_option_editor->set_current_page (_("Misc"));
return true;
}

View File

@ -61,6 +61,9 @@ ARDOUR_UI::we_have_dependents ()
editor->setup_tooltips ();
editor->UpdateAllTransportClocks.connect (sigc::mem_fun (*this, &ARDOUR_UI::update_transport_clocks));
std::cerr << "Mixer page = " << editor->tabs().append_page (*mixer, _("Mixer")) << std::endl;
editor->tabs().set_tab_detachable (*mixer);
/* all actions are defined */
ActionManager::enable_accelerators ();
@ -101,3 +104,28 @@ ARDOUR_UI::exit_on_main_window_close (GdkEventAny * /*ev*/)
#endif
}
Gtk::Notebook*
ARDOUR_UI::tab_window_root_drop (GtkNotebook* src,
GtkWidget* w,
gint x,
gint y,
gpointer)
{
using namespace std;
if (w == GTK_WIDGET(mixer->gobj())) {
/* Mixer */
cerr << "Call use own window\n";
Gtk::Notebook* nb = mixer->use_own_window ();
Gtk::Window* win = (Gtk::Window*) nb->get_toplevel ();
win->move (x, y);
win->present ();
return nb;
}
return 0;
}

View File

@ -366,11 +366,13 @@ ARDOUR_UI::goto_mixer_window ()
}
mixer->show_window ();
mixer->present ();
// mixer->present ();
/* mixer should now be on top */
if (UIConfiguration::instance().get_transients_follow_front()) {
WM::Manager::instance().set_transient_for (mixer);
}
//if (UIConfiguration::instance().get_transients_follow_front()) {
// WM::Manager::instance().set_transient_for (mixer);
//}
_mixer_on_top = true;
}
@ -401,7 +403,7 @@ ARDOUR_UI::toggle_mixer_window ()
if (show) {
goto_mixer_window ();
} else {
mixer->hide ();
mixer->hide_window ((GdkEventAny*)0);
}
}
@ -549,7 +551,7 @@ ARDOUR_UI::main_window_state_event_handler (GdkEventWindowState* ev, bool window
if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
(ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
if (big_clock_window) {
big_clock_window->set_transient_for (*mixer);
// big_clock_window->set_transient_for (*mixer);
}
}
}

View File

@ -726,3 +726,9 @@ ARDOUR_UI::xrun_button_release (GdkEventButton* ev)
}
return true;
}
Gtk::Notebook&
ARDOUR_UI::tabs()
{
return editor->tabs();
}

View File

@ -668,8 +668,11 @@ Editor::Editor ()
status_bar_hpacker.show ();
_tabs.append_page (global_hpacker, _("Editor"));
_tabs.show ();
vpacker.pack_end (status_bar_hpacker, false, false);
vpacker.pack_end (global_hpacker, true, true);
vpacker.pack_end (_tabs, true, true);
/* register actions now so that set_state() can find them and set toggles/checks etc */
@ -852,13 +855,9 @@ Editor::add_toplevel_menu (Container& cont)
void
Editor::add_transport_frame (Container& cont)
{
if(ARDOUR::Profile->get_mixbus()) {
global_vpacker.pack_start (cont, false, false);
global_vpacker.reorder_child (cont, 0);
cont.show_all ();
} else {
vpacker.pack_start (cont, false, false);
}
global_vpacker.pack_start (cont, false, false);
global_vpacker.reorder_child (cont, 0);
cont.show_all ();
}
bool

View File

@ -28,6 +28,7 @@
#include <gtkmm/accelmap.h>
#include "pbd/convert.h"
#include "pbd/stacktrace.h"
#include "pbd/unwind.h"
#include <glibmm/threads.h>
@ -36,6 +37,7 @@
#include <gtkmm2ext/utils.h>
#include <gtkmm2ext/tearoff.h>
#include <gtkmm2ext/window_title.h>
#include <gtkmm2ext/doi.h>
#include "ardour/amp.h"
#include "ardour/debug.h"
@ -87,8 +89,7 @@ Mixer_UI::instance ()
}
Mixer_UI::Mixer_UI ()
: Window (Gtk::WINDOW_TOPLEVEL)
, VisibilityTracker (*((Gtk::Window*) this))
: _parent_window (0)
, _visible (false)
, no_track_list_redisplay (false)
, in_group_row_change (false)
@ -103,13 +104,10 @@ Mixer_UI::Mixer_UI ()
, _maximised (false)
, _show_mixer_list (true)
{
/* allow this window to become the key focus window */
set_flags (CAN_FOCUS);
Route::SyncOrderKeys.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::sync_treeview_from_order_keys, this), gui_context());
scroller.set_can_default (true);
set_default (scroller);
// set_default (scroller);
scroller_base.set_flags (Gtk::CAN_FOCUS);
scroller_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
@ -239,26 +237,21 @@ Mixer_UI::Mixer_UI ()
list_hpane.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::pane_allocation_handler),
static_cast<Gtk::Paned*> (&list_hpane)));
global_vpacker.pack_start (list_hpane, true, true);
pack_start (list_hpane, true, true);
add (global_vpacker);
set_name ("MixerWindow");
update_title ();
set_wmclass (X_("ardour_mixer"), PROGRAM_NAME);
signal_delete_event().connect (sigc::mem_fun (*this, &Mixer_UI::hide_window));
add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK);
signal_configure_event().connect (sigc::mem_fun (*ARDOUR_UI::instance(), &ARDOUR_UI::configure_handler));
route_group_display_button_box->show();
route_group_add_button->show();
route_group_remove_button->show();
show ();
global_hpacker.show();
global_vpacker.show();
scroller.show();
scroller_base.show();
scroller_hpacker.show();
@ -310,14 +303,63 @@ Mixer_UI::track_editor_selection ()
void
Mixer_UI::ensure_float (Window& win)
{
win.set_transient_for (*this);
if (_parent_window) {
win.set_transient_for (*_parent_window);
}
}
Gtk::Notebook*
Mixer_UI::use_own_window ()
{
/* This is called after a drop of a tab onto the root window. Its
* responsibility is to return the notebook that this Mixer_UI should
* be packed into before the drop handling is completed. It is not
* responsible for actually taking care of this packing
*/
if (_parent_window) {
return 0;
}
create_own_window ();
return (Gtk::Notebook*) _parent_window->get_child();
}
void
Mixer_UI::create_own_window ()
{
if (_parent_window) {
return;
}
_parent_window = new Window (Gtk::WINDOW_TOPLEVEL);
Notebook* notebook = manage (new Notebook);
notebook->set_show_tabs (false);
notebook->show_all ();
_parent_window->add (*notebook);
/* allow parent window to become the key focus window */
_parent_window->set_flags (CAN_FOCUS);
/* handle window manager close/delete event sensibly */
_parent_window->signal_delete_event().connect (sigc::mem_fun (*this, &Mixer_UI::hide_window));
set_window_pos_and_size ();
update_title ();
}
void
Mixer_UI::show_window ()
{
present ();
if (!_visible) {
if (_parent_window) {
_parent_window->present ();
}
if (!_visible) { /* was hidden, update status */
set_window_pos_and_size ();
/* show/hide group tabs as required */
@ -337,19 +379,43 @@ Mixer_UI::show_window ()
}
}
if (!_parent_window) {
/* not in its own window, just switch main tabs to show mixer */
int pagenum = ARDOUR_UI::instance()->tabs().page_num (*this);
ARDOUR_UI::instance()->tabs().set_current_page (pagenum);
}
/* force focus into main area */
scroller_base.grab_focus ();
_visible = true;
}
bool
Mixer_UI::hide_window (GdkEventAny *ev)
{
get_window_pos_and_size ();
if (_parent_window) {
/* unpack Mixer_UI from parent, put it back in the main tabbed
* notebook
*/
get_window_pos_and_size ();
get_parent()->remove (*this);
ARDOUR_UI::instance()->tabs().insert_page (*this, _("Mixer"), 1);
ARDOUR_UI::instance()->tabs().set_tab_detachable (*this);
ARDOUR_UI::instance()->tabs().set_current_page (0);
show_all ();
delete_when_idle (_parent_window);
_parent_window = 0;
}
ARDOUR_UI::instance()->tabs().set_current_page (0);
_visible = false;
return just_hide_it(ev, static_cast<Gtk::Window *>(this));
return true;
}
@ -1479,15 +1545,15 @@ Mixer_UI::show_mixer_list (bool yn)
{
if (yn) {
list_vpacker.show ();
//if user wants to show the pane, we should make sure that it is wide enough to be visible
//if user wants to show the pane, we should make sure that it is wide enough to be visible
int width = list_hpane.get_position();
if (width < 40)
list_hpane.set_position(40);
} else {
list_vpacker.hide ();
}
_show_mixer_list = yn;
}
@ -1616,7 +1682,7 @@ Mixer_UI::strip_scroller_button_release (GdkEventButton* ev)
using namespace Menu_Helpers;
if (Keyboard::is_context_menu_event (ev)) {
ARDOUR_UI::instance()->add_route (this);
// ARDOUR_UI::instance()->add_route (this);
return true;
}
@ -1636,15 +1702,19 @@ Mixer_UI::set_strip_width (Width w, bool save)
void
Mixer_UI::set_window_pos_and_size ()
{
resize (m_width, m_height);
move (m_root_x, m_root_y);
if (_parent_window) {
_parent_window->resize (m_width, m_height);
_parent_window->move (m_root_x, m_root_y);
}
}
void
Mixer_UI::get_window_pos_and_size ()
{
get_position(m_root_x, m_root_y);
get_size(m_width, m_height);
if (_parent_window) {
_parent_window->get_position(m_root_x, m_root_y);
_parent_window->get_size(m_width, m_height);
}
}
struct PluginStateSorter {
@ -1682,6 +1752,16 @@ Mixer_UI::set_state (const XMLNode& node)
if ((geometry = find_named_node (node, "geometry")) != 0) {
/* if there's a geometry node, we have our own window */
create_own_window ();
Gtk::Notebook* notebook = (Gtk::Notebook*) _parent_window->get_child();
Gtk::Widget* parent = get_parent();
if (parent) {
((Gtk::Container*)parent)->remove (*this);
}
notebook->append_page (*this, _("Mixer"));
XMLProperty* prop;
if ((prop = geometry->property("x_size")) == 0) {
@ -1735,8 +1815,7 @@ Mixer_UI::set_state (const XMLNode& node)
Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
bool fs = tact && tact->get_active();
if (yn ^ fs) {
ActionManager::do_action ("Common",
"ToggleMaximalMixer");
ActionManager::do_action ("Common", "ToggleMaximalMixer");
}
}
@ -1771,7 +1850,6 @@ Mixer_UI::set_state (const XMLNode& node)
favorite_order.sort (cmp);
sync_treeview_from_favorite_order ();
}
return 0;
}
@ -1780,8 +1858,8 @@ Mixer_UI::get_state (void)
{
XMLNode* node = new XMLNode ("Mixer");
if (is_realized()) {
Glib::RefPtr<Gdk::Window> win = get_window();
if (_parent_window && _parent_window->is_realized() ) {
Glib::RefPtr<Gdk::Window> win = _parent_window->get_window();
get_window_pos_and_size ();
@ -1928,30 +2006,25 @@ Mixer_UI::scroll_right ()
bool
Mixer_UI::on_key_press_event (GdkEventKey* ev)
{
/* focus widget gets first shot, then bindings, otherwise
forward to main window
*/
if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
return true;
}
KeyboardKey k (ev->state, ev->keyval);
if (bindings.activate (k, Bindings::Press)) {
return true;
}
return forward_key_press (ev);
if (_parent_window) {
/* send it to the main window, since our own bindings didn't
* handle it
*/
return forward_key_press (ev);
}
return false;
}
bool
Mixer_UI::on_key_release_event (GdkEventKey* ev)
{
if (gtk_window_propagate_key_event (GTK_WINDOW(gobj()), ev)) {
return true;
}
KeyboardKey k (ev->state, ev->keyval);
if (bindings.activate (k, Bindings::Release)) {
@ -2091,7 +2164,7 @@ Mixer_UI::setup_track_display ()
void
Mixer_UI::new_track_or_bus ()
{
ARDOUR_UI::instance()->add_route (this);
// ARDOUR_UI::instance()->add_route (this);
}
@ -2111,16 +2184,20 @@ Mixer_UI::update_title ()
n = "*" + n;
}
WindowTitle title (n);
title += S_("Window|Mixer");
title += Glib::get_application_name ();
set_title (title.get_string());
if (own_window()) {
WindowTitle title (n);
title += S_("Window|Mixer");
title += Glib::get_application_name ();
own_window()->set_title (title.get_string());
}
} else {
WindowTitle title (S_("Window|Mixer"));
title += Glib::get_application_name ();
set_title (title.get_string());
if (own_window()) {
WindowTitle title (S_("Window|Mixer"));
title += Glib::get_application_name ();
own_window()->set_title (title.get_string());
}
}
}
@ -2194,9 +2271,12 @@ Mixer_UI::maximise_mixer_space ()
return;
}
fullscreen ();
Gtk::Window* win = (Gtk::Window*) get_toplevel();
_maximised = true;
if (win) {
win->fullscreen ();
_maximised = true;
}
}
void
@ -2206,9 +2286,12 @@ Mixer_UI::restore_mixer_space ()
return;
}
unfullscreen();
Gtk::Window* win = (Gtk::Window*) get_toplevel();
_maximised = false;
if (win) {
win->unfullscreen();
_maximised = false;
}
}
void

View File

@ -42,10 +42,13 @@
#include "ardour/plugin.h"
#include "ardour/plugin_manager.h"
<<<<<<< HEAD
#include "gtkmm2ext/visibility_tracker.h"
#include "gtkmm2ext/dndtreeview.h"
#include "gtkmm2ext/treeutils.h"
=======
>>>>>>> the basics of tabbed
#include "enums.h"
#include "mixer_actor.h"
@ -59,6 +62,7 @@ class PluginSelector;
class MixerGroupTabs;
class MonitorSection;
<<<<<<< HEAD
class PluginTreeStore : public Gtk::TreeStore
{
public:
@ -73,11 +77,19 @@ protected:
};
class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr, public MixerActor, public Gtkmm2ext::VisibilityTracker
=======
class Mixer_UI : public Gtk::VBox, public PBD::ScopedConnectionList, public ARDOUR::SessionHandlePtr, public MixerActor
>>>>>>> the basics of tabbed
{
public:
static Mixer_UI* instance();
~Mixer_UI();
Gtk::Window* own_window() const { return _parent_window; }
Gtk::Notebook* use_own_window();
bool visible() const { return _visible; }
void set_session (ARDOUR::Session *);
void track_editor_selection ();
@ -119,6 +131,7 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
Mixer_UI ();
static Mixer_UI* _instance;
Gtk::Window* _parent_window;
bool _visible;
Gtk::HBox global_hpacker;
@ -347,6 +360,7 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
void monitor_section_going_away ();
<<<<<<< HEAD
void monitor_section_attached ();
void monitor_section_detached ();
@ -357,6 +371,10 @@ class Mixer_UI : public Gtk::Window, public PBD::ScopedConnectionList, public AR
void sync_treeview_favorite_ui_state (const Gtk::TreeModel::Path&, const Gtk::TreeModel::iterator&);
void save_favorite_ui_state (const Gtk::TreeModel::iterator& iter, const Gtk::TreeModel::Path& path);
=======
void create_own_window ();
>>>>>>> the basics of tabbed
/// true if we are in fullscreen mode
bool _maximised;

View File

@ -171,7 +171,8 @@ This mode provides many different operations on both regions and control points,
@wvis|Window/toggle-session-options-editor|<@SECONDARY@>o|toggle preferences dialog
@trans|Editor/set-playhead|p|set playhead position
@select|Editor/select-all-before-playhead|<@PRIMARY@>p|all before playhead
@wvis|Window/toggle-rc-options-editor|<@SECONDARY@>p|toggle preferences dialog
@wvis|Window/toggle-audio-connection-manager|<@WINDOW@>p|toggle global audio patchbay
@wvis|Window/toggle-midi-connection-manager|<@WINDOW@><@TERTIARY@>p|toggle global midi patchbay
@midi|MIDI/panic|<@PRIMARY@><@SECONDARY@>p|MIDI panic (stop all notes etc)
@select|Editor/select-all-after-playhead|<@PRIMARY@><@TERTIARY@>p|all after playhead

View File

@ -470,25 +470,19 @@ OptionEditorPage::OptionEditorPage (Gtk::Notebook& n, std::string const & t)
* @param t Title for the dialog.
*/
OptionEditor::OptionEditor (PBD::Configuration* c, std::string const & t)
: ArdourWindow (t), _config (c)
: _config (c)
{
using namespace Notebook_Helpers;
set_default_size (300, 300);
// set_wmclass (X_("ardour_preferences"), PROGRAM_NAME);
set_name ("Preferences");
add_events (Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK);
set_border_width (4);
add (_notebook);
pack_start (_notebook, true, true);
_notebook.set_show_tabs (true);
_notebook.set_show_border (true);
_notebook.set_name ("OptionsNotebook");
show_all_children();
show_all ();
/* Watch out for changes to parameters */
_config->ParameterChanged.connect (config_connection, invalidator (*this), boost::bind (&OptionEditor::parameter_changed, this, _1), gui_context());

View File

@ -680,7 +680,7 @@ public:
};
/** The OptionEditor dialog base class */
class OptionEditor : public ArdourWindow
class OptionEditor : public Gtk::VBox, public ARDOUR::SessionHandlePtr
{
public:
OptionEditor (PBD::Configuration *, std::string const &);

View File

@ -32,6 +32,7 @@
#include <gtkmm/box.h>
#include <gtkmm/window.h>
#include <gtkmm/actiongroup.h>
#include <gtkmm/notebook.h>
#include <sigc++/signal.h>
#include "evoral/Note.hpp"
@ -441,7 +442,11 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
PBD::Signal0<void> SnapChanged;
PBD::Signal0<void> MouseModeChanged;
Gtk::Notebook& tabs() { return _tabs; }
protected:
Gtk::Notebook _tabs;
friend class DisplaySuspender;
virtual void suspend_route_redisplay () = 0;
virtual void resume_route_redisplay () = 0;

View File

@ -76,7 +76,7 @@ using namespace ARDOUR_UI_UTILS;
class ClickOptions : public OptionEditorBox
{
public:
ClickOptions (RCConfiguration* c, Gtk::Window* p)
ClickOptions (RCConfiguration* c)
: _rc_config (c)
, _click_browse_button (_("Browse..."))
, _click_emphasis_browse_button (_("Browse..."))
@ -1343,9 +1343,8 @@ private:
class ControlSurfacesOptions : public OptionEditorBox
{
public:
ControlSurfacesOptions (Gtk::Window& parent)
: _parent (parent)
, _ignore_view_change (0)
ControlSurfacesOptions ()
: _ignore_view_change (0)
{
_store = ListStore::create (_model);
_view.set_model (_store);
@ -1496,7 +1495,8 @@ private:
* or re-initializing a surface.
* tear_down_gui() hides an deletes the Window if it exists.
*/
ArdourWindow* win = new ArdourWindow (_parent, title.get_string());
ArdourWindow* win = new ArdourWindow (*((Gtk::Window*) _view.get_toplevel()), title.get_string());
win->set_title ("Control Protocol Options");
win->add (*box);
box->show ();
win->present ();
@ -1532,7 +1532,6 @@ private:
Glib::RefPtr<ListStore> _store;
ControlSurfacesModelColumns _model;
TreeView _view;
Gtk::Window& _parent;
PBD::ScopedConnection protocol_status_connection;
uint32_t _ignore_view_change;
Gtk::Button* edit_button;
@ -1800,7 +1799,7 @@ RCOptionEditor::RCOptionEditor ()
add_option (_("Misc"), new OptionEditorHeading (_("Click")));
add_option (_("Misc"), new ClickOptions (_rc_config, this));
add_option (_("Misc"), new ClickOptions (_rc_config));
add_option (_("Misc"),
new FaderOption (
@ -2710,7 +2709,7 @@ if (!Profile->get_mixbus()) {
/* Control Surfaces */
add_option (_("Control Surfaces"), new ControlSurfacesOptions (*this));
add_option (_("Control Surfaces"), new ControlSurfacesOptions);
ComboOption<RemoteModel>* rm = new ComboOption<RemoteModel> (
"remote-model",