summaryrefslogtreecommitdiff
path: root/src/gui/gui_style.pas
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/gui_style.pas')
-rw-r--r--src/gui/gui_style.pas183
1 files changed, 183 insertions, 0 deletions
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.
+