[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdegames/kolf
From: Stefan Majewsky <majewsky () gmx ! net>
Date: 2010-11-10 23:29:37
Message-ID: 20101110232937.1A2A9AC8AA () svn ! kde ! org
[Download RAW message or body]
SVN commit 1195395 by majewsky:
Refactor Sign below Kolf::RectangleItem, add Overlay and Config for RectangleItem.
M +1 -1 kolf.cpp
M +1 -0 landscape.cpp
M +144 -4 obstacles.cpp
M +50 -0 obstacles.h
--- trunk/KDE/kdegames/kolf/kolf.cpp #1195394:1195395
@@ -64,7 +64,7 @@
m_itemFactory.registerType<Kolf::BlackHole>("blackhole", i18n("Black Hole"));
m_itemFactory.registerType<Floater>("floater", i18n("Floater"));
m_itemFactory.registerType<Kolf::Bridge>("bridge", i18n("Bridge"));
- m_itemFactory.registerType<Sign>("sign", i18n("Sign"));
+ m_itemFactory.registerType<Kolf::Sign>("sign", i18n("Sign"));
m_itemFactory.registerType<Kolf::Bumper>("bumper", i18n("Bumper"));
//NOTE: The plugin mechanism has been removed because it is not used anyway.
--- trunk/KDE/kdegames/kolf/landscape.cpp #1195394:1195395
@@ -106,6 +106,7 @@
Kolf::LandscapeOverlay::LandscapeOverlay(Kolf::LandscapeItem* item)
: Kolf::Overlay(item, item)
{
+ //TODO: code duplication to Kolf::RectangleOverlay
for (int i = 0; i < 4; ++i)
{
Kolf::OverlayHandle* handle = new \
Kolf::OverlayHandle(Kolf::OverlayHandle::CircleShape, this);
--- trunk/KDE/kdegames/kolf/obstacles.cpp #1195394:1195395
@@ -22,8 +22,12 @@
#include "game.h"
#include "shape.h"
+#include <QCheckBox>
+#include <QGridLayout>
+#include <QLabel>
#include <QTimer>
#include <KConfigGroup>
+#include <KLineEdit>
#include <KRandom>
//BEGIN Kolf::Bumper
@@ -186,8 +190,10 @@
, CanvasItem(world)
, m_wallPen(QColor("#92772D").darker(), 3)
, m_walls(Kolf::RectangleWallCount, 0)
+ , m_shape(new Kolf::RectShape(QRectF(0, 0, 1, 1)))
{
setZValue(998);
+ addShape(m_shape);
//default size
setSize(type == "sign" ? QSize(110, 40) : QSize(80, 40));
}
@@ -242,6 +248,7 @@
void Kolf::RectangleItem::setSize(const QSizeF& size)
{
Tagaro::SpriteObjectItem::setSize(size);
+ m_shape->setRect(QRectF(QPointF(), size));
updateWallPosition();
propagateUpdate();
}
@@ -320,17 +327,104 @@
Config* Kolf::RectangleItem::config(QWidget* parent)
{
- return CanvasItem::config(parent);
- //return new Kolf::RectangleConfig(parent);
+ return new Kolf::RectangleConfig(this, parent);
}
Kolf::Overlay* Kolf::RectangleItem::createOverlay()
{
- return new Kolf::Overlay(this, this);
- //return new Kolf::RectangleOverlay(this);
+ return new Kolf::RectangleOverlay(this);
}
//END Kolf::RectangleItem
+//BEGIN Kolf::RectangleOverlay
+
+Kolf::RectangleOverlay::RectangleOverlay(Kolf::RectangleItem* item)
+ : Kolf::Overlay(item, item)
+{
+ //TODO: code duplication to Kolf::LandscapeOverlay
+ for (int i = 0; i < 4; ++i)
+ {
+ Kolf::OverlayHandle* handle = new \
Kolf::OverlayHandle(Kolf::OverlayHandle::CircleShape, this); + m_handles << handle;
+ addHandle(handle);
+ connect(handle, SIGNAL(moveRequest(QPointF)), this, SLOT(moveHandle(QPointF)));
+ }
+}
+
+void Kolf::RectangleOverlay::update()
+{
+ Kolf::Overlay::update();
+ const QRectF rect = qitem()->boundingRect();
+ m_handles[0]->setPos(rect.topLeft());
+ m_handles[1]->setPos(rect.topRight());
+ m_handles[2]->setPos(rect.bottomLeft());
+ m_handles[3]->setPos(rect.bottomRight());
+}
+
+void Kolf::RectangleOverlay::moveHandle(const QPointF& handleScenePos)
+{
+ Kolf::OverlayHandle* handle = qobject_cast<Kolf::OverlayHandle*>(sender());
+ const int handleIndex = m_handles.indexOf(handle);
+ Kolf::RectangleItem* item = dynamic_cast<Kolf::RectangleItem*>(qitem());
+ const QPointF handlePos = mapFromScene(handleScenePos);
+ //modify bounding rect using new handlePos
+ QRectF rect(QPointF(), item->size());
+ if (handleIndex % 2 == 0)
+ rect.setLeft(qMin(handlePos.x(), rect.right()));
+ else
+ rect.setRight(qMax(handlePos.x(), rect.left()));
+ if (handleIndex < 2)
+ rect.setTop(qMin(handlePos.y(), rect.bottom()));
+ else
+ rect.setBottom(qMax(handlePos.y(), rect.top()));
+ item->moveBy(rect.x(), rect.y());
+ item->setSize(rect.size());
+}
+
+//END Kolf::RectangleOverlay
+//BEGIN Kolf::RectangleConfig
+
+Kolf::RectangleConfig::RectangleConfig(Kolf::RectangleItem* item, QWidget* parent)
+ : Config(parent)
+ , m_layout(new QGridLayout(this))
+ , m_wallCheckBoxes(Kolf::RectangleWallCount, 0)
+ , m_item(item)
+{
+ static const char* captions[] = { I18N_NOOP("&Top"), I18N_NOOP("&Left"), \
I18N_NOOP("&Right"), I18N_NOOP("&Bottom") }; + for (int i = 0; i < \
Kolf::RectangleWallCount; ++i) + {
+ QCheckBox* checkBox = m_wallCheckBoxes[i] = new QCheckBox(i18n(captions[i]), \
this); + checkBox->setChecked(item->hasWall((Kolf::WallIndex) i));
+ connect(checkBox, SIGNAL(toggled(bool)), SLOT(setWall(bool)));
+ }
+ m_layout->addWidget(new QLabel(i18n("Walls on:")), 0, 0);
+ m_layout->addWidget(m_wallCheckBoxes[0], 0, 1);
+ m_layout->addWidget(m_wallCheckBoxes[1], 1, 0);
+ m_layout->addWidget(m_wallCheckBoxes[2], 1, 2);
+ m_layout->addWidget(m_wallCheckBoxes[3], 1, 1);
+ m_layout->setRowStretch(2, 10);
+ //Kolf::Sign does not have a special Config class
+ Kolf::Sign* sign = qobject_cast<Kolf::Sign*>(item);
+ if (sign)
+ {
+ m_layout->addWidget(new QLabel(i18n("Sign HTML:")), 3, 0, 1, 3);
+ KLineEdit* edit = new KLineEdit(sign->text(), this);
+ m_layout->addWidget(edit, 4, 0, 1, 3);
+ connect(edit, SIGNAL(textChanged(QString)), sign, SLOT(setText(QString)));
+ }
+}
+
+void Kolf::RectangleConfig::setWall(bool hasWall)
+{
+ const int wallIndex = m_wallCheckBoxes.indexOf(qobject_cast<QCheckBox*>(sender()));
+ if (wallIndex >= 0)
+ {
+ m_item->setWall((Kolf::WallIndex) wallIndex, hasWall);
+ changed();
+ }
+}
+
+//END Kolf::RectangleConfig
//BEGIN Kolf::Bridge
Kolf::Bridge::Bridge(QGraphicsItem* parent, b2World* world)
@@ -345,5 +439,51 @@
}
//END Kolf::Bridge
+//BEGIN Kolf::Sign
+Kolf::Sign::Sign(QGraphicsItem* parent, b2World* world)
+ : Kolf::RectangleItem(QLatin1String("sign"), parent, world)
+ , m_text(i18n("New Text"))
+ , m_textItem(new QGraphicsTextItem(m_text, this))
+{
+ setZValue(998.8);
+ setWallColor(Qt::black);
+ for (int i = 0; i < Kolf::RectangleWallCount; ++i)
+ setWall((Kolf::WallIndex) i, true);
+ //Z value 1 should be enough to keep text above overlay
+ m_textItem->setZValue(1);
+ m_textItem->setAcceptedMouseButtons(0);
+ //TODO: activate QGraphicsItem::ItemClipsChildrenToShape flag after
+ //refactoring (only after it is clear that the text is the only child)
+}
+
+QString Kolf::Sign::text() const
+{
+ return m_text;
+}
+
+void Kolf::Sign::setText(const QString& text)
+{
+ m_text = text;
+ m_textItem->setHtml(text);
+}
+
+void Kolf::Sign::setSize(const QSizeF& size)
+{
+ Kolf::RectangleItem::setSize(size);
+ m_textItem->setTextWidth(size.width());
+}
+
+void Kolf::Sign::load(KConfigGroup* group)
+{
+ setText(group->readEntry("Comment", m_text));
+}
+
+void Kolf::Sign::save(KConfigGroup* group)
+{
+ group->writeEntry("Comment", m_text);
+}
+
+//END Kolf::Sign
+
#include "obstacles.moc"
--- trunk/KDE/kdegames/kolf/obstacles.h #1195394:1195395
@@ -26,9 +26,13 @@
#include "canvasitem.h"
#include "overlay.h"
+class QCheckBox;
+class QGridLayout;
+
namespace Kolf
{
class LineShape;
+ class RectShape;
class Bumper : public EllipticalCanvasItem
{
@@ -114,14 +118,60 @@
QPen m_wallPen;
QVector<Kolf::Wall*> m_walls;
+ Kolf::RectShape* m_shape;
};
+ class RectangleOverlay : public Kolf::Overlay
+ {
+ Q_OBJECT
+ public:
+ RectangleOverlay(Kolf::RectangleItem* item);
+ virtual void update();
+ private Q_SLOTS:
+ //interface to handles
+ void moveHandle(const QPointF& handleScenePos);
+ private:
+ QList<Kolf::OverlayHandle*> m_handles;
+ };
+
+ class RectangleConfig : public Config
+ {
+ Q_OBJECT
+ public:
+ RectangleConfig(Kolf::RectangleItem* item, QWidget* parent);
+ protected Q_SLOTS:
+ void setWall(bool hasWall);
+ protected:
+ QGridLayout* m_layout;
+ QVector<QCheckBox*> m_wallCheckBoxes;
+ Kolf::RectangleItem* const m_item;
+ };
+
class Bridge : public Kolf::RectangleItem
{
public:
Bridge(QGraphicsItem* parent, b2World* world);
virtual bool collision(Ball* ball);
};
+
+ class Sign : public Kolf::RectangleItem
+ {
+ Q_OBJECT
+ public:
+ Sign(QGraphicsItem* parent, b2World* world);
+ virtual bool vStrut() const { return false; }
+
+ QString text() const;
+ virtual void setSize(const QSizeF& size);
+
+ virtual void load(KConfigGroup* group);
+ virtual void save(KConfigGroup* group);
+ public Q_SLOTS:
+ void setText(const QString& text);
+ private:
+ QString m_text;
+ QGraphicsTextItem* m_textItem;
+ };
}
#endif // KOLF_OBSTACLES_H
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic