summaryrefslogtreecommitdiff
path: root/view/sharedcache/ui/symboltable.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'view/sharedcache/ui/symboltable.cpp')
-rw-r--r--view/sharedcache/ui/symboltable.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/view/sharedcache/ui/symboltable.cpp b/view/sharedcache/ui/symboltable.cpp
index 1df7d529..b0247f2b 100644
--- a/view/sharedcache/ui/symboltable.cpp
+++ b/view/sharedcache/ui/symboltable.cpp
@@ -10,23 +10,27 @@
using namespace BinaryNinja;
using namespace SharedCacheAPI;
+
SymbolTableModel::SymbolTableModel(SymbolTableView* parent)
: QAbstractTableModel(parent), m_parent(parent) {
// TODO: Need to implement updating this font if it is changed by the user
m_font = getMonospaceFont(parent);
}
+
int SymbolTableModel::rowCount(const QModelIndex& parent) const {
Q_UNUSED(parent);
return static_cast<int>(m_modelSymbols.size());
}
+
int SymbolTableModel::columnCount(const QModelIndex& parent) const {
Q_UNUSED(parent);
// We have 3 columns: Address, Type, Name
return 3;
}
+
QVariant SymbolTableModel::data(const QModelIndex& index, int role) const {
if (!index.isValid() || (role != Qt::DisplayRole && role != Qt::FontRole)) {
return QVariant();
@@ -58,6 +62,7 @@ QVariant SymbolTableModel::data(const QModelIndex& index, int role) const {
}
}
+
QVariant SymbolTableModel::headerData(int section, Qt::Orientation orientation, int role) const {
if (role != Qt::DisplayRole || orientation != Qt::Horizontal) {
return QVariant();
@@ -75,12 +80,58 @@ QVariant SymbolTableModel::headerData(int section, Qt::Orientation orientation,
}
}
+
+void SymbolTableModel::sort(int column, Qt::SortOrder order)
+{
+ beginResetModel();
+
+ std::function<bool(const CacheSymbol&, const CacheSymbol&)> comparator;
+
+ switch (column)
+ {
+ case 0: // Address column
+ comparator = [](const CacheSymbol& a, const CacheSymbol& b) {
+ return a.address < b.address;
+ };
+ break;
+ case 1: // Type column
+ comparator = [](const CacheSymbol& a, const CacheSymbol& b) {
+ return GetSymbolTypeAsString(a.type) < GetSymbolTypeAsString(b.type);
+ };
+ break;
+ case 2: // Name column
+ comparator = [](const CacheSymbol& a, const CacheSymbol& b) {
+ return a.name < b.name;
+ };
+ break;
+ default:
+ endResetModel();
+ return;
+ }
+
+ if (order == Qt::DescendingOrder)
+ {
+ std::sort(m_modelSymbols.begin(), m_modelSymbols.end(),
+ [&comparator](const CacheSymbol& a, const CacheSymbol& b) {
+ return comparator(b, a);
+ });
+ }
+ else
+ {
+ std::sort(m_modelSymbols.begin(), m_modelSymbols.end(), comparator);
+ }
+
+ endResetModel();
+}
+
+
void SymbolTableModel::updateSymbols(std::vector<CacheSymbol>&& symbols)
{
m_preparedSymbols = symbols;
setFilter(m_filter);
}
+
const CacheSymbol& SymbolTableModel::symbolAt(int row) const
{
return m_modelSymbols.at(row);