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:
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;