summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgraemeg <graemeg@ae50a9b5-8222-0410-bf8d-8a13f76226bf>2007-08-13 23:36:17 +0000
committergraemeg <graemeg@ae50a9b5-8222-0410-bf8d-8a13f76226bf>2007-08-13 23:36:17 +0000
commitb2dd1504e6682c970e430afde56519bcd65efec5 (patch)
tree464d6c1ac7851a4f1c00f583b2bc85c6dbe9674e /src
parentbdc32a289e42b5bdfb92c7c2ca99bbaa8b9ea3fe (diff)
downloadfpGUI-b2dd1504e6682c970e430afde56519bcd65efec5.tar.xz
* Started with some basic ideas for implementing Style/Theme support.
Diffstat (limited to 'src')
-rw-r--r--src/gui/fpgui_package.lpk6
-rw-r--r--src/gui/gui_style.pas183
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.
+