From 16bae8546ecbeca40039536c9819872de5ffa0dc Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Mon, 6 Dec 2021 06:39:43 +0530 Subject: [PATCH] Make the calibre style object accessible in Python --- src/calibre/gui2/__init__.py | 4 ++- .../progress_indicator/QProgressIndicator.cpp | 11 +++--- .../progress_indicator/QProgressIndicator.h | 8 ++--- .../progress_indicator/QProgressIndicator.sip | 34 +++++++++++++------ 4 files changed, 35 insertions(+), 22 deletions(-) diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py index 78261d97fc..366d2984fc 100644 --- a/src/calibre/gui2/__init__.py +++ b/src/calibre/gui2/__init__.py @@ -1201,7 +1201,9 @@ class Application(QApplication): transient_scroller = transient_scroller() icon_map[(QStyle.StandardPixmap.SP_CustomBase.value & 0xf0000000) + 1] = I('close-for-light-theme.png') icon_map[(QStyle.StandardPixmap.SP_CustomBase.value & 0xf0000000) + 2] = I('close-for-dark-theme.png') - self.pi.load_style(icon_map, transient_scroller) + self.calibre_style = style = self.pi.CalibreStyle(transient_scroller) + style.set_icon_map(icon_map) + self.setStyle(style) def _send_file_open_events(self): with self._file_open_lock: diff --git a/src/calibre/gui2/progress_indicator/QProgressIndicator.cpp b/src/calibre/gui2/progress_indicator/QProgressIndicator.cpp index 9ef6918381..b97485c15a 100644 --- a/src/calibre/gui2/progress_indicator/QProgressIndicator.cpp +++ b/src/calibre/gui2/progress_indicator/QProgressIndicator.cpp @@ -118,7 +118,7 @@ dpiScaled(qreal value) { #endif } -CalibreStyle::CalibreStyle(const QHash &icmap, int transient_scroller) : QProxyStyle(QString::fromUtf8("Fusion")), icon_map(icmap), transient_scroller(transient_scroller) { +CalibreStyle::CalibreStyle(int transient_scroller) : QProxyStyle(QString::fromUtf8("Fusion")), icon_map(), transient_scroller(transient_scroller) { setObjectName(QString("calibre")); desktop_environment = detectDesktopEnvironment(); button_layout = static_cast(QProxyStyle::styleHint(SH_DialogButtonLayout)); @@ -126,6 +126,10 @@ CalibreStyle::CalibreStyle(const QHash &icmap, int trans button_layout = QDialogButtonBox::GnomeLayout; } +void CalibreStyle::set_icon_map(QHash &ic) { + icon_map = ic; +} + int CalibreStyle::styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget, QStyleHintReturn *returnData) const { switch (hint) { case SH_DialogButtonBox_ButtonsHaveIcons: @@ -377,11 +381,6 @@ void CalibreStyle::drawControl(ControlElement element, const QStyleOption *optio QProxyStyle::drawControl(element, option, painter, widget); } -int load_style(const QHash &icon_map, int transient_scroller) { - QApplication::setStyle(new CalibreStyle(icon_map, transient_scroller)); - return 0; -} - class NoActivateStyle: public QProxyStyle { public: NoActivateStyle(QStyle *base) : QProxyStyle(base) { } diff --git a/src/calibre/gui2/progress_indicator/QProgressIndicator.h b/src/calibre/gui2/progress_indicator/QProgressIndicator.h index 76b07eb0b7..4df2f88c01 100644 --- a/src/calibre/gui2/progress_indicator/QProgressIndicator.h +++ b/src/calibre/gui2/progress_indicator/QProgressIndicator.h @@ -90,14 +90,15 @@ private: }; class CalibreStyle : public QProxyStyle { - private: - const QHash icon_map; + protected: + QHash icon_map; QByteArray desktop_environment; QDialogButtonBox::ButtonLayout button_layout; int transient_scroller; public: - CalibreStyle(const QHash &icmap, int transient_scroller); + CalibreStyle(int transient_scroller); + void set_icon_map(QHash &icon_map); 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; @@ -157,7 +158,6 @@ private: SpinAnimator m_animator; }; -int load_style(const QHash &icon_map, int transient_scroller=0); void set_no_activate_on_click(QWidget *widget); void draw_snake_spinner(QPainter &painter, QRect rect, int angle, const QColor & light, const QColor & dark); void set_menu_on_action(QAction* ac, QMenu* menu); diff --git a/src/calibre/gui2/progress_indicator/QProgressIndicator.sip b/src/calibre/gui2/progress_indicator/QProgressIndicator.sip index 55e50d2ade..ac0d517032 100644 --- a/src/calibre/gui2/progress_indicator/QProgressIndicator.sip +++ b/src/calibre/gui2/progress_indicator/QProgressIndicator.sip @@ -7,11 +7,33 @@ %ModuleHeaderCode #include -int load_style(const QHash &icon_map, int transient_scroller); void set_no_activate_on_click(QWidget *widget); void draw_snake_spinner(QPainter &painter, QRect rect, int angle, const QColor & light, const QColor & dark); %End +class CalibreStyle : QProxyStyle { +%TypeHeaderCode +#include +%End + +public: + CalibreStyle(int transient_scroller); + + void set_icon_map(SIP_PYDICT icon_map_); +%MethodCode + QHash icon_map; + PyObject *key, *value; + Py_ssize_t pos = 0; + while (PyDict_Next(a0, &pos, &key, &value)) { + icon_map.insert(PyLong_AsUnsignedLong(key), QString::fromUtf8(PyUnicode_AsUTF8(value))); + } + sipCpp->set_icon_map(icon_map); +%End + + +}; + + class SpinAnimator : QObject { %TypeHeaderCode @@ -74,16 +96,6 @@ signals: }; -int load_style(SIP_PYDICT icon_map_, int transient_scroller); -%MethodCode - QHash icon_map; - PyObject *key, *value; - Py_ssize_t pos = 0; - while (PyDict_Next(a0, &pos, &key, &value)) { - icon_map.insert(PyLong_AsUnsignedLong(key), QString::fromUtf8(PyUnicode_AsUTF8(value))); - } - load_style(icon_map, a1); -%End void set_no_activate_on_click(QWidget *widget); void draw_snake_spinner(QPainter &painter, QRect rect, int angle, const QColor & light, const QColor & dark) /ReleaseGIL/; void set_menu_on_action(QAction* ac, QMenu* menu);