author | unc0rr |
Thu, 03 Mar 2011 22:15:13 +0300 | |
changeset 4975 | 31da8979e5b1 |
parent 4520 | e7882bd1a894 |
permissions | -rw-r--r-- |
/* * Copyright (c) 2009 Nokia Corporation. */ #include "qaspectratiolayout.h" QAspectRatioLayout::QAspectRatioLayout(QWidget* parent, int spacing) : QLayout(parent) { init(spacing); } QAspectRatioLayout::QAspectRatioLayout(int spacing) { init(spacing); } QAspectRatioLayout::~QAspectRatioLayout() { delete item; delete lastReceivedRect; delete _geometry; } void QAspectRatioLayout::init(int spacing) { item = 0; lastReceivedRect = new QRect(0, 0, 0, 0); _geometry = new QRect(0, 0, 0, 0); setSpacing(spacing); } /* Adds item if place isn't already taken. */ void QAspectRatioLayout::add(QLayoutItem* item) { if(!hasItem()) { replaceItem(item); } } /* Adds item if place isn't already taken. */ void QAspectRatioLayout::addItem(QLayoutItem* item) { if(!hasItem()) { replaceItem(item); } } /* Adds widget if place isn't already taken. */ void QAspectRatioLayout::addWidget(QWidget* widget) { if(!hasItem()) { replaceItem(new QWidgetItem(widget)); } } /* Returns the item pointer and dereferences it here. */ QLayoutItem* QAspectRatioLayout::take() { QLayoutItem* item = 0; if(this->hasItem()) { item = this->item; this->item = 0; } return item; } /* Returns the item pointer and dereferences it here. */ QLayoutItem* QAspectRatioLayout::takeAt(int index) { if(index != 0) { return 0; } return this->take(); } /* Returns the item pointer. */ QLayoutItem* QAspectRatioLayout::itemAt(int index) const { if(index != 0) { return 0; } if(hasItem()) { return this->item; } return 0; } /* Checks if we have an item. */ bool QAspectRatioLayout::hasItem() const { return this->item != 0; } /* Returns the count of items which can be either 0 or 1. */ int QAspectRatioLayout::count() const { int returnValue = 0; if(hasItem()) { returnValue = 1; } return returnValue; } /* Replaces the item with the new and returns the old. */ QLayoutItem* QAspectRatioLayout::replaceItem(QLayoutItem* item) { QLayoutItem* old = 0; if(this->hasItem()) { old = this->item; } this->item = item; setGeometry(*this->_geometry); return old; } /* Tells which way layout expands. */ Qt::Orientations QAspectRatioLayout::expandingDirections() const { return Qt::Horizontal | Qt::Vertical; } /* Tells which size is preferred. */ QSize QAspectRatioLayout::sizeHint() const { return this->item->minimumSize(); } /* Tells minimum size. */ QSize QAspectRatioLayout::minimumSize() const { return this->item->minimumSize(); } /* * Tells if heightForWidth calculations is handled. * It isn't since width isn't enough to calculate * proper size. */ bool QAspectRatioLayout::hasHeightForWidth() const { return false; } /* Replaces lastReceivedRect. */ void QAspectRatioLayout::setLastReceivedRect(const QRect& rect) { QRect* oldRect = this->lastReceivedRect; this->lastReceivedRect = new QRect(rect.topLeft(), rect.size()); delete oldRect; } /* Returns geometry */ QRect QAspectRatioLayout::geometry() { return QRect(*this->_geometry); } /* Sets geometry to given size. */ void QAspectRatioLayout::setGeometry(const QRect& rect) { /* * We check if the item is set and * if size is the same previously received. * If either is false nothing is done. */ if(!this->hasItem() || areRectsEqual(*this->lastReceivedRect, rect)) { return; } /* Replace the last received rectangle. */ setLastReceivedRect(rect); /* Calculate proper size for the item relative to the received size. */ QSize properSize = calculateProperSize(rect.size()); /* Calculate center location in the rect and with item size. */ QPoint properLocation = calculateCenterLocation(rect.size(), properSize); /* Set items geometry */ this->item->setGeometry(QRect(properLocation, properSize)); QRect* oldRect = this->_geometry; /* Cache the calculated geometry. */ this->_geometry = new QRect(properLocation, properSize); delete oldRect; /* Super classes setGeometry */ QLayout::setGeometry(*this->_geometry); } /* Takes the shortest side and creates QSize * with the shortest side as width and height. */ QSize QAspectRatioLayout::calculateProperSize(QSize from) const { QSize properSize; if(from.height() * 2 < from.width()) { properSize.setHeight(from.height() - this->margin()); properSize.setWidth(from.height() * 2 - this->margin()); } else { properSize.setWidth(from.width() - this->margin()); properSize.setHeight(from.width() / 2 - this->margin()); } return properSize; } /* Calculates center location from the given height and width for item size. */ QPoint QAspectRatioLayout::calculateCenterLocation(QSize from, QSize itemSize) const { QPoint centerLocation; if((from.width() - itemSize.width()) > 0) { centerLocation.setX((from.width() - itemSize.width())/2); } if((from.height() - itemSize.height()) > 0) { centerLocation.setY((from.height() - itemSize.height())/2); } return centerLocation; } /* Compares if two QRects are equal. */ bool QAspectRatioLayout::areRectsEqual(const QRect& a, const QRect& b) const { bool result = false; if(a.x() == b.x() && a.y() == b.y() && a.height() == b.height() && a.width() == b.width()) { result = true; } return result; }