summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Rowe <mark@vector35.com>2025-10-24 08:21:26 -0700
committerMark Rowe <mark@vector35.com>2025-11-04 16:04:04 -0800
commitade58079a0a3e6b9d1a0793ab4c084d0f9431f4d (patch)
tree1970e1e26858163d24d1359908b529f363789034
parent63ef49621522efa11e1fcfc709812adb0300d3f6 (diff)
Update FilterEdit and FilterTarget to preserve existing selections
The down and enter keys now preserve an existing selection in the associated list or table views, rather than unconditionally selecting or activating the first item.
-rw-r--r--examples/triage/entry.cpp11
-rw-r--r--examples/triage/entry.h4
-rw-r--r--examples/triage/exports.cpp11
-rw-r--r--examples/triage/exports.h4
-rw-r--r--examples/triage/imports.cpp11
-rw-r--r--examples/triage/imports.h4
-rw-r--r--examples/triage/strings.cpp11
-rw-r--r--examples/triage/strings.h4
-rw-r--r--plugins/warp/ui/shared/constraint.h4
-rw-r--r--plugins/warp/ui/shared/function.h4
-rw-r--r--python/examples/triage/exports.py11
-rw-r--r--python/examples/triage/imports.py11
-rw-r--r--python/examples/typelibexplorer.py30
-rw-r--r--ui/bndbimportdialog.h4
-rw-r--r--ui/filter.h12
-rw-r--r--ui/logview.h4
-rw-r--r--ui/metadatachoicedialog.h4
-rw-r--r--ui/projectbrowser.h8
-rw-r--r--ui/searchresult.h4
-rw-r--r--ui/stringsview.h4
-rw-r--r--ui/symbollist.h4
-rw-r--r--ui/taglist.h8
-rw-r--r--ui/typebrowser.h4
-rw-r--r--ui/variablelist.h4
-rw-r--r--view/kernelcache/ui/kctriage.h29
-rw-r--r--view/kernelcache/ui/symboltable.h29
-rw-r--r--view/sharedcache/ui/dsctriage.h29
-rw-r--r--view/sharedcache/ui/symboltable.h29
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