cutter/src/widgets/FunctionsWidget.h
Nics c4e8a1c178 Small refactor for the widgets of Cutter (#405)
* Small refactor for the widgets of Cutter

This refactor include the following :

* Creation of a new class
Creation of a new class, named CutterWidget, that inherits from QDockWidget and
is used to represent all of the widgets of the main window.
The goal of this class is to regroup all the behaviour shared by the widgets of
Cutter.

For example : in the constructor, instructions corresponding of those
present in the macro **ADD_DOCK** (in MainWindow.cpp) are executed.
This was made because I think that the macro **ADD_DOCK** which is used
to construct the widgets does not take advantage of the object structure.

* Ensure that every widget has a parent
Some widgets were created using the constructor QDockWidget, but using
**nullptr** (default) as argument, thus they haven't got any parent.

The constructor of a CutterWidget takes as argument the MainWindow and an
action (optional) and calls the constructor of QDockWidget with the main
window as argument. This is valid under the assumption that it is mandatory
for every widget to have the main window as a parent.

* Constructors removal
The constructors of some widgets are not used anywhere and does not seem not
fullfill any current usecase. They were removed.

* Renaming CutterWidget to CutterDockWidget
2018-03-16 22:46:57 +01:00

135 lines
3.2 KiB
C++

#ifndef FUNCTIONSWIDGET_H
#define FUNCTIONSWIDGET_H
#include <memory>
#include <QSortFilterProxyModel>
#include <QTreeView>
#include "Cutter.h"
#include "CutterDockWidget.h"
class MainWindow;
class QTreeWidgetItem;
namespace Ui
{
class FunctionsWidget;
}
class FunctionModel : public QAbstractItemModel
{
Q_OBJECT
private:
QList<FunctionDescription> *functions;
QSet<RVA> *importAddresses;
ut64 *mainAdress;
QFont highlightFont;
QFont defaultFont;
bool nested;
int currentIndex;
bool functionIsImport(ut64 addr) const;
bool functionIsMain(ut64 addr) const;
public:
static const int FunctionDescriptionRole = Qt::UserRole;
static const int IsImportRole = Qt::UserRole + 1;
enum Column { NameColumn = 0, SizeColumn, ImportColumn, OffsetColumn, ColumnCount };
FunctionModel(QList<FunctionDescription> *functions, QSet<RVA> *importAddresses, ut64 *mainAdress, bool nested, QFont defaultFont, QFont highlightFont, QObject *parent = 0);
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
QModelIndex parent(const QModelIndex &index) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
QVariant data(const QModelIndex &index, int role) const;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
void beginReloadFunctions();
void endReloadFunctions();
/*!
* @return true if the index changed
*/
bool updateCurrentIndex();
void setNested(bool nested);
bool isNested() { return nested; }
private slots:
void seekChanged(RVA addr);
void functionRenamed(const QString &prev_name, const QString &new_name);
};
class FunctionSortFilterProxyModel : public QSortFilterProxyModel
{
Q_OBJECT
public:
FunctionSortFilterProxyModel(FunctionModel *source_model, QObject *parent = 0);
protected:
bool filterAcceptsRow(int row, const QModelIndex &parent) const override;
bool lessThan(const QModelIndex &left, const QModelIndex &right) const override;
};
class FunctionsWidget : public CutterDockWidget
{
Q_OBJECT
public:
explicit FunctionsWidget(MainWindow *main, QAction *action = nullptr);
~FunctionsWidget();
private slots:
void onFunctionsDoubleClicked(const QModelIndex &index);
void showFunctionsContextMenu(const QPoint &pt);
void on_actionDisasAdd_comment_triggered();
void on_actionFunctionsRename_triggered();
void on_action_References_triggered();
void on_actionFunctionsUndefine_triggered();
void on_actionHorizontal_triggered();
void on_actionVertical_triggered();
void showTitleContextMenu(const QPoint &pt);
void refreshTree();
protected:
void resizeEvent(QResizeEvent *event) override;
private:
std::unique_ptr<Ui::FunctionsWidget> ui;
MainWindow *main;
QList<FunctionDescription> functions;
QSet<RVA> importAddresses;
ut64 mainAdress;
FunctionModel *functionModel;
FunctionSortFilterProxyModel *functionProxyModel;
void setScrollMode();
};
#endif // FUNCTIONSWIDGET_H