diff --git a/plugins/eventmanager/EventManager.cpp b/plugins/eventmanager/EventManager.cpp index c9eeb5f50c..8a8387e811 100644 --- a/plugins/eventmanager/EventManager.cpp +++ b/plugins/eventmanager/EventManager.cpp @@ -82,49 +82,37 @@ EventManager::EventManager() : _emptyAccelerator(0, 0, _emptyEvent) {} -IAccelerator& EventManager::addAccelerator(const std::string& key, const std::string& modifierStr) +Accelerator& EventManager::addAccelerator(const std::string& key, const std::string& modifierStr) { unsigned int keyVal = Accelerator::getKeyCodeFromName(key); unsigned int modifierFlags = wxutil::Modifier::GetStateFromModifierString(modifierStr); - Accelerator accel(keyVal, modifierFlags, _emptyEvent); - // Add a new Accelerator to the list - _accelerators.push_back(accel); + _accelerators.push_back(Accelerator(keyVal, modifierFlags, _emptyEvent)); // return the reference to the last accelerator in the list - AcceleratorList::reverse_iterator i = _accelerators.rbegin(); - - return (*i); + return _accelerators.back(); } -IAccelerator& EventManager::addAccelerator(wxKeyEvent& ev) +Accelerator& EventManager::addAccelerator(wxKeyEvent& ev) { int keyCode = ev.GetKeyCode(); unsigned int modifierFlags = wxutil::Modifier::GetStateForKeyEvent(ev); - // Create a new accelerator with the given arguments - Accelerator accel(keyCode, modifierFlags, _emptyEvent); - - // Add a new Accelerator to the list - _accelerators.push_back(accel); + // Create a new accelerator with the given arguments and add it + _accelerators.push_back(Accelerator(keyCode, modifierFlags, _emptyEvent)); // return the reference to the last accelerator in the list - return *_accelerators.rbegin(); + return _accelerators.back(); } -IEventPtr EventManager::findEvent(const std::string& name) { +IEventPtr EventManager::findEvent(const std::string& name) +{ // Try to lookup the command - EventMap::iterator i = _events.find(name); + const EventMap::iterator& found = _events.find(name); - if (i != _events.end()) { - // Return the pointer to the command - return i->second; - } - else { - // Nothing found, return the NullEvent - return _emptyEvent; - } + // if nothing found, return the NullEvent + return found != _events.end() ? found->second : _emptyEvent; } IEventPtr EventManager::findEvent(wxKeyEvent& ev) @@ -139,112 +127,126 @@ IEventPtr EventManager::findEvent(wxKeyEvent& ev) std::string EventManager::getEventName(const IEventPtr& event) { // Try to lookup the given eventptr - for (EventMap::iterator i = _events.begin(); i != _events.end(); i++) { - if (i->second == event) { - return i->first; + for (const EventMap::value_type& pair : _events) + { + if (pair.second == event) + { + return pair.first; } } - return ""; + return std::string(); } std::string EventManager::getAcceleratorStr(const IEventPtr& event, bool forMenu) { - std::string returnValue = ""; - IAccelerator& accelerator = findAccelerator(event); return static_cast(accelerator).getAcceleratorString(forMenu); } -// Checks if the eventName is already registered and writes to rMessage, if so -bool EventManager::alreadyRegistered(const std::string& eventName) { +// Checks if the eventName is already registered and writes to rWarning, if so +bool EventManager::alreadyRegistered(const std::string& eventName) +{ // Try to find the command and see if it's already registered IEventPtr foundEvent = findEvent(eventName); - if (foundEvent->empty()) { + if (foundEvent->empty()) + { return false; } - else { - rWarning() << "EventManager: Event " << eventName - << " already registered!" << std::endl; - return true; - } + + rWarning() << "EventManager: Event " << eventName << " already registered!" << std::endl; + return true; } // Add the given command to the internal list -IEventPtr EventManager::addCommand(const std::string& name, const std::string& statement, bool reactOnKeyUp) { +IEventPtr EventManager::addCommand(const std::string& name, const std::string& statement, bool reactOnKeyUp) +{ + if (alreadyRegistered(name)) + { + return _emptyEvent; + } - if (!alreadyRegistered(name)) { - // Add the command to the list - _events[name] = IEventPtr(new Statement(statement, reactOnKeyUp)); + // Add the command to the list + IEventPtr event = std::make_shared(statement, reactOnKeyUp); - // Return the pointer to the newly created event - return _events[name]; - } + _events[name] = event; - return _emptyEvent; + // Return the pointer to the newly created event + return event; } IEventPtr EventManager::addKeyEvent(const std::string& name, const KeyStateChangeCallback& keyStateChangeCallback) { - if (!alreadyRegistered(name)) + if (alreadyRegistered(name)) { - // Add the new keyevent to the list (implicitly cast onto Event&) - _events[name] = IEventPtr(new KeyEvent(keyStateChangeCallback)); - - // Return the pointer to the newly created event - return _events[name]; + return _emptyEvent; } + + IEventPtr event = std::make_shared(keyStateChangeCallback); + + // Add the new keyevent to the list + _events[name] = event; - return _emptyEvent; + // Return the pointer to the newly created event + return event; } IEventPtr EventManager::addWidgetToggle(const std::string& name) { - if (!alreadyRegistered(name)) { - // Add the command to the list (implicitly cast the pointer on Event&) - _events[name] = IEventPtr(new WidgetToggle()); - - // Return the pointer to the newly created event - return _events[name]; + if (alreadyRegistered(name)) + { + return _emptyEvent; } + + IEventPtr event = std::make_shared(); - return _emptyEvent; + // Add the command to the list + _events[name] = event; + + // Return the pointer to the newly created event + return event; } IEventPtr EventManager::addRegistryToggle(const std::string& name, const std::string& registryKey) { - if (!alreadyRegistered(name)) { - // Add the command to the list (implicitly cast the pointer on Event&) - _events[name] = IEventPtr(new RegistryToggle(registryKey)); - - // Return the pointer to the newly created event - return _events[name]; + if (alreadyRegistered(name)) + { + return _emptyEvent; } - return _emptyEvent; + IEventPtr event = std::make_shared(registryKey); + + // Add the command to the list + _events[name] = event; + + // Return the pointer to the newly created event + return event; } IEventPtr EventManager::addToggle(const std::string& name, const ToggleCallback& onToggled) { - if (!alreadyRegistered(name)) { - // Add the command to the list (implicitly cast the pointer on Event&) - _events[name] = IEventPtr(new Toggle(onToggled)); - - // Return the pointer to the newly created event - return _events[name]; + if (alreadyRegistered(name)) + { + return _emptyEvent; } - return _emptyEvent; + IEventPtr event = std::make_shared(onToggled); + + // Add the command to the list + _events[name] = event; + + // Return the pointer to the newly created event + return event; } void EventManager::setToggled(const std::string& name, const bool toggled) { // Check could be placed here by boost::shared_ptr's dynamic_pointer_cast - if (!findEvent(name)->setToggled(toggled)) { - rWarning() << "EventManager: Event " << name - << " is not a Toggle." << std::endl; + if (!findEvent(name)->setToggled(toggled)) + { + rWarning() << "EventManager: Event " << name << " is not a Toggle." << std::endl; } } @@ -293,19 +295,23 @@ void EventManager::disconnectAccelerator(const std::string& command) } } -void EventManager::disableEvent(const std::string& eventName) { +void EventManager::disableEvent(const std::string& eventName) +{ findEvent(eventName)->setEnabled(false); } -void EventManager::enableEvent(const std::string& eventName) { +void EventManager::enableEvent(const std::string& eventName) +{ findEvent(eventName)->setEnabled(true); } -void EventManager::removeEvent(const std::string& eventName) { +void EventManager::removeEvent(const std::string& eventName) +{ // Try to lookup the command EventMap::iterator i = _events.find(eventName); - if (i != _events.end()) { + if (i != _events.end()) + { // Remove all accelerators beforehand disconnectAccelerator(eventName); @@ -338,7 +344,8 @@ void EventManager::loadAccelerators() xml::NodeList shortcutSets = GlobalRegistry().findXPath("user/ui/input//shortcuts"); // If we have two sets of shortcuts, delete the default ones - if (shortcutSets.size() > 1) { + if (shortcutSets.size() > 1) + { GlobalRegistry().deleteXPath("user/ui/input//shortcuts[@name='default']"); } @@ -349,10 +356,10 @@ void EventManager::loadAccelerators() { rMessage() << "EventManager: Shortcuts found in Registry: " << shortcutList.size() << std::endl; - for (std::size_t i = 0; i < shortcutList.size(); i++) + for (const xml::Node& shortcutNode : shortcutList) { - const std::string key = shortcutList[i].getAttributeValue("key"); - const std::string cmd = shortcutList[i].getAttributeValue("command"); + const std::string key = shortcutNode.getAttributeValue("key"); + const std::string cmd = shortcutNode.getAttributeValue("command"); // Try to lookup the command IEventPtr event = findEvent(cmd); @@ -364,7 +371,7 @@ void EventManager::loadAccelerators() if (!event->empty()) { // Get the modifier string (e.g. "SHIFT+ALT") - const std::string modifierStr = shortcutList[i].getAttributeValue("modifiers"); + const std::string modifierStr = shortcutNode.getAttributeValue("modifiers"); if (!duplicateAccelerator(key, modifierStr, event)) { @@ -401,7 +408,7 @@ void EventManager::foreachEvent(IEventVisitor& eventVisitor) } // Tries to locate an accelerator, that is connected to the given command -IAccelerator& EventManager::findAccelerator(const IEventPtr& event) +Accelerator& EventManager::findAccelerator(const IEventPtr& event) { // Cycle through the accelerators and check for matches for (AcceleratorList::iterator i = _accelerators.begin(); i != _accelerators.end(); ++i) @@ -423,7 +430,7 @@ void EventManager::saveEventListToRegistry() // The visitor class to save each event definition into the registry // Note: the SaveEventVisitor automatically wipes all the existing shortcuts from the registry - SaveEventVisitor visitor(rootKey, this); + SaveEventVisitor visitor(rootKey, *this); foreachEvent(visitor); } @@ -443,10 +450,10 @@ bool EventManager::duplicateAccelerator(const std::string& key, { AcceleratorList accelList = findAccelerator(key, modifiers); - for (AcceleratorList::iterator i = accelList.begin(); i != accelList.end(); ++i) + for (const Accelerator& accel : accelList) { // If one of the accelerators in the list matches the event, return true - if (i->match(event)) + if (accel.match(event)) { return true; } diff --git a/plugins/eventmanager/EventManager.h b/plugins/eventmanager/EventManager.h index 64c29cb2a6..83025e7c36 100644 --- a/plugins/eventmanager/EventManager.h +++ b/plugins/eventmanager/EventManager.h @@ -4,15 +4,12 @@ #include #include -#include #include #include "Accelerator.h" #include "GlobalKeyEventFilter.h" -#include - namespace ui { @@ -21,9 +18,6 @@ class EventManager : public wxEvtHandler { private: - // Needed for boost::algorithm::split - typedef std::vector StringParts; - // Each command has a name, this is the map where the name->command association is stored typedef std::map EventMap; @@ -40,58 +34,58 @@ class EventManager : public: // RegisterableModule implementation - const std::string& getName() const; - const StringSet& getDependencies() const; - void initialiseModule(const ApplicationContext& ctx); - void shutdownModule(); + const std::string& getName() const override; + const StringSet& getDependencies() const override; + void initialiseModule(const ApplicationContext& ctx) override; + void shutdownModule() override; // Constructor EventManager(); - IAccelerator& addAccelerator(const std::string& key, const std::string& modifierStr); - IAccelerator& addAccelerator(wxKeyEvent& ev); + Accelerator& addAccelerator(const std::string& key, const std::string& modifierStr) override; + Accelerator& addAccelerator(wxKeyEvent& ev) override; - IEventPtr findEvent(const std::string& name); - IEventPtr findEvent(wxKeyEvent& ev); + IEventPtr findEvent(const std::string& name) override; + IEventPtr findEvent(wxKeyEvent& ev) override; - std::string getEventName(const IEventPtr& event); + std::string getEventName(const IEventPtr& event) override; - std::string getAcceleratorStr(const IEventPtr& event, bool forMenu); + std::string getAcceleratorStr(const IEventPtr& event, bool forMenu) override; // Checks if the eventName is already registered and writes to rMessage, if so bool alreadyRegistered(const std::string& eventName); // Add a command and specify the statement to execute when triggered - IEventPtr addCommand(const std::string& name, const std::string& statement, bool reactOnKeyUp); + IEventPtr addCommand(const std::string& name, const std::string& statement, bool reactOnKeyUp) override; - IEventPtr addKeyEvent(const std::string& name, const KeyStateChangeCallback& keyStateChangeCallback); - IEventPtr addWidgetToggle(const std::string& name); - IEventPtr addRegistryToggle(const std::string& name, const std::string& registryKey); - IEventPtr addToggle(const std::string& name, const ToggleCallback& onToggled); + IEventPtr addKeyEvent(const std::string& name, const KeyStateChangeCallback& keyStateChangeCallback) override; + IEventPtr addWidgetToggle(const std::string& name) override; + IEventPtr addRegistryToggle(const std::string& name, const std::string& registryKey) override; + IEventPtr addToggle(const std::string& name, const ToggleCallback& onToggled) override; - void setToggled(const std::string& name, const bool toggled); + void setToggled(const std::string& name, const bool toggled) override; // Connects the given accelerator to the given command (identified by the string) - void connectAccelerator(IAccelerator& accelerator, const std::string& command); - void disconnectAccelerator(const std::string& command); + void connectAccelerator(IAccelerator& accelerator, const std::string& command) override; + void disconnectAccelerator(const std::string& command) override; - void disableEvent(const std::string& eventName); - void enableEvent(const std::string& eventName); + void disableEvent(const std::string& eventName) override; + void enableEvent(const std::string& eventName) override; - void removeEvent(const std::string& eventName); + void removeEvent(const std::string& eventName) override; - void disconnectToolbar(wxToolBar* toolbar); + void disconnectToolbar(wxToolBar* toolbar) override; // Loads the default shortcuts from the registry - void loadAccelerators(); + void loadAccelerators() override; - void foreachEvent(IEventVisitor& eventVisitor); + void foreachEvent(IEventVisitor& eventVisitor) override; // Tries to locate an accelerator, that is connected to the given command - IAccelerator& findAccelerator(const IEventPtr& event); + Accelerator& findAccelerator(const IEventPtr& event) override; AcceleratorList findAccelerator(wxKeyEvent& ev); - std::string getEventStr(wxKeyEvent& ev); + std::string getEventStr(wxKeyEvent& ev) override; private: diff --git a/plugins/eventmanager/SaveEventVisitor.h b/plugins/eventmanager/SaveEventVisitor.h index 34e578641b..58bb784d9b 100644 --- a/plugins/eventmanager/SaveEventVisitor.h +++ b/plugins/eventmanager/SaveEventVisitor.h @@ -1,6 +1,6 @@ #pragma once -#include "ieventmanager.h" +#include "EventManager.h" #include "xmlutil/Node.h" @@ -24,12 +24,12 @@ class SaveEventVisitor : // The node containing all the tags xml::Node _shortcutsNode; - IEventManager* _eventManager; + EventManager& _eventManager; public: - SaveEventVisitor(const std::string& rootKey, IEventManager* eventManager) : + SaveEventVisitor(const std::string& rootKey, EventManager& eventManager) : _rootKey(rootKey), - _shortcutsNode(NULL), + _shortcutsNode(nullptr), _eventManager(eventManager) { // Remove any existing shortcut definitions @@ -44,7 +44,7 @@ class SaveEventVisitor : if (eventName.empty()) return; // Try to find an accelerator connected to this event - Accelerator& accelerator = static_cast(_eventManager->findAccelerator(event)); + Accelerator& accelerator = _eventManager.findAccelerator(event); unsigned int keyVal = accelerator.getKey();