reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

commit 9f5449c9eb95e75dcd6e57a740ca4329983f79a9
parent 6138523350544f45273f99c9271cba69e60d4ccb
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Fri, 12 Feb 2016 22:58:21 -0500

show the new import dialog as a modeless window

Diffstat:
Msrc/dialog.cpp | 23++++++++++++++++++++---
Msrc/dialog.hpp | 9+++++++++
Msrc/manager.cpp | 2+-
Msrc/reapack.cpp | 41++++++++++++++++++++++++++++++-----------
Msrc/reapack.hpp | 2++
5 files changed, 62 insertions(+), 15 deletions(-)

diff --git a/src/dialog.cpp b/src/dialog.cpp @@ -20,6 +20,7 @@ #include "control.hpp" #include <algorithm> +#include <boost/range/adaptor/map.hpp> using namespace std; @@ -97,8 +98,8 @@ Dialog::Dialog(const int templateId) Dialog::~Dialog() { - for(const auto &controlPair : m_controls) - delete controlPair.second; + for(Control *control : m_controls | boost::adaptors::map_values) + delete control; DestroyWindow(m_handle); s_instances.erase(m_handle); @@ -108,6 +109,7 @@ INT_PTR Dialog::init(REAPER_PLUGIN_HINSTANCE inst, HWND parent, Modality mode) { m_instance = inst; m_parent = parent; + m_mode = mode; switch(mode) { case Modeless: @@ -130,6 +132,13 @@ void Dialog::Destroy(Dialog *dlg) delete dlg; } +void Dialog::DestroyAll() +{ + const DialogMap map = s_instances; // make an immutable copy + for(Dialog *dlg : map | boost::adaptors::map_values) + Destroy(dlg); +} + void Dialog::setVisible(const bool visible, HWND handle) { ShowWindow(handle, visible ? SW_SHOW : SW_HIDE); @@ -137,7 +146,14 @@ void Dialog::setVisible(const bool visible, HWND handle) void Dialog::close(const INT_PTR result) { - EndDialog(m_handle, result); + switch(m_mode) { + case Modal: + EndDialog(m_handle, result); + break; + case Modeless: + m_closeHandler(result); + break; + } } void Dialog::center() @@ -166,6 +182,7 @@ void Dialog::center() void Dialog::setFocus() { + show(); // hack to unminimize the window on OS X SetFocus(m_handle); } diff --git a/src/dialog.hpp b/src/dialog.hpp @@ -18,6 +18,7 @@ #ifndef REAPACK_DIALOG_HPP #define REAPACK_DIALOG_HPP +#include <functional> #include <map> #include <set> @@ -31,6 +32,8 @@ class Control; class Dialog { public: + typedef std::function<void (INT_PTR)> CloseHandler; + enum Modality { Modeless, Modal, @@ -56,6 +59,7 @@ public: } static void Destroy(Dialog *); + static void DestroyAll(); INT_PTR init(REAPER_PLUGIN_HINSTANCE, HWND, const Modality); @@ -85,6 +89,8 @@ public: int startTimer(int elapse, int id = 0); void stopTimer(int id); + void setCloseHandler(const CloseHandler &cb) { m_closeHandler = cb; } + protected: Dialog(int templateId); virtual ~Dialog(); @@ -121,6 +127,7 @@ private: const int m_template; bool m_isVisible; bool m_isEnabled; + Modality m_mode; REAPER_PLUGIN_HINSTANCE m_instance; HWND m_parent; @@ -128,6 +135,8 @@ private: std::map<int, Control *> m_controls; std::set<int> m_timers; + + CloseHandler m_closeHandler; }; class LockDialog { diff --git a/src/manager.cpp b/src/manager.cpp @@ -82,7 +82,7 @@ void Manager::onCommand(const int id) } case IDCANCEL: reset(); - hide(); + close(); break; } } diff --git a/src/reapack.cpp b/src/reapack.cpp @@ -32,7 +32,8 @@ using namespace std; ReaPack::ReaPack(REAPER_PLUGIN_HINSTANCE instance) : syncAction(), importAction(), configAction(), - m_transaction(nullptr), m_instance(instance) + m_transaction(nullptr), m_manager(nullptr), m_import(nullptr), + m_instance(instance) { m_mainWindow = GetMainHwnd(); m_useRootPath = new UseRootPath(GetResourcePath()); @@ -45,7 +46,6 @@ ReaPack::ReaPack(REAPER_PLUGIN_HINSTANCE instance) m_config->read(Path::prefixRoot("reapack.ini")); m_progress = Dialog::Create<Progress>(m_instance, m_mainWindow); - m_manager = Dialog::Create<Manager>(m_instance, m_mainWindow, this); if(m_config->isFirstRun()) manageRemotes(); @@ -56,8 +56,7 @@ ReaPack::~ReaPack() m_config->write(); delete m_config; - Dialog::Destroy(m_progress); - Dialog::Destroy(m_manager); + Dialog::DestroyAll(); Download::Cleanup(); @@ -163,7 +162,17 @@ void ReaPack::uninstall(const Remote &remote) void ReaPack::importRemote() { - Dialog::Show<Import>(m_instance, m_mainWindow, this); + if(m_import) { + m_import->setFocus(); + return; + } + + m_import = Dialog::Create<Import>(m_instance, m_mainWindow, this); + m_import->show(); + m_import->setCloseHandler([=] (INT_PTR) { + Dialog::Destroy(m_import); + m_import = nullptr; + }); } void ReaPack::import(const Remote &remote) @@ -199,7 +208,9 @@ void ReaPack::import(const Remote &remote) else { enable(existing); - m_manager->refresh(); + if(m_manager) + m_manager->refresh(); + m_config->write(); return; @@ -221,18 +232,26 @@ void ReaPack::import(const Remote &remote) remotes->add(remote); m_config->write(); - m_manager->refresh(); + if(m_manager) + m_manager->refresh(); }); } void ReaPack::manageRemotes() { + if(m_manager) { + m_manager->setFocus(); + return; + } + + m_manager = Dialog::Create<Manager>(m_instance, m_mainWindow, this); m_manager->refresh(); + m_manager->show(); - if(m_manager->isVisible()) - m_manager->setFocus(); - else - m_manager->show(); + m_manager->setCloseHandler([=] (INT_PTR) { + Dialog::Destroy(m_manager); + m_manager = nullptr; + }); } Transaction *ReaPack::createTransaction() diff --git a/src/reapack.hpp b/src/reapack.hpp @@ -28,6 +28,7 @@ typedef std::function<void()> ActionCallback; class Config; +class Import; class Manager; class Progress; class Remote; @@ -70,6 +71,7 @@ private: Transaction *m_transaction; Progress *m_progress; Manager *m_manager; + Import *m_import; REAPER_PLUGIN_HINSTANCE m_instance; HWND m_mainWindow;