]> sigrok.org Git - pulseview.git/blobdiff - pv/views/decoder_output/view.cpp
Simplify QHexView interfaces
[pulseview.git] / pv / views / decoder_output / view.cpp
index 28fe907ece0614b50cc961cdfe16ae706fbb3299..5c3b031dec55f4c7dbd6f56d551ad1b58ee4cc77 100644 (file)
 
 #include <libsigrokdecode/libsigrokdecode.h>
 
+#include <QLabel>
 #include <QMenu>
 #include <QToolBar>
 #include <QVBoxLayout>
 
 #include "view.hpp"
+#include "QHexView.hpp"
 
 #include "pv/session.hpp"
 #include "pv/util.hpp"
 
+using pv::data::SignalBase;
 using pv::util::TimeUnit;
 using pv::util::Timestamp;
 
@@ -38,17 +41,35 @@ namespace views {
 namespace decoder_output {
 
 View::View(Session &session, bool is_main_view, QMainWindow *parent) :
-       ViewBase(session, is_main_view, parent)
+       ViewBase(session, is_main_view, parent),
 
        // Note: Place defaults in View::reset_view_state(), not here
+       signal_selector_(new QComboBox()),
+       format_selector_(new QComboBox()),
+       stacked_widget_(new QStackedWidget()),
+       hex_view_(new QHexView())
 {
        QVBoxLayout *root_layout = new QVBoxLayout(this);
        root_layout->setContentsMargins(0, 0, 0, 0);
 
-       QToolBar* tool_bar = new QToolBar();
-       tool_bar->setContextMenuPolicy(Qt::PreventContextMenu);
+       // Create toolbar
+       QToolBar* toolbar = new QToolBar();
+       toolbar->setContextMenuPolicy(Qt::PreventContextMenu);
+       parent->addToolBar(toolbar);
 
-       parent->addToolBar(tool_bar);
+       // Populate toolbar
+       toolbar->addWidget(new QLabel(tr("Decoder:")));
+       toolbar->addWidget(signal_selector_);
+       toolbar->addSeparator();
+       toolbar->addWidget(new QLabel(tr("Show data as")));
+       toolbar->addWidget(format_selector_);
+
+       // Add format types
+       format_selector_->addItem(tr("Hexdump"), qVariantFromValue(QString("text/hexdump")));
+
+       // Add widget stack
+       root_layout->addWidget(stacked_widget_);
+       stacked_widget_->addWidget(hex_view_);
 
        reset_view_state();
 }
@@ -57,6 +78,11 @@ View::~View()
 {
 }
 
+ViewType View::get_type() const
+{
+       return ViewTypeDecoderOutput;
+}
+
 void View::reset_view_state()
 {
        ViewBase::reset_view_state();
@@ -69,17 +95,24 @@ void View::clear_signals()
 
 void View::clear_decode_signals()
 {
+       signal_selector_->clear();
+       format_selector_->setCurrentIndex(0);
 }
 
 void View::add_decode_signal(shared_ptr<data::DecodeSignal> signal)
 {
        connect(signal.get(), SIGNAL(name_changed(const QString&)),
-               this, SLOT(on_signal_name_changed()));
+               this, SLOT(on_signal_name_changed(const QString&)));
+
+       signal_selector_->addItem(signal->name(), QVariant::fromValue(signal.get()));
 }
 
 void View::remove_decode_signal(shared_ptr<data::DecodeSignal> signal)
 {
-       (void)signal;
+       int index = signal_selector_->findData(QVariant::fromValue(signal.get()));
+
+       if (index != -1)
+               signal_selector_->removeItem(index);
 }
 
 void View::save_settings(QSettings &settings) const
@@ -94,8 +127,14 @@ void View::restore_settings(QSettings &settings)
        (void)settings;
 }
 
-void View::on_signal_name_changed()
+void View::on_signal_name_changed(const QString &name)
 {
+       SignalBase *sb = qobject_cast<SignalBase*>(QObject::sender());
+       assert(sb);
+
+       int index = signal_selector_->findData(QVariant::fromValue(sb));
+       if (index != -1)
+               signal_selector_->setItemText(index, name);
 }
 
 } // namespace decoder_output