1 //=========================================================
2 // MusE
3 // Linux Music Editor
4 //
5 // raster_widgets.cpp
6 // Copyright (C) 2020 Tim E. Real (terminator356 on users dot sourceforge dot net)
7 //
8 // This program is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU General Public License
10 // as published by the Free Software Foundation; version 2 of
11 // the License, or (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the Free Software
20 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 //
22 //=========================================================
23
24 #include "raster_widgets.h"
25
26 #include <QHeaderView>
27 #include <QModelIndex>
28
29 namespace MusEGui {
30
RasterizerTableView(QWidget * parent)31 RasterizerTableView::RasterizerTableView(QWidget *parent)
32 : QTableView(parent)
33 {
34 verticalHeader()->setDefaultSectionSize(22);
35 horizontalHeader()->setDefaultSectionSize(32);
36 setSelectionMode(QAbstractItemView::SingleSelection);
37 verticalHeader()->hide();
38 horizontalHeader()->hide();
39 }
40
reset()41 void RasterizerTableView::reset()
42 {
43 QTableView::reset();
44
45 const QAbstractItemModel *mdl = model();
46 if(!mdl)
47 return;
48 const int cols = mdl->columnCount();
49 const int rows = mdl->rowCount();
50 int off_row = -1;
51 int bar_row = -1;
52 // Is it a RasterizerModel? (It should be).
53 const RasterizerModel* rast_mdl = dynamic_cast<const RasterizerModel*>(mdl);
54 if(rast_mdl)
55 {
56 off_row = rast_mdl->offRow();
57 bar_row = rast_mdl->barRow();
58 }
59
60 // Be sure to reset any previous wide spans to normal single-column span!
61 // Otherwise leftover wide span items appear in the list when it changes! Verified and tested OK.
62 // TODO TEST : How can that happen? Doesn't the table clear first?
63 // Or does it 'economize' (re-use) items? Apparently so. Should we clear first if not already done?
64 clearSpans();
65
66 for(int i = 0; i < rows; ++i)
67 {
68 // Special for 'off' and 'bar' rows: Span all columns.
69 if(i == off_row)
70 setSpan(off_row, 0, 1, cols);
71 else if(i == bar_row)
72 setSpan(bar_row, 0, 1, cols);
73 }
74
75 int w = 0;
76 for(int i = 0; i < cols; ++i)
77 {
78 if(isColumnHidden(i))
79 continue;
80 resizeColumnToContents(i);
81 w += columnWidth(i);
82 }
83 setMinimumWidth(w);
84
85 //QTableView::reset();
86 }
87
88
89 //=====================================================================
90
91
RasterizerListView(QWidget * parent)92 RasterizerListView::RasterizerListView(QWidget *parent)
93 : QListView(parent)
94 {
95 setSelectionMode(QAbstractItemView::SingleSelection);
96 }
97
98
99 //=====================================================================
100
101
RasterizerTreeView(QWidget * parent)102 RasterizerTreeView::RasterizerTreeView(QWidget *parent)
103 : QTreeView(parent)
104 {
105 setSelectionMode(QAbstractItemView::SingleSelection);
106 }
107
108
109 //=====================================================================
110
111
RasterLabelCombo(RasterComboType type,RasterizerModel * model,QWidget * parent,const char * name)112 RasterLabelCombo::RasterLabelCombo(RasterComboType type, RasterizerModel *model, QWidget* parent, const char* name)
113 : LabelCombo(tr("Snap"), parent, name)
114 {
115 // setFocusPolicy(Qt::TabFocus);
116 //setContentsMargins(0,0,0,0);
117
118 // Arbitrarily high value to show everything.
119 setMaxVisibleItems(50);
120 setSizeAdjustPolicy(QComboBox::AdjustToContents);
121
122 switch(type)
123 {
124 case ListView:
125 rlist = new RasterizerListView();
126 break;
127
128 case TableView:
129 rlist = new RasterizerTableView();
130 break;
131
132 case TreeView:
133 rlist = new RasterizerTreeView();
134 break;
135 }
136
137 _rlistModel = model;
138 rlist->setModel(_rlistModel);
139 setView(rlist);
140
141 connect(this, QOverload<const QModelIndex&>::of(&LabelCombo::activated),
142 [=](const QModelIndex& mdl_idx) { rasterActivated(mdl_idx); } );
143 }
144
rasterizer() const145 const Rasterizer *RasterLabelCombo::rasterizer() const
146 {
147 return _rlistModel->rasterizer();
148 }
149
rasterizerModel() const150 RasterizerModel *RasterLabelCombo::rasterizerModel() const
151 {
152 return _rlistModel;
153 }
154
setRasterizerModel(RasterizerModel * model)155 void RasterLabelCombo::setRasterizerModel(RasterizerModel *model)
156 {
157 if(_rlistModel == model)
158 return;
159 _rlistModel = model;
160 rlist->setModel(_rlistModel);
161 }
162
rasterActivated(const QModelIndex & mdl_idx)163 void RasterLabelCombo::rasterActivated(const QModelIndex& mdl_idx)
164 {
165 const int raster = _rlistModel->data(mdl_idx, RasterizerModel::RasterValueRole).toInt();
166 if(raster < 0)
167 return;
168 emit rasterChanged(raster);
169 }
170
171 } // namespace MusEGui
172