diff --git a/plotsnapshotoverlay.cpp b/plotsnapshotoverlay.cpp new file mode 100644 --- /dev/null +++ b/plotsnapshotoverlay.cpp @@ -0,0 +1,65 @@ +/* + Copyright © 2015 Hasan Yavuz Özderya + + This file is part of serialplot. + + serialplot 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. + + serialplot 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 serialplot. If not, see . +*/ + +#include +#include + +#include "plotsnapshotoverlay.h" + +#define LINE_WIDTH (10) +#define ANIM_LENGTH (500) // milliseconds +#define UPDATE_PERIOD (20) // milliseconds + +PlotSnapshotOverlay::PlotSnapshotOverlay(QWidget* widget, QColor color) : + QwtWidgetOverlay(widget) +{ + _color = color; + animTimer.setSingleShot(true); + animTimer.setInterval(ANIM_LENGTH); + updateTimer.setSingleShot(false); + updateTimer.setInterval(UPDATE_PERIOD); + + connect(&updateTimer, &QTimer::timeout, [this](){this->updateOverlay();}); + connect(&animTimer, &QTimer::timeout, &updateTimer, &QTimer::stop); + connect(&animTimer, &QTimer::timeout, this, &PlotSnapshotOverlay::done); + + animTimer.start(); + updateTimer.start(); +} + +void PlotSnapshotOverlay::drawOverlay(QPainter* painter) const +{ + if (!animTimer.isActive()) return; + QColor lineColor = _color; + + double fadingRatio = ((double) animTimer.remainingTime()) / ANIM_LENGTH; + lineColor.setAlpha(std::min(255, (int) (255*fadingRatio))); + + QPen pen(lineColor); + pen.setWidth(LINE_WIDTH); + pen.setJoinStyle(Qt::MiterJoin); + + int width = painter->device()->width(); + int height = painter->device()->height(); + + painter->save(); + painter->setPen(pen); + painter->drawRect(LINE_WIDTH/2, LINE_WIDTH/2, width-LINE_WIDTH, height-LINE_WIDTH); + painter->restore(); +}