KShare/src/utils.cpp

116 lines
3.6 KiB
C++
Raw Normal View History

#include "utils.hpp"
2017-04-23 15:05:48 +02:00
#include <QApplication>
#include <QClipboard>
#include <QDebug>
2017-05-13 23:33:36 +02:00
#include <QPainter>
2017-04-23 15:05:48 +02:00
#include <QPixmap>
#include <QScreen>
2017-05-13 23:33:36 +02:00
#include <platformbackend.hpp>
2017-04-23 15:05:48 +02:00
QColor utils::invertColor(QColor color) {
return QColor(255 - color.red(), 255 - color.green(), 255 - color.blue());
}
QPixmap utils::extend(QPixmap img, int extraSize, QColor hl) {
QPixmap newImg(img.width() + extraSize * 2, img.height() + extraSize * 2);
newImg.fill(hl);
QPainter ptr(&newImg);
ptr.drawPixmap(extraSize, extraSize, img);
ptr.end();
return newImg;
}
QPixmap utils::fullscreen(bool cursor) {
2017-07-03 16:14:19 +02:00
QPixmap image;
2017-07-03 16:18:56 +02:00
QPainter painter;
QPoint smallestCoordinate = smallestScreenCoordinate();
2017-07-03 16:14:19 +02:00
// Hack for https://bugreports.qt.io/browse/QTBUG-58110
2017-07-03 16:25:54 +02:00
#ifdef Q_OS_LINUX
static QStringList qVer = QString(qVersion()).split('.');
2017-07-03 16:14:19 +02:00
if (qVer.at(0).toInt() == 5 && qVer.at(1).toInt() < 9) {
2017-07-03 16:23:44 +02:00
image = window(0);
painter.begin(&image);
} else {
2017-07-03 16:25:54 +02:00
#endif
int height = 0, width = 0;
int ox = smallestCoordinate.x() * -1, oy = smallestCoordinate.y() * -1;
2017-07-03 16:14:19 +02:00
for (QScreen *screen : QApplication::screens()) {
QRect geo = screen->geometry();
width = qMax(ox + geo.left() + geo.width(), width);
height = qMax(oy + geo.top() + geo.height(), height);
2017-07-03 16:14:19 +02:00
}
image = QPixmap(width, height);
image.fill(Qt::transparent);
width = 0;
2017-07-03 16:18:56 +02:00
painter.begin(&image);
painter.translate(ox, oy);
2017-07-03 16:14:19 +02:00
for (QScreen *screen : QApplication::screens()) {
QPixmap currentScreen = window(0, screen);
QRect geo = screen->geometry();
painter.drawPixmap(geo.left(), geo.top(), geo.width(), geo.height(), currentScreen);
2017-07-03 16:14:19 +02:00
width += screen->size().width();
}
2017-07-03 16:25:54 +02:00
#ifdef Q_OS_LINUX
2017-07-03 16:18:56 +02:00
}
2017-07-03 16:25:54 +02:00
#endif
#ifdef PLATFORM_CAPABILITY_CURSOR
if (cursor) {
auto cursorData = PlatformBackend::inst().getCursor();
painter.drawPixmap(QCursor::pos() - std::get<0>(cursorData), std::get<1>(cursorData));
}
#endif
painter.end();
2017-07-01 17:24:03 +02:00
return image;
}
2017-04-23 15:05:48 +02:00
QPixmap utils::window(WId wid, QScreen *w) {
return w->grabWindow(wid);
2017-04-23 15:05:48 +02:00
}
void utils::toClipboard(QString value) {
QApplication::clipboard()->setText(value);
2017-04-23 15:05:48 +02:00
}
2017-05-19 22:32:23 +02:00
QPixmap utils::fullscreenArea(bool cursor, qreal x, qreal y, qreal w, qreal h) {
return fullscreen(cursor).copy(x, y, w, h);
2017-05-19 22:32:23 +02:00
}
QPoint utils::smallestScreenCoordinate() {
QPoint smallestCoordinate;
for (QScreen *screen : QApplication::screens()) {
smallestCoordinate.rx() = qMin(smallestCoordinate.x(), screen->geometry().left());
smallestCoordinate.ry() = qMin(smallestCoordinate.y(), screen->geometry().top());
}
return smallestCoordinate;
}
QPixmap utils::renderText(QString toRender, int padding, QColor background, QColor pen, QFont font) {
2017-07-09 21:04:21 +02:00
QFontMetrics metric(font);
QStringList lines = toRender.replace("\r", "").split('\n');
QSize resultingSize(0, padding * 2);
int lineSpace = metric.leading();
for (QString line : lines) {
QRect br = metric.boundingRect(line);
resultingSize.rheight() += lineSpace + br.height();
resultingSize.rwidth() = qMax(br.width(), resultingSize.width());
}
resultingSize.rwidth() += padding * 2;
QPixmap renderred(resultingSize);
renderred.fill(background);
QPainter painter(&renderred);
painter.setPen(pen);
int y = padding;
for (QString line : lines) {
QRect br = metric.boundingRect(line);
painter.drawText(padding, y, br.width(), br.height(), 0, line);
y += lineSpace + br.height();
}
painter.end();
return renderred;
}