// Copyright(c) 2017-2018 Alejandro Sirgo Rica & Contributors // // This file is part of Flameshot. // // Flameshot 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. // // Flameshot 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 Flameshot. If not, see . #include "selectionwidget.h" #include "src/utils/globalvalues.h" #include #include SelectionWidget::SelectionWidget(const QColor &c, QWidget *parent) : QWidget(parent), m_color(c) { m_animation = new QPropertyAnimation(this, "geometry", this); m_animation->setEasingCurve(QEasingCurve::InOutQuad); m_animation->setDuration(200); connect(m_animation, &QPropertyAnimation::finished, this, &SelectionWidget::animationEnded); setAttribute(Qt::WA_TransparentForMouseEvents); int sideVal = GlobalValues::buttonBaseSize() * 0.6; int handleSide = sideVal / 2; const QRect areaRect(0, 0, sideVal, sideVal); const QRect handleRect(0, 0, handleSide, handleSide); m_TLHandle = m_TRHandle = m_BLHandle = m_BRHandle = m_LHandle = m_THandle = m_RHandle = m_BHandle= handleRect; m_TLArea = m_TRArea = m_BLArea = m_BRArea = areaRect; m_areaOffset = QPoint(-sideVal/2, -sideVal/2); m_handleOffset = QPoint(-handleSide/2, -handleSide/2); } SelectionWidget::SideType SelectionWidget::getMouseSide(const QPoint &point) const { if (m_TLArea.contains(point)) { return TOPLEFT_SIDE; } else if (m_TRArea.contains(point)) { return TOPRIGHT_SIDE; } else if (m_BLArea.contains(point)) { return BOTTONLEFT_SIDE; } else if (m_BRArea.contains(point)) { return BOTTONRIGHT_SIDE; } else if (m_LArea.contains(point)) { return LEFT_SIDE; } else if (m_TArea.contains(point)) { return TOP_SIDE; } else if (m_RArea.contains(point)) { return RIGHT_SIDE; } else if (m_BArea.contains(point)) { return BOTTON_SIDE; } else { return NO_SIDE; } } QVector SelectionWidget::handlerAreas() { QVector areas; areas << m_TLHandle << m_TRHandle << m_BLHandle << m_BRHandle <setStartValue(geometry()); m_animation->setEndValue(r); m_animation->start(); } } void SelectionWidget::saveGeometry() { m_geometryBackup = geometry(); } QRect SelectionWidget::savedGeometry() { return m_geometryBackup; } void SelectionWidget::paintEvent(QPaintEvent *) { QPainter p(this); p.setPen(m_color); p.drawRect(rect() + QMargins(0, 0, -1, -1)); } void SelectionWidget::resizeEvent(QResizeEvent *) { updateAreas(); } void SelectionWidget::moveEvent(QMoveEvent *) { updateAreas(); } void SelectionWidget::updateColor(const QColor &c) { m_color = c; } void SelectionWidget::updateAreas() { QRect r = rect(); m_TLArea.moveTo(m_areaOffset + pos()); m_TRArea.moveTo(r.topRight() + m_areaOffset + pos()); m_BLArea.moveTo(r.bottomLeft() + m_areaOffset + pos()); m_BRArea.moveTo(r.bottomRight() + m_areaOffset + pos()); m_LArea = QRect(m_TLArea.bottomLeft(), m_BLArea.topRight()); m_TArea = QRect(m_TLArea.topRight(), m_TRArea.bottomLeft()); m_RArea = QRect(m_TRArea.bottomLeft(), m_BRArea.topRight()); m_BArea = QRect(m_BLArea.topRight(), m_BRArea.bottomLeft()); m_TLHandle.moveTo(m_TLArea.center() + m_handleOffset); m_BLHandle.moveTo(m_BLArea.center() + m_handleOffset); m_TRHandle.moveTo(m_TRArea.center() + m_handleOffset); m_BRHandle.moveTo(m_BRArea.center() + m_handleOffset); m_LHandle.moveTo(m_LArea.center() + m_handleOffset); m_THandle.moveTo(m_TArea.center() + m_handleOffset); m_RHandle.moveTo(m_RArea.center() + m_handleOffset); m_BHandle.moveTo(m_BArea.center() + m_handleOffset); }