]> sigrok.org Git - pulseview.git/blob - pv/subwindows/decoder_selector/subwindow.hpp
dba6f6deed8f72515d58bcd15df5fa0175e2f836
[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 QCustomTreeView : public QTreeView
89 {
90         Q_OBJECT
91
92 public:
93         void currentChanged(const QModelIndex& current, const QModelIndex& previous);
94
95 Q_SIGNALS:
96         void currentChanged(const QModelIndex& current);
97 };
98
99 class SubWindow : public SubWindowBase
100 {
101         Q_OBJECT
102
103 public:
104         explicit SubWindow(Session &session, QWidget *parent = nullptr);
105
106         bool has_toolbar() const;
107         QToolBar* create_toolbar(QWidget *parent) const;
108
109         const srd_decoder* get_srd_decoder_from_id(QString id) const;
110
111         /**
112          * Returns a list of input types that a given protocol decoder requires
113          * ("logic", "uart", etc.)
114          */
115         vector<const char*> decoder_inputs(const srd_decoder* d) const;
116
117         /**
118          * Returns a list of protocol decoder IDs which provide a given output
119          * ("uart", "spi", etc.)
120          */
121         vector<const srd_decoder*> decoders_providing(const char* output) const;
122
123 Q_SIGNALS:
124         void new_decoders_selected(vector<const srd_decoder*> decoders);
125
126 public Q_SLOTS:
127         void on_item_changed(const QModelIndex& index);
128         void on_item_activated(const QModelIndex& index);
129
130 private:
131         QSplitter* splitter_;
132         QCustomTreeView* tree_view_;
133         QWidget* info_box_;
134         QLabel* info_label_header_;
135         QLabel* info_label_body_;
136         QLabel* info_label_footer_;
137         DecoderCollectionModel* model_;
138         QSortFilterProxyModel* sort_filter_model_;
139 };
140
141 } // decoder_selector
142 } // namespace subwindows
143 } // namespace pv
144
145 #endif // PULSEVIEW_PV_SUBWINDOWS_DECODERSELECTOR_SUBWINDOW_HPP
146