You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.7 KiB
C++
70 lines
1.7 KiB
C++
#ifndef CSM_PREFS_SHORTCUT_EVENT_HANDLER_H
|
|
#define CSM_PREFS_SHORTCUT_EVENT_HANDLER_H
|
|
|
|
#include <map>
|
|
#include <vector>
|
|
|
|
#include <QObject>
|
|
|
|
class QEvent;
|
|
class QWidget;
|
|
|
|
namespace CSMPrefs
|
|
{
|
|
class Shortcut;
|
|
|
|
/// Users of this class should install it as an event handler
|
|
class ShortcutEventHandler : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
|
|
ShortcutEventHandler(QObject* parent);
|
|
|
|
void addShortcut(Shortcut* shortcut);
|
|
void removeShortcut(Shortcut* shortcut);
|
|
|
|
protected:
|
|
|
|
bool eventFilter(QObject* watched, QEvent* event);
|
|
|
|
private:
|
|
|
|
typedef std::vector<Shortcut*> ShortcutList;
|
|
// Child, Parent
|
|
typedef std::map<QWidget*, QWidget*> WidgetMap;
|
|
typedef std::map<QWidget*, ShortcutList> ShortcutMap;
|
|
|
|
enum MatchResult
|
|
{
|
|
Matches_WithMod,
|
|
Matches_NoMod,
|
|
Matches_Not
|
|
};
|
|
|
|
void updateParent(QWidget* widget);
|
|
|
|
bool activate(QWidget* widget, unsigned int mod, unsigned int button);
|
|
|
|
bool deactivate(QWidget* widget, unsigned int mod, unsigned int button);
|
|
|
|
bool checkModifier(unsigned int mod, unsigned int button, Shortcut* shortcut, bool activate);
|
|
|
|
MatchResult match(unsigned int mod, unsigned int button, unsigned int value);
|
|
|
|
// Prefers Matches_WithMod and a larger number of buttons
|
|
static bool sort(const std::pair<MatchResult, Shortcut*>& left,
|
|
const std::pair<MatchResult, Shortcut*>& right);
|
|
|
|
WidgetMap mChildParentRelations;
|
|
ShortcutMap mWidgetShortcuts;
|
|
|
|
private slots:
|
|
|
|
void widgetDestroyed();
|
|
};
|
|
}
|
|
|
|
#endif
|