aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavel Pisa <pisa@cmp.felk.cvut.cz>2019-08-20 09:31:09 +0200
committerPavel Pisa <pisa@cmp.felk.cvut.cz>2019-08-20 09:31:09 +0200
commit724ee7e216d315ffa75c6930f4d290ccd0fe91bf (patch)
tree7622f4689f2cafc9f4904c64666386e5b4d46861
parentd8e92264f50553a5cae9ac70150d22584067accf (diff)
downloadqtmips-724ee7e216d315ffa75c6930f4d290ccd0fe91bf.tar.gz
qtmips-724ee7e216d315ffa75c6930f4d290ccd0fe91bf.tar.bz2
qtmips-724ee7e216d315ffa75c6930f4d290ccd0fe91bf.zip
Ask for modified source close and handle unnamed sources close.
Signed-off-by: Pavel Pisa <pisa@cmp.felk.cvut.cz>
-rw-r--r--qtmips_gui/mainwindow.cpp69
-rw-r--r--qtmips_gui/mainwindow.h4
-rw-r--r--qtmips_gui/savechangeddialog.cpp13
3 files changed, 76 insertions, 10 deletions
diff --git a/qtmips_gui/mainwindow.cpp b/qtmips_gui/mainwindow.cpp
index 932a6be..a344fc6 100644
--- a/qtmips_gui/mainwindow.cpp
+++ b/qtmips_gui/mainwindow.cpp
@@ -120,7 +120,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
connect(ui->actionOpen, SIGNAL(triggered(bool)), this, SLOT(open_source()));
connect(ui->actionSave, SIGNAL(triggered(bool)), this, SLOT(save_source()));
connect(ui->actionSaveAs, SIGNAL(triggered(bool)), this, SLOT(save_source_as()));
- connect(ui->actionClose, SIGNAL(triggered(bool)), this, SLOT(close_source()));
+ connect(ui->actionClose, SIGNAL(triggered(bool)), this, SLOT(close_source_check()));
connect(ui->actionMnemonicRegisters, SIGNAL(triggered(bool)), this, SLOT(view_mnemonics_registers(bool)));
connect(ui->actionCompileSource, SIGNAL(triggered(bool)), this, SLOT(compile_source()));
connect(ui->actionBuildExe, SIGNAL(triggered(bool)), this, SLOT(build_execute()));
@@ -386,14 +386,15 @@ void MainWindow::show_symbol_dialog(){
return;
QStringList *symnames = machine->symbol_table()->names();
GoToSymbolDialog *gotosyboldialog = new GoToSymbolDialog(this, *symnames);
+ delete symnames;
connect(gotosyboldialog, SIGNAL(program_focus_addr(std::uint32_t)),
program, SIGNAL(focus_addr_with_save(std::uint32_t)));
connect(gotosyboldialog, SIGNAL(memory_focus_addr(std::uint32_t)),
memory, SIGNAL(focus_addr(std::uint32_t)));
connect(gotosyboldialog, SIGNAL(obtain_value_for_name(std::uint32_t&,QString)),
machine->symbol_table(), SLOT(name_to_value(std::uint32_t&,QString)));
- gotosyboldialog->exec();
- delete symnames;
+ gotosyboldialog->setAttribute(Qt::WA_DeleteOnClose);
+ gotosyboldialog->open();
}
void MainWindow::about_qtmips()
@@ -438,7 +439,7 @@ void MainWindow::closeEvent(QCloseEvent *event) {
settings->sync();
QStringList list;
- if (modified_file_list(list) && !ignore_unsaved) {
+ if (modified_file_list(list, true) && !ignore_unsaved) {
SaveChnagedDialog *dialog = new SaveChnagedDialog(list, this);
connect(dialog, SIGNAL(user_decision(bool,QStringList&)),
this, SLOT(save_exit_or_ignore(bool,QStringList&)));
@@ -448,11 +449,29 @@ void MainWindow::closeEvent(QCloseEvent *event) {
}
void MainWindow::save_exit_or_ignore(bool cancel, QStringList &tosavelist) {
+ bool save_unnamed = false;
if (cancel)
return;
for (const auto &fname : tosavelist) {
SrcEditor *editor = source_editor_for_file(fname, false);
- editor->saveFile();
+ if (fname.isEmpty()) {
+ save_unnamed = true;
+ } else if (editor != nullptr) {
+ editor->saveFile();
+ }
+ }
+ if (save_unnamed && (central_window != nullptr)) {
+ for (int i = 0; i < central_window->count(); i++) {
+ QWidget *w = central_window->widget(i);
+ SrcEditor *editor = dynamic_cast<SrcEditor *>(w);
+ if (editor == nullptr)
+ continue;
+ if (!editor->filename().isEmpty())
+ continue;
+ central_window->setCurrentWidget(editor);
+ save_source_as();
+ return;
+ }
}
ignore_unsaved = true;
close();
@@ -569,7 +588,7 @@ void MainWindow::update_open_file_list() {
settings->setValue("openSrcFiles", open_src_files);
}
-bool MainWindow::modified_file_list(QStringList &list) {
+bool MainWindow::modified_file_list(QStringList &list, bool report_unnamed) {
bool ret = false;
list.clear();
QStringList open_src_files;
@@ -580,7 +599,7 @@ bool MainWindow::modified_file_list(QStringList &list) {
SrcEditor *editor = dynamic_cast<SrcEditor *>(w);
if (editor == nullptr)
continue;
- if (editor->filename() == "")
+ if ((editor->filename() == "") && !report_unnamed)
continue;
if (!editor->isModified())
continue;
@@ -734,6 +753,42 @@ void MainWindow::save_source() {
#endif
}
+void MainWindow::close_source_check() {
+ if (current_srceditor == nullptr)
+ return;
+ SrcEditor *editor = current_srceditor;
+ if (!editor->isModified()) {
+ close_source();
+ return;
+ }
+ QMessageBox *msgbox = new QMessageBox(this);
+ msgbox->setWindowTitle("Close unsaved source");
+ msgbox->setText("Close unsaved source.");
+ msgbox->setInformativeText("Do you want to save your changes?");
+ msgbox->setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
+ msgbox->setDefaultButton(QMessageBox::Save);
+ msgbox->setMinimumSize(QSize(200, 100));
+ msgbox->setAttribute(Qt::WA_DeleteOnClose);
+ connect(msgbox, SIGNAL(finished(int)),
+ this, SLOT(close_source_decided(int)));
+ msgbox->open();
+}
+
+void MainWindow::close_source_decided(int result) {
+ if (current_srceditor == nullptr)
+ return;
+ SrcEditor *editor = current_srceditor;
+ if (result == QMessageBox::Save) {
+ if (editor->filename().isEmpty()) {
+ save_source_as();
+ return;
+ }
+ } else if (result != QMessageBox::Discard) {
+ return;
+ }
+ close_source();
+}
+
void MainWindow::close_source() {
if (current_srceditor == nullptr)
return;
diff --git a/qtmips_gui/mainwindow.h b/qtmips_gui/mainwindow.h
index 1a854e6..ba2998e 100644
--- a/qtmips_gui/mainwindow.h
+++ b/qtmips_gui/mainwindow.h
@@ -87,6 +87,8 @@ public slots:
void save_source();
void save_source_as();
void close_source();
+ void close_source_check();
+ void close_source_decided(int result);
void compile_source();
void build_execute();
void build_execute_no_check();
@@ -156,7 +158,7 @@ private:
void show_dockwidget(QDockWidget *w, Qt::DockWidgetArea area = Qt::RightDockWidgetArea);
void add_src_editor_to_tabs(SrcEditor *editor);
void update_open_file_list();
- bool modified_file_list(QStringList &list);
+ bool modified_file_list(QStringList &list, bool report_unnamed = false);
SrcEditor *source_editor_for_file(QString filename, bool open);
QPointer<ExtProcess> build_process;
bool ignore_unsaved;
diff --git a/qtmips_gui/savechangeddialog.cpp b/qtmips_gui/savechangeddialog.cpp
index dda1949..1849245 100644
--- a/qtmips_gui/savechangeddialog.cpp
+++ b/qtmips_gui/savechangeddialog.cpp
@@ -51,11 +51,20 @@ SaveChnagedDialog::SaveChnagedDialog(QStringList &changedlist, QWidget *parent)
setWindowTitle(tr("Save next modified files?"));
model = new QStandardItemModel(this);
+ bool unknown_inserted = false;
for ( const auto& fname : changedlist) {
int row = model->rowCount();
QStandardItem* item = new QStandardItem();
- item->setText(fname);
+ item->setData(fname, Qt::UserRole);
+ if (!fname.isEmpty()) {
+ item->setText(fname);
+ } else {
+ if (!unknown_inserted) {
+ item->setText("Unknown");
+ unknown_inserted = true;
+ }
+ }
item->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
item->setCheckState(Qt::Checked);
model->setItem(row, 0, item);
@@ -109,7 +118,7 @@ void SaveChnagedDialog::save_clicked() {
QStringList list;
for(int r = 0; r < model->rowCount(); ++r) {
if (model->item(r)->checkState() == Qt::Checked)
- list.append(model->item(r)->text());
+ list.append(model->item(r)->data(Qt::UserRole).toString());
}
emit user_decision(false, list);
close();