mirror of
https://github.com/rizinorg/cutter.git
synced 2025-01-22 12:28:51 +00:00
567f852c3a
* Seperate addressable item list widget from ListDockWidget. * Convert ResourceWidget, strings widget, flags widget, search widget, MemoryMapWidget, xrefs dialog * Don't silently overwrite comment in add comment action.
104 lines
3.3 KiB
C++
104 lines
3.3 KiB
C++
#ifndef ADDRESSABLE_ITEM_LIST_H
|
|
#define ADDRESSABLE_ITEM_LIST_H
|
|
|
|
#include <memory>
|
|
#include <QAbstractItemModel>
|
|
#include <QSortFilterProxyModel>
|
|
#include <QAbstractItemView>
|
|
#include <QMenu>
|
|
|
|
#include "core/Cutter.h"
|
|
#include "common/AddressableItemModel.h"
|
|
#include "CutterDockWidget.h"
|
|
#include "CutterTreeWidget.h"
|
|
#include "menus/AddressableItemContextMenu.h"
|
|
#include "CutterTreeView.h"
|
|
|
|
class MainWindow;
|
|
|
|
template<class BaseListWidget = CutterTreeView>
|
|
class AddressableItemList : public BaseListWidget
|
|
{
|
|
static_assert (std::is_base_of<QAbstractItemView, BaseListWidget>::value,
|
|
"ParentModel needs to inherit from QAbstractItemModel");
|
|
|
|
public:
|
|
explicit AddressableItemList(QWidget *parent = nullptr) :
|
|
BaseListWidget(parent)
|
|
{
|
|
this->connect(this, &QWidget::customContextMenuRequested, this,
|
|
&AddressableItemList<BaseListWidget>::showItemContextMenu);
|
|
this->setContextMenuPolicy(Qt::CustomContextMenu);
|
|
this->connect(this, &QAbstractItemView::activated, this,
|
|
&AddressableItemList<BaseListWidget>::onItemActivated);
|
|
}
|
|
|
|
void setModel(AddressableItemModelI *addressableItemModel)
|
|
{
|
|
this->addressableModel = addressableItemModel;
|
|
|
|
BaseListWidget::setModel(this->addressableModel->asItemModel());
|
|
|
|
this->connect(this->selectionModel(), &QItemSelectionModel::currentChanged, this,
|
|
&AddressableItemList<BaseListWidget>::onSelectedItemChanged);
|
|
}
|
|
void setMainWindow(MainWindow *mainWindow)
|
|
{
|
|
this->mainWindow = mainWindow;
|
|
setItemContextMenu(new AddressableItemContextMenu(this, mainWindow));
|
|
this->addActions(this->getItemContextMenu()->actions());
|
|
}
|
|
|
|
AddressableItemContextMenu *getItemContextMenu()
|
|
{
|
|
return itemContextMenu;
|
|
}
|
|
void setItemContextMenu(AddressableItemContextMenu *menu)
|
|
{
|
|
if (itemContextMenu != menu && itemContextMenu) {
|
|
itemContextMenu->deleteLater();
|
|
}
|
|
itemContextMenu = menu;
|
|
}
|
|
protected:
|
|
virtual void showItemContextMenu(const QPoint &pt)
|
|
{
|
|
auto index = this->currentIndex();
|
|
if (index.isValid() && itemContextMenu) {
|
|
auto offset = addressableModel->address(index);
|
|
auto name = addressableModel->name(index);
|
|
itemContextMenu->setTarget(offset, name);
|
|
itemContextMenu->exec(this->mapToGlobal(pt));
|
|
}
|
|
}
|
|
|
|
virtual void onItemActivated(const QModelIndex &index)
|
|
{
|
|
if (!index.isValid())
|
|
return;
|
|
|
|
auto offset = addressableModel->address(index);
|
|
Core()->seekAndShow(offset);
|
|
}
|
|
virtual void onSelectedItemChanged(const QModelIndex &index)
|
|
{
|
|
updateMenuFromItem(index);
|
|
}
|
|
void updateMenuFromItem(const QModelIndex &index)
|
|
{
|
|
if (index.isValid()) {
|
|
auto offset = addressableModel->address(index);
|
|
auto name = addressableModel->name(index);
|
|
itemContextMenu->setTarget(offset, name);
|
|
} else {
|
|
itemContextMenu->clearTarget();
|
|
}
|
|
}
|
|
private:
|
|
AddressableItemModelI *addressableModel = nullptr;
|
|
AddressableItemContextMenu *itemContextMenu = nullptr;
|
|
MainWindow *mainWindow = nullptr;
|
|
};
|
|
|
|
#endif // ADDRESSABLE_ITEM_LIST_H
|