X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fluadialog.cc;h=5932b234df99e0ce46ff4abe5de5f98b099fd95a;hb=b06713bd8e57a33bdb4544a3de249933e984f1be;hp=04040c820162bc9499e17edcf06fdd6de9d01c2d;hpb=f6e182b937efda6ed0ba50dbc02af98524beb61c;p=ardour.git diff --git a/gtk2_ardour/luadialog.cc b/gtk2_ardour/luadialog.cc index 04040c8201..5932b234df 100644 --- a/gtk2_ardour/luadialog.cc +++ b/gtk2_ardour/luadialog.cc @@ -16,6 +16,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include + #include #include "ardour/dB.h" @@ -26,8 +28,10 @@ #include "widgets/ardour_dropdown.h" #include "widgets/slider_controller.h" +#include "stripable_colorpicker.h" #include "ardour_dialog.h" #include "luadialog.h" +#include "splash.h" #include "utils.h" using namespace LuaDialog; @@ -44,8 +48,24 @@ Message::Message (std::string const& title, std::string const& msg, Message::Mes int Message::run () { + + bool splash_pushed = false; + Splash* spl = Splash::instance(); + if (spl && spl->is_visible()) { + spl->pop_back_for (_message_dialog); + splash_pushed = true; + } + int rv = _message_dialog.run (); _message_dialog.hide (); + + if (splash_pushed) { + spl = Splash::instance(); + if (spl) { + spl->pop_front(); + } + } + switch (rv) { case Gtk::RESPONSE_OK: return 0; @@ -108,29 +128,76 @@ class LuaDialogLabel : public LuaDialogWidget { public: LuaDialogLabel (std::string const& title, Gtk::AlignmentEnum xalign) - : LuaDialogWidget ("", "") - , _lbl ("" + title + "", xalign, Gtk::ALIGN_CENTER, false) + : LuaDialogWidget ("", "", 0, 2) + , _lbl (title, xalign, Gtk::ALIGN_CENTER, false) + { } + + Gtk::Widget* widget () + { + return &_lbl; + } + + void assign (luabridge::LuaRef* rv) const { } +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 &_lbl; + return &_sep; } void assign (luabridge::LuaRef* rv) const { } protected: - Gtk::Label _lbl; + Gtk::HSeparator _sep; +}; + +class LuaColorPicker : public LuaDialogWidget +{ +public: + LuaColorPicker (std::string const& key) + : LuaDialogWidget (key, "", 0, 1) + {} + + Gtk::Widget* widget () + { + return &_cs; + } + void assign (luabridge::LuaRef* rv) const { + uint32_t rgba = ARDOUR_UI_UTILS::gdk_color_to_rgba(_cs.get_color()); + (*rv)[_key] = rgba; + } +protected: + Gtk::ColorButton _cs; }; 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); } @@ -406,18 +473,27 @@ protected: void populate (Gtk::Menu_Helpers::MenuList& items, luabridge::LuaRef values, std::string const& dflt) { using namespace Gtk::Menu_Helpers; + std::vector keys; + for (luabridge::Iterator i (values); !i.isNil (); ++i) { if (!i.key ().isString ()) { continue; } - std::string key = i.key ().cast (); - if (i.value ().isTable ()) { + keys.push_back (i.key ().cast ()); + } + + std::sort (keys.begin(), keys.end()); + + for (std::vector::const_iterator i = keys.begin (); i != keys.end(); ++i) { + std::string key = *i; + + if (values[key].isTable ()) { Gtk::Menu* menu = Gtk::manage (new Gtk::Menu); items.push_back (MenuElem (key, *menu)); - populate (menu->items (), i.value (), dflt); + populate (menu->items (), values[key], dflt); continue; } - luabridge::LuaRef* ref = new luabridge::LuaRef (i.value ()); + luabridge::LuaRef* ref = new luabridge::LuaRef (values[key]); _refs.push_back (ref); - items.push_back (MenuElem (i.key ().cast (), + items.push_back (MenuElem (key, sigc::bind (sigc::mem_fun (*this, &LuaDialogDropDown::dd_select), key, ref))); if (!_rv || key == dflt) { @@ -448,14 +524,8 @@ public: switch (a) { case Gtk::FILE_CHOOSER_ACTION_OPEN: case Gtk::FILE_CHOOSER_ACTION_SAVE: - if (Glib::file_test (path, Glib::FILE_TEST_IS_REGULAR|Glib::FILE_TEST_EXISTS)) { - _fc.set_filename (path); - } - break; case Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER: - if (Glib::file_test (path, Glib::FILE_TEST_IS_DIR|Glib::FILE_TEST_EXISTS)) { - _fc.set_filename (path); - } + _fc.set_filename (path); break; case Gtk::FILE_CHOOSER_ACTION_CREATE_FOLDER: break; @@ -497,6 +567,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* w = NULL; if (type == "heading") { Gtk::AlignmentEnum xalign = Gtk::ALIGN_CENTER; @@ -508,25 +585,37 @@ Dialog::Dialog (std::string const& title, luabridge::LuaRef lr) xalign = Gtk::ALIGN_RIGHT; } } - _widgets.push_back (new LuaDialogLabel (title, xalign)); + 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; } - - if (!i.value ()["key"].isString ()) { continue; } - std::string key = i.value ()["key"].cast (); - - if (type == "checkbox") { + else if (type == "checkbox") { bool dflt = false; if (i.value ()["default"].isBoolean ()) { dflt = i.value ()["default"].cast (); } - _widgets.push_back (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 (); } - _widgets.push_back (new LuaDialogEntry (key, title, dflt)); + w = new LuaDialogEntry (key, title, dflt); } else if (type == "radio") { std::string dflt; if (!i.value ()["values"].isTable ()) { @@ -535,13 +624,13 @@ Dialog::Dialog (std::string const& title, luabridge::LuaRef lr) if (i.value ()["default"].isString ()) { dflt = i.value ()["default"].cast (); } - _widgets.push_back (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 (); } - _widgets.push_back (new LuaDialogFader (key, title, dflt)); + w = new LuaDialogFader (key, title, dflt); } else if (type == "slider") { double lower, upper, dflt; int digits = 0; @@ -557,7 +646,7 @@ Dialog::Dialog (std::string const& title, luabridge::LuaRef lr) if (i.value ()["digits"].isNumber ()) { digits = i.value ()["digits"].cast (); } - _widgets.push_back (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; @@ -578,7 +667,7 @@ Dialog::Dialog (std::string const& title, luabridge::LuaRef lr) if (i.value ()["digits"].isNumber ()) { digits = i.value ()["digits"].cast (); } - _widgets.push_back (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 ()) { @@ -587,19 +676,31 @@ Dialog::Dialog (std::string const& title, luabridge::LuaRef lr) if (i.value ()["default"].isString ()) { dflt = i.value ()["default"].cast (); } - _widgets.push_back (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 (); } - _widgets.push_back (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 (); } - _widgets.push_back (new LuaFileChooser (key, title, Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER, path)); + w = new LuaFileChooser (key, title, Gtk::FILE_CHOOSER_ACTION_SELECT_FOLDER, path); + } else if (type == "color") { + w = new LuaColorPicker (key); + } + + if (w) { + if (i.value ()["col"].isNumber ()) { + w->set_col (i.value ()["col"].cast ()); + } + if (i.value ()["colspan"].isNumber ()) { + w->set_span (i.value ()["colspan"].cast ()); + } + _widgets.push_back(w); } } @@ -607,23 +708,46 @@ Dialog::Dialog (std::string const& title, luabridge::LuaRef lr) _ad.add_button (Gtk::Stock::OK, Gtk::RESPONSE_ACCEPT); Gtk::Table* table = Gtk::manage (new Gtk::Table ()); - table->set_col_spacings (4); + table->set_col_spacings (20); table->set_row_spacings (8); - _ad.get_vbox ()->pack_start (*table); + table->signal_size_allocate ().connect (sigc::mem_fun (this, &Dialog::table_size_alloc)); + + _scroller.set_shadow_type(Gtk::SHADOW_NONE); + _scroller.set_border_width(0); + _scroller.add (*table); + _scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_NEVER); + + _ad.get_vbox ()->pack_start (_scroller); + int row = 0; + int last_end = -1; for (DialogWidgets::const_iterator i = _widgets.begin (); i != _widgets.end (); ++i) { + int col = (*i)->col(); + int cend = col + (*i)->span(); + + if (col < last_end) { + ++row; + } + last_end = cend; + std::string const& label = (*i)->label (); if (!label.empty ()) { + /* items with implicit label (title) */ Gtk::Label* lbl = Gtk::manage (new Gtk::Label (label + ":", Gtk::ALIGN_END, Gtk::ALIGN_CENTER, false)); - table->attach (*lbl, 0, 1, row, row + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK); - table->attach (*((*i)->widget ()), 1, 2, row, row + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK); - } else if ((*i)->key ().empty ()) { - table->attach (*((*i)->widget ()), 0, 2, 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 ()), 1, 2, row, row + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK); + table->attach (*((*i)->widget ()), col, cend, row, row + 1, Gtk::FILL | Gtk::EXPAND, Gtk::SHRINK); } - ++row; } } @@ -654,3 +778,13 @@ Dialog::run (lua_State *L) luabridge::push (L, rv); return 1; } + +void +Dialog::table_size_alloc (Gtk::Allocation& allocation) +{ + /* XXX: consider using 0.75 * screen-height instead of 512 */ + if (allocation.get_height () > 512) { + _scroller.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); + _ad.set_size_request (-1, 512); + } +}