Hi Pedro,

see my comments below.


On Sat, Jan 21, 2023 at 5:19 PM Pedro Duque Vieira
<pedro.duquevie...@gmail.com> wrote:
> I've been building javafx themes for years now. Started creating JMetro in 
> JavaFX version 2. During this time I've been following how other themes are 
> being built and I can say that about 90% of the themes (rough estimate) that 
> are out there, are composed of author stylesheets, i.e they override values 
> set from code (including JMetro).
> I agree that themes that are to be provided to other developers would 
> probably be better off if they are user agent stylesheets. My point is that 
> migrating those 90% of themes to use this API would be easier if this flag 
> exists otherwise migration would likely introduce UI regressions for 
> developers using those themes.
>
> To be clear, what I'm proposing is a flag, or enum, or whatever, in 
> StyleTheme that defines whether the stylesheets in the StyleTheme should be a 
> user agent stylesheet or author stylesheet.
>
> Another point is in making themes that are only to be used locally in a 
> specific app that the developer is creating. It might be of interest that he 
> can toggle this flag and make all settings defined in the theme override any 
> styling set from code (or in FXML) so that he can have a centralized point 
> where all styling is done.

I think that the likelihood of this feature making it into the 21
release dramatically increases if we keep changes to the CSS subsystem
to an absolute minimum. I understand your point, but I want to deliver
this feature in the smallest useful package and add more features
later with follow-on PRs.

That's why I've renamed `Application.styleTheme` to
`Application.userAgentStyleTheme`. This makes it unmistakably clear
that we're only talking about user-agent stylesheets.
Also, it leaves open the possibility to add the
`Application.styleTheme` property later, which would cause the theme
to be interpreted as comprised of author stylesheets.
Classifying author/UA themes at the property level is also more
consistent with the way author/UA stylesheets are currently classified
in JavaFX.
What do you think about the styleTheme/userAgentStyleTheme API,
instead of having a flag in the implementation of StyleTheme itself?

Since one of the objectives of the PR is to promote Caspian and Modena
to first-class theme implementations, it makes sense to focus on UA
themes first (since built-in themes are comprised of UA stylesheets).



> 3 -
> Style themes are generally either defined as dark or light. i.e. you'll very 
> rarely have a theme that has some Windows with dark decorations and others 
> with light decorations. So I think it makes sense to have this as a theme 
> property.
> The ability to toggle decorations (light or dark) on an individual Window is 
> a good point you're making. Perhaps we should have a global definition in the 
> StyleTheme (whether the theme is light or dark) and a definition that can be 
> set per Window.
> If you set it on the StyleTheme then all Windows will respect it, but you can 
> override that value on each Window. If you override it on a specific Window, 
> that definition would take precedence over the global StyleTheme one.

In general, StyleTheme is a very simple concept: it's a dynamic
collection of stylesheets.
I don't think the interface should force implementers to deal with
anything other than stylesheets. If we did that, the following code
wouldn't work any more:

    Application.setUserAgentStyleTheme(
        () -> List.of("stylesheet1.css", "stylesheet2.css");

Maybe we can add a new interface, for example DarkModeAware, and if an
application theme is marked with this interface, JavaFX will try to
respect dark/light mode for platform decorations:

    public class MyCustomTheme implements StyleTheme, DarkModeAware {
        @Override
        public List<String> getStylesheets() {
            return List.of("stylesheet1.css", "stylesheet2.css");
        }
    }

    // Setting a DarkModeAware theme causes JavaFX to draw light or
    // dark platform decorations by default, depending on the current
    // platform preference. If the theme is not DarkModeAware, JavaFX
    // defaults to light decorations.
    //
    Application.setUserAgentStyleTheme(new MyCustomTheme());

In any case, I think we can deliver this feature in a follow-on PR.


> 4-
>>
>> If we wanted to expose this front-and-center, we could add these
>>
>> properties to the Platform.Properties interface:
>
>
>>     public interface Preferences extends ObservableMap<String, Object> {
>>         ReadOnlyBooleanProperty darkModeProperty();
>>         ReadOnlyObjectProperty<Color> accentColorProperty();
>>         ...
>>     }
>
>
> Yes, I think that would be great.

Let's see what other people think.

Reply via email to