X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fmainwindow.cpp;h=50cab695a8a87d850f4f2fda04f6b8f233ed8ee8;hp=f72d1b7056041bd5cb34c563f68c7aed3523917e;hb=2b334bb4078d6e74e8ed4e3460c6596344dd9c8d;hpb=945745012eb57cefa1ef457daf48cfffa99f9ec2 diff --git a/pv/mainwindow.cpp b/pv/mainwindow.cpp index f72d1b70..50cab695 100644 --- a/pv/mainwindow.cpp +++ b/pv/mainwindow.cpp @@ -18,12 +18,14 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include + #ifdef ENABLE_DECODE #include #endif -#include -#include +#include +#include #include #include @@ -32,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -39,7 +42,7 @@ #include "mainwindow.h" #include "devicemanager.h" -#include "device/devinst.h" +#include "device/device.h" #include "dialogs/about.h" #include "dialogs/connect.h" #include "dialogs/storeprogress.h" @@ -58,8 +61,8 @@ #include #include -using boost::shared_ptr; using std::list; +using std::shared_ptr; namespace pv { @@ -67,6 +70,9 @@ namespace view { class SelectableItem; } +const char *MainWindow::SettingOpenDirectory = "MainWindow/OpenDirectory"; +const char *MainWindow::SettingSaveDirectory = "MainWindow/SaveDirectory"; + MainWindow::MainWindow(DeviceManager &device_manager, const char *open_file_name, QWidget *parent) : @@ -112,39 +118,35 @@ void MainWindow::setup_ui() // File Menu QMenu *const menu_file = new QMenu; - menu_file->setTitle(QApplication::translate( - "MainWindow", "&File", 0, QApplication::UnicodeUTF8)); + menu_file->setTitle(tr("&File")); QAction *const action_open = new QAction(this); - action_open->setText(QApplication::translate( - "MainWindow", "&Open...", 0, QApplication::UnicodeUTF8)); + action_open->setText(tr("&Open...")); 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); QAction *const action_save_as = new QAction(this); - action_save_as->setText(QApplication::translate( - "MainWindow", "&Save As...", 0, QApplication::UnicodeUTF8)); + action_save_as->setText(tr("&Save As...")); 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); menu_file->addSeparator(); QAction *const action_connect = new QAction(this); - action_connect->setText(QApplication::translate( - "MainWindow", "&Connect to Device...", 0, - QApplication::UnicodeUTF8)); + action_connect->setText(tr("&Connect to Device...")); action_connect->setObjectName(QString::fromUtf8("actionConnect")); menu_file->addAction(action_connect); menu_file->addSeparator(); QAction *action_quit = new QAction(this); - action_quit->setText(QApplication::translate( - "MainWindow", "&Quit", 0, QApplication::UnicodeUTF8)); + action_quit->setText(tr("&Quit")); action_quit->setIcon(QIcon::fromTheme("application-exit", QIcon(":/icons/application-exit.png"))); action_quit->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q)); @@ -153,12 +155,10 @@ void MainWindow::setup_ui() // View Menu QMenu *menu_view = new QMenu; - menu_view->setTitle(QApplication::translate( - "MainWindow", "&View", 0, QApplication::UnicodeUTF8)); + menu_view->setTitle(tr("&View")); QAction *const action_view_zoom_in = new QAction(this); - action_view_zoom_in->setText(QApplication::translate( - "MainWindow", "Zoom &In", 0, QApplication::UnicodeUTF8)); + action_view_zoom_in->setText(tr("Zoom &In")); action_view_zoom_in->setIcon(QIcon::fromTheme("zoom-in", QIcon(":/icons/zoom-in.png"))); // simply using Qt::Key_Plus shows no + in the menu @@ -168,8 +168,7 @@ void MainWindow::setup_ui() menu_view->addAction(action_view_zoom_in); QAction *const action_view_zoom_out = new QAction(this); - action_view_zoom_out->setText(QApplication::translate( - "MainWindow", "Zoom &Out", 0, QApplication::UnicodeUTF8)); + action_view_zoom_out->setText(tr("Zoom &Out")); action_view_zoom_out->setIcon(QIcon::fromTheme("zoom-out", QIcon(":/icons/zoom-out.png"))); action_view_zoom_out->setShortcut(QKeySequence::ZoomOut); @@ -178,8 +177,7 @@ void MainWindow::setup_ui() menu_view->addAction(action_view_zoom_out); QAction *const action_view_zoom_fit = new QAction(this); - action_view_zoom_fit->setText(QApplication::translate( - "MainWindow", "Zoom to &Fit", 0, QApplication::UnicodeUTF8)); + action_view_zoom_fit->setText(tr("Zoom to &Fit")); action_view_zoom_fit->setIcon(QIcon::fromTheme("zoom-fit", QIcon(":/icons/zoom-fit.png"))); action_view_zoom_fit->setShortcut(QKeySequence(Qt::Key_F)); @@ -188,9 +186,7 @@ void MainWindow::setup_ui() menu_view->addAction(action_view_zoom_fit); QAction *const action_view_zoom_one_to_one = new QAction(this); - action_view_zoom_one_to_one->setText(QApplication::translate( - "MainWindow", "Zoom to &One-to-One", 0, - QApplication::UnicodeUTF8)); + action_view_zoom_one_to_one->setText(tr("Zoom to &One-to-One")); action_view_zoom_one_to_one->setIcon(QIcon::fromTheme("zoom-original", QIcon(":/icons/zoom-original.png"))); action_view_zoom_one_to_one->setShortcut(QKeySequence(Qt::Key_O)); @@ -206,20 +202,17 @@ void MainWindow::setup_ui() action_view_show_cursors->setShortcut(QKeySequence(Qt::Key_C)); action_view_show_cursors->setObjectName( QString::fromUtf8("actionViewShowCursors")); - action_view_show_cursors->setText(QApplication::translate( - "MainWindow", "Show &Cursors", 0, QApplication::UnicodeUTF8)); + action_view_show_cursors->setText(tr("Show &Cursors")); menu_view->addAction(action_view_show_cursors); // Decoders Menu #ifdef ENABLE_DECODE QMenu *const menu_decoders = new QMenu; - menu_decoders->setTitle(QApplication::translate( - "MainWindow", "&Decoders", 0, QApplication::UnicodeUTF8)); + menu_decoders->setTitle(tr("&Decoders")); pv::widgets::DecoderMenu *const menu_decoders_add = - new pv::widgets::DecoderMenu(menu_decoders); - menu_decoders_add->setTitle(QApplication::translate( - "MainWindow", "&Add", 0, QApplication::UnicodeUTF8)); + new pv::widgets::DecoderMenu(menu_decoders, true); + menu_decoders_add->setTitle(tr("&Add")); connect(menu_decoders_add, SIGNAL(decoder_selected(srd_decoder*)), this, SLOT(add_decoder(srd_decoder*))); @@ -228,13 +221,11 @@ void MainWindow::setup_ui() // Help Menu QMenu *const menu_help = new QMenu; - menu_help->setTitle(QApplication::translate( - "MainWindow", "&Help", 0, QApplication::UnicodeUTF8)); + menu_help->setTitle(tr("&Help")); QAction *const action_about = new QAction(this); action_about->setObjectName(QString::fromUtf8("actionAbout")); - action_about->setText(QApplication::translate( - "MainWindow", "&About...", 0, QApplication::UnicodeUTF8)); + action_about->setText(tr("&About...")); menu_help->addAction(action_about); menu_bar->addAction(menu_file->menuAction()); @@ -250,10 +241,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 @@ -267,8 +260,7 @@ void MainWindow::setup_ui() addToolBar(_sampling_bar); // Set the title - setWindowTitle(QApplication::translate("MainWindow", "PulseView", 0, - QApplication::UnicodeUTF8)); + setWindowTitle(tr("PulseView")); // Setup _session events connect(&_session, SIGNAL(capture_state_changed(int)), this, @@ -284,31 +276,25 @@ void MainWindow::session_error( Q_ARG(QString, info_text)); } -void MainWindow::update_device_list( - shared_ptr selected_device) +void MainWindow::update_device_list() { assert(_sampling_bar); - const list< shared_ptr > &devices = - _device_manager.devices(); - _sampling_bar->set_device_list(devices); + shared_ptr selected_device = _session.get_device(); + list< shared_ptr > devices; - if (!selected_device && !devices.empty()) { - // Fall back to the first device in the list. - selected_device = devices.front(); + if (_device_manager.devices().size() == 0) + return; - // Try and find the demo device and select that by default - BOOST_FOREACH (shared_ptr dev_inst, devices) - if (strcmp(dev_inst->dev_inst()->driver->name, - "demo") == 0) { - selected_device = dev_inst; - } - } + std::copy(_device_manager.devices().begin(), + _device_manager.devices().end(), std::back_inserter(devices)); - if (selected_device) { - _sampling_bar->set_selected_device(selected_device); - _session.set_device(selected_device); - } + if (std::find(devices.begin(), devices.end(), selected_device) == + devices.end()) + devices.push_back(selected_device); + assert(selected_device); + + _sampling_bar->set_device_list(devices, selected_device); } void MainWindow::load_file(QString file_name) @@ -316,9 +302,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( @@ -334,13 +331,21 @@ void MainWindow::show_session_error( void MainWindow::on_actionOpen_triggered() { + QSettings settings; + const QString dir = settings.value(SettingOpenDirectory).toString(); + // Show the dialog const QString file_name = QFileDialog::getOpenFileName( - this, tr("Open File"), "", tr( + this, tr("Open File"), dir, tr( "Sigrok Sessions (*.sr);;" "All Files (*.*)")); - if (!file_name.isEmpty()) + + if (!file_name.isEmpty()) { load_file(file_name); + + const QString abs_path = QFileInfo(file_name).absolutePath(); + settings.setValue(SettingOpenDirectory, abs_path); + } } void MainWindow::on_actionSaveAs_triggered() @@ -350,13 +355,19 @@ void MainWindow::on_actionSaveAs_triggered() // Stop any currently running capture session _session.stop_capture(); + QSettings settings; + const QString dir = settings.value(SettingSaveDirectory).toString(); + // Show the dialog const QString file_name = QFileDialog::getSaveFileName( - this, tr("Save File"), "", tr("Sigrok Sessions (*.sr)")); + this, tr("Save File"), dir, tr("Sigrok Sessions (*.sr)")); if (file_name.isEmpty()) return; + const QString abs_path = QFileInfo(file_name).absolutePath(); + settings.setValue(SettingSaveDirectory, abs_path); + StoreProgress *dlg = new StoreProgress(file_name, _session, this); dlg->run(); } @@ -370,10 +381,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 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() @@ -432,9 +443,8 @@ void MainWindow::run_stop() { switch(_session.get_capture_state()) { case SigSession::Stopped: - _session.start_capture( - boost::bind(&MainWindow::session_error, this, - QString("Capture failed"), _1)); + _session.start_capture([&](QString message) { + session_error("Capture failed", message); }); break; case SigSession::AwaitingTrigger: