> On Dec. 10, 2015, 11:11 p.m., Thomas Lübking wrote: > > 1. What tells you that this is a dialog buttonbox pushbutton? > > 2. What happens if the button has no text? > > > > > > The bug is in QDialogButtonBox (or rather the K variant, > > QDialogButtonBoxPrivate::createButton() seems to incorporate the hint > > correctly) > > > > > > [KDE] has "ShowIconsOnPushButtons=false" in kdeglobals which was > > interpreted by KPushButton _and_ kstyle for the hint, but the hint only > > covers Q'DialogButtonBox'es - there's simply no global rule for this like > > AA_DontShowIconsInMenus > > > > => KDialogButtonBox shall respect the hint for its buttons (there're two > > special creation routines). > > > > For the rest, the platform plugin ideally picks the kdeglobals setting and > > exports it to the application object (dyn property?) where the style can > > pick it and incorporate it into its calculations (ie. if no icons are > > wanted and there's text or arrow, omit the icon in size calculation and > > painting) > > > > "Fixing" that in deprecated KPushButton doesn't really fix anything. We'll > > face the mix we had, just that users of QPushButton were far less prone to > > pass them an icon in pre-KF5 times. > > > > Please also attach Hugo Pereira Da Costa. > > René J.V. Bertin wrote: > 1: why should one care? It is said nowhere that the setting defined as > "show icons on buttons" in `systemsettings(5)` applies only to dialogs. > Rather, the tooltip says "when this is enabled, KDE applications will show > icons alongside [sic!] some important buttons". > In other words, when "this" is *not* enabled, there should be no icons, > period. > I have found no sign in the code that the ShowIconsOnPushButtons hint is > to be used only for dialogs; `SH_DialogButtonBox_ButtonsHaveIcons` indeed > carries the suggestion in its name but I would not be surprised if Qt really > thinks of it in a more general sense. Probably also because the notion of > what a dialog is has become a lot vaguer. > > And that also happens to be what Qt does; buttons show their icons on > Linux (and other Unix variants?) but on OS X or MS Windows displaying of > those icons is deactivated unless you use a style that enables it. In fact, > the default setting for `SH_DialogButtonBox_ButtonsHaveIcons` is false except > in the generic Unix theme (= it does work globally like > `AA_DontShowIconsInMenus` everywhere else). > > 2: a user who indicates s/he doesn't want to see icons will get an empty > button. That's also what can happen with QPushButton, and app developers have > to take this into consideration. Cf. toolbars (and Qt's position on the use > of "texted separators"). > I don't think I've ever come across a standard button showing only an > icon, except possibly the arrow button next to the progress indicators in > KMail and KDevelop. > > As to fixing it here: as it turns out, "here" is the main source for > annoying icons rearing their silly heads on buttons on my screen ;) and it > was also something of a challenge to understand why they kept appearing > despite the fact that all code appeared to return the value of > `ShowIconsOnPushButtons`. Deprecated or not, it doesn't look like all > applications are going to stop using it anytime soon. > > I looked into fixing the issue in KDialogButtonBox but saw that it does > nothing to override the `ShowIconsOnPushButtons` setting. The only way to > respect the setting through that class (or a modern equivalent) would be to > set an empty icon if `ShowIconsOnPushButtons=false`. That introduces another > regression: changes in this setting are supposed to be reflected by running > applications without requiring a restart (or a recreation of dialogs). If it > were just me I'd decree that buttons can have either text or an icon, but > right now we have to make do with this mixed situation. > > I don't mind making this an OS X (and MS Windows) specific modification, > of course, but on those platforms > > Thomas Lübking wrote: > > 1: why should one care? > > Because, as explained, that is what the hint says. Nothing else. > > > I have found no sign in the code that the ShowIconsOnPushButtons hint > is to be used only for dialogs > > No, but it's been used to feed SH_DialogButtonBox_ButtonsHaveIcons *AND* > KPushButton. > ShowIconsOnPushButtons implied SH_DialogButtonBox_ButtonsHaveIcons but > NOT vv. > > The approach is wrong, since you're abusing the hint for generalisation. > > > but on OS X or MS Windows > > ... Qt uses native elements which might simply globally downforce the > pushbutton icon nonsense (as could any style - I was more than once close to > doing that in virtuality) > Eg. Breeze might do that on favor of the HIG, but that's not relevant > here. > > Downforcing in KPushButton means to operate on legacy code only and fixes > nothing. > Downforcing in a style (only) is the styles choice only. > > We simply need to ensure to > a) respect SH_DialogButtonBox_ButtonsHaveIcons in KDialogButtonBox > b) forward the offered variable to a position where the style can pick > it. (As alternative, the style can read it directly, but that "requires" it > to link KDE in order to *correctly* read kdeglobals) > > > > in KDialogButtonBox but saw that it does nothing to override the > ShowIconsOnPushButtons setting > > Err... what? The problem will be in "KDialogButtonBox::addButton(const > KGuiItem &guiitem, .)", you need to get rid of the icon after > KGuiItem::assign() if SH_DialogButtonBox_ButtonsHaveIcons is false (for the > other function, Qt should do correctly) > > And to repeat myself: that has *nothing* to do with > ShowIconsOnPushButtons - you can ignore that value in this position, it feeds > the stylehint via the platform plugin, but in this position *only* the > stylehint matters. > > ShowIconsOnPushButtons is orthogonal and supposed to cover _all_ > Q/KPushButtons and must therefore be forwarded to and caught by the style as > suggested (or by any equivalent implementation) > > René J.V. Bertin wrote: > With all due respect, this seems like overzealous application of a > principle that doesn't really apply, making things overly complicated. > > So, I was right that *"ShowIconsOnPushButtons is orthogonal and supposed > to cover all Q/KPushButtons"*. Inside/under a KDE environment, I presume, so > also for "pure Qt" applications that get to use the KdePlatformPlugin in > order to blend in? > > In that case, it doesn't matter how some central bit of KDE code achieves > this. *All that counts is the end result that users see*, and that this end > result is consistent. If they can reasonably expect that the control that > toggles `ShowIconsOnPushButtons` has an immediate effect on just about all > buttons, if SH_DialogButtonBox_ButtonsHaveIcons allows to achieve this and if > Qt itself already uses the parameter in situations outside of a > QDialogButtonBox context, then I think there is no harm in using that > parameter. If there were a setting call `HandYourDirtyLaundryOutToDry` which > has the desired effect (and no undesirable side-effects), then we'd be using > that (and asking Qt what they think about all that :)). > > Am I right that the only buttons Qt provides that can show icons > automatically as a function of their role are the ones in a QDialogButtonBox? > Either way, whatever the idea of the developer who introduced > `SH_DialogButtonBox_ButtonsHaveIcons` was, the code seems to have evolved > since to use it in a broader context. (Or the opposite is going on, in which > case I think that this would already have been pointed out to me on the Qt ML > and/or bug report.) > The main point here is that I can see no unexpected side-effects of > generalising `SH_DialogButtonBox_ButtonsHaveIcons`. Qt's idea must have been > that it should be possible to hide icons assigned automatically to the > buttons that have this feature, but not the ones assigned by developers to > buttons that do not provide automatic icons. That idea is not violated in a > context where the parameter is generalised to hide the icons on all buttons. > > Also: > ``` > /** > * This function determines if the user wishes to see icons on the > * push buttons. > * > * @return Returns true if user wants to show icons. > * @deprecated since 5.0, use > style->styleHint(QStyle::SH_DialogButtonBox_ButtonsHaveIcons, 0, widget); > */ > static KDELIBS4SUPPORT_DEPRECATED bool showIconsOnPushButtons(); > ``` > > seems to be very clear... > > The KdePlatformPlugin already respects the `ShowIconsOnPushButtons` > setting and returns it when queried for the corresponding hint. I hope that > should be enough to ensure that `QDialogButtonBox` buttons don't show their > icons when so requested, but have yet to confirm that. > > Did I say that I agree that patching KPushButton has limited interest, > even if it does solve part of the problem currently, namely that of > applications building dialog-like interfaces without using Q/KDialogButtonBox > (and using KPushButton instead). > If KDialogButtonBox is not (or less) deprecated I (or someone else) can > indeed modify it so that it respects `SH_DialogButtonBox_ButtonsHaveIcons`, > but again, I think that can only be done by ignoring the icon when the > buttons are created. You'd still get icons though if there is a way to change > the icon on those buttons, and applications use that. > > And that still doesn't address the fact that QPushButtons should also > respect `ShowIconsOnPushButtons` . The only way I see to achieve that > currently that does not involve patching Qt is to oblige all code to check > for the corresponding KDE style hint (or global setting, but see the > deprecation note above), and assign an icon only when the feature is > requested by the user. That seems like a strong argument to reintroduce > KPushButton to me ... > > BTW: let me be pedantic for a bit, and point out that > `ShowIconsOnPushButtons` literal meaning suggests that *all* push buttons > should show an icon if the parameter is true. Ultimately that means that the > setting has been violated for ages, maybe not the same way I'm proposing to > violate `SH_DialogButtonBox_ButtonsHaveIcons` but still :) > > > >but on OS X or MS Windows > > ... Qt uses native elements > > Actually, no. Not on OS X at least, and not in the sense that a > QPushButton is implemented using an NSButton. I was under that impression > myself, until it was pointed out to me that "QWidgets (and QML) don't use > native UI views. They draw everything themself (or refrain from drawing, in > case of button icons). The drawing is done in the style (qmacstyle_mac.mm in > this case)." And I can confirm that this is true: on OS X I can use the XCB > QPA and request the macintosh style, which gives me a X11 windows (local *or* > remote) that have the exact same content as "native" windows, up to a scale > factor and some colour differences. I'd been wondering how this was possible, > now I know. > > (before anyone jumps at the thought of getting a true Mac theme on their > KDE desktop: I suppose it still requires basic drawing routines and other > [ObjC] APIs only available on a Mac :P) > > Thomas Lübking wrote: > With all due respect, anything else simply makes no sense :-P > > See, the shortest cut to "please no superfluous icons on pushbuttons" is > to have the style omit them. > It's also the only global and with deprecation of KPushButton the only > relevant approach. > Agreed? > > Now, SH_DialogButtonBox_ButtonsHaveIcons is a hint *from* the style to > "something" (the ButtonBox in particular) to not add icons to (certain) > pushbuttons. > If it's turned into a global hint *from* the style *to* something for > something that only the style can actually provide, it's pointless. Do we > agree on that? The style knows "i don't want to see icons on pushbuttons", it > doesn't really have to share that info with the world (at least not for this > purpose) - or itself. > > Now the only remaining question is "How do we make the style know what it > wants". > 1. The behavior is hardcoded in the style or the style has maybe some > private config key for it > 2. There's a central KDE setting that is to be honored by anything > inheriting KStyle and can ideally be read by anything being a plain QStyle as > well. > > The central setting exists and you promote to abuse > SH_DialogButtonBox_ButtonsHaveIcons to propagate it. > Leaving the abuse character aside, the patch doesn't really get you what > you wanted to achieve (QPushButtons still have undesired icons everywhere) > and will be increasingly useless by KPushButton -> QPushButton replacements. > > => To get what you want, you'll have to change KStyle/Breeze/Other styles > _or_ QPushButton. > Much luck on the latter but if you resolve this within *Style (what is > imo the only correct solution, because QStyle is the LAF abstraction in Qt), > walking across the StyleHint is just CPU burning, therefore the likely abuse > is pointless. > > So my proposal is to > a) fix KDialogButtonBox (it's a bug and bugs exist to be fixed - even in > deprecated code, notably if it's still widely used) > b) Wire up the kglobals setting from the platform plugin into the > application where QStyle implementations can pick it up. > > The alternative to (b) is to let styles deal this locally (and ditch the > gui config, resp. interpret it for dialogbuttonboxes only since that's the > only thing we can effectively control - at least for KStyle inheritors that > do not override the hint...) > > I'll provide a patch for (a), you take your preference on (b) and maybe > Hugo wants to say a word ;-) > > Hugo Pereira Da Costa wrote: > Damn, > thats a long thread. > I have no objection against > 1/ adding (well, me adding, or someone adding) a new option in breeze to > disable icon on *all* buttons, > 2/ or honouring the kdeglobals showIconsOnPushButtons in breeze > 3/ or in oxygen > 4/ or in kstyle (and let other QStyle based style do the same) > > My pereference would go to 2+4 > And I believe this is the best way to achieve whats intended > > Hugo Pereira Da Costa wrote: > Note however that there are subtleties on the style side: > 1/ there are toolbooton that can be non-autoraised and thus mimic a > normal pushbutton. Should the icon be hidden on these ? > 2/ there are pushbutton that can be rendered flat and thus mimic a normal > toolbutton. Should the icon be rendered on these ? > best > > René J.V. Bertin wrote: > Well, I *am* taking this up with Qt to see what their actual intentions > are re: QPushButton. > So, > > > See, the shortest cut to "please no superfluous icons on pushbuttons" > is to have the style omit them. > > It's also the only global and with deprecation of KPushButton the only > relevant approach. > > Agreed? > > No, QPushButton seems to be closer to the source and a more appropriate > place where a more than just a single parameter can be taken into > consideration (e.g. draw the icon after all because otherwise we'll show an > empty button). > > How do I know where fix this in the only other style I care about beyond > the native Mac style? Search for CE_PushButton? Can the style decide to > force-draw the icon if a button has no text? > (Hugo: please fix both Breeze & Oxygen while you're at it!) > > Thomas Lübking wrote: > > there are toolbooton that can be non-autoraised and thus mimic a normal > pushbutton. > > No, can't ;-) > You can use a toolbutton wrongly, but that's just bad client code. > There's no guarantee it ends up looking anything like a PushButton and also > ToolButtons have dedicated modes wrt. to icons & text which cannot be ignored. > > > there are pushbutton that can be rendered flat and thus mimic a normal > toolbutton. > > No, can't for the same reason. A pushbutton is a pushbutton and cannot be > expected to look like a toolbutton. > It's a valid question on whether a "flat" pushbutton should carry an icon > as additional or even only indicator that this is not only a label. One more > reason to have this dealt by the style. > > Thomas Lübking wrote: > > where a more than just a single parameter can be taken into > consideration (e.g. draw the icon after all because otherwise we'll show an > empty button) > > No, the style draws the entire thing. It's the very instance that has the > most appropriate idea on what things are gonna end up visually. > > > How do I know where fix this in the only other style > > First we decide "how" to fix it, then we fix it, ok? > You need to take care of geometry calculations and painting and I'm sure > Hugo is more than capable of handling it *correctly* on the first shot. > > The relevant control element *should* be CE_PushButtonLabel, but their > can be pitfalls because the button is painted in a chain of elements.
> a "flat" pushbutton should carry an icon as additional or even only indicator > that this is not only a label How would that help? That icon could just as well be part of the label (or an additional one). Buttons that are iOS-9-style indistinguishable from a label are bad interface design IMHO (they're mentally deranged hyperlinks :)) ; it shouldn't be encouraged by other questionable interface design principles like automatic button icons. - René J.V. ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://git.reviewboard.kde.org/r/126308/#review89321 ----------------------------------------------------------- On Dec. 11, 2015, 1:59 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, 1:59 p.m.) > > > Review request for KDE Software on Mac OS X, KDE Frameworks, Qt KDE, and Hugo > Pereira Da Costa. > > > 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 > >