rockbox/utils/themeeditor/graphics/rbalbumart.cpp

108 lines
3.6 KiB
C++
Raw Normal View History

/***************************************************************************
* __________ __ ___.
* 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>
#include "parsetreenode.h"
RBAlbumArt::RBAlbumArt(QGraphicsItem *parent, int x, int y, int maxWidth,
int maxHeight, int artWidth, int artHeight,
ParseTreeNode* node, char hAlign, char vAlign)
: RBMovable(parent),artWidth(artWidth),
artHeight(artHeight), hAlign(hAlign), vAlign(vAlign),
texture(":/render/albumart.png"), node(node)
{
size = QRectF(0, 0, maxWidth, maxHeight);
setFlag(ItemSendsGeometryChanges, false);
setPos(x, y);
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);
RBMovable::paint(painter, option, widget);
}
void RBAlbumArt::saveGeometry()
{
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);
}