X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fmainwindow.cpp;h=dfabc9a06797f0a080ae16069b16de70f0929280;hp=a11d5286dd049c67627359e6aaeb196b7d0f5009;hb=b571a8e7e0dc3e3b6daa58f27050e76466f006dd;hpb=f23c46921d031dba4c96062164cc9f3ca3c4809c diff --git a/pv/mainwindow.cpp b/pv/mainwindow.cpp index a11d5286..dfabc9a0 100644 --- a/pv/mainwindow.cpp +++ b/pv/mainwindow.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -50,11 +51,8 @@ #include -using std::bind; using std::dynamic_pointer_cast; using std::make_shared; -using std::map; -using std::placeholders::_1; using std::shared_ptr; using std::string; @@ -80,17 +78,7 @@ MainWindow::MainWindow(DeviceManager &device_manager, QWidget *parent) : qRegisterMetaType("util::Timestamp"); qRegisterMetaType("uint64_t"); - GlobalSettings::register_change_handler(GlobalSettings::Key_View_ColouredBG, - bind(&MainWindow::on_settingViewColouredBg_changed, this, _1)); - - GlobalSettings::register_change_handler(GlobalSettings::Key_View_ShowSamplingPoints, - bind(&MainWindow::on_settingViewShowSamplingPoints_changed, this, _1)); - - GlobalSettings::register_change_handler(GlobalSettings::Key_View_ShowAnalogMinorGrid, - bind(&MainWindow::on_settingViewShowAnalogMinorGrid_changed, this, _1)); - - GlobalSettings settings; - settings.set_defaults_where_needed(); + GlobalSettings::add_change_handler(this); setup_ui(); restore_ui_settings(); @@ -98,10 +86,25 @@ MainWindow::MainWindow(DeviceManager &device_manager, QWidget *parent) : MainWindow::~MainWindow() { + GlobalSettings::remove_change_handler(this); + while (!sessions_.empty()) remove_session(sessions_.front()); } +void MainWindow::show_session_error(const QString text, const QString info_text) +{ + // TODO Emulate noquote() + qDebug() << "Notifying user of session error:" << info_text; + + QMessageBox msg; + msg.setText(text); + msg.setInformativeText(info_text); + msg.setStandardButtons(QMessageBox::Ok); + msg.setIcon(QMessageBox::Warning); + msg.exec(); +} + shared_ptr MainWindow::get_active_view() const { // If there's only one view, use it... @@ -120,7 +123,7 @@ shared_ptr MainWindow::get_active_view() const } // Get the view contained in the dock widget - for (auto entry : view_docks_) + for (auto& entry : view_docks_) if (entry.first == dock) return entry.second; @@ -134,7 +137,7 @@ shared_ptr MainWindow::add_view(const QString &title, shared_ptr v; QMainWindow *main_window = nullptr; - for (auto entry : session_windows_) + for (auto& entry : session_windows_) if (entry.first.get() == &session) main_window = entry.second; @@ -169,21 +172,21 @@ shared_ptr MainWindow::add_view(const QString &title, QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetClosable); QAbstractButton *close_btn = - dock->findChildren - ("qt_dockwidget_closebutton").front(); + dock->findChildren("qt_dockwidget_closebutton") + .front(); // clazy:exclude=detaching-temporary connect(close_btn, SIGNAL(clicked(bool)), this, SLOT(on_view_close_clicked())); - connect(&session, SIGNAL(trigger_event(util::Timestamp)), + connect(&session, SIGNAL(trigger_event(int, util::Timestamp)), qobject_cast(v.get()), - SLOT(trigger_event(util::Timestamp))); + SLOT(trigger_event(int, util::Timestamp))); if (type == views::ViewTypeTrace) { views::trace::View *tv = qobject_cast(v.get()); - tv->enable_coloured_bg(settings.value(GlobalSettings::Key_View_ColouredBG).toBool()); + tv->enable_colored_bg(settings.value(GlobalSettings::Key_View_ColoredBG).toBool()); tv->enable_show_sampling_points(settings.value(GlobalSettings::Key_View_ShowSamplingPoints).toBool()); tv->enable_show_analog_minor_grid(settings.value(GlobalSettings::Key_View_ShowAnalogMinorGrid).toBool()); @@ -223,7 +226,7 @@ void MainWindow::remove_view(shared_ptr view) continue; // Find the dock the view is contained in and remove it - for (auto entry : view_docks_) + for (auto& entry : view_docks_) if (entry.second == view) { // Remove the view from the session session->deregister_view(view); @@ -291,7 +294,7 @@ void MainWindow::remove_session(shared_ptr session) session->stop_capture(); QApplication::processEvents(); - for (shared_ptr view : session->views()) + for (const shared_ptr& view : session->views()) remove_view(view); QMainWindow *window = session_windows_.at(session); @@ -311,7 +314,7 @@ void MainWindow::remove_session(shared_ptr session) // drops to zero. We must prevent this to keep the static // widgets visible for (QWidget *w : static_tab_widget_->findChildren()) - w->setMinimumHeight(h); + w->setMinimumHeight(h); // clazy:exclude=range-loop int margin = static_tab_widget_->layout()->contentsMargins().bottom(); static_tab_widget_->setMinimumHeight(h + 2 * margin); @@ -338,20 +341,26 @@ void MainWindow::add_default_session() shared_ptr session = add_session(); - map dev_info; - shared_ptr other_device, demo_device; - - // Use any available device that's not demo - for (shared_ptr dev : device_manager_.devices()) { - if (dev->hardware_device()->driver()->name() == "demo") { + // Check the list of available devices. Prefer the one that was + // found with user supplied scan specs (if applicable). Then try + // one of the auto detected devices that are not the demo device. + // Pick demo in the absence of "genuine" hardware devices. + shared_ptr user_device, other_device, demo_device; + for (const shared_ptr& dev : device_manager_.devices()) { + if (dev == device_manager_.user_spec_device()) { + user_device = dev; + } else if (dev->hardware_device()->driver()->name() == "demo") { demo_device = dev; } else { other_device = dev; } } - - // ...and if there isn't any, just use demo then - session->select_device(other_device ? other_device : demo_device); + if (user_device) + session->select_device(user_device); + else if (other_device) + session->select_device(other_device); + else + session->select_device(demo_device); } void MainWindow::save_sessions() @@ -359,7 +368,7 @@ void MainWindow::save_sessions() QSettings settings; int id = 0; - for (shared_ptr session : sessions_) { + for (shared_ptr& session : sessions_) { // Ignore sessions using the demo device or no device at all if (session->device()) { shared_ptr device = @@ -395,6 +404,18 @@ void MainWindow::restore_sessions() } } +void MainWindow::on_setting_changed(const QString &key, const QVariant &value) +{ + if (key == GlobalSettings::Key_View_ColoredBG) + on_settingViewColoredBg_changed(value); + + if (key == GlobalSettings::Key_View_ShowSamplingPoints) + on_settingViewShowSamplingPoints_changed(value); + + if (key == GlobalSettings::Key_View_ShowAnalogMinorGrid) + on_settingViewShowAnalogMinorGrid_changed(value); +} + void MainWindow::setup_ui() { setObjectName(QString::fromUtf8("MainWindow")); @@ -403,7 +424,7 @@ void MainWindow::setup_ui() // Set the window icon QIcon icon; - icon.addFile(QString(":/icons/sigrok-logo-notext.png")); + icon.addFile(QString(":/icons/pulseview.png")); setWindowIcon(icon); view_sticky_scrolling_shortcut_ = new QShortcut(QKeySequence(Qt::Key_S), this, SLOT(on_view_sticky_scrolling_shortcut())); @@ -415,8 +436,8 @@ void MainWindow::setup_ui() view_show_analog_minor_grid_shortcut_ = new QShortcut(QKeySequence(Qt::Key_G), this, SLOT(on_view_show_analog_minor_grid_shortcut())); view_show_analog_minor_grid_shortcut_->setAutoRepeat(false); - view_coloured_bg_shortcut_ = new QShortcut(QKeySequence(Qt::Key_B), this, SLOT(on_view_coloured_bg_shortcut())); - view_coloured_bg_shortcut_->setAutoRepeat(false); + view_colored_bg_shortcut_ = new QShortcut(QKeySequence(Qt::Key_B), this, SLOT(on_view_colored_bg_shortcut())); + view_colored_bg_shortcut_->setAutoRepeat(false); // Set up the tab area new_session_button_ = new QToolButton(); @@ -511,7 +532,7 @@ void MainWindow::restore_ui_settings() 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_) + for (auto& entry : session_windows_) if (entry.second == session_selector_.widget(index)) return entry.first; @@ -522,7 +543,7 @@ void MainWindow::closeEvent(QCloseEvent *event) { bool data_saved = true; - for (auto entry : session_windows_) + for (auto& entry : session_windows_) if (!entry.first->data_saved()) data_saved = false; @@ -553,28 +574,11 @@ bool MainWindow::restoreState(const QByteArray &state, int version) return false; } -void MainWindow::session_error(const QString text, const QString info_text) -{ - QMetaObject::invokeMethod(this, "show_session_error", - Qt::QueuedConnection, Q_ARG(QString, text), - Q_ARG(QString, info_text)); -} - -void MainWindow::show_session_error(const QString text, const QString info_text) -{ - QMessageBox msg(this); - msg.setText(text); - msg.setInformativeText(info_text); - msg.setStandardButtons(QMessageBox::Ok); - msg.setIcon(QMessageBox::Warning); - msg.exec(); -} - void MainWindow::on_add_view(const QString &title, views::ViewType type, Session *session) { // We get a pointer and need a reference - for (shared_ptr s : sessions_) + for (shared_ptr& s : sessions_) if (s.get() == session) add_view(title, type, *s); } @@ -631,7 +635,7 @@ void MainWindow::on_run_stop_clicked() switch (session->get_capture_state()) { case Session::Stopped: session->start_capture([&](QString message) { - session_error("Capture failed", message); }); + show_session_error("Capture failed", message); }); break; case Session::AwaitingTrigger: case Session::Running: @@ -652,9 +656,9 @@ void MainWindow::on_session_name_changed() Session *session = qobject_cast(QObject::sender()); assert(session); - for (shared_ptr view : session->views()) { + for (const shared_ptr& view : session->views()) { // Get the dock that contains the view - for (auto entry : view_docks_) + for (auto& entry : view_docks_) if (entry.second == view) { entry.first->setObjectName(session->name()); entry.first->setWindowTitle(session->name()); @@ -662,7 +666,7 @@ void MainWindow::on_session_name_changed() } // Update the tab widget by finding the main window and the tab from that - for (auto entry : session_windows_) + for (auto& entry : session_windows_) if (entry.first.get() == session) { QMainWindow *window = entry.second; const int index = session_selector_.indexOf(window); @@ -694,7 +698,7 @@ void MainWindow::on_capture_state_changed(QObject *obj) void MainWindow::on_new_view(Session *session) { // We get a pointer and need a reference - for (shared_ptr s : sessions_) + for (shared_ptr& s : sessions_) if (s.get() == session) add_view(session->name(), views::ViewTypeTrace, *s); } @@ -715,7 +719,7 @@ void MainWindow::on_view_close_clicked() // Get the view contained in the dock widget shared_ptr view; - for (auto entry : view_docks_) + for (auto& entry : view_docks_) if (entry.first == dock) view = entry.second; @@ -759,12 +763,12 @@ void MainWindow::on_tab_close_requested(int index) remove_session(session); } -void MainWindow::on_view_coloured_bg_shortcut() +void MainWindow::on_view_colored_bg_shortcut() { GlobalSettings settings; - bool state = settings.value(GlobalSettings::Key_View_ColouredBG).toBool(); - settings.setValue(GlobalSettings::Key_View_ColouredBG, !state); + bool state = settings.value(GlobalSettings::Key_View_ColoredBG).toBool(); + settings.setValue(GlobalSettings::Key_View_ColoredBG, !state); } void MainWindow::on_view_sticky_scrolling_shortcut() @@ -791,18 +795,18 @@ void MainWindow::on_view_show_analog_minor_grid_shortcut() settings.setValue(GlobalSettings::Key_View_ShowAnalogMinorGrid, !state); } -void MainWindow::on_settingViewColouredBg_changed(const QVariant new_value) +void MainWindow::on_settingViewColoredBg_changed(const QVariant new_value) { bool state = new_value.toBool(); - for (auto entry : view_docks_) { + for (auto& entry : view_docks_) { shared_ptr viewbase = entry.second; // Only trace views have this setting views::trace::View* view = qobject_cast(viewbase.get()); if (view) - view->enable_coloured_bg(state); + view->enable_colored_bg(state); } } @@ -810,7 +814,7 @@ void MainWindow::on_settingViewShowSamplingPoints_changed(const QVariant new_val { bool state = new_value.toBool(); - for (auto entry : view_docks_) { + for (auto& entry : view_docks_) { shared_ptr viewbase = entry.second; // Only trace views have this setting @@ -825,7 +829,7 @@ void MainWindow::on_settingViewShowAnalogMinorGrid_changed(const QVariant new_va { bool state = new_value.toBool(); - for (auto entry : view_docks_) { + for (auto& entry : view_docks_) { shared_ptr viewbase = entry.second; // Only trace views have this setting