X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fmainwindow.cpp;h=145d7d997db6cfe089d1fc18b4bafd3874e9e22c;hb=6db7315814ee9d2f92d4b326be7c5b9e6e4b789b;hp=b6d72fbcb57fa6ad4baad61cbdcfe55ce5f37987;hpb=6866d5de8994a7afe3bac9f7706cf9b8586fbbdd;p=pulseview.git diff --git a/pv/mainwindow.cpp b/pv/mainwindow.cpp index b6d72fbc..145d7d99 100644 --- a/pv/mainwindow.cpp +++ b/pv/mainwindow.cpp @@ -22,8 +22,8 @@ #include #endif -#include -#include +#include +#include #include #include @@ -39,6 +39,7 @@ #include "mainwindow.h" #include "devicemanager.h" +#include "device/device.h" #include "dialogs/about.h" #include "dialogs/connect.h" #include "dialogs/storeprogress.h" @@ -58,6 +59,7 @@ #include using std::list; +using std::shared_ptr; namespace pv { @@ -118,6 +120,7 @@ void MainWindow::setup_ui() "MainWindow", "&Open...", 0, QApplication::UnicodeUTF8)); action_open->setIcon(QIcon::fromTheme("document-open", QIcon(":/icons/document-open.png"))); + action_open->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_O)); action_open->setObjectName(QString::fromUtf8("actionOpen")); menu_file->addAction(action_open); @@ -126,6 +129,7 @@ void MainWindow::setup_ui() "MainWindow", "&Save As...", 0, QApplication::UnicodeUTF8)); action_save_as->setIcon(QIcon::fromTheme("document-save-as", QIcon(":/icons/document-save-as.png"))); + action_save_as->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_S)); action_save_as->setObjectName(QString::fromUtf8("actionSaveAs")); menu_file->addAction(action_save_as); @@ -159,6 +163,8 @@ void MainWindow::setup_ui() "MainWindow", "Zoom &In", 0, QApplication::UnicodeUTF8)); action_view_zoom_in->setIcon(QIcon::fromTheme("zoom-in", QIcon(":/icons/zoom-in.png"))); + // simply using Qt::Key_Plus shows no + in the menu + action_view_zoom_in->setShortcut(QKeySequence::ZoomIn); action_view_zoom_in->setObjectName( QString::fromUtf8("actionViewZoomIn")); menu_view->addAction(action_view_zoom_in); @@ -168,6 +174,7 @@ void MainWindow::setup_ui() "MainWindow", "Zoom &Out", 0, QApplication::UnicodeUTF8)); action_view_zoom_out->setIcon(QIcon::fromTheme("zoom-out", QIcon(":/icons/zoom-out.png"))); + action_view_zoom_out->setShortcut(QKeySequence::ZoomOut); action_view_zoom_out->setObjectName( QString::fromUtf8("actionViewZoomOut")); menu_view->addAction(action_view_zoom_out); @@ -212,7 +219,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*)), @@ -245,10 +252,12 @@ void MainWindow::setup_ui() // Setup the toolbar QToolBar *const toolbar = new QToolBar(tr("Main Toolbar"), this); toolbar->addAction(action_open); + toolbar->addAction(action_save_as); toolbar->addSeparator(); toolbar->addAction(action_view_zoom_in); toolbar->addAction(action_view_zoom_out); toolbar->addAction(action_view_zoom_fit); + toolbar->addAction(action_view_zoom_one_to_one); addToolBar(toolbar); // Setup the sampling bar @@ -279,28 +288,21 @@ void MainWindow::session_error( Q_ARG(QString, info_text)); } -void MainWindow::update_device_list(struct sr_dev_inst *selected_device) +void MainWindow::update_device_list() { assert(_sampling_bar); - const list &devices = _device_manager.devices(); - _sampling_bar->set_device_list(devices); + shared_ptr selected_device = _session.get_device(); + list< shared_ptr > devices; + std::copy(_device_manager.devices().begin(), + _device_manager.devices().end(), std::back_inserter(devices)); - if (!selected_device && !devices.empty()) { - // Fall back to the first device in the list. - selected_device = devices.front(); + if (std::find(devices.begin(), devices.end(), selected_device) == + devices.end()) + devices.push_back(selected_device); + assert(selected_device); - // Try and find the demo device and select that by default - BOOST_FOREACH (struct sr_dev_inst *sdi, devices) - if (strcmp(sdi->driver->name, "demo") == 0) { - selected_device = sdi; - } - } - - 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) @@ -308,9 +310,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([&, errorMessage, infoMessage](QString) { + session_error(errorMessage, infoMessage); }); } void MainWindow::show_session_error( @@ -362,10 +375,10 @@ void MainWindow::on_actionConnect_triggered() // If the user selected a device, select it in the device list. Select the // current device otherwise. - struct sr_dev_inst *const sdi = dlg.exec() ? - dlg.get_selected_device() : _session.get_device(); + if (dlg.exec()) + _session.set_device(dlg.get_selected_device()); - update_device_list(sdi); + update_device_list(); } void MainWindow::on_actionQuit_triggered() @@ -424,9 +437,8 @@ void MainWindow::run_stop() { switch(_session.get_capture_state()) { case SigSession::Stopped: - _session.start_capture(_sampling_bar->get_record_length(), - boost::bind(&MainWindow::session_error, this, - QString("Capture failed"), _1)); + _session.start_capture([&](QString message) { + session_error("Capture failed", message); }); break; case SigSession::AwaitingTrigger: