diff options
| author | Rusty Wagner <rusty@vector35.com> | 2019-03-19 15:41:08 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2019-03-20 13:00:17 -0400 |
| commit | 411acbaa4a1d217e731d3df0b189445117be3b26 (patch) | |
| tree | 49b5c5290058ffb98dd23ec9a7c1a49921254d15 /ui/commandpalette.h | |
| parent | ca1bc587c22928bbd7198813064c9615c3c12771 (diff) | |
Add in progress UI API headers
Diffstat (limited to 'ui/commandpalette.h')
| -rw-r--r-- | ui/commandpalette.h | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/ui/commandpalette.h b/ui/commandpalette.h new file mode 100644 index 00000000..f009764d --- /dev/null +++ b/ui/commandpalette.h @@ -0,0 +1,110 @@ +#pragma once + +#include <QtWidgets/QListView> +#include <QtCore/QAbstractItemModel> +#include <QtWidgets/QLineEdit> +#include <QtWidgets/QFrame> +#include <QtCore/QPointer> +#include <vector> +#include "action.h" + +struct BINARYNINJAUIAPI CommandListItem +{ + QString name; + QString shortcut; + QString action; +}; + +class CommandPalette; +class CommandListFilter; + +class BINARYNINJAUIAPI CommandListModel: public QAbstractItemModel +{ + Q_OBJECT + + std::vector<CommandListItem> m_items; + std::vector<CommandListItem> m_allItems; + + bool isFilterMatch(const QString& name, const QString& filter); + int getFilterMatchScore(const QString& name, const QString& filter); + +public: + CommandListModel(QWidget* parent, const std::vector<CommandListItem>& items); + + virtual QModelIndex index(int row, int col, const QModelIndex& parent) const override; + virtual QModelIndex parent(const QModelIndex& i) const override; + virtual bool hasChildren(const QModelIndex& parent) const override; + virtual int rowCount(const QModelIndex& parent = QModelIndex()) const override; + virtual int columnCount(const QModelIndex& parent) const override; + virtual QVariant data(const QModelIndex& i, int role) const override; + + QString getActionForItem(int row); + void setFilterText(const QString& text); +}; + +class BINARYNINJAUIAPI CommandList: public QListView +{ + Q_OBJECT + + CommandPalette* m_palette; + CommandListModel* m_model; + CommandListFilter* m_filter; + +public: + CommandList(CommandPalette* parent, const std::vector<CommandListItem>& items); + void setFilter(CommandListFilter* filter) { m_filter = filter; } + void setFilterText(const QString& text); + + QString getActionForItem(int row); + + QModelIndex index(int row, int col, const QModelIndex& parent = QModelIndex()) const; + +protected: + virtual void keyPressEvent(QKeyEvent* event) override; + virtual void focusOutEvent(QFocusEvent* event) override; +}; + +class BINARYNINJAUIAPI CommandListFilter: public QLineEdit +{ + Q_OBJECT + + CommandPalette* m_palette; + CommandList* m_list; + +public: + CommandListFilter(CommandPalette* parent, CommandList* list); + +protected: + virtual void keyPressEvent(QKeyEvent* event) override; + virtual void focusOutEvent(QFocusEvent* event) override; +}; + +class BINARYNINJAUIAPI CommandPalette: public QFrame +{ + Q_OBJECT + + UIActionHandler* m_handler; + UIActionContext m_context; + QPointer<QWidget> m_previousWidget; + + CommandListFilter* m_filter; + CommandList* m_list; + + bool m_executing; + + std::vector<CommandListItem> getCommandList(); + void init(); + +public: + CommandPalette(QWidget* parent, UIActionHandler* handler); + CommandPalette(QWidget* parent, UIActionHandler* handler, const UIActionContext& context); + + void focusInput(); + void activateFirstItem(); + void selectFirstItem(); + void close(); + +private Q_SLOTS: + void itemClicked(const QModelIndex& idx); + void filterChanged(const QString& text); +}; |
