summaryrefslogtreecommitdiff
path: root/muse2
diff options
context:
space:
mode:
Diffstat (limited to 'muse2')
-rw-r--r--muse2/ChangeLog10
-rw-r--r--muse2/muse/cobject.cpp748
-rw-r--r--muse2/muse/cobject.h2
-rw-r--r--muse2/muse/midiedit/scoreedit.cpp2
-rw-r--r--muse2/muse/mixer/rack.cpp7
-rw-r--r--muse2/muse/mixer/rack.h5
-rw-r--r--muse2/muse/plugin.cpp25
-rw-r--r--muse2/muse/widgets/meter.cpp170
-rw-r--r--muse2/muse/widgets/meter.h1
-rw-r--r--muse2/muse/widgets/slider.cpp147
-rw-r--r--muse2/muse/widgets/slider.h11
-rw-r--r--muse2/muse/widgets/utils.cpp52
-rw-r--r--muse2/muse/widgets/utils.h6
-rw-r--r--muse2/muse/widgets/verticalmeter.cpp147
14 files changed, 747 insertions, 586 deletions
diff --git a/muse2/ChangeLog b/muse2/ChangeLog
index ee6c171a..5167c23f 100644
--- a/muse2/ChangeLog
+++ b/muse2/ChangeLog
@@ -10,6 +10,16 @@
Added an emit selectionChanged(0) in TList::mousePressEvent.
- Observed: Ancient bug: Track Info doesn't change if selecting multiple tracks in reverse order.
Will need to be fixed if/when adding 'multiple track global editing'.
+ - Made Slider::sizeHint() a const function again, so that the plugin window respects its sizeHint. (Orcan)
+ - Explicitly disabled the scale support in Slider since it wasn't really in use for a while. (Orcan)
+11.09.2011:
+ - Rewrote the rounding function for efficientcy. Moved the function into utils.cpp since it is written
+ for general purpose. (Orcan)
+ - The rounding in the meter is done in paintEvent now. I also enabled Antialiasing to make the corners
+ look nicer. Therefore I had to comment out Qt::WA_OpaquePaintEvent attributes in the meter and the
+ verticalmeter for now. Some testing needed. (Orcan)
+ - Plugin slider color codes are now generated from plugin ID numbers. (Orcan)
+ - Active plugins are colored in green in the rack. (Orcan)
09.09.2011:
- Removed sending of SEQM_ADD_TRACK, SEQM_REMOVE_TRACK, SEQM_CHANGE_TRACK, SEQM_REMOVE_PART, and
SEQM_CHANGE_PART to ALSA midi thread (which waits) from inside Audio::processMsg.
diff --git a/muse2/muse/cobject.cpp b/muse2/muse/cobject.cpp
index eff6d9af..42c3cad2 100644
--- a/muse2/muse/cobject.cpp
+++ b/muse2/muse/cobject.cpp
@@ -1,23 +1,23 @@
//=========================================================
-// MusE
-// Linux Music Editor
-// $Id: cobject.cpp,v 1.4 2004/02/02 12:10:09 wschweer Exp $
+// MusE
+// Linux Music Editor
+// $Id: cobject.cpp,v 1.4 2004/02/02 12:10:09 wschweer Exp $
//
-// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de)
+// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de)
//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; version 2 of
-// the License, or (at your option) any later version.
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; version 2 of
+// the License, or (at your option) any later version.
//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
//=========================================================
@@ -46,221 +46,232 @@ bool TopWin::_defaultSubwin[TOPLEVELTYPE_LAST_ENTRY];
bool TopWin::initInited=false;
TopWin::TopWin(ToplevelType t, QWidget* parent, const char* name, Qt::WindowFlags f)
- : QMainWindow(parent, f)
- {
- if (initInited==false)
- initConfiguration();
-
- _type=t;
-
- setObjectName(QString(name));
- // Allow multiple rows. Tim.
- //setDockNestingEnabled(true);
- setIconSize(ICON_SIZE);
-
- subwinAction=new QAction(tr("As subwindow"), this);
- subwinAction->setCheckable(true);
- connect(subwinAction, SIGNAL(toggled(bool)), SLOT(setIsMdiWin(bool)));
-
- shareAction=new QAction(tr("Shares tools and menu"), this);
- shareAction->setCheckable(true);
- connect(shareAction, SIGNAL(toggled(bool)), SLOT(shareToolsAndMenu(bool)));
-
- fullscreenAction=new QAction(tr("Fullscreen"), this);
- fullscreenAction->setCheckable(true);
- fullscreenAction->setChecked(false);
- fullscreenAction->setShortcut(shortcuts[SHRT_FULLSCREEN].key);
- connect(fullscreenAction, SIGNAL(toggled(bool)), SLOT(setFullscreen(bool)));
-
- mdisubwin=NULL;
- _sharesToolsAndMenu=_defaultSubwin[_type] ? _sharesWhenSubwin[_type] : _sharesWhenFree[_type];
- if (_defaultSubwin[_type])
- setIsMdiWin(true);
-
- if (_sharesToolsAndMenu)
- menuBar()->hide();
-
- subwinAction->setChecked(isMdiWin());
- shareAction->setChecked(_sharesToolsAndMenu);
- fullscreenAction->setEnabled(!isMdiWin());
-
- resize(_widthInit[_type], _heightInit[_type]);
- }
+ : QMainWindow(parent, f)
+{
+ if (initInited==false)
+ initConfiguration();
+
+ _type=t;
+
+ setObjectName(QString(name));
+ // Allow multiple rows. Tim.
+ //setDockNestingEnabled(true);
+ setIconSize(ICON_SIZE);
+
+ subwinAction=new QAction(tr("As subwindow"), this);
+ subwinAction->setCheckable(true);
+ connect(subwinAction, SIGNAL(toggled(bool)), SLOT(setIsMdiWin(bool)));
+
+ shareAction=new QAction(tr("Shares tools and menu"), this);
+ shareAction->setCheckable(true);
+ connect(shareAction, SIGNAL(toggled(bool)), SLOT(shareToolsAndMenu(bool)));
+
+ fullscreenAction=new QAction(tr("Fullscreen"), this);
+ fullscreenAction->setCheckable(true);
+ fullscreenAction->setChecked(false);
+ fullscreenAction->setShortcut(shortcuts[SHRT_FULLSCREEN].key);
+ connect(fullscreenAction, SIGNAL(toggled(bool)), SLOT(setFullscreen(bool)));
+
+ mdisubwin=NULL;
+ _sharesToolsAndMenu=_defaultSubwin[_type] ? _sharesWhenSubwin[_type] : _sharesWhenFree[_type];
+ if (_defaultSubwin[_type])
+ setIsMdiWin(true);
+
+ if (_sharesToolsAndMenu)
+ menuBar()->hide();
+
+ subwinAction->setChecked(isMdiWin());
+ shareAction->setChecked(_sharesToolsAndMenu);
+ fullscreenAction->setEnabled(!isMdiWin());
+
+ resize(_widthInit[_type], _heightInit[_type]);
+}
//---------------------------------------------------------
-// readStatus
+// readStatus
//---------------------------------------------------------
void TopWin::readStatus(Xml& xml)
- {
- for (;;) {
- Xml::Token token = xml.parse();
- if (token == Xml::Error || token == Xml::End)
- break;
- QString tag = xml.s1();
- switch (token) {
- case Xml::TagStart:
- if (tag == "geometry_state") {
- if (!restoreGeometry(QByteArray::fromHex(xml.parse1().toAscii())))
- fprintf(stderr,"ERROR: couldn't restore geometry. however, this is probably not really a problem.\n");
- }
- else if (tag == "toolbars") {
- if (!sharesToolsAndMenu()) {
- if (!restoreState(QByteArray::fromHex(xml.parse1().toAscii())))
- fprintf(stderr,"ERROR: couldn't restore toolbars. however, this is not really a problem.\n");
- }
- else {
- _savedToolbarState=QByteArray::fromHex(xml.parse1().toAscii());
- if (_savedToolbarState.isEmpty())
- _savedToolbarState=_toolbarNonsharedInit[_type];
- }
- }
- else if (tag == "shares_menu") {
- shareToolsAndMenu(xml.parseInt());
- }
- else if (tag == "is_subwin") {
- setIsMdiWin(xml.parseInt());
- }
- else
- xml.unknown("TopWin");
- break;
- case Xml::TagEnd:
- if (tag == "topwin")
- return;
- default:
- break;
- }
- }
- }
+{
+ for (;;)
+ {
+ Xml::Token token = xml.parse();
+ if (token == Xml::Error || token == Xml::End)
+ break;
+
+ QString tag = xml.s1();
+ switch (token)
+ {
+ case Xml::TagStart:
+ if (tag == "geometry_state")
+ {
+ if (!restoreGeometry(QByteArray::fromHex(xml.parse1().toAscii())))
+ fprintf(stderr,"ERROR: couldn't restore geometry. however, this is probably not really a problem.\n");
+ }
+ else if (tag == "toolbars")
+ {
+ if (!sharesToolsAndMenu())
+ {
+ if (!restoreState(QByteArray::fromHex(xml.parse1().toAscii())))
+ fprintf(stderr,"ERROR: couldn't restore toolbars. however, this is not really a problem.\n");
+ }
+ else
+ {
+ _savedToolbarState=QByteArray::fromHex(xml.parse1().toAscii());
+ if (_savedToolbarState.isEmpty())
+ _savedToolbarState=_toolbarNonsharedInit[_type];
+ }
+ }
+ else if (tag == "shares_menu")
+ {
+ shareToolsAndMenu(xml.parseInt());
+ }
+ else if (tag == "is_subwin")
+ {
+ setIsMdiWin(xml.parseInt());
+ }
+ else
+ xml.unknown("TopWin");
+ break;
+
+ case Xml::TagEnd:
+ if (tag == "topwin")
+ return;
+
+ default:
+ break;
+ }
+ }
+}
//---------------------------------------------------------
-// writeStatus
+// writeStatus
//---------------------------------------------------------
void TopWin::writeStatus(int level, Xml& xml) const
- {
- xml.tag(level++, "topwin");
-
- // the order of these tags has a certain sense
- // changing it won't break muse, but it may break proper
- // restoring of the positions
- xml.intTag(level, "is_subwin", isMdiWin());
- xml.strTag(level, "geometry_state", saveGeometry().toHex().data());
- xml.intTag(level, "shares_menu", sharesToolsAndMenu());
-
- if (!sharesToolsAndMenu())
- xml.strTag(level, "toolbars", saveState().toHex().data());
- else
- xml.strTag(level, "toolbars", _savedToolbarState.toHex().data());
-
- xml.tag(level, "/topwin");
- }
+{
+ xml.tag(level++, "topwin");
+
+ // the order of these tags has a certain sense
+ // changing it won't break muse, but it may break proper
+ // restoring of the positions
+ xml.intTag(level, "is_subwin", isMdiWin());
+ xml.strTag(level, "geometry_state", saveGeometry().toHex().data());
+ xml.intTag(level, "shares_menu", sharesToolsAndMenu());
+
+ if (!sharesToolsAndMenu())
+ xml.strTag(level, "toolbars", saveState().toHex().data());
+ else
+ xml.strTag(level, "toolbars", _savedToolbarState.toHex().data());
+
+ xml.tag(level, "/topwin");
+}
void TopWin::hide()
{
- if (mdisubwin)
- mdisubwin->close();
-
- QMainWindow::hide();
+ if (mdisubwin)
+ mdisubwin->close();
+
+ QMainWindow::hide();
}
void TopWin::show()
{
- if (mdisubwin)
- mdisubwin->show();
-
- QMainWindow::show();
+ if (mdisubwin)
+ mdisubwin->show();
+
+ QMainWindow::show();
}
void TopWin::setVisible(bool param)
{
- if (mdisubwin)
- {
- if (param)
- mdisubwin->show();
- else
- mdisubwin->close();
- }
- QMainWindow::setVisible(param);
+ if (mdisubwin)
+ {
+ if (param)
+ mdisubwin->show();
+ else
+ mdisubwin->close();
+ }
+ QMainWindow::setVisible(param);
}
QMdiSubWindow* TopWin::createMdiWrapper()
{
- if (mdisubwin==NULL)
- {
- mdisubwin = new QMdiSubWindow();
- mdisubwin->setWidget(this);
- }
-
- return mdisubwin;
+ if (mdisubwin==NULL)
+ {
+ mdisubwin = new QMdiSubWindow();
+ mdisubwin->setWidget(this);
+ }
+
+ return mdisubwin;
}
void TopWin::setIsMdiWin(bool val)
{
- if (val)
- {
- if (!isMdiWin())
- {
- _savedToolbarState = saveState();
- int width_temp=width();
- int height_temp=height();
- bool vis=isVisible();
-
- QMdiSubWindow* subwin = createMdiWrapper();
- muse->addMdiSubWindow(subwin);
- subwin->resize(width_temp, height_temp);
- subwin->move(0,0);
- subwin->setVisible(vis);
- this->QMainWindow::show(); //bypass the delegation to the subwin
-
- if (_sharesToolsAndMenu == _sharesWhenFree[_type])
- shareToolsAndMenu(_sharesWhenSubwin[_type]);
-
- fullscreenAction->setEnabled(false);
- fullscreenAction->setChecked(false);
- subwinAction->setChecked(true);
- muse->updateWindowMenu();
- }
- else
- {
- if (MusEGlobal::debugMsg) printf("TopWin::setIsMdiWin(true) called, but window is already a MDI win\n");
- }
- }
- else
- {
- if (isMdiWin())
- {
- int width_temp=width();
- int height_temp=height();
- bool vis=isVisible();
-
- QMdiSubWindow* mdisubwin_temp=mdisubwin;
- mdisubwin=NULL;
- setParent(NULL);
- mdisubwin_temp->hide();
- delete mdisubwin_temp;
-
- resize(width_temp, height_temp);
- setVisible(vis);
-
- if (_sharesToolsAndMenu == _sharesWhenSubwin[_type])
- shareToolsAndMenu(_sharesWhenFree[_type]);
-
- fullscreenAction->setEnabled(true);
- subwinAction->setChecked(false);
- muse->updateWindowMenu();
- }
- else
- {
- if (MusEGlobal::debugMsg) printf("TopWin::setIsMdiWin(false) called, but window is not a MDI win\n");
- }
- }
+ if (val)
+ {
+ if (!isMdiWin())
+ {
+ _savedToolbarState = saveState();
+ int width_temp=width();
+ int height_temp=height();
+ bool vis=isVisible();
+
+ QMdiSubWindow* subwin = createMdiWrapper();
+ muse->addMdiSubWindow(subwin);
+ subwin->resize(width_temp, height_temp);
+ subwin->move(0,0);
+ subwin->setVisible(vis);
+ this->QMainWindow::show(); //bypass the delegation to the subwin
+
+ if (_sharesToolsAndMenu == _sharesWhenFree[_type])
+ shareToolsAndMenu(_sharesWhenSubwin[_type]);
+
+ fullscreenAction->setEnabled(false);
+ fullscreenAction->setChecked(false);
+ subwinAction->setChecked(true);
+ muse->updateWindowMenu();
+ }
+ else
+ {
+ if (MusEGlobal::debugMsg) printf("TopWin::setIsMdiWin(true) called, but window is already a MDI win\n");
+ }
+ }
+ else
+ {
+ if (isMdiWin())
+ {
+ int width_temp=width();
+ int height_temp=height();
+ bool vis=isVisible();
+
+ QMdiSubWindow* mdisubwin_temp=mdisubwin;
+ mdisubwin=NULL;
+ setParent(NULL);
+ mdisubwin_temp->hide();
+ delete mdisubwin_temp;
+
+ resize(width_temp, height_temp);
+ setVisible(vis);
+
+ if (_sharesToolsAndMenu == _sharesWhenSubwin[_type])
+ shareToolsAndMenu(_sharesWhenFree[_type]);
+
+ fullscreenAction->setEnabled(true);
+ subwinAction->setChecked(false);
+ muse->updateWindowMenu();
+ }
+ else
+ {
+ if (MusEGlobal::debugMsg) printf("TopWin::setIsMdiWin(false) called, but window is not a MDI win\n");
+ }
+ }
}
bool TopWin::isMdiWin() const
{
- return (mdisubwin!=NULL);
+ return (mdisubwin!=NULL);
}
void TopWin::insertToolBar(QToolBar*, QToolBar*) { printf("ERROR: THIS SHOULD NEVER HAPPEN: TopWin::insertToolBar called, but it's not implemented! ignoring it\n"); }
@@ -271,232 +282,237 @@ void TopWin::addToolBar(Qt::ToolBarArea, QToolBar* tb) { printf("ERROR: THIS SHO
void TopWin::addToolBar(QToolBar* toolbar)
{
- _toolbars.push_back(toolbar);
-
- if (!_sharesToolsAndMenu)
- QMainWindow::addToolBar(toolbar);
- else
- toolbar->hide();
-
- toolbar->setIconSize(ICON_SIZE);
+ _toolbars.push_back(toolbar);
+
+ if (!_sharesToolsAndMenu)
+ QMainWindow::addToolBar(toolbar);
+ else
+ toolbar->hide();
+
+ toolbar->setIconSize(ICON_SIZE);
}
QToolBar* TopWin::addToolBar(const QString& title)
{
- QToolBar* toolbar = new QToolBar(title, this);
- addToolBar(toolbar);
- return toolbar;
+ QToolBar* toolbar = new QToolBar(title, this);
+ addToolBar(toolbar);
+ return toolbar;
}
void TopWin::shareToolsAndMenu(bool val)
{
- if (_sharesToolsAndMenu == val)
- {
- if (MusEGlobal::debugMsg) printf("TopWin::shareToolsAndMenu() called but has no effect\n");
- return;
- }
-
-
- _sharesToolsAndMenu = val;
-
- if (!val)
- {
- muse->shareMenuAndToolbarChanged(this, false);
-
- for (list<QToolBar*>::iterator it=_toolbars.begin(); it!=_toolbars.end(); it++)
- if (*it != NULL)
- {
- QMainWindow::addToolBar(*it);
- (*it)->show();
- }
- else
- QMainWindow::addToolBarBreak();
-
- restoreState(_savedToolbarState);
- _savedToolbarState.clear();
-
- menuBar()->show();
- }
- else
- {
- if (_savedToolbarState.isEmpty()) // this check avoids overwriting a previously saved state
- _savedToolbarState = saveState(); // (by setIsMdiWin) with a now incorrect (empty) state
-
- for (list<QToolBar*>::iterator it=_toolbars.begin(); it!=_toolbars.end(); it++)
- if (*it != NULL)
- {
- QMainWindow::removeToolBar(*it); // this does NOT delete the toolbar, which is good
- (*it)->setParent(NULL);
- }
-
- menuBar()->hide();
-
- muse->shareMenuAndToolbarChanged(this, true);
- }
-
- shareAction->setChecked(val);
+ if (_sharesToolsAndMenu == val)
+ {
+ if (MusEGlobal::debugMsg) printf("TopWin::shareToolsAndMenu() called but has no effect\n");
+ return;
+ }
+
+
+ _sharesToolsAndMenu = val;
+
+ if (!val)
+ {
+ muse->shareMenuAndToolbarChanged(this, false);
+
+ for (list<QToolBar*>::iterator it=_toolbars.begin(); it!=_toolbars.end(); it++)
+ if (*it != NULL)
+ {
+ QMainWindow::addToolBar(*it);
+ (*it)->show();
+ }
+ else
+ QMainWindow::addToolBarBreak();
+
+ restoreState(_savedToolbarState);
+ _savedToolbarState.clear();
+
+ menuBar()->show();
+ }
+ else
+ {
+ if (_savedToolbarState.isEmpty()) // this check avoids overwriting a previously saved state
+ _savedToolbarState = saveState(); // (by setIsMdiWin) with a now incorrect (empty) state
+
+ for (list<QToolBar*>::iterator it=_toolbars.begin(); it!=_toolbars.end(); it++)
+ if (*it != NULL)
+ {
+ QMainWindow::removeToolBar(*it); // this does NOT delete the toolbar, which is good
+ (*it)->setParent(NULL);
+ }
+
+ menuBar()->hide();
+
+ muse->shareMenuAndToolbarChanged(this, true);
+ }
+
+ shareAction->setChecked(val);
}
//---------------------------------------------------------
-// storeInitialState
+// storeInitialState
//---------------------------------------------------------
void TopWin::storeInitialState() const
- {
- _widthInit[_type] = width();
- _heightInit[_type] = height();
- if (sharesToolsAndMenu())
- {
- if (muse->getCurrentMenuSharingTopwin() == this)
- _toolbarSharedInit[_type] = muse->saveState();
- }
- else
- _toolbarNonsharedInit[_type] = saveState();
- }
+{
+ _widthInit[_type] = width();
+ _heightInit[_type] = height();
+ if (sharesToolsAndMenu())
+ {
+ if (muse->getCurrentMenuSharingTopwin() == this)
+ _toolbarSharedInit[_type] = muse->saveState();
+ }
+ else
+ _toolbarNonsharedInit[_type] = saveState();
+}
//initConfiguration() restores default "traditional muse" configuration
void TopWin::initConfiguration()
{
- if (initInited==false)
- {
- for (int i=0;i<TOPLEVELTYPE_LAST_ENTRY;i++)
- {
- _widthInit[i]=800;
- _heightInit[i]=600;
- _sharesWhenFree[i]=false;
- _sharesWhenSubwin[i]=true;
- _defaultSubwin[i]=false;
- }
-
- _defaultSubwin[ARRANGER]=true;
-
- initInited=true;
- }
+ if (initInited==false)
+ {
+ for (int i=0;i<TOPLEVELTYPE_LAST_ENTRY;i++)
+ {
+ _widthInit[i]=800;
+ _heightInit[i]=600;
+ _sharesWhenFree[i]=false;
+ _sharesWhenSubwin[i]=true;
+ _defaultSubwin[i]=false;
+ }
+
+ _defaultSubwin[ARRANGER]=true;
+
+ initInited=true;
+ }
}
//---------------------------------------------------------
-// readConfiguration
+// readConfiguration
//---------------------------------------------------------
void TopWin::readConfiguration(ToplevelType t, Xml& xml)
- {
- if (initInited==false)
- initConfiguration();
-
- for (;;) {
- Xml::Token token = xml.parse();
- if (token == Xml::Error || token == Xml::End)
- break;
- const QString& tag = xml.s1();
- switch (token) {
- case Xml::TagStart:
- if (tag == "width")
- _widthInit[t] = xml.parseInt();
- else if (tag == "height")
- _heightInit[t] = xml.parseInt();
- else if (tag == "nonshared_toolbars")
- _toolbarNonsharedInit[t] = QByteArray::fromHex(xml.parse1().toAscii());
- else if (tag == "shared_toolbars")
- _toolbarSharedInit[t] = QByteArray::fromHex(xml.parse1().toAscii());
- else if (tag == "shares_when_free")
- _sharesWhenFree[t] = xml.parseInt();
- else if (tag == "shares_when_subwin")
- _sharesWhenSubwin[t] = xml.parseInt();
- else if (tag == "default_subwin")
- _defaultSubwin[t] = xml.parseInt();
- else
- xml.unknown("TopWin");
- break;
- case Xml::TagEnd:
- if (tag == "topwin")
- return;
- default:
- break;
- }
- }
- }
+{
+if (initInited==false)
+ initConfiguration();
+
+ for (;;)
+ {
+ Xml::Token token = xml.parse();
+ if (token == Xml::Error || token == Xml::End)
+ break;
+
+ const QString& tag = xml.s1();
+ switch (token)
+ {
+ case Xml::TagStart:
+ if (tag == "width")
+ _widthInit[t] = xml.parseInt();
+ else if (tag == "height")
+ _heightInit[t] = xml.parseInt();
+ else if (tag == "nonshared_toolbars")
+ _toolbarNonsharedInit[t] = QByteArray::fromHex(xml.parse1().toAscii());
+ else if (tag == "shared_toolbars")
+ _toolbarSharedInit[t] = QByteArray::fromHex(xml.parse1().toAscii());
+ else if (tag == "shares_when_free")
+ _sharesWhenFree[t] = xml.parseInt();
+ else if (tag == "shares_when_subwin")
+ _sharesWhenSubwin[t] = xml.parseInt();
+ else if (tag == "default_subwin")
+ _defaultSubwin[t] = xml.parseInt();
+ else
+ xml.unknown("TopWin");
+ break;
+
+ case Xml::TagEnd:
+ if (tag == "topwin")
+ return;
+
+ default:
+ break;
+ }
+ }
+}
//---------------------------------------------------------
-// writeConfiguration
+// writeConfiguration
//---------------------------------------------------------
void TopWin::writeConfiguration(ToplevelType t, int level, Xml& xml)
- {
- if (!initInited)
- {
- printf ("WARNING: TopWin::writeConfiguration() called although the config hasn't been\n"
- " initalized! writing default configuration\n");
- initConfiguration();
- }
- xml.tag(level++, "topwin");
- xml.intTag(level, "width", _widthInit[t]);
- xml.intTag(level, "height", _heightInit[t]);
- xml.strTag(level, "nonshared_toolbars", _toolbarNonsharedInit[t].toHex().data());
- xml.strTag(level, "shared_toolbars", _toolbarSharedInit[t].toHex().data());
- xml.intTag(level, "shares_when_free", _sharesWhenFree[t]);
- xml.intTag(level, "shares_when_subwin", _sharesWhenSubwin[t]);
- xml.intTag(level, "default_subwin", _defaultSubwin[t]);
- xml.etag(level, "topwin");
- }
+{
+ if (!initInited)
+ {
+ printf ("WARNING: TopWin::writeConfiguration() called although the config hasn't been\n"
+ " initalized! writing default configuration\n");
+ initConfiguration();
+ }
+ xml.tag(level++, "topwin");
+ xml.intTag(level, "width", _widthInit[t]);
+ xml.intTag(level, "height", _heightInit[t]);
+ xml.strTag(level, "nonshared_toolbars", _toolbarNonsharedInit[t].toHex().data());
+ xml.strTag(level, "shared_toolbars", _toolbarSharedInit[t].toHex().data());
+ xml.intTag(level, "shares_when_free", _sharesWhenFree[t]);
+ xml.intTag(level, "shares_when_subwin", _sharesWhenSubwin[t]);
+ xml.intTag(level, "default_subwin", _defaultSubwin[t]);
+ xml.etag(level, "topwin");
+}
void TopWin::initTopwinState()
{
- if (sharesToolsAndMenu())
- {
- if (this == muse->getCurrentMenuSharingTopwin())
- muse->restoreState(_toolbarSharedInit[_type]);
- }
- else
- restoreState(_toolbarNonsharedInit[_type]);
+ if (sharesToolsAndMenu())
+ {
+ if (this == muse->getCurrentMenuSharingTopwin())
+ muse->restoreState(_toolbarSharedInit[_type]);
+ }
+ else
+ restoreState(_toolbarNonsharedInit[_type]);
}
void TopWin::restoreMainwinState()
{
- if (sharesToolsAndMenu())
- initTopwinState();
+ if (sharesToolsAndMenu())
+ initTopwinState();
}
QString TopWin::typeName(ToplevelType t)
{
- switch (t)
- {
- case PIANO_ROLL: return tr("Piano roll");
- case LISTE: return tr("List editor");
- case DRUM: return tr("Drum editor");
- case MASTER: return tr("Master track editor");
- case LMASTER: return tr("Master track list editor");
- case WAVE: return tr("Wave editor");
- case CLIPLIST: return tr("Clip list");
- case MARKER: return tr("Marker view");
- case SCORE: return tr("Score editor");
- case ARRANGER: return tr("Arranger");
- default: return tr("<unknown toplevel type>");
- }
+ switch (t)
+ {
+ case PIANO_ROLL: return tr("Piano roll");
+ case LISTE: return tr("List editor");
+ case DRUM: return tr("Drum editor");
+ case MASTER: return tr("Master track editor");
+ case LMASTER: return tr("Master track list editor");
+ case WAVE: return tr("Wave editor");
+ case CLIPLIST: return tr("Clip list");
+ case MARKER: return tr("Marker view");
+ case SCORE: return tr("Score editor");
+ case ARRANGER: return tr("Arranger");
+ default: return tr("<unknown toplevel type>");
+ }
}
void TopWin::setFullscreen(bool val)
{
- if (val)
- showFullScreen();
- else
- showNormal();
+ if (val)
+ showFullScreen();
+ else
+ showNormal();
}
void TopWin::resize(int w, int h)
{
- QMainWindow::resize(w,h);
-
- if (isMdiWin())
- mdisubwin->resize(w,h);
+ QMainWindow::resize(w,h);
+
+ if (isMdiWin())
+ mdisubwin->resize(w,h);
}
void TopWin::resize(const QSize& s)
{
- resize(s.width(), s.height());
+ resize(s.width(), s.height());
}
diff --git a/muse2/muse/cobject.h b/muse2/muse/cobject.h
index 08fa2b47..1ee2b581 100644
--- a/muse2/muse/cobject.h
+++ b/muse2/muse/cobject.h
@@ -115,8 +115,6 @@ class TopWin : public QMainWindow
void initTopwinState();
- bool initalizing; //if true, no state is saved
-
private slots:
void setFullscreen(bool);
diff --git a/muse2/muse/midiedit/scoreedit.cpp b/muse2/muse/midiedit/scoreedit.cpp
index 8b5b52f7..ad55b33f 100644
--- a/muse2/muse/midiedit/scoreedit.cpp
+++ b/muse2/muse/midiedit/scoreedit.cpp
@@ -4538,8 +4538,6 @@ void ScoreCanvas::add_new_parts(const std::map< Part*, std::set<Part*> >& param)
* from clipboard failed. ignoring this one... ) [ not reproducible ]
*
* CURRENT TODO
- * M o TEST pasting in editors!
- *
* ! o fix sigedit boxes (see also "important todo")
* o ticks-to-quarter spinboxes
* o newly created windows have to be focussed!
diff --git a/muse2/muse/mixer/rack.cpp b/muse2/muse/mixer/rack.cpp
index 9e7dc754..fdd80e60 100644
--- a/muse2/muse/mixer/rack.cpp
+++ b/muse2/muse/mixer/rack.cpp
@@ -84,9 +84,9 @@ void EffectRackDelegate::paint ( QPainter * painter, const QStyleOptionViewItem
mask.setColorAt(1, mask_edge);
mask.setStart(QPointF(0, cr.y()));
mask.setFinalStop(QPointF(0, cr.y() + cr.height()));
-
+
painter->setBrush(tr->efxPipe()->isOn(index.row()) ?
- option.palette.mid() :
+ er->getActiveColor() :
option.palette.dark());
painter->setPen(Qt::NoPen);
painter->drawRoundedRect(cr, 2, 2);
@@ -160,6 +160,7 @@ EffectRack::EffectRack(QWidget* parent, AudioTrack* t)
track = t;
itemheight = 19;
setFont(MusEConfig::config.fonts[1]);
+ activeColor = QColor(74, 165, 49);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
@@ -186,7 +187,7 @@ void EffectRack::updateContents()
for (int i = 0; i < PipelineDepth; ++i) {
QString name = track->efxPipe()->name(i);
item(i)->setText(name);
- item(i)->setBackground(track->efxPipe()->isOn(i) ? palette().mid() : palette().dark());
+ item(i)->setBackground(track->efxPipe()->isOn(i) ? activeColor : palette().dark());
item(i)->setToolTip(name == QString("empty") ? tr("effect rack") : name );
}
}
diff --git a/muse2/muse/mixer/rack.h b/muse2/muse/mixer/rack.h
index a2f2a25a..65d112e9 100644
--- a/muse2/muse/mixer/rack.h
+++ b/muse2/muse/mixer/rack.h
@@ -44,7 +44,8 @@ class EffectRack : public QListWidget {
AudioTrack* track;
int itemheight;
-
+ QColor activeColor;
+
virtual QSize minimumSizeHint() const;
virtual QSize sizeHint() const;
@@ -75,6 +76,8 @@ class EffectRack : public QListWidget {
AudioTrack* getTrack() { return track; }
QPoint getDragPos() { return dragPos; }
+ QColor getActiveColor() { return activeColor; }
+
};
#endif
diff --git a/muse2/muse/plugin.cpp b/muse2/muse/plugin.cpp
index 01e8243b..e2170ebb 100644
--- a/muse2/muse/plugin.cpp
+++ b/muse2/muse/plugin.cpp
@@ -1772,6 +1772,8 @@ void PluginI::updateControllers()
//audio->msgSetPluginCtrlVal(_track, genACnum(_id, i), controls[i].val);
// p4.0.21 audio->msgXXX waits. Do we really need to?
_track->setPluginCtrlVal(genACnum(_id, i), controls[i].val); // TODO A faster bulk message
+
+ song->controllerChange(_track);
}
//---------------------------------------------------------
@@ -3597,15 +3599,19 @@ PluginGui::PluginGui(PluginIBase* p)
params[i].label->setId(i);
// Let sliders all have different but unique colors
- uint hast = qHash(plugin->paramName(i));
- QColor color((uint) (hast * hast) % 16777216);
+ // Some prime number magic
+ uint j = i+1;
+ uint c1 = j * 211 % 256;
+ uint c2 = j * j * 137 % 256;
+ uint c3 = j * j * j * 43 % 256;
+ QColor color(c1, c2, c3);
MusEWidget::Slider* s = new MusEWidget::Slider(0, "param", Qt::Horizontal,
MusEWidget::Slider::None, color);
s->setCursorHoming(true);
s->setId(i);
- //s->setFixedHeight(h);
+ s->setSizeHint(200, 8);
s->setRange(dlower, dupper);
if(LADSPA_IS_HINT_INTEGER(range.HintDescriptor))
s->setStep(1.0);
@@ -3614,7 +3620,7 @@ PluginGui::PluginGui(PluginIBase* p)
params[i].label->setSlider((MusEWidget::Slider*)params[i].actuator);
}
//params[i].actuator->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum));
- params[i].actuator->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed));
+ params[i].actuator->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed));
if (params[i].type == GuiParam::GUI_SLIDER) {
//label->setFixedHeight(20);
//label->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum));
@@ -3648,6 +3654,7 @@ PluginGui::PluginGui(PluginIBase* p)
if (n2 > 0) {
paramsOut = new GuiParam[n2];
+ int h = fm.height() - 2;
for (int i = 0; i < n2; ++i) {
QLabel* label = 0;
LADSPA_PortRangeHint range = plugin->rangeOut(i);
@@ -3675,6 +3682,7 @@ PluginGui::PluginGui(PluginIBase* p)
m->setRange(dlower, dupper);
m->setVal(dval);
+ m->setFixedHeight(h);
paramsOut[i].actuator = m;
// paramsOut[i].label->setSlider((MusEWidget::Slider*)params[i].actuator);
//paramsOut[i].actuator->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed));
@@ -3688,9 +3696,6 @@ PluginGui::PluginGui(PluginIBase* p)
}
- // p3.3.43
- resize(280, height());
-
grid->setColumnStretch(2, 10);
mw->setLayout(grid);
view->setWidget(mw);
@@ -3786,6 +3791,7 @@ void PluginGui::ctrlPressed(int param)
//audio->msgSetPluginCtrlVal(track, id, val);
// p4.0.21 audio->msgXXX waits. Do we really need to?
track->setPluginCtrlVal(id, val);
+ song->controllerChange(track);
track->startAutoRecord(id, val);
}
@@ -3805,6 +3811,7 @@ void PluginGui::ctrlPressed(int param)
//audio->msgSetPluginCtrlVal(track, id, val);
// p4.0.21 audio->msgXXX waits. Do we really need to?
track->setPluginCtrlVal(id, val);
+ song->controllerChange(track);
track->startAutoRecord(id, val);
}
@@ -3899,6 +3906,7 @@ void PluginGui::sliderChanged(double val, int param)
//audio->msgSetPluginCtrlVal(track, id, val);
// p4.0.21 audio->msgXXX waits. Do we really need to?
track->setPluginCtrlVal(id, val);
+ song->controllerChange(track);
track->recordAutomation(id, val);
}
@@ -3943,6 +3951,7 @@ void PluginGui::labelChanged(double val, int param)
//audio->msgSetPluginCtrlVal(track, id, val);
// p4.0.21 audio->msgXXX waits. Do we really need to?
track->setPluginCtrlVal(id, val);
+ song->controllerChange(track);
track->startAutoRecord(id, val);
}
@@ -4345,6 +4354,7 @@ void PluginGui::guiParamChanged(int idx)
//audio->msgSetPluginCtrlVal(track, id, val);
// p4.0.21 audio->msgXXX waits. Do we really need to?
track->setPluginCtrlVal(id, val);
+ song->controllerChange(track);
switch(type)
{
@@ -4481,6 +4491,7 @@ void PluginGui::guiSliderPressed(int idx)
//audio->msgSetPluginCtrlVal(track, id, val);
// p4.0.21 audio->msgXXX waits. Do we really need to?
track->setPluginCtrlVal(id, val);
+ song->controllerChange(track);
track->startAutoRecord(id, val);
diff --git a/muse2/muse/widgets/meter.cpp b/muse2/muse/widgets/meter.cpp
index f4d907d1..239f7655 100644
--- a/muse2/muse/widgets/meter.cpp
+++ b/muse2/muse/widgets/meter.cpp
@@ -30,6 +30,7 @@
#include <QResizeEvent>
#include "meter.h"
+#include "utils.h"
#include "gconfig.h"
#include "fastlog.h"
@@ -47,7 +48,8 @@ Meter::Meter(QWidget* parent, MeterType type)
setAttribute(Qt::WA_StaticContents);
// This is absolutely required for speed! Otherwise painfully slow because we get
// full rect paint events even on small scrolls! See help on QPainter::scroll().
- setAttribute(Qt::WA_OpaquePaintEvent);
+ // Commented out for now. Orcan 20110911
+ //setAttribute(Qt::WA_OpaquePaintEvent);
//setFrameStyle(QFrame::Raised | QFrame::StyledPanel);
mtype = type;
@@ -61,6 +63,10 @@ Meter::Meter(QWidget* parent, MeterType type)
setLineWidth(0);
setMidLineWidth(0);
+ // rounding radii
+ xrad = 4;
+ yrad = 4;
+
dark_red_end = QColor(0x8e0000);
dark_red_begin = QColor(0x8e3800);
@@ -181,19 +187,18 @@ void Meter::paintEvent(QPaintEvent* /*ev*/)
// TODO: Could make better use of event rectangle, for speed.
QPainter p(this);
- //p.setRenderHint(QPainter::Antialiasing);
+ p.setRenderHint(QPainter::Antialiasing);
double range = maxScale - minScale;
int fw = frameWidth();
int w = width() - 2*fw;
int h = height() - 2*fw;
-
- // FIXME (Orcan): With the event rectangle we get corruption when we toggle the mono/stereo switch. Why?
+
/*
QRect rect = ev->rect();
- int w = rect.width();
- int h = rect.height();
+ int w = rect.width() - 2*fw;
+ int h = rect.height() - 2*fw;
*/
int yv;
@@ -215,12 +220,15 @@ void Meter::paintEvent(QPaintEvent* /*ev*/)
ymax = maxVal == 0 ? 0 : int(((maxScale - maxVal) * h)/range);
p.setPen(peak_color);
p.drawLine(0, ymax, w, ymax);
-
+
// Draw the transparent layer on top of everything to give a 3d look
+ QPainterPath round_path = MusEUtil::roundedPath(0, 0, w, h,
+ xrad, yrad,
+ (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight | MusEUtil::LowerLeft | MusEUtil::LowerRight ) );
maskGrad.setStart(QPointF(0, 0));
maskGrad.setFinalStop(QPointF(w, 0));
- p.fillRect(0, 0, w, h, QBrush(maskGrad));
-
+ p.fillPath(round_path, QBrush(maskGrad));
+
}
@@ -250,47 +258,67 @@ void Meter::drawVU(QPainter& p, int w, int h, int yv)
lightGradRed.setStart(QPointF(0, 0));
lightGradRed.setFinalStop(QPointF(0, y1));
+ QPainterPath p_top = MusEUtil::roundedPath(0, 0, w, y1,
+ xrad, yrad,
+ (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight ) );
+
+ QPainterPath p_bottom = MusEUtil::roundedPath(0, y2, w, h-y2,
+ xrad, yrad,
+ (MusEUtil::Corner) (MusEUtil::LowerLeft | MusEUtil::LowerRight ) );
+
if(yv < y1)
{
+
+ QPainterPath p_dark_red = MusEUtil::roundedPath(0, 0, w, yv,
+ xrad, yrad,
+ (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight ) );
+
+ p_top = p_top.subtracted(p_dark_red);
+
// Red section:
- p.fillRect(0, 0, w, yv, QBrush(darkGradRed)); // dark red
- p.fillRect(0, yv, w, y1-yv, QBrush(lightGradRed)); // light red
-
+ p.fillPath(p_dark_red, QBrush(darkGradRed)); // dark red
+ p.fillPath(p_top, QBrush(lightGradRed)); // light red
+
// Yellow section:
- p.fillRect(0, y1, w, y2-y1, QBrush(lightGradYellow)); // light yellow
-
+ p.fillRect(0, y1, w, y2-y1, QBrush(lightGradYellow)); // light yellow
+
// Green section:
- p.fillRect(0, y2, w, h-y2, QBrush(lightGradGreen)); // light green
+ p.fillPath(p_bottom, QBrush(lightGradGreen)); // light green
}
else
if(yv < y2)
{
// Red section:
- p.fillRect(0, 0, w, y1, QBrush(darkGradRed)); // dark red
-
+ p.fillPath(p_top, QBrush(darkGradRed)); // dark red
+
// Yellow section:
- p.fillRect(0, y1, w, yv-y1, QBrush(darkGradYellow)); // dark yellow
- p.fillRect(0, yv, w, y2-yv, QBrush(lightGradYellow)); // light yellow
-
+ p.fillRect(0, y1, w, yv-y1, QBrush(darkGradYellow)); // dark yellow
+ p.fillRect(0, yv, w, y2-yv, QBrush(lightGradYellow)); // light yellow
+
// Green section:
- p.fillRect(0, y2, w, h-y2, QBrush(lightGradGreen)); // light green
+ p.fillPath(p_bottom, QBrush(lightGradGreen)); // light green
}
else
//if(yv <= y3)
{
+ QPainterPath p_light_green = MusEUtil::roundedPath(0, yv, w, h-yv,
+ xrad, yrad,
+ (MusEUtil::Corner) (MusEUtil::LowerLeft | MusEUtil::LowerRight ) );
+ p_bottom = p_bottom.subtracted(p_light_green);
+
// Red section:
- p.fillRect(0, 0, w, y1, QBrush(darkGradRed)); // dark red
-
+ p.fillPath(p_top, QBrush(darkGradRed)); // dark red
+
// Yellow section:
- p.fillRect(0, y1, w, y2-y1, QBrush(darkGradYellow)); // dark yellow
-
+ p.fillRect(0, y1, w, y2-y1, QBrush(darkGradYellow)); // dark yellow
+
// Green section:
- p.fillRect(0, y2, w, yv-y2, QBrush(darkGradGreen)); // dark green
- p.fillRect(0, yv, w, h-yv, QBrush(lightGradGreen)); // light green
+ p.fillPath(p_bottom, QBrush(darkGradGreen)); // dark green
+ p.fillPath(p_light_green, QBrush(lightGradGreen)); // light green
}
- p.fillRect(0,y1, w, 1, separator_color);
- p.fillRect(0,y2, w, 1, separator_color);
+ p.fillRect(0,y1, w, 1, separator_color);
+ p.fillRect(0,y2, w, 1, separator_color);
}
else
@@ -301,8 +329,49 @@ void Meter::drawVU(QPainter& p, int w, int h, int yv)
lightGradGreen.setStart(QPointF(0, 0));
lightGradGreen.setFinalStop(QPointF(0, h));
- p.fillRect(0, 0, w, yv, QBrush(darkGradGreen)); // dark green
- p.fillRect(0, yv, w, h-yv, QBrush(lightGradGreen)); // light green
+ // We need to draw the meter in two parts. The cutoff for upper rectangle can be
+ // anywhere between yrad and h-yrad. Without loss of generality we pick the lower limit.
+ int cut = yrad;
+
+ QPainterPath p_top = MusEUtil::roundedPath(0, 0, w, cut,
+ xrad, yrad,
+ (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight ) );
+
+ QPainterPath p_bottom = MusEUtil::roundedPath(0, cut, w, h-cut,
+ xrad, yrad,
+ (MusEUtil::Corner) (MusEUtil::LowerLeft | MusEUtil::LowerRight ) );
+
+ if(yv < cut)
+ {
+
+ QPainterPath p_dark = MusEUtil::roundedPath(0, 0, w, yv,
+ xrad, yrad,
+ (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight ) );
+
+ p_top = p_top.subtracted(p_dark);
+
+ // top section:
+ p.fillPath(p_dark, QBrush(darkGradGreen)); // dark green
+ p.fillPath(p_top, QBrush(lightGradGreen)); // light green
+
+ // bottom section:
+ p.fillPath(p_bottom, QBrush(lightGradGreen)); // light green
+ }
+ else
+ {
+ QPainterPath p_light = MusEUtil::roundedPath(0, yv, w, h-yv,
+ xrad, yrad,
+ (MusEUtil::Corner) (MusEUtil::LowerLeft | MusEUtil::LowerRight ) );
+ p_bottom = p_bottom.subtracted(p_light);
+
+ // top section:
+ p.fillPath(p_top, QBrush(darkGradGreen)); // dark green
+
+ // bottom section:
+ p.fillPath(p_bottom, QBrush(darkGradGreen)); // dark green
+ p.fillPath(p_light, QBrush(lightGradGreen)); // light green
+ }
+
}
}
@@ -311,43 +380,8 @@ void Meter::drawVU(QPainter& p, int w, int h, int yv)
// resizeEvent
//---------------------------------------------------------
-void Meter::resizeEvent(QResizeEvent* ev)
- {
- // Round corners of the widget.
-
- QSize size = ev->size();
- int w = size.width();
- int h = size.height();
- QPainterPath rounded_rect;
- rounded_rect.addRoundedRect(0,0,w,h, w/2.5, w/3);
- QRegion maskregion(rounded_rect.toFillPolygon().toPolygon());
- setMask(maskregion);
-
- /*
- // Another method to do the above. I don't know yet which one is more efficient - Orcan
- QRect rect(0,0,w,h);
- int r = 6;
-
- QRegion region;
- // middle and borders
- region += rect.adjusted(r, 0, -r, 0);
- region += rect.adjusted(0, r, 0, -r);
- // top left
- QRect corner(rect.topLeft(), QSize(r*2, r*2));
- region += QRegion(corner, QRegion::Ellipse);
- // top right
- corner.moveTopRight(rect.topRight());
- region += QRegion(corner, QRegion::Ellipse);
- // bottom left
- corner.moveBottomLeft(rect.bottomLeft());
- region += QRegion(corner, QRegion::Ellipse);
- // bottom right
- corner.moveBottomRight(rect.bottomRight());
- region += QRegion(corner, QRegion::Ellipse);
- // return region;
- setMask(region);
- */
-
+ void Meter::resizeEvent(QResizeEvent* /*ev*/)
+ {
}
//---------------------------------------------------------
diff --git a/muse2/muse/widgets/meter.h b/muse2/muse/widgets/meter.h
index 62ad3fe0..06f35ca2 100644
--- a/muse2/muse/widgets/meter.h
+++ b/muse2/muse/widgets/meter.h
@@ -72,6 +72,7 @@ class Meter : public QFrame {
QColor separator_color;;
QColor peak_color;
+ int xrad, yrad;
private:
MeterType mtype;
diff --git a/muse2/muse/widgets/slider.cpp b/muse2/muse/widgets/slider.cpp
index f50c144a..593b3df6 100644
--- a/muse2/muse/widgets/slider.cpp
+++ b/muse2/muse/widgets/slider.cpp
@@ -27,6 +27,7 @@
#include <QPainter>
#include <QResizeEvent>
+#include "utils.h"
#include "slider.h"
namespace MusEWidget {
@@ -56,7 +57,7 @@ namespace MusEWidget {
// Defaults to Horizontal.
// ScalePos scalePos -- Position of the scale. Can be Slider::None,
// Slider::Left, Slider::Right, Slider::Top,
-// or Slider::Bottom. Defaults to Slider::None.
+// or Slider::Bottom. Defaults to Slider::None. !!! CURRENTLY only Slider::None supported - oget 20110913
// QColor fillcolor -- the color used to fill in the full side
// of the Slider
//------------------------------------------------------------
@@ -84,6 +85,16 @@ Slider::Slider(QWidget *parent, const char *name,
}
//------------------------------------------------------------
+//.F Slider::setSizeHint
+//------------------------------------------------------------
+
+void Slider::setSizeHint(uint w, uint h)
+ {
+ horizontal_hint = w;
+ vertical_hint = h;
+ }
+
+//------------------------------------------------------------
//.F Slider::~Slider
// Destructor
//.u Syntax
@@ -168,73 +179,6 @@ void Slider::fontChange(const QFont & /*oldFont*/)
}
//------------------------------------------------------------
-//
-// roundedPath
-// Returns a rectangle with rounded corners
-//
-// roundCorner can be an bitwise-or combination of
-// UpperLeft, UpperRight, LowerRight, LowerLeft
-//------------------------------------------------------------
-QPainterPath Slider::roundedPath(QRect r, int xrad, int yrad, RoundCorner roundCorner)
-{
- return roundedPath(r.x(), r.y(),
- r.width(), r.height(),
- xrad, yrad,
- roundCorner);
-}
-
-QPainterPath Slider::roundedPath(int x, int y, int w, int h, int xrad, int yrad, RoundCorner roundCorner)
-{
- QPainterPath rounded_rect;
- rounded_rect.addRect(x, y + yrad, w, h - 2 * yrad);
- if (roundCorner & UpperLeft)
- {
- rounded_rect.moveTo(x + xrad, y + yrad);
- rounded_rect.arcTo(x, y, xrad*2, yrad*2, 180, -90);
- }
- else
- {
- rounded_rect.moveTo(x, y + yrad);
- rounded_rect.lineTo(x,y);
- rounded_rect.lineTo(x + xrad, y);
- }
-
- rounded_rect.lineTo(x + w - xrad, y);
-
- if (roundCorner & UpperRight)
- rounded_rect.arcTo(x + w - xrad * 2, y, xrad*2, yrad*2, 90, -90);
- else
- {
- rounded_rect.lineTo(x + w, y);
- rounded_rect.lineTo(x + w, y + yrad);
- }
-
- if (roundCorner & LowerLeft)
- {
- rounded_rect.moveTo(x + xrad, y + h - yrad);
- rounded_rect.arcTo(x, y + h - yrad*2, xrad*2, yrad*2, 180, 90);
- }
- else
- {
- rounded_rect.moveTo(x, y + h - yrad);
- rounded_rect.lineTo(x, y + h);
- rounded_rect.lineTo(x + xrad, y + h);
- }
-
- rounded_rect.lineTo(x + w - xrad, y + h);
-
- if (roundCorner & LowerRight)
- rounded_rect.arcTo(x + w - xrad*2, y + h - yrad*2, xrad*2, yrad*2, 270, 90);
- else
- {
- rounded_rect.lineTo(x + w, y + h);
- rounded_rect.lineTo(x + w, y + h - yrad);
- }
-
- return rounded_rect;
-}
-
-//------------------------------------------------------------
// drawSlider
// Draw the slider into the specified rectangle.
//------------------------------------------------------------
@@ -315,9 +259,9 @@ void Slider::drawSlider(QPainter *p, const QRect &r)
//
// Draw background
//
- QPainterPath bg_rect = roundedPath(cr,
+ QPainterPath bg_rect = MusEUtil::roundedPath(cr,
xrad, yrad,
- (RoundCorner) (UpperLeft | UpperRight | LowerLeft | LowerRight) );
+ (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight | MusEUtil::LowerLeft | MusEUtil::LowerRight) );
p->fillPath(bg_rect, d_fillColor);
@@ -333,9 +277,9 @@ void Slider::drawSlider(QPainter *p, const QRect &r)
e_mask.setStart(QPointF(0, cr.y()));
e_mask.setFinalStop(QPointF(0, cr.y() + cr.height()));
- QPainterPath e_rect = roundedPath(ipos + d_thumbLength, cr.y(),
+ QPainterPath e_rect = MusEUtil::roundedPath(ipos + d_thumbLength, cr.y(),
cr.width() - d_thumbLength - dist1, cr.height(),
- xrad, yrad, (RoundCorner) (UpperRight | LowerRight) );
+ xrad, yrad, (MusEUtil::Corner) (MusEUtil::UpperRight | MusEUtil::LowerRight) );
p->fillPath(e_rect, QBrush(e_mask));
@@ -347,10 +291,10 @@ void Slider::drawSlider(QPainter *p, const QRect &r)
f_mask.setStart(QPointF(0, cr.y()));
f_mask.setFinalStop(QPointF(0, cr.y() + cr.height()));
- QPainterPath f_rect = roundedPath(cr.x(), cr.y(),
+ QPainterPath f_rect = MusEUtil::roundedPath(cr.x(), cr.y(),
ipos + 1, cr.height(),
xrad, yrad,
- (RoundCorner) (LowerLeft | UpperLeft) );
+ (MusEUtil::Corner) (MusEUtil::LowerLeft | MusEUtil::UpperLeft) );
p->fillPath(f_rect, QBrush(f_mask));
@@ -359,10 +303,10 @@ void Slider::drawSlider(QPainter *p, const QRect &r)
// Draw thumb
//
- QPainterPath thumb_rect = roundedPath(ipos, r.y(),
+ QPainterPath thumb_rect = MusEUtil::roundedPath(ipos, r.y(),
d_thumbLength, r.height(),
2, 2,
- (RoundCorner) (UpperLeft | UpperRight | LowerLeft | LowerRight) );
+ (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight | MusEUtil::LowerLeft | MusEUtil::LowerRight) );
thumbGrad.setStart(QPointF(0, cr.y()));
thumbGrad.setFinalStop(QPointF(0, cr.y() + cr.height()));
@@ -387,9 +331,9 @@ void Slider::drawSlider(QPainter *p, const QRect &r)
//
// Draw background
//
- QPainterPath bg_rect = roundedPath(cr,
+ QPainterPath bg_rect = MusEUtil::roundedPath(cr,
xrad, yrad,
- (RoundCorner) (UpperLeft | UpperRight | LowerLeft | LowerRight) );
+ (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight | MusEUtil::LowerLeft | MusEUtil::LowerRight) );
p->fillPath(bg_rect, d_fillColor);
@@ -405,10 +349,10 @@ void Slider::drawSlider(QPainter *p, const QRect &r)
e_mask.setStart(QPointF(cr.x(), 0));
e_mask.setFinalStop(QPointF(cr.x() + cr.width(), 0));
- QPainterPath e_rect = roundedPath(cr.x(), cr.y(),
+ QPainterPath e_rect = MusEUtil::roundedPath(cr.x(), cr.y(),
cr.width(), ipos + 1,
xrad, yrad,
- (RoundCorner) (UpperLeft | UpperRight) );
+ (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight) );
p->fillPath(e_rect, QBrush(e_mask));
@@ -420,9 +364,9 @@ void Slider::drawSlider(QPainter *p, const QRect &r)
f_mask.setStart(QPointF(cr.x(), 0));
f_mask.setFinalStop(QPointF(cr.x() + cr.width(), 0));
- QPainterPath f_rect = roundedPath(cr.x(), ipos + d_thumbLength,
+ QPainterPath f_rect = MusEUtil::roundedPath(cr.x(), ipos + d_thumbLength,
cr.width(), cr.height() - d_thumbLength - dist1,
- xrad, yrad, (RoundCorner) (LowerLeft | LowerRight) );
+ xrad, yrad, (MusEUtil::Corner) (MusEUtil::LowerLeft | MusEUtil::LowerRight) );
p->fillPath(f_rect, QBrush(f_mask));
@@ -431,10 +375,10 @@ void Slider::drawSlider(QPainter *p, const QRect &r)
// Draw thumb
//
- QPainterPath thumb_rect = roundedPath(r.x(), ipos,
+ QPainterPath thumb_rect = MusEUtil::roundedPath(r.x(), ipos,
r.width(), d_thumbLength,
2, 2,
- (RoundCorner) (UpperLeft | UpperRight | LowerLeft | LowerRight) );
+ (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight | MusEUtil::LowerLeft | MusEUtil::LowerRight) );
thumbGrad.setStart(QPointF(cr.x(), 0));
thumbGrad.setFinalStop(QPointF(cr.x() + cr.width(), 0));
@@ -606,10 +550,11 @@ void Slider::getScrollMode( QPoint &p, const Qt::MouseButton &button, int &scrol
//.f void Slider::paintEvent(QPaintEvent *e)
//------------------------------------------------------------
-void Slider::paintEvent(QPaintEvent* /*e*/)
+void Slider::paintEvent(QPaintEvent* /*ev*/)
{
- QPainter p;
+ QPainter p(this);
+ /* Scale is not supported
if (p.begin(this)) {
if (d_scalePos != None) {
p.fillRect(rect(), palette().window());
@@ -618,6 +563,8 @@ void Slider::paintEvent(QPaintEvent* /*e*/)
drawSlider(&p, d_sliderRect);
}
p.end();
+ */
+ drawSlider(&p, d_sliderRect);
}
//------------------------------------------------------------
@@ -636,6 +583,7 @@ void Slider::resizeEvent(QResizeEvent *e)
d_resized = TRUE;
QSize s = e->size();
+ /* Scale is not supported
int sliderWidth = d_thumbWidth;
// reposition slider
@@ -708,8 +656,10 @@ void Slider::resizeEvent(QResizeEvent *e)
s.width(), s.height());
break;
}
-
}
+ */
+ d_sliderRect.setRect(this->rect().x(), this->rect().y(),
+ s.width(), s.height());
}
//------------------------------------------------------------
@@ -780,13 +730,14 @@ void Slider::setMargins(int hor, int vert)
// scale.
//------------------------------------------------------------
-QSize Slider::sizeHint() //const ddskrjo
+QSize Slider::sizeHint() const
{
+ /* Scale is not supported
+ int w = 40;
+ int h = 40;
QPainter p;
int msWidth = 0, msHeight = 0;
- int w = 40;
- int h = 40;
if (d_scalePos != None) {
if (p.begin(this)) {
msWidth = d_scale.maxWidth(&p, FALSE);
@@ -813,7 +764,8 @@ QSize Slider::sizeHint() //const ddskrjo
break;
}
}
- return QSize(w, h);
+ */
+ return QSize(horizontal_hint, vertical_hint);
}
//---------------------------------------------------------
@@ -823,6 +775,7 @@ QSize Slider::sizeHint() //const ddskrjo
void Slider::setOrientation(Qt::Orientation o)
{
d_orient = o;
+ /* Scale is not supported
ScaleDraw::OrientationX so = ScaleDraw::Bottom;
switch(d_orient) {
case Qt::Vertical:
@@ -847,6 +800,18 @@ void Slider::setOrientation(Qt::Orientation o)
QRect r = geometry();
setGeometry(r.x(), r.y(), r.height(), r.width());
update();
+ */
+
+ switch(d_orient) {
+ case Qt::Vertical:
+ horizontal_hint = 16;
+ vertical_hint = 64;
+ break;
+ case Qt::Horizontal:
+ horizontal_hint = 64;
+ vertical_hint = 16;
+ break;
+ }
}
Qt::Orientation Slider::orientation() const
diff --git a/muse2/muse/widgets/slider.h b/muse2/muse/widgets/slider.h
index a76c5270..5a2bff71 100644
--- a/muse2/muse/widgets/slider.h
+++ b/muse2/muse/widgets/slider.h
@@ -42,7 +42,6 @@ class Slider : public SliderBase, public ScaleIf
public:
enum ScalePos { None, Left, Right, Top, Bottom };
- enum RoundCorner { UpperLeft = 0x1, UpperRight = 0x2, LowerLeft = 0x4, LowerRight = 0x8 };
private:
Q_PROPERTY( double lineStep READ lineStep WRITE setLineStep )
@@ -70,8 +69,9 @@ class Slider : public SliderBase, public ScaleIf
int d_bgStyle;
int markerPos;
- QPainterPath roundedPath(int x, int y, int w, int h, int xrad, int yrad, RoundCorner roundCorner);
- QPainterPath roundedPath(QRect r, int xrad, int yrad, RoundCorner roundCorner);
+ uint vertical_hint;
+ uint horizontal_hint;
+
void drawHsBgSlot(QPainter *, const QRect&, const QRect&,const QBrush&);
void drawVsBgSlot(QPainter *, const QRect&, const QRect&,const QBrush&);
@@ -105,8 +105,9 @@ class Slider : public SliderBase, public ScaleIf
void setLineStep(double);
void setPageStep(double);
- void setMargins(int x, int y);
- QSize sizeHint(); // const;
+ void setMargins(int x, int y);
+ virtual QSize sizeHint() const;
+ void setSizeHint(uint w, uint h);
};
} // namespace MusEWidget
diff --git a/muse2/muse/widgets/utils.cpp b/muse2/muse/widgets/utils.cpp
index e46d265c..1ed9001a 100644
--- a/muse2/muse/widgets/utils.cpp
+++ b/muse2/muse/widgets/utils.cpp
@@ -404,4 +404,56 @@ QGradient gGradientFromQColor(const QColor& c, const QPointF& start, const QPoin
return gradient;
}
+QPainterPath roundedPath(QRect r, int xrad, int yrad, Corner roundCorner)
+{
+ return roundedPath(r.x(), r.y(),
+ r.width(), r.height(),
+ xrad, yrad,
+ roundCorner);
+}
+
+QPainterPath roundedPath(int x, int y, int w, int h, int xrad, int yrad, Corner roundCorner)
+{
+ QPainterPath rounded_rect;
+ rounded_rect.addRect(x, y, w, h);
+
+ if (roundCorner & UpperLeft)
+ {
+ QPainterPath top_left_corner;
+ top_left_corner.addRect(x, y, xrad, yrad);
+ top_left_corner.moveTo(x + xrad, y + yrad);
+ top_left_corner.arcTo(x, y, xrad*2, yrad*2, 180, -90);
+ rounded_rect = rounded_rect.subtracted(top_left_corner);
+ }
+
+ if (roundCorner & UpperRight)
+ {
+ QPainterPath top_right_corner;
+ top_right_corner.addRect(x + w - xrad, y, xrad, yrad);
+ top_right_corner.moveTo(x + w - xrad, y + yrad);
+ top_right_corner.arcTo(x + w - xrad * 2, y, xrad*2, yrad*2, 90, -90);
+ rounded_rect = rounded_rect.subtracted(top_right_corner);
+ }
+
+ if (roundCorner & LowerLeft)
+ {
+ QPainterPath bottom_left_corner;
+ bottom_left_corner.addRect(x, y + h - yrad, xrad, yrad);
+ bottom_left_corner.moveTo(x + xrad, y + h - yrad);
+ bottom_left_corner.arcTo(x, y + h - yrad*2, xrad*2, yrad*2, 180, 90);
+ rounded_rect = rounded_rect.subtracted(bottom_left_corner);
+ }
+
+ if (roundCorner & LowerRight)
+ {
+ QPainterPath bottom_right_corner;
+ bottom_right_corner.addRect(x + w - xrad, y + h - yrad, xrad, yrad);
+ bottom_right_corner.moveTo(x + w - xrad, y + h - yrad);
+ bottom_right_corner.arcTo(x + w - xrad*2, y + h - yrad*2, xrad*2, yrad*2, 270, 90);
+ rounded_rect = rounded_rect.subtracted(bottom_right_corner);
+ }
+
+ return rounded_rect;
+}
+
} // namespace MusEUtils
diff --git a/muse2/muse/widgets/utils.h b/muse2/muse/widgets/utils.h
index b74ba394..c6e1ad6b 100644
--- a/muse2/muse/widgets/utils.h
+++ b/muse2/muse/widgets/utils.h
@@ -30,9 +30,12 @@ class QGradient;
class QCanvas;
class QPointF;
class QColor;
+class QPainterPath;
namespace MusEUtil {
+enum Corner { UpperLeft = 0x1, UpperRight = 0x2, LowerLeft = 0x4, LowerRight = 0x8 };
+
extern QString bitmap2String(int bm);
extern int string2bitmap(const QString& str);
extern QString u32bitmap2String(unsigned int bm);
@@ -46,6 +49,9 @@ extern QFrame* vLine(QWidget* parent);
extern void dump(const unsigned char* p, int n);
extern double curTime();
+extern QPainterPath roundedPath(QRect r, int xrad, int yrad, Corner roundCorner);
+extern QPainterPath roundedPath(int x, int y, int w, int h, int xrad, int yrad, Corner roundCorner);
+
} // namespace MusEUtils
#endif
diff --git a/muse2/muse/widgets/verticalmeter.cpp b/muse2/muse/widgets/verticalmeter.cpp
index b0e0198f..74b4b695 100644
--- a/muse2/muse/widgets/verticalmeter.cpp
+++ b/muse2/muse/widgets/verticalmeter.cpp
@@ -31,6 +31,8 @@
#include "verticalmeter.h"
#include "gconfig.h"
#include "fastlog.h"
+#include "mmath.h"
+#include "utils.h"
namespace MusEWidget {
@@ -46,7 +48,8 @@ VerticalMeter::VerticalMeter(QWidget* parent, MeterType type)
setAttribute(Qt::WA_StaticContents);
// This is absolutely required for speed! Otherwise painfully slow because we get
// full rect paint events even on small scrolls! See help on QPainter::scroll().
- setAttribute(Qt::WA_OpaquePaintEvent);
+ // Commented out for now. Orcan 20110911
+ //setAttribute(Qt::WA_OpaquePaintEvent);
mtype = type;
overflow = false;
@@ -56,6 +59,9 @@ VerticalMeter::VerticalMeter(QWidget* parent, MeterType type)
maxScale = mtype == DBMeter ? 10.0 : 127.0;
yellowScale = -10;
redScale = 0;
+ xrad = 4;
+ yrad = 4;
+
setLineWidth(0);
setMidLineWidth(0);
}
@@ -124,23 +130,24 @@ void VerticalMeter::setRange(double min, double max)
// paintEvent
//---------------------------------------------------------
-void VerticalMeter::paintEvent(QPaintEvent* ev)
+void VerticalMeter::paintEvent(QPaintEvent* /*ev*/)
{
// TODO: Could make better use of event rectangle, for speed.
QPainter p(this);
+ p.setRenderHint(QPainter::Antialiasing);
double range = maxScale - minScale;
- /*
int fw = frameWidth();
int w = width() - 2*fw;
int h = height() - 2*fw;
- */
+ /*
QRect rect = ev->rect();
- int w = rect.width();
- int h = rect.height();
+ int w = rect.width() - 2*fw;
+ int h = rect.height() - 2*fw;
+ */
int xv;
@@ -157,18 +164,23 @@ void VerticalMeter::paintEvent(QPaintEvent* ev)
drawVU(p, w, h, xv);
// Draw the peak white line.
+ /*
int xcenter;
if(mtype == DBMeter)
xcenter = maxVal == 0 ? 0 : int(((maxScale - (fast_log10(0) * 20.0)) * w)/range);
else
- xcenter = maxVal == 0 ? 0 : int(((0) * w)/range);
+ xcenter = maxVal == 0 ? 0 : int(((maxVal) * w)/range);
p.setPen(peak_color);
p.drawLine(xcenter, 0, xcenter, h);
+ */
// Draw the transparent layer on top of everything to give a 3d look
+ QPainterPath round_path = roundedPath(0, 0, w, h,
+ xrad, yrad,
+ (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::UpperRight | MusEUtil::LowerLeft | MusEUtil::LowerRight ) );
maskGrad.setStart(QPointF(0, 0));
maskGrad.setFinalStop(QPointF(0, h));
- p.fillRect(0, 0, w, h, QBrush(maskGrad));
+ p.fillPath(round_path, QBrush(maskGrad));
}
//---------------------------------------------------------
@@ -177,7 +189,7 @@ void VerticalMeter::paintEvent(QPaintEvent* ev)
void VerticalMeter::drawVU(QPainter& p, int w, int h, int xv)
{
- if(mtype == DBMeter)
+ if(mtype == DBMeter)
{
double range = maxScale - minScale;
int x1 = int((maxScale - redScale) * w / range);
@@ -197,44 +209,65 @@ void VerticalMeter::drawVU(QPainter& p, int w, int h, int xv)
lightGradRed.setStart(QPointF(0, 0));
lightGradRed.setFinalStop(QPointF(x1, 0));
+ QPainterPath p_left = roundedPath(0, 0, x1, h,
+ xrad, yrad,
+ (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::LowerLeft ) );
+
+ QPainterPath p_right = roundedPath(x2, 0, w-x2, h,
+ xrad, yrad,
+ (MusEUtil::Corner) (MusEUtil::LowerRight | MusEUtil::UpperRight ) );
if(xv < x1)
{
- // Red section:
- p.fillRect(0, 0, xv, h, QBrush(darkGradRed)); // dark red
- p.fillRect(xv, 0, x1-xv, h, QBrush(lightGradRed)); // light red
-
+
+ QPainterPath p_light_green = roundedPath(0, 0, xv, h,
+ xrad, yrad,
+ (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::LowerLeft ) );
+
+ p_left = p_left.subtracted(p_light_green);
+
+ // Green section:
+ p.fillPath(p_light_green, QBrush(lightGradGreen)); // light green
+ p.fillPath(p_left, QBrush(darkGradGreen)); // dark green
+
// Yellow section:
- p.fillRect(x1, 0, x2-x1, h, QBrush(lightGradYellow)); // light yellow
+ p.fillRect(x1, 0, x2-x1, h, QBrush(darkGradYellow)); // dark yellow
- // Green section:
- p.fillRect(x2, 0, w-x2, h, QBrush(lightGradGreen)); // light green
+ // Red section:
+ p.fillPath(p_right, QBrush(darkGradRed)); // dark red
}
else
if(xv < x2)
{
- // Red section:
- p.fillRect(0, 0, x1, h, QBrush(darkGradRed)); // dark red
+ // Green section:
+ p.fillPath(p_left, QBrush(lightGradGreen)); // light green
// Yellow section:
- p.fillRect(x1, 0, xv-x1, h, QBrush(darkGradYellow)); // dark yellow
- p.fillRect(xv, 0, x2-xv, h, QBrush(lightGradYellow)); // light yellow
+ p.fillRect(x1, 0, xv-x1, h, QBrush(lightGradYellow)); // light yellow
+ p.fillRect(xv, 0, x2-xv, h, QBrush(darkGradYellow)); // dark yellow
- // Green section:
- p.fillRect(x2, 0, w-x2, h, QBrush(lightGradGreen)); // light green
+ // Red section:
+ p.fillPath(p_right, QBrush(darkGradRed)); // dark red
}
else
- //if(yv <= y3)
+ //if(xv <= x3)
{
- // Red section:
- p.fillRect(0, 0, x1, h, QBrush(darkGradRed)); // dark red
+ QPainterPath p_dark_red = roundedPath(xv, 0, w-xv, h,
+ xrad, yrad,
+ (MusEUtil::Corner) (MusEUtil::LowerRight | MusEUtil::UpperRight ) );
+
+ p_right = p_right.subtracted(p_dark_red);
+
+ // Green section:
+ p.fillPath(p_left, QBrush(lightGradGreen)); // light green
// Yellow section:
- p.fillRect(x1, 0, x2-x1, h, QBrush(darkGradYellow)); // dark yellow
+ p.fillRect(x1, 0, x2-x1, h, QBrush(lightGradYellow)); // light yellow
- // Green section:
- p.fillRect(x2, 0, xv-x2, h, QBrush(darkGradGreen)); // dark green
- p.fillRect(xv, 0, w-xv, h, QBrush(lightGradGreen)); // light green
+ // Red section:
+ p.fillPath(p_right, QBrush(lightGradRed)); // light red
+ p.fillPath(p_dark_red, QBrush(darkGradRed)); // dark red
+
}
p.fillRect(x1,0, 1, h, separator_color);
@@ -249,8 +282,49 @@ void VerticalMeter::drawVU(QPainter& p, int w, int h, int xv)
lightGradGreen.setStart(QPointF(0, 0));
lightGradGreen.setFinalStop(QPointF(w, 0));
- p.fillRect(0, 0, xv, h, QBrush(lightGradGreen)); // light green
- p.fillRect(xv, 0, w-xv, h, QBrush(darkGradGreen)); // dark green
+ // We need to draw the meter in two parts. The cutoff for the left rectangle can be
+ // anywhere between xrad and w-xrad. Without loss of generality we pick the lower limit.
+ int cut = xrad;
+
+ QPainterPath p_left = roundedPath(0, 0, cut, h,
+ xrad, yrad,
+ (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::LowerLeft ) );
+
+ QPainterPath p_right = roundedPath(cut, 0, w-cut, h,
+ xrad, yrad,
+ (MusEUtil::Corner) (MusEUtil::LowerRight | MusEUtil::UpperRight ) );
+
+ if(xv < cut)
+ {
+
+ QPainterPath p_light = roundedPath(0, 0, xv, h,
+ xrad, yrad,
+ (MusEUtil::Corner) (MusEUtil::UpperLeft | MusEUtil::LowerLeft ) );
+
+ p_left = p_left.subtracted(p_light);
+
+ // left section:
+ p.fillPath(p_left, QBrush(darkGradGreen)); // dark green
+ p.fillPath(p_light, QBrush(lightGradGreen)); // light green
+
+ // bottom section:
+ p.fillPath(p_right, QBrush(darkGradGreen)); // dark green
+ }
+ else
+ {
+ QPainterPath p_dark = roundedPath(xv, 0, w-xv, h,
+ xrad, yrad,
+ (MusEUtil::Corner) (MusEUtil::UpperRight | MusEUtil::LowerRight ) );
+ p_right = p_right.subtracted(p_dark);
+
+ // left section:
+ p.fillPath(p_left, QBrush(lightGradGreen)); // light green
+
+ // right section:
+ p.fillPath(p_dark, QBrush(darkGradGreen)); // dark green
+ p.fillPath(p_right, QBrush(lightGradGreen)); // light green
+ }
+
}
}
@@ -259,17 +333,8 @@ void VerticalMeter::drawVU(QPainter& p, int w, int h, int xv)
// resizeEvent
//---------------------------------------------------------
-void VerticalMeter::resizeEvent(QResizeEvent* ev)
+void VerticalMeter::resizeEvent(QResizeEvent* /*ev*/)
{
- // Round corners of the widget.
-
- QSize size = ev->size();
- int w = size.width();
- int h = size.height();
- QPainterPath rounded_rect;
- rounded_rect.addRoundedRect(0,0,w,h, h/3, h/2.5);
- QRegion maskregion(rounded_rect.toFillPolygon().toPolygon());
- setMask(maskregion);
}
} // namespace MusEWidget