]> sigrok.org Git - pulseview.git/blobdiff - pv/mainwindow.cpp
Reworked SamplingBar device selection logic
[pulseview.git] / pv / mainwindow.cpp
index 9995e50ac2ef42650ba4d904a3d7b70c287336ff..0089b112a721f1585a9813134328cfd30c360ccb 100644 (file)
@@ -220,7 +220,7 @@ void MainWindow::setup_ui()
                "MainWindow", "&Decoders", 0, QApplication::UnicodeUTF8));
 
        pv::widgets::DecoderMenu *const menu_decoders_add =
-               new pv::widgets::DecoderMenu(menu_decoders);
+               new pv::widgets::DecoderMenu(menu_decoders, true);
        menu_decoders_add->setTitle(QApplication::translate(
                "MainWindow", "&Add", 0, QApplication::UnicodeUTF8));
        connect(menu_decoders_add, SIGNAL(decoder_selected(srd_decoder*)),
@@ -287,33 +287,21 @@ void MainWindow::session_error(
                Q_ARG(QString, info_text));
 }
 
-void MainWindow::update_device_list(
-       shared_ptr<pv::device::DevInst> selected_device)
+void MainWindow::update_device_list()
 {
        assert(_sampling_bar);
 
+       shared_ptr<pv::device::DevInst> selected_device = _session.get_device();
        list< shared_ptr<device::DevInst> > devices;
        std::copy(_device_manager.devices().begin(),
                _device_manager.devices().end(), std::back_inserter(devices));
 
-       _sampling_bar->set_device_list(devices);
+       if (std::find(devices.begin(), devices.end(), selected_device) ==
+               devices.end())
+               devices.push_back(selected_device);
+       assert(selected_device);
 
-       if (!selected_device && !devices.empty()) {
-               // Fall back to the first device in the list.
-               selected_device = devices.front();
-
-               // Try and find the demo device and select that by default
-               BOOST_FOREACH (shared_ptr<pv::device::DevInst> dev_inst, devices)
-                       if (strcmp(dev_inst->dev_inst()->driver->name,
-                               "demo") == 0) {
-                               selected_device = dev_inst;
-                       }
-       }
-
-       if (selected_device) {
-               _sampling_bar->set_selected_device(selected_device);
-               _session.set_device(selected_device);
-       }
+       _sampling_bar->set_device_list(devices, selected_device);
 }
 
 void MainWindow::load_file(QString file_name)
@@ -321,9 +309,20 @@ void MainWindow::load_file(QString file_name)
        const QString errorMessage(
                QString("Failed to load file %1").arg(file_name));
        const QString infoMessage;
-       _session.load_file(file_name.toStdString(),
-               boost::bind(&MainWindow::session_error, this,
-                       errorMessage, infoMessage));
+
+       try {
+               _session.set_file(file_name.toStdString());
+       } catch(QString e) {
+               show_session_error(tr("Failed to load ") + file_name, e);
+               _session.set_default_device();
+               update_device_list();
+               return;
+       }
+
+       update_device_list();
+
+       _session.start_capture(boost::bind(&MainWindow::session_error, this,
+               errorMessage, infoMessage));
 }
 
 void MainWindow::show_session_error(
@@ -375,10 +374,10 @@ void MainWindow::on_actionConnect_triggered()
 
        // If the user selected a device, select it in the device list. Select the
        // current device otherwise.
-       shared_ptr<device::DevInst> dev_inst = dlg.exec() ?
-               dlg.get_selected_device() : _session.get_device();
+       if (dlg.exec())
+               _session.set_device(dlg.get_selected_device());
 
-       update_device_list(dev_inst);
+       update_device_list();
 }
 
 void MainWindow::on_actionQuit_triggered()