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 =
return nullptr;
}
+void MainWindow::remove_view(shared_ptr<views::ViewBase> view)
+{
+ for (shared_ptr<Session> session : sessions_) {
+ if (!session->has_view(view))
+ continue;
+
+ // Find the dock the view is contained in and remove it
+ for (auto entry : view_docks_)
+ if (entry.second == view) {
+ // Remove the view from the session
+ session->deregister_view(view);
+
+ // Remove the view from its parent; otherwise, Qt will
+ // call deleteLater() on it, which causes a double free
+ // since the shared_ptr in view_docks_ doesn't know
+ // that Qt keeps a pointer to the view around
+ view->setParent(0);
+
+ // Delete the view's dock widget and all widgets inside it
+ entry.first->deleteLater();
+
+ // Remove the dock widget from the list and stop iterating
+ view_docks_.erase(entry.first);
+ break;
+ }
+ }
+}
+
shared_ptr<Session> MainWindow::add_session()
{
static int last_session_id = 1;
{
int h = new_session_button_->height();
- for (shared_ptr<views::ViewBase> view : session->views()) {
- // Find the dock the view is contained in and remove it
- for (auto entry : view_docks_)
- if (entry.second == view) {
- // Remove the view from the session
- session->deregister_view(view);
-
- // Remove the view from its parent; otherwise, Qt will
- // call deleteLater() on it, which causes a double free
- // since the shared_ptr in view_docks_ doesn't know
- // that Qt keeps a pointer to the view around
- entry.second->setParent(0);
-
- // Remove this entry from the container and stop iterating.
- view_docks_.erase(entry.first);
- break;
- }
- }
+ for (shared_ptr<views::ViewBase> view : session->views())
+ remove_view(view);
QMainWindow *window = session_windows_.at(session);
session_selector_.removeTab(session_selector_.indexOf(window));
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()
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
- session->deregister_view(view);
+ // All other views can be closed at any time as no data will be lost
+ remove_view(view);
}
}
void MainWindow::on_tab_close_requested(int index)
{
- // TODO Ask user if this is intended in case data is unsaved
-
shared_ptr<Session> 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);
}