summaryrefslogtreecommitdiff
path: root/muse2/muse/arranger/arranger.cpp
diff options
context:
space:
mode:
authorFlorian Jung <flo@windfisch.org>2012-02-14 17:26:03 +0000
committerFlorian Jung <flo@windfisch.org>2012-02-14 17:26:03 +0000
commit3ffd0dacdd7447c6c377f95c1fa7fc45a2612d98 (patch)
treec8fa5ba7569d3001f3304f16f2f4a5c2546db8df /muse2/muse/arranger/arranger.cpp
parentbca65ae96031f8d6828cb0038ee768ae11c7cff8 (diff)
- added support for custom controller columns in the tracklist
they are stored in and read from the global config file. - tracklist header is now saved into global config, not in songfile. TODO: - allow the user to customize the custom columns - make recreating the Header work (graphical glitches currently)
Diffstat (limited to 'muse2/muse/arranger/arranger.cpp')
-rw-r--r--muse2/muse/arranger/arranger.cpp213
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") {