LCL-CustomDrawn: Adds initial TScrollBar and SpinEdit implementations

git-svn-id: trunk@36022 -
This commit is contained in:
sekelsenmat 2012-03-15 09:55:38 +00:00
parent 86916fe2d8
commit f7ab8832da
6 changed files with 214 additions and 55 deletions

1
.gitattributes vendored
View File

@ -5640,6 +5640,7 @@ lcl/interfaces/customdrawn/customdrawnwsforms_cocoa.inc svneol=native#text/pasca
lcl/interfaces/customdrawn/customdrawnwsforms_win.inc svneol=native#text/pascal
lcl/interfaces/customdrawn/customdrawnwsforms_x11.inc svneol=native#text/pascal
lcl/interfaces/customdrawn/customdrawnwslazdeviceapis.pas svneol=native#text/pascal
lcl/interfaces/customdrawn/customdrawnwsspin.pas svneol=native#text/pascal
lcl/interfaces/customdrawn/customdrawnwsstdctrls.pas svneol=native#text/pascal
lcl/interfaces/customdrawn/interfaces.pas svneol=native#text/pascal
lcl/interfaces/customdrawn/wincallback.inc svneol=native#text/pascal

View File

@ -9,7 +9,8 @@ uses
Types, Classes, SysUtils,
// LCL
Controls, Graphics, stdctrls, extctrls, comctrls,
customdrawnproc, customdrawncontrols, lcltype, lclproc, lclintf;
customdrawnproc, customdrawncontrols, lcltype, lclproc, lclintf,
spin;
type
@ -37,6 +38,11 @@ type
LCLControl: TCustomComboBox;
end;
TCDIntfScrollBar = class(TCDScrollBar)
public
LCLControl: TCustomScrollBar;
end;
// Additional Tab
TCDIntfStaticText = class(TCDProgressBar)
@ -61,6 +67,13 @@ type
LCLControl: TCustomTabControl;
end;
// Misc
TCDIntfSpinEdit = class(TCDSpinEdit)
public
LCLControl: TCustomFloatSpinEdit;
end;
// These are default message handlers which backends might use to simplify their code
// They convert a message sent to the form into a message to the correct sub-control
procedure CallbackMouseUp(AWindowHandle: TCDForm; x, y: Integer; Button: TMouseButton; ShiftState: TShiftState = []);

View File

@ -112,8 +112,8 @@ uses
CustomDrawnWSExtCtrls,
CustomDrawnWSForms,
{ WinCEWSImgList,
WinCEWSMenus,
WinCEWSSpin,}
WinCEWSMenus,}
CustomDrawnWSSpin,
CustomDrawnWSStdCtrls,
CustomDrawnWSLazDeviceAPIs{,
WinCEWSGrids};
@ -268,8 +268,8 @@ end;
// StdCtrls
function RegisterCustomScrollBar: Boolean; alias : 'WSRegisterCustomScrollBar';
begin
// RegisterWSComponent(TCustomScrollBar, TWinCEWSScrollBar);
Result := False;
RegisterWSComponent(TCustomScrollBar, TCDWSScrollBar);
Result := True;
end;
function RegisterCustomGroupBox: Boolean; alias : 'WSRegisterCustomGroupBox';
@ -547,8 +547,8 @@ end;
function RegisterCustomFloatSpinEdit: Boolean; alias : 'WSRegisterCustomFloatSpinEdit';
begin
// RegisterWSComponent(TCustomFloatSpinEdit, TWinCEWSCustomFloatSpinEdit);
Result := False;
RegisterWSComponent(TCustomFloatSpinEdit, TCDWSCustomFloatSpinEdit);
Result := True;
end;
function RegisterCustomRubberBand: Boolean; alias : 'WSRegisterCustomRubberBand';

View File

