X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fmainwindow.cpp;h=92c92d023225a7d5fa7cb5f54764d4e1218b2a12;hp=dab9c7866fab2b61ac85438dfe336bb05a96a9cd;hb=0ff97f965aca66a69fd44a870d42f2bd67d38e94;hpb=c9da51187f8db0c9822d544a0253e0e7a58945d7 diff --git a/pv/mainwindow.cpp b/pv/mainwindow.cpp index dab9c786..92c92d02 100644 --- a/pv/mainwindow.cpp +++ b/pv/mainwindow.cpp @@ -62,6 +62,8 @@ class ViewItem; using toolbars::MainBar; +const QString MainWindow::WindowTitle = tr("PulseView"); + MainWindow::MainWindow(DeviceManager &device_manager, string open_file_name, string open_file_format, QWidget *parent) : @@ -161,7 +163,7 @@ shared_ptr MainWindow::get_active_view() const if (entry.first.get() == dock) return entry.second; - return shared_ptr(); + return nullptr; } shared_ptr MainWindow::add_view(const QString &title, @@ -186,7 +188,14 @@ shared_ptr MainWindow::add_view(const QString &title, dock->setWidget(dock_main); dock->setFeatures(QDockWidget::DockWidgetMovable | - QDockWidget::DockWidgetFloatable); + QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetClosable); + + QAbstractButton *close_btn = + dock->findChildren + ("qt_dockwidget_closebutton").front(); + + connect(close_btn, SIGNAL(clicked(bool)), + this, SLOT(on_view_close_clicked())); if (type == view::TraceView) { connect(&session, SIGNAL(trigger_event(util::Timestamp)), v.get(), @@ -225,6 +234,8 @@ shared_ptr MainWindow::add_session() connect(session.get(), SIGNAL(add_view(const QString&, view::ViewType, Session*)), this, SLOT(on_add_view(const QString&, view::ViewType, Session*))); + connect(session.get(), SIGNAL(name_changed()), + this, SLOT(on_session_name_changed())); sessions_.push_back(session); @@ -234,6 +245,24 @@ shared_ptr MainWindow::add_session() return session; } +void MainWindow::remove_session(shared_ptr session) +{ + for (shared_ptr view : session->views()) { + // Find the dock the view is contained in and close it + for (auto entry : view_docks_) + if (entry.second == view) + entry.first->close(); + } + + sessions_.remove_if([&](shared_ptr s) { + return s == session; }); + + // Update the window title if there is no view left to + // generate focus change events + if (sessions_.empty()) + on_session_name_changed(); +} + void MainWindow::setup_ui() { setObjectName(QString::fromUtf8("MainWindow")); @@ -262,8 +291,9 @@ void MainWindow::setup_ui() setDockNestingEnabled(true); - // Set the title - setWindowTitle(tr("PulseView")); + connect(static_cast(QCoreApplication::instance()), + SIGNAL(focusChanged(QWidget*, QWidget*)), + this, SLOT(on_focus_changed())); } void MainWindow::save_ui_settings() @@ -277,7 +307,7 @@ void MainWindow::save_ui_settings() settings.endGroup(); for (shared_ptr session : sessions_) { - // Ignore sessions using the demo device + // Ignore sessions using the demo device or no device at all if (session->device()) { shared_ptr device = dynamic_pointer_cast< devices::HardwareDevice > @@ -286,12 +316,12 @@ void MainWindow::save_ui_settings() if (device && device->hardware_device()->driver()->name() == "demo") continue; - } - settings.beginGroup("Session" + QString::number(id++)); - settings.remove(""); // Remove all keys in this group - session->save_settings(settings); - settings.endGroup(); + settings.beginGroup("Session" + QString::number(id++)); + settings.remove(""); // Remove all keys in this group + session->save_settings(settings); + settings.endGroup(); + } } settings.setValue("sessions", id); @@ -353,11 +383,49 @@ void MainWindow::on_add_view(const QString &title, view::ViewType type, add_view(title, type, *s); } +void MainWindow::on_focus_changed() +{ + shared_ptr view; + bool title_set = false; + + view = get_active_view(); + + for (shared_ptr session : sessions_) { + if (!session->has_view(view)) + continue; + + setWindowTitle(session->name() + " - " + WindowTitle); + title_set = true; + } + + if (!title_set) + setWindowTitle(WindowTitle); +} + void MainWindow::on_new_session() { add_session(); } +void MainWindow::on_session_name_changed() +{ + // Update the corresponding dock widget's name(s) + Session *session = qobject_cast(QObject::sender()); + assert(session); + + for (shared_ptr view : session->views()) { + // Get the dock that contains the view + for (auto entry : view_docks_) + if (entry.second == view) { + entry.first->setObjectName(session->name()); + entry.first->setWindowTitle(session->name()); + } + } + + // Refresh window title if the affected session has focus + on_focus_changed(); +} + void MainWindow::on_new_view(Session *session) { // We get a pointer and need a reference @@ -366,6 +434,40 @@ void MainWindow::on_new_view(Session *session) add_view(session->name(), pv::view::TraceView, *s); } +void MainWindow::on_view_close_clicked() +{ + // Find the dock widget that contains the close button that was clicked + QObject *w = QObject::sender(); + QDockWidget *dock = 0; + + while (w) { + dock = qobject_cast(w); + if (dock) + break; + w = w->parent(); + } + + // Get the view contained in the dock widget + shared_ptr view; + + for (auto entry : view_docks_) + if (entry.first.get() == dock) + view = entry.second; + + // Deregister the view + for (shared_ptr session : sessions_) { + if (!session->has_view(view)) + continue; + + // Also destroy the entire session if its main view is closing + if (view == session->main_view()) { + remove_session(session); + break; + } else + session->deregister_view(view); + } +} + void MainWindow::on_actionViewStickyScrolling_triggered() { shared_ptr view = get_active_view();