first step to separate generic-gui layout
authorRobin Gareus <robin@gareus.org>
Fri, 8 Jul 2016 00:41:42 +0000 (02:41 +0200)
committerRobin Gareus <robin@gareus.org>
Fri, 8 Jul 2016 16:19:31 +0000 (18:19 +0200)
gtk2_ardour/generic_pluginui.cc
gtk2_ardour/plugin_ui.h

index f98b483d50871236de6d408a8ddf812e594250f9..3f33b78c924ff0af2ad91e1f379b7ff2888cbdb1 100644 (file)
@@ -63,11 +63,6 @@ using namespace ARDOUR_UI_UTILS;
 
 GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrollable)
        : PlugUIBase (pi)
-       , button_table (initial_button_rows, initial_button_cols)
-       , output_table (initial_output_rows, initial_output_cols)
-       , hAdjustment(0.0, 0.0, 0.0)
-       , vAdjustment(0.0, 0.0, 0.0)
-       , scroller_view(hAdjustment, vAdjustment)
        , automation_menu (0)
        , is_scrollable(scrollable)
 {
@@ -137,15 +132,12 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
 
        main_contents.pack_start (*constraint_hbox, false, false);
 
-       if (is_scrollable ) {
-               scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
-               scroller.set_name ("PluginEditor");
-               scroller_view.set_name("PluginEditor");
-               scroller_view.add (hpacker);
-               scroller.add (scroller_view);
-
-               main_contents.pack_start (scroller, true, true);
-
+       if (is_scrollable) {
+               Gtk::ScrolledWindow *scroller = manage (new Gtk::ScrolledWindow());
+               scroller->set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
+               scroller->set_name ("PluginEditor");
+               scroller->add (hpacker);
+               main_contents.pack_start (*scroller, true, true);
        } else {
                main_contents.pack_start (hpacker, false, false);
        }
@@ -217,58 +209,10 @@ static const float default_similarity_threshold = 0.3;
 void
 GenericPluginUI::build ()
 {
-       guint32 i = 0;
-       guint32 x = 0;
-       Frame* frame;
-       Frame* bt_frame;
-       VBox* box;
-       int output_row, output_col;
-       int button_row, button_col;
-       int output_rows, output_cols;
-       int button_rows, button_cols;
-
-       hpacker.set_spacing (10);
-
-       output_rows = initial_output_rows;
-       output_cols = initial_output_cols;
-       button_rows = initial_button_rows;
-       button_cols = initial_button_cols;
-       output_row = 0;
-       button_row = 0;
-       output_col = 0;
-       button_col = 0;
-
-       button_table.set_homogeneous (false);
-       button_table.set_row_spacings (2);
-       button_table.set_col_spacings (2);
-       output_table.set_homogeneous (true);
-       output_table.set_row_spacings (2);
-       output_table.set_col_spacings (2);
-       button_table.set_border_width (5);
-       output_table.set_border_width (5);
-
-       hpacker.set_border_width (10);
-
-       bt_frame = manage (new Frame);
-       bt_frame->set_name ("BaseFrame");
-       bt_frame->set_label (_("Switches"));
-       bt_frame->add (button_table);
-       hpacker.pack_start(*bt_frame, true, true);
-
-       box = manage (new VBox);
-       box->set_border_width (5);
-       box->set_spacing (1);
-
-       frame = manage (new Frame);
-       frame->set_name ("BaseFrame");
-       frame->set_label (_("Controls"));
-       frame->add (*box);
-       hpacker.pack_start(*frame, true, true);
-
        std::vector<ControlUI *> control_uis;
 
        // Build a ControlUI for each control port
-       for (i = 0; i < plugin->parameter_count(); ++i) {
+       for (size_t i = 0; i < plugin->parameter_count(); ++i) {
 
                if (plugin->parameter_is_control (i)) {
 
@@ -336,9 +280,80 @@ GenericPluginUI::build ()
                plugin->announce_property_values();
        }
 
+       layout (control_uis);
+
+       output_update ();
+
+       automation_manual_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Off));
+       automation_play_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Play));
+       automation_write_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Write));
+       automation_touch_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Touch));
+}
+
+
+void
+GenericPluginUI::layout (const std::vector<ControlUI *>& control_uis)
+{
+       guint32 x = 0;
+
+       static const int32_t initial_button_rows = 12;
+       static const int32_t initial_button_cols = 1;
+       static const int32_t initial_output_rows = 1;
+       static const int32_t initial_output_cols = 4;
+
+       Gtk::Table* button_table = manage (new Gtk::Table (initial_button_rows, initial_button_cols));
+       Gtk::Table* output_table = manage (new Gtk::Table (initial_output_rows, initial_output_cols));
+
+       Frame* frame;
+       Frame* bt_frame;
+       VBox* box;
+       int output_row, output_col;
+       int button_row, button_col;
+       int output_rows, output_cols;
+       int button_rows, button_cols;
+
+       hpacker.set_spacing (10);
+       hpacker.set_border_width (10);
+
+       output_rows = initial_output_rows;
+       output_cols = initial_output_cols;
+       button_rows = initial_button_rows;
+       button_cols = initial_button_cols;
+       output_row = 0;
+       button_row = 0;
+       output_col = 0;
+       button_col = 0;
+
+       button_table->set_homogeneous (false);
+       button_table->set_row_spacings (2);
+       button_table->set_col_spacings (2);
+       output_table->set_homogeneous (true);
+       output_table->set_row_spacings (2);
+       output_table->set_col_spacings (2);
+       button_table->set_border_width (5);
+       output_table->set_border_width (5);
+
+
+       bt_frame = manage (new Frame);
+       bt_frame->set_name ("BaseFrame");
+       bt_frame->set_label (_("Switches"));
+       bt_frame->add (*button_table);
+       hpacker.pack_start(*bt_frame, true, true);
+
+       box = manage (new VBox);
+       box->set_border_width (5);
+       box->set_spacing (1);
+
+       frame = manage (new Frame);
+       frame->set_name ("BaseFrame");
+       frame->set_label (_("Controls"));
+       frame->add (*box);
+       hpacker.pack_start(*frame, true, true);
+
+
        // Add special controls to UI, and build list of normal controls to be layed out later
        std::vector<ControlUI *> cui_controls_list;
-       for (i = 0; i < control_uis.size(); ++i) {
+       for (size_t i = 0; i < control_uis.size(); ++i) {
                ControlUI* cui = control_uis[i];
 
                if (cui->button || cui->file_button) {
@@ -347,11 +362,11 @@ GenericPluginUI::build ()
                                button_row = 0;
                                if (++button_col == button_cols) {
                                        button_cols += 2;
-                                       button_table.resize (button_rows, button_cols);
+                                       button_table->resize (button_rows, button_cols);
                                }
                        }
 
-                       button_table.attach (*cui, button_col, button_col + 1, button_row, button_row+1,
+                       button_table->attach (*cui, button_col, button_col + 1, button_row, button_row+1,
                                             FILL|EXPAND, FILL);
                        button_row++;
 
@@ -362,14 +377,14 @@ GenericPluginUI::build ()
 
                } else if (cui->display) {
 
-                       output_table.attach (*cui, output_col, output_col + 1, output_row, output_row+1,
+                       output_table->attach (*cui, output_col, output_col + 1, output_row, output_row+1,
                                             FILL|EXPAND, FILL);
 
                        // TODO: The meters should be divided into multiple rows
 
                        if (++output_col == output_cols) {
                                output_cols ++;
-                               output_table.resize (output_rows, output_cols);
+                               output_table->resize (output_rows, output_cols);
                        }
                }
        }
@@ -383,7 +398,7 @@ GenericPluginUI::build ()
        std::vector<float> similarity_scores(cui_controls_list.size());
        float most_similar = 0.0, least_similar = 1.0;
 
-       i = 0;
+       size_t i = 0;
        for (vector<ControlUI*>::iterator cuip = cui_controls_list.begin(); cuip != cui_controls_list.end(); ++cuip, ++i) {
                label = (*cuip)->label.get_text();
                numbers_in_labels[i] = get_number(label);
@@ -463,27 +478,23 @@ GenericPluginUI::build ()
                hpacker.remove (*frame);
        }
 
-       if (button_table.children().empty()) {
+       if (button_table->children().empty()) {
                hpacker.remove (*bt_frame);
+               delete button_table;
+       } else {
+               button_table->show_all ();
        }
 
-       if (!output_table.children().empty()) {
+       if (!output_table->children().empty()) {
                frame = manage (new Frame);
                frame->set_name ("BaseFrame");
                frame->set_label(_("Meters"));
-               frame->add (output_table);
+               frame->add (*output_table);
                hpacker.pack_end (*frame, true, true);
+               output_table->show_all ();
+       } else {
+               delete output_table;
        }
-
-       output_update ();
-
-       output_table.show_all ();
-       button_table.show_all ();
-
-       automation_manual_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Off));
-       automation_play_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Play));
-       automation_write_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Write));
-       automation_touch_all_button.signal_clicked.connect(sigc::bind (sigc::mem_fun (*this, &GenericPluginUI::set_all_automation), ARDOUR::Touch));
 }
 
 GenericPluginUI::ControlUI::ControlUI (const Evoral::Parameter& p)
