Add BB and Pattern item subclasses, play with glossy TCOs

git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@2014 0778d3d1-df1d-0410-868b-ea421aaaa00d
This commit is contained in:
Paul Giblock
2009-02-11 04:14:00 +00:00
parent f057a52ab9
commit d5234ed7a2
7 changed files with 476 additions and 4 deletions

View File

@@ -17,6 +17,15 @@
- Commit initial version of QGraphicsScene-based Song Editor
- Please save bugreports for another week or so, this is immature code
* src/gui/tracks/track_content_object_item.cpp:
* src/gui/tracks/track_item.cpp:
* src/gui/tracks/bb_tco_item.cpp:
* src/gui/tracks/pattern_item.cpp:
* include/gui/tracks/pattern_item.h:
* include/gui/tracks/bb_tco_item.h:
- Add BB and Pattern subclasses
- Play with some styling, about to move style code into lmmsStyle
2009-02-09 Paul Giblock <drfaygo/at/gmail/dot/com>
* include/basic_filters.h:

View File

@@ -0,0 +1,36 @@
#ifndef _BB_TCO_ITEM_H_
#define _BB_TCO_ITEM_H_
#include <QtCore/QVector>
#include <QGraphicsScene>
#include <QGraphicsItem>
#include <QTimeLine>
#include <QGraphicsItemAnimation>
#include <QPainter>
#include <math.h>
class trackContentObject;
class TrackItem;
#include "gui/tracks/track_content_object_item.h"
class BbTrackContentObjectItem : public TrackContentObjectItem
{
Q_OBJECT
public:
BbTrackContentObjectItem( TrackItem * _track, trackContentObject * _object );
void paint( QPainter * _painter, const QStyleOptionGraphicsItem * _option,
QWidget * _widget );
QVariant itemChange( GraphicsItemChange _change, const QVariant & _value );
protected:
virtual void mousePressEvent( QGraphicsSceneMouseEvent * event );
virtual void mouseReleaseEvent( QGraphicsSceneMouseEvent * event );
};
#endif

View File

@@ -0,0 +1,36 @@
#ifndef _PATTERN_ITEM_H_
#define _PATTERN_ITEM_H_
#include <QtCore/QVector>
#include <QGraphicsScene>
#include <QGraphicsItem>
#include <QTimeLine>
#include <QGraphicsItemAnimation>
#include <QPainter>
#include <math.h>
#include "gui/tracks/track_content_object_item.h"
class trackContentObject;
class TrackItem;
class PatternItem : public TrackContentObjectItem
{
Q_OBJECT
public:
PatternItem( TrackItem * _track, trackContentObject * _object );
void paint( QPainter * _painter, const QStyleOptionGraphicsItem * _option,
QWidget * _widget );
QVariant itemChange( GraphicsItemChange _change, const QVariant & _value );
protected:
virtual void mousePressEvent( QGraphicsSceneMouseEvent * event );
virtual void mouseReleaseEvent( QGraphicsSceneMouseEvent * event );
};
#endif

View File

