/*************************************************************************** * __________ __ ___. * 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 #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(origin.x()), 0); node->modParam(static_cast(origin.y()), 1); node->modParam(static_cast(bounds.width()), 2); node->modParam(static_cast(bounds.height()), 3); }