-Mainwindow::Mainwindow(const std::string& filename)
-{
- openAction = new QAction(tr("&Open"), this);
- // saveAction = new QAction(tr("&Save"), this);
- exitAction = new QAction(tr("E&xit"), this);
-
- connect(openAction, SIGNAL(triggered()), this, SLOT(open()));
- // connect(saveAction, SIGNAL(triggered()), this, SLOT(save()));
- connect(exitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
-
- fileMenu = menuBar()->addMenu(tr("&File"));
- fileMenu->addAction(openAction);
- // fileMenu->addAction(saveAction);
- fileMenu->addSeparator();
- fileMenu->addAction(exitAction);
-
- listWidget = new QListWidget();
- stackedWidget = new QStackedWidget();
- dockWidget = new QDockWidget(tr("Functions"), this);
- dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea |
- Qt::RightDockWidgetArea);
- dockWidget->setWidget(listWidget);
- addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
- setCentralWidget(stackedWidget);
-
- connect(listWidget, SIGNAL(currentRowChanged(int)),
- stackedWidget, SLOT(setCurrentIndex(int)));
-
- setWindowTitle(tr("FRIDA"));
-
- openBinary(filename);
+ connect(openAction, &QAction::triggered,
+ this, &Mainwindow::open);
+ connect(loadAction, &QAction::triggered,
+ this, &Mainwindow::load);
+ connect(saveAction, &QAction::triggered,
+ this, &Mainwindow::save);
+ connect(exitAction, &QAction::triggered,
+ qApp, &QApplication::quit);
+
+ fileMenu = menuBar()->addMenu(tr("&File"));
+ fileMenu->addAction(openAction);
+ fileMenu->addAction(loadAction);
+ fileMenu->addAction(saveAction);
+ fileMenu->addSeparator();
+ fileMenu->addAction(exitAction);
+
+ QMenu* interpretermenu = menuBar()->addMenu(tr("&Interpreter"));
+
+ fdock = new FridaDock(tr("Frida Dock"), this);
+
+ fdock->addTab(new LogDock(fdock), "Log");
+
+ fdock->addTab(new ScriptingDock(manager->getInterpreter("GUILE"), fdock), "guile");
+ fdock->setAllowedAreas(Qt::BottomDockWidgetArea);
+ addDockWidget(Qt::BottomDockWidgetArea, fdock);
+ QAction* guileLoad = new QAction(tr("&GUILE"), this);
+ interpretermenu->addAction(guileLoad);
+ connect(guileLoad, &QAction::triggered,
+ [&]() {
+ QString fileName = QFileDialog::getOpenFileName(this, tr("Open Script"), "",
+ tr("Binaries") + " (*." +
+ manager->getInterpreter("GUILE")->fileExtension().c_str() + ")");
+ std::stringstream a, b;
+ std::string c;
+ manager->getInterpreter("GUILE")->loadFile(fileName.toStdString(), a, b, c);
+ });
+
+ listWidget = new QTreeWidget();
+ listWidget->setColumnCount(1);
+ listWidget->setDragDropMode(QAbstractItemView::InternalMove);
+ listWidget->setContextMenuPolicy(Qt::CustomContextMenu);
+ connect(listWidget, SIGNAL(customContextMenuRequested(const QPoint&)),
+ this, SLOT(showListContextMenu(const QPoint&)));
+
+ stackedWidget = new QStackedWidget();
+ dockWidget = new QDockWidget(tr("Functions"), this);
+ dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea |
+ Qt::RightDockWidgetArea);
+ dockWidget->setWidget(listWidget);
+ addDockWidget(Qt::LeftDockWidgetArea, dockWidget);
+ setCentralWidget(stackedWidget);
+
+ connect(listWidget, &QTreeWidget::currentItemChanged,
+ [=] (QTreeWidgetItem* current, QTreeWidgetItem*) {
+ switchMainPlane(current);
+ });
+
+ setWindowTitle(tr("FRIDA"));
+
+ QTreeWidgetItem * external = new QTreeWidgetItem(listWidget, QStringList("External Functions"));
+ external->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);
+ external->setBackground(0, QBrush(QColor(0xff, 0xdd, 0xdd)));
+ mgr->registerNewFunctionEvent([=] (NewFunctionEvent* event) {
+ std::string name = event->function->getName();
+ if (event->function->isDynamic()) {
+ auto item = new QTreeWidgetItem(external, QStringList(name.c_str()));
+ item->setBackground(0, QBrush(QColor(0xff, 0xdd, 0xdd)));
+ } else {
+ addFunction(event->function);
+ }
+ });
+ mgr->registerRenameFunctionEvent([&](RenameFunctionEvent* event) {
+ if (objects_list_by_address.find(event->address) == objects_list_by_address.end())
+ return;
+ auto item = objects_list_by_address[event->address];
+ if (item) item->setText(0, event->new_name.c_str());
+ });
+ setGlobalHotkeys();
+}
+
+void Mainwindow::setGlobalHotkeys() {
+ QShortcut *shortcut = new QShortcut(QKeySequence("f"), this);
+ connect(shortcut, &QShortcut::activated, this, &Mainwindow::requestNewFunction);
+
+ shortcut = new QShortcut(QKeySequence("r"), listWidget);
+ connect(shortcut, &QShortcut::activated, [=]() {
+ QTreeWidgetItem * item = listWidget->currentItem();
+ if (item) renameFunction(objects_list[item]->getFunction());
+ });