diff options
28 files changed, 160 insertions, 136 deletions
diff --git a/examples/triage/entry.cpp b/examples/triage/entry.cpp index c62b9c36..98e5cff9 100644 --- a/examples/triage/entry.cpp +++ b/examples/triage/entry.cpp @@ -271,15 +271,18 @@ void EntryTreeView::scrollToCurrentItem() } -void EntryTreeView::selectFirstItem() +void EntryTreeView::ensureSelection() { - setCurrentIndex(m_model->index(0, 0, QModelIndex())); + if (auto current = currentIndex(); !current.isValid()) + setCurrentIndex(m_model->index(0, 0, QModelIndex())); } -void EntryTreeView::activateFirstItem() +void EntryTreeView::activateSelection() { - entryDoubleClicked(m_model->index(0, 0, QModelIndex())); + ensureSelection(); + if (auto current = currentIndex(); current.isValid()) + entryDoubleClicked(current); } diff --git a/examples/triage/entry.h b/examples/triage/entry.h index 66943d1d..a1396741 100644 --- a/examples/triage/entry.h +++ b/examples/triage/entry.h @@ -49,8 +49,8 @@ class EntryTreeView : public QTreeView, public FilterTarget virtual void setFilter(const std::string& filterText) override; virtual void scrollToFirstItem() override; virtual void scrollToCurrentItem() override; - virtual void selectFirstItem() override; - virtual void activateFirstItem() override; + virtual void ensureSelection() override; + virtual void activateSelection() override; virtual void closeFilter() override; protected: diff --git a/examples/triage/exports.cpp b/examples/triage/exports.cpp index ad315384..c9f0e42d 100644 --- a/examples/triage/exports.cpp +++ b/examples/triage/exports.cpp @@ -438,15 +438,18 @@ void ExportsTreeView::scrollToCurrentItem() } -void ExportsTreeView::selectFirstItem() +void ExportsTreeView::ensureSelection() { - setCurrentIndex(m_model->index(0, 0, QModelIndex())); + if (auto current = currentIndex(); !current.isValid()) + setCurrentIndex(m_model->index(0, 0, QModelIndex())); } -void ExportsTreeView::activateFirstItem() +void ExportsTreeView::activateSelection() { - exportDoubleClicked(m_model->index(0, 0, QModelIndex())); + ensureSelection(); + if (auto current = currentIndex(); current.isValid()) + exportDoubleClicked(current); } diff --git a/examples/triage/exports.h b/examples/triage/exports.h index e47b775e..aeca67e0 100644 --- a/examples/triage/exports.h +++ b/examples/triage/exports.h @@ -80,8 +80,8 @@ class ExportsTreeView : public QTreeView, public FilterTarget virtual void setFilter(const std::string& filterText) override; virtual void scrollToFirstItem() override; virtual void scrollToCurrentItem() override; - virtual void selectFirstItem() override; - virtual void activateFirstItem() override; + virtual void ensureSelection() override; + virtual void activateSelection() override; virtual void closeFilter() override; protected: diff --git a/examples/triage/imports.cpp b/examples/triage/imports.cpp index ea4fe5d3..19c6a62b 100644 --- a/examples/triage/imports.cpp +++ b/examples/triage/imports.cpp @@ -343,15 +343,18 @@ void ImportsTreeView::scrollToCurrentItem() } -void ImportsTreeView::selectFirstItem() +void ImportsTreeView::ensureSelection() { - setCurrentIndex(m_model->index(0, 0, QModelIndex())); + if (auto current = currentIndex(); !current.isValid()) + setCurrentIndex(m_model->index(0, 0, QModelIndex())); } -void ImportsTreeView::activateFirstItem() +void ImportsTreeView::activateSelection() { - importDoubleClicked(m_model->index(0, 0, QModelIndex())); + ensureSelection(); + if (auto current = currentIndex(); current.isValid()) + importDoubleClicked(current); } diff --git a/examples/triage/imports.h b/examples/triage/imports.h index 9d490c01..8a2441f7 100644 --- a/examples/triage/imports.h +++ b/examples/triage/imports.h @@ -58,8 +58,8 @@ class ImportsTreeView : public QTreeView, public FilterTarget virtual void setFilter(const std::string& filterText) override; virtual void scrollToFirstItem() override; virtual void scrollToCurrentItem() override; - virtual void selectFirstItem() override; - virtual void activateFirstItem() override; + virtual void ensureSelection() override; + virtual void activateSelection() override; virtual void closeFilter() override; protected: diff --git a/examples/triage/strings.cpp b/examples/triage/strings.cpp index b84f6b62..269f747a 100644 --- a/examples/triage/strings.cpp +++ b/examples/triage/strings.cpp @@ -288,15 +288,18 @@ void StringsTreeView::scrollToCurrentItem() } -void StringsTreeView::selectFirstItem() +void StringsTreeView::ensureSelection() { - setCurrentIndex(m_model->index(0, 0, QModelIndex())); + if (auto current = currentIndex(); !current.isValid()) + setCurrentIndex(m_model->index(0, 0, QModelIndex())); } -void StringsTreeView::activateFirstItem() +void StringsTreeView::activateSelection() { - stringDoubleClicked(m_model->index(0, 0, QModelIndex())); + ensureSelection(); + if (auto current = currentIndex(); current.isValid()) + stringDoubleClicked(current); } diff --git a/examples/triage/strings.h b/examples/triage/strings.h index a7de2912..25de66cd 100644 --- a/examples/triage/strings.h +++ b/examples/triage/strings.h @@ -50,8 +50,8 @@ class StringsTreeView : public QTreeView, public FilterTarget virtual void setFilter(const std::string& filterText) override; virtual void scrollToFirstItem() override; virtual void scrollToCurrentItem() override; - virtual void selectFirstItem() override; - virtual void activateFirstItem() override; + virtual void ensureSelection() override; + virtual void activateSelection() override; virtual void closeFilter() override; protected: diff --git a/plugins/warp/ui/shared/constraint.h b/plugins/warp/ui/shared/constraint.h index edee36e5..02702144 100644 --- a/plugins/warp/ui/shared/constraint.h +++ b/plugins/warp/ui/shared/constraint.h @@ -64,7 +64,7 @@ public: void scrollToCurrentItem() override {} - void selectFirstItem() override {} + void ensureSelection() override {} - void activateFirstItem() override {} + void activateSelection() override {} }; diff --git a/plugins/warp/ui/shared/function.h b/plugins/warp/ui/shared/function.h index 6281944d..23b2bd3b 100644 --- a/plugins/warp/ui/shared/function.h +++ b/plugins/warp/ui/shared/function.h @@ -129,9 +129,9 @@ public: void scrollToCurrentItem() override {} - void selectFirstItem() override {} + void ensureSelection() override {} - void activateFirstItem() override {} + void activateSelection() override {} }; class WarpFunctionInfoWidget : public QWidget diff --git a/python/examples/triage/exports.py b/python/examples/triage/exports.py index 730b37df..fb831401 100644 --- a/python/examples/triage/exports.py +++ b/python/examples/triage/exports.py @@ -154,11 +154,14 @@ class ExportsTreeView(QTreeView, FilterTarget): def scrollToCurrentItem(self): self.scrollTo(self.currentIndex()) - def selectFirstItem(self): - self.setCurrentIndex(self.model.index(0, 0, QModelIndex())) + def ensureSelection(self): + if not self.currentIndex().isValid(): + self.setCurrentIndex(self.model.index(0, 0, QModelIndex())) - def activateFirstItem(self): - self.exportDoubleClicked(self.model.index(0, 0, QModelIndex())) + def activateSelection(self): + self.ensureSelection() + if self.currentIndex().isValid(): + self.exportDoubleClicked(self.currentIndex()) def closeFilter(self): self.setFocus(Qt.OtherFocusReason) diff --git a/python/examples/triage/imports.py b/python/examples/triage/imports.py index dbe8ed47..b4163cbe 100644 --- a/python/examples/triage/imports.py +++ b/python/examples/triage/imports.py @@ -336,11 +336,14 @@ class ImportsTreeView(QTreeView, FilterTarget): def scrollToCurrentItem(self): self.scrollTo(self.currentIndex()) - def selectFirstItem(self): - self.setCurrentIndex(self.model.index(0, 0, QModelIndex())) + def ensureSelection(self): + if not self.currentIndex().isValid(): + self.setCurrentIndex(self.model.index(0, 0, QModelIndex())) - def activateFirstItem(self): - self.importDoubleClicked(self.model.index(0, 0, QModelIndex())) + def activateSelection(self): + self.ensureSelection() + if self.currentIndex().isValid(): + self.importDoubleClicked(self.currentIndex()) def closeFilter(self): self.setFocus(Qt.OtherFocusReason) diff --git a/python/examples/typelibexplorer.py b/python/examples/typelibexplorer.py index f8e889e4..a963c039 100644 --- a/python/examples/typelibexplorer.py +++ b/python/examples/typelibexplorer.py @@ -51,11 +51,12 @@ class TypelibTypeTableWidget(QTableWidget, FilterTarget): def scrollToCurrentItem(self): self.scrollTo(self.currentIndex()) - def selectFirstItem(self): - self.setCurrentIndex(self.model().index(0, 0, QModelIndex())) + def ensureSelection(self): + if not self.currentIndex().isValid(): + self.setCurrentIndex(self.model().index(0, 0, QModelIndex())) - def activateFirstItem(self): - self.setCurrentIndex(self.model().index(0, 0, QModelIndex())) + def activateSelection(self): + self.ensureSelection() def closeFilter(self): self.setFocus(Qt.OtherFocusReason) @@ -109,11 +110,12 @@ class TypelibObjectTableWidget(QTableWidget, FilterTarget): def scrollToCurrentItem(self): self.scrollTo(self.currentIndex()) - def selectFirstItem(self): - self.setCurrentIndex(self.model().index(0, 0, QModelIndex())) + def ensureSelection(self): + if not self.currentIndex().isValid(): + self.setCurrentIndex(self.model().index(0, 0, QModelIndex())) - def activateFirstItem(self): - self.setCurrentIndex(self.model().index(0, 0, QModelIndex())) + def activateSelection(self): + self.ensureSelection() def closeFilter(self): self.setFocus(Qt.OtherFocusReason) @@ -335,17 +337,17 @@ class TypelibExplorerWidget(SidebarWidget, FilterTarget): else: self.type_table.scrollToCurrentItem() - def selectFirstItem(self): + def ensureSelection(self): if self.horizontal_tabs.currentIndex() == 0: - self.object_table.selectFirstItem() + self.object_table.ensureSelection() else: - self.type_table.selectFirstItem() + self.type_table.ensureSelection() - def activateFirstItem(self): + def activateSelection(self): if self.horizontal_tabs.currentIndex() == 0: - self.object_table.activateFirstItem() + self.object_table.activateSelection() else: - self.type_table.activateFirstItem() + self.type_table.activateSelection() def closeFilter(self): if self.horizontal_tabs.currentIndex() == 0: diff --git a/ui/bndbimportdialog.h b/ui/bndbimportdialog.h index 64030fbe..eb8f0dfd 100644 --- a/ui/bndbimportdialog.h +++ b/ui/bndbimportdialog.h @@ -120,7 +120,7 @@ public: void setFilter(const std::string& filter) override; void scrollToFirstItem() override; void scrollToCurrentItem() override; - void selectFirstItem() override; - void activateFirstItem() override; + void ensureSelection() override; + void activateSelection() override; void closeFilter() override; }; diff --git a/ui/filter.h b/ui/filter.h index c354546f..98417f65 100644 --- a/ui/filter.h +++ b/ui/filter.h @@ -22,8 +22,16 @@ class BINARYNINJAUIAPI FilterTarget virtual void setFilter(const std::string& filter) = 0; virtual void scrollToFirstItem() = 0; virtual void scrollToCurrentItem() = 0; - virtual void selectFirstItem() = 0; - virtual void activateFirstItem() = 0; + + // Select an item, typically the first, if none is already selected. + virtual void ensureSelection() = 0; + + // Activate the selected item, typically in response to the user + // pressing the return key. + virtual void activateSelection() = 0; + + // Transfer focus away from the `FilterEdit`. By default, focus + // is transferred to `this` if it is an instance of `QWidget`. virtual void closeFilter(); }; diff --git a/ui/logview.h b/ui/logview.h index 36016ff8..0aaf9372 100644 --- a/ui/logview.h +++ b/ui/logview.h @@ -276,8 +276,8 @@ class BINARYNINJAUIAPI LogView : public SidebarWidget, public FilterTarget void scrollToFirstItem() override; void scrollToCurrentItem() override; - void selectFirstItem() override; - void activateFirstItem() override {} + void ensureSelection() override; + void activateSelection() override {} void closeFilter() override; // std::pair<size_t, size_t> GetSelectionIndexAndOffsetFromPosition(const QPoint& position) const; diff --git a/ui/metadatachoicedialog.h b/ui/metadatachoicedialog.h index b34dccdc..12de4a55 100644 --- a/ui/metadatachoicedialog.h +++ b/ui/metadatachoicedialog.h @@ -91,8 +91,8 @@ public: virtual void setFilter(const std::string& filter) override; virtual void scrollToFirstItem() override; virtual void scrollToCurrentItem() override; - virtual void selectFirstItem() override; - virtual void activateFirstItem() override; + virtual void ensureSelection() override; + virtual void activateSelection() override; virtual void focusInEvent(QFocusEvent *event) override; bool focusNextPrevChild(bool next) override; diff --git a/ui/projectbrowser.h b/ui/projectbrowser.h index f4f9bd4c..11e14058 100644 --- a/ui/projectbrowser.h +++ b/ui/projectbrowser.h @@ -175,8 +175,8 @@ class BINARYNINJAUIAPI ProjectTree: public QTreeView, public FilterTarget virtual void scrollToFirstItem() override; virtual void scrollToCurrentItem() override; - virtual void selectFirstItem() override; - virtual void activateFirstItem() override; + virtual void ensureSelection() override; + virtual void activateSelection() override; virtual void setFilter(const std::string& filter) override; protected: @@ -198,8 +198,8 @@ class BINARYNINJAUIAPI RecentsList: public QListWidget, public FilterTarget virtual void scrollToFirstItem() override; virtual void scrollToCurrentItem() override; - virtual void selectFirstItem() override; - virtual void activateFirstItem() override; + virtual void ensureSelection() override; + virtual void activateSelection() override; virtual void setFilter(const std::string& filter) override; public: diff --git a/ui/searchresult.h b/ui/searchresult.h index 48c67de1..a4f6d6a0 100644 --- a/ui/searchresult.h +++ b/ui/searchresult.h @@ -325,8 +325,8 @@ public: virtual void setFilter(const std::string&) override {} virtual void scrollToFirstItem() override {} virtual void scrollToCurrentItem() override {} - virtual void selectFirstItem() override {} - virtual void activateFirstItem() override; + virtual void ensureSelection() override {} + virtual void activateSelection() override; protected: virtual void keyPressEvent(QKeyEvent* e) override; diff --git a/ui/stringsview.h b/ui/stringsview.h index 1df0d5f7..e745d28d 100644 --- a/ui/stringsview.h +++ b/ui/stringsview.h @@ -211,8 +211,8 @@ class BINARYNINJAUIAPI StringsView : public TableViewBase, public View, public F virtual void setFilter(const std::string& filter) override; virtual void scrollToFirstItem() override; virtual void scrollToCurrentItem() override; - virtual void selectFirstItem() override; - virtual void activateFirstItem() override; + virtual void ensureSelection() override; + virtual void activateSelection() override; virtual QFont getFont() override { return m_itemDelegate->getFont(); } bool getIncludeStringsOverlappingCode() const { return m_list->getIncludeStringsOverlappingCode(); }; diff --git a/ui/symbollist.h b/ui/symbollist.h index 21faa2ba..1bc4a6dd 100644 --- a/ui/symbollist.h +++ b/ui/symbollist.h @@ -359,8 +359,8 @@ class BINARYNINJAUIAPI SymbolList : public QListView, public FilterTarget virtual void scrollToFirstItem() override; virtual void scrollToCurrentItem() override; - virtual void selectFirstItem() override; - virtual void activateFirstItem() override; + virtual void ensureSelection() override; + virtual void activateSelection() override; virtual void setFilter(const std::string& filter) override; bool hasSymbols(); diff --git a/ui/taglist.h b/ui/taglist.h index e5b9f177..1f1e09cb 100644 --- a/ui/taglist.h +++ b/ui/taglist.h @@ -193,10 +193,10 @@ class BINARYNINJAUIAPI TagList : public QTreeView, public FilterTarget void navigateToNext(); void navigateToPrev(); - void scrollToFirstItem() override; - void scrollToCurrentItem() override; - void selectFirstItem() override; - void activateFirstItem() override; + virtual void scrollToFirstItem() override; + virtual void scrollToCurrentItem() override; + virtual void ensureSelection() override; + virtual void activateSelection() override; }; /*! diff --git a/ui/typebrowser.h b/ui/typebrowser.h index c8b630c7..d12966c2 100644 --- a/ui/typebrowser.h +++ b/ui/typebrowser.h @@ -438,8 +438,8 @@ public: virtual void setFilter(const std::string& filter) override; virtual void scrollToFirstItem() override; virtual void scrollToCurrentItem() override; - virtual void selectFirstItem() override; - virtual void activateFirstItem() override; + virtual void ensureSelection() override; + virtual void activateSelection() override; virtual void notifyRefresh() override; diff --git a/ui/variablelist.h b/ui/variablelist.h index 93e2cf7a..43e6b65c 100644 --- a/ui/variablelist.h +++ b/ui/variablelist.h @@ -257,8 +257,8 @@ class BINARYNINJAUIAPI VariableList : public SidebarWidget, public FilterTarget virtual void setFilter(const std::string& filter) override; virtual void scrollToFirstItem() override; virtual void scrollToCurrentItem() override; - virtual void selectFirstItem() override; - virtual void activateFirstItem() override; + virtual void ensureSelection() override; + virtual void activateSelection() override; }; /*! The main variable list dock widget. diff --git a/view/kernelcache/ui/kctriage.h b/view/kernelcache/ui/kctriage.h index d4a961e8..c69c6a0a 100644 --- a/view/kernelcache/ui/kctriage.h +++ b/view/kernelcache/ui/kctriage.h @@ -150,24 +150,23 @@ public: } } - void selectFirstItem() override { - if (model()->rowCount() > 0) { - QModelIndex top = indexAt(rect().topLeft()); - if (top.isValid()) { - selectionModel()->select(top, QItemSelectionModel::ClearAndSelect); - setCurrentIndex(top); - } + void ensureSelection() override { + QModelIndex current = selectionModel()->currentIndex(); + if (current.isValid() && !isRowHidden(current.row())) + return; + + if (auto top = indexAt(rect().topLeft()); top.isValid()) + { + selectionModel()->select(top, QItemSelectionModel::ClearAndSelect); + setCurrentIndex(top); } } - void activateFirstItem() override { - if (model()->rowCount() > 0) { - QModelIndex topLeft = indexAt(rect().topLeft()); - if (topLeft.isValid()) { - setCurrentIndex(topLeft); - emit activated(topLeft); - } - } + + void activateSelection() override { + ensureSelection(); + if (auto current = selectionModel()->currentIndex(); current.isValid()) + emit activated(current); } signals: diff --git a/view/kernelcache/ui/symboltable.h b/view/kernelcache/ui/symboltable.h index 866390c7..28d07199 100644 --- a/view/kernelcache/ui/symboltable.h +++ b/view/kernelcache/ui/symboltable.h @@ -68,26 +68,25 @@ public: scrollTo(currentIndex); } - void selectFirstItem() override + void ensureSelection() override { - if (model()->rowCount() > 0) { - QModelIndex top = indexAt(rect().topLeft()); - if (top.isValid()) { - selectionModel()->select(top, QItemSelectionModel::ClearAndSelect); - setCurrentIndex(top); - } + QModelIndex current = selectionModel()->currentIndex(); + if (current.isValid() || model()->rowCount() == 0) + return; + + if (auto top = indexAt(rect().topLeft()); top.isValid()) + { + selectionModel()->select(top, QItemSelectionModel::ClearAndSelect); + setCurrentIndex(top); } } - void activateFirstItem() override + + void activateSelection() override { - if (model()->rowCount() > 0) { - QModelIndex topLeft = indexAt(rect().topLeft()); - if (topLeft.isValid()) { - setCurrentIndex(topLeft); - emit activated(topLeft); - } - } + ensureSelection(); + if (auto current = selectionModel()->currentIndex(); current.isValid()) + emit activated(current); } KernelCacheAPI::CacheSymbol getSymbolAtRow(int row) const diff --git a/view/sharedcache/ui/dsctriage.h b/view/sharedcache/ui/dsctriage.h index 33f45bcf..02a41eab 100644 --- a/view/sharedcache/ui/dsctriage.h +++ b/view/sharedcache/ui/dsctriage.h @@ -150,24 +150,23 @@ public: } } - void selectFirstItem() override { - if (model()->rowCount() > 0) { - QModelIndex top = indexAt(rect().topLeft()); - if (top.isValid()) { - selectionModel()->select(top, QItemSelectionModel::ClearAndSelect); - setCurrentIndex(top); - } + void ensureSelection() override { + QModelIndex current = selectionModel()->currentIndex(); + if (current.isValid() && !isRowHidden(current.row())) + return; + + if (auto top = indexAt(rect().topLeft()); top.isValid()) + { + selectionModel()->select(top, QItemSelectionModel::ClearAndSelect); + setCurrentIndex(top); } } - void activateFirstItem() override { - if (model()->rowCount() > 0) { - QModelIndex topLeft = indexAt(rect().topLeft()); - if (topLeft.isValid()) { - setCurrentIndex(topLeft); - emit activated(topLeft); - } - } + + void activateSelection() override { + ensureSelection(); + if (auto current = selectionModel()->currentIndex(); current.isValid()) + emit activated(current); } signals: diff --git a/view/sharedcache/ui/symboltable.h b/view/sharedcache/ui/symboltable.h index 9c7a1eab..ab0174f9 100644 --- a/view/sharedcache/ui/symboltable.h +++ b/view/sharedcache/ui/symboltable.h @@ -72,26 +72,25 @@ public: scrollTo(currentIndex); } - void selectFirstItem() override + void ensureSelection() override { - if (model()->rowCount() > 0) { - QModelIndex top = indexAt(rect().topLeft()); - if (top.isValid()) { - selectionModel()->select(top, QItemSelectionModel::ClearAndSelect); - setCurrentIndex(top); - } + QModelIndex current = selectionModel()->currentIndex(); + if (current.isValid() || model()->rowCount() == 0) + return; + + if (auto top = indexAt(rect().topLeft()); top.isValid()) + { + selectionModel()->select(top, QItemSelectionModel::ClearAndSelect); + setCurrentIndex(top); } } - void activateFirstItem() override + + void activateSelection() override { - if (model()->rowCount() > 0) { - QModelIndex topLeft = indexAt(rect().topLeft()); - if (topLeft.isValid()) { - setCurrentIndex(topLeft); - emit activated(topLeft); - } - } + ensureSelection(); + if (auto current = selectionModel()->currentIndex(); current.isValid()) + emit activated(current); } SharedCacheAPI::CacheSymbol getSymbolAtRow(int row) const |
