diff options
author | Mateusz Łukasik <mati75@linuxmint.pl> | 2016-04-03 13:42:15 +0200 |
---|---|---|
committer | Mateusz Łukasik <mati75@linuxmint.pl> | 2016-04-03 13:42:15 +0200 |
commit | 6f99159ef80694a47b9e7acae189efa7702b3148 (patch) | |
tree | 80a1dd972eaf8d828d1cf8b12c3487a794a57097 /src/libaudqt | |
parent | 7f08dcfc78675bed63f962f6d01cfb18264e12c7 (diff) |
Imported Upstream version 3.7.2
Diffstat (limited to 'src/libaudqt')
-rw-r--r-- | src/libaudqt/prefs-builder.cc | 5 | ||||
-rw-r--r-- | src/libaudqt/prefs-plugin.cc | 35 | ||||
-rw-r--r-- | src/libaudqt/prefs-widget.cc | 56 | ||||
-rw-r--r-- | src/libaudqt/prefs-widget.h | 32 |
4 files changed, 80 insertions, 48 deletions
diff --git a/src/libaudqt/prefs-builder.cc b/src/libaudqt/prefs-builder.cc index 7ff1605..33cd0e9 100644 --- a/src/libaudqt/prefs-builder.cc +++ b/src/libaudqt/prefs-builder.cc @@ -84,7 +84,7 @@ void prefs_populate (QBoxLayout * layout, ArrayRef<PreferencesWidget> widgets, c /* enable/disable child widgets */ if (parent_widget) - parent_widget->update (); + parent_widget->update_from_cfg (); parent_widget = nullptr; } @@ -191,6 +191,7 @@ void prefs_populate (QBoxLayout * layout, ArrayRef<PreferencesWidget> widgets, c { QFrame * f = new QFrame; f->setFrameShape (w.data.separator.horizontal ? QFrame::HLine : QFrame::VLine); + f->setFrameShadow (QFrame::Sunken); layout->addWidget (f); break; } @@ -204,7 +205,7 @@ void prefs_populate (QBoxLayout * layout, ArrayRef<PreferencesWidget> widgets, c /* enable/disable child widgets */ if (parent_widget) - parent_widget->update (); + parent_widget->update_from_cfg (); } } // namespace audqt diff --git a/src/libaudqt/prefs-plugin.cc b/src/libaudqt/prefs-plugin.cc index 0853f45..8b38950 100644 --- a/src/libaudqt/prefs-plugin.cc +++ b/src/libaudqt/prefs-plugin.cc @@ -78,7 +78,7 @@ EXPORT void plugin_prefs (PluginHandle * ph) { ConfigWindow * cw = find_config_window (ph); - if (cw) + if (cw && cw->root) { window_bring_to_front (cw->root); return; @@ -92,15 +92,25 @@ EXPORT void plugin_prefs (PluginHandle * ph) if (! p) return; - cw = new ConfigWindow; - config_windows.append (cw); + if (! cw) + { + cw = new ConfigWindow {ph}; + config_windows.append (cw); + } - cw->ph = ph; cw->root = new QDialog; + cw->root->setAttribute (Qt::WA_DeleteOnClose); if (p->init) p->init (); + QObject::connect (cw->root, & QObject::destroyed, [p, cw] () { + if (p->cleanup) + p->cleanup (); + + cw->root = nullptr; + }); + const char * name = header->info.name; if (header->info.domain) name = dgettext (header->info.domain, name); @@ -108,8 +118,9 @@ EXPORT void plugin_prefs (PluginHandle * ph) cw->root->setWindowTitle ((const char *) str_printf(_("%s Settings"), name)); QVBoxLayout * vbox = new QVBoxLayout (cw->root); - + vbox->setContentsMargins (4, 4, 4, 4); vbox->setSpacing (4); + prefs_populate (vbox, p->widgets, header->info.domain); vbox->addStretch (1); @@ -121,23 +132,19 @@ EXPORT void plugin_prefs (PluginHandle * ph) bbox->button (QDialogButtonBox::Ok)->setText (translate_str (N_("_Set"))); bbox->button (QDialogButtonBox::Cancel)->setText (translate_str (N_("_Cancel"))); - QObject::connect (bbox, & QDialogButtonBox::accepted, [=] () { - if (p->apply) - p->apply (); - - cw->root->hide (); + QObject::connect (bbox, & QDialogButtonBox::accepted, [p, cw] () { + p->apply (); + cw->root->deleteLater (); }); - - QObject::connect (bbox, & QDialogButtonBox::rejected, cw->root, & QWidget::hide); } else { bbox->setStandardButtons (QDialogButtonBox::Close); bbox->button (QDialogButtonBox::Close)->setText (translate_str (N_("_Close"))); - - QObject::connect (bbox, & QDialogButtonBox::rejected, cw->root, & QWidget::hide); } + QObject::connect (bbox, & QDialogButtonBox::rejected, cw->root, & QObject::deleteLater); + vbox->addWidget (bbox); window_bring_to_front (cw->root); diff --git a/src/libaudqt/prefs-widget.cc b/src/libaudqt/prefs-widget.cc index fded84a..f4f2dfc 100644 --- a/src/libaudqt/prefs-widget.cc +++ b/src/libaudqt/prefs-widget.cc @@ -21,6 +21,7 @@ #include "libaudqt.h" #include <assert.h> +#include <math.h> #include <QButtonGroup> #include <QComboBox> @@ -34,6 +35,21 @@ namespace audqt { +HookableWidget::HookableWidget (const PreferencesWidget * parent, const char * domain) : + m_parent (parent), m_domain (domain) +{ + if (m_parent->cfg.hook) + hook.capture (new HookReceiver<HookableWidget> + {m_parent->cfg.hook, this, & HookableWidget::update_from_cfg}); +} + +void HookableWidget::update_from_cfg () +{ + m_updating = true; + update (); + m_updating = false; +} + /* button */ ButtonWidget::ButtonWidget (const PreferencesWidget * parent, const char * domain) : QPushButton (translate_str (parent->label, domain)) @@ -49,6 +65,8 @@ BooleanWidget::BooleanWidget (const PreferencesWidget * parent, const char * dom update (); QObject::connect (this, & QCheckBox::stateChanged, [this] (int state) { + if (m_updating) + return; m_parent->cfg.set_bool (state != Qt::Unchecked); if (m_child_layout) enable_layout (m_child_layout, state != Qt::Unchecked); @@ -74,9 +92,11 @@ RadioButtonWidget::RadioButtonWidget (const PreferencesWidget * parent, update (); - QObject::connect (this, & QAbstractButton::clicked, [parent] (bool checked) { + QObject::connect (this, & QAbstractButton::toggled, [this] (bool checked) { + if (m_updating) + return; if (checked) - parent->cfg.set_int (parent->data.radio_btn.value); + m_parent->cfg.set_int (m_parent->data.radio_btn.value); }); } @@ -98,6 +118,8 @@ IntegerWidget::IntegerWidget (const PreferencesWidget * parent, const char * dom if (parent->label) layout->addWidget (new QLabel (translate_str (parent->label, domain))); + m_spinner->setRange ((int) m_parent->data.spin_btn.min, (int) m_parent->data.spin_btn.max); + m_spinner->setSingleStep ((int) m_parent->data.spin_btn.step); layout->addWidget (m_spinner); if (parent->data.spin_btn.right_label) @@ -112,15 +134,14 @@ IntegerWidget::IntegerWidget (const PreferencesWidget * parent, const char * dom * cast to the type of the correct valueChanged signal. --kaniini. */ void (QSpinBox::* signal) (int) = & QSpinBox::valueChanged; - QObject::connect (m_spinner, signal, [parent] (int value) { - parent->cfg.set_int (value); + QObject::connect (m_spinner, signal, [this] (int value) { + if (! m_updating) + m_parent->cfg.set_int (value); }); } void IntegerWidget::update () { - m_spinner->setRange ((int) m_parent->data.spin_btn.min, (int) m_parent->data.spin_btn.max); - m_spinner->setSingleStep ((int) m_parent->data.spin_btn.step); m_spinner->setValue (m_parent->cfg.get_int ()); } @@ -136,6 +157,12 @@ DoubleWidget::DoubleWidget (const PreferencesWidget * parent, const char * domai if (parent->label) layout->addWidget (new QLabel (translate_str (parent->label, domain))); + auto decimals_for = [] (double step) + { return aud::max (0, -(int) floor (log10 (step) + 0.01)); }; + + m_spinner->setDecimals (decimals_for (m_parent->data.spin_btn.step)); + m_spinner->setRange (m_parent->data.spin_btn.min, m_parent->data.spin_btn.max); + m_spinner->setSingleStep (m_parent->data.spin_btn.step); layout->addWidget (m_spinner); if (parent->data.spin_btn.right_label) @@ -146,15 +173,14 @@ DoubleWidget::DoubleWidget (const PreferencesWidget * parent, const char * domai update (); void (QDoubleSpinBox::* signal) (double) = & QDoubleSpinBox::valueChanged; - QObject::connect (m_spinner, signal, [parent] (double value) { - parent->cfg.set_float (value); + QObject::connect (m_spinner, signal, [this] (double value) { + if (! m_updating) + m_parent->cfg.set_float (value); }); } void DoubleWidget::update () { - m_spinner->setRange (m_parent->data.spin_btn.min, m_parent->data.spin_btn.max); - m_spinner->setSingleStep (m_parent->data.spin_btn.step); m_spinner->setValue (m_parent->cfg.get_float ()); } @@ -177,8 +203,9 @@ StringWidget::StringWidget (const PreferencesWidget * parent, const char * domai update (); - QObject::connect (m_lineedit, & QLineEdit::textChanged, [parent] (const QString & value) { - parent->cfg.set_string (value.toUtf8 ()); + QObject::connect (m_lineedit, & QLineEdit::textChanged, [this] (const QString & value) { + if (! m_updating) + m_parent->cfg.set_string (value.toUtf8 ()); }); } @@ -206,6 +233,9 @@ ComboBoxWidget::ComboBoxWidget (const PreferencesWidget * parent, const char * d void (QComboBox::* signal) (int) = & QComboBox::currentIndexChanged; QObject::connect (m_combobox, signal, [this] (int idx) { + if (m_updating) + return; + QVariant data = m_combobox->itemData (idx); switch (m_parent->cfg.type) @@ -319,7 +349,7 @@ NotebookWidget::NotebookWidget (const PreferencesWidget * parent, const char * d { auto widget = new QWidget (this); auto layout = new QVBoxLayout (widget); - layout->setContentsMargins (0, 0, 0, 0); + layout->setContentsMargins (4, 4, 4, 4); layout->setSpacing (4); prefs_populate (layout, tab.widgets, domain); diff --git a/src/libaudqt/prefs-widget.h b/src/libaudqt/prefs-widget.h index 3603956..f4deb4f 100644 --- a/src/libaudqt/prefs-widget.h +++ b/src/libaudqt/prefs-widget.h @@ -50,22 +50,19 @@ namespace audqt { */ /* base class which provides plumbing for hooks. */ -class HookableWidget -{ +class HookableWidget { +public: + void update_from_cfg (); + protected: - HookableWidget (const PreferencesWidget * parent, const char * domain) : - m_parent (parent), m_domain (domain) - { - if (m_parent->cfg.hook) - hook.capture (new HookReceiver<HookableWidget> - {m_parent->cfg.hook, this, & HookableWidget::update}); - } + HookableWidget (const PreferencesWidget * parent, const char * domain); virtual ~HookableWidget () {} virtual void update () {} const PreferencesWidget * const m_parent; const char * const m_domain; + bool m_updating = false; private: SmartPtr<HookReceiver<HookableWidget>> hook; @@ -78,15 +75,15 @@ public: }; /* boolean widget (checkbox) */ -class BooleanWidget : public QCheckBox, HookableWidget { +class BooleanWidget : public QCheckBox, public HookableWidget { public: BooleanWidget (const PreferencesWidget * parent, const char * domain); - void update (); void set_child_layout (QLayout * layout) { m_child_layout = layout; } private: + void update (); QLayout * m_child_layout = nullptr; }; @@ -94,9 +91,8 @@ private: class IntegerWidget : public QWidget, HookableWidget { public: IntegerWidget (const PreferencesWidget * parent, const char * domain); - void update (); - private: + void update (); QSpinBox * m_spinner; }; @@ -105,6 +101,7 @@ class RadioButtonWidget : public QRadioButton, HookableWidget { public: RadioButtonWidget (const PreferencesWidget * parent, const char * domain, QButtonGroup * btn_group); +private: void update (); }; @@ -112,9 +109,8 @@ public: class DoubleWidget : public QWidget, HookableWidget { public: DoubleWidget (const PreferencesWidget * parent, const char * domain); - void update (); - private: + void update (); QDoubleSpinBox * m_spinner; }; @@ -122,9 +118,8 @@ private: class StringWidget : public QWidget, HookableWidget { public: StringWidget (const PreferencesWidget * parent, const char * domain); - void update (); - private: + void update (); QLineEdit * m_lineedit; }; @@ -132,9 +127,8 @@ private: class ComboBoxWidget : public QWidget, HookableWidget { public: ComboBoxWidget (const PreferencesWidget * parent, const char * domain); - void update (); - private: + void update (); QComboBox * m_combobox; }; |