forked from qt-creator/qt-creator
Core: Fix handling of high dpi for self provided cursors
When using the cursors provided by QC we should scale them according to the pixel ratio otherwise the icons appear too small. Task-number: QTCREATORBUG-29980 Change-Id: Ia9de8a5adf4bbd457971260edc52f824ddb7564f Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
@@ -8,6 +8,7 @@
|
|||||||
#include <utils/stylehelper.h>
|
#include <utils/stylehelper.h>
|
||||||
#include <utils/theme/theme.h>
|
#include <utils/theme/theme.h>
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
#include <QPaintEvent>
|
#include <QPaintEvent>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QSplitterHandle>
|
#include <QSplitterHandle>
|
||||||
@@ -15,8 +16,14 @@
|
|||||||
namespace Core {
|
namespace Core {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
|
static QBitmap scaledBitmap(const QBitmap &other, qreal factor)
|
||||||
|
{
|
||||||
|
QTransform trans = QTransform::fromScale(factor, factor);
|
||||||
|
return other.transformed(trans);
|
||||||
|
}
|
||||||
|
|
||||||
// cursor images / masks taken from qplatformcursor.cpp
|
// cursor images / masks taken from qplatformcursor.cpp
|
||||||
static QCursor hsplitCursor()
|
static QCursor hsplitCursor(qreal ratio)
|
||||||
{
|
{
|
||||||
static const uchar hsplit_bits[] = {
|
static const uchar hsplit_bits[] = {
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
@@ -42,14 +49,13 @@ static QCursor hsplitCursor()
|
|||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
|
||||||
static QBitmap cursorImg = QBitmap::fromData({32, 32}, hsplit_bits);
|
static QBitmap cursorImg = QBitmap::fromData({32, 32}, hsplit_bits);
|
||||||
static QBitmap mask = QBitmap::fromData({32, 32}, hsplitm_bits);
|
static QBitmap mask = QBitmap::fromData({32, 32}, hsplitm_bits);
|
||||||
static QCursor cursor(cursorImg, mask, 15, 15);
|
return QCursor(scaledBitmap(cursorImg, ratio), scaledBitmap(mask, ratio),
|
||||||
return cursor;
|
15 * ratio, 15 * ratio);
|
||||||
}
|
}
|
||||||
|
|
||||||
static QCursor vsplitCursor()
|
static QCursor vsplitCursor(qreal ratio)
|
||||||
{
|
{
|
||||||
static const uchar vsplit_bits[] = {
|
static const uchar vsplit_bits[] = {
|
||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
@@ -77,8 +83,8 @@ static QCursor vsplitCursor()
|
|||||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
static QBitmap cursorImg = QBitmap::fromData({32, 32}, vsplit_bits);
|
static QBitmap cursorImg = QBitmap::fromData({32, 32}, vsplit_bits);
|
||||||
static QBitmap mask = QBitmap::fromData({32, 32}, vsplitm_bits);
|
static QBitmap mask = QBitmap::fromData({32, 32}, vsplitm_bits);
|
||||||
static QCursor cursor(cursorImg, mask, 15, 15);
|
return QCursor(scaledBitmap(cursorImg, ratio), scaledBitmap(mask, ratio),
|
||||||
return cursor;
|
15 * ratio, 15 * ratio);
|
||||||
}
|
}
|
||||||
|
|
||||||
class MiniSplitterHandle : public QSplitterHandle
|
class MiniSplitterHandle : public QSplitterHandle
|
||||||
@@ -109,10 +115,12 @@ using namespace Core::Internal;
|
|||||||
bool MiniSplitterHandle::event(QEvent *event)
|
bool MiniSplitterHandle::event(QEvent *event)
|
||||||
{
|
{
|
||||||
if (generalSettings().provideSplitterCursors()) {
|
if (generalSettings().provideSplitterCursors()) {
|
||||||
if (event->type() == QEvent::HoverEnter)
|
if (event->type() == QEvent::HoverEnter) {
|
||||||
setCursor(orientation() == Qt::Horizontal ? hsplitCursor() : vsplitCursor());
|
const qreal ratio = screen()->devicePixelRatio();
|
||||||
else if (event->type() == QEvent::HoverLeave)
|
setCursor(orientation() == Qt::Horizontal ? hsplitCursor(ratio) : vsplitCursor(ratio));
|
||||||
|
} else if (event->type() == QEvent::HoverLeave) {
|
||||||
unsetCursor();
|
unsetCursor();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return QSplitterHandle::event(event);
|
return QSplitterHandle::event(event);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user