> On 20 Dec 2023, at 07:44, Albert Palacios <optimi...@gmail.com> wrote:
> 
> Hi,
> 
> With the GitHub code, where the GSTheme.m file is 8 years old, I can't see 
> how to create a theme to my liking. Now I see that there have been 
> modifications three months ago to some files, I will have to look at the 
> differences to see in detail what it is about.

Please take a look at the documentation (or, since it is generated from mark in 
the heaqder files) GSTheme.h
Perhaps also look at Thematic.app,  since GSTheme and Thematic.app were 
developed together (so we would have an app to manage/build themes).  The app 
is far from complete (the hope being that theme developers woudl add missing 
functionality when they needed it), buteven so it  allows a lot of theme setup 
to be done using a GUI.
The documentation at the start of GSTheme.h describes how themes are meant to 
work overall,  a key feature being that themes can be dynamically switched in a 
running application (so in Thematic.app you can see the effects of changes made 
when editing a theme).

Simple themes use settings (user defaults) to control behaviors, color lists to 
control the colors of each GUI element, replacement bitmap images, and bitmap 
tiling ... stuff that can be built in the app using the GUI and no coding.
A substantial part of the theme code is dedicated to making those things simple 
to change, so in Thematic.app you can use the GUI to select settings, set 
colors for all the named interface elements etc, and even to specify tiles to 
be repeated to make up elements of the GUI without any need for coding.

More complex themes are implemented by having a subclass of GSTheme where you 
override some of the methods used to modify the behavior and to draw different 
control element.  There are a lot of those methods, grouped into categories by 
function.  However there's no guarantee that there will be a method to control 
everything you want.
There's also an ability to name individual objects so that your drawing code 
can treat particular objects differently from others (see 
-setName:forElement:temporary: and -nameForElement:).

The intended solution to that is that theme developers should reach out to the 
GNUstep developers and ask for a new theme method to be added to allow some 
specific behavior/drawing to be altered;  a new method would be added to 
GSTheme and the GUI class would be modified to call the new method from 
GSTheme.  The theme developer would then override this new method (in their 
GSTheme sbclass) to alter behavior/appearance when their theme is active.

But ... getting a new theming method in place (and waiting for a new release 
gof the GUI) is time consuming, so as an temporary solution the GSTheme code 
actually allows your GSTheme subclass to temporarily override methods in other 
classes in a way which still works with the theme switching mechanism (see the 
-overriddenMethod:for: method, which describes the naming convention for doing 
this).


> Also, in the documentation, I can't see anywhere how to properly make a 
> custom vector theme from scratch, and I haven't found any example either. 

I guess by 'vector theme' you mean one where you implement methods to do the 
drawing.  That's fundamentally a programming task (what I describe as 'More 
complex themes' above) rather than GUI based design.  As such you need to look 
at implementing/overriding the GSTheme methods in the various categories,  but 
to know which ones you want to change you also need to look at the GUI code to 
see which theme methods are used where.

Reply via email to