diff options
Diffstat (limited to 'muse2/muse/marker/markerview.cpp')
-rw-r--r-- | muse2/muse/marker/markerview.cpp | 597 |
1 files changed, 597 insertions, 0 deletions
diff --git a/muse2/muse/marker/markerview.cpp b/muse2/muse/marker/markerview.cpp new file mode 100644 index 00000000..39885ec7 --- /dev/null +++ b/muse2/muse/marker/markerview.cpp @@ -0,0 +1,597 @@ +//========================================================= +// MusE +// Linux Music Editor +// $Id: markerview.cpp,v 1.7.2.6 2009/08/25 20:28:45 spamatica Exp $ +// (C) Copyright 2000 Werner Schweer (ws@seh.de) +//========================================================= + +#include "marker.h" +#include "markerview.h" +#include "xml.h" +#include "globals.h" +#include "sync.h" +#include "icons.h" +#include "song.h" +#include "posedit.h" + +#include <q3toolbar.h> +#include <qtoolbutton.h> +#include <qtooltip.h> +#include <qlayout.h> +#include <qsizegrip.h> +#include <q3popupmenu.h> +#include <qmenubar.h> +#include <qaction.h> +#include <q3groupbox.h> +#include <qlineedit.h> +#include <Qt3Support> +//Added by qt3to4: +#include <QCloseEvent> +#include <Q3VBoxLayout> + +enum { COL_TICK = 0, COL_SMPTE, COL_LOCK, COL_NAME }; + +//--------------------------------------------------------- +// tick +//--------------------------------------------------------- + +unsigned MarkerItem::tick() const + { + return _marker->tick(); + } + +//--------------------------------------------------------- +// name +//--------------------------------------------------------- + +const QString MarkerItem::name() const + { + return _marker->name(); + } + +//--------------------------------------------------------- +// lock +//--------------------------------------------------------- + +bool MarkerItem::lock() const + { + return _marker->type() == Pos::FRAMES; + } + +//--------------------------------------------------------- +// MarkerItem +//--------------------------------------------------------- + +MarkerItem::MarkerItem(Q3ListView* parent, Marker* m) + : Q3ListViewItem(parent) + { + _marker = m; + setText(COL_NAME, m->name()); + setTick(m->tick()); + if (m->type() == Pos::FRAMES) + setPixmap(COL_LOCK, *lockIcon); + setLock(m->type() == Pos::FRAMES); + } + +//--------------------------------------------------------- +// setName +//--------------------------------------------------------- + +void MarkerItem::setName(const QString& s) + { + setText(COL_NAME, s); + _marker = song->setMarkerName(_marker, s); + } + +//--------------------------------------------------------- +// setLock +//--------------------------------------------------------- + +void MarkerItem::setLock(bool lck) + { + setPixmap(COL_LOCK, lck ? *lockIcon : 0); + _marker = song->setMarkerLock(_marker, lck); + } + +//--------------------------------------------------------- +// setTick +//--------------------------------------------------------- + +void MarkerItem::setTick(unsigned v) + { + if (_marker->tick() != v) + _marker = song->setMarkerTick(_marker, v); + QString s; + int bar, beat; + unsigned tick; + sigmap.tickValues(v, &bar, &beat, &tick); + s.sprintf("%04d.%02d.%03d", bar+1, beat+1, tick); + setText(COL_TICK, s); + + double time = double(tempomap.tick2frame(v))/double(sampleRate); + int hour = int(time) / 3600; + int min = (int(time) % 3600)/60; + int sec = int(time) % 60; + double rest = time - (hour*3600 + min * 60 + sec); + switch(mtcType) { + case 0: // 24 frames sec + rest *= 24; + break; + case 1: // 25 + rest *= 25; + break; + case 2: // 30 drop frame + rest *= 30; + break; + case 3: // 30 non drop frame + rest *= 30; + break; + } + int frame = int(rest); + int subframe = int((rest-frame)*100); + s.sprintf("%02d:%02d:%02d:%02d:%02d", + hour, min, sec, frame, subframe); + setText(COL_SMPTE, s); + } + +//--------------------------------------------------------- +// closeEvent +//--------------------------------------------------------- + +void MarkerView::closeEvent(QCloseEvent* e) + { + emit deleted((unsigned long)this); + emit closed(); + e->accept(); + } + +//--------------------------------------------------------- +// MarkerView +//--------------------------------------------------------- + +MarkerView::MarkerView(QWidget* parent) + : TopWin(parent, "markerview", Qt::WType_TopLevel /*| WDestructiveClose*/) + { + setCaption(tr("MusE: Marker")); + + //---------Actions---------------------------- + Q3Action* markerAdd = new Q3Action(tr("add marker"), + QIcon(*flagIcon), tr("Add Marker"), + 0, this, "add marker"); + connect(markerAdd, SIGNAL(activated()), SLOT(addMarker())); + + Q3Action* markerDelete = new Q3Action(tr("delete marker"), + QIcon(*deleteIcon), tr("Delete Marker"), + 0, this, "delete marker"); + connect(markerDelete, SIGNAL(activated()), SLOT(deleteMarker())); + + //---------Pulldown Menu---------------------------- + Q3PopupMenu* fileMenu = new Q3PopupMenu(this); + menuBar()->insertItem(tr("&File"), fileMenu); + Q3PopupMenu* editMenu = new Q3PopupMenu(this); + menuBar()->insertItem(tr("&Edit"), editMenu); + markerAdd->addTo(editMenu); + markerDelete->addTo(editMenu); + + //---------ToolBar---------------------------------- + tools = new Q3ToolBar(this, "marker-tools"); + undoRedo->addTo(tools); + + Q3ToolBar* edit = new Q3ToolBar(this, "edit tools"); + markerAdd->addTo(edit); + markerDelete->addTo(edit); + + //--------------------------------------------------- + // master + //--------------------------------------------------- + + QWidget* w = new QWidget(this, "main"); + setCentralWidget(w); + Q3VBoxLayout* vbox = new Q3VBoxLayout(w); + + table = new Q3ListView(w); + table->setAllColumnsShowFocus(true); + table->setSelectionMode(Q3ListView::Single); + table->setSorting(COL_TICK, true); + + table->addColumn(tr("Bar:Beat:Tick")); + table->addColumn(tr("Hr:Mn:Sc:Fr:Sf")); + table->addColumn(tr("Lock")); + table->addColumn(tr("Text")); + table->setColumnWidth(3, 200); + table->setColumnWidthMode(3, Q3ListView::Maximum); + connect(table, SIGNAL(selectionChanged()), + SLOT(markerSelectionChanged())); + connect(table, SIGNAL(clicked(Q3ListViewItem*)), + SLOT(clicked(Q3ListViewItem*))); + + Q3GroupBox* props = new Q3GroupBox(4, Qt::Horizontal, tr("Marker Properties"), w); + + editTick = new PosEdit(props); + editTick->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, + QSizePolicy::Fixed)); + + editSMPTE = new PosEdit(props); + editSMPTE->setSmpte(true); + editSMPTE->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, + QSizePolicy::Fixed)); + + lock = new QToolButton(props); + lock->setPixmap(*lockIcon); + lock->setToggleButton(true); + + editName = new QLineEdit(props); + editName->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, + QSizePolicy::Preferred)); + connect(editName, SIGNAL(textChanged(const QString&)), + SLOT(nameChanged(const QString&))); + connect(editTick, SIGNAL(valueChanged(const Pos&)), + SLOT(tickChanged(const Pos&))); + connect(editSMPTE, SIGNAL(valueChanged(const Pos&)), + SLOT(tickChanged(const Pos&))); + connect(editSMPTE, SIGNAL(valueChanged(const Pos&)), + editTick, SLOT(setValue(const Pos&))); + connect(editTick, SIGNAL(valueChanged(const Pos&)), + editSMPTE, SLOT(setValue(const Pos&))); + connect(lock, SIGNAL(toggled(bool)), + SLOT(lockChanged(bool))); + connect(song, SIGNAL(markerChanged(int)), + SLOT(markerChanged(int))); + + vbox->addWidget(table); + vbox->addWidget(props); + + //--------------------------------------------------- + // Rest + //--------------------------------------------------- + + //connect(song, SIGNAL(songChanged(int)), SLOT(updateList())); + connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int))); + + updateList(); + + // work around for probable QT/WM interaction bug. + // for certain window managers, e.g xfce, this window is + // is displayed although not specifically set to show(); + // bug: 2811156 Softsynth GUI unclosable with XFCE4 (and a few others) + show(); + hide(); + + } + +//--------------------------------------------------------- +// MArkerView +//--------------------------------------------------------- + +MarkerView::~MarkerView() + { + // p3.3.47 + //printf("MarkerView::~MarkerView() before undoRedo->removeFrom(tools)\n"); + + undoRedo->removeFrom(tools); + } + +//--------------------------------------------------------- +// readStatus +//--------------------------------------------------------- + +void MarkerView::readStatus(Xml& xml) + { + for (;;) { + Xml::Token token = xml.parse(); + const QString& tag = xml.s1(); + if (token == Xml::Error || token == Xml::End) + break; + switch (token) { + case Xml::TagStart: + xml.unknown("Marker"); + break; + case Xml::TagEnd: + if (tag == "marker") + return; + default: + break; + } + } + } + +//--------------------------------------------------------- +// writeStatus +//--------------------------------------------------------- + +void MarkerView::writeStatus(int level, Xml& xml) const + { + xml.tag(level++, "marker"); + xml.tag(level, "/marker"); + } + +//--------------------------------------------------------- +// addMarker +//--------------------------------------------------------- +void MarkerView::addMarker() + { + addMarker(-1); + } +void MarkerView::addMarker(int i) + { + if( i==-1 ) i = song->cpos(); + + // Changed p3.3.43 Let Song::addMarker emit markerChanged(MARKER_ADD) + // and handle it in MarkerView::markerChanged(int) + //Marker* m = song->addMarker(QString(""), i, false); + //MarkerItem* newItem = new MarkerItem(table, m); + //table->setSelected(newItem, true); + // + song->addMarker(QString(""), i, false); + } + +//--------------------------------------------------------- +// deleteMarker +//--------------------------------------------------------- + +void MarkerView::deleteMarker() + { + MarkerItem* item = (MarkerItem*)table->selectedItem(); + if (item) { + song->removeMarker(item->marker()); + + // Removed p3.3.43 Let Song::removeMarker emit markerChanged(MARKER_REMOVE) + // and handle it in MarkerView::markerChanged(int) + //delete item; + } + } + +//--------------------------------------------------------- +// songChanged +//--------------------------------------------------------- + +void MarkerView::songChanged(int flags) +{ + // Is it simply a midi controller value adjustment? Forget it. + if(flags == SC_MIDI_CONTROLLER) + return; + + updateList(); +} + +//--------------------------------------------------------- +// updateList +//--------------------------------------------------------- + +void MarkerView::updateList() +{ + // Added p3.3.43 Manage selected item, due to clearing of table... + MarkerList* marker = song->marker(); + MarkerItem* selitem = (MarkerItem*)table->selectedItem(); + Marker* selm = selitem ? selitem->marker() : 0; + // p3.3.44 Look for removed markers before added markers... + if(selitem) + { + MarkerItem* mitem = (MarkerItem*)table->firstChild(); + while(mitem) + { + bool found = false; + for(iMarker i = marker->begin(); i != marker->end(); ++i) + { + Marker* m = &i->second; + if(m == mitem->marker()) + { + found = true; + break; + } + } + // Anything removed from the marker list? + if(!found) + { + // If it is the current selected item, it no longer exists. Make the next item be selected. + if(mitem == selitem) + { + MarkerItem* mi = (MarkerItem*)selitem->nextSibling(); + if(mi) + { + selitem = mi; + selm = selitem->marker(); + } + } + } + mitem = (MarkerItem*)mitem->nextSibling(); + } + } + // Look for added markers... + for(iMarker i = marker->begin(); i != marker->end(); ++i) + { + Marker* m = &i->second; + bool found = false; + MarkerItem* item = (MarkerItem*)table->firstChild(); + while(item) + { + if(item->marker() == m) + { + found = true; + break; + } + item = (MarkerItem*)item->nextSibling(); + } + // Anything new found in the marker list? + if(!found) + selm = m; + } + + table->clear(); + //MarkerList* marker = song->marker(); + for (iMarker i = marker->begin(); i != marker->end(); ++i) + { + Marker* m = &i->second; + + // Changed p3.3.43 + //QString tick; + //tick.setNum(i->first); + //new MarkerItem(table, m); + MarkerItem* item = new MarkerItem(table, m); + if(m == selm) + { + m->setCurrent(true); + table->setSelected(item, true); + } + else + { + m->setCurrent(false); + } + } +} + +//--------------------------------------------------------- +// markerSelected +//--------------------------------------------------------- + +void MarkerView::markerSelectionChanged() + { + MarkerItem* item = (MarkerItem*)table->selectedItem(); + if (item == 0) { // never triggered + editTick->setValue(0); + editSMPTE->setValue(0); + editName->setText(QString("")); + lock->setOn(false); + editSMPTE->setEnabled(false); + editTick->setEnabled(false); + lock->setEnabled(false); + editName->setEnabled(false); + } + else { + editTick->setValue(item->tick()); + editSMPTE->setValue(item->tick()); + editName->setText(item->name()); + editName->setEnabled(true); + lock->setOn(item->lock()); + lock->setEnabled(true); + + //printf("MarkerView::markerSelectionChanged item->lock:%d\n", item->lock()); + + editSMPTE->setEnabled(item->lock()); + editTick->setEnabled(!item->lock()); + } + } + +void MarkerView::clicked(Q3ListViewItem* i) + { + MarkerItem* item = (MarkerItem*)i; + if (item == 0) { + table->clearSelection(); + return; + } + Pos p(item->tick(), true); + song->setPos(0, p, true, true, false); + } + +//--------------------------------------------------------- +// nameChanged +//--------------------------------------------------------- + +void MarkerView::nameChanged(const QString& s) + { + MarkerItem* item = (MarkerItem*)table->selectedItem(); + if (item) + item->setName(s); + } + +//--------------------------------------------------------- +// tickChanged +//--------------------------------------------------------- + +void MarkerView::tickChanged(const Pos& pos) + { + MarkerItem* item = (MarkerItem*)table->selectedItem(); + if (item) { + item->setTick(pos.tick()); + Pos p(pos.tick(), true); + song->setPos(0, p, true, true, false); + table->sort(); + } + } + +//--------------------------------------------------------- +// lockChanged +//--------------------------------------------------------- + +void MarkerView::lockChanged(bool lck) + { + MarkerItem* item = (MarkerItem*)table->selectedItem(); + if (item) { + item->setLock(lck); + editSMPTE->setEnabled(item->lock()); + editTick->setEnabled(!item->lock()); + } + } + +//--------------------------------------------------------- +// posChanged +// select appropriate Marker +//--------------------------------------------------------- + +void MarkerView::markerChanged(int val) +{ + //if (val != Song::MARKER_CUR) + // return; + // p3.3.43 + switch(val) + { + // MARKER_CUR, MARKER_ADD, MARKER_REMOVE, MARKER_NAME, + // MARKER_TICK, MARKER_LOCK + case Song::MARKER_ADD: + case Song::MARKER_REMOVE: + updateList(); + break; // Try falling through and let it try to select something. No, let updateList() do it... + + case Song::MARKER_CUR: + { + + MarkerList* marker = song->marker(); + for (iMarker i = marker->begin(); i != marker->end(); ++i) { + if (i->second.current()) { + MarkerItem* item = (MarkerItem*)table->firstChild(); + while (item) { + if (item->marker() == &i->second) { + table->setSelected(item, true); + return; + } + item = (MarkerItem*)item->nextSibling(); + } + } + } + } + break; + + default: + break; + } +} + +void MarkerView::nextMarker() + { + unsigned int curPos = song->cpos();//prevent compiler warning: comparison of sigend/unsigned + unsigned int nextPos = 0xFFFFFFFF; + MarkerList* marker = song->marker(); + for (iMarker i = marker->begin(); i != marker->end(); ++i) { + if (i->second.tick() > curPos && i->second.tick() < nextPos) + nextPos = i->second.tick(); + } + if (nextPos == 0xFFFFFFFF) + return; + Pos p(nextPos, true); + song->setPos(0, p, true, true, false); + + } +void MarkerView::prevMarker() + { + unsigned int curPos = song->cpos();//prevent compiler warning: comparison of sigend/unsigned + unsigned int nextPos = 0; + MarkerList* marker = song->marker(); + for (iMarker i = marker->begin(); i != marker->end(); ++i) { + if (i->second.tick() < curPos && i->second.tick() > nextPos) + nextPos = i->second.tick(); + } +/* if (nextPos == 0) + return;*/ + Pos p(nextPos, true); + song->setPos(0, p, true, true, false); + } |