lazarus/lcl/interfaces/qt/qtwsarrow.pp
mattias 369aa3055c fixed typo dont
git-svn-id: trunk@27304 -
2010-09-11 14:05:21 +00:00

133 lines
4.4 KiB
ObjectPascal

{ $Id$}
{
*****************************************************************************
* QtWSArrow.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 QtWSArrow;
{$mode objfpc}{$H+}
interface
{$I qtdefines.inc}
uses
Types,
// Bindings
qt4,
qtwidgets, qtobjects,
// LCL
SysUtils, Controls, LCLType, LCLProc, Graphics, Arrow,
////////////////////////////////////////////////////
WSArrow, WSLCLClasses;
type
{ TQtWSArrow }
TQtWSArrow = class(TWSArrow)
published
class function CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle; override;
class procedure SetType(const AArrow: TArrow; const AArrowType: TArrowType;
const AShadowType: TShadowType); override;
class procedure DrawArrow(const AArrow: TArrow; const ACanvas: TCanvas);
override;
end;
implementation
{------------------------------------------------------------------------------
Method: TQtWSArrow.CreateHandle
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class function TQtWSArrow.CreateHandle(const AWinControl: TWinControl;
const AParams: TCreateParams): TLCLIntfHandle;
var
QtArrow: TQtArrow;
begin
{$ifdef VerboseQt}
WriteLn('> TQtWSArrow.CreateHandle for ',dbgsname(AWinControl));
{$endif}
QtArrow := TQtArrow.Create(AWinControl, AParams);
QtArrow.ArrowType := Ord(TArrow(AWinControl).ArrowType);
QtArrow.AttachEvents;
Result := TLCLIntfHandle(QtArrow);
{$ifdef VerboseQt}
WriteLn('< TQtWSArrow.CreateHandle for ',dbgsname(AWinControl),' Result: ', dbgHex(Result));
{$endif}
end;
{------------------------------------------------------------------------------
Method: TQtWSArrow.SetType
Params: None
Returns: Nothing
------------------------------------------------------------------------------}
class procedure TQtWSArrow.SetType(const AArrow: TArrow; const AArrowType: TArrowType;
const AShadowType: TShadowType);
var
QtArrow: TQtArrow;
begin
QtArrow := TQtArrow(AArrow.Handle);
QtArrow.ArrowType := Ord(AArrowType);
end;
class procedure TQtWSArrow.DrawArrow(const AArrow: TArrow;
const ACanvas: TCanvas);
const
QtArrowTypeMap: array[TArrowType] of QStylePrimitiveElement =
(
{atUp } QStylePE_IndicatorArrowUp,
{atDown } QStylePE_IndicatorArrowDown,
{atLeft } QStylePE_IndicatorArrowLeft,
{atRight} QStylePE_IndicatorArrowRight
);
var
DC: TQtDeviceContext;
ARect: TRect;
StyleOption: QStyleOptionH;
begin
DC := TQtDeviceContext(ACanvas.Handle);
ARect := AArrow.ClientRect;
StyleOption := QStyleOption_create(1, integer(QStyleOptionSO_Default));
try
// I do not know the reason, but under windows down arrow size is very small
// and is not dependent on passed ARect.
// There is nothing in qt source that can cause such bad painting.
// Other styles draw down arrow very well.
QStyleOption_initFrom(StyleOption, DC.Parent);
QStyleOption_setRect(StyleOption, @ARect);
QStyle_drawPrimitive(QApplication_style, QtArrowTypeMap[AArrow.ArrowType],
StyleOption, DC.Widget, DC.Parent);
finally
QStyleOption_destroy(StyleOption);
end;
end;
end.