@@ -0,0 +1,194 @@
#include <QObject>
#include <QGraphicsItem>
#include <QTimeLine>
#include <QGraphicsItemAnimation>
#include <QStyleOptionGraphicsItem>
#include "gui/tracks/bb_tco_item.h"
#include "gui/tracks/track_content_object_item.h"
#include "gui/tracks/track_container_scene.h"
#include "gui/tracks/track_item.h"
#include "track.h"
namespace BBTcoStuff {
QLinearGradient getGradient( const QColor & _col, const QRectF & _rect )
{
QLinearGradient g( _rect.topLeft(), _rect.bottomLeft() );
qreal hue = _col.hueF();
qreal value = _col.valueF();
qreal saturation = _col.saturationF();
QColor c = _col;
c.setHsvF( hue, 0.42 * saturation, 0.98 * value );
g.setColorAt( 0, c );
c.setHsvF( hue, 0.58 * saturation, 0.95 * value );
g.setColorAt( 0.25, c );
c.setHsvF( hue, 0.70 * saturation, 0.93 * value );
g.setColorAt( 0.5, c );
c.setHsvF( hue, 0.95 * saturation, 0.9 * value );
g.setColorAt( 0.501, c );
c.setHsvF( hue * 0.95, 0.95 * saturation, 0.95 * value );
g.setColorAt( 0.75, c );
c.setHsvF( hue * 0.90, 0.95 * saturation, 1 * value );
g.setColorAt( 1.0, c );
return g;
}
QLinearGradient darken( const QLinearGradient & _gradient )
{
QGradientStops stops = _gradient.stops();
for (int i = 0; i < stops.size(); ++i) {
QColor color = stops.at(i).second;
stops[i].second = color.darker(160);
}
QLinearGradient g = _gradient;
g.setStops(stops);
return g;
}
void drawPath( QPainter *p, const QPainterPath &path,
const QColor &col, const QString &name,
bool dark = false )
{
const QRectF pathRect = path.boundingRect();
const QLinearGradient baseGradient = getGradient(col, pathRect);
const QLinearGradient darkGradient = darken(baseGradient);
p->setOpacity(0.25);
// glow
if (dark)
p->strokePath(path, QPen(darkGradient, 4));
else
p->strokePath(path, QPen(baseGradient, 4));
p->setOpacity(1.0);
// fill
if (dark)
p->fillPath(path, darkGradient);
else
p->fillPath(path, baseGradient);
QLinearGradient g(pathRect.topLeft(), pathRect.topRight());
g.setCoordinateMode(QGradient::ObjectBoundingMode);
p->setOpacity(0.2);
p->fillPath(path, g);
p->setOpacity(0.5);
// highlight
if (dark)
p->strokePath(path, QPen(col.lighter(160).darker(160), 2));
else
p->strokePath(path, QPen(col.lighter(160), 2));
}
}
using namespace BBTcoStuff;
BbTrackContentObjectItem::BbTrackContentObjectItem( TrackItem * _track, trackContentObject * _object ) :
TrackContentObjectItem( _track, _object )
{
}
void BbTrackContentObjectItem::paint( QPainter * _painter,
const QStyleOptionGraphicsItem * _option, QWidget * _widget )
{
QColor col;
if( !isSelected() )
{
col = QColor( 0x00, 0x33, 0x99 );
}
else
{
col = QColor( 0x00, 0x99, 0x33 );
}
QRectF rc = boundingRect();
qreal xscale = _option->matrix.m11();
_painter->save();
_painter->scale( 1.0f/xscale, 1.0f );
rc.setWidth( rc.width() * xscale );
QPainterPath path;
path.addRoundedRect(2, 2, rc.width()-4, rc.height()-4, 4, 4);
drawPath( _painter, path, col, "hah", false );
const float cellW = TrackContainerScene::DEFAULT_CELL_WIDTH;
_painter->setOpacity(0.2);
_painter->setRenderHint( QPainter::Antialiasing, false );
_painter->setPen( QColor(0, 0, 0) );
for( int i = 0; i < m_tco->length().getTact(); ++i )
{
float x = cellW * i;
_painter->drawLine(x, 2, x, rc.height()-4);
}
_painter->translate( 1, 0 );
_painter->setPen( col.lighter(160) );
for( int i = 0; i < m_tco->length().getTact(); ++i )
{
float x = cellW * i;
_painter->drawLine(x, 2, x, rc.height()-4);
}
_painter->setRenderHint( QPainter::Antialiasing, true );
_painter->restore();
return;
QColor col0 = col.light( 130 );
QColor col1 = col.light( 70 );
QColor col2 = col.light( 40 );
QLinearGradient lingrad( 0, 0, 0, rc.height() );
lingrad.setColorAt( 0, col0 );
lingrad.setColorAt( 1, col1 );
QLinearGradient bordergrad( 0, 0, 0, rc.height() );
bordergrad.setColorAt( 1, col2 );
bordergrad.setColorAt( 0, col1 );
rc.adjust( 0, 0, -1, -1 );
_painter->setRenderHint( QPainter::Antialiasing, true );
_painter->setBrush( lingrad );
_painter->setPen( QPen( bordergrad, 1.5 ) ); // QColor( 6, 6, 6 ) );
_painter->drawRoundedRect( rc, 4, 4 );
_painter->setRenderHint( QPainter::Antialiasing, false );
_painter->restore();
}
QVariant BbTrackContentObjectItem::itemChange( GraphicsItemChange _change, const QVariant & _value )
{
return TrackContentObjectItem::itemChange( _change, _value );
}
void BbTrackContentObjectItem::mousePressEvent( QGraphicsSceneMouseEvent * event )
{
TrackContentObjectItem::mousePressEvent( event );
}
void BbTrackContentObjectItem::mouseReleaseEvent( QGraphicsSceneMouseEvent * event )
{
TrackContentObjectItem::mouseReleaseEvent( event );
}
#include "gui/tracks/moc_bb_tco_item.cxx"

