diff --git a/src/nodeitem.cpp b/src/nodeitem.cpp new file mode 100644 --- /dev/null +++ b/src/nodeitem.cpp @@ -0,0 +1,133 @@ +/* + * + * This file is part of the Virtual Leaf. + * + * The Virtual Leaf 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. + * + * The Virtual Leaf 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 the Virtual Leaf. If not, see . + * + * Copyright 2010 Roeland Merks. + * + */ + +#include +#include +#include +#include +#include +#include +#include "nodeitem.h" +#include "parameter.h" + +static const std::string _module_id("$Id$"); + +extern Parameter par; + +NodeItem::NodeItem( Node *n, QGraphicsScene *canvas ) + : QGraphicsItem( 0, canvas ), SimItemBase( n, canvas) { + + brush = Qt::darkGray; + + const double mag = par.node_mag; + ellipsesize=QRectF(-1*mag, -1*mag, 2*mag, 2*mag); + +} + +void NodeItem::userMove(double dx, double dy) { + QGraphicsItem::moveBy( dx, dy ); + + class_cast(obj)->x += (dx/Cell::Magnification()); + class_cast(obj)->y += (dy/Cell::Magnification()); +} + + + +void NodeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *) +{ + + // from Qt4.2 example: "elastic nodes" + //painter->setPen(Qt::NoPen); + //painter->setBrush(Qt::darkGray); + //painter->drawEllipse(-70, -70, 200, 200); + + /* QRadialGradient gradient(-30, -30, 100); + + if (option->state & QStyle::State_Sunken) { + gradient.setCenter(30, 30); + gradient.setFocalPoint(30, 30); + gradient.setColorAt(1, QColor(Qt::yellow).light(120)); + gradient.setColorAt(0, QColor(Qt::darkYellow).light(120)); + } else { + gradient.setColorAt(0, Qt::yellow); + gradient.setColorAt(1, Qt::darkYellow); + } + + painter->setBrush(gradient); */ + + painter->setBrush(brush); + painter->setPen(Qt::NoPen); + // const static double mag=20.; + painter->drawEllipse(ellipsesize); +} + + +QPainterPath NodeItem::shape() const +{ + QPainterPath path; + path.addEllipse(ellipsesize); + return path; +} + +QRectF NodeItem::boundingRect() const +{ + qreal penwidth = 0;// painter->pen()->widthF(); + return QRectF(ellipsesize.x()-penwidth/2.,ellipsesize.y()-penwidth/2., + ellipsesize.width()+penwidth, ellipsesize.height()+penwidth); +} + +// polymorphic OnClick functions +void NodeItem::OnClick(void) { + Node *n = &getNode(); + n->toggleBoundary(); + setColor(); + update(); +} + +void NodeItem::OnClick(const Qt::MouseButton &mb) { + if (mb == Qt::LeftButton) { + Node *n = &getNode(); + n->toggleBoundary(); + setColor(); + update(); + + } +} + +void NodeItem::setColor(void) { + + static QColor indian_red("IndianRed"); + static QColor deep_sky_blue("DeepSkyBlue"); + static QColor purple("Purple"); + + Node &n=getNode(); + + if (n.SamP()) { + setBrush( purple ); + } else { + if (n.BoundaryP()) { + setBrush( deep_sky_blue ); + } + else { + setBrush( indian_red ); + } + } +}