@ -0,0 +1,139 @@
{
*****************************************************************************
* QtWSSpin.pp *
* ----------- *
* *
* *
*****************************************************************************
*****************************************************************************
* *
* This file is part of the Lazarus Component Library (LCL) *
* *
* See the file COPYING.modifiedLGPL.txt, included in this distribution, *
* for details about the copyright. *
* *
* 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. *
* *
*****************************************************************************
}
unit customdrawnwsspin;
{$mode objfpc}{$H+}
interface
{$I customdrawndefines.inc}
uses
// RTL
// LCL
Spin, SysUtils, Controls, Classes, LCLType, LCLProc, LCLIntf, Forms,
customdrawncontrols,
// Widgetset
WSProc, WSSpin, WSLCLClasses, CustomDrawnWsControls, customdrawnproc,
customdrawnprivate;
type
{ TCDWSCustomFloatSpinEdit }
TCDWSCustomFloatSpinEdit = class(TWSCustomFloatSpinEdit)
public
class procedure InjectCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
published
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle; override;
class procedure DestroyHandle(const AWinControl: TWinControl); override;
class procedure ShowHide(const AWinControl: TWinControl); override;
class procedure UpdateControl(const ACustomFloatSpinEdit: TCustomFloatSpinEdit); override;
class function GetValue(const ACustomFloatSpinEdit: TCustomFloatSpinEdit): Double; override;
(*TODO: seperation into properties instead of bulk update
class procedure SetIncrement(const ACustomFloatSpinEdit: TCustomFloatSpinEdit; NewIncrement: Double); virtual;
class procedure SetMinValue(const ACustomFloatSpinEdit: TCustomFloatSpinEdit; NewValue: Double); virtual;
class procedure SetMaxValue(const ACustomFloatSpinEdit: TCustomFloatSpinEdit; NewValue: Double); virtual;
class procedure SetValueEmpty(const ACustomFloatSpinEdit: TCustomFloatSpinEdit; NewEmpty: boolean); virtual;
*)
end;
implementation
class procedure TCDWSCustomFloatSpinEdit.InjectCDControl(
const AWinControl: TWinControl; var ACDControlField: TCDControl);
begin
TCDIntfSpinEdit(ACDControlField).LCLControl := TCustomFloatSpinEdit(AWinControl);
ACDControlField.Caption := AWinControl.Caption;
ACDControlField.Parent := AWinControl;
ACDControlField.Align := alClient;
end;
{------------------------------------------------------------------------------
Method: TCDWSCustomFloatSpinEdit.CreateHandle
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class function TCDWSCustomFloatSpinEdit.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle;
var
lCDWinControl: TCDWinControl;
begin
Result := TCDWSWinControl.CreateHandle(AWinControl, AParams);
lCDWinControl := TCDWinControl(Result);
lCDWinControl.CDControl := TCDIntfSpinEdit.Create(AWinControl);
end;
class procedure TCDWSCustomFloatSpinEdit.DestroyHandle(
const AWinControl: TWinControl);
var
lCDWinControl: TCDWinControl;
begin
lCDWinControl := TCDWinControl(AWinControl.Handle);
lCDWinControl.CDControl.Free;
lCDWinControl.Free;
end;
class procedure TCDWSCustomFloatSpinEdit.ShowHide(const AWinControl: TWinControl);
var
lCDWinControl: TCDWinControl;
begin
lCDWinControl := TCDWinControl(AWinControl.Handle);
TCDWSWinControl.ShowHide(AWinControl);
if not lCDWinControl.CDControlInjected then
begin
InjectCDControl(AWinControl, lCDWinControl.CDControl);
lCDWinControl.CDControlInjected := True;
end;
end;
class function TCDWSCustomFloatSpinEdit.GetValue(const ACustomFloatSpinEdit: TCustomFloatSpinEdit): Double;
var
lCDWinControl: TCDWinControl;
begin
lCDWinControl := TCDWinControl(ACustomFloatSpinEdit.Handle);
Result := TCDIntfSpinEdit(lCDWinControl.CDControl).Value;
end;
class procedure TCDWSCustomFloatSpinEdit.UpdateControl(const ACustomFloatSpinEdit: TCustomFloatSpinEdit);
{var
CurrentSpinWidget: TQtAbstractSpinBox;}
begin
{ if not WSCheckHandleAllocated(ACustomFloatSpinEdit, 'UpdateControl') then
Exit;
CurrentSpinWidget := TQtAbstractSpinBox(ACustomFloatSpinEdit.Handle);
if ((ACustomFloatSpinEdit.DecimalPlaces > 0) and (CurrentSpinWidget is TQtSpinBox)) or
((ACustomFloatSpinEdit.DecimalPlaces = 0) and (CurrentSpinWidget is TQtFloatSpinBox)) then
RecreateWnd(ACustomFloatSpinEdit)
else
InternalUpdateControl(CurrentSpinWidget, ACustomFloatSpinEdit);}
end;
end.

View File

@ -42,17 +42,20 @@ type
{ TCDWSScrollBar }
TCDWSScrollBar = class(TWSScrollBar)
public
class procedure InjectCDControl(const AWinControl: TWinControl; var ACDControlField: TCDControl);
published
{ class function CreateHandle(const AWinControl: TWinControl;
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle; override;
class procedure DestroyHandle(const AWinControl: TWinControl); override;
class procedure SetKind(const AScrollBar: TCustomScrollBar; const AIsHorizontal: Boolean); override;
class procedure SetParams(const AScrollBar: TCustomScrollBar); override;
class procedure ShowHide(const AWinControl: TWinControl); override;}
class procedure ShowHide(const AWinControl: TWinControl); override;
end;
{ TCDWSCustomGroupBox }
TCDWSCustomGroupBox = class(TWSCustomGroupBox)
TCDWSCustomGroupBox = class(TWSCustomGroupBox) // Receives direct rendering, so no control injection
published
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle; override;
@ -328,33 +331,40 @@ implementation
{ TCDWSScrollBar }
(*{------------------------------------------------------------------------------
Method: TCDWSCustomScrollBar.CreateHandle
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class function TCDWSScrollBar.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle;
var
QtScrollBar: TQtScrollBar;
class procedure TCDWSScrollBar.InjectCDControl(const AWinControl: TWinControl;
var ACDControlField: TCDControl);
begin
QtScrollBar := TQtScrollBar.Create(AWinControl, AParams);
TCDIntfScrollBar(ACDControlField).LCLControl := TCustomScrollBar(AWinControl);
ACDControlField.Caption := AWinControl.Caption;
ACDControlField.Parent := AWinControl;
ACDControlField.Align := alClient;
end;
QtScrollBar.AttachEvents;
case TScrollBar(AWinControl).Kind of
sbHorizontal: QtScrollBar.SetOrientation(QtHorizontal);
sbVertical: QtScrollBar.SetOrientation(QtVertical);
end;
Result := TLCLIntfHandle(QtScrollbar);
class function TCDWSScrollBar.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle;
var
lCDWinControl: TCDWinControl;
begin
Result := TCDWSWinControl.CreateHandle(AWinControl, AParams);
lCDWinControl := TCDWinControl(Result);
lCDWinControl.CDControl := TCDIntfScrollBar.Create(AWinControl);
end;
class procedure TCDWSScrollBar.DestroyHandle(const AWinControl: TWinControl);
var
lCDWinControl: TCDWinControl;
begin
lCDWinControl := TCDWinControl(AWinControl.Handle);
lCDWinControl.CDControl.Free;
lCDWinControl.Free;
end;
class procedure TCDWSScrollBar.SetKind(const AScrollBar: TCustomScrollBar;
const AIsHorizontal: Boolean);
var
QtScrollBar: TQtScrollBar;
{var
QtScrollBar: TQtScrollBar; }
begin
if not WSCheckHandleAllocated(AScrollBar, 'SetKind') then
{if not WSCheckHandleAllocated(AScrollBar, 'SetKind') then
Exit;
QtScrollBar := TQtScrollBar(AScrollBar.Handle);
QtScrollBar.BeginUpdate;
@ -381,21 +391,16 @@ begin
end;
finally
QtScrollbar.EndUpdate;
end;
end;}
end;
{------------------------------------------------------------------------------
Method: TCDWSCustomScrollBar.SetParams
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TCDWSScrollBar.SetParams(const AScrollBar: TCustomScrollBar);
var
QtScrollBar: TQtScrollBar;
{var
QtScrollBar: TQtScrollBar; }
begin
if not WSCheckHandleAllocated(AScrollBar, 'SetParams') then
{ if not WSCheckHandleAllocated(AScrollBar, 'SetParams') then
Exit;
QtScrollBar := TQtScrollBar(AScrollBar.Handle);
QtScrollBar := TQtScrollBar(AScrollBar.Handle);
QtScrollBar.BeginUpdate;
try
@ -432,27 +437,23 @@ begin
end;
finally
QtScrollbar.EndUpdate;
end;
end;}
end;
class procedure TCDWSScrollBar.ShowHide(const AWinControl: TWinControl);
var
Widget: TQtWidget;
lCDWinControl: TCDWinControl;
begin
if not WSCheckHandleAllocated(AWincontrol, 'ShowHide') then
Exit;
lCDWinControl := TCDWinControl(AWinControl.Handle);
Widget := TQtWidget(AWinControl.Handle);
TCDWSWinControl.ShowHide(AWinControl);
{reapply params just before visible since slider isn't updated
properly sometimes.}
if AWinControl.HandleObjectShouldBeVisible then
SetParams(TCustomScrollBar(AWinControl));
Widget.BeginUpdate;
Widget.setVisible(AWinControl.HandleObjectShouldBeVisible);
Widget.EndUpdate;
end;*)
if not lCDWinControl.CDControlInjected then
begin
InjectCDControl(AWinControl, lCDWinControl.CDControl);
lCDWinControl.CDControlInjected := True;
end;
end;
{ TCDWSCustomGroupBox }

View File

@ -114,7 +114,7 @@ end;"/>
<License Value="modified LGPL-2
"/>
<Version Major="1" Release="1"/>
<Files Count="395">
<Files Count="396">
<Item1>
<Filename Value="carbon/agl.pp"/>
<AddToUsesPkgSection Value="False"/>
@ -1956,6 +1956,11 @@ end;"/>
<AddToUsesPkgSection Value="False"/>
<UnitName Value="NoGUIWSFactory"/>
</Item395>
<Item396>
<Filename Value="customdrawn/customdrawnwsspin.pas"/>
<AddToUsesPkgSection Value="False"/>
<UnitName Value="customdrawnwsspin"/>
</Item396>
</Files>
<LazDoc Paths="../../docs/xml/lcl"/>
<i18n>