summaryrefslogtreecommitdiff
path: root/ui/commandpalette.h
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2019-03-19 15:41:08 -0400
committerRusty Wagner <rusty@vector35.com>2019-03-20 13:00:17 -0400
commit411acbaa4a1d217e731d3df0b189445117be3b26 (patch)
tree49b5c5290058ffb98dd23ec9a7c1a49921254d15 /ui/commandpalette.h
parentca1bc587c22928bbd7198813064c9615c3c12771 (diff)
Add in progress UI API headers
Diffstat (limited to 'ui/commandpalette.h')
-rw-r--r--ui/commandpalette.h110
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);
+};