RFC: Making focus information visible for panes
Matthew Woehlke
mw_triad at users.sourceforge.net
Wed Nov 29 16:52:51 GMT 2006
David Faure wrote:
> On Wed Nov 29 2006, Maksim Orlovich wrote:
>>> Styles use the palette given to them... So I disagree. Color is the
>>> palette's job, not the style's.
>> Qt disagrees. QStyle::polish(QPalette).
>
> Ok the style has a hook into the palette. So? I think a widget adjusting a palette is still OK, isn't it?
I would assert that it's asking for trouble. If you read the
documentation for QStyle::polish[1], there are a number of things you
can do in polish() that you would break by artificially changing the
palette at another point:
1a. polish() is a good time for a style to cache palette information
internally, if it needs/wants to (for instance, to cache colors that are
derived from the palette).
1b. For a style like Keramik* that uses pixmaps for shading effects,
polish() is a good place to pre-create them. This would mean that
altering the palette later would work incorrectly, if it worked at all.
2. A style is permitted to alter the palette in polish(). If you then
alter the palette at some other point, you have BROKEN the style.
(* I haven't actually looked at Keramik, so it might not do this, but
it's an example of a style where a developer *might* choose this
technique to achieve an effect like Keramik.)
Now, you *could* solve all this by re-calling polish every time you
alter the palette, but that is a MAJOR performance hit, because you
force a style to clear and refresh any cached information is has /for
every focus change/. I can absolutely guarantee that a LOT of styles
(mine included) would suffer from you doing this.
All that said, there is still another major problem: you don't have one
QStyle instance per widget, you have one per *container* (and I did
/verify/ that), and, except in cases (e.g. kuiviewer) where you
intentionally create more than one container, I think that generally
translates into one instance /per application/. IOW, changing the
palette changes it for ALL widgets, so you would have to be REALLY,
really careful to only draw the control with keyboard focus with the
altered palette. (WCTS) I'm not sure that's even possible, in which case
this entire discussion is moot, because doing this /outside/ the style
just plain won't work.
Conversely, doing The Right Thing *in* a QStyle/KStyle is relatively
simple; check if the widget you are drawing has keyboard focus, and
alter your drawing accordingly. Plus this lets the style decide what
that means. (Maybe instead of using the highlight color, it wants to use
some other distinctive palette color, or perhaps a color the user
chooses. Maybe the user just wants the plain-ol' focus rect.)
If I'm wrong I trust someone will correct me, but it still looks like
letting the style handler it is cleaner, safer, more efficient and more
flexible.
ALL that said (just to be clear) I still think *doing* this is a good
idea. Let's just do it in the right place. :-)
Now, one thing that MAY need to change in libs (outside of styles) is
making it easy for a style to know if the widget it's being asked to
draw should be drawn with the focus hint. :-)
[1 http://doc.trolltech.com/3.3/qstyle.html#polish]
--
Matthew
Emacs is a nice OS - but it lacks a good text editor. That's why I am
using Vim. -- Anonymous
More information about the kde-core-devel
mailing list