From ce6001b8b3b21778218f07549b165ac848ceffd2 Mon Sep 17 00:00:00 2001 From: Joel Holdsworth Date: Sat, 17 Jan 2015 19:35:18 +0000 Subject: [PATCH 1/1] Added pv::widgets::ExportMenu --- CMakeLists.txt | 2 + pv/widgets/exportmenu.cpp | 92 +++++++++++++++++++++++++++++++++++++++ pv/widgets/exportmenu.hpp | 59 +++++++++++++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 pv/widgets/exportmenu.cpp create mode 100644 pv/widgets/exportmenu.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 66757475..78acee61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -190,6 +190,7 @@ set(pulseview_SOURCES pv/widgets/colourbutton.cpp pv/widgets/colourpopup.cpp pv/widgets/devicetoolbutton.cpp + pv/widgets/exportmenu.cpp pv/widgets/hidingmenubar.cpp pv/widgets/popup.cpp pv/widgets/popuptoolbutton.cpp @@ -234,6 +235,7 @@ set(pulseview_HEADERS pv/widgets/colourbutton.hpp pv/widgets/colourpopup.hpp pv/widgets/devicetoolbutton.hpp + pv/widgets/exportmenu.hpp pv/widgets/hidingmenubar.hpp pv/widgets/popup.hpp pv/widgets/popuptoolbutton.hpp diff --git a/pv/widgets/exportmenu.cpp b/pv/widgets/exportmenu.cpp new file mode 100644 index 00000000..4fa9d197 --- /dev/null +++ b/pv/widgets/exportmenu.cpp @@ -0,0 +1,92 @@ +/* + * This file is part of the PulseView project. + * + * Copyright (C) 2013 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include + +#include + +#include "exportmenu.hpp" + +using std::find_if; +using std::map; +using std::pair; +using std::string; +using std::shared_ptr; + +using sigrok::Context; +using sigrok::OutputFormat; + +namespace pv { +namespace widgets { + +ExportMenu::ExportMenu(QWidget *parent, shared_ptr context, + QAction *open_action) : + QMenu(parent), + context_(context), + mapper_(this) +{ + assert(context); + + if (open_action) { + addAction(open_action); + setDefaultAction(open_action); + addSeparator(); + } + + const map > formats = + context->output_formats(); + + for (const pair > &f : formats) { + if (f.first == "srzip") + continue; + + assert(f.second); + QAction *const action = addAction(tr("Export %1...") + .arg(QString::fromStdString(f.second->description()))); + action->setData(qVariantFromValue((void*)f.second.get())); + mapper_.setMapping(action, action); + connect(action, SIGNAL(triggered()), &mapper_, SLOT(map())); + } + + connect(&mapper_, SIGNAL(mapped(QObject*)), + this, SLOT(on_action(QObject*))); +} + +void ExportMenu::on_action(QObject *action) +{ + assert(action); + + const map > formats = + context_->output_formats(); + const auto iter = find_if(formats.cbegin(), formats.cend(), + [&](const pair > &f) { + return f.second.get() == + ((QAction*)action)->data().value(); }); + if (iter == formats.cend()) + return; + + format_selected((*iter).second); +} + +} // widgets +} // pv diff --git a/pv/widgets/exportmenu.hpp b/pv/widgets/exportmenu.hpp new file mode 100644 index 00000000..7cd44070 --- /dev/null +++ b/pv/widgets/exportmenu.hpp @@ -0,0 +1,59 @@ +/* + * This file is part of the PulseView project. + * + * Copyright (C) 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef PULSEVIEW_PV_WIDGETS_EXPORTMENU_H +#define PULSEVIEW_PV_WIDGETS_EXPORTMENU_H + +#include + +#include +#include + +namespace sigrok { +class Context; +class OutputFormat; +} + +namespace pv { +namespace widgets { + +class ExportMenu : public QMenu +{ + Q_OBJECT; + +public: + ExportMenu(QWidget *parent, std::shared_ptr context, + QAction *open_action = nullptr); + +private Q_SLOTS: + void on_action(QObject *action); + +Q_SIGNALS: + void format_selected(std::shared_ptr format); + +private: + std::shared_ptr context_; + QSignalMapper mapper_; +}; + +} // widgets +} // pv + +#endif // PULSEVIEW_PV_WIDGETS_EXPORTMENU_H -- 2.30.2