/*************************************************************************** * Copyright 2009 by Davide Bettio * * * * 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 2 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, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * ***************************************************************************/ #include "blackboardwidget.h" #include #include #include #include #include #include #include #include #include #include BlackBoardWidget::BlackBoardWidget(Plasma::Applet *parent) : QGraphicsWidget(parent) { m_changed = false; setAcceptTouchEvents(true); m_parentApplet = parent; m_color = QColor(Plasma::Theme::defaultTheme()->color(Plasma::Theme::TextColor)); m_oldPoint = QPointF(-1, 0); QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(saveImage())); timer->start(600000); QTimer::singleShot(500, this, SLOT(loadImage())); } BlackBoardWidget::~BlackBoardWidget() { } void BlackBoardWidget::saveImage() { if (m_parentApplet->destroyed()){ KIO::del(imagePath()); }else{ if (m_changed){ KSaveFile imageFile(imagePath()); imageFile.open(); m_pixmap.save(&imageFile, "PNG"); imageFile.finalize(); imageFile.close(); } } } void BlackBoardWidget::loadImage() { m_painter.end(); m_pixmap.load(imagePath(), "PNG"); update(contentsRect()); m_painter.begin(&m_pixmap); m_painter.setPen(QPen(m_color, 3)); } void BlackBoardWidget::mousePressEvent(QGraphicsSceneMouseEvent *) { update(contentsRect()); } void BlackBoardWidget::drawSegment(QPointF point0, QPointF point1, qreal penRadius) { m_painter.setPen(QPen(m_color, penRadius)); m_painter.drawLine(point0, point1); qreal x = qMin(point0.x(), point1.x()) -(penRadius + 1); qreal y = qMin(point0.y(), point1.y()) -(penRadius + 1); qreal w = qMax(point0.x(), point1.x()) + penRadius + 1 - x; qreal h = qMax(point0.y(), point1.y()) + penRadius + 1 - y; update(x,y,w,h); m_changed = true; } bool BlackBoardWidget::event(QEvent *event) { switch (event->type()) { case QEvent::TouchBegin: case QEvent::TouchUpdate: case QEvent::TouchEnd: { QList touchPoints = static_cast(event)->touchPoints(); foreach (const QTouchEvent::TouchPoint &touchPoint, touchPoints) { switch (touchPoint.state()) { case Qt::TouchPointStationary: // don't do anything if this touch point hasn't moved continue; default: drawSegment(touchPoint.lastPos(), touchPoint.pos(), 3*touchPoint.pressure()); break; } } break; } default: return QGraphicsWidget::event(event); } return true; } void BlackBoardWidget::mouseMoveEvent(QGraphicsSceneMouseEvent * event) { QPointF lastPos = event->lastPos(); if (m_oldPoint.x() != -1){ drawSegment(m_oldPoint, lastPos, 1); } m_oldPoint = lastPos; } void BlackBoardWidget::mouseReleaseEvent ( QGraphicsSceneMouseEvent * event ) { mouseMoveEvent(event); m_oldPoint.setX(-1); } void BlackBoardWidget::resizeEvent(QGraphicsSceneResizeEvent *event) { Q_UNUSED(event) if (m_painter.isActive()) m_painter.end(); QPixmap tmpPixmap = m_pixmap; m_pixmap = QPixmap(contentsRect().width(), contentsRect().height()); m_pixmap.fill(Qt::transparent); m_painter.begin(&m_pixmap); m_painter.drawPixmap(0, 0, tmpPixmap); m_painter.setPen(QPen(m_color, 3)); } void BlackBoardWidget::paint(QPainter *p, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(widget) p->drawPixmap(option->exposedRect, m_pixmap, option->exposedRect); } void BlackBoardWidget::setBrushColor(QColor color) { m_color = color; m_painter.setPen(QPen(m_color, 3)); } void BlackBoardWidget::erase() { m_pixmap.fill(Qt::transparent); update(contentsRect()); KIO::del(imagePath()); } QString BlackBoardWidget::imagePath() { return KStandardDirs::locateLocal("data", QLatin1String("plasma-desktop-datastorage/blackboard-") + QString::number(m_parentApplet->id()) + QLatin1String(".png")); } #include "moc_blackboardwidget.cpp"