2010-06-30 19:35:00 +00:00
|
|
|
/***************************************************************************
|
|
|
|
* __________ __ ___.
|
|
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
|
|
* \/ \/ \/ \/ \/
|
|
|
|
* $Id$
|
|
|
|
*
|
|
|
|
* Copyright (C) 2010 Robert Bieber
|
|
|
|
*
|
|
|
|
* 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; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
|
|
* KIND, either express or implied.
|
|
|
|
*
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#include "rbalbumart.h"
|
|
|
|
|
|
|
|
#include <QPainter>
|
|
|
|
|
2010-08-05 08:03:32 +00:00
|
|
|
#include "parsetreenode.h"
|
|
|
|
|
2010-06-30 19:35:00 +00:00
|
|
|
RBAlbumArt::RBAlbumArt(QGraphicsItem *parent, int x, int y, int maxWidth,
|
2010-08-05 08:03:32 +00:00
|
|
|
int maxHeight, int artWidth, int artHeight,
|
|
|
|
ParseTreeNode* node, char hAlign, char vAlign)
|
2010-08-05 22:31:46 +00:00
|
|
|
: RBMovable(parent),artWidth(artWidth),
|
|
|
|
artHeight(artHeight), hAlign(hAlign), vAlign(vAlign),
|
2010-08-05 08:03:32 +00:00
|
|
|
texture(":/render/albumart.png"), node(node)
|
2010-06-30 19:35:00 +00:00
|
|
|
{
|
2010-08-05 22:31:46 +00:00
|
|
|
size = QRectF(0, 0, maxWidth, maxHeight);
|
2010-08-05 08:03:32 +00:00
|
|
|
setFlag(ItemSendsGeometryChanges, false);
|
|
|
|
|
2010-08-03 22:29:26 +00:00
|
|
|
setPos(x, y);
|
2010-06-30 19:35:00 +00:00
|
|
|
hide();
|
|
|
|
}
|
|
|
|
|
|
|
|
void RBAlbumArt::paint(QPainter *painter,
|
|
|
|
const QStyleOptionGraphicsItem *option, QWidget *widget)
|
|
|
|
{
|
|
|
|
QRectF drawArea;
|
|
|
|
|
|
|
|
/* Making sure the alignment flags are sane */
|
|
|
|
if(hAlign != 'c' && hAlign != 'l' && hAlign != 'r')
|
|
|
|
hAlign = 'c';
|
|
|
|
if(vAlign != 'c' && vAlign != 't' && vAlign != 'b')
|
|
|
|
vAlign = 'c';
|
|
|
|
|
|
|
|
if(artWidth <= size.width() && artHeight <= size.height())
|
|
|
|
{
|
|
|
|
/* If the art is smaller than the viewport, just center it up */
|
|
|
|
drawArea.setX((size.width() - artWidth) / 2);
|
|
|
|
drawArea.setY((size.height() - artHeight) / 2);
|
|
|
|
drawArea.setWidth(artWidth);
|
|
|
|
drawArea.setHeight(artHeight);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Otherwise, figure out our scale factor, and which dimension needs
|
|
|
|
* to be scaled, and how to align said dimension
|
|
|
|
*/
|
|
|
|
double xScale = size.width() / artWidth;
|
|
|
|
double yScale = size.height() / artHeight;
|
|
|
|
double scale = xScale < yScale ? xScale : yScale;
|
|
|
|
|
|
|
|
double scaleWidth = artWidth * scale;
|
|
|
|
double scaleHeight = artHeight * scale;
|
|
|
|
|
|
|
|
if(hAlign == 'l')
|
|
|
|
drawArea.setX(0);
|
|
|
|
else if(hAlign == 'c')
|
|
|
|
drawArea.setX((size.width() - scaleWidth) / 2 );
|
|
|
|
else
|
|
|
|
drawArea.setX(size.width() - scaleWidth);
|
|
|
|
|
|
|
|
if(vAlign == 't')
|
|
|
|
drawArea.setY(0);
|
|
|
|
else if(vAlign == 'c')
|
|
|
|
drawArea.setY((size.height() - scaleHeight) / 2);
|
|
|
|
else
|
|
|
|
drawArea.setY(size.height() - scaleHeight);
|
|
|
|
|
|
|
|
drawArea.setWidth(scaleWidth);
|
|
|
|
drawArea.setHeight(scaleHeight);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
painter->fillRect(drawArea, texture);
|
2010-08-03 22:29:26 +00:00
|
|
|
|
|
|
|
RBMovable::paint(painter, option, widget);
|
|
|
|
}
|
|
|
|
|
|
|
|
void RBAlbumArt::saveGeometry()
|
|
|
|
{
|
|
|
|
|
2010-08-05 08:03:32 +00:00
|
|
|
QPointF origin = pos();
|
|
|
|
QRectF bounds = boundingRect();
|
|
|
|
|
|
|
|
node->modParam(static_cast<int>(origin.x()), 0);
|
|
|
|
node->modParam(static_cast<int>(origin.y()), 1);
|
|
|
|
node->modParam(static_cast<int>(bounds.width()), 2);
|
|
|
|
node->modParam(static_cast<int>(bounds.height()), 3);
|
2010-06-30 19:35:00 +00:00
|
|
|
}
|