X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fmainwindow.cpp;h=42ae957640d491c19a7c740b9204c55224d7f852;hp=1f683f19ecd2a8efc2d7f022776568c4aac47194;hb=a4cf020a253c8c874ed8652f38a1c61c9a4754a4;hpb=943edd769f24a5a17df4f0b5e94d92b1b19c8300 diff --git a/pv/mainwindow.cpp b/pv/mainwindow.cpp index 1f683f19..42ae9576 100644 --- a/pv/mainwindow.cpp +++ b/pv/mainwindow.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -42,7 +43,6 @@ #include "mainwindow.h" #include "devicemanager.h" -#include "device/device.h" #include "dialogs/about.h" #include "dialogs/connect.h" #include "dialogs/storeprogress.h" @@ -53,16 +53,20 @@ #include "widgets/decodermenu.h" #endif -/* __STDC_FORMAT_MACROS is required for PRIu64 and friends (in C++). */ -#define __STDC_FORMAT_MACROS #include #include #include #include -#include +#include using std::list; +using std::map; using std::shared_ptr; +using std::string; + +using sigrok::Device; +using sigrok::Error; +using sigrok::HardwareDevice; namespace pv { @@ -81,6 +85,7 @@ MainWindow::MainWindow(DeviceManager &device_manager, _session(device_manager) { setup_ui(); + restore_ui_settings(); if (open_file_name) { const QString s(QString::fromUtf8(open_file_name)); QMetaObject::invokeMethod(this, "load_file", @@ -93,8 +98,6 @@ void MainWindow::setup_ui() { setObjectName(QString::fromUtf8("MainWindow")); - resize(1024, 768); - // Set the window icon QIcon icon; icon.addFile(QString::fromUtf8(":/icons/sigrok-logo-notext.png"), @@ -240,6 +243,7 @@ void MainWindow::setup_ui() // Setup the toolbar QToolBar *const toolbar = new QToolBar(tr("Main Toolbar"), this); + toolbar->setObjectName(QString::fromUtf8("MainToolbar")); toolbar->addAction(action_open); toolbar->addAction(action_save_as); toolbar->addSeparator(); @@ -265,7 +269,90 @@ void MainWindow::setup_ui() // Setup _session events connect(&_session, SIGNAL(capture_state_changed(int)), this, SLOT(capture_state_changed(int))); +} + +void MainWindow::save_ui_settings() +{ + QSettings settings; + + map dev_info; + list key_list; + + settings.beginGroup("MainWindow"); + settings.setValue("state", saveState()); + settings.setValue("geometry", saveGeometry()); + settings.endGroup(); + + if (_session.get_device()) { + settings.beginGroup("Device"); + key_list.push_back("vendor"); + key_list.push_back("model"); + key_list.push_back("version"); + key_list.push_back("serial_num"); + key_list.push_back("connection_id"); + + dev_info = _device_manager.get_device_info( + _session.get_device()); + + for (string key : key_list) { + + if (dev_info.count(key)) + settings.setValue(QString::fromUtf8(key.c_str()), + QString::fromUtf8(dev_info.at(key).c_str())); + else + settings.remove(QString::fromUtf8(key.c_str())); + } + + settings.endGroup(); + } +} + +void MainWindow::restore_ui_settings() +{ + QSettings settings; + + shared_ptr device; + + map dev_info; + list key_list; + string value; + settings.beginGroup("MainWindow"); + + if (settings.contains("geometry")) { + restoreGeometry(settings.value("geometry").toByteArray()); + restoreState(settings.value("state").toByteArray()); + } else + resize(1000, 720); + + settings.endGroup(); + + // Re-select last used device if possible. + settings.beginGroup("Device"); + key_list.push_back("vendor"); + key_list.push_back("model"); + key_list.push_back("version"); + key_list.push_back("serial_num"); + key_list.push_back("connection_id"); + + for (string key : key_list) { + if (!settings.contains(QString::fromUtf8(key.c_str()))) + continue; + + value = settings.value(QString::fromUtf8(key.c_str())).toString().toStdString(); + + if (value.size() > 0) + dev_info.insert(std::make_pair(key, value)); + } + + device = _device_manager.find_device_from_info(dev_info); + + if (device) { + _session.set_device(device); + update_device_list(); + } + + settings.endGroup(); } void MainWindow::session_error( @@ -280,8 +367,12 @@ void MainWindow::update_device_list() { assert(_sampling_bar); - shared_ptr selected_device = _session.get_device(); - list< shared_ptr > devices; + shared_ptr selected_device = _session.get_device(); + list< shared_ptr > devices; + + if (_device_manager.devices().size() == 0) + return; + std::copy(_device_manager.devices().begin(), _device_manager.devices().end(), std::back_inserter(devices)); @@ -290,7 +381,18 @@ void MainWindow::update_device_list() devices.push_back(selected_device); assert(selected_device); - _sampling_bar->set_device_list(devices, selected_device); + map, string> device_names; + + for (auto device : devices) + device_names[device] = _device_manager.get_display_name(device); + + _sampling_bar->set_device_list(device_names, selected_device); +} + +void MainWindow::closeEvent(QCloseEvent *event) +{ + save_ui_settings(); + event->accept(); } void MainWindow::load_file(QString file_name) @@ -301,8 +403,8 @@ void MainWindow::load_file(QString file_name) try { _session.set_file(file_name.toStdString()); - } catch(QString e) { - show_session_error(tr("Failed to load ") + file_name, e); + } catch(Error e) { + show_session_error(tr("Failed to load ") + file_name, e.what()); _session.set_default_device(); update_device_list(); return; @@ -421,7 +523,7 @@ void MainWindow::on_actionViewShowCursors_triggered() void MainWindow::on_actionAbout_triggered() { - dialogs::About dlg(this); + dialogs::About dlg(_device_manager.context(), this); dlg.exec(); }