]> git.siccegge.de Git - frida/frida.git/blobdiff - src/gui/Mainwindow.cxx
Move ScriptingDock contructor to cxx file
[frida/frida.git] / src / gui / Mainwindow.cxx
index a15aa66eb299da46b1f5a3da3735fa9c95849813..654dc16aafd6f7ad386b7840a15f155ba0b84531 100644 (file)
@@ -24,18 +24,22 @@ Mainwindow::Mainwindow(InformationManager* mgr)
        : manager(mgr)
        , logger(log4cxx::Logger::getLogger("Mainwindow")) {
        openAction = new QAction(tr("&Open"), this);
+       loadAction = new QAction(tr("&Load"), 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()));
+       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);
@@ -46,6 +50,7 @@ Mainwindow::Mainwindow(InformationManager* mgr)
 
        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&)));
@@ -101,13 +106,18 @@ void Mainwindow::quit()
 void Mainwindow::open() {
        QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
                                                        tr("Binaries (*)"));
-
        manager->reset(fileName.toStdString());
 }
 
+void Mainwindow::load() {
+       QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "",
+                                                       tr("Frida Archives (*.frida)"));
+       manager->load(fileName.toStdString());
+}
+
 void Mainwindow::save() {
        QString filename = QFileDialog::getSaveFileName(this, tr("Save File"), "", tr("Frida Archives (*.frida)"));
-       manager->save(filename);
+       manager->save(filename.toStdString());
 }
 
 void Mainwindow::switchMainPlaneToAddress(uint64_t address) {
@@ -128,15 +138,37 @@ void Mainwindow::switchMainPlane(QTreeWidgetItem* to) {
 }
 
 void Mainwindow::showListContextMenu(const QPoint& point) {
+       QAction * act;
        QTreeWidgetItem * item = listWidget->itemAt(point);
        QMenu menu(this);
+
+       act = menu.addAction("Add Function");
+       connect(act, &QAction::triggered, this, &Mainwindow::requestNewFunction);
+
+       act = menu.addAction("Add Group");
+       connect(act, &QAction::triggered, this, &Mainwindow::requestNewGroup);
+
        if (item) {
-               QAction * act = menu.addAction("Rename Function");
-               connect(act, &QAction::triggered, [=]() {this->renameFunction(objects_list[item]->getFunction());});
-       }
+               if (objects_list.find(item) != objects_list.end()) {
+                       act = menu.addAction("Rename Function");
+                       connect(act, &QAction::triggered, [=]() {this->renameFunction(objects_list[item]->getFunction());});
+               } else {
+                       act = menu.addAction("Rename Group");
+                       connect(act, &QAction::triggered, [=]() {renameGroup(item);});
+               }
 
-       QAction * act = menu.addAction("AddFunction");
-       connect(act, SIGNAL(triggered()), this, SLOT(requestNewFunction()));
+
+               QMenu* submenu = menu.addMenu("Move to group");
+
+               for (QTreeWidgetItem* groupitem : group_list) {
+                       act = submenu->addAction(groupitem->text(0));
+                       connect(act, &QAction::triggered,
+                               [=] () {
+                                       listWidget->invisibleRootItem()->removeChild(item);
+                                       groupitem->addChild(item);
+                               });
+               }
+       }
 
        menu.exec(listWidget->mapToGlobal(point));
 }
@@ -151,6 +183,18 @@ void Mainwindow::requestNewFunction() {
        }
 }
 
+void Mainwindow::requestNewGroup() {
+       SimpleStringDialog dialog("New Group");
+       int result = dialog.exec();
+       if (QDialog::Accepted == result) {
+               QTreeWidgetItem * external = new QTreeWidgetItem(listWidget, QStringList(dialog.result()));
+               external->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);
+               group_list.push_back(external);
+       } else {
+               LOG4CXX_DEBUG(logger, "requestNewGroup aborted");
+       }
+}
+
 void Mainwindow::requestNewFunctionByAddress(uint64_t address) {
        LOG4CXX_DEBUG(logger, "requesting Function at " << std::hex << address);
        manager->getDisassembler()->disassembleFunctionAt(address);
@@ -170,6 +214,18 @@ void Mainwindow::renameFunction(Function* function) {
        }
 }
 
+void Mainwindow::renameGroup(QTreeWidgetItem* item) {
+       SimpleStringDialog dialog("New name");
+       int result = dialog.exec();
+       if (QDialog::Accepted == result) {
+               LOG4CXX_DEBUG(logger, "renaming group " << item->text(0).toStdString()
+                             << " to " << dialog.result().toStdString());
+               item->setText(0, dialog.result());
+       } else {
+               LOG4CXX_DEBUG(logger, "renameFunction aborted");
+       }
+}
+
 void Mainwindow::addFunction(Function* fun) {
        if (functions.find(fun->getStartAddress()) != functions.end())
                return;