X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fmainwindow.cpp;h=d04759cfe380d0920c2408ba10aaeaea065b0eb5;hp=fd889e9e9176d6017c340f30d31d4b2b105b545d;hb=b6262d704b8f34f5de6ffa9a54d2adf3ebf02556;hpb=21f5864602c5c1920fc9b44813f31e789bee6895 diff --git a/pv/mainwindow.cpp b/pv/mainwindow.cpp index fd889e9e..d04759cf 100644 --- a/pv/mainwindow.cpp +++ b/pv/mainwindow.cpp @@ -49,6 +49,10 @@ #include "views/trace/view.hpp" #include "views/trace/standardbar.hpp" +#ifdef ENABLE_DECODE +#include "subwindows/decoder_selector/subwindow.hpp" +#endif + #include using std::dynamic_pointer_cast; @@ -85,8 +89,13 @@ MainWindow::~MainWindow() { GlobalSettings::remove_change_handler(this); + // Make sure we no longer hold any shared pointers to widgets after the + // destructor finishes (goes for sessions and sub windows alike) + while (!sessions_.empty()) remove_session(sessions_.front()); + + sub_windows_.clear(); } void MainWindow::show_session_error(const QString text, const QString info_text) @@ -95,8 +104,7 @@ void MainWindow::show_session_error(const QString text, const QString info_text) qDebug() << "Notifying user of session error:" << info_text; QMessageBox msg; - msg.setText(text); - msg.setInformativeText(info_text); + msg.setText(text + "\n\n" + info_text); msg.setStandardButtons(QMessageBox::Ok); msg.setIcon(QMessageBox::Warning); msg.exec(); @@ -195,6 +203,8 @@ shared_ptr MainWindow::add_view(const QString &title, connect(main_bar.get(), SIGNAL(new_view(Session*)), this, SLOT(on_new_view(Session*))); + connect(main_bar.get(), SIGNAL(show_decoder_selector(Session*)), + this, SLOT(on_show_decoder_selector(Session*))); main_bar->action_view_show_cursors()->setChecked(tv->cursors_shown()); @@ -244,6 +254,71 @@ void MainWindow::remove_view(shared_ptr view) } } +shared_ptr MainWindow::add_subwindow( + subwindows::SubWindowType type, Session &session) +{ + GlobalSettings settings; + shared_ptr v; + + QMainWindow *main_window = nullptr; + for (auto entry : session_windows_) + if (entry.first.get() == &session) + main_window = entry.second; + + assert(main_window); + + QString title = ""; + + switch (type) { +#ifdef ENABLE_DECODE + case subwindows::SubWindowTypeDecoderSelector: + title = tr("Decoder Selector"); + break; +#endif + default: + break; + } + + QDockWidget* dock = new QDockWidget(title, main_window); + dock->setObjectName(title); + main_window->addDockWidget(Qt::TopDockWidgetArea, dock); + + // Insert a QMainWindow into the dock widget to allow for a tool bar + QMainWindow *dock_main = new QMainWindow(dock); + dock_main->setWindowFlags(Qt::Widget); // Remove Qt::Window flag + +#ifdef ENABLE_DECODE + if (type == subwindows::SubWindowTypeDecoderSelector) + v = make_shared(session, dock_main); +#endif + + if (!v) + return nullptr; + + sub_windows_[dock] = v; + dock_main->setCentralWidget(v.get()); + dock->setWidget(dock_main); + + dock->setContextMenuPolicy(Qt::PreventContextMenu); + dock->setFeatures(QDockWidget::DockWidgetMovable | + QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetClosable); + + QAbstractButton *close_btn = + dock->findChildren + ("qt_dockwidget_closebutton").front(); + + connect(close_btn, SIGNAL(clicked(bool)), + this, SLOT(on_sub_window_close_clicked())); + + if (v->has_toolbar()) + dock_main->addToolBar(v->create_toolbar(dock_main)); + + if (v->minimum_width() > 0) + dock->setMinimumSize(v->minimum_width(), 0); + + return v; +} + shared_ptr MainWindow::add_session() { static int last_session_id = 1; @@ -324,10 +399,10 @@ void MainWindow::remove_session(shared_ptr session) } void MainWindow::add_session_with_file(string open_file_name, - string open_file_format) + string open_file_format, string open_setup_file_name) { shared_ptr session = add_session(); - session->load_init_file(open_file_name, open_file_format); + session->load_init_file(open_file_name, open_file_format, open_setup_file_name); } void MainWindow::add_default_session() @@ -436,6 +511,12 @@ void MainWindow::setup_ui() view_colored_bg_shortcut_ = new QShortcut(QKeySequence(Qt::Key_B), this, SLOT(on_view_colored_bg_shortcut())); view_colored_bg_shortcut_->setAutoRepeat(false); + zoom_in_shortcut_ = new QShortcut(QKeySequence(Qt::Key_Plus), this, SLOT(on_zoom_in_shortcut_triggered())); + zoom_in_shortcut_->setAutoRepeat(false); + + zoom_out_shortcut_ = new QShortcut(QKeySequence(Qt::Key_Minus), this, SLOT(on_zoom_out_shortcut_triggered())); + zoom_out_shortcut_->setAutoRepeat(false); + // Set up the tab area new_session_button_ = new QToolButton(); new_session_button_->setIcon(QIcon::fromTheme("document-new", @@ -526,6 +607,19 @@ void MainWindow::restore_ui_settings() settings.endGroup(); } +void MainWindow::zoom_current_view(double steps) +{ + shared_ptr session = get_tab_session(session_selector_.currentIndex()); + + if (!session) + return; + + shared_ptr v = session.get()->main_view(); + views::trace::View *tv = + qobject_cast(v.get()); + tv->zoom(steps); +} + shared_ptr MainWindow::get_tab_session(int index) const { // Find the session that belongs to the tab's main window @@ -760,6 +854,43 @@ void MainWindow::on_tab_close_requested(int index) remove_session(session); } +void MainWindow::on_show_decoder_selector(Session *session) +{ +#ifdef ENABLE_DECODE + // Close dock widget if it's already showing and return + for (auto entry : sub_windows_) { + QDockWidget* dock = entry.first; + if (dynamic_pointer_cast(entry.second)) { + sub_windows_.erase(dock); + dock->close(); + return; + } + } + + // We get a pointer and need a reference + for (shared_ptr s : sessions_) + if (s.get() == session) + add_subwindow(subwindows::SubWindowTypeDecoderSelector, *s); +#endif +} + +void MainWindow::on_sub_window_close_clicked() +{ + // Find the dock widget that contains the close button that was clicked + QObject *w = QObject::sender(); + QDockWidget *dock = nullptr; + + while (w) { + dock = qobject_cast(w); + if (dock) + break; + w = w->parent(); + } + + sub_windows_.erase(dock); + dock->close(); +} + void MainWindow::on_view_colored_bg_shortcut() { GlobalSettings settings; @@ -837,6 +968,16 @@ void MainWindow::on_settingViewShowAnalogMinorGrid_changed(const QVariant new_va } } +void MainWindow::on_zoom_out_shortcut_triggered() +{ + zoom_current_view(-1); +} + +void MainWindow::on_zoom_in_shortcut_triggered() +{ + zoom_current_view(1); +} + void MainWindow::on_close_current_tab() { int tab = session_selector_.currentIndex();