summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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