/* * Copyright 2008 Ben Boeckel * * 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 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ // Header include #include "TileItem.h" // Sigmod includes #include "../sigmod/MapTile.h" #include "../sigmod/Sigmod.h" #include "../sigmod/Sprite.h" #include "../sigmod/Tile.h" // Sigcore includes #include "../sigcore/Script.h" // KDE includes #include #include // Qt includes #include #include #include Sigmodr::TileItem::TileItem(Sigmod::MapTile* tile, QObject* parent) : QObject(parent), m_tile(tile) { connect(m_tile, SIGNAL(changed()), this, SLOT(tileChanged())); tileChanged(); setAcceptHoverEvents(true); Sigcore::Script script = m_tile->sigmod()->tileById(m_tile->tile())->script(); m_action = new Kross::Action(this, QString("tile-%1").arg(m_tile->id())); m_action->addObject(this, "object"); m_action->setInterpreter(script.interpreter()); m_action->setCode(script.script().toUtf8()); m_action->trigger(); } QRectF Sigmodr::TileItem::boundingRect() const { return m_pixmap.rect(); } void Sigmodr::TileItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { Q_UNUSED(widget) if (m_pixmap.isNull()) return; if (!(flags() & QGraphicsItem::ItemIsSelectable)) { QPixmap temp(m_pixmap.size()); temp.fill(Qt::transparent); QPainter p; p.begin(&temp); p.setCompositionMode(QPainter::CompositionMode_DestinationIn); p.fillRect(temp.rect(), QColor(0, 0, 0, 127)); p.end(); painter->drawPixmap(0, 0, temp); } painter->drawPixmap(0, 0, m_pixmap); if (option->state & QStyle::State_HasFocus) { painter->setPen(QPen(KStatefulBrush(KColorScheme::Selection, KColorScheme::FocusColor).brush(QPalette::Active), 6)); painter->drawRect(m_pixmap.rect()); } else if (option->state & QStyle::State_Selected) { painter->setPen(QPen(KStatefulBrush(KColorScheme::Selection, KColorScheme::ActiveBackground).brush(QPalette::Active), 6)); painter->drawRect(m_pixmap.rect()); } else if ((option->state & QStyle::State_MouseOver) && (flags() & QGraphicsItem::ItemIsSelectable)) { painter->setPen(QPen(KStatefulBrush(KColorScheme::Selection, KColorScheme::HoverColor).brush(QPalette::Active), 6)); painter->drawRect(m_pixmap.rect()); } } void Sigmodr::TileItem::setZIndex(const int zIndex) { if (zIndex < INT_MAX) m_tile->setZIndex(zIndex); } void Sigmodr::TileItem::changeSprite(const int spriteId) { const Sigmod::Sprite* sprite = m_tile->sigmod()->spriteById(spriteId); if (sprite) m_pixmap.loadFromData(sprite->sprite()); update(); } void Sigmodr::TileItem::mousePressEvent(QGraphicsSceneMouseEvent* event) { QGraphicsItem::mousePressEvent(event); update(); } void Sigmodr::TileItem::mouseMoveEvent(QGraphicsSceneMouseEvent* event) { QGraphicsItem::mouseMoveEvent(event); m_tile->setPosition(scenePos().toPoint()); } void Sigmodr::TileItem::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) { QGraphicsItem::mouseReleaseEvent(event); update(); } void Sigmodr::TileItem::tileChanged() { setPos(m_tile->position()); setZValue(m_tile->zIndex()); update(); }