View File

@@ -0,0 +1,179 @@
#include <QObject>
#include <QGraphicsItem>
#include <QTimeLine>
#include <QGraphicsItemAnimation>
#include <QStyleOptionGraphicsItem>
#include "gui/tracks/pattern_item.h"
#include "gui/tracks/track_content_object_item.h"
#include "gui/tracks/track_container_scene.h"
#include "gui/tracks/track_item.h"
#include "track.h"
namespace PatternItemStuff {
QLinearGradient getGradient( const QColor & _col, const QRectF & _rect )
{
QLinearGradient g( _rect.topLeft(), _rect.bottomLeft() );
qreal hue = _col.hueF();
qreal value = _col.valueF();
qreal saturation = _col.saturationF();
QColor c = _col;
c.setHsvF( hue, 0.42 * saturation, 1.08 * value );
g.setColorAt( 0, c );
c.setHsvF( hue, 0.58 * saturation, 1.05 * value );
g.setColorAt( 0.25, c );
c.setHsvF( hue, 0.70 * saturation, 1.03 * value );
g.setColorAt( 0.5, c );
c.setHsvF( hue, 0.95 * saturation, 0.9 * value );
g.setColorAt( 0.501, c );
c.setHsvF( hue * 0.95, 0.95 * saturation, 0.95 * value );
g.setColorAt( 0.75, c );
c.setHsvF( hue * 0.90, 0.95 * saturation, 1 * value );
g.setColorAt( 1.0, c );
return g;
}
QLinearGradient darken( const QLinearGradient & _gradient )
{
QGradientStops stops = _gradient.stops();
for (int i = 0; i < stops.size(); ++i) {
QColor color = stops.at(i).second;
stops[i].second = color.darker(160);
}
QLinearGradient g = _gradient;
g.setStops(stops);
return g;
}
void drawPath( QPainter *p, const QPainterPath &path,
const QColor &col, const QColor &borderCol,
bool dark = false )
{
const QRectF pathRect = path.boundingRect();
const QLinearGradient baseGradient = getGradient(col, pathRect);
const QLinearGradient darkGradient = darken(baseGradient);
p->setOpacity(0.25);
// glow
if (dark)
p->strokePath(path, QPen(darkGradient, 4));
else
p->strokePath(path, QPen(baseGradient, 4));
p->setOpacity(1.0);
// fill
if (dark)
p->fillPath(path, darkGradient);
else
p->fillPath(path, baseGradient);
/*
QLinearGradient g(pathRect.topLeft(), pathRect.topRight());
g.setCoordinateMode(QGradient::ObjectBoundingMode);
p->setOpacity(0.2);
p->fillPath(path, g);
*/
p->setOpacity(0.5);
// highlight
if (dark)
p->strokePath(path, QPen(borderCol.darker(160), 2));
else
p->strokePath(path, QPen(borderCol, 2));
}
};
using namespace PatternItemStuff;
PatternItem::PatternItem( TrackItem * _track, trackContentObject * _object ) :
TrackContentObjectItem( _track, _object )
{
}
void PatternItem::paint( QPainter * _painter,
const QStyleOptionGraphicsItem * _option, QWidget * _widget )
{
QColor col;
if( !isSelected() )
{
col = QColor( 0x00, 0x33, 0x99 );
}
else
{
col = QColor( 0x00, 0x99, 0x33 );
}
QColor colBorder = col.lighter(160);
QColor col0 = col.darker(400);
QRectF rc = boundingRect();
qreal xscale = _option->matrix.m11();
_painter->save();
_painter->scale( 1.0f/xscale, 1.0f );
rc.setWidth( rc.width() * xscale );
QPainterPath path;
path.addRoundedRect(2, 2, rc.width()-4, rc.height()-4, 4, 4);
drawPath( _painter, path, col0, colBorder, false );
_painter->restore();
return;
QColor col0a = col.darker( 300 );
QColor col1 = col.light( 70 );
QColor col2 = col.light( 40 );
QLinearGradient lingrad( 0, 0, 0, rc.height() );
lingrad.setColorAt( 0, col0 );
lingrad.setColorAt( 1, col0a );
QLinearGradient bordergrad( 0, 0, 0, rc.height() );
bordergrad.setColorAt( 1, col2 );
bordergrad.setColorAt( 0, col1 );
rc.adjust( 0, 0, -1, -1 );
_painter->setRenderHint( QPainter::Antialiasing, true );
_painter->setBrush( lingrad );
_painter->setPen( QPen( bordergrad, 1.5 ) ); // QColor( 6, 6, 6 ) );
_painter->drawRoundedRect( rc, 4, 4 );
_painter->setRenderHint( QPainter::Antialiasing, false );
_painter->restore();
}
QVariant PatternItem::itemChange( GraphicsItemChange _change, const QVariant & _value )
{
return TrackContentObjectItem::itemChange( _change, _value );
}
void PatternItem::mousePressEvent( QGraphicsSceneMouseEvent * event )
{
TrackContentObjectItem::mousePressEvent( event );
}
void PatternItem::mouseReleaseEvent( QGraphicsSceneMouseEvent * event )
{
TrackContentObjectItem::mouseReleaseEvent( event );
}
#include "gui/tracks/moc_pattern_item.cxx"

