Hi Fred and Quentin,

On 2011-11-22, at 8:17 AM, Quentin Mathé wrote:
> 
> Hi Quentin,
> 
> I like the changes you made for menu theming. And would like to use these as 
> a starting point for a bit of a general discussion on theming.
> 
> Sounds like a good idea. 

Yes, agreed.

> In this change you introduced a few new colour methods on GSTheme and 
> commented on another place in NSMenuItemCell.m
> // TODO: Make the color lookup simpler.
> 
> Now the way we make the colour lookup in GSTheme was decided by Richard some 
> time ago. He wanted to have basic lookup methods for all the different theme 
> operations to be similar and came up with the current interface for colour 
> lookup. It is not that I like this interface that much, but we should try to 
> stay consistent. For this reason I think we should use this as the official 
> interface for GSTheme instead of introducing new methods as we go. I know I 
> did so myself for example for toolbar colours.
> 
> I must admit I don't know how to edit the color lists easily. Thematic only 
> knows about some precise colors but cannot edit arbitrary color lists. 
> For example, how can I make +[NSColor controlBackgroundColor] uses +[NSColor 
> greenColor] ? Can I do that with the built-in color picker ?
> We also seem to have no tools to convert binary encoded NSColorList into the 
> ASCII format and vice-versa.

> About the current API… The GSTheme color lookup API includes a method 
> -colorNamed:state:, but the state is almost never used based on a quick grep 
> over the Gui source code (only once in NSMenuItemCell.m). So I would remove 
> the last argument and encode the state within the color name. NSColor API 
> names the color like that, this approach would avoid to introduce two color 
> naming schemes (GTheme vs NSColor) for the themable colors.
> 
> The state arguments makes sense with the tile lookup methods, but for the 
> themable colors I'm not convinced.
> 
> Having color methods declared in GSTheme (such as the toolbar one) as 
> syntactic sugar over -colorNamed: doesn't go against the current color 
> lookup. It might even be a good way to clearly document the colors that can 
> be customized.
>  
> I like your new themeControlState method. We should use this in all the other 
> places where it is useful, for example in the method backgroundColor.
> 
> Yes, it could even be used in other classes such as -[NSButtonCell 
> drawBezelWithFrame:inView:].
>  
> This is actually the only place where you use one of your new colour methods 
> outside of the GSTheme class, maybe we should just change the lookup key here 
> to menuItemBackgroundColor and adjust all the themes?
> 
> For -[NSMenuItemCell backgroundColor], I would suggest to remove:
> 
>   color = [[GSTheme theme] colorNamed: @"NSMenuItem" state: state];
>   if (color == nil)
> 
> and use either:
> 
>       if ((state == GSThemeHighlightedState) || (state == 
> GSThemeSelectedState))
>       {
>         color = [NSColor selectedMenuItemColor];
>       }
>       else
>       {
>         color = [[GSTheme theme] menuItemBackgroundColor];
>       }
> or
> 
>       if ((state == GSThemeHighlightedState) || (state == 
> GSThemeSelectedState))
>       {
>         color = [NSColor selectedMenuItemColor];
>       }
>       else
>       {
>         color = [[GSTheme theme] colorNamed: @"menuItemBackgroundColor"];
>       }
> 
> Should I use this last solution?
> 
> Then there is this call in your code:
> NSInterfaceStyleForKey(@"NSMenuInterfaceStyle", nil);
> We have plenty of similar calls all over the place, still I think this is 
> wrong. When ever possible we should pass in a responder as the second 
> argument of this function call. Every view is allowed to have its specific 
> interface style and at least the standard drawing code should respect this. 
> Themes may handle this differently or just ignore that value.
> 
> I'll remove this call in -menuSeparatorColor, it isn't needed now that the 
> Windows theme uses native menus as Gregory pointed it out in the bug report 
> #34792.

> I agree about passing a responder every time to the GSTheme methods where it 
> makes sense, and limiting the number of places where we use 
> NSInterfaceStyleForKey(). Most uses of NSInterfaceStyleForKey() should be in 
> GSTheme subclasses I think.
>  
> And one final point. You us the method call [path setLineWidth: 0.0]; This 
> isn't as well defined as it may seem. Most people think that this will select 
> the smallest possible line width. At least with our current code this may not 
> be true for the cairo backend. There is a long and ongoing discussion about 
> zero line widths on the cairo mailing list.
> 
> ok, I wasn't aware of this issue. Which width should I use to get the 
> thinnest possible line or something close? 0.5 or 0.1 for example?


I added a fix to the cairo backend a few months ago which will interpret 0 as a 
thin line (I think previously I broke a game which was relying on that 
behaviour.)

However, I recommend drawing a filled rectangle instead of using lines. In 
general, anywhere you have lines in a user interface, they should probably be 
filled rectangles. Filled rectangles scale up in a predictable way and are easy 
to pixel-align (just make the origin and size integers.)

Eric
_______________________________________________
Gnustep-dev mailing list
Gnustep-dev@gnu.org
https://lists.gnu.org/mailman/listinfo/gnustep-dev

Reply via email to