summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGraeme Geldenhuys <graeme@mastermaths.co.za>2011-05-08 01:02:02 +0200
committerGraeme Geldenhuys <graeme@mastermaths.co.za>2011-05-08 01:02:02 +0200
commit2a2d9e31c06fdac960131af3b2856a23c5b4676c (patch)
tree22ab7f7fe9d66b916a3bcf87d4b280944888fae7
parentbc98111a23da2901b5c17883fc65ad81a3ea97f0 (diff)
downloadfpGUI-2a2d9e31c06fdac960131af3b2856a23c5b4676c.tar.xz
Implemented some of the styling for the Motif Style.
-rw-r--r--src/gui/fpg_style_motif.pas193
1 files changed, 189 insertions, 4 deletions
diff --git a/src/gui/fpg_style_motif.pas b/src/gui/fpg_style_motif.pas
index 5db89787..0ef86187 100644
--- a/src/gui/fpg_style_motif.pas
+++ b/src/gui/fpg_style_motif.pas
@@ -1,11 +1,43 @@
-unit fpg_style_motif;
+{
+ fpGUI - Free Pascal GUI Toolkit
+
+ Copyright (C) 2006 - 2011 See the file AUTHORS.txt, included in this
+ distribution, for details of the copyright.
+
+ See the file COPYING.modifiedLGPL, included in this distribution,
+ for details about redistributing fpGUI.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ Description:
+ Implements the classic Motif / CDE look.
+}
+unit fpg_style_motif;
{$mode objfpc}{$H+}
interface
uses
- Classes, SysUtils;
+ Classes
+ ,fpg_base
+ ,fpg_main
+ ;
+
+type
+
+ TfpgMotifStyle = class(TfpgStyle)
+ public
+ constructor Create; override;
+ { General }
+ procedure DrawControlFrame(ACanvas: TfpgCanvas; x, y, w, h: TfpgCoord); override;
+ procedure DrawFocusRect(ACanvas: TfpgCanvas; r: TfpgRect); override;
+ { Buttons }
+ procedure DrawButtonFace(ACanvas: TfpgCanvas; x, y, w, h: TfpgCoord; AFlags: TfpgButtonFlags); override;
+ function GetButtonBorders: TRect; override;
+ end;
implementation
@@ -13,8 +45,161 @@ uses
fpg_stylemanager
;
-//initialization
-// fpgStyleManager.RegisterClass('Motif', TfpgMotifStyle);
+{ TfpgMotifStyle }
+
+constructor TfpgMotifStyle.Create;
+begin
+ inherited Create;
+
+ fpgSetNamedColor(clWindowBackground, $999999);
+ fpgSetNamedColor(clButtonFace, $999999);
+ fpgSetNamedColor(clBoxColor, $999999);
+ fpgSetNamedColor(clListBox, $999999);
+
+end;
+
+procedure TfpgMotifStyle.DrawControlFrame(ACanvas: TfpgCanvas; x, y, w, h: TfpgCoord);
+var
+ r: TfpgRect;
+begin
+ r.SetRect(x, y, w, h);
+ ACanvas.SetColor(clShadow2);
+ ACanvas.DrawLine(r.Left, r.Bottom, r.Left, r.Top); // left (outer)
+ ACanvas.DrawLine(r.Left, r.Top, r.Right, r.Top); // top (outer)
+
+ ACanvas.SetColor(clHilite1);
+ ACanvas.DrawLine(r.Right, r.Top, r.Right, r.Bottom); // right (outer)
+ ACanvas.DrawLine(r.Right, r.Bottom, r.Left, r.Bottom); // bottom (outer)
+
+ ACanvas.SetColor(clShadow2);
+ ACanvas.DrawLine(r.Left+1, r.Bottom-1, r.Left+1, r.Top+1); // left (inner)
+ ACanvas.DrawLine(r.Left+1, r.Top+1, r.Right-1, r.Top+1); // top (inner)
+
+ ACanvas.SetColor(clHilite1);
+ ACanvas.DrawLine(r.Right-1, r.Top+1, r.Right-1, r.Bottom-1); // right (inner)
+ ACanvas.DrawLine(r.Right-1, r.Bottom-1, r.Left+1, r.Bottom-1); // bottom (inner)
+end;
+
+procedure TfpgMotifStyle.DrawFocusRect(ACanvas: TfpgCanvas; r: TfpgRect);
+var
+ oldColor: TfpgColor;
+ oldLineWidth: integer;
+ oldLineStyle: TfpgLineStyle;
+begin
+ oldColor := ACanvas.Color;
+ oldLineWidth := ACanvas.LineWidth;
+ oldLineStyle := ACanvas.LineStyle;
+
+ ACanvas.SetColor(clBlack);
+ ACanvas.SetLineStyle(1, lsSolid);
+ ACanvas.DrawRectangle(r);
+
+ // restore previous settings
+ ACanvas.SetColor(oldColor);
+ ACanvas.SetLineStyle(oldLineWidth, oldLineStyle);
+end;
+
+procedure TfpgMotifStyle.DrawButtonFace(ACanvas: TfpgCanvas; x, y, w, h: TfpgCoord; AFlags: TfpgButtonFlags);
+var
+ r: TfpgRect;
+begin
+ r.SetRect(x, y, w, h);
+
+ if btfIsDefault in AFlags then
+ begin
+ ACanvas.SetColor(clBlack);
+ ACanvas.SetLineStyle(1, lsSolid);
+ ACanvas.DrawRectangle(r);
+ InflateRect(r, -1, -1);
+ Exclude(AFlags, btfIsDefault);
+ fpgStyle.DrawButtonFace(ACanvas, r.Left, r.Top, r.Width, r.Height, AFlags);
+ Exit; //==>
+ end;
+
+ { Clear the rectangle with a color }
+ ACanvas.SetColor(clButtonFace);
+ ACanvas.SetLineStyle(1, lsSolid);
+ ACanvas.FillRectangle(x, y, w, h);
+
+ if (btfFlat in AFlags) and not (btfIsPressed in AFlags) then
+ Exit; // no need to go further
+
+ // Left and Top (outer)
+ if (btfIsPressed in AFlags) then
+ begin
+ if (btfIsEmbedded in AFlags) then
+ ACanvas.SetColor(clHilite2)
+ else
+ begin
+ if (btfFlat in AFlags) or (btfHover in AFlags) then
+ ACanvas.SetColor(clShadow1) { light shadow }
+ else
+ ACanvas.SetColor(clShadow2); { dark shadow }
+ end;
+ end
+ else
+ ACanvas.SetColor(clHilite1);
+
+ ACanvas.DrawLine(r.Left, r.Bottom, r.Left, r.Top); // left
+ ACanvas.DrawLine(r.Left, r.Top, r.Right, r.Top); // top
+
+ // Left and Top (inner)
+ if not ((btfFlat in AFlags) or (btfHover in AFlags)) then
+ begin
+ ACanvas.DrawLine(r.left+1, r.bottom-1, r.left+1, r.top+1); // left
+ ACanvas.DrawLine(r.left+1, r.top+1, r.right-1, r.top+1); // top
+ end;
+
+ // Right and Bottom (outer)
+ if (btfIsPressed in AFlags) then
+ begin
+ if (btfIsEmbedded in AFlags) then
+ ACanvas.SetColor(clHilite1)
+ else
+ begin
+ if (btfFlat in AFlags) or (btfHover in AFlags) then
+ ACanvas.SetColor(clHilite2) { light shadow }
+ else
+ ACanvas.SetColor(clShadow2); { dark shadow }
+ end;
+ end
+ else
+ begin
+ if btfHover in AFlags then
+ ACanvas.SetColor(clShadow1) { light shadow }
+ else
+ ACanvas.SetColor(clShadow2); { dark shadow }
+ end;
+
+ ACanvas.DrawLine(r.Right, r.Top, r.Right, r.Bottom); // right
+ ACanvas.DrawLine(r.Right, r.Bottom, r.Left-1, r.Bottom); // bottom
+
+ if (btfFlat in AFlags) or (btfHover in AFlags) then
+ exit; { "toolbar" style buttons need a nice thin/flat border }
+
+ // Right and Bottom (inner)
+ if btfIsPressed in AFlags then
+ begin
+ if (btfIsEmbedded in AFlags) then
+ ACanvas.SetColor(clButtonFace)
+ else
+ ACanvas.SetColor(clHilite1);
+ end
+ else
+ ACanvas.SetColor(clShadow2);
+
+ ACanvas.DrawLine(r.Right-1, r.Top+1, r.Right-1, r.Bottom-1); // right
+ ACanvas.DrawLine(r.Right-1, r.Bottom-1, r.Left, r.Bottom-1); // bottom
+end;
+
+function TfpgMotifStyle.GetButtonBorders: TRect;
+begin
+ Result := Rect(4, 4, 4, 4);
+end;
+
+
+initialization
+ fpgStyleManager.RegisterClass('Motif', TfpgMotifStyle);
end.