/**************************************************************************** ** ** 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 "qtvariantproperty.h" #include "qttreepropertybrowser.h" #include #include #include #include #include #include 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); variantManager = new QtVariantPropertyManager(this); connect(variantManager, SIGNAL(valueChanged(QtProperty *, const QVariant &)), this, SLOT(valueChanged(QtProperty *, const QVariant &))); QtVariantEditorFactory *variantFactory = new QtVariantEditorFactory(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(variantManager, variantFactory); 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; variantManager->setValue(idToProperty[QLatin1String("xpos")], item->x()); variantManager->setValue(idToProperty[QLatin1String("ypos")], item->y()); variantManager->setValue(idToProperty[QLatin1String("zpos")], item->z()); } void MainWindow::updateExpandState() { QList list = propertyEditor->topLevelItems(); QListIterator 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::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); QtVariantProperty *property; property = variantManager->addProperty(QVariant::Double, tr("Position X")); property->setAttribute(QLatin1String("minimum"), 0); property->setAttribute(QLatin1String("maximum"), canvas->width()); property->setValue(item->x()); addProperty(property, QLatin1String("xpos")); property = variantManager->addProperty(QVariant::Double, tr("Position Y")); property->setAttribute(QLatin1String("minimum"), 0); property->setAttribute(QLatin1String("maximum"), canvas->height()); property->setValue(item->y()); addProperty(property, QLatin1String("ypos")); property = variantManager->addProperty(QVariant::Double, tr("Position Z")); property->setAttribute(QLatin1String("minimum"), 0); property->setAttribute(QLatin1String("maximum"), 256); property->setValue(item->z()); addProperty(property, QLatin1String("zpos")); if (item->rtti() == QtCanvasItem::Rtti_Rectangle) { QtCanvasRectangle *i = (QtCanvasRectangle *)item; property = variantManager->addProperty(QVariant::Color, tr("Brush Color")); property->setValue(i->brush().color()); addProperty(property, QLatin1String("brush")); property = variantManager->addProperty(QVariant::Color, tr("Pen Color")); property->setValue(i->pen().color()); addProperty(property, QLatin1String("pen")); property = variantManager->addProperty(QVariant::Size, tr("Size")); property->setValue(i->size()); addProperty(property, QLatin1String("size")); } else if (item->rtti() == QtCanvasItem::Rtti_Line) { QtCanvasLine *i = (QtCanvasLine *)item; property = variantManager->addProperty(QVariant::Color, tr("Pen Color")); property->setValue(i->pen().color()); addProperty(property, QLatin1String("pen")); property = variantManager->addProperty(QVariant::Point, tr("Vector")); property->setValue(i->endPoint()); addProperty(property, QLatin1String("endpoint")); } else if (item->rtti() == QtCanvasItem::Rtti_Ellipse) { QtCanvasEllipse *i = (QtCanvasEllipse *)item; property = variantManager->addProperty(QVariant::Color, tr("Brush Color")); property->setValue(i->brush().color()); addProperty(property, QLatin1String("brush")); property = variantManager->addProperty(QVariant::Size, tr("Size")); property->setValue(QSize(i->width(), i->height())); addProperty(property, QLatin1String("size")); } else if (item->rtti() == QtCanvasItem::Rtti_Text) { QtCanvasText *i = (QtCanvasText *)item; property = variantManager->addProperty(QVariant::Color, tr("Color")); property->setValue(i->color()); addProperty(property, QLatin1String("color")); property = variantManager->addProperty(QVariant::String, tr("Text")); property->setValue(i->text()); addProperty(property, QLatin1String("text")); property = variantManager->addProperty(QVariant::Font, tr("Font")); property->setValue(i->font()); addProperty(property, QLatin1String("font")); } } void MainWindow::addProperty(QtVariantProperty *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, const QVariant &value) { if (!propertyToId.contains(property)) return; if (!currentItem) return; QString id = propertyToId[property]; if (id == QLatin1String("xpos")) { currentItem->setX(value.toDouble()); } else if (id == QLatin1String("ypos")) { currentItem->setY(value.toDouble()); } else if (id == QLatin1String("zpos")) { currentItem->setZ(value.toDouble()); } else if (id == QLatin1String("text")) { if (currentItem->rtti() == QtCanvasItem::Rtti_Text) { QtCanvasText *i = (QtCanvasText *)currentItem; i->setText(value.value()); } } else if (id == QLatin1String("color")) { if (currentItem->rtti() == QtCanvasItem::Rtti_Text) { QtCanvasText *i = (QtCanvasText *)currentItem; i->setColor(value.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.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.value()); i->setPen(p); } } else if (id == QLatin1String("font")) { if (currentItem->rtti() == QtCanvasItem::Rtti_Text) { QtCanvasText *i = (QtCanvasText *)currentItem; i->setFont(value.value()); } } else if (id == QLatin1String("endpoint")) { if (currentItem->rtti() == QtCanvasItem::Rtti_Line) { QtCanvasLine *i = (QtCanvasLine *)currentItem; QPoint p = value.value(); i->setPoints(i->startPoint().x(), i->startPoint().y(), p.x(), p.y()); } } else if (id == QLatin1String("size")) { if (currentItem->rtti() == QtCanvasItem::Rtti_Rectangle) { QtCanvasRectangle *i = (QtCanvasRectangle *)currentItem; QSize s = value.value(); i->setSize(s.width(), s.height()); } else if (currentItem->rtti() == QtCanvasItem::Rtti_Ellipse) { QtCanvasEllipse *i = (QtCanvasEllipse *)currentItem; QSize s = value.value(); i->setSize(s.width(), s.height()); } } canvas->update(); }