X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fmainwindow.cpp;h=767ab6f31149bd4881b0db163635c86025c08818;hp=49152a26fe68088565a1ee0068ae235ff597ef8c;hb=951b5ae77957c8086f05fcd2b26beaf32f3e8e3e;hpb=e79171dc88959745ce0bf483dc25e86b28f253ed diff --git a/pv/mainwindow.cpp b/pv/mainwindow.cpp index 49152a26..767ab6f3 100644 --- a/pv/mainwindow.cpp +++ b/pv/mainwindow.cpp @@ -45,6 +45,9 @@ #include "mainwindow.hpp" #include "devicemanager.hpp" +#include "devices/hardwaredevice.hpp" +#include "devices/inputfile.hpp" +#include "devices/sessionfile.hpp" #include "dialogs/about.hpp" #include "dialogs/connect.hpp" #include "dialogs/inputoutputoptions.hpp" @@ -53,6 +56,7 @@ #include "view/logicsignal.hpp" #include "view/view.hpp" #include "widgets/exportmenu.hpp" +#include "widgets/importmenu.hpp" #ifdef ENABLE_DECODE #include "widgets/decodermenu.hpp" #endif @@ -72,10 +76,9 @@ using std::vector; using boost::algorithm::join; -using sigrok::Device; using sigrok::Error; -using sigrok::HardwareDevice; using sigrok::OutputFormat; +using sigrok::InputFormat; namespace pv { @@ -104,7 +107,7 @@ MainWindow::MainWindow(DeviceManager &device_manager, action_about_(new QAction(this)) #ifdef ENABLE_DECODE , menu_decoders_add_(new pv::widgets::DecoderMenu(this, true)) -#endif /* ENABLE_DECODE */ +#endif { setup_ui(); restore_ui_settings(); @@ -171,7 +174,7 @@ QMenu* MainWindow::menu_decoder_add() const { return menu_decoders_add_; } -#endif /* ENABLE_DECODE */ +#endif void MainWindow::run_stop() { @@ -188,7 +191,7 @@ void MainWindow::run_stop() } } -void MainWindow::select_device(shared_ptr device) +void MainWindow::select_device(shared_ptr device) { try { session_.set_device(device); @@ -251,6 +254,47 @@ void MainWindow::export_file(shared_ptr format) dlg->run(); } +void MainWindow::import_file(shared_ptr format) +{ + assert(format); + + QSettings settings; + const QString dir = settings.value(SettingOpenDirectory).toString(); + + // Construct the filter + const vector exts = format->extensions(); + const QString filter = exts.empty() ? "" : + tr("%1 files (*.%2)").arg( + QString::fromStdString(format->description())).arg( + QString::fromStdString(join(exts, ", *."))); + + // Show the file dialog + const QString file_name = QFileDialog::getOpenFileName( + this, tr("Import File"), dir, tr( + "%1 files (*.*);;All Files (*.*)").arg( + QString::fromStdString(format->description()))); + + if (file_name.isEmpty()) + return; + + // Show the options dialog + map options; + if (!format->options().empty()) { + dialogs::InputOutputOptions dlg( + tr("Import %1").arg(QString::fromStdString( + format->description())), + format->options(), this); + if (!dlg.exec()) + return; + options = dlg.options(); + } + + load_file(file_name, format, options); + + const QString abs_path = QFileInfo(file_name).absolutePath(); + settings.setValue(SettingOpenDirectory, abs_path); +} + void MainWindow::setup_ui() { setObjectName(QString::fromUtf8("MainWindow")); @@ -303,6 +347,14 @@ void MainWindow::setup_ui() this, SLOT(export_file(std::shared_ptr))); menu_file->addAction(menu_file_export->menuAction()); + widgets::ImportMenu *menu_file_import = new widgets::ImportMenu(this, + device_manager_.context()); + menu_file_import->setTitle(tr("&Import")); + connect(menu_file_import, + SIGNAL(format_selected(std::shared_ptr)), + this, SLOT(import_file(std::shared_ptr))); + menu_file->addAction(menu_file_import->menuAction()); + menu_file->addSeparator(); action_connect_->setText(tr("&Connect to Device...")); @@ -455,11 +507,8 @@ void MainWindow::restore_ui_settings() { QSettings settings; - shared_ptr device; - map dev_info; list key_list; - string value; settings.beginGroup("MainWindow"); @@ -480,17 +529,17 @@ void MainWindow::restore_ui_settings() key_list.push_back("connection_id"); for (string key : key_list) { - if (!settings.contains(QString::fromUtf8(key.c_str()))) + const QString k = QString::fromStdString(key); + if (!settings.contains(k)) continue; - value = settings.value(QString::fromUtf8(key.c_str())).toString().toStdString(); - - if (value.size() > 0) + const string value = settings.value(k).toString().toStdString(); + if (!value.empty()) dev_info.insert(std::make_pair(key, value)); } - device = device_manager_.find_device_from_info(dev_info); - + const shared_ptr device = + device_manager_.find_device_from_info(dev_info); if (device) { select_device(device); update_device_list(); @@ -527,14 +576,26 @@ void MainWindow::keyReleaseEvent(QKeyEvent *event) QMainWindow::keyReleaseEvent(event); } -void MainWindow::load_file(QString file_name) +void MainWindow::load_file(QString file_name, + std::shared_ptr format, + const std::map &options) { const QString errorMessage( QString("Failed to load file %1").arg(file_name)); const QString infoMessage; try { - session_.set_session_file(file_name.toStdString()); + if (format) + session_.set_device(shared_ptr( + new devices::InputFile( + device_manager_.context(), + file_name.toStdString(), + format, options))); + else + session_.set_device(shared_ptr( + new devices::SessionFile( + device_manager_.context(), + file_name.toStdString()))); } catch(Error e) { show_session_error(tr("Failed to load ") + file_name, e.what()); session_.set_default_device(); @@ -658,11 +719,11 @@ void MainWindow::capture_state_changed(int state) void MainWindow::device_selected() { // Set the title to include the device/file name - const shared_ptr device = session_.device(); + const shared_ptr device = session_.device(); if (!device) return; - const string display_name = device_manager_.get_display_name(device); + const string display_name = device->display_name(device_manager_); setWindowTitle(tr("%1 - PulseView").arg(display_name.c_str())); }