# Conflicts: # .travis.yml # appveyor.yml # data/graphics.qrc # data/img/app/keyboard.svg # data/img/material/black/delete.png # data/img/material/black/delete.svg # data/img/material/black/filepath.svg # data/img/material/black/shortcut.svg # data/img/material/white/filepath.svg # data/img/material/white/shortcut.svg # data/translations/Internationalization_hu.ts # data/translations/Internationalization_ka.ts # external/Qt-Color-Widgets/src/color_wheel.cpp # external/singleapplication/singleapplication.cpp # flameshot.pro # src/cli/commandlineparser.cpp # src/config/buttonlistview.cpp # src/config/configwindow.cpp # src/config/configwindow.h # src/config/geneneralconf.cpp # src/config/geneneralconf.h # src/config/uicoloreditor.cpp # src/config/uicoloreditor.h # src/core/controller.cpp # src/core/globalshortcutfilter.cpp # src/main.cpp # src/third-party/Qt-Color-Widgets/src/color_utils.cpp # src/tools/abstractactiontool.h # src/tools/abstractpathtool.h # src/tools/arrow/arrowtool.cpp # src/tools/arrow/arrowtool.h # src/tools/blur/blurtool.cpp # src/tools/capturetool.h # src/tools/circle/circletool.cpp # src/tools/circle/circletool.h # src/tools/copy/copytool.cpp # src/tools/copy/copytool.h # src/tools/exit/exittool.cpp # src/tools/exit/exittool.h # src/tools/imgur/imguruploader.cpp # src/tools/launcher/applaunchertool.cpp # src/tools/launcher/applaunchertool.h # src/tools/launcher/applauncherwidget.cpp # src/tools/launcher/openwithprogram.cpp # src/tools/line/linetool.cpp # src/tools/line/linetool.h # src/tools/marker/markertool.cpp # src/tools/marker/markertool.h # src/tools/move/movetool.cpp # src/tools/pencil/penciltool.cpp # src/tools/pencil/penciltool.h # src/tools/pin/pintool.cpp # src/tools/pin/pintool.h # src/tools/pin/pinwidget.cpp # src/tools/pixelate/pixelatetool.h # src/tools/rectangle/rectangletool.cpp # src/tools/rectangle/rectangletool.h # src/tools/redo/redotool.cpp # src/tools/redo/redotool.h # src/tools/save/savetool.cpp # src/tools/save/savetool.h # src/tools/selection/selectiontool.cpp # src/tools/selection/selectiontool.h # src/tools/sizeindicator/sizeindicatortool.cpp # src/tools/sizeindicator/sizeindicatortool.h # src/tools/storage/imgur/imguruploader.h # src/tools/storage/imgur/imguruploadertool.cpp # src/tools/storage/imgur/imguruploadertool.h # src/tools/text/textconfig.cpp # src/tools/text/texttool.cpp # src/tools/text/texttool.h # src/tools/toolfactory.cpp # src/tools/toolfactory.h # src/tools/undo/undotool.cpp # src/tools/undo/undotool.h # src/utils/confighandler.cpp # src/utils/confighandler.h # src/utils/dbusutils.cpp # src/utils/screenshotsaver.cpp # src/utils/screenshotsaver.h # src/widgets/capture/buttonhandler.cpp # src/widgets/capture/buttonhandler.h # src/widgets/capture/capturebutton.cpp # src/widgets/capture/capturebutton.h # src/widgets/capture/capturewidget.cpp # src/widgets/capture/capturewidget.h # src/widgets/capture/colorpicker.cpp # src/widgets/capturelauncher.cpp # src/widgets/infowindow.cpp # src/widgets/infowindow.h # src/widgets/panel/sidepanelwidget.cpp # src/widgets/panel/utilitypanel.cpp # src/widgets/panel/utilitypanel.h # translations/Internationalization_ca.ts # translations/Internationalization_de_DE.ts # translations/Internationalization_es.ts # translations/Internationalization_fr.ts # translations/Internationalization_ja.ts # translations/Internationalization_nl.ts # translations/Internationalization_pl.ts # translations/Internationalization_pt_br.ts # translations/Internationalization_ru.ts # translations/Internationalization_sk.ts # translations/Internationalization_sr.ts # translations/Internationalization_tr.ts # translations/Internationalization_uk.ts # translations/Internationalization_zh_CN.ts # translations/Internationalization_zh_TW.ts
150 lines
4.9 KiB
C++
150 lines
4.9 KiB
C++
/// Copyright(c) 2017-2019 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 <http://www.gnu.org/licenses/>.
|
|
|
|
#include "colorpicker.h"
|
|
#include "src/utils/confighandler.h"
|
|
#include "src/utils/globalvalues.h"
|
|
#include <QMouseEvent>
|
|
#include <QPainter>
|
|
|
|
ColorPicker::ColorPicker(QWidget* parent)
|
|
: QWidget(parent)
|
|
{
|
|
ConfigHandler config;
|
|
m_colorList = config.getUserColors();
|
|
m_colorAreaSize = GlobalValues::buttonBaseSize() * 0.6;
|
|
setMouseTracking(true);
|
|
// save the color values in member variables for faster access
|
|
m_uiColor = config.uiMainColorValue();
|
|
m_drawColor = config.drawColorValue();
|
|
// extraSize represents the extra space needed for the highlight of the
|
|
// selected color.
|
|
const int extraSize = 6;
|
|
double radius = (m_colorList.size() * m_colorAreaSize / 1.3) / 3.141592;
|
|
resize(radius * 2 + m_colorAreaSize + extraSize,
|
|
radius * 2 + m_colorAreaSize + extraSize);
|
|
double degree = 360 / (m_colorList.size());
|
|
double degreeAcum = degree;
|
|
// this line is the radius of the circle which will be rotated to add
|
|
// the color components.
|
|
QLineF baseLine =
|
|
QLineF(QPoint(radius + extraSize / 2, radius + extraSize / 2),
|
|
QPoint(radius * 2, radius));
|
|
|
|
for (int i = 0; i < m_colorList.size(); ++i) {
|
|
m_colorAreaList.append(QRect(
|
|
baseLine.x2(), baseLine.y2(), m_colorAreaSize, m_colorAreaSize));
|
|
baseLine.setAngle(degreeAcum);
|
|
degreeAcum += degree;
|
|
}
|
|
}
|
|
|
|
QColor ColorPicker::drawColor()
|
|
{
|
|
return m_drawColor;
|
|
}
|
|
|
|
void ColorPicker::show()
|
|
{
|
|
grabMouse();
|
|
QWidget::show();
|
|
}
|
|
|
|
void ColorPicker::hide()
|
|
{
|
|
releaseMouse();
|
|
QWidget::hide();
|
|
}
|
|
|
|
void ColorPicker::paintEvent(QPaintEvent*)
|
|
{
|
|
QPainter painter(this);
|
|
painter.setRenderHint(QPainter::Antialiasing);
|
|
|
|
QVector<QRect> rects = handleMask();
|
|
painter.setPen(QColor(Qt::black));
|
|
for (int i = 0; i < rects.size(); ++i) {
|
|
// draw the highlight when we have to draw the selected color
|
|
if (m_drawColor == QColor(m_colorList.at(i))) {
|
|
QColor c = QColor(m_uiColor);
|
|
c.setAlpha(155);
|
|
painter.setBrush(c);
|
|
c.setAlpha(100);
|
|
painter.setPen(c);
|
|
QRect highlight = rects.at(i);
|
|
highlight.moveTo(highlight.x() - 3, highlight.y() - 3);
|
|
highlight.setHeight(highlight.height() + 6);
|
|
highlight.setWidth(highlight.width() + 6);
|
|
painter.drawRoundedRect(highlight, 100, 100);
|
|
painter.setPen(QColor(Qt::black));
|
|
}
|
|
|
|
// draw available colors
|
|
if (m_colorList.at(i).isValid()) {
|
|
// draw preset color
|
|
painter.setBrush(QColor(m_colorList.at(i)));
|
|
painter.drawRoundRect(rects.at(i), 100, 100);
|
|
} else {
|
|
// draw rainbow (part) for custom color
|
|
QRect lastRect = rects.at(i);
|
|
int nStep = 1;
|
|
int nSteps = lastRect.height() / nStep;
|
|
// 0.02 - start rainbow color, 0.33 - end rainbow color from range:
|
|
// 0.0 - 1.0
|
|
float h = 0.02;
|
|
for (int radius = nSteps; radius > 0; radius -= nStep * 2) {
|
|
// calculate color
|
|
float fHStep = (0.33 - h) / (nSteps / nStep / 2);
|
|
QColor color = QColor::fromHslF(h, 0.95, 0.5);
|
|
|
|
// set color and draw circle
|
|
painter.setPen(color);
|
|
painter.setBrush(color);
|
|
painter.drawRoundRect(lastRect, 100, 100);
|
|
|
|
// set next color, circle geometry
|
|
h += fHStep;
|
|
lastRect.setX(lastRect.x() + nStep);
|
|
lastRect.setY(lastRect.y() + nStep);
|
|
lastRect.setHeight(lastRect.height() - nStep);
|
|
lastRect.setWidth(lastRect.width() - nStep);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void ColorPicker::mouseMoveEvent(QMouseEvent* e)
|
|
{
|
|
for (int i = 0; i < m_colorList.size(); ++i) {
|
|
if (m_colorAreaList.at(i).contains(e->pos())) {
|
|
m_drawColor = m_colorList.at(i);
|
|
emit colorSelected(m_drawColor);
|
|
update();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
QVector<QRect> ColorPicker::handleMask() const
|
|
{
|
|
QVector<QRect> areas;
|
|
for (const QRect& rect : m_colorAreaList) {
|
|
areas.append(rect);
|
|
}
|
|
return areas;
|
|
}
|