reapack

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

commit f54167a2ede7b9494a4bba2a006b7f0d47009892
parent ca13175b70c2f12dbff3e31d67de187b0c70f2f1
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Wed,  9 Mar 2016 23:50:11 -0500

unify enable/disable behaviors and refactoring

Diffstat:
Msrc/manager.cpp | 4++--
Msrc/reapack.cpp | 54+++++++++++++++++++++++++-----------------------------
Msrc/reapack.hpp | 5+++--
Msrc/transaction.cpp | 17++++++-----------
Msrc/transaction.hpp | 2+-
5 files changed, 37 insertions(+), 45 deletions(-)

diff --git a/src/manager.cpp b/src/manager.cpp @@ -102,9 +102,9 @@ void Manager::onContextMenu(HWND target, const int x, const int y) Menu menu; const UINT enableAction = - menu.addAction(AUTO_STR("&Enable and synchronize"), ACTION_ENABLE); + menu.addAction(AUTO_STR("&Enable"), ACTION_ENABLE); const UINT disableAction = - menu.addAction(AUTO_STR("&Disable (keep files)"), ACTION_DISABLE); + menu.addAction(AUTO_STR("&Disable"), ACTION_DISABLE); menu.addSeparator(); diff --git a/src/reapack.cpp b/src/reapack.cpp @@ -151,54 +151,51 @@ void ReaPack::synchronizeAll() t->runTasks(); } -void ReaPack::enable(Remote remote) +void ReaPack::setRemoteEnabled(const Remote &original, const bool enable) { - remote.setEnabled(true); + Remote remote(original); + remote.setEnabled(enable); - if(!hitchhikeTransaction()) { + const auto apply = [=] { m_config->remotes()->add(remote); if(m_manager) m_manager->refresh(); + }; + if(!hitchhikeTransaction()) { + apply(); return; } m_transaction->registerAll(remote); - m_transaction->synchronize(remote, false); m_transaction->onFinish([=] { - if(m_transaction->isCancelled()) - return; - - m_config->remotes()->add(remote); - - if(m_manager) - m_manager->refresh(); + if(!m_transaction->isCancelled()) + apply(); }); } -void ReaPack::disable(Remote remote) -{ - remote.setEnabled(false); - m_config->remotes()->add(remote); - - if(!hitchhikeTransaction()) - return; - - m_transaction->unregisterAll(remote); -} - void ReaPack::uninstall(const Remote &remote) { if(remote.isProtected()) return; - if(!hitchhikeTransaction()) + const auto apply = [=] { + m_config->remotes()->remove(remote); + }; + + if(!hitchhikeTransaction()) { + apply(); return; + } m_transaction->uninstall(remote); - m_config->remotes()->remove(remote); + + m_transaction->onFinish([=] { + if(!m_transaction->isCancelled()) + apply(); + }); } void ReaPack::importRemote() @@ -248,10 +245,6 @@ void ReaPack::import(const Remote &remote) } else { enable(existing); - - if(m_manager) - m_manager->refresh(); - m_config->write(); return; @@ -297,8 +290,11 @@ void ReaPack::about(const Remote &remote, HWND parent) loadIndex(remote, [=] (IndexPtr index) { const auto ret = Dialog::Show<About>(m_instance, parent, index); - if(ret == About::InstallResult) + if(ret == About::InstallResult) { enable(remote); + if(m_transaction) + m_transaction->synchronize(remote); + } }, parent); } diff --git a/src/reapack.hpp b/src/reapack.hpp @@ -55,8 +55,9 @@ public: bool execActions(int id, int); void synchronizeAll(); - void enable(Remote); - void disable(Remote); + void setRemoteEnabled(const Remote &, bool enable); + void enable(const Remote &r) { setRemoteEnabled(r, true); } + void disable(const Remote &r) { setRemoteEnabled(r, false); } void uninstall(const Remote &); void importRemote(); void import(const Remote &); diff --git a/src/transaction.cpp b/src/transaction.cpp @@ -207,17 +207,10 @@ void Transaction::registerAll(const Remote &remote) const vector<Registry::Entry> &entries = m_registry->getEntries(remote.name()); for(const auto &entry : entries) - registerInHost(true, entry); -} + registerInHost(remote.isEnabled(), entry); -void Transaction::unregisterAll(const Remote &remote) -{ - const vector<Registry::Entry> &entries = m_registry->getEntries(remote.name()); - - for(const auto &entry : entries) - registerInHost(false, entry); - - inhibit(remote); + if(!remote.isEnabled()) + inhibit(remote); } void Transaction::uninstall(const Remote &remote) @@ -336,7 +329,7 @@ void Transaction::registerQueued() const HostTicket &reg = m_regQueue.front(); // don't register in host if the remote got disabled meanwhile - if(reg.add && m_remotes.count(reg.entry.remote) == 0) { + if(reg.add && m_inhibited.count(reg.entry.remote) > 0) { m_regQueue.pop(); return; } @@ -385,4 +378,6 @@ void Transaction::inhibit(const Remote &remote) const auto it = m_remotes.find(remote.name()); if(it != m_remotes.end()) m_remotes.erase(it); + + m_inhibited.insert(remote.name()); } diff --git a/src/transaction.hpp b/src/transaction.hpp @@ -60,7 +60,6 @@ public: void install(const Version *); void uninstall(const Remote &); void registerAll(const Remote &); - void unregisterAll(const Remote &); void runTasks(); bool isCancelled() const { return m_isCancelled; } @@ -96,6 +95,7 @@ private: Receipt m_receipt; std::multimap<std::string, IndexCallback> m_remotes; + std::unordered_set<std::string> m_inhibited; std::unordered_set<IndexPtr> m_indexes; std::vector<Task *> m_tasks;