/////////////////////////////////////////////////////////////////////////////
// Name: hotkeymanager.h
// Author: Cesar Mauri Loba (cesar at crea-si dot com)
// Copyright: (C) 2010-16 Cesar Mauri Loba - CREA Software Systems
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
/////////////////////////////////////////////////////////////////////////////
#ifndef HOTKEYMANAGER_H
#define HOTKEYMANAGER_H
#include
#include
#include "configbase.h"
#include "keyboardcode.h"
namespace eviacam {
/**
* Stores an arbitrary command associated with a key along with a description
*/
class HotKey {
public:
HotKey (int id, const wxString& name, const wxString& desc, KeyboardCode key)
: id_(id), name_(name), description_(desc), key_(key), enabled_(false) {}
virtual ~HotKey() {}
const wxString& GetName () const { return name_; }
const wxString& GetDescription () const { return description_; }
const KeyboardCode& GetKey () const { return key_; }
bool IsEnabled () const { return enabled_; }
protected:
// Command to be defined by derived classes
virtual void Command()= 0;
private:
friend class HotkeyManager;
void SetKey (KeyboardCode key) { key_= key; }
void SetEnabled (bool value) { enabled_= value; }
int id_;
wxString name_;
wxString description_;
KeyboardCode key_;
bool enabled_;
};
/**
* Keeps the hotkeys registry and triggers actions
*/
class HotkeyManager : public CConfigBase {
public:
HotkeyManager();
~HotkeyManager();
// Query available hotkeys
size_t get_num_hotkeys() const { return m_HotKeys.size(); }
HotKey& GetHotKey(int index) { return *m_HotKeys[index]; };
// Manage hotkeys
bool SetHotKeyKeyboardCode (HotKey& hk, KeyboardCode kc);
bool EnableHotKey(HotKey& hk);
void DisableHotKey(HotKey& hk);
// This method is called from secondary thread (linux only) to poll the state
// of the keyboard and trigger the command associated with a hotkey
void CheckKeyboardStatus();
// Configuration methods
virtual void InitDefaults() override;
virtual void ReadProfileData(wxConfigBase* pConfObj) override;
virtual void WriteProfileData(wxConfigBase* pConfObj) override;
private:
void HotkeyEventHandler(wxKeyEvent& event);
// Look for a hot key with a certain KeyboardCode.
// Return the index of the hot key or -1 if not found
int FindByKeyboardCode (KeyboardCode kc) const;
// Disable and remove all hotkeys
void ResetHotKeys();
KeyboardCode m_lastKeyCode;
std::vector m_HotKeys;
};
} // namespace
#endif