summaryrefslogtreecommitdiffhomepage
path: root/main-window/module-mixin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'main-window/module-mixin.cpp')
-rw-r--r--main-window/module-mixin.cpp132
1 files changed, 132 insertions, 0 deletions
diff --git a/main-window/module-mixin.cpp b/main-window/module-mixin.cpp
new file mode 100644
index 00000000..67485ba2
--- /dev/null
+++ b/main-window/module-mixin.cpp
@@ -0,0 +1,132 @@
+#include "module-mixin.hpp"
+
+#include <algorithm>
+
+namespace OTR_MIXIN_NS(module_mixin) {
+
+std::tuple<dylib_ptr, int>
+module_mixin::module_by_name(const QString& name, const dylib_list& list) const
+{
+ auto it = std::find_if(list.cbegin(), list.cend(), [&name](const dylib_ptr& lib) {
+ if (!lib)
+ return name.isEmpty();
+ else
+ return name == lib->module_name;
+ });
+
+ if (it == list.cend())
+ return { nullptr, -1 };
+ else
+ return { *it, int(std::distance(list.cbegin(), it)) };
+}
+
+static void show_window(QWidget& d, bool fresh)
+{
+ if (fresh)
+ {
+ d.setWindowFlags(Qt::MSWindowsFixedSizeDialogHint | d.windowFlags());
+ d.setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+
+ d.show();
+ d.adjustSize();
+ d.raise();
+ }
+ else
+ {
+ d.show();
+ d.raise();
+ }
+}
+
+template<typename t, typename F>
+static bool mk_window_common(std::unique_ptr<t>& d, F&& fun)
+{
+ bool fresh = false;
+
+ if (!d)
+ d = fun(), fresh = !!d;
+
+ if (d)
+ show_window(*d, fresh);
+
+ return fresh;
+}
+
+template<typename t>
+static bool mk_dialog(std::unique_ptr<t>& place, const std::shared_ptr<dylib>& lib)
+{
+ using u = std::unique_ptr<t>;
+
+ return mk_window_common(place, [&] {
+ if (lib && lib->Dialog)
+ return u{ (t*)lib->Dialog() };
+ else
+ return nullptr;
+ });
+}
+
+dylib_ptr module_mixin::current_tracker()
+{
+ auto [ptr, idx] = module_by_name(s.tracker_dll, modules.trackers());
+ return ptr;
+}
+
+dylib_ptr module_mixin::current_protocol()
+{
+ auto [ptr, idx] = module_by_name(s.protocol_dll, modules.protocols());
+ return ptr;
+}
+
+dylib_ptr module_mixin::current_filter()
+{
+ auto [ptr, idx] = module_by_name(s.filter_dll, modules.filters());
+ return ptr;
+}
+
+void module_mixin::show_tracker_settings()
+{
+#if 0
+ if (mk_dialog(tracker_dialog, current_tracker()) && work && work->libs.pTracker)
+ tracker_dialog->register_tracker(work->libs.pTracker.get());
+ if (tracker_dialog)
+ QObject::connect(tracker_dialog.get(), &ITrackerDialog::closing,
+ this, [this] { tracker_dialog = nullptr; });
+#endif
+}
+
+void module_mixin::show_proto_settings()
+{
+#if 0
+ if (mk_dialog(proto_dialog, current_protocol()) && work && work->libs.pProtocol)
+ proto_dialog->register_protocol(work->libs.pProtocol.get());
+ if (proto_dialog)
+ QObject::connect(proto_dialog.get(), &IProtocolDialog::closing,
+ this, [this] { proto_dialog = nullptr; });
+#endif
+}
+
+void module_mixin::show_filter_settings()
+{
+#if 0
+ if (mk_dialog(filter_dialog, current_filter()) && work && work->libs.pFilter)
+ filter_dialog->register_filter(work->libs.pFilter.get());
+ if (filter_dialog)
+ QObject::connect(filter_dialog.get(), &IFilterDialog::closing,
+ this, [this] { filter_dialog = nullptr; });
+#endif
+}
+
+template<typename t, typename... Args>
+static bool mk_window(std::unique_ptr<t>& place, Args&&... params)
+{
+ return mk_window_common(place, [&] {
+ return std::make_unique<t>(params...);
+ });
+}
+
+module_mixin::module_mixin() = default;
+module_mixin::~module_mixin() = default;
+
+module_settings::module_settings() = default;
+
+} // ns