+void Mainwindow::save() {
+ QString filename = QFileDialog::getSaveFileName(this, tr("Save File"), "", tr("Frida Archives (*.frida)"));
+ manager->save(filename);
+}
+
+void Mainwindow::switchMainPlaneToAddress(uint64_t address) {
+ if (objects_list_by_address.find(address) != objects_list_by_address.end()) {
+ LOG4CXX_DEBUG(logger, "Switching to function " << std::hex << address);
+ QListWidgetItem * item = objects_list_by_address[address];
+ listWidget->setCurrentItem(item);
+ stackedWidget->setCurrentWidget(objects_list[item]);
+ } else {
+ LOG4CXX_DEBUG(logger, "No function at " << std::hex << address
+ << " -- it's probably an imported Symbol");
+ }
+}
+
+void Mainwindow::switchMainPlane(int index) {
+ stackedWidget->setCurrentWidget(objects_list[listWidget->currentItem()]);
+}
+
+void Mainwindow::showListContextMenu(const QPoint& point) {
+ QListWidgetItem * item = listWidget->itemAt(point);
+ QMenu menu(this);
+ if (item) {
+ QAction * act = menu.addAction("Rename Function");
+ connect(act, &QAction::triggered, [=]() {this->renameFunction(item);});
+ } else {
+ QAction * act = menu.addAction("AddFunction");
+ connect(act, SIGNAL(triggered()), this, SLOT(requestNewFunction()));
+ }
+ menu.exec(listWidget->mapToGlobal(point));
+}
+
+void Mainwindow::requestNewFunction() {
+ NewFunctionDialog dialog;
+ int result = dialog.exec();
+ if (QDialog::Accepted == result) {
+ requestNewFunctionByAddress(dialog.result());
+ } else {
+ LOG4CXX_DEBUG(logger, "requestNewFunction aborted");
+ }
+}
+
+void Mainwindow::requestNewFunctionByAddress(uint64_t address) {
+ LOG4CXX_DEBUG(logger, "requesting Function at " << std::hex << address);
+ manager->getDisassembler()->disassembleFunctionAt(address);
+ switchMainPlaneToAddress(address);
+}
+
+void Mainwindow::renameFunction(QListWidgetItem * item) {
+ SimpleStringDialog dialog("New name");
+ int result = dialog.exec();
+ if (QDialog::Accepted == result) {
+ LOG4CXX_DEBUG(logger, "renaming Function " << item->text().toStdString()
+ << " to " << dialog.result().toStdString());
+ item->setText(dialog.result());
+ } else {
+ LOG4CXX_DEBUG(logger, "renameFunction aborted");
+ }
+}
+