mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-06 14:54:56 +01:00
initial sort-of-mostly-working integration of new Pane
This commit is contained in:
parent
3c4503a849
commit
91a95b086a
10 changed files with 84 additions and 321 deletions
|
|
@ -234,30 +234,6 @@ static const gchar *_rb_opt_strings[] = {
|
||||||
|
|
||||||
#define COMBO_TRIANGLE_WIDTH 25 // ArdourButton _diameter (11) + 2 * arrow-padding (2*2) + 2 * text-padding (2*5)
|
#define COMBO_TRIANGLE_WIDTH 25 // ArdourButton _diameter (11) + 2 * arrow-padding (2*2) + 2 * text-padding (2*5)
|
||||||
|
|
||||||
static void
|
|
||||||
pane_size_watcher (Paned* pane)
|
|
||||||
{
|
|
||||||
/* if the handle of a pane vanishes into (at least) the tabs of a notebook,
|
|
||||||
it is:
|
|
||||||
|
|
||||||
X: hard to access
|
|
||||||
Quartz: impossible to access
|
|
||||||
|
|
||||||
so stop that by preventing it from ever getting too narrow. 35
|
|
||||||
pixels is basically a rough guess at the tab width.
|
|
||||||
|
|
||||||
ugh.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int max_width_of_lhs = GTK_WIDGET(pane->gobj())->allocation.width - 35;
|
|
||||||
|
|
||||||
gint pos = pane->get_position ();
|
|
||||||
|
|
||||||
if (pos > max_width_of_lhs) {
|
|
||||||
pane->set_position (max_width_of_lhs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Editor::Editor ()
|
Editor::Editor ()
|
||||||
: PublicEditor (global_hpacker)
|
: PublicEditor (global_hpacker)
|
||||||
, editor_mixer_strip_width (Wide)
|
, editor_mixer_strip_width (Wide)
|
||||||
|
|
@ -685,7 +661,17 @@ Editor::Editor ()
|
||||||
|
|
||||||
_notebook_shrunk = false;
|
_notebook_shrunk = false;
|
||||||
|
|
||||||
editor_summary_pane.pack1(edit_packer);
|
|
||||||
|
/* Pick up some settings we need to cache, early */
|
||||||
|
|
||||||
|
XMLNode* settings = ARDOUR_UI::instance()->editor_settings();
|
||||||
|
XMLProperty* prop;
|
||||||
|
|
||||||
|
if (settings && (prop = settings->property ("notebook-shrunk"))) {
|
||||||
|
_notebook_shrunk = string_is_affirmative (prop->value ());
|
||||||
|
}
|
||||||
|
|
||||||
|
editor_summary_pane.add (edit_packer);
|
||||||
|
|
||||||
Button* summary_arrows_left_left = manage (new Button);
|
Button* summary_arrows_left_left = manage (new Button);
|
||||||
summary_arrows_left_left->add (*manage (new Arrow (ARROW_LEFT, SHADOW_NONE)));
|
summary_arrows_left_left->add (*manage (new Arrow (ARROW_LEFT, SHADOW_NONE)));
|
||||||
|
|
@ -726,22 +712,29 @@ Editor::Editor ()
|
||||||
_summary_hbox.pack_start (*summary_arrows_right, false, false);
|
_summary_hbox.pack_start (*summary_arrows_right, false, false);
|
||||||
|
|
||||||
if (!ARDOUR::Profile->get_trx()) {
|
if (!ARDOUR::Profile->get_trx()) {
|
||||||
editor_summary_pane.pack2 (_summary_hbox);
|
editor_summary_pane.add (_summary_hbox);
|
||||||
}
|
}
|
||||||
|
|
||||||
edit_pane.pack1 (editor_summary_pane, true, true);
|
edit_pane.add (editor_summary_pane);
|
||||||
if (!ARDOUR::Profile->get_trx()) {
|
if (!ARDOUR::Profile->get_trx()) {
|
||||||
edit_pane.pack2 (_the_notebook, false, true);
|
edit_pane.add (_the_notebook);
|
||||||
}
|
}
|
||||||
|
|
||||||
editor_summary_pane.signal_size_allocate().connect (sigc::bind (sigc::mem_fun (*this, &Editor::pane_allocation_handler), static_cast<Paned*> (&editor_summary_pane)));
|
|
||||||
|
|
||||||
/* XXX: editor_summary_pane might need similar to the edit_pane */
|
if (!settings || (prop = settings->property ("edit-horizontal-pane-pos")) == 0) {
|
||||||
|
/* initial allocation is 90% to canvas, 10% to notebook */
|
||||||
|
edit_pane.set_divider (0, 0.90);
|
||||||
|
} else {
|
||||||
|
edit_pane.set_divider (0, atof (prop->value()));
|
||||||
|
}
|
||||||
|
|
||||||
edit_pane.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Editor::pane_allocation_handler), static_cast<Paned*> (&edit_pane)));
|
if (!settings || (prop = settings->property ("edit-vertical-pane-pos")) == 0) {
|
||||||
|
/* initial allocation is 90% to canvas, 10% to summary */
|
||||||
|
editor_summary_pane.set_divider (0, 0.90);
|
||||||
|
} else {
|
||||||
|
|
||||||
Glib::PropertyProxy<int> proxy = edit_pane.property_position();
|
editor_summary_pane.set_divider (0, atof (prop->value()));
|
||||||
proxy.signal_changed().connect (bind (sigc::ptr_fun (pane_size_watcher), static_cast<Paned*> (&edit_pane)));
|
}
|
||||||
|
|
||||||
top_hbox.pack_start (toolbar_frame);
|
top_hbox.pack_start (toolbar_frame);
|
||||||
|
|
||||||
|
|
@ -2587,10 +2580,10 @@ Editor::get_state ()
|
||||||
|
|
||||||
node->add_child_nocopy (Tabbable::get_state());
|
node->add_child_nocopy (Tabbable::get_state());
|
||||||
|
|
||||||
snprintf(buf,sizeof(buf), "%f", paned_position_as_fraction (edit_pane, false));
|
snprintf(buf,sizeof(buf), "%f", edit_pane.get_divider ());
|
||||||
node->add_property("edit-horizontal-pane-pos", string(buf));
|
node->add_property("edit-horizontal-pane-pos", string(buf));
|
||||||
node->add_property("notebook-shrunk", _notebook_shrunk ? "1" : "0");
|
node->add_property("notebook-shrunk", _notebook_shrunk ? "1" : "0");
|
||||||
snprintf(buf,sizeof(buf), "%f", paned_position_as_fraction (editor_summary_pane, true));
|
snprintf(buf,sizeof(buf), "%f", editor_summary_pane.get_divider());
|
||||||
node->add_property("edit-vertical-pane-pos", string(buf));
|
node->add_property("edit-vertical-pane-pos", string(buf));
|
||||||
|
|
||||||
maybe_add_mixer_strip_width (*node);
|
maybe_add_mixer_strip_width (*node);
|
||||||
|
|
@ -3929,85 +3922,6 @@ Editor::cycle_zoom_focus ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
Editor::pane_allocation_handler (Allocation &alloc, Paned* which)
|
|
||||||
{
|
|
||||||
/* recover or initialize pane positions. do this here rather than earlier because
|
|
||||||
we don't want the positions to change the child allocations, which they seem to do.
|
|
||||||
|
|
||||||
See comments in mixer_ui.cc about how this works.
|
|
||||||
*/
|
|
||||||
|
|
||||||
float pos;
|
|
||||||
XMLProperty* prop;
|
|
||||||
XMLNode* geometry = ARDOUR_UI::instance()->editor_settings();
|
|
||||||
|
|
||||||
enum Pane {
|
|
||||||
Horizontal = 0x1,
|
|
||||||
Vertical = 0x2
|
|
||||||
};
|
|
||||||
|
|
||||||
static Pane done;
|
|
||||||
|
|
||||||
if (which == static_cast<Paned*> (&edit_pane)) {
|
|
||||||
|
|
||||||
if (done & Horizontal) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (geometry && (prop = geometry->property ("notebook-shrunk"))) {
|
|
||||||
_notebook_shrunk = string_is_affirmative (prop->value ());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!geometry || (prop = geometry->property ("edit-horizontal-pane-pos")) == 0) {
|
|
||||||
/* initial allocation is 90% to canvas, 10% to notebook */
|
|
||||||
pos = (int) floor (alloc.get_width() * 0.90f);
|
|
||||||
} else {
|
|
||||||
pos = atof (prop->value());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pos > 1.0f) {
|
|
||||||
/* older versions of Ardour stored absolute position */
|
|
||||||
if (alloc.get_width() > pos) {
|
|
||||||
edit_pane.set_position (pos);
|
|
||||||
done = (Pane) (done | Horizontal);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (alloc.get_width() > 1.0/pos) {
|
|
||||||
paned_set_position_as_fraction (edit_pane, pos, false);
|
|
||||||
done = (Pane) (done | Horizontal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (which == static_cast<Paned*> (&editor_summary_pane)) {
|
|
||||||
|
|
||||||
if (done & Vertical) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!geometry || (prop = geometry->property ("edit-vertical-pane-pos")) == 0) {
|
|
||||||
/* initial allocation is 90% to canvas, 10% to summary */
|
|
||||||
pos = (int) floor (alloc.get_height() * 0.90f);
|
|
||||||
} else {
|
|
||||||
|
|
||||||
pos = atof (prop->value());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pos > 1.0f) {
|
|
||||||
/* older versions of Ardour stored absolute position */
|
|
||||||
if (alloc.get_height() > pos) {
|
|
||||||
editor_summary_pane.set_position (pos);
|
|
||||||
done = (Pane) (done | Vertical);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (alloc.get_height() > 1.0/pos) {
|
|
||||||
paned_set_position_as_fraction (editor_summary_pane, pos, true);
|
|
||||||
done = (Pane) (done | Vertical);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Editor::set_show_measures (bool yn)
|
Editor::set_show_measures (bool yn)
|
||||||
{
|
{
|
||||||
|
|
@ -5950,16 +5864,16 @@ Editor::notebook_tab_clicked (GdkEventButton* ev, Gtk::Widget* page)
|
||||||
|
|
||||||
if (_notebook_shrunk) {
|
if (_notebook_shrunk) {
|
||||||
if (pre_notebook_shrink_pane_width) {
|
if (pre_notebook_shrink_pane_width) {
|
||||||
edit_pane.set_position (*pre_notebook_shrink_pane_width);
|
edit_pane.set_divider (0, *pre_notebook_shrink_pane_width);
|
||||||
}
|
}
|
||||||
_notebook_shrunk = false;
|
_notebook_shrunk = false;
|
||||||
} else {
|
} else {
|
||||||
pre_notebook_shrink_pane_width = edit_pane.get_position();
|
pre_notebook_shrink_pane_width = edit_pane.get_divider();
|
||||||
|
|
||||||
/* this expands the LHS of the edit pane to cover the notebook
|
/* this expands the LHS of the edit pane to cover the notebook
|
||||||
PAGE but leaves the tabs visible.
|
PAGE but leaves the tabs visible.
|
||||||
*/
|
*/
|
||||||
edit_pane.set_position (edit_pane.get_position() + page->get_width());
|
edit_pane.set_divider (0, edit_pane.get_divider() + page->get_width());
|
||||||
_notebook_shrunk = true;
|
_notebook_shrunk = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -34,11 +34,12 @@
|
||||||
#include <gtkmm/comboboxtext.h>
|
#include <gtkmm/comboboxtext.h>
|
||||||
#include <gtkmm/layout.h>
|
#include <gtkmm/layout.h>
|
||||||
|
|
||||||
#include "gtkmm2ext/selector.h"
|
#include "gtkmm2ext/bindings.h"
|
||||||
#include "gtkmm2ext/click_box.h"
|
#include "gtkmm2ext/click_box.h"
|
||||||
#include "gtkmm2ext/dndtreeview.h"
|
#include "gtkmm2ext/dndtreeview.h"
|
||||||
|
#include "gtkmm2ext/pane.h"
|
||||||
|
#include "gtkmm2ext/selector.h"
|
||||||
#include "gtkmm2ext/stateful_button.h"
|
#include "gtkmm2ext/stateful_button.h"
|
||||||
#include "gtkmm2ext/bindings.h"
|
|
||||||
|
|
||||||
#include "pbd/stateful.h"
|
#include "pbd/stateful.h"
|
||||||
#include "pbd/signals.h"
|
#include "pbd/signals.h"
|
||||||
|
|
@ -610,17 +611,15 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
|
||||||
|
|
||||||
void update_join_object_range_location (double);
|
void update_join_object_range_location (double);
|
||||||
|
|
||||||
boost::optional<int> pre_notebook_shrink_pane_width;
|
boost::optional<float> pre_notebook_shrink_pane_width;
|
||||||
|
|
||||||
void pane_allocation_handler (Gtk::Allocation&, Gtk::Paned*);
|
|
||||||
|
|
||||||
Gtk::Notebook _the_notebook;
|
Gtk::Notebook _the_notebook;
|
||||||
bool _notebook_shrunk;
|
bool _notebook_shrunk;
|
||||||
void add_notebook_page (std::string const &, Gtk::Widget &);
|
void add_notebook_page (std::string const &, Gtk::Widget &);
|
||||||
bool notebook_tab_clicked (GdkEventButton *, Gtk::Widget *);
|
bool notebook_tab_clicked (GdkEventButton *, Gtk::Widget *);
|
||||||
|
|
||||||
Gtk::HPaned edit_pane;
|
Gtkmm2ext::HPane edit_pane;
|
||||||
Gtk::VPaned editor_summary_pane;
|
Gtkmm2ext::VPane editor_summary_pane;
|
||||||
|
|
||||||
Gtk::EventBox meter_base;
|
Gtk::EventBox meter_base;
|
||||||
Gtk::HBox meter_box;
|
Gtk::HBox meter_box;
|
||||||
|
|
|
||||||
|
|
@ -803,7 +803,7 @@ LocationUI::LocationUI ()
|
||||||
table->attach (loc_frame_box, 0, 2, table_row, table_row + 1);
|
table->attach (loc_frame_box, 0, 2, table_row, table_row + 1);
|
||||||
++table_row;
|
++table_row;
|
||||||
|
|
||||||
loc_range_panes.pack1 (*table, true, false);
|
loc_range_panes.add (*table);
|
||||||
|
|
||||||
table = manage (new Table (3, 2));
|
table = manage (new Table (3, 2));
|
||||||
table->set_spacings (2);
|
table->set_spacings (2);
|
||||||
|
|
@ -835,7 +835,7 @@ LocationUI::LocationUI ()
|
||||||
table->attach (range_frame_box, 0, 2, table_row, table_row + 1);
|
table->attach (range_frame_box, 0, 2, table_row, table_row + 1);
|
||||||
++table_row;
|
++table_row;
|
||||||
|
|
||||||
loc_range_panes.pack2 (*table, true, false);
|
loc_range_panes.add (*table);
|
||||||
|
|
||||||
HBox* add_button_box = manage (new HBox);
|
HBox* add_button_box = manage (new HBox);
|
||||||
add_button_box->pack_start (add_location_button, true, true);
|
add_button_box->pack_start (add_location_button, true, true);
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,6 @@
|
||||||
#include <gtkmm/table.h>
|
#include <gtkmm/table.h>
|
||||||
#include <gtkmm/entry.h>
|
#include <gtkmm/entry.h>
|
||||||
#include <gtkmm/label.h>
|
#include <gtkmm/label.h>
|
||||||
#include <gtkmm/paned.h>
|
|
||||||
#include <gtkmm/scrolledwindow.h>
|
#include <gtkmm/scrolledwindow.h>
|
||||||
|
|
||||||
#include "pbd/signals.h"
|
#include "pbd/signals.h"
|
||||||
|
|
@ -34,6 +33,8 @@
|
||||||
#include "ardour/location.h"
|
#include "ardour/location.h"
|
||||||
#include "ardour/session_handle.h"
|
#include "ardour/session_handle.h"
|
||||||
|
|
||||||
|
#include <gtkmm2ext/pane.h>
|
||||||
|
|
||||||
#include "ardour_button.h"
|
#include "ardour_button.h"
|
||||||
#include "ardour_window.h"
|
#include "ardour_window.h"
|
||||||
#include "audio_clock.h"
|
#include "audio_clock.h"
|
||||||
|
|
@ -178,7 +179,7 @@ class LocationUI : public Gtk::HBox, public ARDOUR::SessionHandlePtr
|
||||||
LocationEditRow punch_edit_row;
|
LocationEditRow punch_edit_row;
|
||||||
Gtk::VBox loop_punch_box;
|
Gtk::VBox loop_punch_box;
|
||||||
|
|
||||||
Gtk::VPaned loc_range_panes;
|
Gtkmm2ext::VPane loc_range_panes;
|
||||||
|
|
||||||
Gtk::VBox loc_frame_box;
|
Gtk::VBox loc_frame_box;
|
||||||
Gtk::Button add_location_button;
|
Gtk::Button add_location_button;
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,7 @@
|
||||||
#include "pbd/md5.h"
|
#include "pbd/md5.h"
|
||||||
|
|
||||||
#include "gtkmm2ext/gtk_ui.h"
|
#include "gtkmm2ext/gtk_ui.h"
|
||||||
|
#include "gtkmm2ext/pane.h"
|
||||||
#include "gtkmm2ext/utils.h"
|
#include "gtkmm2ext/utils.h"
|
||||||
#include "gtkmm2ext/window_title.h"
|
#include "gtkmm2ext/window_title.h"
|
||||||
|
|
||||||
|
|
@ -155,9 +156,9 @@ LuaWindow::LuaWindow ()
|
||||||
vbox->pack_start (*scrollin, true, true, 0);
|
vbox->pack_start (*scrollin, true, true, 0);
|
||||||
vbox->pack_start (*hbox, false, false, 2);
|
vbox->pack_start (*hbox, false, false, 2);
|
||||||
|
|
||||||
Gtk::VPaned *vpane = manage (new Gtk::VPaned ());
|
Gtkmm2ext::VPane *vpane = manage (new Gtkmm2ext::VPane ());
|
||||||
vpane->pack1 (*vbox, true, false);
|
vpane->add (*vbox);
|
||||||
vpane->pack2 (scrollout, false, true);
|
vpane->add (scrollout);
|
||||||
|
|
||||||
vpane->show_all ();
|
vpane->show_all ();
|
||||||
add (*vpane);
|
add (*vpane);
|
||||||
|
|
|
||||||
|
|
@ -236,10 +236,10 @@ Mixer_UI::Mixer_UI ()
|
||||||
favorite_plugins_frame.set_shadow_type (Gtk::SHADOW_IN);
|
favorite_plugins_frame.set_shadow_type (Gtk::SHADOW_IN);
|
||||||
favorite_plugins_frame.add (favorite_plugins_scroller);
|
favorite_plugins_frame.add (favorite_plugins_scroller);
|
||||||
|
|
||||||
rhs_pane1.pack1 (favorite_plugins_frame, false, true);
|
rhs_pane1.add (favorite_plugins_frame);
|
||||||
rhs_pane1.pack2 (track_display_frame);
|
rhs_pane1.add (track_display_frame);
|
||||||
rhs_pane2.pack1 (rhs_pane1);
|
rhs_pane2.add (rhs_pane1);
|
||||||
rhs_pane2.pack2 (group_display_frame);
|
rhs_pane2.add (group_display_frame);
|
||||||
|
|
||||||
list_vpacker.pack_start (rhs_pane2, true, true);
|
list_vpacker.pack_start (rhs_pane2, true, true);
|
||||||
|
|
||||||
|
|
@ -252,23 +252,14 @@ Mixer_UI::Mixer_UI ()
|
||||||
vca_scroller.set_policy (Gtk::POLICY_ALWAYS, Gtk::POLICY_AUTOMATIC);
|
vca_scroller.set_policy (Gtk::POLICY_ALWAYS, Gtk::POLICY_AUTOMATIC);
|
||||||
vca_scroller.signal_button_release_event().connect (sigc::mem_fun(*this, &Mixer_UI::strip_scroller_button_release));
|
vca_scroller.signal_button_release_event().connect (sigc::mem_fun(*this, &Mixer_UI::strip_scroller_button_release));
|
||||||
|
|
||||||
inner_pane.pack1 (scroller);
|
inner_pane.add (scroller);
|
||||||
inner_pane.pack2 (vca_scroller);
|
inner_pane.add (vca_scroller);
|
||||||
|
|
||||||
global_hpacker.pack_start (inner_pane, true, true);
|
global_hpacker.pack_start (inner_pane, true, true);
|
||||||
global_hpacker.pack_start (out_packer, false, false);
|
global_hpacker.pack_start (out_packer, false, false);
|
||||||
|
|
||||||
list_hpane.pack1(list_vpacker, false, true);
|
list_hpane.add (list_vpacker);
|
||||||
list_hpane.pack2(global_hpacker, true, false);
|
list_hpane.add (global_hpacker);
|
||||||
|
|
||||||
rhs_pane1.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::pane_allocation_handler),
|
|
||||||
static_cast<Gtk::Paned*> (&rhs_pane1)));
|
|
||||||
rhs_pane2.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::pane_allocation_handler),
|
|
||||||
static_cast<Gtk::Paned*> (&rhs_pane2)));
|
|
||||||
list_hpane.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::pane_allocation_handler),
|
|
||||||
static_cast<Gtk::Paned*> (&list_hpane)));
|
|
||||||
inner_pane.signal_size_allocate().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::pane_allocation_handler),
|
|
||||||
static_cast<Gtk::Paned*> (&inner_pane)));
|
|
||||||
|
|
||||||
_content.pack_start (list_hpane, true, true);
|
_content.pack_start (list_hpane, true, true);
|
||||||
|
|
||||||
|
|
@ -1628,10 +1619,11 @@ Mixer_UI::show_mixer_list (bool yn)
|
||||||
list_vpacker.show ();
|
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();
|
/// XXX PANE
|
||||||
if (width < 40) {
|
// float width = list_hpane.get_position();
|
||||||
list_hpane.set_position(40);
|
//if (width < 40) {
|
||||||
}
|
// list_hpane.set_position(40);
|
||||||
|
//}
|
||||||
} else {
|
} else {
|
||||||
list_vpacker.hide ();
|
list_vpacker.hide ();
|
||||||
}
|
}
|
||||||
|
|
@ -1910,13 +1902,13 @@ Mixer_UI::get_state ()
|
||||||
|
|
||||||
node->add_child_nocopy (Tabbable::get_state());
|
node->add_child_nocopy (Tabbable::get_state());
|
||||||
|
|
||||||
snprintf(buf,sizeof(buf), "%f", paned_position_as_fraction (rhs_pane1, true));
|
snprintf(buf,sizeof(buf), "%f", rhs_pane1.get_divider());
|
||||||
node->add_property(X_("mixer-rhs-pane1-pos"), string(buf));
|
node->add_property(X_("mixer-rhs-pane1-pos"), string(buf));
|
||||||
snprintf(buf,sizeof(buf), "%f", paned_position_as_fraction (rhs_pane2, true));
|
snprintf(buf,sizeof(buf), "%f", rhs_pane2.get_divider());
|
||||||
node->add_property(X_("mixer-rhs_pane2-pos"), string(buf));
|
node->add_property(X_("mixer-rhs_pane2-pos"), string(buf));
|
||||||
snprintf(buf,sizeof(buf), "%f", paned_position_as_fraction (list_hpane, false));
|
snprintf(buf,sizeof(buf), "%f", list_hpane.get_divider());
|
||||||
node->add_property(X_("mixer-list-hpane-pos"), string(buf));
|
node->add_property(X_("mixer-list-hpane-pos"), string(buf));
|
||||||
snprintf(buf,sizeof(buf), "%f", paned_position_as_fraction (inner_pane, false));
|
snprintf(buf,sizeof(buf), "%f", inner_pane.get_divider());
|
||||||
node->add_property(X_("mixer-inner-pane-pos"), string(buf));
|
node->add_property(X_("mixer-inner-pane-pos"), string(buf));
|
||||||
|
|
||||||
node->add_property ("narrow-strips", _strip_width == Narrow ? "yes" : "no");
|
node->add_property ("narrow-strips", _strip_width == Narrow ? "yes" : "no");
|
||||||
|
|
@ -1941,149 +1933,6 @@ Mixer_UI::get_state ()
|
||||||
return *node;
|
return *node;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
Mixer_UI::pane_allocation_handler (Allocation& allocation, Gtk::Paned* which)
|
|
||||||
{
|
|
||||||
float pos;
|
|
||||||
XMLProperty* prop = 0;
|
|
||||||
XMLNode* geometry = ARDOUR_UI::instance()->mixer_settings();
|
|
||||||
int height = default_height;
|
|
||||||
static bool done[4] = { false, false, false, false };
|
|
||||||
|
|
||||||
/* Gtk::Paned behaves very oddly and rather undesirably. Setting the
|
|
||||||
* position is a crapshoot if you time it incorrectly with the overall
|
|
||||||
* sizing of the Paned. For example, if you might retrieve the size with
|
|
||||||
* ::get_position() and then later call ::set_position() on a Paned at
|
|
||||||
* a time when its allocation is different than it was when you retrieved
|
|
||||||
* the position. The position will be interpreted as the size of the
|
|
||||||
* first (top or left) child widget. If packing/size allocation later
|
|
||||||
* resizes the Paned to a (final) smaller size, the position will be
|
|
||||||
* used in ways that mean that the Paned ends up NOT in the same state
|
|
||||||
* that it was in when you originally saved the position.
|
|
||||||
*
|
|
||||||
* Concrete example: Paned is 800 pixels wide, position is 400
|
|
||||||
* (halfway). Save position as 400. During program restart, set
|
|
||||||
* position to 400, before Paned has been allocated any space. Paned
|
|
||||||
* ends up initially sized to 1200 pixels. Position is now 1/3 of the
|
|
||||||
* way across/down. Subsequent resizes will leave the position 1/3 of
|
|
||||||
* the way across, rather than leaving it as a fixed pixel
|
|
||||||
* position. Eventually, the Paned ends up 800 pixels wide/high again,
|
|
||||||
* but the position is now 267, not 400.
|
|
||||||
*
|
|
||||||
* So ...
|
|
||||||
*
|
|
||||||
* We deal with this by using two strategies:
|
|
||||||
*
|
|
||||||
* 1) only set the position if the allocated size of the Paned is at
|
|
||||||
* least as big as it needs to be for the position to make sense.
|
|
||||||
*
|
|
||||||
* 2) in recent versions of Ardour, save the position as a fraction,
|
|
||||||
* and restore it using that fraction.
|
|
||||||
*
|
|
||||||
* So, we will only call ::set_position() AFTER the Paned is of a
|
|
||||||
* sensible size, and then in addition, we will set the position in a
|
|
||||||
* way that will be maintained as/when/if the Paned is resized.
|
|
||||||
*
|
|
||||||
* Once we've called ::set_position() on a Paned, we don't do it
|
|
||||||
* again.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (which == static_cast<Gtk::Paned*> (&rhs_pane1)) {
|
|
||||||
|
|
||||||
if (done[0]) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!geometry || (prop = geometry->property("mixer-rhs-pane1-pos")) == 0) {
|
|
||||||
pos = height / 3;
|
|
||||||
} else {
|
|
||||||
pos = atof (prop->value());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pos > 1.0f) {
|
|
||||||
/* older versions of Ardour stored absolute position */
|
|
||||||
if ((done[0] = (allocation.get_height() > pos))) {
|
|
||||||
rhs_pane1.set_position (pos);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ((done[0] = (allocation.get_height() > 1.0/pos))) {
|
|
||||||
paned_set_position_as_fraction (rhs_pane1, pos, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (which == static_cast<Gtk::Paned*> (&rhs_pane2)) {
|
|
||||||
|
|
||||||
if (done[1]) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!geometry || (prop = geometry->property("mixer-rhs-pane2-pos")) == 0) {
|
|
||||||
pos = 2 * height / 3;
|
|
||||||
} else {
|
|
||||||
pos = atof (prop->value());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pos > 1.0f) {
|
|
||||||
/* older versions of Ardour stored absolute position */
|
|
||||||
if ((done[1] = (allocation.get_height() > pos))) {
|
|
||||||
rhs_pane2.set_position (pos);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ((done[1] = (allocation.get_height() > 1.0/pos))) {
|
|
||||||
paned_set_position_as_fraction (rhs_pane2, pos, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (which == static_cast<Gtk::Paned*> (&list_hpane)) {
|
|
||||||
|
|
||||||
if (done[2]) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!geometry || (prop = geometry->property("mixer-list-hpane-pos")) == 0) {
|
|
||||||
pos = std::max ((float)100, rintf ((float) 125 * UIConfiguration::instance().get_ui_scale()));
|
|
||||||
} else {
|
|
||||||
pos = max (0.1, atof (prop->value ()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pos > 1.0f) {
|
|
||||||
if ((done[2] = (allocation.get_width() > pos))) {
|
|
||||||
list_hpane.set_position (pos);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ((done[2] = (allocation.get_width() > 1.0/pos))) {
|
|
||||||
paned_set_position_as_fraction (list_hpane, pos, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (which == static_cast<Gtk::Paned*> (&inner_pane)) {
|
|
||||||
|
|
||||||
if (done[3]) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!geometry || (prop = geometry->property("mixer-inner-pane-pos")) == 0) {
|
|
||||||
pos = std::max ((float)100, rintf ((float) 125 * UIConfiguration::instance().get_ui_scale()));
|
|
||||||
} else {
|
|
||||||
pos = max (0.1, atof (prop->value ()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pos > 1.0f) {
|
|
||||||
/* older versions of Ardour stored absolute position */
|
|
||||||
if ((done[3] = (allocation.get_width() > pos))) {
|
|
||||||
inner_pane.set_position (pos);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ((done[3] = (allocation.get_width() > 1.0/pos))) {
|
|
||||||
paned_set_position_as_fraction (inner_pane, pos, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Mixer_UI::scroll_left ()
|
Mixer_UI::scroll_left ()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,6 @@
|
||||||
#include <gtkmm/label.h>
|
#include <gtkmm/label.h>
|
||||||
#include <gtkmm/button.h>
|
#include <gtkmm/button.h>
|
||||||
#include <gtkmm/frame.h>
|
#include <gtkmm/frame.h>
|
||||||
#include <gtkmm/paned.h>
|
|
||||||
#include <gtkmm/menu.h>
|
#include <gtkmm/menu.h>
|
||||||
#include <gtkmm/treeview.h>
|
#include <gtkmm/treeview.h>
|
||||||
#include <gtkmm/liststore.h>
|
#include <gtkmm/liststore.h>
|
||||||
|
|
@ -42,8 +41,8 @@
|
||||||
#include "ardour/plugin.h"
|
#include "ardour/plugin.h"
|
||||||
#include "ardour/plugin_manager.h"
|
#include "ardour/plugin_manager.h"
|
||||||
|
|
||||||
|
|
||||||
#include "gtkmm2ext/dndtreeview.h"
|
#include "gtkmm2ext/dndtreeview.h"
|
||||||
|
#include <gtkmm2ext/pane.h>
|
||||||
#include "gtkmm2ext/treeutils.h"
|
#include "gtkmm2ext/treeutils.h"
|
||||||
|
|
||||||
#include "gtkmm2ext/tabbable.h"
|
#include "gtkmm2ext/tabbable.h"
|
||||||
|
|
@ -143,22 +142,20 @@ class Mixer_UI : public Gtkmm2ext::Tabbable, public PBD::ScopedConnectionList, p
|
||||||
Gtk::Frame track_display_frame;
|
Gtk::Frame track_display_frame;
|
||||||
Gtk::Frame group_display_frame;
|
Gtk::Frame group_display_frame;
|
||||||
Gtk::Frame favorite_plugins_frame;
|
Gtk::Frame favorite_plugins_frame;
|
||||||
Gtk::VPaned rhs_pane1;
|
Gtkmm2ext::VPane rhs_pane1;
|
||||||
Gtk::VPaned rhs_pane2;
|
Gtkmm2ext::VPane rhs_pane2;
|
||||||
Gtk::HPaned inner_pane;
|
Gtkmm2ext::HPane inner_pane;
|
||||||
Gtk::HBox strip_packer;
|
Gtk::HBox strip_packer;
|
||||||
Gtk::ScrolledWindow vca_scroller;
|
Gtk::ScrolledWindow vca_scroller;
|
||||||
Gtk::HBox vca_packer;
|
Gtk::HBox vca_packer;
|
||||||
Gtk::EventBox vca_scroller_base;
|
Gtk::EventBox vca_scroller_base;
|
||||||
Gtk::HBox out_packer;
|
Gtk::HBox out_packer;
|
||||||
Gtk::HPaned list_hpane;
|
Gtkmm2ext::HPane list_hpane;
|
||||||
|
|
||||||
MixerGroupTabs* _group_tabs;
|
MixerGroupTabs* _group_tabs;
|
||||||
|
|
||||||
bool on_scroll_event (GdkEventScroll*);
|
bool on_scroll_event (GdkEventScroll*);
|
||||||
|
|
||||||
void pane_allocation_handler (Gtk::Allocation&, Gtk::Paned*);
|
|
||||||
|
|
||||||
std::list<MixerStrip *> strips;
|
std::list<MixerStrip *> strips;
|
||||||
|
|
||||||
void scroller_drag_data_received (const Glib::RefPtr<Gdk::DragContext>&, int, int, const Gtk::SelectionData&, guint, guint);
|
void scroller_drag_data_received (const Glib::RefPtr<Gdk::DragContext>&, int, int, const Gtk::SelectionData&, guint, guint);
|
||||||
|
|
|
||||||
|
|
@ -125,12 +125,14 @@ RouteParams_UI::RouteParams_UI ()
|
||||||
route_vpacker.pack_start (route_hpacker, true, true);
|
route_vpacker.pack_start (route_hpacker, true, true);
|
||||||
|
|
||||||
|
|
||||||
list_hpane.pack1 (list_vpacker);
|
list_hpane.add (list_vpacker);
|
||||||
list_hpane.add2 (route_vpacker);
|
list_hpane.add (route_vpacker);
|
||||||
|
|
||||||
list_hpane.set_position(110);
|
/// XXX PANE
|
||||||
|
//list_hpane.set_position(110);
|
||||||
|
|
||||||
redir_hpane.set_position(110);
|
/// XXX PANE
|
||||||
|
//redir_hpane.set_position(110);
|
||||||
|
|
||||||
//global_vpacker.pack_start (list_hpane, true, true);
|
//global_vpacker.pack_start (list_hpane, true, true);
|
||||||
//get_vbox()->pack_start (global_vpacker);
|
//get_vbox()->pack_start (global_vpacker);
|
||||||
|
|
@ -250,7 +252,7 @@ RouteParams_UI::setup_processor_boxes()
|
||||||
if (at) {
|
if (at) {
|
||||||
at->FreezeChange.connect (route_connections, invalidator (*this), boost::bind (&RouteParams_UI::map_frozen, this), gui_context());
|
at->FreezeChange.connect (route_connections, invalidator (*this), boost::bind (&RouteParams_UI::map_frozen, this), gui_context());
|
||||||
}
|
}
|
||||||
redir_hpane.pack1 (*insert_box);
|
redir_hpane.add (*insert_box);
|
||||||
|
|
||||||
insert_box->ProcessorSelected.connect (sigc::mem_fun(*this, &RouteParams_UI::redirect_selected)); //note: this indicates a double-click activation, not just a "selection"
|
insert_box->ProcessorSelected.connect (sigc::mem_fun(*this, &RouteParams_UI::redirect_selected)); //note: this indicates a double-click activation, not just a "selection"
|
||||||
insert_box->ProcessorUnselected.connect (sigc::mem_fun(*this, &RouteParams_UI::redirect_selected));
|
insert_box->ProcessorUnselected.connect (sigc::mem_fun(*this, &RouteParams_UI::redirect_selected));
|
||||||
|
|
@ -546,7 +548,7 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc)
|
||||||
send->DropReferences.connect (_processor_going_away_connection, invalidator (*this), boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr<Processor>(proc)), gui_context());
|
send->DropReferences.connect (_processor_going_away_connection, invalidator (*this), boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr<Processor>(proc)), gui_context());
|
||||||
_active_view = send_ui;
|
_active_view = send_ui;
|
||||||
|
|
||||||
redir_hpane.add2 (*_active_view);
|
redir_hpane.add (*_active_view);
|
||||||
redir_hpane.show_all();
|
redir_hpane.show_all();
|
||||||
|
|
||||||
} else if ((retrn = boost::dynamic_pointer_cast<Return> (proc)) != 0) {
|
} else if ((retrn = boost::dynamic_pointer_cast<Return> (proc)) != 0) {
|
||||||
|
|
@ -557,7 +559,7 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc)
|
||||||
retrn->DropReferences.connect (_processor_going_away_connection, invalidator (*this), boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr<Processor>(proc)), gui_context());
|
retrn->DropReferences.connect (_processor_going_away_connection, invalidator (*this), boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr<Processor>(proc)), gui_context());
|
||||||
_active_view = return_ui;
|
_active_view = return_ui;
|
||||||
|
|
||||||
redir_hpane.add2 (*_active_view);
|
redir_hpane.add (*_active_view);
|
||||||
redir_hpane.show_all();
|
redir_hpane.show_all();
|
||||||
|
|
||||||
} else if ((plugin_insert = boost::dynamic_pointer_cast<PluginInsert> (proc)) != 0) {
|
} else if ((plugin_insert = boost::dynamic_pointer_cast<PluginInsert> (proc)) != 0) {
|
||||||
|
|
@ -569,7 +571,7 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc)
|
||||||
plugin_ui->start_updating (0);
|
plugin_ui->start_updating (0);
|
||||||
_active_view = plugin_ui;
|
_active_view = plugin_ui;
|
||||||
|
|
||||||
redir_hpane.pack2 (*_active_view);
|
redir_hpane.add (*_active_view);
|
||||||
redir_hpane.show_all();
|
redir_hpane.show_all();
|
||||||
|
|
||||||
} else if ((port_insert = boost::dynamic_pointer_cast<PortInsert> (proc)) != 0) {
|
} else if ((port_insert = boost::dynamic_pointer_cast<PortInsert> (proc)) != 0) {
|
||||||
|
|
@ -580,7 +582,7 @@ RouteParams_UI::redirect_selected (boost::shared_ptr<ARDOUR::Processor> proc)
|
||||||
port_insert->DropReferences.connect (_processor_going_away_connection, invalidator (*this), boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr<Processor> (proc)), gui_context());
|
port_insert->DropReferences.connect (_processor_going_away_connection, invalidator (*this), boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr<Processor> (proc)), gui_context());
|
||||||
_active_view = portinsert_ui;
|
_active_view = portinsert_ui;
|
||||||
|
|
||||||
redir_hpane.pack2 (*_active_view);
|
redir_hpane.add (*_active_view);
|
||||||
portinsert_ui->redisplay();
|
portinsert_ui->redisplay();
|
||||||
redir_hpane.show_all();
|
redir_hpane.show_all();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,6 @@
|
||||||
#include <gtkmm/eventbox.h>
|
#include <gtkmm/eventbox.h>
|
||||||
#include <gtkmm/frame.h>
|
#include <gtkmm/frame.h>
|
||||||
#include <gtkmm/label.h>
|
#include <gtkmm/label.h>
|
||||||
#include <gtkmm/paned.h>
|
|
||||||
#include <gtkmm/scrolledwindow.h>
|
#include <gtkmm/scrolledwindow.h>
|
||||||
#include <gtkmm/togglebutton.h>
|
#include <gtkmm/togglebutton.h>
|
||||||
#include <gtkmm/treeview.h>
|
#include <gtkmm/treeview.h>
|
||||||
|
|
@ -37,6 +36,8 @@
|
||||||
|
|
||||||
#include "ardour/ardour.h"
|
#include "ardour/ardour.h"
|
||||||
|
|
||||||
|
#include <gtkmm2ext/pane.h>
|
||||||
|
|
||||||
#include "ardour_window.h"
|
#include "ardour_window.h"
|
||||||
#include "processor_box.h"
|
#include "processor_box.h"
|
||||||
#include "route_processor_selection.h"
|
#include "route_processor_selection.h"
|
||||||
|
|
@ -81,7 +82,7 @@ class RouteParams_UI : public ArdourWindow, public PBD::ScopedConnectionList
|
||||||
Gtk::Notebook notebook;
|
Gtk::Notebook notebook;
|
||||||
Gtk::Frame input_frame;
|
Gtk::Frame input_frame;
|
||||||
Gtk::Frame output_frame;
|
Gtk::Frame output_frame;
|
||||||
Gtk::HPaned redir_hpane;
|
Gtkmm2ext::HPane redir_hpane;
|
||||||
|
|
||||||
Gtk::Frame route_select_frame;
|
Gtk::Frame route_select_frame;
|
||||||
|
|
||||||
|
|
@ -90,9 +91,9 @@ class RouteParams_UI : public ArdourWindow, public PBD::ScopedConnectionList
|
||||||
|
|
||||||
ProcessorBox* insert_box;
|
ProcessorBox* insert_box;
|
||||||
|
|
||||||
Gtk::HPaned list_hpane;
|
Gtkmm2ext::HPane list_hpane;
|
||||||
|
|
||||||
Gtk::HPaned right_hpane;
|
Gtkmm2ext::HPane right_hpane;
|
||||||
|
|
||||||
Gtk::Frame route_choice_frame;
|
Gtk::Frame route_choice_frame;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,6 @@ namespace PBD {
|
||||||
namespace Gtk {
|
namespace Gtk {
|
||||||
class Window;
|
class Window;
|
||||||
class ComboBoxText;
|
class ComboBoxText;
|
||||||
class Paned;
|
|
||||||
class Adjustment;
|
class Adjustment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue