diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2016-12-09 12:34:08 +0100 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2016-12-09 12:34:08 +0100 |
commit | 31556c06af55ae63d2a29ddf4888e35e4bcb5782 (patch) | |
tree | 77d616eb8f6fef860d2bff1b9b166fc6df1e67d9 | |
parent | 1122994bfa7a1ea61d3e8bcc262b21954aca2fdd (diff) |
gui: factor out dialog creation function
Also, need to drain the event loop following QWidget::adjustSize. Otherwise the
following resize still uses the old values.
-rw-r--r-- | gui/main-window.cpp | 82 |
1 files changed, 40 insertions, 42 deletions
diff --git a/gui/main-window.cpp b/gui/main-window.cpp index d760783b..9e90a016 100644 --- a/gui/main-window.cpp +++ b/gui/main-window.cpp @@ -568,30 +568,26 @@ void MainWindow::showHeadPose() display_pose(mapped, raw); } -template<typename t> -bool mk_dialog(mem<dylib> lib, ptr<t>& orig) +template<typename t, typename F> +static bool mk_window_common(ptr<t>& d, F&& ctor) { - if (orig && orig->isVisible()) + if (d) { - QDialog& d = *orig; - d.show(); - d.raise(); + d->show(); + d->raise(); + return false; } - - if (lib && lib->Dialog) + else if ((d = ptr<t>(ctor()))) { - t* dialog = reinterpret_cast<t*>(lib->Dialog()); - QDialog& d = *dialog; - d.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - d.adjustSize(); - d.setFixedSize(d.size()); - d.setWindowFlags(Qt::MSWindowsFixedSizeDialogHint | d.windowFlags()); - d.show(); + QEventLoop e(QThread::currentThread()); - orig.reset(dialog); + d->adjustSize(); + e.processEvents(); - QObject::connect(dialog, &plugin_api::detail::BaseDialog::closing, [&]() -> void { orig = nullptr; }); + // drain the event loop to reflow properly + d->setWindowFlags(Qt::MSWindowsFixedSizeDialogHint | d->windowFlags()); e.processEvents(); + d->show(); e.processEvents(); return true; } @@ -599,6 +595,31 @@ bool mk_dialog(mem<dylib> lib, ptr<t>& orig) return false; } +template<typename t, typename... Args> +static bool mk_window(ptr<t>& place, Args&&... params) +{ + return mk_window_common(place, [&]() { return new t(std::forward<Args>(params)...); }); +} + +template<typename t> +bool mk_dialog(mem<dylib> lib, ptr<t>& d) +{ + const bool just_created = mk_window_common(d, [&]() -> t* { + if (lib) + return reinterpret_cast<t*>(lib->Dialog()); + return nullptr; + }); + + if (just_created) + { + using plugin_api::detail::BaseDialog; + QObject::connect(static_cast<BaseDialog*>(d.get()), &BaseDialog::closing, + qApp->instance(), [&d]() { d = nullptr; }); + } + + return just_created; +} + void MainWindow::showTrackerSettings() { if (mk_dialog(current_tracker(), pTrackerDialog) && libs.pTracker) @@ -617,32 +638,9 @@ void MainWindow::showFilterSettings() pFilterDialog->register_filter(libs.pFilter.get()); } -template<typename t, typename... Args> -static bool mk_window(ptr<t>* place, Args&&... params) -{ - if (*place && (*place)->isVisible()) - { - QDialog& d = **place; - d.show(); - d.raise(); - return false; - } - else - { - *place = make_unique<t>(std::forward<Args>(params)...); - QDialog& d = **place; - d.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - d.adjustSize(); - d.setFixedSize(d.size()); - d.setWindowFlags(Qt::MSWindowsFixedSizeDialogHint | d.windowFlags()); - d.show(); - return true; - } -} - void MainWindow::show_options_dialog() { - if (mk_window(&options_widget, [&](bool flag) -> void { set_keys_enabled(!flag); })) + if (mk_window(options_widget, [&](bool flag) -> void { set_keys_enabled(!flag); })) { connect(options_widget.get(), &OptionsDialog::closing, this, &MainWindow::register_shortcuts); } @@ -650,7 +648,7 @@ void MainWindow::show_options_dialog() void MainWindow::showCurveConfiguration() { - mk_window(&mapping_widget, pose); + mk_window(mapping_widget, pose); } void MainWindow::exit() |