diff --git a/flameshot.pro b/flameshot.pro index 36c2907f..2fef15d4 100644 --- a/flameshot.pro +++ b/flameshot.pro @@ -113,6 +113,7 @@ SOURCES += src/main.cpp \ src/utils/desktopfileparse.cpp \ src/tools/launcher/launcheritemdelegate.cpp \ src/tools/blur/blurtool.cpp \ + src/tools/pin/pintool.cpp \ src/tools/launcher/terminallauncher.cpp \ src/config/visualseditor.cpp \ src/config/extendedslider.cpp \ @@ -128,7 +129,8 @@ SOURCES += src/main.cpp \ src/utils/globalvalues.cpp \ src/widgets/capture/utilitypanel.cpp \ src/widgets/capture/hovereventfilter.cpp \ - src/widgets/capture/selectionwidget.cpp + src/widgets/capture/selectionwidget.cpp \ + src/tools/pin/pinwidget.cpp HEADERS += src/widgets/capture/buttonhandler.h \ src/widgets/infowindow.h \ @@ -178,6 +180,7 @@ HEADERS += src/widgets/capture/buttonhandler.h \ src/utils/desktopfileparse.h \ src/tools/launcher/launcheritemdelegate.h \ src/tools/blur/blurtool.h \ + src/tools/pin/pintool.h \ src/tools/launcher/terminallauncher.h \ src/config/visualseditor.h \ src/config/extendedslider.h \ @@ -193,7 +196,8 @@ HEADERS += src/widgets/capture/buttonhandler.h \ src/tools/abstractactiontool.h \ src/widgets/capture/utilitypanel.h \ src/widgets/capture/hovereventfilter.h \ - src/widgets/capture/selectionwidget.h + src/widgets/capture/selectionwidget.h \ + src/tools/pin/pinwidget.h unix:!macx { SOURCES += src/core/flameshotdbusadapter.cpp \ diff --git a/graphics.qrc b/graphics.qrc index 095114e8..963c8b1f 100644 --- a/graphics.qrc +++ b/graphics.qrc @@ -45,5 +45,7 @@ img/buttonIconsWhite/blur.png img/buttonIconsBlack/redo-variant.png img/buttonIconsWhite/redo-variant.png + img/buttonIconsBlack/pin.png + img/buttonIconsWhite/pin.png diff --git a/img/buttonIconsBlack/pin.png b/img/buttonIconsBlack/pin.png new file mode 100644 index 00000000..7a3eee88 Binary files /dev/null and b/img/buttonIconsBlack/pin.png differ diff --git a/img/buttonIconsBlack/pin.svg b/img/buttonIconsBlack/pin.svg new file mode 100644 index 00000000..66bbe0fe --- /dev/null +++ b/img/buttonIconsBlack/pin.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/img/buttonIconsWhite/pin.png b/img/buttonIconsWhite/pin.png new file mode 100644 index 00000000..2b6e113b Binary files /dev/null and b/img/buttonIconsWhite/pin.png differ diff --git a/img/buttonIconsWhite/pin.svg b/img/buttonIconsWhite/pin.svg new file mode 100644 index 00000000..901a9228 --- /dev/null +++ b/img/buttonIconsWhite/pin.svg @@ -0,0 +1,48 @@ + +image/svg+xml \ No newline at end of file diff --git a/src/tools/pin/pintool.cpp b/src/tools/pin/pintool.cpp new file mode 100755 index 00000000..de0cdaeb --- /dev/null +++ b/src/tools/pin/pintool.cpp @@ -0,0 +1,62 @@ +// 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 "pintool.h" +#include "src/tools/pin/pinwidget.h" + +PinTool::PinTool(QObject *parent) : AbstractActionTool(parent) { + +} + +bool PinTool::closeOnButtonPressed() const { + return true; +} + +QIcon PinTool::icon(const QColor &background, bool inEditor) const { + Q_UNUSED(inEditor); + return QIcon(iconPath(background) + "pin.png"); +} +QString PinTool::name() const { + return tr("Pin Tool"); +} + +QString PinTool::nameID() { + return ""; +} + +QString PinTool::description() const { + return tr("Pin image on the desktop"); +} + +QWidget* PinTool::widget() { + PinWidget *w = new PinWidget(m_pixmap); + w->setGeometry(m_geometry); + return w; +} + +CaptureTool* PinTool::copy(QObject *parent) { + return new PinTool(parent); +} + +void PinTool::pressed(const CaptureContext &context) { + emit requestAction(REQ_CAPTURE_DONE_OK); + m_geometry = context.selection; + m_geometry.setTopLeft(m_geometry.topLeft() + context.widgetOffset); + m_pixmap = context.selectedScreenshotArea(); + emit requestAction(REQ_ADD_EXTERNAL_WIDGETS); + +} diff --git a/src/tools/pin/pintool.h b/src/tools/pin/pintool.h new file mode 100755 index 00000000..045e4b02 --- /dev/null +++ b/src/tools/pin/pintool.h @@ -0,0 +1,44 @@ +// 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 . + +#pragma once + +#include "src/tools/abstractactiontool.h" + +class PinTool : public AbstractActionTool { + Q_OBJECT +public: + explicit PinTool(QObject *parent = nullptr); + + bool closeOnButtonPressed() const; + + QIcon icon(const QColor &background, bool inEditor) const override; + QString name() const override; + static QString nameID(); + QString description() const override; + + QWidget* widget() override; + + CaptureTool* copy(QObject *parent = nullptr) override; + +public slots: + void pressed(const CaptureContext &context) override; + +private: + QRect m_geometry; + QPixmap m_pixmap; +}; diff --git a/src/tools/pin/pinwidget.cpp b/src/tools/pin/pinwidget.cpp new file mode 100644 index 00000000..d4b63145 --- /dev/null +++ b/src/tools/pin/pinwidget.cpp @@ -0,0 +1,75 @@ +// 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 "pinwidget.h" +#include +#include +#include +#include +#include + +PinWidget::PinWidget(const QPixmap &pixmap, QWidget *parent) : + QWidget(parent), m_pixmap(pixmap) +{ + setWindowFlags(Qt::WindowStaysOnTopHint + | Qt::FramelessWindowHint); + m_layout = new QVBoxLayout(this); + + m_label = new QLabel(); + m_label->setPixmap(m_pixmap); + m_layout->addWidget(m_label); + + new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q), this, SLOT(close())); + new QShortcut(Qt::Key_Escape, this, SLOT(close())); +} + +void PinWidget::wheelEvent(QWheelEvent *e) { + int val = e->delta() > 0 ? 5 : -5; + int newWidth = qBound(50, m_label->width() + val, maximumWidth()); + int newHeight = qBound(50, m_label->height() + val, maximumHeight()); + + QSize size(newWidth, newHeight); + setScaledPixmap(size); + adjustSize(); + + e->accept(); +} + +void PinWidget::mouseDoubleClickEvent(QMouseEvent *) { + close(); +} + +void PinWidget::mousePressEvent(QMouseEvent *e) { + m_dragStart = e->globalPos(); + m_offsetX = e->localPos().x() / width(); + m_offsetY = e->localPos().y() / height(); +} + +void PinWidget::mouseMoveEvent(QMouseEvent *e) { + const QPoint delta = e->globalPos() - m_dragStart; + int offsetW = width() * m_offsetX; + int offsetH = height() * m_offsetY; + move(m_dragStart.x() + delta.x() - offsetW, m_dragStart.y() + delta.y() - offsetH); +} + +void PinWidget::setScaledPixmap(const QSize &size) { + const qreal scale = qApp->devicePixelRatio(); + QPixmap scaledPixmap = m_pixmap.scaled(size * scale, Qt::KeepAspectRatio, + Qt::SmoothTransformation); + scaledPixmap.setDevicePixelRatio(scale); + m_label->setPixmap(scaledPixmap); +} diff --git a/src/tools/pin/pinwidget.h b/src/tools/pin/pinwidget.h new file mode 100644 index 00000000..75b8c1a5 --- /dev/null +++ b/src/tools/pin/pinwidget.h @@ -0,0 +1,44 @@ +// 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 . + +#pragma once + +#include + +class QVBoxLayout; +class QLabel; + +class PinWidget : public QWidget { + Q_OBJECT +public: + explicit PinWidget(const QPixmap &pixmap, QWidget *parent = nullptr); + +protected: + void wheelEvent(QWheelEvent *e); + void mouseDoubleClickEvent(QMouseEvent *); + void mousePressEvent(QMouseEvent *); + void mouseMoveEvent(QMouseEvent *); + +private: + void setScaledPixmap(const QSize &size); + + QPixmap m_pixmap; + QVBoxLayout *m_layout; + QLabel *m_label; + QPoint m_dragStart; + qreal m_offsetX, m_offsetY; +}; diff --git a/src/tools/toolfactory.cpp b/src/tools/toolfactory.cpp index 468b7734..c7ed19ec 100644 --- a/src/tools/toolfactory.cpp +++ b/src/tools/toolfactory.cpp @@ -33,6 +33,7 @@ #include "launcher/applaunchertool.h" #include "blur/blurtool.h" #include "redo/redotool.h" +#include "pin/pintool.h" ToolFactory::ToolFactory(QObject *parent) : QObject(parent) { @@ -95,6 +96,9 @@ CaptureTool* ToolFactory::CreateTool( case CaptureButton::TYPE_BLUR: tool = new BlurTool(parent); break; + case CaptureButton::TYPE_PIN: + tool = new PinTool(parent); + break; default: tool = nullptr; break; diff --git a/src/widgets/capture/capturebutton.cpp b/src/widgets/capture/capturebutton.cpp index c426ee6c..d4240497 100644 --- a/src/widgets/capture/capturebutton.cpp +++ b/src/widgets/capture/capturebutton.cpp @@ -166,6 +166,7 @@ static std::map buttonTypeOrder { { CaptureButton::TYPE_EXIT, 14 }, { CaptureButton::TYPE_IMAGEUPLOADER, 15 }, { CaptureButton::TYPE_OPEN_APP, 16 }, + { CaptureButton::TYPE_PIN, 17 }, { CaptureButton::TYPE_BLUR, 7 }, { CaptureButton::TYPE_REDO, 11 }, }; @@ -193,4 +194,5 @@ QVector CaptureButton::iterableButtonTypes = { CaptureButton::TYPE_EXIT, CaptureButton::TYPE_IMAGEUPLOADER, CaptureButton::TYPE_OPEN_APP, + CaptureButton::TYPE_PIN, }; diff --git a/src/widgets/capture/capturebutton.h b/src/widgets/capture/capturebutton.h index ec68f218..7ed11ddd 100644 --- a/src/widgets/capture/capturebutton.h +++ b/src/widgets/capture/capturebutton.h @@ -50,6 +50,7 @@ public: TYPE_OPEN_APP = 14, TYPE_BLUR = 15, TYPE_REDO = 16, + TYPE_PIN = 17, }; CaptureButton() = delete;