summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim E. Real <termtech@rogers.com>2011-02-27 09:12:38 +0000
committerTim E. Real <termtech@rogers.com>2011-02-27 09:12:38 +0000
commit1a4f5609b180772326e48aaca43b0ac02ff8f268 (patch)
treedcdd60840c6fff5cb5ccf374645b66603399f079
parentb12a5b74f811a565a6c8d8922cccfd281e639f2a (diff)
Fixed piano roll controller graph text drawing (finally!)
-rw-r--r--muse2/ChangeLog3
-rw-r--r--muse2/muse/ctrl/ctrlcanvas.cpp75
-rw-r--r--muse2/muse/ctrl/ctrlcanvas.h1
-rw-r--r--muse2/muse/widgets/view.cpp106
4 files changed, 109 insertions, 76 deletions
diff --git a/muse2/ChangeLog b/muse2/ChangeLog
index 5e3c444f..ddf700ba 100644
--- a/muse2/ChangeLog
+++ b/muse2/ChangeLog
@@ -1,7 +1,8 @@
+27.02.2011:
+ - Fixed piano roll controller graph text drawing (finally!). (Tim)
26.02.2011:
- Fixed some piano roll controller graph drawing issues. (Tim)
Draw velocities on top of grid, but draw non-velocity items behind grid.
- Working on text overlay smearing...
24.02.2011:
- Improved default midi auto-connections. (Tim p4.0.17)
Midi ports list default input routes column now shows 'all' by default.
diff --git a/muse2/muse/ctrl/ctrlcanvas.cpp b/muse2/muse/ctrl/ctrlcanvas.cpp
index d8281b1e..6f37d1ee 100644
--- a/muse2/muse/ctrl/ctrlcanvas.cpp
+++ b/muse2/muse/ctrl/ctrlcanvas.cpp
@@ -12,6 +12,7 @@
#include <QCursor>
#include <QMouseEvent>
+#include "app.h"
#include "globals.h"
#include "ctrledit.h"
#include "midieditor.h"
@@ -108,6 +109,7 @@ CtrlCanvas::CtrlCanvas(MidiEditor* e, QWidget* parent, int xmag,
const char* name, CtrlPanel* pnl) : View(parent, xmag, 1, name)
{
setBg(Qt::white);
+ setFont(config.fonts[3]);
editor = e;
drag = DRAG_OFF;
tool = PointerTool;
@@ -133,6 +135,7 @@ CtrlCanvas::CtrlCanvas(MidiEditor* e, QWidget* parent, int xmag,
setCurTrackAndPart();
}
connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
+ connect(muse, SIGNAL(configChanged()), SLOT(configChanged()));
curDrumInstrument = editor->curDrumInstrument();
//printf("CtrlCanvas::CtrlCanvas curDrumInstrument:%d\n", curDrumInstrument);
@@ -339,6 +342,15 @@ bool CtrlCanvas::setCurTrackAndPart()
}
//---------------------------------------------------------
+// configChanged
+//---------------------------------------------------------
+
+void CtrlCanvas::configChanged()
+{
+ songChanged(SC_CONFIG);
+}
+
+//---------------------------------------------------------
// songChanged
// all marked parts are added to the internal event list
//---------------------------------------------------------
@@ -349,6 +361,9 @@ void CtrlCanvas::songChanged(int type)
if(type == SC_MIDI_CONTROLLER)
return;
+ if(type & SC_CONFIG)
+ setFont(config.fonts[3]);
+
bool changed = false;
if(type & (SC_CONFIG | SC_PART_MODIFIED | SC_SELECTION))
changed = setCurTrackAndPart();
@@ -1240,8 +1255,11 @@ void CtrlCanvas::pdrawItems(QPainter& p, const QRect& rect, const MidiPart* part
int w = rect.width() + 2;
int wh = height();
+ noEvents=true;
+
if(velo)
{
+ noEvents=false;
for(iCEvent i = items.begin(); i != items.end(); ++i)
{
CEvent* e = *i;
@@ -1292,9 +1310,10 @@ void CtrlCanvas::pdrawItems(QPainter& p, const QRect& rect, const MidiPart* part
}
int x1 = rect.x();
int lval = CTRL_VAL_UNKNOWN;
- noEvents=false;
+ ///noEvents=false;
for (iCEvent i = items.begin(); i != items.end(); ++i)
{
+ noEvents=false;
CEvent* e = *i;
// Draw unselected part controller events (lines) on top of selected part events (bars).
//if((fg && (e->part() == part)) || (!fg && (e->part() != part)))
@@ -1361,7 +1380,7 @@ void CtrlCanvas::pdrawItems(QPainter& p, const QRect& rect, const MidiPart* part
{
if(!fg) {
p.fillRect(x1, 0, (x+w) - x1, wh, Qt::darkGray);
- noEvents=true;
+ ///noEvents=true;
}
}
else
@@ -1463,28 +1482,6 @@ void CtrlCanvas::pdraw(QPainter& p, const QRect& rect)
}
}
- /*
- //---------------------------------------------------
- // draw marker
- //---------------------------------------------------
-
- int xp = mapx(pos[0]);
- if (xp >= x && xp < x+w) {
- p.setPen(Qt::red);
- p.drawLine(xp, y, xp, y+h);
- }
- xp = mapx(pos[1]);
- if (xp >= x && xp < x+w) {
- p.setPen(Qt::blue);
- p.drawLine(xp, y, xp, y+h);
- }
- xp = mapx(pos[2]);
- if (xp >= x && xp < x+w) {
- p.setPen(Qt::blue);
- p.drawLine(xp, y, xp, y+h);
- }
- */
-
//---------------------------------------------------
// draw lasso
//---------------------------------------------------
@@ -1503,19 +1500,23 @@ void CtrlCanvas::pdraw(QPainter& p, const QRect& rect)
void CtrlCanvas::drawOverlay(QPainter& p)
{
- //QString s(_controller->name());
QString s(_controller ? _controller->name() : QString(""));
- p.setFont(config.fonts[3]);
+
+ //p.setFont(config.fonts[3]); // Use widget font instead.
+ p.setFont(font());
+
p.setPen(Qt::black);
- QFontMetrics fm(config.fonts[3]);
- int y = fm.lineSpacing() + 2;
- //printf("CtrlCanvas::drawOverlay fm w:%d h:%d\n", fm.width(_controller ? _controller->name() : QString("")), fm.height());
+
+ //QFontMetrics fm(config.fonts[3]); // Use widget font metrics instead.
+ //int y = fm.lineSpacing() + 2;
+ int y = fontMetrics().lineSpacing() + 2;
+
p.drawText(2, y, s);
if (noEvents) {
//p.setFont(config.fonts[3]);
//p.setPen(Qt::black);
- p.drawText(width()/2-100,height()/2-10, "Use shift + pencil or line tool to draw new events");
- //p.drawText(2 , y * 2, "Use shift + pencil or line tool to draw new events");
+ //p.drawText(width()/2-100,height()/2-10, "Use shift + pencil or line tool to draw new events");
+ p.drawText(2 , y * 2, "Use shift + pencil or line tool to draw new events");
}
}
@@ -1526,18 +1527,22 @@ void CtrlCanvas::drawOverlay(QPainter& p)
QRect CtrlCanvas::overlayRect() const
{
- QFontMetrics fm(config.fonts[3]);
+ //QFontMetrics fm(config.fonts[3]); // Use widget font metrics instead (and set a widget font) !!!
+ QFontMetrics fm(fontMetrics());
QRect r(fm.boundingRect(_controller ? _controller->name() : QString("")));
- //QRect r(0, 0, fm.width(_controller ? _controller->name() : QString("")), fm.height());
+
//r.translate(2, 2); // top/left margin
- r.translate(2, fm.lineSpacing() + 2); //
+ int y = fm.lineSpacing() + 2;
+ r.translate(2, y);
if (noEvents)
{
QRect r2(fm.boundingRect(QString("Use shift + pencil or line tool to draw new events")));
- r2.translate(width()/2-100, height()/2-10);
+ //r2.translate(width()/2-100, height()/2-10);
+ r2.translate(2, y * 2);
r |= r2;
}
+ //printf("CtrlCanvas::overlayRect x:%d y:%d w:%d h:%d\n", r.x(), r.y(), r.width(), r.height());
return r;
}
diff --git a/muse2/muse/ctrl/ctrlcanvas.h b/muse2/muse/ctrl/ctrlcanvas.h
index e76bf71c..e06874e2 100644
--- a/muse2/muse/ctrl/ctrlcanvas.h
+++ b/muse2/muse/ctrl/ctrlcanvas.h
@@ -141,6 +141,7 @@ class CtrlCanvas : public View {
private slots:
void songChanged(int type);
+ void configChanged();
void setCurDrumInstrument(int);
public slots:
diff --git a/muse2/muse/widgets/view.cpp b/muse2/muse/widgets/view.cpp
index 3637e320..fb480527 100644
--- a/muse2/muse/widgets/view.cpp
+++ b/muse2/muse/widgets/view.cpp
@@ -141,12 +141,39 @@ void View::setXPos(int x)
#else
scroll(delta, 0);
- QRect olr = overlayRect().translated(delta, 0);
- //olr.setHeight(height());
- //olr.setWidth(olr.width() * 2);
- //printf("scroll update: x:%d y:%d w:%d h:%d\n", olr.x(), olr.y(), olr.width(), olr.height());
- //repaint(overlayRect().translated(delta, 0));
- update(olr);
+ QRect olr = overlayRect();
+ // Is there an overlay?
+ if(!olr.isNull())
+ {
+ // Are we shifting right (moving left)?
+ if(delta >= 0)
+ {
+ // Translate not good - need to set x to delta.
+ //olr.translate(delta, 0);
+ olr.setX(delta);
+ olr.setWidth(olr.x() + olr.width() + delta);
+ }
+ else
+ // We are shifting left (moving right).
+ {
+ // Translate not good - need to limit x to 0.
+ //olr.translate(delta, 0);
+ olr.setX(olr.x() + delta);
+ }
+
+ if(olr.x() < 0)
+ olr.setX(0);
+ if(olr.right() > width())
+ olr.setRight(width());
+
+ if(olr.y() < 0)
+ olr.setY(0);
+ if(olr.bottom() > height())
+ olr.setBottom(height());
+
+ //printf("scroll X update: x:%d y:%d w:%d h:%d\n", olr.x(), olr.y(), olr.width(), olr.height());
+ update(olr);
+ }
#endif
}
@@ -201,8 +228,39 @@ void View::setYPos(int y)
#else
scroll(0, delta);
- //repaint(overlayRect().translate(0, delta));
- update(overlayRect().translated(0, delta));
+ QRect olr = overlayRect();
+ // Is there an overlay?
+ if(!olr.isNull())
+ {
+ // Are we shifting down (moving up)?
+ if(delta >= 0)
+ {
+ // Translate not good - need to set y to delta.
+ //olr.translate(0, delta);
+ olr.setY(delta);
+ olr.setHeight(olr.y() + olr.height() + delta);
+ }
+ else
+ // We are shifting up (moving down).
+ {
+ // Translate not good - need to limit y to 0.
+ //olr.translate(0, delta);
+ olr.setY(olr.y() + delta);
+ }
+
+ if(olr.x() < 0)
+ olr.setX(0);
+ if(olr.right() > width())
+ olr.setRight(width());
+
+ if(olr.y() < 0)
+ olr.setY(0);
+ if(olr.bottom() > height())
+ olr.setBottom(height());
+
+ //printf("scroll Y update: x:%d y:%d w:%d h:%d\n", olr.x(), olr.y(), olr.width(), olr.height());
+ update(olr);
+ }
#endif
}
@@ -247,39 +305,7 @@ void View::paintEvent(QPaintEvent* ev)
p.drawPixmap(ev->rect().topLeft(), pm, ev->rect());
#else
-
- /*
- QRect er = ev->rect();
- QRect or = overlayRect();
- // Is there an overlay to be drawn? Is it not already fully contained by the requested paint rectangle?
- if(!or.isNull() && !er.contains(or))
- {
- // Is at least part of the overlay contained by the paint rectangle?
- if(!(er & or).isNull())
- {
- // Then we only need one paint pass...
- // TODO: Controller canvas ignores paint rectangle height.
- // So we can get away with just uniting the rectangles.
- // When controller canvas is finally optimized to respect height,
- // this should be more optimized by drawing only 'subtraction'
- // of intersection result from the overlay rectangle.
- // Something like: paint(er); paint(or - (er & or));
- // But there's no '-' operator. Hmm how to do that...
- paint(er | or);
- }
- else
- {
- // Then we need two separate paint passes...
- // Paint the requested rectangle as usual.
- paint(er);
- // Paint the overlay rectangle portion as well.
- paint(or);
- }
- }
- */
-
paint(ev->rect());
- //paint(er);
#endif
}