1
//=========================================================
4
// $Id: markerview.cpp,v 1.2 2002/02/27 11:52:58 muse Exp $
5
// (C) Copyright 2000 Werner Schweer (ws@seh.de)
6
//=========================================================
9
#include "markerview.h"
18
#include <qtoolbutton.h>
21
#include <qsizegrip.h>
22
#include <qpopupmenu.h>
25
#include <qgroupbox.h>
26
#include <qlineedit.h>
28
enum { COL_TICK = 0, COL_SMPTE, COL_LOCK, COL_NAME };
30
//---------------------------------------------------------
32
//---------------------------------------------------------
34
int MarkerItem::tick() const
36
return _marker->posTick();
39
//---------------------------------------------------------
41
//---------------------------------------------------------
43
const QString MarkerItem::name() const
45
return _marker->name();
48
//---------------------------------------------------------
50
//---------------------------------------------------------
52
bool MarkerItem::lock() const
54
return _marker->type() == Pos::TIME;
57
//---------------------------------------------------------
59
//---------------------------------------------------------
61
MarkerItem::MarkerItem(QListView* parent, Marker* m)
62
: QListViewItem(parent)
65
setText(COL_NAME, m->name());
66
setTick(m->posTick());
67
if (m->type() == Pos::TIME)
68
setPixmap(COL_LOCK, *lockIcon);
69
setLock(m->type() == Pos::TIME);
72
//---------------------------------------------------------
74
//---------------------------------------------------------
76
void MarkerItem::setName(const QString& s)
79
_marker = song->setMarkerName(_marker, s);
82
//---------------------------------------------------------
84
//---------------------------------------------------------
86
void MarkerItem::setLock(bool lck)
88
setPixmap(COL_LOCK, lck ? *lockIcon : 0);
89
_marker = song->setMarkerLock(_marker, lck);
92
//---------------------------------------------------------
94
//---------------------------------------------------------
96
void MarkerItem::setTick(int v)
98
if (_marker->posTick() != v)
99
_marker = song->setMarkerTick(_marker, v);
102
sigmap.tickValues(v, &bar, &beat, &tick);
103
s.sprintf("%04d.%02d.%03d", bar+1, beat+1, tick);
104
setText(COL_TICK, s);
106
double time = tempomap.tick2time(v);
107
int hour = int(time) / 3600;
108
int min = (int(time) % 3600)/60;
109
int sec = int(time) % 60;
110
double rest = time - (hour*3600 + min * 60 + sec);
112
case 0: // 24 frames sec
118
case 2: // 30 drop frame
121
case 3: // 30 non drop frame
125
int frame = int(rest);
126
int subframe = int((rest-frame)*100);
127
s.sprintf("%02d:%02d:%02d:%02d:%02d",
128
hour, min, sec, frame, subframe);
129
setText(COL_SMPTE, s);
132
//---------------------------------------------------------
134
//---------------------------------------------------------
136
void MarkerView::closeEvent(QCloseEvent* e)
138
emit deleted((int)this);
142
//---------------------------------------------------------
144
//---------------------------------------------------------
146
void MarkerView::songChanged(int)
151
//---------------------------------------------------------
153
//---------------------------------------------------------
155
MarkerView::MarkerView(QWidget* parent)
156
: TopWin(parent, "markerview", WType_TopLevel /*| WDestructiveClose*/)
158
setCaption("MusE: Marker");
160
//---------Actions----------------------------
161
QAction* markerAdd = new QAction("add marker",
162
QIconSet(*flagIcon), "Add Marker",
163
0, this, "add marker");
164
connect(markerAdd, SIGNAL(activated()), SLOT(addMarker()));
166
QAction* markerDelete = new QAction("delete marker",
167
QIconSet(*deleteIcon), "Delete Marker",
168
0, this, "delete marker");
169
connect(markerDelete, SIGNAL(activated()), SLOT(deleteMarker()));
171
//---------Pulldown Menu----------------------------
172
QPopupMenu* fileMenu = new QPopupMenu(this);
173
menuBar()->insertItem("&File", fileMenu);
174
QPopupMenu* editMenu = new QPopupMenu(this);
175
menuBar()->insertItem("&Edit", editMenu);
176
markerAdd->addTo(editMenu);
177
markerDelete->addTo(editMenu);
179
//---------ToolBar----------------------------------
180
tools = new QToolBar(this, "marker-tools");
181
undoRedo->addTo(tools);
183
QToolBar* edit = new QToolBar(this, "edit tools");
184
markerAdd->addTo(edit);
185
markerDelete->addTo(edit);
187
//---------------------------------------------------
189
//---------------------------------------------------
191
QWidget* w = new QWidget(this, "main");
193
QVBoxLayout* vbox = new QVBoxLayout(w);
195
table = new QListView(w);
196
table->setAllColumnsShowFocus(true);
197
table->setSelectionMode(QListView::Single);
198
table->setSorting(COL_TICK, true);
200
table->addColumn(tr("Bar:Beat:Tick"));
201
table->addColumn(tr("Hr:Mn:Sc:Fr:Sf"));
202
table->addColumn(tr("Lock"));
203
table->addColumn(tr("Text"));
204
table->setColumnWidth(3, 200);
205
table->setColumnWidthMode(3, QListView::Maximum);
206
connect(table, SIGNAL(selectionChanged()),
207
SLOT(markerSelectionChanged()));
208
connect(table, SIGNAL(clicked(QListViewItem*)),
209
SLOT(clicked(QListViewItem*)));
211
QGroupBox* props = new QGroupBox(4, Horizontal, tr("Marker Properties"), w);
213
editTick = new PosEdit(props);
214
editTick->setSizePolicy(QSizePolicy(QSizePolicy::Fixed,
215
QSizePolicy::Fixed));
217
editSMPTE = new PosEdit(props);
218
editSMPTE->setSmpte(true);
219
editSMPTE->setSizePolicy(QSizePolicy(QSizePolicy::Fixed,
220
QSizePolicy::Fixed));
222
lock = new QToolButton(props);
223
lock->setPixmap(*lockIcon);
224
lock->setToggleButton(true);
226
editName = new QLineEdit(props);
227
editName->setSizePolicy(QSizePolicy(QSizePolicy::Expanding,
228
QSizePolicy::Preferred));
229
connect(editName, SIGNAL(textChanged(const QString&)),
230
SLOT(nameChanged(const QString&)));
231
connect(editTick, SIGNAL(valueChanged(const Pos&)),
232
SLOT(tickChanged(const Pos&)));
233
connect(editSMPTE, SIGNAL(valueChanged(const Pos&)),
234
SLOT(tickChanged(const Pos&)));
235
connect(editSMPTE, SIGNAL(valueChanged(const Pos&)),
236
editTick, SLOT(setValue(const Pos&)));
237
connect(editTick, SIGNAL(valueChanged(const Pos&)),
238
editSMPTE, SLOT(setValue(const Pos&)));
239
connect(lock, SIGNAL(toggled(bool)),
240
SLOT(lockChanged(bool)));
241
connect(song, SIGNAL(markerChanged(int)),
242
SLOT(markerChanged(int)));
244
vbox->addWidget(table);
245
vbox->addWidget(props);
247
//---------------------------------------------------
249
//---------------------------------------------------
251
// connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
255
//---------------------------------------------------------
257
//---------------------------------------------------------
259
MarkerView::~MarkerView()
261
undoRedo->removeFrom(tools);
264
//---------------------------------------------------------
266
//---------------------------------------------------------
268
void MarkerView::readStatus(Xml& xml)
271
Xml::Token token = xml.parse();
272
const QString& tag = xml.s1();
273
if (token == Xml::Error || token == Xml::End)
277
xml.unknown("Marker");
288
//---------------------------------------------------------
290
//---------------------------------------------------------
292
void MarkerView::writeStatus(int level, Xml& xml) const
294
xml.tag(level++, "marker");
295
xml.tag(level, "/marker");
298
//---------------------------------------------------------
300
//---------------------------------------------------------
302
void MarkerView::addMarker()
304
Marker* m = song->addMarker(QString(""), song->cpos(), false);
305
MarkerItem* newItem = new MarkerItem(table, m);
306
table->setSelected(newItem, true);
309
//---------------------------------------------------------
311
//---------------------------------------------------------
313
void MarkerView::deleteMarker()
315
MarkerItem* item = (MarkerItem*)table->selectedItem();
317
song->removeMarker(item->marker());
322
//---------------------------------------------------------
324
//---------------------------------------------------------
326
void MarkerView::updateList()
329
MarkerList* marker = song->marker();
330
for (iMarker i = marker->begin(); i != marker->end(); ++i) {
331
Marker* m = &i->second;
333
tick.setNum(i->first);
334
new MarkerItem(table, m);
338
//---------------------------------------------------------
340
//---------------------------------------------------------
342
void MarkerView::markerSelectionChanged()
344
MarkerItem* item = (MarkerItem*)table->selectedItem();
345
if (item == 0) { // never triggered
346
editTick->setValue(0);
347
editSMPTE->setValue(0);
348
editName->setText(QString(""));
350
editSMPTE->setEnabled(false);
351
editTick->setEnabled(false);
352
lock->setEnabled(false);
353
editName->setEnabled(false);
356
editTick->setValue(item->tick());
357
editSMPTE->setValue(item->tick());
358
editName->setText(item->name());
359
editName->setEnabled(true);
360
lock->setOn(item->lock());
361
lock->setEnabled(true);
362
editSMPTE->setEnabled(item->lock());
363
editTick->setEnabled(!item->lock());
367
void MarkerView::clicked(QListViewItem* i)
369
MarkerItem* item = (MarkerItem*)i;
371
table->clearSelection();
374
song->setPos(0, item->tick(), true, true, false);
377
//---------------------------------------------------------
379
//---------------------------------------------------------
381
void MarkerView::nameChanged(const QString& s)
383
MarkerItem* item = (MarkerItem*)table->selectedItem();
388
//---------------------------------------------------------
390
//---------------------------------------------------------
392
void MarkerView::tickChanged(const Pos& pos)
394
MarkerItem* item = (MarkerItem*)table->selectedItem();
396
item->setTick(pos.posTick());
397
song->setPos(0, pos.posTick(), true, true, false);
402
//---------------------------------------------------------
404
//---------------------------------------------------------
406
void MarkerView::lockChanged(bool lck)
408
MarkerItem* item = (MarkerItem*)table->selectedItem();
411
editSMPTE->setEnabled(item->lock());
412
editTick->setEnabled(!item->lock());
415
//---------------------------------------------------------
417
// select appropriate Marker
418
//---------------------------------------------------------
420
void MarkerView::markerChanged(int val)
422
if (val != Song::MARKER_CUR)
424
MarkerList* marker = song->marker();
425
for (iMarker i = marker->begin(); i != marker->end(); ++i) {
426
if (i->second.current()) {
427
MarkerItem* item = (MarkerItem*)table->firstChild();
429
if (item->marker() == &i->second) {
430
table->setSelected(item, true);
433
item = (MarkerItem*)item->nextSibling();