Separate declaration and definition of CalibreStyle

This commit is contained in:
Kovid Goyal 2021-12-06 05:53:02 +05:30
parent a5eedb9f22
commit aea448a5a4
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 264 additions and 257 deletions

View File

@ -4,8 +4,6 @@
#include <QtWidgets/QStyle> #include <QtWidgets/QStyle>
#include <QtWidgets/QApplication> #include <QtWidgets/QApplication>
#include <QDebug> #include <QDebug>
#include <QStyleFactory>
#include <QtWidgets/QProxyStyle>
#include <QStyleOptionToolButton> #include <QStyleOptionToolButton>
#include <QFormLayout> #include <QFormLayout>
#include <QDialogButtonBox> #include <QDialogButtonBox>
@ -120,24 +118,15 @@ dpiScaled(qreal value) {
#endif #endif
} }
class CalibreStyle: public QProxyStyle { CalibreStyle::CalibreStyle(const QHash<unsigned long, QString> &icmap, int transient_scroller) : QProxyStyle(QString::fromUtf8("Fusion")), icon_map(icmap), transient_scroller(transient_scroller) {
private:
const QHash<unsigned long, QString> icon_map;
QByteArray desktop_environment;
QDialogButtonBox::ButtonLayout button_layout;
int transient_scroller;
public:
CalibreStyle(QStyle *base, const QHash<unsigned long, QString> &icmap, int transient_scroller) : QProxyStyle(base), icon_map(icmap), transient_scroller(transient_scroller) {
setObjectName(QString("calibre")); setObjectName(QString("calibre"));
desktop_environment = detectDesktopEnvironment(); desktop_environment = detectDesktopEnvironment();
button_layout = static_cast<QDialogButtonBox::ButtonLayout>(QProxyStyle::styleHint(SH_DialogButtonLayout)); button_layout = static_cast<QDialogButtonBox::ButtonLayout>(QProxyStyle::styleHint(SH_DialogButtonLayout));
if (QLatin1String("GNOME") == desktop_environment || QLatin1String("MATE") == desktop_environment || QLatin1String("UNITY") == desktop_environment || QLatin1String("CINNAMON") == desktop_environment || QLatin1String("X-CINNAMON") == desktop_environment) if (QLatin1String("GNOME") == desktop_environment || QLatin1String("MATE") == desktop_environment || QLatin1String("UNITY") == desktop_environment || QLatin1String("CINNAMON") == desktop_environment || QLatin1String("X-CINNAMON") == desktop_environment)
button_layout = QDialogButtonBox::GnomeLayout; button_layout = QDialogButtonBox::GnomeLayout;
} }
int styleHint(StyleHint hint, const QStyleOption *option = 0, int CalibreStyle::styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget, QStyleHintReturn *returnData) const {
const QWidget *widget = 0, QStyleHintReturn *returnData = 0) const {
switch (hint) { switch (hint) {
case SH_DialogButtonBox_ButtonsHaveIcons: case SH_DialogButtonBox_ButtonsHaveIcons:
return 1; // We want icons on dialog button box buttons return 1; // We want icons on dialog button box buttons
@ -161,18 +150,18 @@ class CalibreStyle: public QProxyStyle {
break; break;
} }
return QProxyStyle::styleHint(hint, option, widget, returnData); return QProxyStyle::styleHint(hint, option, widget, returnData);
} }
QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption * option = 0, const QWidget * widget = 0) const { QIcon CalibreStyle::standardIcon(StandardPixmap standardIcon, const QStyleOption * option, const QWidget * widget) const {
if (standardIcon == QStyle::SP_DialogCloseButton) { if (standardIcon == QStyle::SP_DialogCloseButton) {
bool is_dark_theme = QApplication::instance()->property("is_dark_theme").toBool(); bool is_dark_theme = QApplication::instance()->property("is_dark_theme").toBool();
return QIcon(icon_map.value(QStyle::SP_CustomBase + (is_dark_theme ? 2 : 1))); return QIcon(icon_map.value(QStyle::SP_CustomBase + (is_dark_theme ? 2 : 1)));
} }
if (icon_map.contains(standardIcon)) return QIcon(icon_map.value(standardIcon)); if (icon_map.contains(standardIcon)) return QIcon(icon_map.value(standardIcon));
return QProxyStyle::standardIcon(standardIcon, option, widget); return QProxyStyle::standardIcon(standardIcon, option, widget);
} }
int pixelMetric(PixelMetric metric, const QStyleOption * option = 0, const QWidget * widget = 0) const { int CalibreStyle::pixelMetric(PixelMetric metric, const QStyleOption * option, const QWidget * widget) const {
switch (metric) { switch (metric) {
case PM_TabBarTabVSpace: case PM_TabBarTabVSpace:
return 8; // Make tab bars a little narrower, the value for the Fusion style is 12 return 8; // Make tab bars a little narrower, the value for the Fusion style is 12
@ -182,9 +171,9 @@ class CalibreStyle: public QProxyStyle {
break; break;
} }
return QProxyStyle::pixelMetric(metric, option, widget); return QProxyStyle::pixelMetric(metric, option, widget);
} }
void drawComplexControl(ComplexControl control, const QStyleOptionComplex * option, QPainter * painter, const QWidget * widget = 0) const { void CalibreStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex * option, QPainter * painter, const QWidget * widget) const {
const QStyleOptionToolButton *toolbutton = NULL; const QStyleOptionToolButton *toolbutton = NULL;
switch (control) { switch (control) {
case CC_ToolButton: // {{{ case CC_ToolButton: // {{{
@ -200,9 +189,9 @@ class CalibreStyle: public QProxyStyle {
break; break;
} }
return QProxyStyle::drawComplexControl(control, option, painter, widget); return QProxyStyle::drawComplexControl(control, option, painter, widget);
} }
void drawPrimitive(PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget = 0) const { void CalibreStyle::drawPrimitive(PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget) const {
const QStyleOptionViewItem *vopt = NULL; const QStyleOptionViewItem *vopt = NULL;
switch (element) { switch (element) {
case PE_FrameTabBarBase: // {{{ case PE_FrameTabBarBase: // {{{
@ -322,7 +311,8 @@ class CalibreStyle: public QProxyStyle {
} }
} }
return; // }}} return; // }}}
case PE_FrameFocusRect: // }}}
case PE_FrameFocusRect: // {{{
if (!widget || !widget->property("frame_for_focus").toBool()) if (!widget || !widget->property("frame_for_focus").toBool())
break; break;
if (const QStyleOptionFocusRect *fropt = qstyleoption_cast<const QStyleOptionFocusRect *>(option)) { if (const QStyleOptionFocusRect *fropt = qstyleoption_cast<const QStyleOptionFocusRect *>(option)) {
@ -342,10 +332,9 @@ class CalibreStyle: public QProxyStyle {
break; break;
} }
return QProxyStyle::drawPrimitive(element, option, painter, widget); return QProxyStyle::drawPrimitive(element, option, painter, widget);
} }
void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const { void CalibreStyle::drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const {
const QStyleOptionViewItem *vopt = NULL;
switch(element) { switch(element) {
case CE_ItemViewItem: { case CE_ItemViewItem: {
if (option->state & QStyle::State_HasFocus && (vopt = qstyleoption_cast<const QStyleOptionViewItem *>(option)) && widget && widget->property("highlight_current_item").toBool()) { if (option->state & QStyle::State_HasFocus && (vopt = qstyleoption_cast<const QStyleOptionViewItem *>(option)) && widget && widget->property("highlight_current_item").toBool()) {
@ -357,6 +346,7 @@ class CalibreStyle: public QProxyStyle {
} }
} }
} break; } break;
case CE_MenuItem: // {{{ case CE_MenuItem: // {{{
// Draw menu separators that work in both light and dark modes // Draw menu separators that work in both light and dark modes
if (const QStyleOptionMenuItem *menuItem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) { if (const QStyleOptionMenuItem *menuItem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
@ -385,12 +375,10 @@ class CalibreStyle: public QProxyStyle {
default: break; default: break;
} }
QProxyStyle::drawControl(element, option, painter, widget); QProxyStyle::drawControl(element, option, painter, widget);
} }
};
int load_style(const QHash<unsigned long,QString> &icon_map, int transient_scroller) { int load_style(const QHash<unsigned long,QString> &icon_map, int transient_scroller) {
QStyle *base_style = QStyleFactory::create(QString("Fusion")); QApplication::setStyle(new CalibreStyle(icon_map, transient_scroller));
QApplication::setStyle(new CalibreStyle(base_style, icon_map, transient_scroller));
return 0; return 0;
} }

View File

@ -8,6 +8,8 @@
#include <QMenu> #include <QMenu>
#include <QPropertyAnimation> #include <QPropertyAnimation>
#include <QParallelAnimationGroup> #include <QParallelAnimationGroup>
#include <QProxyStyle>
#include <QDialogButtonBox>
#define arc_length_max 0.734f #define arc_length_max 0.734f
#define arc_length_min 0.02f #define arc_length_min 0.02f
@ -87,6 +89,23 @@ private:
QParallelAnimationGroup m_animation; QParallelAnimationGroup m_animation;
}; };
class CalibreStyle : public QProxyStyle {
private:
const QHash<unsigned long, QString> icon_map;
QByteArray desktop_environment;
QDialogButtonBox::ButtonLayout button_layout;
int transient_scroller;
public:
CalibreStyle(const QHash<unsigned long, QString> &icmap, int transient_scroller);
virtual int styleHint(StyleHint hint, const QStyleOption *option = 0, const QWidget *widget = 0, QStyleHintReturn *returnData = 0) const;
virtual QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption * option = 0, const QWidget * widget = 0) const;
virtual int pixelMetric(PixelMetric metric, const QStyleOption * option = 0, const QWidget * widget = 0) const;
virtual void drawComplexControl(ComplexControl control, const QStyleOptionComplex * option, QPainter * painter, const QWidget * widget = 0) const;
virtual void drawPrimitive(PrimitiveElement element, const QStyleOption * option, QPainter * painter, const QWidget * widget = 0) const;
virtual void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const;
};
/*! /*!
\class QProgressIndicator \class QProgressIndicator
\brief The QProgressIndicator class lets an application display a progress indicator to show that a lengthy task is under way. \brief The QProgressIndicator class lets an application display a progress indicator to show that a lengthy task is under way.