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