diff options
author | graemeg <graemeg@ae50a9b5-8222-0410-bf8d-8a13f76226bf> | 2007-08-13 23:36:17 +0000 |
---|---|---|
committer | graemeg <graemeg@ae50a9b5-8222-0410-bf8d-8a13f76226bf> | 2007-08-13 23:36:17 +0000 |
commit | b2dd1504e6682c970e430afde56519bcd65efec5 (patch) | |
tree | 464d6c1ac7851a4f1c00f583b2bc85c6dbe9674e /src | |
parent | bdc32a289e42b5bdfb92c7c2ca99bbaa8b9ea3fe (diff) | |
download | fpGUI-b2dd1504e6682c970e430afde56519bcd65efec5.tar.xz |
* Started with some basic ideas for implementing Style/Theme support.
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/fpgui_package.lpk | 6 | ||||
-rw-r--r-- | src/gui/gui_style.pas | 183 |
2 files changed, 188 insertions, 1 deletions
diff --git a/src/gui/fpgui_package.lpk b/src/gui/fpgui_package.lpk index ee8e2d41..f2f1f884 100644 --- a/src/gui/fpgui_package.lpk +++ b/src/gui/fpgui_package.lpk @@ -18,7 +18,7 @@ <Description Value="fpGUI - multi-handle redesign"/> <License Value="Modified LGPL"/> <Version Minor="5"/> - <Files Count="20"> + <Files Count="21"> <Item1> <Filename Value="gui_button.pas"/> <UnitName Value="gui_button"/> @@ -99,6 +99,10 @@ <Filename Value="gui_menu.pas"/> <UnitName Value="gui_menu"/> </Item20> + <Item21> + <Filename Value="gui_style.pas"/> + <UnitName Value="gui_style"/> + </Item21> </Files> <RequiredPkgs Count="2"> <Item1> diff --git a/src/gui/gui_style.pas b/src/gui/gui_style.pas new file mode 100644 index 00000000..a66ed4f3 --- /dev/null +++ b/src/gui/gui_style.pas @@ -0,0 +1,183 @@ +{ + This is where all style related types should be define. The base Style + class should also be defined here. +} +unit gui_style; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, + SysUtils, + gfxbase, + fpgfx, + gfx_widget; + + +type + TfpgPrimitiveElement = ( + peFocusRectangle, // The focus rectangle + pePanel, // Generic bevel of a panel + pePanelButtonBevel, // The bevel of a button + pePanelEditBox, // Frame around a text edit box + peFrameMenu, // Frame for popup windows and menus + pePanelMenuBar, // The menu bar panel + pePanelScrollAreaCorner, // Panel at the bottom right corner of the scroll area + peFrameDefaultButton, // Frame around a default button like in a dialog + peFramePageControl, // Frame for a Page Control + peIndicatorArrowUp, // Generic up arrow + peIndicatorArrowDown, // Generic down arrow + peIndicatorArrowRight, // Generic right arrow + peIndicatorArrowLeft, // Generic left arrow + peIndicatorCheckBox, // On/off indicator used in a CheckBox + peIndicatorRadioButton, // Exclusive on indicator used in a Radio Button + peIndicatorHeaderArrow, // Indicator used in List or Tabel header to show sorting + peIndicatorMenuCheckMark, // Check mark used in menus + peIndicatorProgressBar // Body section of a Progress Bar + ); + + + TfpgControlElement = ( + cePushButton, // The Bevel, Label and FocusRect + cePushButtonBevel, + cePushButtonLabel, + ceRadioButton, // Indicator, FocusRect and Label + ceRadioButtonLabel, + ceCheckBox, // Indicator, FocusRect and Label + ceCheckBoxLabel, + ceMenuItem, + ceMenuBarItem, + ceMenuBarEmptyArea, + ceMenuTearOff, + ceMenuHMargin, + ceMenuVMargin, + ceProgressBar, + cePageControlTab, // Both the Shape and Label + cePageControlShape, + cePageControlLabel + ); + + + TfpgStyleOption = ( + soDefault, + soFocusRect, + soButton, + soComboBox, + soCheckBox, + soMenuItem, + soTrackBar, + soPanel, + soComplex + ); + + + TfpgStateItem = ( + stNone, + stActive, + stReadOnly, + stSelected, + stRaised, + stLowered, + stHasFocus, + stEnabled + ); + TfpgState = set of TfpgStateItem; + + + // Just a data class + TfpgStyleOption = class(TObject) + private + FRect: TfpgRect; + FState: TfpgState; + FStyleOption: TfpgStyleOption; + public + property StyleOption: TfpgStyleOption read FStyleOption write FStyleOption; + property Rect: TfpgRect read FRect write FRect; + property State: TfpgState read FState write FState; + end; + + + TfpgBaseStyle = class(TObject) + public + procedure DrawControl(element: TfpgControlElement; const option: TfpgStyleOption; canvas: TfpgCanvas; widget: TfpgWidget = nil); virtual; abstract; + procedure DrawPrimitive(element: TfpgPrimitiveElement; const option: TfpgStyleOption; canvas: TfpgCanvas; widget: TfpgWidget = nil); virtual; abstract; + end; + + + + //----------------------------------------- + // The classes below will be better placed in their own units! + + + // This class encapsulates the common look and feel of the GUI + TfpgCommonStyle = class(TfpgBaseStyle) + public + procedure DrawControl(element: TfpgControlElement; const option: TfpgStyleOption; canvas: TfpgCanvas; widget: TfpgWidget=nil); override; + procedure DrawPrimitive(element: TfpgPrimitiveElement; const option: TfpgStyleOption; canvas: TfpgCanvas; widget: TfpgWidget=nil); override; + end; + + + // The Windows 2000 look + TfpgWin2000Style = class(TfpgCommonStyle) + end; + + + TfpgWinXPStyle = class(TfpgCommonStyle) + end; + + + // This class provides a widgte style similar to the classic BlueCurve theme + // originally created by Red Hat. + TfpgBluecurveStyle = class(TfpgCommonStyle) + end; + + + // This class provides a widget style similar to GNOME + TfpgClearLookStyle = class(TfpgCommonStyle) + end; + + + // For the die-hard unix fans! + TfpgMotifStyle = class(TfpgCommonStyle) + end; + + + + +implementation + + + +{ TfpgCommonStyle } + +procedure TfpgCommonStyle.DrawControl(element: TfpgControlElement; + const option: TfpgStyleOption; canvas: TfpgCanvas; widget: TfpgWidget); +begin + // Do common things here +end; + +procedure TfpgCommonStyle.DrawPrimitive(element: TfpgPrimitiveElement; + const option: TfpgStyleOption; canvas: TfpgCanvas; widget: TfpgWidget); +begin + // Do common things here. It's going to be a huge case statement. This design + // allows us to add new controls or elements without having to instantly + // implement them in all descendant classes! + case element of + peFocusRectangle: + begin + canvas.DrawFocusRect(option.Rect); + end; + peIndicatorRadioButton: + begin // just an example!!!!!!!! + canvas.SetColor(clShadow1); + canvas.DrawArc(option.Rect.Left, option.Rect.Top, option.Rect.Width, option.Rect.Height, 0, 180); + canvas.SetColor(clHilite1); + canvas.DrawArc(option.Rect.Left, option.Rect.Top, option.Rect.Width, option.Rect.Height, 180, 0); + end; + end; +end; + +end. + |