> On Dec. 19, 2015, 10:23 a.m., David Faure wrote: > > src/kdeui/kpushbutton.cpp, line 256 > > <https://git.reviewboard.kde.org/r/126308/diff/6/?file=421676#file421676line256> > > > > This patch looks wrong because KPushButton can be used outside of > > "dialog button boxes", while the styleHint is supposed to be only about > > dialog button boxes. > > > > QPushButton::sizeHint does this: > > bool showButtonBoxIcons = > > qobject_cast<QDialogButtonBox*>(parentWidget()) > > && > > style()->styleHint(QStyle::SH_DialogButtonBox_ButtonsHaveIcons); > > which is a solution for testing the parent widget. > > > > I still don't fully understand the issue though, at painting time both > > QPushButton and KPushButton call QStyle's CE_PushButton, so I don't see why > > these two would be working differently. > > Is this a workaround for KPushButton which doesn't fix QPushButton? > > René J.V. Bertin wrote: > David, I'm dropping this whole RR, leaving it open only in case Thomas > wants to pursue his view on fixing what there is to fix. > > You are right though, it's a workaround for KPushButton which doesn't > depend on fixing QPushButton. And whether or not QPushButton requires fixing > is apparently the big question. What is your idea on the scope of > `ShowIconsOnButtons`? > > Thomas Lübking wrote: > The "problem" is that this is really scattered around everywhere :( > > One major catch should be (frameworksintegration) > > ``` > diff --git a/src/platformtheme/kdeplatformfiledialoghelper.cpp > b/src/platformtheme/kdeplatformfiledialoghelper.cpp > index 11e7efb..9cd374c 100644 > --- a/src/platformtheme/kdeplatformfiledialoghelper.cpp > +++ b/src/platformtheme/kdeplatformfiledialoghelper.cpp > @@ -161,6 +161,11 @@ void > KDEPlatformFileDialog::setFileMode(QFileDialogOptions::FileMode mode) > m_fileWidget->setMode(KFile::File); > break; > } > + // ::setOperationMode happily adds icons to our buttonbox, so we > clear them everytime the mode is set > + if (!style()->styleHint(QStyle::SH_DialogButtonBox_ButtonsHaveIcons, > nullptr, this)) { > + foreach (QAbstractButton *button, m_buttons->buttons()) > + button->setIcon(QIcon()); > + } > } > > void > KDEPlatformFileDialog::setCustomLabel(QFileDialogOptions::DialogLabel label, > const QString &text) > diff --git a/src/platformtheme/kdirselectdialog.cpp > b/src/platformtheme/kdirselectdialog.cpp > index 0a65cd3..13d7dc7 100644 > --- a/src/platformtheme/kdirselectdialog.cpp > +++ b/src/platformtheme/kdirselectdialog.cpp > @@ -299,6 +299,10 @@ KDirSelectDialog::KDirSelectDialog(const QUrl > &startDir, bool localOnly, QWidget > m_buttons->setStandardButtons(QDialogButtonBox::Ok | > QDialogButtonBox::Cancel); > connect(m_buttons, SIGNAL(accepted()), this, SLOT(accept())); > connect(m_buttons, SIGNAL(rejected()), this, SLOT(reject())); > + if (!style()->styleHint(QStyle::SH_DialogButtonBox_ButtonsHaveIcons, > nullptr, this)) { > + foreach (QAbstractButton *button, m_buttons->buttons()) > + button->setIcon(QIcon()); > + } > topLayout->addWidget(m_buttons); > > QHBoxLayout *hlay = new QHBoxLayout(page); > ``` > > But that somehow doesn't scale. > > KGuiItem::apply would have to catch that, but doesn't. > QDialogButtonBox::addButton *could* catch things, but doesn't (also it's > not clear whether or when m_buttons->button(SomeRole)->setIcon() is invoked, > so QPushButton::setIcon() would have to catch it and QPushButton would have > to catch it on reparenting. > > > => For a complete solution, QPushButton actually needs painting code to > check the parent & style hint when setting up the style option - or we simply > rely on the style testing (widget && > qobject_cast<QDialogButtonBox*>(widget->parentWidget())) when calculating > sizes and painting the button. > The only alternative is to walk a long way and tell everyone to please > check the hint and fix their buttonboxes.... eewww. > > > > ==> QPushButton will require a "fix" to handle the StyleHint, but we > cannot expect *Q*PushButton to honor some global KDE setting, that's really a > job for the platform integration and in this case ultimately the style. > > > > > => the platform integration plugin (KDE part in all Qt applications) > needs to read that setting and expose it to the styles. > Alternatively the styles could read the setting from kdeglobals directly, > but that requires them to link kconfig (to do it correctly, just grabbing it > from the users kdeglobals ini isn't that much of a problem ;-), ie. rules out > Qt-only styles (and somehow contrasts w/ the KF5 approach to things) > > > > > Ideally™ there would be an official "Qt::AA_PushButtonTextOnly" (rename > me) flag for the QPA to set and QPushButtons to pick. > > René J.V. Bertin wrote: > Hear hear ... > > I have raised that final question in the Qt bug report I filed on this > (https://bugreports.qt.io/browse/QTBUG-49887) > > Maybe the best approach is to ensure that for now ShowIconsOnButtons is > handled the best way possible in the main current KDE styles (Breeze, Oxygen, > QtCurve) and then wait to see what position Qt adopts before trying to > implement something better (= less CPU intensive)? > > Thomas Lübking wrote: > What "hear hear" - I hardly changed my opinion, just figured that the > hint is ignored all over KDE (client) code on migration from KDialogButtonBox > to QDialogButtonBox and in other places and thus considered we > -unfortunately- will best try to "fix" that (broken client code) in > QPushButton. I had simply underestimated that this is not a bug in > KDialogButtonBox only, but broken all over the place. > > Please nota bene that QPushButton is /not/ broken and does /not/ need to > be fixed. One would request it to catch and cover broken client code. They > may very well just respond "why not simply fix your shit?" > > > Maybe the best approach is to ensure that for now ShowIconsOnButtons is > handled [...] see what position Qt adopts > > In that case I'd propose to PoC a working infrastructure (QPA reads > setting and sets a dynamic property on the QApplication instance, best before > the style is constructed, so that finally the style(s) adopt that) and then > ask "can we please make this a canonical and documented application > attribute?" > > Hugo Pereira Da Costa wrote: > Hi, > Jumping in. > I have played with honouring ShowIconsOnButtons in Breeze style directly > (on a local branch) > Now: it is easy to get the icon not being shown, but the buttons are > still "large", as if they would contain the icon. The reason is that, as > already pointed by René, QPushButton::SizeHint already include the size of > the icon to be drawn in the size it calculates and passes to > QStyle::sizeFromContents. > So that you would need to either "undo" the size calculated by > QPushButton in the sizeHint method (which sounds quite fragile I think), or > indeed, patch QPushButton in some way ... > Comments welcome (especially if I missed something)
This is the unconditional patch for virtuality - it does indeed this (I had similar for bespin, I really dislike those icons myself ;-) There's no other way since the label is handled opaquely (is that a word? ;-) The contents size is text+icon size, any padding or margin needs to be added by the style (so you actually should be testing for whether there's an icon anyway ... ;-P ) ``` diff --git a/buttons.cpp b/buttons.cpp index 78422e7..b3f433f 100644 --- a/buttons.cpp +++ b/buttons.cpp @@ -261,9 +261,7 @@ Style::drawPushButtonLabel(const QStyleOption *option, QPainter *painter, const } drawItemText(painter, ir, Qt::AlignCenter | BESPIN_MNEMONIC, PAL, isEnabled, btn->text, QPalette::NoRole, &ir); RESTORE_PAINTER - } - - if (!btn->icon.isNull()) { // The ICON ================================================ + } else if (!btn->icon.isNull()) { // The ICON ================================================ QIcon::Mode mode = isEnabled ? QIcon::Normal : QIcon::Disabled; if (mode == QIcon::Normal && hasFocus) mode = QIcon::Active; diff --git a/sizefromcontents.cpp b/sizefromcontents.cpp index 2cee67f..06ec571 100644 --- a/sizefromcontents.cpp +++ b/sizefromcontents.cpp @@ -156,7 +156,8 @@ Style::sizeFromContents(ContentsType ct, const QStyleOption *option, const QSize } else { w += h + F(4); if (!btn->icon.isNull()) - w += F(4) + btn->iconSize.width(); // we want symmetry and need 2px padding (+the blind icon and it's blind padding) + w -= btn->iconSize.width(); +// w += F(4) + btn->iconSize.width(); // we want symmetry and need 2px padding (+the blind icon and it's blind padding) // if (w < F(80)) // w = F(80); } - Thomas ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://git.reviewboard.kde.org/r/126308/#review89737 ----------------------------------------------------------- On Dec. 11, 2015, 4:26 p.m., René J.V. Bertin wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > https://git.reviewboard.kde.org/r/126308/ > ----------------------------------------------------------- > > (Updated Dec. 11, 2015, 4:26 p.m.) > > > Review request for KDE Software on Mac OS X, KDE Frameworks, Qt KDE, Hugo > Pereira Da Costa, and Yichao Yu. > > > Repository: kdelibs4support > > > Description > ------- > > KF5 applications have long had a habit of drawing icons on buttons even when > this feature was turned off in the user's setting. This was mostly noticeable > in applications built on kdelibs4support. > > It seems that the actual culprit is in Qt's QPushButton implementation > (https://bugreports.qt.io/browse/QTBUG-49887), but it is possible to work > around it in `KPushButton::paintEvent`, by removing the icon (forcing it to > the null icon) in the option instance, before handing off control to the > painter. > > > Diffs > ----- > > src/kdeui/kdialogbuttonbox.cpp 0f6649b > src/kdeui/kpushbutton.cpp 98534fa > > Diff: https://git.reviewboard.kde.org/r/126308/diff/ > > > Testing > ------- > > On Kubuntu 14.04 and OS X 10.9.5 with Qt 5.5.1 and KF5 frameworks 5.16.0 . > > I have not yet verified if there are other classes where this modification > would be relevant too. > > > Thanks, > > René J.V. Bertin > >
_______________________________________________ Kde-frameworks-devel mailing list Kde-frameworks-devel@kde.org https://mail.kde.org/mailman/listinfo/kde-frameworks-devel