View File

@@ -9,9 +9,6 @@
#include "gui/tracks/track_item.h"
#include "track.h"
//QTimeLine TrackContentObjectItem::s_timeLine;
//QGraphicsItemAnimation TrackContentObjectItem::s_animation;
QTimeLine TrackContentObjectItem::s_snapBackTimeLine;
TrackContentObjectItem::TrackContentObjectItem( TrackItem * _track, trackContentObject * _object ) :
QObject(),

View File

@@ -4,6 +4,12 @@
#include "gui/tracks/track_content_object_item.h"
#include "gui/tracks/track_container_scene.h"
#include "gui/tracks/bb_tco_item.h"
#include "gui/tracks/pattern_item.h"
#include "bb_track.h"
#include "pattern.h"
TrackItem::TrackItem( TrackContainerScene * _scene, track * _track )
{
m_scene = _scene;
@@ -43,7 +49,22 @@ TrackItem::~TrackItem()
void TrackItem::addTCO( trackContentObject * _tco )
{
TrackContentObjectItem * tcoItem = new TrackContentObjectItem( this, _tco );
// TODO move into a factory?
TrackContentObjectItem * tcoItem;
if( bbTCO * bbTco = dynamic_cast<bbTCO *>( _tco ) )
{
tcoItem = new BbTrackContentObjectItem( this, (trackContentObject*)bbTco );
}
else if( pattern * pat = dynamic_cast<pattern *>( _tco ) )
{
tcoItem = new PatternItem( this, (trackContentObject*)pat );
}
else
{
// Whoa.
return;
}
// TODO refactor to private updateTCOGeometry
tcoItem->setPos( tcoItem->x(), y() );