[fpc-pascal] First Version Vector Toolkit in OpenGL

Anthony Walter sysrpl at gmail.com
Tue Nov 2 22:50:08 CET 2021


New themes are defined by this abstract class from which you would inherit
and implement. Sliced up bitmaps could be used to create a theme for sure,
but I have implemented the themes so far using vector drawing commands
exclusively.

  TTheme = class
  public
    { Calculate the actual theme color }
    function CalcColor(Widget: TWidget; Color: TThemeColor): LongWord;
virtual; abstract;
    { Calculate the size of a widget }
    function CalcSize(Widget: TWidget; Part: TThemePart): TSizeF; virtual;
abstract;
    { Render the widget }
    procedure Render(Widget: TWidget); virtual; abstract;
  end;

There are two themes I have implemented so far. One theme based on the
popular Arc Dark Linux theme, and the other based on Windows 95 or what I
call the Chicago theme. See this screenshot:

https://cache.getlazarus.org/images/desktop/both-acr-dark-and-chicago-theme-at-the-same-time.png

After settling on how to implement my first theme Arc Dark, adding the
Chicago theme was quite easy. I just changed some system colors and a few
of the size / render options and I was done. One difference in the newer
Chicago theme was that active window captions would be a different color,
and I implemented the classic Windows 95 dotted focus rect for controls
that can receive input focus.

An interesting feature is that themes can be applied on a per widget level,
or they can be inherited from the parent widget. Each widget has a computed
property that reflects any property which can be inherited from the visual
parent hierarchy. This includes computed opacity, enabled, visibility,
boundaries, the theme being used, and so on.

Another point of interest is how icons for message boxes, buttons, and
other controls are handled. I reuse the text property and use a vector
glyph font. You can change the glyph font to get different icons, but for
now I am using the FOSS material design font and wrote a cross platform
small utility to assist in picking out icons:

https://cache.getlazarus.org/images/desktop/icon-utility.png

Yesterday I completed modal windows support and added a few modal window
message type functions to the main widget. As an example this is how
MessageBox(const Message: string) implemented in TMainWidget:

procedure TMainWidget.MessageBox(const Message: string);
begin
  with Add<TWindow> do
  begin
    with This.Add<THBox> do
    begin
      Align := alignCenter;
      with This.Add<TGlyphImage> do
      begin
        Align := alignCenter;
        Text := '';
      end;
      with This.Add<TLabel> do
      begin
        Align := alignCenter;
        MaxWidth := 400;
        Text := Message;
      end;
    end;
    with This.Add<TButton> do
    begin
      Align := alignCenter;
      Text := 'OK';
      ModalResult := modalOk;
    end;
    Text := 'Message';
    Pack;
    X := (Self.Width - This.Width) / 2;
    Y := (Self.Height - This.Height) / 2;
    ShowModal(MessageBoxClose);
  end;
end;

And this is the result:

https://cache.getlazarus.org/images/desktop/message-box.png

And with the Chicago theme:

https://cache.getlazarus.org/images/desktop/message-box-chicago.png

Mind you, this UI toolkit is only meant to be a minimal system for
configuring or interfacing with a game, physics simulation, animation or
demo program. It is not intended to be a general use cross platform UI
framework.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20211102/04f62c8f/attachment.htm>


More information about the fpc-pascal mailing list