diff options
Diffstat (limited to 'muse2/muse/arranger/arranger.cpp')
-rw-r--r-- | muse2/muse/arranger/arranger.cpp | 213 |
1 files changed, 178 insertions, 35 deletions
diff --git a/muse2/muse/arranger/arranger.cpp b/muse2/muse/arranger/arranger.cpp index af5c9785..d572aadd 100644 --- a/muse2/muse/arranger/arranger.cpp +++ b/muse2/muse/arranger/arranger.cpp @@ -72,6 +72,81 @@ namespace MusEGui { +std::vector<Arranger::custom_col_t> Arranger::custom_columns; +QString Arranger::header_state; + +void Arranger::writeCustomColumns(int level, MusECore::Xml& xml) +{ + xml.tag(level++, "custom_columns"); + + for (unsigned i=0;i<custom_columns.size();i++) + { + xml.tag(level++, "column"); + xml.strTag(level, "name", custom_columns[i].name); + xml.intTag(level, "ctrl", custom_columns[i].ctrl); + xml.etag(--level, "column"); + } + + xml.etag(--level, "custom_columns"); +} + +void Arranger::readCustomColumns(MusECore::Xml& xml) +{ + custom_columns.clear(); + + for (;;) { + MusECore::Xml::Token token(xml.parse()); + const QString& tag(xml.s1()); + switch (token) { + case MusECore::Xml::Error: + case MusECore::Xml::End: + return; + case MusECore::Xml::TagStart: + if (tag == "column") + custom_columns.push_back(readOneCustomColumn(xml)); + else + xml.unknown("Arranger::readCustomColumns"); + break; + case MusECore::Xml::TagEnd: + if (tag == "custom_columns") + return; + default: + break; + } + } +} + +Arranger::custom_col_t Arranger::readOneCustomColumn(MusECore::Xml& xml) +{ + custom_col_t temp(0, "-"); + + for (;;) { + MusECore::Xml::Token token(xml.parse()); + const QString& tag(xml.s1()); + switch (token) { + case MusECore::Xml::Error: + case MusECore::Xml::End: + return temp; + case MusECore::Xml::TagStart: + if (tag == "name") + temp.name=xml.parse1(); + else if (tag == "ctrl") + temp.ctrl=xml.parseInt(); + else + xml.unknown("Arranger::readOneCustomColumn"); + break; + case MusECore::Xml::TagEnd: + if (tag == "column") + return temp; + default: + break; + } + } + return temp; +} + + + //--------------------------------------------------------- // Arranger::setHeaderToolTips //--------------------------------------------------------- @@ -258,7 +333,7 @@ Arranger::Arranger(ArrangerView* parent, const char* name) box->addWidget(split, 1000); //split->setHandleWidth(10); - QWidget* tracklist = new QWidget(split); + tracklist = new QWidget(split); split->setStretchFactor(split->indexOf(tracklist), 0); //tracklist->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding, 0, 100)); @@ -294,38 +369,11 @@ Arranger::Arranger(ArrangerView* parent, const char* name) ib->setChecked(showTrackinfoFlag); ib->setFocusPolicy(Qt::NoFocus); connect(ib, SIGNAL(toggled(bool)), SLOT(showTrackInfo(bool))); - - header = new Header(tracklist, "header"); - header->setFixedHeight(30); - - QFontMetrics fm1(header->font()); - int fw = 8; - - header->setColumnLabel(tr("R"), COL_RECORD, fm1.width('R')+fw); - header->setColumnLabel(tr("M"), COL_MUTE, fm1.width('M')+fw); - header->setColumnLabel(tr("S"), COL_SOLO, fm1.width('S')+fw); - header->setColumnLabel(tr("C"), COL_CLASS, fm1.width('C')+fw); - header->setColumnLabel(tr("Track"), COL_NAME, 100); - header->setColumnLabel(tr("Port"), COL_OPORT, 60); - header->setColumnLabel(tr("Ch"), COL_OCHANNEL, 30); - header->setColumnLabel(tr("T"), COL_TIMELOCK, fm1.width('T')+fw); - header->setColumnLabel(tr("Automation"), COL_AUTOMATION, 75); - header->setColumnLabel(tr("Clef"), COL_CLEF, 75); - header->setResizeMode(COL_RECORD, QHeaderView::Fixed); - header->setResizeMode(COL_MUTE, QHeaderView::Fixed); - header->setResizeMode(COL_SOLO, QHeaderView::Fixed); - header->setResizeMode(COL_CLASS, QHeaderView::Fixed); - header->setResizeMode(COL_NAME, QHeaderView::Interactive); - header->setResizeMode(COL_OPORT, QHeaderView::Interactive); - header->setResizeMode(COL_OCHANNEL, QHeaderView::Fixed); - header->setResizeMode(COL_TIMELOCK, QHeaderView::Fixed); - header->setResizeMode(COL_AUTOMATION, QHeaderView::Interactive); - header->setResizeMode(COL_CLEF, QHeaderView::Interactive); - - setHeaderToolTips(); - setHeaderWhatsThis(); - header->setMovable (true ); + list=NULL; + header=NULL; + tgrid=NULL; + updateTListHeader(); list = new TList(header, tracklist, "tracklist"); // Do this now that the list is available. @@ -467,6 +515,66 @@ Arranger::Arranger(ArrangerView* parent, const char* name) //setTabOrder(ib, hscroll); } + +void Arranger::updateTListHeader() +{ + if (header) + { + header_state=header->getStatus(); + delete header; + } + + header = new Header(tracklist, "header"); + + header->setFixedHeight(30); + + QFontMetrics fm1(header->font()); + int fw = 8; + + header->setColumnLabel(tr("R"), COL_RECORD, fm1.width('R')+fw); + header->setColumnLabel(tr("M"), COL_MUTE, fm1.width('M')+fw); + header->setColumnLabel(tr("S"), COL_SOLO, fm1.width('S')+fw); + header->setColumnLabel(tr("C"), COL_CLASS, fm1.width('C')+fw); + header->setColumnLabel(tr("Track"), COL_NAME, 100); + header->setColumnLabel(tr("Port"), COL_OPORT, 60); + header->setColumnLabel(tr("Ch"), COL_OCHANNEL, 30); + header->setColumnLabel(tr("T"), COL_TIMELOCK, fm1.width('T')+fw); + header->setColumnLabel(tr("Automation"), COL_AUTOMATION, 75); + header->setColumnLabel(tr("Clef"), COL_CLEF, 75); + for (unsigned i=0;i<custom_columns.size();i++) + header->setColumnLabel(custom_columns[i].name, COL_CUSTOM_MIDICTRL_OFFSET+i, MAX(fm1.width(custom_columns[i].name)+fw, 30)); + header->setResizeMode(COL_RECORD, QHeaderView::Fixed); + header->setResizeMode(COL_MUTE, QHeaderView::Fixed); + header->setResizeMode(COL_SOLO, QHeaderView::Fixed); + header->setResizeMode(COL_CLASS, QHeaderView::Fixed); + header->setResizeMode(COL_NAME, QHeaderView::Interactive); + header->setResizeMode(COL_OPORT, QHeaderView::Interactive); + header->setResizeMode(COL_OCHANNEL, QHeaderView::Fixed); + header->setResizeMode(COL_TIMELOCK, QHeaderView::Fixed); + header->setResizeMode(COL_AUTOMATION, QHeaderView::Interactive); + header->setResizeMode(COL_CLEF, QHeaderView::Interactive); + for (unsigned i=0;i<custom_columns.size();i++) + header->setResizeMode(COL_CUSTOM_MIDICTRL_OFFSET+i, QHeaderView::Fixed); + + setHeaderToolTips(); + setHeaderWhatsThis(); + header->setMovable (true); + header->setStatus(header_state); + + if (list) + { + list->setHeader(header); + connect(header, SIGNAL(sectionResized(int,int,int)), list, SLOT(redraw())); + connect(header, SIGNAL(sectionMoved(int,int,int)), list, SLOT(redraw())); + connect(header, SIGNAL(sectionMoved(int,int,int)), this, SLOT(headerMoved())); + } + + if (tgrid) + { + tgrid->wadd(2, header); + } +} + //--------------------------------------------------------- // updateHScrollRange //--------------------------------------------------------- @@ -693,7 +801,6 @@ void Arranger::writeStatus(int level, MusECore::Xml& xml) xml.tag(level++, "arranger"); xml.intTag(level, "info", ib->isChecked()); split->writeStatus(level, xml); - list->writeStatus(level, xml, "list"); xml.intTag(level, "xpos", hscroll->pos()); xml.intTag(level, "xmag", hscroll->mag()); @@ -701,6 +808,44 @@ void Arranger::writeStatus(int level, MusECore::Xml& xml) xml.etag(level, "arranger"); } +void Arranger::writeConfiguration(int level, MusECore::Xml& xml) + { + xml.tag(level++, "arranger"); + writeCustomColumns(level, xml); + xml.strTag(level, "tlist_header", header->getStatus()); + xml.etag(level, "arranger"); + } + +//--------------------------------------------------------- +// readConfiguration +//--------------------------------------------------------- + +void Arranger::readConfiguration(MusECore::Xml& xml) + { + for (;;) { + MusECore::Xml::Token token(xml.parse()); + const QString& tag(xml.s1()); + switch (token) { + case MusECore::Xml::Error: + case MusECore::Xml::End: + return; + case MusECore::Xml::TagStart: + if (tag == "tlist_header") + header_state = xml.parse1(); + else if (tag == "custom_columns") + readCustomColumns(xml); + else + xml.unknown("Arranger"); + break; + case MusECore::Xml::TagEnd: + if (tag == "arranger") + return; + default: + break; + } + } + } + //--------------------------------------------------------- // readStatus //--------------------------------------------------------- @@ -719,8 +864,6 @@ void Arranger::readStatus(MusECore::Xml& xml) showTrackinfoFlag = xml.parseInt(); else if (tag == split->objectName()) split->readStatus(xml); - else if (tag == "list") - list->readStatus(xml, "list"); else if (tag == "xmag") hscroll->setMag(xml.parseInt()); else if (tag == "xpos") { |