X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fmainwindow.cpp;h=ddc2c8f0435c798039ab369830a3368c148a23dc;hp=8aaa1635c737d376321b8ebcb9202572182cde98;hb=45cb64fff7ebf16381bb567e33c22a9ff6f78cd8;hpb=f30eb549fe91dde6a56f69c24f2f8169039c12a2 diff --git a/pv/mainwindow.cpp b/pv/mainwindow.cpp index 8aaa1635..ddc2c8f0 100644 --- a/pv/mainwindow.cpp +++ b/pv/mainwindow.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include "mainwindow.hpp" @@ -81,6 +82,7 @@ MainWindow::MainWindow(DeviceManager &device_manager, icon_grey_(":/icons/status-grey.svg") { qRegisterMetaType("util::Timestamp"); + qRegisterMetaType("uint64_t"); setup_ui(); restore_ui_settings(); @@ -213,6 +215,12 @@ shared_ptr MainWindow::add_view(const QString &title, this, SLOT(on_new_view(Session*))); main_bar->action_view_show_cursors()->setChecked(v->cursors_shown()); + + /* For the main view we need to prevent the dock widget from + * closing itself when its close button is clicked. This is + * so we can confirm with the user first. Regular views don't + * need this */ + close_btn->disconnect(SIGNAL(clicked()), dock, SLOT(close())); } else { /* Additional view, create a standard bar */ pv::views::trace::StandardBar *standard_bar = @@ -363,9 +371,11 @@ void MainWindow::setup_ui() run_stop_button_ = new QToolButton(); run_stop_button_->setAutoRaise(true); run_stop_button_->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); - run_stop_button_->setShortcut(QKeySequence(Qt::Key_Space)); run_stop_button_->setToolTip(tr("Start/Stop Acquisition")); + run_stop_shortcut_ = new QShortcut(QKeySequence(Qt::Key_Space), run_stop_button_, SLOT(click())); + run_stop_shortcut_->setAutoRepeat(false); + settings_button_ = new QToolButton(); settings_button_->setIcon(QIcon::fromTheme("configure", QIcon(":/icons/configure.png"))); @@ -477,8 +487,20 @@ std::shared_ptr MainWindow::get_tab_session(int index) const void MainWindow::closeEvent(QCloseEvent *event) { - save_ui_settings(); - event->accept(); + bool data_saved = true; + + for (auto entry : session_windows_) + if (!entry.first->data_saved()) + data_saved = false; + + if (!data_saved && (QMessageBox::question(this, tr("Confirmation"), + tr("There is unsaved data. Close anyway?"), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::No)) { + event->ignore(); + } else { + save_ui_settings(); + event->accept(); + } } QMenu* MainWindow::createPopupMenu() @@ -662,11 +684,16 @@ void MainWindow::on_view_close_clicked() if (!session->has_view(view)) continue; - // Also destroy the entire session if its main view is closing + // Also destroy the entire session if its main view is closing... if (view == session->main_view()) { - remove_session(session); + // ...but only if data is saved or the user confirms closing + if (session->data_saved() || (QMessageBox::question(this, tr("Confirmation"), + tr("This session contains unsaved data. Close it anyway?"), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)) + remove_session(session); break; } else + // All other views can be closed at any time as no data will be lost remove_view(view); } } @@ -681,11 +708,13 @@ void MainWindow::on_tab_changed(int index) void MainWindow::on_tab_close_requested(int index) { - // TODO Ask user if this is intended in case data is unsaved - shared_ptr session = get_tab_session(index); - if (session) + assert(session); + + if (session->data_saved() || (QMessageBox::question(this, tr("Confirmation"), + tr("This session contains unsaved data. Close it anyway?"), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)) remove_session(session); }