index ca855d0571d4dfb86ecd89d9fae321d21ce96481..207f7db984bae2f96fb2746b93fdb7fd9450353b 100644 (file)
@@ -194,17 +194,8 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
 
   private:
        Gtk::VBox main_contents;
-
        Gtk::HBox settings_box;
        Gtk::HBox hpacker;
-
-       Gtk::Table button_table;
-       Gtk::Table output_table;
-
-       Gtk::ScrolledWindow scroller;
-       Gtk::Adjustment hAdjustment;
-       Gtk::Adjustment vAdjustment;
-       Gtk::Viewport scroller_view;
        Gtk::Menu* automation_menu;
 
        gint prefheight;
@@ -229,11 +220,6 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
                }
        };
 
-       static const int32_t initial_button_rows = 12;
-       static const int32_t initial_button_cols = 1;
-       static const int32_t initial_output_rows = 1;
-       static const int32_t initial_output_cols = 4;
-
        /* FIXME: Unify with AutomationController */
        struct ControlUI : public Gtk::HBox {
 
@@ -275,6 +261,8 @@ class GenericPluginUI : public PlugUIBase, public Gtk::VBox
        void output_update();
 
        void build ();
+       void layout (const std::vector<ControlUI *>& control_uis);
+
        ControlUI* build_control_ui (const Evoral::Parameter&                     param,
                                     const ARDOUR::ParameterDescriptor&           desc,
                                     boost::shared_ptr<ARDOUR::AutomationControl> mcontrol,