From 4ed371f5de2e882425ea9e412320e2303e563137 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Mon, 6 May 2024 04:08:32 +0300 Subject: [PATCH] plasma: scale the calculator widgets fonts that makes one of the applets that will not use the point size set in configs, on purpose. it is like automatic DPI effect, real scalable fonts but done programatically Signed-off-by: Ivailo Monev --- plasma/applets/calculator/calculator.cpp | 251 +++++++++++++++-------- 1 file changed, 167 insertions(+), 84 deletions(-) diff --git a/plasma/applets/calculator/calculator.cpp b/plasma/applets/calculator/calculator.cpp index b60298ba..726b6f82 100644 --- a/plasma/applets/calculator/calculator.cpp +++ b/plasma/applets/calculator/calculator.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include static const QString s_decimal = QString::fromLatin1("."); @@ -49,13 +50,73 @@ static QString kAddNumber(const QString &string, const short number) return kLimitNumber(string + QString::number(number)); } -static QFont kLabelFont() +#if !defined(Q_MOC_RUN) +template +class CalculatorWidgetBase : public T { - QFont labelfont = KGlobalSettings::generalFont(); - labelfont.setBold(true); - labelfont.setPointSize(labelfont.pointSize() * 2); - return labelfont; -} +public: + CalculatorWidgetBase(QGraphicsWidget *parent) + : T(parent), + m_textcolor(Plasma::Theme::TextColor), + m_alignment(Qt::AlignCenter), + m_fontscale(0.5) + { + } + + void setup(const Plasma::Theme::ColorRole textcolor, const Qt::Alignment alignment, const qreal fontscale) + { + m_textcolor = textcolor; + m_alignment = alignment; + m_fontscale = fontscale; + T::update(); + } + + void setPaintText(const QString &text) + { + m_painttext = text; + T::update(); + } + +protected: + void paint(QPainter *p, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) final + { + T::paint(p, option, widget); + const QRectF rect(QPointF(0, 0), T::size()); + QFont textfont = KGlobalSettings::generalFont(); + textfont.setPointSize(qMax(qreal(textfont.pointSize()), rect.height()) * m_fontscale); + p->setPen(Plasma::Theme::defaultTheme()->color(m_textcolor)); + p->setFont(textfont); + p->drawText(rect, m_alignment, m_painttext); + } + +private: + QString m_painttext; + Plasma::Theme::ColorRole m_textcolor; + Qt::Alignment m_alignment; + qreal m_fontscale; +}; + +class CalculatorButton : public CalculatorWidgetBase +{ +public: + CalculatorButton(QGraphicsWidget *parent) + : CalculatorWidgetBase(parent) + { + setup(Plasma::Theme::ButtonTextColor, Qt::AlignCenter, 0.5); + } +}; + +class CalculatorLabel : public CalculatorWidgetBase +{ +public: + CalculatorLabel(QGraphicsWidget *parent) + : CalculatorWidgetBase(parent) + { + setup(Plasma::Theme::TextColor, Qt::AlignRight | Qt::AlignVCenter, 0.8); + } +}; + +#endif // Q_MOC_RUN class CalculatorAppletWidget : public QGraphicsWidget { @@ -98,25 +159,25 @@ private: QGraphicsGridLayout* m_layout; Plasma::Frame* m_frame; QGraphicsLinearLayout* m_framelayout; - Plasma::Label* m_label; - Plasma::PushButton* m_cbutton; - Plasma::PushButton* m_divbutton; - Plasma::PushButton* m_mulbutton; - Plasma::PushButton* m_acbutton; - Plasma::PushButton* m_7button; - Plasma::PushButton* m_8button; - Plasma::PushButton* m_9button; - Plasma::PushButton* m_minusbutton; - Plasma::PushButton* m_4button; - Plasma::PushButton* m_5button; - Plasma::PushButton* m_6button; - Plasma::PushButton* m_plusbutton; - Plasma::PushButton* m_1button; - Plasma::PushButton* m_2button; - Plasma::PushButton* m_3button; - Plasma::PushButton* m_equalbutton; - Plasma::PushButton* m_0button; - Plasma::PushButton* m_decbutton; + CalculatorLabel* m_label; + CalculatorButton* m_cbutton; + CalculatorButton* m_divbutton; + CalculatorButton* m_mulbutton; + CalculatorButton* m_acbutton; + CalculatorButton* m_7button; + CalculatorButton* m_8button; + CalculatorButton* m_9button; + CalculatorButton* m_minusbutton; + CalculatorButton* m_4button; + CalculatorButton* m_5button; + CalculatorButton* m_6button; + CalculatorButton* m_plusbutton; + CalculatorButton* m_1button; + CalculatorButton* m_2button; + CalculatorButton* m_3button; + CalculatorButton* m_equalbutton; + CalculatorButton* m_0button; + CalculatorButton* m_decbutton; double m_savednumber; CalculatorOperator m_operator; }; @@ -155,144 +216,148 @@ CalculatorAppletWidget::CalculatorAppletWidget(QGraphicsWidget *parent) m_frame->setFrameShadow(Plasma::Frame::Sunken); m_frame->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); m_framelayout = new QGraphicsLinearLayout(Qt::Horizontal, m_frame); - m_label = new Plasma::Label(m_frame); - m_label->setFont(kLabelFont()); - m_label->setText(s_zero); - m_label->setAlignment(Qt::AlignRight | Qt::AlignVCenter); + m_label = new CalculatorLabel(m_frame); + m_label->setPaintText(s_zero); m_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_framelayout->addItem(m_label); m_layout->addItem(m_frame, 0, 0, 1, 4); + m_layout->setRowStretchFactor(0, 2); - m_cbutton = new Plasma::PushButton(this); - m_cbutton->setText(i18nc("Text of the clear button", "C")); + m_cbutton = new CalculatorButton(this); + m_cbutton->setPaintText(i18nc("Text of the clear button", "C")); connect( m_cbutton, SIGNAL(released()), this, SLOT(slotClear()) ); m_layout->addItem(m_cbutton, 1, 0, 1, 1); - m_divbutton = new Plasma::PushButton(this); - m_divbutton->setText(i18nc("Text of the division button", "÷")); + m_divbutton = new CalculatorButton(this); + m_divbutton->setPaintText(i18nc("Text of the division button", "÷")); connect( m_divbutton, SIGNAL(released()), this, SLOT(slotDiv()) ); m_layout->addItem(m_divbutton, 1, 1, 1, 1); - m_mulbutton = new Plasma::PushButton(this); - m_mulbutton->setText(i18nc("Text of the multiplication button", "×")); + m_mulbutton = new CalculatorButton(this); + m_mulbutton->setPaintText(i18nc("Text of the multiplication button", "×")); connect( m_mulbutton, SIGNAL(released()), this, SLOT(slotMul()) ); m_layout->addItem(m_mulbutton, 1, 2, 1, 1); - m_acbutton = new Plasma::PushButton(this); - m_acbutton->setText(i18nc("Text of the all clear button", "AC")); + m_acbutton = new CalculatorButton(this); + m_acbutton->setPaintText(i18nc("Text of the all clear button", "AC")); connect( m_acbutton, SIGNAL(released()), this, SLOT(slotClearAll()) ); m_layout->addItem(m_acbutton, 1, 3, 1, 1); + m_layout->setRowStretchFactor(1, 1); - m_7button = new Plasma::PushButton(this); - m_7button->setText(QString::fromLatin1("7")); + m_7button = new CalculatorButton(this); + m_7button->setPaintText(QString::fromLatin1("7")); connect( m_7button, SIGNAL(released()), this, SLOT(slot7()) ); m_layout->addItem(m_7button, 2, 0, 1, 1); - m_8button = new Plasma::PushButton(this); - m_8button->setText(QString::fromLatin1("8")); + m_8button = new CalculatorButton(this); + m_8button->setPaintText(QString::fromLatin1("8")); connect( m_8button, SIGNAL(released()), this, SLOT(slot8()) ); m_layout->addItem(m_8button, 2, 1, 1, 1); - m_9button = new Plasma::PushButton(this); - m_9button->setText(QString::fromLatin1("9")); + m_9button = new CalculatorButton(this); + m_9button->setPaintText(QString::fromLatin1("9")); connect( m_9button, SIGNAL(released()), this, SLOT(slot9()) ); m_layout->addItem(m_9button, 2, 2, 1, 1); - m_minusbutton = new Plasma::PushButton(this); - m_minusbutton->setText(i18nc("Text of the minus button", "-")); + m_minusbutton = new CalculatorButton(this); + m_minusbutton->setPaintText(i18nc("Text of the minus button", "-")); connect( m_minusbutton, SIGNAL(released()), this, SLOT(slotMinus()) ); m_layout->addItem(m_minusbutton, 2, 3, 1, 1); + m_layout->setRowStretchFactor(2, 1); - m_4button = new Plasma::PushButton(this); - m_4button->setText(QString::fromLatin1("4")); + m_4button = new CalculatorButton(this); + m_4button->setPaintText(QString::fromLatin1("4")); connect( m_4button, SIGNAL(released()), this, SLOT(slot4()) ); m_layout->addItem(m_4button, 3, 0, 1, 1); - m_5button = new Plasma::PushButton(this); - m_5button->setText(QString::fromLatin1("5")); + m_5button = new CalculatorButton(this); + m_5button->setPaintText(QString::fromLatin1("5")); connect( m_5button, SIGNAL(released()), this, SLOT(slot5()) ); m_layout->addItem(m_5button, 3, 1, 1, 1); - m_6button = new Plasma::PushButton(this); - m_6button->setText(QString::fromLatin1("6")); + m_6button = new CalculatorButton(this); + m_6button->setPaintText(QString::fromLatin1("6")); connect( m_6button, SIGNAL(released()), this, SLOT(slot6()) ); m_layout->addItem(m_6button, 3, 2, 1, 1); - m_plusbutton = new Plasma::PushButton(this); - m_plusbutton->setText(i18nc("Text of the plus button", "+")); + m_plusbutton = new CalculatorButton(this); + m_plusbutton->setPaintText(i18nc("Text of the plus button", "+")); connect( m_plusbutton, SIGNAL(released()), this, SLOT(slotPlus()) ); m_layout->addItem(m_plusbutton, 3, 3, 1, 1); + m_layout->setRowStretchFactor(3, 1); - m_1button = new Plasma::PushButton(this); - m_1button->setText(QString::fromLatin1("1")); + m_1button = new CalculatorButton(this); + m_1button->setPaintText(QString::fromLatin1("1")); connect( m_1button, SIGNAL(released()), this, SLOT(slot1()) ); m_layout->addItem(m_1button, 4, 0, 1, 1); - m_2button = new Plasma::PushButton(this); - m_2button->setText(QString::fromLatin1("2")); + m_2button = new CalculatorButton(this); + m_2button->setPaintText(QString::fromLatin1("2")); connect( m_2button, SIGNAL(released()), this, SLOT(slot2()) ); m_layout->addItem(m_2button, 4, 1, 1, 1); - m_3button = new Plasma::PushButton(this); - m_3button->setText(QString::fromLatin1("3")); + m_3button = new CalculatorButton(this); + m_3button->setPaintText(QString::fromLatin1("3")); connect( m_3button, SIGNAL(released()), this, SLOT(slot3()) ); m_layout->addItem(m_3button, 4, 2, 1, 1); - m_equalbutton = new Plasma::PushButton(this); - m_equalbutton->setText(i18nc("Text of the equals button", "=")); + m_equalbutton = new CalculatorButton(this); + m_equalbutton->setPaintText(i18nc("Text of the equals button", "=")); connect( m_equalbutton, SIGNAL(released()), this, SLOT(slotEqual()) ); m_layout->addItem(m_equalbutton, 4, 3, 2, 1); + m_layout->setRowStretchFactor(4, 1); - m_0button = new Plasma::PushButton(this); - m_0button->setText(s_zero); + m_0button = new CalculatorButton(this); + m_0button->setPaintText(s_zero); connect( m_0button, SIGNAL(released()), this, SLOT(slot0()) ); m_layout->addItem(m_0button, 5, 0, 1, 2); - m_decbutton = new Plasma::PushButton(this); - m_decbutton->setText(KGlobal::locale()->toLocale().decimalPoint()); + m_decbutton = new CalculatorButton(this); + m_decbutton->setPaintText(KGlobal::locale()->toLocale().decimalPoint()); connect( m_decbutton, SIGNAL(released()), this, SLOT(slotDec()) ); m_layout->addItem(m_decbutton, 5, 2, 1, 1); + m_layout->setRowStretchFactor(5, 1); setLayout(m_layout); @@ -306,12 +371,12 @@ CalculatorAppletWidget::CalculatorAppletWidget(QGraphicsWidget *parent) void CalculatorAppletWidget::addToNumber(const short number) { - m_label->setText(kLimitNumber(kDoubleNumber(m_label->text().toDouble() + number))); + m_label->setPaintText(kLimitNumber(kDoubleNumber(m_label->text().toDouble() + number))); } void CalculatorAppletWidget::slotClear() { - m_label->setText(s_zero); + m_label->setPaintText(s_zero); } void CalculatorAppletWidget::slotDiv() @@ -338,22 +403,22 @@ void CalculatorAppletWidget::slotClearAll() { m_savednumber = 0.0; m_operator = CalculatorAppletWidget::OperatorNone; - m_label->setText(s_zero); + m_label->setPaintText(s_zero); } void CalculatorAppletWidget::slot7() { - m_label->setText(kAddNumber(m_label->text(), 7)); + m_label->setPaintText(kAddNumber(m_label->text(), 7)); } void CalculatorAppletWidget::slot8() { - m_label->setText(kAddNumber(m_label->text(), 8)); + m_label->setPaintText(kAddNumber(m_label->text(), 8)); } void CalculatorAppletWidget::slot9() { - m_label->setText(kAddNumber(m_label->text(), 9)); + m_label->setPaintText(kAddNumber(m_label->text(), 9)); } void CalculatorAppletWidget::slotMinus() @@ -368,17 +433,17 @@ void CalculatorAppletWidget::slotMinus() void CalculatorAppletWidget::slot4() { - m_label->setText(kAddNumber(m_label->text(), 4)); + m_label->setPaintText(kAddNumber(m_label->text(), 4)); } void CalculatorAppletWidget::slot5() { - m_label->setText(kAddNumber(m_label->text(), 5)); + m_label->setPaintText(kAddNumber(m_label->text(), 5)); } void CalculatorAppletWidget::slot6() { - m_label->setText(kAddNumber(m_label->text(), 6)); + m_label->setPaintText(kAddNumber(m_label->text(), 6)); } void CalculatorAppletWidget::slotPlus() @@ -393,17 +458,17 @@ void CalculatorAppletWidget::slotPlus() void CalculatorAppletWidget::slot1() { - m_label->setText(kAddNumber(m_label->text(), 1)); + m_label->setPaintText(kAddNumber(m_label->text(), 1)); } void CalculatorAppletWidget::slot2() { - m_label->setText(kAddNumber(m_label->text(), 2)); + m_label->setPaintText(kAddNumber(m_label->text(), 2)); } void CalculatorAppletWidget::slot3() { - m_label->setText(kAddNumber(m_label->text(), 3)); + m_label->setPaintText(kAddNumber(m_label->text(), 3)); } void CalculatorAppletWidget::slotEqual() @@ -414,25 +479,25 @@ void CalculatorAppletWidget::slotEqual() } case CalculatorAppletWidget::OperatorDiv: { const double currentnumber = m_label->text().toDouble(); - m_label->setText(kLimitNumber(kDoubleNumber(m_savednumber / currentnumber))); + m_label->setPaintText(kLimitNumber(kDoubleNumber(m_savednumber / currentnumber))); m_operator = CalculatorAppletWidget::OperatorNone; break; } case CalculatorAppletWidget::OperatorMul: { const double currentnumber = m_label->text().toDouble(); - m_label->setText(kLimitNumber(kDoubleNumber(m_savednumber * currentnumber))); + m_label->setPaintText(kLimitNumber(kDoubleNumber(m_savednumber * currentnumber))); m_operator = CalculatorAppletWidget::OperatorNone; break; } case CalculatorAppletWidget::OperatorMinus: { const double currentnumber = m_label->text().toDouble(); - m_label->setText(kLimitNumber(kDoubleNumber(m_savednumber - currentnumber))); + m_label->setPaintText(kLimitNumber(kDoubleNumber(m_savednumber - currentnumber))); m_operator = CalculatorAppletWidget::OperatorNone; break; } case CalculatorAppletWidget::OperatorPlus: { const double currentnumber = m_label->text().toDouble(); - m_label->setText(kLimitNumber(kDoubleNumber(m_savednumber + currentnumber))); + m_label->setPaintText(kLimitNumber(kDoubleNumber(m_savednumber + currentnumber))); m_operator = CalculatorAppletWidget::OperatorNone; break; } @@ -441,7 +506,7 @@ void CalculatorAppletWidget::slotEqual() void CalculatorAppletWidget::slot0() { - m_label->setText(kAddNumber(m_label->text(), 0)); + m_label->setPaintText(kAddNumber(m_label->text(), 0)); } void CalculatorAppletWidget::slotDec() @@ -450,12 +515,30 @@ void CalculatorAppletWidget::slotDec() if (currenttext.contains(s_decimal)) { return; } - m_label->setText(currenttext + s_decimal); + m_label->setPaintText(currenttext + s_decimal); } void CalculatorAppletWidget::slotUpdateFonts() { - m_label->setFont(kLabelFont()); + m_label->update(); + m_cbutton->update(); + m_divbutton->update(); + m_mulbutton->update(); + m_acbutton->update(); + m_7button->update(); + m_8button->update(); + m_9button->update(); + m_minusbutton->update(); + m_4button->update(); + m_5button->update(); + m_6button->update(); + m_plusbutton->update(); + m_1button->update(); + m_2button->update(); + m_3button->update(); + m_equalbutton->update(); + m_0button->update(); + m_decbutton->update(); }