X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Ftoolbars%2Fmainbar.cpp;h=acab199da8853dbd075c1665a3dabdbb8a4fe5ab;hp=7a387b4b411d5ce6bc35baf78e9e14630046bcd6;hb=7a01bd3654ed046216308fa64edfd79be7cd525f;hpb=7c65709437184b09753d1bcacc02467b8f6171f1 diff --git a/pv/toolbars/mainbar.cpp b/pv/toolbars/mainbar.cpp index 7a387b4b..acab199d 100644 --- a/pv/toolbars/mainbar.cpp +++ b/pv/toolbars/mainbar.cpp @@ -1,7 +1,7 @@ /* * This file is part of the PulseView project. * - * Copyright (C) 2012 Joel Holdsworth + * Copyright (C) 2012-2015 Joel Holdsworth * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,11 +20,13 @@ #include -#include +#include +#include #include #include #include +#include #include #include "mainbar.hpp" @@ -35,14 +37,17 @@ #include #include -#include +#include +using std::back_inserter; +using std::copy; +using std::list; using std::map; -using std::vector; using std::max; using std::min; using std::shared_ptr; using std::string; +using std::vector; using sigrok::Capability; using sigrok::ConfigKey; @@ -60,8 +65,8 @@ MainBar::MainBar(Session &session, MainWindow &main_window) : QToolBar("Sampling Bar", &main_window), session_(session), main_window_(main_window), - device_selector_(this), - updating_device_selector_(false), + device_selector_(this, session.device_manager(), + main_window.action_connect()), configure_button_(this), configure_button_action_(NULL), channels_button_(this), @@ -73,14 +78,58 @@ MainBar::MainBar(Session &session, MainWindow &main_window) : icon_red_(":/icons/status-red.svg"), icon_green_(":/icons/status-green.svg"), icon_grey_(":/icons/status-grey.svg"), - run_stop_button_(this) + run_stop_button_(this), + menu_button_(this) { setObjectName(QString::fromUtf8("MainBar")); + setMovable(false); + setFloatable(false); + setContextMenuPolicy(Qt::PreventContextMenu); + + // Device selector menu + connect(&device_selector_, SIGNAL(device_selected()), + this, SLOT(on_device_selected())); + + // Setup the decoder button +#ifdef ENABLE_DECODE + QToolButton *add_decoder_button = new QToolButton(this); + add_decoder_button->setIcon(QIcon::fromTheme("add-decoder", + QIcon(":/icons/add-decoder.svg"))); + add_decoder_button->setPopupMode(QToolButton::InstantPopup); + add_decoder_button->setMenu(main_window_.menu_decoder_add()); +#endif + + // Setup the menu + QMenu *const menu = new QMenu(this); + + QMenu *const menu_help = new QMenu; + menu_help->setTitle(tr("&Help")); + menu_help->addAction(main_window.action_about()); + + menu->addAction(menu_help->menuAction()); + menu->addSeparator(); + menu->addAction(main_window.action_quit()); + + menu_button_.setMenu(menu); + menu_button_.setPopupMode(QToolButton::InstantPopup); + menu_button_.setIcon(QIcon::fromTheme("menu", + QIcon(":/icons/menu.svg"))); + + // Setup the toolbar + addAction(main_window.action_open()); + addAction(main_window.action_save_as()); + addSeparator(); + addAction(main_window.action_view_zoom_in()); + addAction(main_window.action_view_zoom_out()); + addAction(main_window.action_view_zoom_fit()); + addAction(main_window.action_view_zoom_one_to_one()); + addSeparator(); + addAction(main_window.action_view_show_cursors()); + addSeparator(); + connect(&run_stop_button_, SIGNAL(clicked()), this, SLOT(on_run_stop())); - connect(&device_selector_, SIGNAL(currentIndexChanged (int)), - this, SLOT(on_device_selected())); connect(&sample_count_, SIGNAL(value_changed()), this, SLOT(on_sample_count_changed())); connect(&sample_rate_, SIGNAL(value_changed()), @@ -103,55 +152,38 @@ MainBar::MainBar(Session &session, MainWindow &main_window) : addWidget(&channels_button_); addWidget(&sample_count_); addWidget(&sample_rate_); - addWidget(&run_stop_button_); +#ifdef ENABLE_DECODE + addSeparator(); + addWidget(add_decoder_button); +#endif + + QWidget *const spacer = new QWidget(); + spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + addWidget(spacer); + + addWidget(&menu_button_); sample_count_.installEventFilter(this); sample_rate_.installEventFilter(this); } -void MainBar::set_device_list( - const std::list< std::shared_ptr > &devices, - shared_ptr selected) +void MainBar::update_device_list() { - int selected_index = -1; - - assert(selected); - - updating_device_selector_ = true; + DeviceManager &mgr = session_.device_manager(); + shared_ptr selected_device = session_.device(); + list< shared_ptr > devs; - device_selector_.clear(); + copy(mgr.devices().begin(), mgr.devices().end(), back_inserter(devs)); - for (auto device : devices) { - assert(device); - - string display_name = - session_.device_manager().get_display_name(device); - - if (selected == device) - selected_index = device_selector_.count(); - - device_selector_.addItem(display_name.c_str(), - qVariantFromValue(device)); - } - - // The selected device should have been in the list - assert(selected_index != -1); - device_selector_.setCurrentIndex(selected_index); + if (std::find(devs.begin(), devs.end(), selected_device) == devs.end()) + devs.push_back(selected_device); + assert(selected_device); + device_selector_.set_device_list(devs, selected_device); update_device_config_widgets(); - - updating_device_selector_ = false; } -shared_ptr MainBar::get_selected_device() const -{ - const int index = device_selector_.currentIndex(); - if (index < 0) - return shared_ptr(); - - return device_selector_.itemData(index).value>(); -} void MainBar::set_capture_state(pv::Session::capture_state state) { @@ -172,7 +204,7 @@ void MainBar::update_sample_rate_selector() if (updating_sample_rate_) return; - const shared_ptr device = get_selected_device(); + const shared_ptr device = device_selector_.selected_device(); if (!device) return; @@ -183,8 +215,6 @@ void MainBar::update_sample_rate_selector() const auto iter = keys.find(ConfigKey::SAMPLERATE); if (iter != keys.end() && (*iter).second.find(sigrok::LIST) != (*iter).second.end()) { - const auto keys = device->config_keys( - ConfigKey::DEVICE_OPTIONS); try { gvar_dict = device->config_list(ConfigKey::SAMPLERATE); } catch(const sigrok::Error &e) { @@ -245,7 +275,7 @@ void MainBar::update_sample_rate_selector_value() if (updating_sample_rate_) return; - const shared_ptr device = get_selected_device(); + const shared_ptr device = device_selector_.selected_device(); if (!device) return; @@ -268,7 +298,7 @@ void MainBar::update_sample_count_selector() if (updating_sample_count_) return; - const shared_ptr device = get_selected_device(); + const shared_ptr device = device_selector_.selected_device(); if (!device) return; @@ -329,7 +359,7 @@ void MainBar::update_device_config_widgets() { using namespace pv::popups; - const shared_ptr device = get_selected_device(); + const shared_ptr device = device_selector_.selected_device(); if (!device) return; @@ -387,7 +417,7 @@ void MainBar::commit_sample_count() if (updating_sample_count_) return; - const shared_ptr device = get_selected_device(); + const shared_ptr device = device_selector_.selected_device(); if (!device) return; @@ -417,7 +447,7 @@ void MainBar::commit_sample_rate() if (updating_sample_rate_) return; - const shared_ptr device = get_selected_device(); + const shared_ptr device = device_selector_.selected_device(); if (!device) return; @@ -441,10 +471,7 @@ void MainBar::commit_sample_rate() void MainBar::on_device_selected() { - if (updating_device_selector_) - return; - - shared_ptr device = get_selected_device(); + shared_ptr device = device_selector_.selected_device(); if (!device) return;