]> sigrok.org Git - pulseview.git/blob - pv/subwindows/decoder_selector/subwindow.hpp
DecoderSelector: Use srd_decoder_get_by_id()
[pulseview.git] / pv / subwindows / decoder_selector / subwindow.hpp
1 /*
2  * This file is part of the PulseView project.
3  *
4  * Copyright (C) 2018 Soeren Apel <soeren@apelpie.net>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #ifndef PULSEVIEW_PV_SUBWINDOWS_DECODERSELECTOR_SUBWINDOW_HPP
21 #define PULSEVIEW_PV_SUBWINDOWS_DECODERSELECTOR_SUBWINDOW_HPP
22
23 #include <vector>
24
25 #include <QAbstractItemModel>
26 #include <QLabel>
27 #include <QSortFilterProxyModel>
28 #include <QSplitter>
29 #include <QTreeView>
30
31 #include "pv/subwindows/subwindowbase.hpp"
32
33 using std::shared_ptr;
34
35 namespace pv {
36 namespace subwindows {
37 namespace decoder_selector {
38
39 class DecoderCollectionItem
40 {
41 public:
42         DecoderCollectionItem(const vector<QVariant>& data,
43                 shared_ptr<DecoderCollectionItem> parent = nullptr);
44
45         void appendSubItem(shared_ptr<DecoderCollectionItem> item);
46
47         shared_ptr<DecoderCollectionItem> subItem(int row) const;
48         shared_ptr<DecoderCollectionItem> parent() const;
49         shared_ptr<DecoderCollectionItem> findSubItem(const QVariant& value, int column);
50
51         int subItemCount() const;
52         int columnCount() const;
53         int row() const;
54         QVariant data(int column) const;
55
56 private:
57         vector< shared_ptr<DecoderCollectionItem> > subItems_;
58         vector<QVariant> data_;
59         shared_ptr<DecoderCollectionItem> parent_;
60 };
61
62
63 class DecoderCollectionModel : public QAbstractItemModel
64 {
65         Q_OBJECT
66
67 public:
68         DecoderCollectionModel(QObject* parent = 0);
69
70         QVariant data(const QModelIndex& index, int role) const override;
71         Qt::ItemFlags flags(const QModelIndex& index) const override;
72
73         QVariant headerData(int section, Qt::Orientation orientation,
74                 int role = Qt::DisplayRole) const override;
75         QModelIndex index(int row, int column,
76                 const QModelIndex& parent_idx = QModelIndex()) const override;
77
78         QModelIndex parent(const QModelIndex& index) const override;
79
80         int rowCount(const QModelIndex& parent_idx = QModelIndex()) const override;
81         int columnCount(const QModelIndex& parent_idx = QModelIndex()) const override;
82
83 private:
84         shared_ptr<DecoderCollectionItem> root_;
85 };
86
87
88 class QCustomSortFilterProxyModel : public QSortFilterProxyModel
89 {
90 protected:
91         bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const;
92 };
93
94 class QCustomTreeView : public QTreeView
95 {
96         Q_OBJECT
97
98 public:
99         void currentChanged(const QModelIndex& current, const QModelIndex& previous);
100
101 Q_SIGNALS:
102         void currentChanged(const QModelIndex& current);
103 };
104
105 class SubWindow : public SubWindowBase
106 {
107         Q_OBJECT
108
109 public:
110         explicit SubWindow(Session &session, QWidget *parent = nullptr);
111
112         bool has_toolbar() const;
113         QToolBar* create_toolbar(QWidget *parent) const;
114
115         /**
116          * Returns a list of input types that a given protocol decoder requires
117          * ("logic", "uart", etc.)
118          */
119         vector<const char*> get_decoder_inputs(const srd_decoder* d) const;
120
121         /**
122          * Returns a list of protocol decoder IDs which provide a given output
123          * ("uart", "spi", etc.)
124          */
125         vector<const srd_decoder*> get_decoders_providing(const char* output) const;
126
127 Q_SIGNALS:
128         void new_decoders_selected(vector<const srd_decoder*> decoders);
129
130 public Q_SLOTS:
131         void on_item_changed(const QModelIndex& index);
132         void on_item_activated(const QModelIndex& index);
133
134         void on_filter_changed(const QString& text);
135
136 private:
137         QSplitter* splitter_;
138         QCustomTreeView* tree_view_;
139         QWidget* info_box_;
140         QLabel* info_label_header_;
141         QLabel* info_label_body_;
142         QLabel* info_label_footer_;
143         DecoderCollectionModel* model_;
144         QCustomSortFilterProxyModel* sort_filter_model_;
145 };
146
147 } // decoder_selector
148 } // namespace subwindows
149 } // namespace pv
150
151 #endif // PULSEVIEW_PV_SUBWINDOWS_DECODERSELECTOR_SUBWINDOW_HPP
152