X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fmainwindow.cpp;h=36f9b1a086f9861358f3de8028a4e37ff6e654d5;hp=53ff35a9d427dcc108343e318281b3ecf5dc6d67;hb=cc9646457d64b0a74e59ef511c3ae3db345bdbe4;hpb=f1e2d26b867fc5ab5723d83c00bd9467add2f748 diff --git a/pv/mainwindow.cpp b/pv/mainwindow.cpp index 53ff35a9..36f9b1a0 100644 --- a/pv/mainwindow.cpp +++ b/pv/mainwindow.cpp @@ -248,6 +248,8 @@ shared_ptr MainWindow::add_session() void MainWindow::remove_session(shared_ptr session) { + int h = new_session_button_->height(); + for (shared_ptr view : session->views()) { // Find the dock the view is contained in and remove it for (auto entry : view_docks_) @@ -274,10 +276,21 @@ void MainWindow::remove_session(shared_ptr session) 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()) + if (sessions_.empty()) { + // When there are no more tabs, the height of the QTabWidget + // drops to zero. We must prevent this to keep the static + // widgets visible + for (QWidget *w : static_tab_widget_->findChildren()) + w->setMinimumHeight(h); + + int margin = static_tab_widget_->layout()->contentsMargins().bottom(); + static_tab_widget_->setMinimumHeight(h + 2 * margin); + session_selector_.setMinimumHeight(h + 2 * margin); + + // Update the window title if there is no view left to + // generate focus change events setWindowTitle(WindowTitle); + } } void MainWindow::setup_ui() @@ -318,11 +331,10 @@ void MainWindow::setup_ui() layout->setContentsMargins(2, 2, 2, 2); layout->addWidget(new_session_button_); - QWidget* static_tab_widget_ = new QWidget(); + static_tab_widget_ = new QWidget(); static_tab_widget_->setLayout(layout); session_selector_.setCornerWidget(static_tab_widget_, Qt::TopLeftCorner); - session_selector_.setTabsClosable(true); connect(new_session_button_, SIGNAL(clicked(bool)), @@ -330,6 +342,8 @@ void MainWindow::setup_ui() connect(&session_selector_, SIGNAL(tabCloseRequested(int)), this, SLOT(on_tab_close_requested(int))); + connect(&session_selector_, SIGNAL(currentChanged(int)), + this, SLOT(on_tab_changed(int))); connect(static_cast(QCoreApplication::instance()), @@ -393,6 +407,16 @@ void MainWindow::restore_ui_settings() } } +std::shared_ptr MainWindow::get_tab_session(int index) const +{ + // Find the session that belongs to the tab's main window + for (auto entry : session_windows_) + if (entry.second == session_selector_.widget(index)) + return entry.first; + + return nullptr; +} + void MainWindow::closeEvent(QCloseEvent *event) { save_ui_settings(); @@ -426,23 +450,39 @@ void MainWindow::on_add_view(const QString &title, views::ViewType type, 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; + static shared_ptr prev_session; + + shared_ptr view = get_active_view(); + + if (view) { + for (shared_ptr session : sessions_) { + if (session->has_view(view)) { + if (session != prev_session) { + // Activate correct tab if necessary + shared_ptr tab_session = get_tab_session( + session_selector_.currentIndex()); + if (tab_session != session) + session_selector_.setCurrentWidget( + session_windows_.at(session)); + + on_focused_session_changed(session); + } + + prev_session = session; + break; + } + } } - if (!title_set) + if (sessions_.empty()) setWindowTitle(WindowTitle); } +void MainWindow::on_focused_session_changed(shared_ptr session) +{ + setWindowTitle(session->name() + " - " + WindowTitle); +} + void MainWindow::on_new_session_clicked() { add_session(); @@ -464,7 +504,10 @@ void MainWindow::on_session_name_changed() } // Refresh window title if the affected session has focus - on_focus_changed(); + shared_ptr view = get_active_view(); + + if (view && session->has_view(view)) + setWindowTitle(session->name() + " - " + WindowTitle); } void MainWindow::on_new_view(Session *session) @@ -509,16 +552,22 @@ void MainWindow::on_view_close_clicked() } } +void MainWindow::on_tab_changed(int index) +{ + shared_ptr session = get_tab_session(index); + + if (session) + on_focused_session_changed(session); +} + void MainWindow::on_tab_close_requested(int index) { // TODO Ask user if this is intended in case data is unsaved - // Find the session that belongs to this main window and remove it - for (auto entry : session_windows_) - if (entry.second == session_selector_.widget(index)) { - remove_session(entry.first); - break; - } + shared_ptr session = get_tab_session(index); + + if (session) + remove_session(session); } void MainWindow::on_actionViewStickyScrolling_triggered()