/[svn]/qsampler/trunk/src/qsamplerInstrumentListForm.cpp
ViewVC logotype

Contents of /qsampler/trunk/src/qsamplerInstrumentListForm.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2064 - (show annotations) (download)
Fri Mar 12 16:02:32 2010 UTC (14 years ago) by capela
File size: 9120 byte(s)
* Attempt to fix broken instrument list model/view for Qt >= 4.6.

1 // qsamplerInstrumentListForm.cpp
2 //
3 /****************************************************************************
4 Copyright (C) 2003-2010, rncbc aka Rui Nuno Capela. All rights reserved.
5 Copyright (C) 2007, Christian Schoenebeck
6
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; either version 2
10 of the License, or (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20
21 *****************************************************************************/
22
23 #include "qsamplerAbout.h"
24 #include "qsamplerInstrumentListForm.h"
25
26 #include "qsamplerInstrumentList.h"
27
28 #include "qsamplerInstrumentForm.h"
29
30 #include "qsamplerOptions.h"
31 #include "qsamplerInstrument.h"
32 #include "qsamplerMainForm.h"
33
34 #include <QHeaderView>
35 #include <QMessageBox>
36
37
38 namespace QSampler {
39
40 //-------------------------------------------------------------------------
41 // QSampler::InstrumentListForm -- Instrument map list form implementation.
42 //
43
44 InstrumentListForm::InstrumentListForm (
45 QWidget* pParent, Qt::WindowFlags wflags )
46 : QMainWindow(pParent, wflags)
47 {
48 m_ui.setupUi(this);
49
50 // Setup toolbar widgets.
51 m_pMapComboBox = new QComboBox(m_ui.InstrumentToolbar);
52 m_pMapComboBox->setMinimumWidth(120);
53 m_pMapComboBox->setEnabled(false);
54 m_pMapComboBox->setToolTip(tr("Instrument Map"));
55 m_ui.InstrumentToolbar->addWidget(m_pMapComboBox);
56
57 m_ui.InstrumentToolbar->addSeparator();
58 m_ui.InstrumentToolbar->addAction(m_ui.newInstrumentAction);
59 m_ui.InstrumentToolbar->addAction(m_ui.editInstrumentAction);
60 m_ui.InstrumentToolbar->addAction(m_ui.deleteInstrumentAction);
61 m_ui.InstrumentToolbar->addSeparator();
62 m_ui.InstrumentToolbar->addAction(m_ui.refreshInstrumentsAction);
63
64 m_pInstrumentListView = new InstrumentListView(this);
65
66 QHeaderView *pHeader = m_pInstrumentListView->header();
67 pHeader->setDefaultAlignment(Qt::AlignLeft);
68 pHeader->setMovable(false);
69 pHeader->setStretchLastSection(true);
70 pHeader->resizeSection(0, 120); // Name
71 m_pInstrumentListView->resizeColumnToContents(1); // Map
72 m_pInstrumentListView->resizeColumnToContents(2); // Bank
73 m_pInstrumentListView->resizeColumnToContents(3); // Prog
74 m_pInstrumentListView->resizeColumnToContents(4); // Engine
75 pHeader->resizeSection(5, 240); // File
76 m_pInstrumentListView->resizeColumnToContents(6); // Nr
77 pHeader->resizeSection(7, 60); // Vol
78
79 // Enable custom context menu...
80 m_pInstrumentListView->setContextMenuPolicy(Qt::CustomContextMenu);
81
82 QMainWindow::setCentralWidget(m_pInstrumentListView);
83
84 QObject::connect(m_pMapComboBox,
85 SIGNAL(activated(int)),
86 SLOT(activateMap(int)));
87 QObject::connect(
88 m_pInstrumentListView,
89 SIGNAL(customContextMenuRequested(const QPoint&)),
90 SLOT(contextMenu(const QPoint&)));
91 QObject::connect(
92 m_pInstrumentListView,
93 SIGNAL(pressed(const QModelIndex&)),
94 SLOT(stabilizeForm()));
95 QObject::connect(
96 m_pInstrumentListView,
97 SIGNAL(activated(const QModelIndex&)),
98 SLOT(editInstrument(const QModelIndex&)));
99 QObject::connect(
100 m_ui.newInstrumentAction,
101 SIGNAL(triggered()),
102 SLOT(newInstrument()));
103 QObject::connect(
104 m_ui.deleteInstrumentAction,
105 SIGNAL(triggered()),
106 SLOT(deleteInstrument()));
107 QObject::connect(
108 m_ui.editInstrumentAction,
109 SIGNAL(triggered()),
110 SLOT(editInstrument()));
111 QObject::connect(
112 m_ui.refreshInstrumentsAction,
113 SIGNAL(triggered()),
114 SLOT(refreshInstruments()));
115
116 // Things must be stable from the start.
117 stabilizeForm();
118 }
119
120
121 InstrumentListForm::~InstrumentListForm (void)
122 {
123 delete m_pInstrumentListView;
124 delete m_pMapComboBox;
125 }
126
127
128 // Notify our parent that we're emerging.
129 void InstrumentListForm::showEvent ( QShowEvent *pShowEvent )
130 {
131 MainForm* pMainForm = MainForm::getInstance();
132 if (pMainForm)
133 pMainForm->stabilizeForm();
134
135 QWidget::showEvent(pShowEvent);
136 }
137
138
139 // Notify our parent that we're closing.
140 void InstrumentListForm::hideEvent ( QHideEvent *pHideEvent )
141 {
142 QWidget::hideEvent(pHideEvent);
143
144 MainForm* pMainForm = MainForm::getInstance();
145 if (pMainForm)
146 pMainForm->stabilizeForm();
147 }
148
149
150 // Just about to notify main-window that we're closing.
151 void InstrumentListForm::closeEvent ( QCloseEvent * /*pCloseEvent*/ )
152 {
153 QWidget::hide();
154
155 MainForm *pMainForm = MainForm::getInstance();
156 if (pMainForm)
157 pMainForm->stabilizeForm();
158 }
159
160
161 // Refresh all instrument list and views.
162 void InstrumentListForm::refreshInstruments (void)
163 {
164 MainForm* pMainForm = MainForm::getInstance();
165 if (pMainForm == NULL)
166 return;
167
168 Options *pOptions = pMainForm->options();
169 if (pOptions == NULL)
170 return;
171
172 // Get/save current map selection...
173 int iMap = m_pMapComboBox->currentIndex();
174 if (iMap < 0 || m_pMapComboBox->count() < 2)
175 iMap = pOptions->iMidiMap + 1;
176
177 // Populate maps list.
178 m_pMapComboBox->clear();
179 m_pMapComboBox->addItem(tr("(All)"));
180 m_pMapComboBox->insertItems(1, Instrument::getMapNames());
181
182 // Adjust to saved selection...
183 if (iMap < 0 || iMap >= m_pMapComboBox->count())
184 iMap = 0;
185 m_pMapComboBox->setCurrentIndex(iMap);
186 m_pMapComboBox->setEnabled(m_pMapComboBox->count() > 1);
187
188 activateMap(iMap);
189 }
190
191
192 // Refresh instrument maps selector.
193 void InstrumentListForm::activateMap ( int iMap )
194 {
195 MainForm* pMainForm = MainForm::getInstance();
196 if (pMainForm == NULL)
197 return;
198
199 Options *pOptions = pMainForm->options();
200 if (pOptions == NULL)
201 return;
202
203 int iMidiMap = iMap - 1;
204 if (iMidiMap >= 0)
205 pOptions->iMidiMap = iMidiMap;
206
207 m_pInstrumentListView->setMidiMap(iMidiMap);
208 m_pInstrumentListView->refresh();
209
210 stabilizeForm();
211 }
212
213
214 void InstrumentListForm::editInstrument (void)
215 {
216 editInstrument(m_pInstrumentListView->currentIndex());
217 }
218
219
220 void InstrumentListForm::editInstrument ( const QModelIndex& index )
221 {
222 if (!index.isValid())
223 return;
224
225 Instrument *pInstrument
226 = static_cast<Instrument *> (index.internalPointer());
227 if (pInstrument == NULL)
228 return;
229
230 if (pInstrument == NULL)
231 return;
232
233 // Save current key values...
234 Instrument oldInstrument(
235 pInstrument->map(),
236 pInstrument->bank(),
237 pInstrument->prog());
238
239 // Do the edit dance...
240 InstrumentForm form(this);
241 form.setup(pInstrument);
242 if (form.exec()) {
243 // Commit...
244 pInstrument->mapInstrument();
245 // Check whether we changed instrument key...
246 if (oldInstrument.map() == pInstrument->map() &&
247 oldInstrument.bank() == pInstrument->bank() &&
248 oldInstrument.prog() == pInstrument->prog()) {
249 // Just update tree item...
250 //pItem->update();
251 } else {
252 // Unmap old instance...
253 oldInstrument.unmapInstrument();
254 // correct the position of the instrument in the model
255 m_pInstrumentListView->updateInstrument(pInstrument);
256 }
257 }
258 }
259
260
261 void InstrumentListForm::newInstrument (void)
262 {
263 Instrument instrument;
264
265 InstrumentForm form(this);
266 form.setup(&instrument);
267 if (!form.exec())
268 return;
269
270 // Commit...
271 instrument.mapInstrument();
272
273 // add new item to the table model
274 m_pInstrumentListView->addInstrument(
275 instrument.map(),
276 instrument.bank(),
277 instrument.prog());
278 }
279
280
281 void InstrumentListForm::deleteInstrument (void)
282 {
283 const QModelIndex& index = m_pInstrumentListView->currentIndex();
284 if (!index.isValid())
285 return;
286
287 Instrument *pInstrument
288 = static_cast<Instrument *> (index.internalPointer());
289 if (pInstrument == NULL)
290 return;
291
292 MainForm *pMainForm = MainForm::getInstance();
293 if (pMainForm == NULL)
294 return;
295
296 // Prompt user if this is for real...
297 Options *pOptions = pMainForm->options();
298 if (pOptions && pOptions->bConfirmRemove) {
299 if (QMessageBox::warning(this,
300 QSAMPLER_TITLE ": " + tr("Warning"),
301 tr("About to delete instrument map entry:\n\n"
302 "%1\n\n"
303 "Are you sure?")
304 .arg(pInstrument->name()),
305 QMessageBox::Ok | QMessageBox::Cancel)
306 == QMessageBox::Cancel)
307 return;
308 }
309
310 pInstrument->unmapInstrument();
311
312 // let the instrument vanish from the table model
313 m_pInstrumentListView->removeInstrument(pInstrument);
314 }
315
316
317 // Update form actions enablement...
318 void InstrumentListForm::stabilizeForm (void)
319 {
320 MainForm *pMainForm = MainForm::getInstance();
321
322 bool bEnabled = (pMainForm && pMainForm->client());
323 m_ui.newInstrumentAction->setEnabled(bEnabled);
324 const QModelIndex& index = m_pInstrumentListView->currentIndex();
325 bEnabled = (bEnabled && index.isValid());
326 m_ui.editInstrumentAction->setEnabled(bEnabled);
327 m_ui.deleteInstrumentAction->setEnabled(bEnabled);
328 }
329
330
331 // Handle custom context menu here...
332 void InstrumentListForm::contextMenu ( const QPoint& pos )
333 {
334 if (!m_ui.newInstrumentAction->isEnabled())
335 return;
336
337 m_ui.contextMenu->exec(
338 (m_pInstrumentListView->viewport())->mapToGlobal(pos));
339 }
340
341
342 } // namespace QSampler
343
344
345 // end of qsamplerInstrumentListForm.cpp

  ViewVC Help
Powered by ViewVC