81 lines
2.7 KiB
C++
81 lines
2.7 KiB
C++
#include "colorpicker.h"
|
|
#include "ui_colorpicker.h"
|
|
|
|
#include <QtWidgets>
|
|
|
|
const int zoom_box_dimensions = 15;
|
|
|
|
ColorPicker::ColorPicker(QWidget *parent) :
|
|
QDialog(parent),
|
|
ui(new Ui::ColorPicker)
|
|
{
|
|
ui->setupUi(this);
|
|
|
|
this->scene = new QGraphicsScene;
|
|
|
|
// listen for spacebar press to take color
|
|
QShortcut *takeColor = new QShortcut(Qt::Key_Space, this);
|
|
QObject::connect(takeColor, &QShortcut::activated, [this](){
|
|
timer->stop();
|
|
this->accept();
|
|
});
|
|
|
|
// need to set up a timer because there is no good way to get global mouse movement
|
|
// outside of the application in a cross-platform way
|
|
timer = new QTimer(this);
|
|
connect(timer, &QTimer::timeout, [this]() {
|
|
QPoint cursorPos = QCursor::pos();
|
|
if (lastCursorPos != cursorPos) {
|
|
lastCursorPos = cursorPos;
|
|
this->hover(cursorPos.x(), cursorPos.y());
|
|
}
|
|
});
|
|
timer->start(10);
|
|
}
|
|
|
|
ColorPicker::~ColorPicker()
|
|
{
|
|
delete scene;
|
|
delete timer;
|
|
delete ui;
|
|
}
|
|
|
|
void ColorPicker::hover(int mouseX, int mouseY) {
|
|
QScreen *screen = QGuiApplication::primaryScreen();
|
|
if (const QWindow *window = windowHandle())
|
|
screen = window->screen();
|
|
if (!screen)
|
|
return;
|
|
|
|
// 15 X 15 box with 8x magnification = 120px square)
|
|
QRect zoomRect(mouseX - zoom_box_dimensions / 2, mouseY - zoom_box_dimensions / 2, zoom_box_dimensions, zoom_box_dimensions);
|
|
QPixmap grab = screen->grabWindow(0, mouseX - zoom_box_dimensions / 2, mouseY - zoom_box_dimensions / 2, zoom_box_dimensions, zoom_box_dimensions);
|
|
int pixelRatio = grab.devicePixelRatio();
|
|
|
|
// TODO: investigate for high dpi displays why text is too high res
|
|
grab.setDevicePixelRatio(1);
|
|
QPixmap magnified = grab.scaled(zoom_box_dimensions * 8, zoom_box_dimensions * 8, Qt::KeepAspectRatio);
|
|
|
|
QPainter painter(&magnified);
|
|
painter.setRenderHint(QPainter::Antialiasing, false);
|
|
QRectF rect(zoom_box_dimensions / 2 * 8 - 1, zoom_box_dimensions / 2 * 8 - 1, zoom_box_dimensions / 2 + 2, zoom_box_dimensions / 2 + 2);
|
|
painter.drawRect(rect);
|
|
painter.end();
|
|
|
|
// TODO: bounds checking?
|
|
|
|
this->color = grab.toImage().pixelColor(zoom_box_dimensions / 2 * pixelRatio, zoom_box_dimensions / 2 * pixelRatio);
|
|
int r = this->color.red();
|
|
int g = this->color.green();
|
|
int b = this->color.blue();
|
|
|
|
// update the displayed color value
|
|
QString rgb = QString("rgb(%1, %2, %3)").arg(r).arg(g).arg(b);
|
|
QString stylesheet = QString("background-color: %1;").arg(rgb);
|
|
this->ui->frame_centralColor->setStyleSheet(stylesheet);
|
|
|
|
this->ui->label_RGB->setText(rgb);
|
|
this->ui->label_HEX->setText(color.name());
|
|
|
|
this->ui->viewport->setPixmap(magnified);
|
|
}
|