aboutsummaryrefslogtreecommitdiffstats
path: root/3rdparty/QtPropertyBrowser/examples/canvas_typed/mainwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/QtPropertyBrowser/examples/canvas_typed/mainwindow.cpp')
-rw-r--r--3rdparty/QtPropertyBrowser/examples/canvas_typed/mainwindow.cpp521
1 files changed, 521 insertions, 0 deletions
diff --git a/3rdparty/QtPropertyBrowser/examples/canvas_typed/mainwindow.cpp b/3rdparty/QtPropertyBrowser/examples/canvas_typed/mainwindow.cpp
new file mode 100644
index 00000000..e6ec196d
--- /dev/null
+++ b/3rdparty/QtPropertyBrowser/examples/canvas_typed/mainwindow.cpp
@@ -0,0 +1,521 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of a Qt Solutions component.
+**
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+****************************************************************************/
+
+#include "mainwindow.h"
+#include "qtpropertymanager.h"
+#include "qteditorfactory.h"
+#include "qttreepropertybrowser.h"
+#include <QMatrix>
+#include <QMouseEvent>
+#include <QMenuBar>
+#include <QMenu>
+#include <QAction>
+#include <QDockWidget>
+
+void CanvasView::contentsMousePressEvent(QMouseEvent* event)
+{
+ handleMouseClickEvent(event);
+}
+
+void CanvasView::contentsMouseDoubleClickEvent(QMouseEvent* event)
+{
+ handleMouseClickEvent(event);
+}
+
+void CanvasView::handleMouseClickEvent(QMouseEvent* event)
+{
+ QPoint p = inverseWorldMatrix().map(event->pos());
+ QtCanvasItemList l = canvas()->collisions(p);
+ moving = 0;
+ if (!l.isEmpty())
+ moving = l.first();
+ moving_start = p;
+ emit itemClicked(moving);
+}
+
+void CanvasView::contentsMouseMoveEvent(QMouseEvent* event)
+{
+ if (moving) {
+ QPoint p = inverseWorldMatrix().map(event->pos());
+ moving->moveBy(p.x() - moving_start.x(), p.y() - moving_start.y());
+ moving_start = p;
+ canvas()->update();
+ emit itemMoved(moving);
+ }
+}
+
+
+MainWindow::MainWindow(QWidget *parent)
+ : QMainWindow(parent)
+{
+ QMenu *editMenu = menuBar()->addMenu(tr("Edit"));
+ QMenu *newObjectMenu = editMenu->addMenu(tr("New Object"));
+
+ QAction *newRectangleAction = new QAction(tr("Rectangle"), this);
+ connect(newRectangleAction, SIGNAL(triggered(bool)), this, SLOT(newRectangle()));
+ newObjectMenu->addAction(newRectangleAction);
+
+ QAction *newLineAction = new QAction(tr("Line"), this);
+ connect(newLineAction, SIGNAL(triggered(bool)), this, SLOT(newLine()));
+ newObjectMenu->addAction(newLineAction);
+
+ QAction *newEllipseAction = new QAction(tr("Ellipse"), this);
+ connect(newEllipseAction, SIGNAL(triggered(bool)), this, SLOT(newEllipse()));
+ newObjectMenu->addAction(newEllipseAction);
+
+ QAction *newTextAction = new QAction(tr("Text"), this);
+ connect(newTextAction, SIGNAL(triggered(bool)), this, SLOT(newText()));
+ newObjectMenu->addAction(newTextAction);
+
+ deleteAction = new QAction(tr("Delete Object"), this);
+ connect(deleteAction, SIGNAL(triggered(bool)), this, SLOT(deleteObject()));
+ editMenu->addAction(deleteAction);
+
+ QAction *clearAction = new QAction(tr("Clear All"), this);
+ connect(clearAction, SIGNAL(triggered(bool)), this, SLOT(clearAll()));
+ editMenu->addAction(clearAction);
+
+ QAction *fillAction = new QAction(tr("Fill View"), this);
+ connect(fillAction, SIGNAL(triggered(bool)), this, SLOT(fillView()));
+ editMenu->addAction(fillAction);
+
+ doubleManager = new QtDoublePropertyManager(this);
+ stringManager = new QtStringPropertyManager(this);
+ colorManager = new QtColorPropertyManager(this);
+ fontManager = new QtFontPropertyManager(this);
+ pointManager = new QtPointPropertyManager(this);
+ sizeManager = new QtSizePropertyManager(this);
+
+ connect(doubleManager, SIGNAL(valueChanged(QtProperty *, double)),
+ this, SLOT(valueChanged(QtProperty *, double)));
+ connect(stringManager, SIGNAL(valueChanged(QtProperty *, const QString &)),
+ this, SLOT(valueChanged(QtProperty *, const QString &)));
+ connect(colorManager, SIGNAL(valueChanged(QtProperty *, const QColor &)),
+ this, SLOT(valueChanged(QtProperty *, const QColor &)));
+ connect(fontManager, SIGNAL(valueChanged(QtProperty *, const QFont &)),
+ this, SLOT(valueChanged(QtProperty *, const QFont &)));
+ connect(pointManager, SIGNAL(valueChanged(QtProperty *, const QPoint &)),
+ this, SLOT(valueChanged(QtProperty *, const QPoint &)));
+ connect(sizeManager, SIGNAL(valueChanged(QtProperty *, const QSize &)),
+ this, SLOT(valueChanged(QtProperty *, const QSize &)));
+
+ QtDoubleSpinBoxFactory *doubleSpinBoxFactory = new QtDoubleSpinBoxFactory(this);
+ QtCheckBoxFactory *checkBoxFactory = new QtCheckBoxFactory(this);
+ QtSpinBoxFactory *spinBoxFactory = new QtSpinBoxFactory(this);
+ QtLineEditFactory *lineEditFactory = new QtLineEditFactory(this);
+ QtEnumEditorFactory *comboBoxFactory = new QtEnumEditorFactory(this);
+
+ canvas = new QtCanvas(800, 600);
+ canvasView = new CanvasView(canvas, this);
+ setCentralWidget(canvasView);
+
+ QDockWidget *dock = new QDockWidget(this);
+ addDockWidget(Qt::RightDockWidgetArea, dock);
+
+ propertyEditor = new QtTreePropertyBrowser(dock);
+ propertyEditor->setFactoryForManager(doubleManager, doubleSpinBoxFactory);
+ propertyEditor->setFactoryForManager(stringManager, lineEditFactory);
+ propertyEditor->setFactoryForManager(colorManager->subIntPropertyManager(), spinBoxFactory);
+ propertyEditor->setFactoryForManager(fontManager->subIntPropertyManager(), spinBoxFactory);
+ propertyEditor->setFactoryForManager(fontManager->subBoolPropertyManager(), checkBoxFactory);
+ propertyEditor->setFactoryForManager(fontManager->subEnumPropertyManager(), comboBoxFactory);
+ propertyEditor->setFactoryForManager(pointManager->subIntPropertyManager(), spinBoxFactory);
+ propertyEditor->setFactoryForManager(sizeManager->subIntPropertyManager(), spinBoxFactory);
+ dock->setWidget(propertyEditor);
+
+ currentItem = 0;
+
+ connect(canvasView, SIGNAL(itemClicked(QtCanvasItem *)),
+ this, SLOT(itemClicked(QtCanvasItem *)));
+ connect(canvasView, SIGNAL(itemMoved(QtCanvasItem *)),
+ this, SLOT(itemMoved(QtCanvasItem *)));
+
+ fillView();
+ itemClicked(0);
+}
+
+void MainWindow::newRectangle()
+{
+ QtCanvasItem *item = addRectangle();
+ canvas->update();
+ itemClicked(item);
+}
+
+void MainWindow::newEllipse()
+{
+ QtCanvasItem *item = addEllipse();
+ canvas->update();
+ itemClicked(item);
+}
+
+void MainWindow::newLine()
+{
+ QtCanvasItem *item = addLine();
+ canvas->update();
+ itemClicked(item);
+}
+
+void MainWindow::newText()
+{
+ QtCanvasItem *item = addText();
+ canvas->update();
+ itemClicked(item);
+}
+
+void MainWindow::deleteObject()
+{
+ if (!currentItem)
+ return;
+
+ delete currentItem;
+ itemClicked(0);
+ canvas->update();
+}
+
+void MainWindow::clearAll()
+{
+ QtCanvasItemList list = canvas->allItems();
+ qDeleteAll(list);
+ itemClicked(0);
+ canvas->update();
+}
+
+void MainWindow::fillView()
+{
+ for (int i = 0; i < 10; i++) {
+ addRectangle();
+ addEllipse();
+ addLine();
+ addText();
+ }
+ canvas->update();
+}
+
+QtCanvasItem *MainWindow::addRectangle()
+{
+ QtCanvasPolygonalItem *item = new QtCanvasRectangle(rand() % canvas->width(),
+ rand() % canvas->height(), 50, 50, canvas);
+ int z = rand() % 256;
+ item->setBrush(QColor(rand() % 32 * 8, rand() % 32 * 8, rand() % 32 * 8));
+ item->setPen(QPen(QColor(rand() % 32*8, rand() % 32*8, rand() % 32*8), 4));
+ item->setZ(z);
+ item->show();
+ return item;
+}
+
+QtCanvasItem *MainWindow::addEllipse()
+{
+ QtCanvasPolygonalItem *item = new QtCanvasEllipse(50, 50, canvas);
+ item->setBrush(QColor(rand() % 32 * 8, rand() % 32 * 8, rand() % 32 * 8));
+ item->move(rand() % canvas->width(), rand() % canvas->height());
+ item->setZ(rand() % 256);
+ item->show();
+ return item;
+}
+
+QtCanvasItem *MainWindow::addLine()
+{
+ QtCanvasLine *item = new QtCanvasLine(canvas);
+ item->setPoints(0, 0, rand() % canvas->width() - canvas->width() / 2,
+ rand() % canvas->height() - canvas->height() / 2);
+ item->move(rand() % canvas->width(), rand() % canvas->height());
+ item->setPen(QPen(QColor(rand() % 32*8, rand() % 32*8, rand() % 32*8), 6));
+ item->setZ(rand() % 256);
+ item->show();
+ return item;
+}
+
+QtCanvasItem *MainWindow::addText()
+{
+ QtCanvasText *item = new QtCanvasText(canvas);
+ item->setText(tr("Text"));
+ item->setColor(QColor(rand() % 32*8, rand() % 32*8, rand() % 32*8));
+ item->move(rand() % canvas->width(), rand() % canvas->height());
+ item->setZ(rand() % 256);
+ item->show();
+ return item;
+}
+
+void MainWindow::itemMoved(QtCanvasItem *item)
+{
+ if (item != currentItem)
+ return;
+
+ doubleManager->setValue(idToProperty[QLatin1String("xpos")], item->x());
+ doubleManager->setValue(idToProperty[QLatin1String("ypos")], item->y());
+ doubleManager->setValue(idToProperty[QLatin1String("zpos")], item->z());
+}
+
+void MainWindow::updateExpandState()
+{
+ QList<QtBrowserItem *> list = propertyEditor->topLevelItems();
+ QListIterator<QtBrowserItem *> it(list);
+ while (it.hasNext()) {
+ QtBrowserItem *item = it.next();
+ QtProperty *prop = item->property();
+ idToExpanded[propertyToId[prop]] = propertyEditor->isExpanded(item);
+ }
+}
+
+void MainWindow::itemClicked(QtCanvasItem *item)
+{
+ updateExpandState();
+
+ QMap<QtProperty *, QString>::ConstIterator itProp = propertyToId.constBegin();
+ while (itProp != propertyToId.constEnd()) {
+ delete itProp.key();
+ itProp++;
+ }
+ propertyToId.clear();
+ idToProperty.clear();
+
+ currentItem = item;
+ if (!currentItem) {
+ deleteAction->setEnabled(false);
+ return;
+ }
+
+ deleteAction->setEnabled(true);
+
+ QtProperty *property;
+
+ property = doubleManager->addProperty(tr("Position X"));
+ doubleManager->setRange(property, 0, canvas->width());
+ doubleManager->setValue(property, item->x());
+ addProperty(property, QLatin1String("xpos"));
+
+ property = doubleManager->addProperty(tr("Position Y"));
+ doubleManager->setRange(property, 0, canvas->height());
+ doubleManager->setValue(property, item->y());
+ addProperty(property, QLatin1String("ypos"));
+
+ property = doubleManager->addProperty(tr("Position Z"));
+ doubleManager->setRange(property, 0, 256);
+ doubleManager->setValue(property, item->z());
+ addProperty(property, QLatin1String("zpos"));
+
+ if (item->rtti() == QtCanvasItem::Rtti_Rectangle) {
+ QtCanvasRectangle *i = (QtCanvasRectangle *)item;
+
+ property = colorManager->addProperty(tr("Brush Color"));
+ colorManager->setValue(property, i->brush().color());
+ addProperty(property, QLatin1String("brush"));
+
+ property = colorManager->addProperty(tr("Pen Color"));
+ colorManager->setValue(property, i->pen().color());
+ addProperty(property, QLatin1String("pen"));
+
+ property = sizeManager->addProperty(tr("Size"));
+ sizeManager->setValue(property, i->size());
+ addProperty(property, QLatin1String("size"));
+ } else if (item->rtti() == QtCanvasItem::Rtti_Line) {
+ QtCanvasLine *i = (QtCanvasLine *)item;
+
+ property = colorManager->addProperty(tr("Pen Color"));
+ colorManager->setValue(property, i->pen().color());
+ addProperty(property, QLatin1String("pen"));
+
+ property = pointManager->addProperty(tr("Vector"));
+ pointManager->setValue(property, i->endPoint());
+ addProperty(property, QLatin1String("endpoint"));
+ } else if (item->rtti() == QtCanvasItem::Rtti_Ellipse) {
+ QtCanvasEllipse *i = (QtCanvasEllipse *)item;
+
+ property = colorManager->addProperty(tr("Brush Color"));
+ colorManager->setValue(property, i->brush().color());
+ addProperty(property, QLatin1String("brush"));
+
+ property = sizeManager->addProperty(tr("Size"));
+ sizeManager->setValue(property, QSize(i->width(), i->height()));
+ sizeManager->setRange(property, QSize(0, 0), QSize(1000, 1000));
+ addProperty(property, QLatin1String("size"));
+ } else if (item->rtti() == QtCanvasItem::Rtti_Text) {
+ QtCanvasText *i = (QtCanvasText *)item;
+
+ property = colorManager->addProperty(tr("Color"));
+ colorManager->setValue(property, i->color());
+ addProperty(property, QLatin1String("color"));
+
+ property = stringManager->addProperty(tr("Text"));
+ stringManager->setValue(property, i->text());
+ addProperty(property, QLatin1String("text"));
+
+ property = fontManager->addProperty(tr("Font"));
+ fontManager->setValue(property, i->font());
+ addProperty(property, QLatin1String("font"));
+ }
+}
+
+void MainWindow::addProperty(QtProperty *property, const QString &id)
+{
+ propertyToId[property] = id;
+ idToProperty[id] = property;
+ QtBrowserItem *item = propertyEditor->addProperty(property);
+ if (idToExpanded.contains(id))
+ propertyEditor->setExpanded(item, idToExpanded[id]);
+}
+
+void MainWindow::valueChanged(QtProperty *property, double value)
+{
+ if (!propertyToId.contains(property))
+ return;
+
+ if (!currentItem)
+ return;
+
+ QString id = propertyToId[property];
+ if (id == QLatin1String("xpos")) {
+ currentItem->setX(value);
+ } else if (id == QLatin1String("ypos")) {
+ currentItem->setY(value);
+ } else if (id == QLatin1String("zpos")) {
+ currentItem->setZ(value);
+ }
+ canvas->update();
+}
+
+void MainWindow::valueChanged(QtProperty *property, const QString &value)
+{
+ if (!propertyToId.contains(property))
+ return;
+
+ if (!currentItem)
+ return;
+
+ QString id = propertyToId[property];
+ if (id == QLatin1String("text")) {
+ if (currentItem->rtti() == QtCanvasItem::Rtti_Text) {
+ QtCanvasText *i = (QtCanvasText *)currentItem;
+ i->setText(value);
+ }
+ }
+ canvas->update();
+}
+
+void MainWindow::valueChanged(QtProperty *property, const QColor &value)
+{
+ if (!propertyToId.contains(property))
+ return;
+
+ if (!currentItem)
+ return;
+
+ QString id = propertyToId[property];
+ if (id == QLatin1String("color")) {
+ if (currentItem->rtti() == QtCanvasItem::Rtti_Text) {
+ QtCanvasText *i = (QtCanvasText *)currentItem;
+ i->setColor(value);
+ }
+ } else if (id == QLatin1String("brush")) {
+ if (currentItem->rtti() == QtCanvasItem::Rtti_Rectangle ||
+ currentItem->rtti() == QtCanvasItem::Rtti_Ellipse) {
+ QtCanvasPolygonalItem *i = (QtCanvasPolygonalItem *)currentItem;
+ QBrush b = i->brush();
+ b.setColor(value);
+ i->setBrush(b);
+ }
+ } else if (id == QLatin1String("pen")) {
+ if (currentItem->rtti() == QtCanvasItem::Rtti_Rectangle ||
+ currentItem->rtti() == QtCanvasItem::Rtti_Line) {
+ QtCanvasPolygonalItem *i = (QtCanvasPolygonalItem *)currentItem;
+ QPen p = i->pen();
+ p.setColor(value);
+ i->setPen(p);
+ }
+ }
+ canvas->update();
+}
+
+void MainWindow::valueChanged(QtProperty *property, const QFont &value)
+{
+ if (!propertyToId.contains(property))
+ return;
+
+ if (!currentItem)
+ return;
+
+ QString id = propertyToId[property];
+ if (id == QLatin1String("font")) {
+ if (currentItem->rtti() == QtCanvasItem::Rtti_Text) {
+ QtCanvasText *i = (QtCanvasText *)currentItem;
+ i->setFont(value);
+ }
+ }
+ canvas->update();
+}
+
+void MainWindow::valueChanged(QtProperty *property, const QPoint &value)
+{
+ if (!propertyToId.contains(property))
+ return;
+
+ if (!currentItem)
+ return;
+
+ QString id = propertyToId[property];
+ if (currentItem->rtti() == QtCanvasItem::Rtti_Line) {
+ QtCanvasLine *i = (QtCanvasLine *)currentItem;
+ if (id == QLatin1String("endpoint")) {
+ i->setPoints(i->startPoint().x(), i->startPoint().y(), value.x(), value.y());
+ }
+ }
+ canvas->update();
+}
+
+void MainWindow::valueChanged(QtProperty *property, const QSize &value)
+{
+ if (!propertyToId.contains(property))
+ return;
+
+ if (!currentItem)
+ return;
+
+ QString id = propertyToId[property];
+ if (id == QLatin1String("size")) {
+ if (currentItem->rtti() == QtCanvasItem::Rtti_Rectangle) {
+ QtCanvasRectangle *i = (QtCanvasRectangle *)currentItem;
+ i->setSize(value.width(), value.height());
+ } else if (currentItem->rtti() == QtCanvasItem::Rtti_Ellipse) {
+ QtCanvasEllipse *i = (QtCanvasEllipse *)currentItem;
+ i->setSize(value.width(), value.height());
+ }
+ }
+ canvas->update();
+}
+