> On Dec. 19, 2015, 11: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) > > Thomas Lübking wrote: > 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); > } > > René J.V. Bertin wrote: > > What "hear hear" - I hardly changed my opinion > > Wasn't what I meant, just that you too now realise there isn't a single > easy place to fix this. > > @Hugo: yes, QPushButton includes the icon size in button size > calculation, but I'm pretty sure there's a bug in that code. That's actually > what the bug report referenced above was about initially. > > What's curious here is that buttons don't make the impression of being > too large on OS X. Then again, everything in standard Qt interfaces makes > that impression on OS X, so it's quite likely the extra size for icons is > drowned in the rest over the oversizedness. > > Thomas Lübking wrote: > It's not a bug, the icon (if present) is part of the content and requires > space. Since there's only one ContentsType in QStyle, it correctly contains > combined sizes of icon and text (in width) > If you don't want the icon, you need to remove it from the contents size > for the returned size, that's how it works =) > > > Yes, I had really not imagined how deeply broken this was - mostly due to > invocation of KGuiItem, altering the standard buttons everywhere :-( > > > No impact on the "no superfluous icons at all please" stance - that must > and can be (fairly easily, see patch) covered by the style. > The one and only "tricky" thing is to get the users wish down to the > style.
The icon doesn't require space if it isn't supposed to be visible, or else there's no point in determining `showButtonBoxIcons` in QPushButton::sizeHint() ... and I can certainly not see the reason why it be used in `if (!icon().isNull() || showButtonBoxIcons)` instead of something like `if (!icon().isNull() && (showButtonBoxIcons || empty))`. I just discovered something that I'll need to add to the Qt bug report too. It is apparently not the OS X ("Cocoa") style which omits drawing icons in QDBBs. I tweaked my Qt build so that it picks up my XDG icon theme directories and has a default theme ... and all of a sudden I got buttons in lots of dialog button boxes. Annoyingly enough not in all applications: KCM modules (displayed through `kcmshell5` or `systemsettings5`) get buttoned icons, but Kate doesn't in its dialogs. - René J.V. ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://git.reviewboard.kde.org/r/126308/#review89737 ----------------------------------------------------------- On Dec. 11, 2015, 5: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, 5: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