From 91a2cf79014812f75b49f65b0c9c29952d8784eb Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sat, 19 Aug 2017 03:12:28 +0200 Subject: [PATCH] Backwards compatible LuaDialog layout (+new colspan option) --- gtk2_ardour/luadialog.cc | 123 ++++++++++++++++++++++++++++----------- gtk2_ardour/luadialog.h | 19 ++++-- scripts/_tracks_band.lua | 48 +++++++-------- 3 files changed, 127 insertions(+), 63 deletions(-) diff --git a/gtk2_ardour/luadialog.cc b/gtk2_ardour/luadialog.cc index 8976fe6c13..28e092c3ed 100644 --- a/gtk2_ardour/luadialog.cc +++ b/gtk2_ardour/luadialog.cc @@ -125,11 +125,9 @@ class LuaDialogLabel : public LuaDialogWidget { public: LuaDialogLabel (std::string const& title, Gtk::AlignmentEnum xalign) - : LuaDialogWidget ("", "") - , _lbl ("" + title + "", xalign, Gtk::ALIGN_CENTER, false) - { - _lbl.set_use_markup (); - } + : LuaDialogWidget ("", "", 0, 2) + , _lbl (title, xalign, Gtk::ALIGN_CENTER, false) + { } Gtk::Widget* widget () { @@ -141,13 +139,43 @@ protected: Gtk::Label _lbl; }; + +class LuaDialogHeading : public LuaDialogLabel +{ +public: + LuaDialogHeading (std::string const& title, Gtk::AlignmentEnum xalign) + : LuaDialogLabel ("" + title + "", xalign) + { + _lbl.set_use_markup (); + } +}; + +class LuaHSeparator : public LuaDialogWidget +{ +public: + LuaHSeparator () + : LuaDialogWidget ("", "", 0, 2) + {} + + Gtk::Widget* widget () + { + return &_sep; + } + + void assign (luabridge::LuaRef* rv) const { } +protected: + Gtk::HSeparator _sep; +}; + class LuaDialogCheckbox : public LuaDialogWidget { public: LuaDialogCheckbox (std::string const& key, std::string const& title, bool on) - : LuaDialogWidget (key, "") - , _cb (title) + : LuaDialogWidget (key, "", 1, 1) { + if (!title.empty ()) { + _cb.add_label (title, false, 0); + } _cb.set_active (on); } @@ -514,13 +542,13 @@ Dialog::Dialog (std::string const& title, luabridge::LuaRef lr) std::string title = i.value ()["title"].cast (); std::string type = i.value ()["type"].cast (); - std::string key; + if (i.value ()["key"].isString ()) { key = i.value ()["key"].cast (); } - LuaDialogWidget *widge; + LuaDialogWidget* w = NULL; if (type == "heading") { Gtk::AlignmentEnum xalign = Gtk::ALIGN_CENTER; @@ -532,19 +560,37 @@ Dialog::Dialog (std::string const& title, luabridge::LuaRef lr) xalign = Gtk::ALIGN_RIGHT; } } - widge = new LuaDialogLabel (title, xalign); - } else if (type == "checkbox") { + w = new LuaDialogHeading (title, xalign); + } else if (type == "label") { + Gtk::AlignmentEnum xalign = Gtk::ALIGN_CENTER; + if (i.value ()["align"].isString ()) { + std::string align = i.value ()["align"].cast (); + if (align == "left") { + xalign = Gtk::ALIGN_LEFT; + } else if (align == "right") { + xalign = Gtk::ALIGN_RIGHT; + } + } + w = new LuaDialogLabel (title, xalign); + } else if (type == "hseparator") { + w = new LuaHSeparator (); + } + /* the following widgets do require a key */ + else if (key.empty ()) { + continue; + } + else if (type == "checkbox") { bool dflt = false; if (i.value ()["default"].isBoolean ()) { dflt = i.value ()["default"].cast (); } - widge = new LuaDialogCheckbox (key, title, dflt); + w = new LuaDialogCheckbox (key, title, dflt); } else if (type == "entry") { std::string dflt; if (i.value ()["default"].isString ()) { dflt = i.value ()["default"].cast (); } - widge = new LuaDialogEntry (key, title, dflt); + w = new LuaDialogEntry (key, title, dflt); } else if (type == "radio") { std::string dflt; if (!i.value ()["values"].isTable ()) { @@ -553,13 +599,13 @@ Dialog::Dialog (std::string const& title, luabridge::LuaRef lr) if (i.value ()["default"].isString ()) { dflt = i.value ()["default"].cast (); } - widge = new LuaDialogRadio (key, title, i.value ()["values"], dflt); + w = new LuaDialogRadio (key, title, i.value ()["values"], dflt); } else if (type == "fader") { double dflt = 0; if (i.value ()["default"].isNumber ()) { dflt = i.value ()["default"].cast (); } - widge = new LuaDialogFader (key, title, dflt); + w = new LuaDialogFader (key, title, dflt); } else if (type == "slider") { double lower, upper, dflt; int digits = 0; @@ -575,7 +621,7 @@ Dialog::Dialog (std::string const& title, luabridge::LuaRef lr) if (i.value ()["digits"].isNumber ()) { digits = i.value ()["digits"].cast (); } - widge = new LuaDialogSlider (key, title, lower, upper, dflt, digits, i.value ()["scalepoints"]); + w = new LuaDialogSlider (key, title, lower, upper, dflt, digits, i.value ()["scalepoints"]); } else if (type == "number") { double lower, upper, dflt, step; int digits = 0; @@ -596,7 +642,7 @@ Dialog::Dialog (std::string const& title, luabridge::LuaRef lr) if (i.value ()["digits"].isNumber ()) { digits = i.value ()["digits"].cast (); } - widge = new LuaDialogSpinBox (key, title, lower, upper, dflt, step, digits); + w = new LuaDialogSpinBox (key, title, lower, upper, dflt, step, digits); } else if (type == "dropdown") { std::string dflt; if (!i.value ()["values"].isTable ()) { @@ -605,27 +651,29 @@ Dialog::Dialog (std::string const& title, luabridge::LuaRef lr) if (i.value ()["default"].isString ()) { dflt = i.value ()["default"].cast (); } - widge = new LuaDialogDropDown (key, title, i.value ()["values"], dflt); + w = new LuaDialogDropDown (key, title, i.value ()["values"], dflt); } else if (type == "file") { std::string path; if (i.value ()["path"].isString ()) { path = i.value ()["path"].cast (); } - widge = new LuaFileChooser (key, title, Gtk::FILE_CHOOSER_ACTION_OPEN, path); + w = new LuaFileChooser (key, title, Gtk::FILE_CHOOSER_ACTION_OPEN, path); } else if (type == "folder") { std::string path; if (i.value ()["path"].isString ()) { path = i.value ()["path"].cast (); } - widge = new LuaFileChooser (key, title, Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER, path); + w = new LuaFileChooser (key, title, Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER, path); } - if (widge) { - _widgets.push_back(widge); - + if (w) { if (i.value ()["col"].isNumber ()) { - widge->set_col (i.value ()["col"].cast ()); + w->set_col (i.value ()["col"].cast ()); } + if (i.value ()["colspan"].isNumber ()) { + w->set_span (i.value ()["colspan"].cast ()); + } + _widgets.push_back(w); } } @@ -636,26 +684,35 @@ Dialog::Dialog (std::string const& title, luabridge::LuaRef lr) table->set_col_spacings (20); table->set_row_spacings (8); _ad.get_vbox ()->pack_start (*table); + int row = 0; + int last_end = -1; for (DialogWidgets::const_iterator i = _widgets.begin (); i != _widgets.end (); ++i) { int col = (*i)->col(); - if (col <= 0) { + int cend = col + (*i)->span(); + + if (col < last_end) { ++row; } + last_end = cend; std::string const& label = (*i)->label (); if (!label.empty ()) { - Gtk::HBox* hb = Gtk::manage (new Gtk::HBox()); + /* items with implicit label (title) */ Gtk::Label* lbl = Gtk::manage (new Gtk::Label (label + ":", Gtk::ALIGN_END, Gtk::ALIGN_CENTER, false)); - hb->set_spacing(4); - hb->pack_start (*lbl, true, false); - hb->pack_start (*(*i)->widget (), true, false); - table->attach (*hb, col+0, col+1, row, row + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK); - } else if ((*i)->key ().empty ()) { - table->attach (*((*i)->widget ()), col+0, col+1, row, row + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK); + if (cend - col > 1) { + table->attach (*lbl, col, col + 1, row, row + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK); + table->attach (*((*i)->widget ()), col + 1, cend, row, row + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK); + } else { + Gtk::HBox* hb = Gtk::manage (new Gtk::HBox()); + hb->set_spacing(4); + hb->pack_start (*lbl, true, false); + hb->pack_start (*(*i)->widget (), true, false); + table->attach (*hb, col, cend, row, row + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK); + } } else { - table->attach (*((*i)->widget ()), col+0, col+1, row, row + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK); + table->attach (*((*i)->widget ()), col, cend, row, row + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK); } } } diff --git a/gtk2_ardour/luadialog.h b/gtk2_ardour/luadialog.h index 16ee513199..a022a8b6f6 100644 --- a/gtk2_ardour/luadialog.h +++ b/gtk2_ardour/luadialog.h @@ -53,24 +53,31 @@ private: class LuaDialogWidget { public: - LuaDialogWidget (std::string const& key, std::string const& label, int col = 0) - : _key (key), _label (label), _col (col) - {} + LuaDialogWidget (std::string const& key, std::string const& label, int col = 0, int colspan = -1) + : _key (key), _label (label), _col (col), _colspan (colspan) + { + if (_colspan < 0) { + _colspan = label.empty () ? 1 : 2; + } + } virtual ~LuaDialogWidget () {} virtual Gtk::Widget* widget () = 0; virtual void assign (luabridge::LuaRef* rv) const = 0; std::string const& label () const { return _label; } - std::string const& key () const { return _key; } - int const& col () const { return _col; } + std::string const& key () const { return _key; } + int col () const { return _col; } + int span () const { return _colspan; } - void set_col (int col) { _col = col; } + void set_col (int col) { _col = col; } + void set_span (int span) { _colspan = span; } protected: std::string _key; std::string _label; int _col; + int _colspan; }; diff --git a/scripts/_tracks_band.lua b/scripts/_tracks_band.lua index c7ca800808..67a9c06561 100644 --- a/scripts/_tracks_band.lua +++ b/scripts/_tracks_band.lua @@ -28,71 +28,71 @@ function factory () return function () --prompt the user for the tracks they'd like to instantiate local dialog_options = { - { type = "heading", title = "Select the tracks you'd like\n to add to your session: " }, - { type = "heading", title = "Name", col=1 }, - { type = "heading", title = "Stereo?", col=2 }, + { type = "heading", title = "Select the tracks you'd like\nto add to your session: ", col=0, align = "left", colspan = 1}, + { type = "heading", title = "Name", col=1, colspan = 1 }, + { type = "heading", title = "Stereo?", col=2, colspan = 1 }, - { type = "checkbox", key = "check-ldvox", default = false, title = "Lead Vocal" }, + { type = "checkbox", key = "check-ldvox", default = false, title = "Lead Vocal", col=0 }, { type = "entry", key = "name-ldvox", default = "Lead Vocal", title = "", col=1 }, { type = "checkbox", key = "stereo-ldvox", default = false, title = "", col=2 }, - { type = "checkbox", key = "check-bass", default = false, title = "Bass" }, + { type = "checkbox", key = "check-bass", default = false, title = "Bass", col=0 }, { type = "entry", key = "name-bass", default = "Bass", title = "", col=1 }, { type = "checkbox", key = "stereo-bass", default = false, title = "", col=2 }, - { type = "checkbox", key = "check-piano", default = false, title = "Piano" }, + { type = "checkbox", key = "check-piano", default = false, title = "Piano", col=0 }, { type = "entry", key = "name-piano", default = "Piano", title = "", col=1 }, { type = "checkbox", key = "stereo-piano", default = false, title = "", col=2 }, - { type = "checkbox", key = "check-electric-piano", default = false, title = "Electric Piano" }, + { type = "checkbox", key = "check-electric-piano", default = false, title = "Electric Piano", col=0 }, { type = "entry", key = "name-electric-piano", default = "E Piano", title = "", col=1 }, { type = "checkbox", key = "stereo-electric-piano", default = false, title = "", col=2 }, - { type = "checkbox", key = "check-organ", default = false, title = "Organ" }, + { type = "checkbox", key = "check-organ", default = false, title = "Organ", col=0 }, { type = "entry", key = "name-organ", default = "Organ", title = "", col=1 }, { type = "checkbox", key = "stereo-organ", default = false, title = "", col=2 }, - { type = "checkbox", key = "check-electric-guitar", default = false, title = "Electric Guitar" }, + { type = "checkbox", key = "check-electric-guitar", default = false, title = "Electric Guitar", col=0 }, { type = "entry", key = "name-electric-guitar", default = "E Guitar", title = "", col=1 }, { type = "checkbox", key = "stereo-electric-guitar", default = false, title = "", col=2 }, - { type = "checkbox", key = "check-solo-guitar", default = false, title = "Lead Guitar" }, + { type = "checkbox", key = "check-solo-guitar", default = false, title = "Lead Guitar", col=0 }, { type = "entry", key = "name-solo-guitar", default = "Ld Gtr", title = "", col=1 }, { type = "checkbox", key = "stereo-solo-guitar", default = false, title = "", col=2 }, - { type = "checkbox", key = "check-accoustic-guitar", default = false, title = "Acoustic Guitar" }, + { type = "checkbox", key = "check-accoustic-guitar", default = false, title = "Acoustic Guitar", col=0 }, { type = "entry", key = "name-accoustic-guitar", default = "Ac Gtr", title = "", col=1 }, { type = "checkbox", key = "stereo-accoustic-guitar", default = false, title = "", col=2 }, - { type = "checkbox", key = "check-basic-kit", default = false, title = "Basic Drum Mics" }, - { type = "heading", title = "(Kick + Snare)", col=1 }, + { type = "checkbox", key = "check-basic-kit", default = false, title = "Basic Drum Mics", col=0 }, + { type = "label", title = "(Kick + Snare)", col=1, colspan = 1, align = "left"}, -- { type = "checkbox", key = "stereo-overhead-mono", default = false, title = "", col=2 }, - { type = "checkbox", key = "check-full-kit", default = false, title = "Full Drum Mics" }, - { type = "heading", title = "(Kick, Snare, HiHat, 3 Toms)", col=1 }, + { type = "checkbox", key = "check-full-kit", default = false, title = "Full Drum Mics", col=0 }, + { type = "label", title = "(Kick, Snare, HiHat, 3 Toms)", col=1, colspan = 1, align = "left"}, -- { type = "checkbox", key = "stereo-overhead-mono", default = false, title = "", col=2 }, - { type = "checkbox", key = "check-overkill-kit", default = false, title = "Overkill Drum Mics" }, - { type = "heading", title = "(Kick (2x), Snare(2x), HiHat, 3 Toms)", col=1 }, + { type = "checkbox", key = "check-overkill-kit", default = false, title = "Overkill Drum Mics", col=0 }, + { type = "label", title = "(Kick (2x), Snare(2x), HiHat, 3 Toms)", col=1, colspan = 1, align = "left"}, -- { type = "checkbox", key = "stereo-overhead-mono", default = false, title = "", col=2 }, - { type = "checkbox", key = "check-overhead", default = false, title = "Drum Overheads" }, + { type = "checkbox", key = "check-overhead", default = false, title = "Drum Overheads", col=0 }, -- { type = "entry", key = "name-ldvox", default = "Lead Vocal", title = "", col=1 }, { type = "checkbox", key = "stereo-overhead", default = false, title = "", col=2 }, - { type = "checkbox", key = "check-room", default = false, title = "Drum Room" }, + { type = "checkbox", key = "check-room", default = false, title = "Drum Room", col=0 }, -- { type = "entry", key = "name-ldvox", default = "Lead Vocal", title = "", col=1 }, { type = "checkbox", key = "stereo-room", default = false, title = "", col=2 }, - { type = "checkbox", key = "check-bgvox", default = false, title = "Background Vocals (3x)" }, + { type = "checkbox", key = "check-bgvox", default = false, title = "Background Vocals (3x)", col=0 }, -- { type = "entry", key = "name-ldvox", default = "Lead Vocal", title = "", col=1 }, { type = "checkbox", key = "stereo-bgvox", default = false, title = "", col=2 }, - { type = "heading", title = "-------------------" }, + { type = "hseparator", title="", col=0, colspan = 3}, - { type = "checkbox", key = "group", default = false, title = "Group Track(s)?" }, - { type = "checkbox", key = "gates", default = false, title = "Add Gate(s)?" }, - { type = "checkbox", key = "char", default = false, title = "Add Character Plugin(s)?" }, + { type = "checkbox", key = "group", default = false, title = "Group Track(s)?", col=0 }, + { type = "checkbox", key = "gates", default = false, title = "Add Gate(s)?", col=0 }, + { type = "checkbox", key = "char", default = false, title = "Add Character Plugin(s)?", col=0 }, } local dlg = LuaDialog.Dialog ("Template Setup", dialog_options)