You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegames/atlantik/libatlantikui/estatedetails.cpp

328 lines
8.5 KiB

// Copyright (c) 2002-2004 Rob Kaper <cap@capsi.com>
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License version 2.1 as published by the Free Software Foundation.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this library; see the file COPYING.LIB. If not, write to
// the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
// Boston, MA 02110-1301, USA.
#include <qpainter.h>
#include <qpixmap.h>
#include <qlayout.h>
#include <qptrlist.h>
#include <qregexp.h>
#include <qvgroupbox.h>
#include <kdialog.h>
#include <kglobalsettings.h>
#include <kiconloader.h>
#include <klistview.h>
#include <klocale.h>
#include <kpixmap.h>
#include <kpushbutton.h>
#include <kstdguiitem.h>
#include <kdebug.h>
#include <estate.h>
#include <estategroup.h>
#include <player.h>
#include "estatedetails.h"
#include "kwrappedlistviewitem.h"
EstateDetails::EstateDetails(Estate *estate, QString text, QWidget *parent, const char *name) : QWidget(parent, name)
{
m_pixmap = 0;
m_quartzBlocks = 0;
b_recreate = true;
m_recreateQuartz = true;
m_estate = 0;
m_closeButton = 0;
m_buttons.setAutoDelete(true);
m_mainLayout = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint());
Q_CHECK_PTR(m_mainLayout);
m_mainLayout->addItem(new QSpacerItem(KDialog::spacingHint(), KDialog::spacingHint()+50, QSizePolicy::Fixed, QSizePolicy::Minimum));
m_infoListView = new KListView(this, "infoListView");
m_infoListView->addColumn(m_estate ? m_estate->name() : QString("") );
m_infoListView->setSorting(-1);
m_mainLayout->addWidget(m_infoListView);
appendText(text);
m_buttonBox = new QHBoxLayout(m_mainLayout, KDialog::spacingHint());
m_buttonBox->setMargin(0);
m_buttonBox->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum));
setEstate(estate);
}
EstateDetails::~EstateDetails()
{
delete m_pixmap;
delete m_quartzBlocks;
delete m_infoListView;
}
void EstateDetails::paintEvent(QPaintEvent *)
{
if (m_recreateQuartz)
{
/*
if (m_quartzBlocks)
{
delete m_quartzBlocks;
m_quartzBlocks = 0;
}
if (m_estate->color().isValid())
{
m_quartzBlocks = new KPixmap();
if (m_orientation == North || m_orientation == South)
m_quartzBlocks->resize(25, m_titleHeight-2);
else
m_quartzBlocks->resize(25, m_titleWidth-2);
drawQuartzBlocks(m_quartzBlocks, *m_quartzBlocks, m_estate->color().light(60), m_estate->color());
m_quartzBlocks = rotatePixmap(m_quartzBlocks);
}
*/
m_recreateQuartz = false;
b_recreate = true;
}
if (b_recreate)
{
delete m_pixmap;
m_pixmap = new QPixmap(width(), height());
QColor greenHouse(0, 255, 0);
QColor redHotel(255, 51, 51);
QPainter painter;
painter.begin(m_pixmap, this);
painter.setPen(Qt::black);
painter.setBrush(m_estate ? m_estate->bgColor() : Qt::white);
painter.drawRect(rect());
/*
// Paint icon only when it exists and fits
if (icon!=0 && width() > icon->width() && height() > icon->height())
painter.drawPixmap( (width() - icon->width())/2, (height() - icon->height())/2, *icon);
*/
if (m_estate)
{
int titleHeight = 50;
QColor titleColor = (m_estate->color().isValid() ? m_estate->color() : m_estate->bgColor().light(80));
KPixmap* quartzBuffer = new KPixmap;
quartzBuffer->resize(25, (height()/4)-2);
QPainter quartzPainter;
quartzPainter.begin(quartzBuffer, this);
painter.setBrush(titleColor);
painter.drawRect(0, 0, width(), titleHeight);
if (m_quartzBlocks)
{
quartzPainter.drawPixmap(0, 0, *m_quartzBlocks);
painter.drawPixmap(1, 1, *quartzBuffer);
}
if (m_estate->houses() > 0)
{
int titleWidth = width() / 5;
if (m_estate->houses() == 5)
{
// Hotel
painter.setBrush(redHotel);
painter.drawRect(2, 2, titleWidth-4, titleHeight-4);
}
else
{
// Houses
painter.setBrush(greenHouse);
int h = titleHeight-4, w = titleWidth-4;
for ( unsigned int i=0 ; i < m_estate->houses() ; i++ )
painter.drawRect(2+(i*(w+2)), 2, w, h);
}
}
quartzPainter.end();
delete quartzBuffer;
// TODO: steal blur code from kicker/taskbar/taskcontainer.cpp
// Estate name
painter.setPen(Qt::white);
int fontSize = KGlobalSettings::generalFont().pointSize();
if (fontSize == -1)
fontSize = KGlobalSettings::generalFont().pixelSize();
painter.setFont(QFont(KGlobalSettings::generalFont().family(), fontSize * 2, QFont::Bold));
painter.drawText(KDialog::marginHint(), KDialog::marginHint(), width()-KDialog::marginHint(), titleHeight, Qt::AlignJustify, m_estate->name());
painter.setPen(Qt::black);
int xText = 0;
// Estate group
if (m_estate->estateGroup())
{
xText = titleHeight - fontSize - KDialog::marginHint();
painter.setFont(QFont(KGlobalSettings::generalFont().family(), fontSize, QFont::Bold));
painter.drawText(5, xText, width()-10, titleHeight, Qt::AlignRight, m_estate->estateGroup()->name().upper());
}
xText = titleHeight + fontSize + 5;
painter.setFont(QFont(KGlobalSettings::generalFont().family(), fontSize, QFont::Normal));
}
b_recreate = false;
}
bitBlt(this, 0, 0, m_pixmap);
}
void EstateDetails::resizeEvent(QResizeEvent *)
{
m_recreateQuartz = true;
b_recreate = true;
}
void EstateDetails::addDetails()
{
if (m_estate)
{
QListViewItem *infoText = 0;
// Price
if (m_estate->price())
{
infoText = new QListViewItem(m_infoListView, m_infoListView->lastItem(), i18n("Price: %1").arg(m_estate->price()));
infoText->setPixmap(0, QPixmap(SmallIcon("info")));
}
// Owner, houses, isMortgaged
if (m_estate && m_estate->canBeOwned())
{
infoText = new QListViewItem(m_infoListView, m_infoListView->lastItem(), i18n("Owner: %1").arg(m_estate->owner() ? m_estate->owner()->name() : i18n("unowned")));
infoText->setPixmap(0, QPixmap(SmallIcon("info")));
if (m_estate->isOwned())
{
infoText = new QListViewItem(m_infoListView, m_infoListView->lastItem(), i18n("Houses: %1").arg(m_estate->houses()));
infoText->setPixmap(0, QPixmap(SmallIcon("info")));
infoText = new QListViewItem(m_infoListView, m_infoListView->lastItem(), i18n("Mortgaged: %1").arg(m_estate->isMortgaged() ? i18n("Yes") : i18n("No")));
infoText->setPixmap(0, QPixmap(SmallIcon("info")));
}
}
}
}
void EstateDetails::addButton(QString command, QString caption, bool enabled)
{
KPushButton *button = new KPushButton(caption, this);
m_buttons.append(button);
m_buttonCommandMap[(QObject *)button] = command;
m_buttonBox->addWidget(button);
if (m_estate)
{
QColor bgColor, fgColor;
bgColor = m_estate->bgColor().light(110);
fgColor = ( bgColor.red() + bgColor.green() + bgColor.blue() < 255 ) ? Qt::white : Qt::black;
button->setPaletteForegroundColor( fgColor );
button->setPaletteBackgroundColor( bgColor );
}
button->setEnabled(enabled);
button->show();
connect(button, SIGNAL(pressed()), this, SLOT(buttonPressed()));
}
void EstateDetails::addCloseButton()
{
if (!m_closeButton)
{
m_closeButton = new KPushButton(KStdGuiItem::close(), this);
m_buttonBox->addWidget(m_closeButton);
m_closeButton->show();
connect(m_closeButton, SIGNAL(pressed()), this, SIGNAL(buttonClose()));
}
}
void EstateDetails::setEstate(Estate *estate)
{
if (m_estate != estate)
{
m_estate = estate;
m_infoListView->setColumnText( 0, m_estate ? m_estate->name() : QString("") );
b_recreate = true;
update();
}
}
void EstateDetails::setText(QString text)
{
m_infoListView->clear();
appendText(text);
}
void EstateDetails::appendText(QString text)
{
if ( text.isEmpty() )
return;
KWrappedListViewItem *infoText = new KWrappedListViewItem(m_infoListView, m_infoListView->lastItem(), text);
if ( text.find( QRegExp("rolls") ) != -1 )
infoText->setPixmap(0, QPixmap(SmallIcon("roll")));
else
infoText->setPixmap(0, QPixmap(SmallIcon("atlantik")));
m_infoListView->ensureItemVisible( infoText );
}
void EstateDetails::clearButtons()
{
if (m_closeButton)
{
delete m_closeButton;
m_closeButton = 0;
}
// Delete buttons
m_buttons.clear();
m_buttonCommandMap.clear();
}
void EstateDetails::buttonPressed()
{
emit buttonCommand(QString(m_buttonCommandMap[(QObject *)QObject::sender()]));
}
#include "estatedetails.moc"