]>
Commit | Line | Data |
---|---|---|
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 | int minimum_width() const; | |
116 | ||
117 | /** | |
118 | * Returns a list of input types that a given protocol decoder requires | |
119 | * ("logic", "uart", etc.) | |
120 | */ | |
121 | vector<const char*> get_decoder_inputs(const srd_decoder* d) const; | |
122 | ||
123 | /** | |
124 | * Returns a list of protocol decoder IDs which provide a given output | |
125 | * ("uart", "spi", etc.) | |
126 | */ | |
127 | vector<const srd_decoder*> get_decoders_providing(const char* output) const; | |
128 | ||
129 | Q_SIGNALS: | |
130 | void new_decoders_selected(vector<const srd_decoder*> decoders); | |
131 | ||
132 | public Q_SLOTS: | |
133 | void on_item_changed(const QModelIndex& index); | |
134 | void on_item_activated(const QModelIndex& index); | |
135 | ||
136 | void on_filter_changed(const QString& text); | |
137 | ||
138 | private: | |
139 | QSplitter* splitter_; | |
140 | QCustomTreeView* tree_view_; | |
141 | QWidget* info_box_; | |
142 | QLabel* info_label_header_; | |
143 | QLabel* info_label_body_; | |
144 | QLabel* info_label_footer_; | |
145 | DecoderCollectionModel* model_; | |
146 | QCustomSortFilterProxyModel* sort_filter_model_; | |
147 | }; | |
148 | ||
149 | } // decoder_selector | |
150 | } // namespace subwindows | |
151 | } // namespace pv | |
152 | ||
153 | #endif // PULSEVIEW_PV_SUBWINDOWS_DECODERSELECTOR_SUBWINDOW_HPP | |
154 |