mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-05 14:58:16 +02:00
608 lines
17 KiB
ObjectPascal
608 lines
17 KiB
ObjectPascal
{ $Id$}
|
||
{
|
||
*****************************************************************************
|
||
* QtWSExtCtrls.pp *
|
||
* --------------- *
|
||
* *
|
||
* *
|
||
*****************************************************************************
|
||
|
||
*****************************************************************************
|
||
* *
|
||
* This file is part of the Lazarus Component Library (LCL) *
|
||
* *
|
||
* See the file COPYING.modifiedLGPL, 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 QtWSExtCtrls;
|
||
|
||
{$mode objfpc}{$H+}
|
||
|
||
interface
|
||
|
||
uses
|
||
// Bindings
|
||
{$ifdef USE_QT_4_3}
|
||
qt43,
|
||
{$else}
|
||
qt4,
|
||
{$endif}
|
||
qtwidgets, qtobjects, qtproc,
|
||
// LCL
|
||
LMessages, LCLMessageGlue,
|
||
SysUtils, Classes, Controls, Graphics, Forms, StdCtrls, ExtCtrls, LCLType,
|
||
ImgList,
|
||
// Widgetset
|
||
WSExtCtrls, WSLCLClasses;
|
||
|
||
type
|
||
|
||
{ TQtWSCustomPage }
|
||
|
||
TQtWSCustomPage = class(TWSCustomPage)
|
||
private
|
||
protected
|
||
public
|
||
class function CreateHandle(const AWinControl: TWinControl;
|
||
const AParams: TCreateParams): HWND; override;
|
||
class procedure UpdateProperties(const ACustomPage: TCustomPage); override;
|
||
end;
|
||
|
||
{ TQtWSCustomNotebook }
|
||
|
||
TQtWSCustomNotebook = class(TWSCustomNotebook)
|
||
private
|
||
protected
|
||
public
|
||
class function CreateHandle(const AWinControl: TWinControl;
|
||
const AParams: TCreateParams): HWND; override;
|
||
|
||
class procedure AddPage(const ANotebook: TCustomNotebook;
|
||
const AChild: TCustomPage; const AIndex: integer); override;
|
||
class procedure MovePage(const ANotebook: TCustomNotebook;
|
||
const AChild: TCustomPage; const NewIndex: integer); override;
|
||
class procedure RemovePage(const ANotebook: TCustomNotebook;
|
||
const AIndex: integer); override;
|
||
|
||
class function GetTabIndexAtPos(const ANotebook: TCustomNotebook; const AClientPos: TPoint): integer; override;
|
||
class procedure SetPageIndex(const ANotebook: TCustomNotebook; const AIndex: integer); override;
|
||
class procedure SetTabCaption(const ANotebook: TCustomNotebook; const AChild: TCustomPage; const AText: string); override;
|
||
class procedure SetTabPosition(const ANotebook: TCustomNotebook; const ATabPosition: TTabPosition); override;
|
||
class procedure ShowTabs(const ANotebook: TCustomNotebook; AShowTabs: boolean); override;
|
||
end;
|
||
|
||
{ TQtWSPage }
|
||
|
||
TQtWSPage = class(TWSPage)
|
||
private
|
||
protected
|
||
public
|
||
end;
|
||
|
||
{ TQtWSNotebook }
|
||
|
||
TQtWSNotebook = class(TWSNotebook)
|
||
private
|
||
protected
|
||
public
|
||
end;
|
||
|
||
{ TQtWSShape }
|
||
|
||
TQtWSShape = class(TWSShape)
|
||
private
|
||
protected
|
||
public
|
||
end;
|
||
|
||
{ TQtWSCustomSplitter }
|
||
|
||
TQtWSCustomSplitter = class(TWSCustomSplitter)
|
||
private
|
||
protected
|
||
public
|
||
end;
|
||
|
||
{ TQtWSSplitter }
|
||
|
||
TQtWSSplitter = class(TWSSplitter)
|
||
private
|
||
protected
|
||
public
|
||
end;
|
||
|
||
{ TQtWSPaintBox }
|
||
|
||
TQtWSPaintBox = class(TWSPaintBox)
|
||
private
|
||
protected
|
||
public
|
||
end;
|
||
|
||
{ TQtWSCustomImage }
|
||
|
||
TQtWSCustomImage = class(TWSCustomImage)
|
||
private
|
||
protected
|
||
public
|
||
end;
|
||
|
||
{ TQtWSImage }
|
||
|
||
TQtWSImage = class(TWSImage)
|
||
private
|
||
protected
|
||
public
|
||
end;
|
||
|
||
{ TQtWSBevel }
|
||
|
||
TQtWSBevel = class(TWSBevel)
|
||
private
|
||
protected
|
||
public
|
||
end;
|
||
|
||
{ TQtWSCustomRadioGroup }
|
||
|
||
TQtWSCustomRadioGroup = class(TWSCustomRadioGroup)
|
||
private
|
||
protected
|
||
public
|
||
class function CreateHandle(const AWinControl: TWinControl;
|
||
const AParams: TCreateParams): TLCLIntfHandle; override;
|
||
end;
|
||
|
||
{ TQtWSRadioGroup }
|
||
|
||
TQtWSRadioGroup = class(TWSRadioGroup)
|
||
private
|
||
protected
|
||
public
|
||
end;
|
||
|
||
{ TQtWSCustomCheckGroup }
|
||
|
||
TQtWSCustomCheckGroup = class(TWSCustomCheckGroup)
|
||
private
|
||
protected
|
||
public
|
||
class function CreateHandle(const AWinControl: TWinControl;
|
||
const AParams: TCreateParams): TLCLIntfHandle; override;
|
||
end;
|
||
|
||
{ TQtWSCheckGroup }
|
||
|
||
TQtWSCheckGroup = class(TWSCheckGroup)
|
||
private
|
||
protected
|
||
public
|
||
end;
|
||
|
||
{ TQtWSCustomLabeledEdit }
|
||
|
||
TQtWSCustomLabeledEdit = class(TWSCustomLabeledEdit)
|
||
private
|
||
protected
|
||
public
|
||
end;
|
||
|
||
{ TQtWSLabeledEdit }
|
||
|
||
TQtWSLabeledEdit = class(TWSLabeledEdit)
|
||
private
|
||
protected
|
||
public
|
||
end;
|
||
|
||
{ TQtWSCustomPanel }
|
||
|
||
TQtWSCustomPanel = class(TWSCustomPanel)
|
||
private
|
||
protected
|
||
public
|
||
class function CreateHandle(const AWinControl: TWinControl;
|
||
const AParams: TCreateParams): HWND; override;
|
||
end;
|
||
|
||
{ TQtWSPanel }
|
||
|
||
TQtWSPanel = class(TWSPanel)
|
||
private
|
||
protected
|
||
public
|
||
end;
|
||
|
||
{ TQtWSCustomTrayIcon }
|
||
|
||
TQtWSCustomTrayIcon = class(TWSCustomTrayIcon)
|
||
public
|
||
class function Hide(const ATrayIcon: TCustomTrayIcon): Boolean; override;
|
||
class function Show(const ATrayIcon: TCustomTrayIcon): Boolean; override;
|
||
class procedure InternalUpdate(const ATrayIcon: TCustomTrayIcon); override;
|
||
class function GetPosition(const ATrayIcon: TCustomTrayIcon): TPoint; override;
|
||
end;
|
||
|
||
implementation
|
||
|
||
const
|
||
QTabWidgetTabPositionMap: array[TTabPosition] of QTabWidgetTabPosition =
|
||
(
|
||
{ tpTop } QTabWidgetNorth,
|
||
{ tpBottom } QTabWidgetSouth,
|
||
{ tpLeft } QTabWidgetWest,
|
||
{ tpRight } QTabWidgetEast
|
||
);
|
||
|
||
{ TQtWSCustomPanel }
|
||
|
||
{------------------------------------------------------------------------------
|
||
Method: TQtWSCustomPanel.CreateHandle
|
||
Params: None
|
||
Returns: Nothing
|
||
|
||
Allocates memory and resources for the control and shows it
|
||
------------------------------------------------------------------------------}
|
||
class function TQtWSCustomPanel.CreateHandle(const AWinControl: TWinControl;
|
||
const AParams: TCreateParams): HWND;
|
||
var
|
||
QtFrame: TQtFrame;
|
||
begin
|
||
QtFrame := TQtFrame.Create(AWinControl, AParams);
|
||
QtFrame.AttachEvents;
|
||
|
||
// Set<65>s initial properties
|
||
|
||
QtFrame.setFrameShape(QFrameNoFrame);
|
||
|
||
// Return the Handle
|
||
|
||
Result := THandle(QtFrame);
|
||
end;
|
||
|
||
{ TQtWSCustomPage }
|
||
|
||
{------------------------------------------------------------------------------
|
||
Method: TQtWSCustomPage.CreateHandle
|
||
Params: None
|
||
Returns: Nothing
|
||
|
||
Allocates memory and resources for the control and shows it
|
||
------------------------------------------------------------------------------}
|
||
class function TQtWSCustomPage.CreateHandle(const AWinControl: TWinControl;
|
||
const AParams: TCreateParams): HWND;
|
||
var
|
||
QtPage: TQtPage;
|
||
begin
|
||
{$ifdef VerboseQt}
|
||
WriteLn('Trace:> [TQtWSCustomPage.CreateHandle]');
|
||
{$endif}
|
||
|
||
QtPage := TQtPage.Create(AWinControl, AParams);
|
||
QtPage.AttachEvents;
|
||
|
||
// Returns the Handle
|
||
Result := THandle(QtPage);
|
||
|
||
{$ifdef VerboseQt}
|
||
WriteLn('Trace:< [TQtWSCustomPage.CreateHandle] Result: ', IntToStr(Result));
|
||
{$endif}
|
||
end;
|
||
|
||
class procedure TQtWSCustomPage.UpdateProperties(const ACustomPage: TCustomPage);
|
||
var
|
||
ImageList: TCustomImageList;
|
||
Bmp: TBitmap;
|
||
begin
|
||
ImageList := TCustomNoteBook(ACustomPage.Parent).Images;
|
||
|
||
if Assigned(ImageList) and (ACustomPage.ImageIndex >= 0) and
|
||
(ACustomPage.ImageIndex < ImageList.Count) then
|
||
begin
|
||
Bmp := TBitmap.Create;
|
||
try
|
||
ImageList.GetBitmap(ACustomPage.ImageIndex, Bmp);
|
||
TQtPage(ACustomPage.Handle).setIcon(TQtImage(Bmp.Handle).AsIcon);
|
||
finally
|
||
Bmp.Free;
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
{ TQtWSCustomNotebook }
|
||
|
||
{------------------------------------------------------------------------------
|
||
Method: TQtWSCustomNotebook.CreateHandle
|
||
Params: None
|
||
Returns: Nothing
|
||
|
||
Allocates memory and resources for the control and shows it
|
||
------------------------------------------------------------------------------}
|
||
class function TQtWSCustomNotebook.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): HWND;
|
||
var
|
||
QtTabWidget: TQtTabWidget;
|
||
begin
|
||
{$ifdef VerboseQt}
|
||
WriteLn('TQtWSCustomNotebook.CreateHandle');
|
||
{$endif}
|
||
|
||
QtTabWidget := TQtTabWidget.Create(AWinControl, AParams);
|
||
QtTabWidget.SetTabPosition(QTabWidgetTabPositionMap[TCustomNoteBook(AWinControl).TabPosition]);
|
||
QtTabWidget.AttachEvents;
|
||
|
||
// Returns the Handle
|
||
|
||
Result := THandle(QtTabWidget);
|
||
end;
|
||
|
||
class procedure TQtWSCustomNotebook.AddPage(const ANotebook: TCustomNotebook;
|
||
const AChild: TCustomPage; const AIndex: integer);
|
||
begin
|
||
{$ifdef VerboseQt}
|
||
WriteLn('TQtWSCustomNotebook.AddPage');
|
||
{$endif}
|
||
TQtTabWidget(ANotebook.Handle).insertTab(AIndex, TQtPage(AChild.Handle).Widget,
|
||
GetUtf8String(AChild.Caption));
|
||
TQtWsCustomPage.UpdateProperties(AChild);
|
||
end;
|
||
|
||
class procedure TQtWSCustomNotebook.MovePage(const ANotebook: TCustomNotebook;
|
||
const AChild: TCustomPage; const NewIndex: integer);
|
||
var
|
||
TabWidget: TQtTabWidget;
|
||
AIndex: Integer;
|
||
Page: TQtPage;
|
||
begin
|
||
Page := TQtPage(AChild.Handle);
|
||
TabWidget := TQtTabWidget(ANotebook.Handle);
|
||
AIndex := ANoteBook.IndexOf(AChild);
|
||
TabWidget.setUpdatesEnabled(false);
|
||
TabWidget.removeTab(AIndex);
|
||
TabWidget.insertTab(NewIndex, Page.Widget, Page.getIcon, Page.getText);
|
||
TabWidget.setUpdatesEnabled(true);
|
||
end;
|
||
|
||
class procedure TQtWSCustomNotebook.RemovePage(const ANotebook: TCustomNotebook;
|
||
const AIndex: integer);
|
||
var
|
||
TabWidget: TQtTabWidget;
|
||
begin
|
||
{$ifdef VerboseQt}
|
||
WriteLn('TQtWSCustomNotebook.RemovePage');
|
||
{$endif}
|
||
TabWidget := TQtTabWidget(ANotebook.Handle);
|
||
TabWidget.removeTab(AIndex);
|
||
end;
|
||
|
||
class function TQtWSCustomNotebook.GetTabIndexAtPos(
|
||
const ANotebook: TCustomNotebook; const AClientPos: TPoint): integer;
|
||
var
|
||
TabWidget: TQtTabWidget;
|
||
APoint: TQtPoint;
|
||
{$ifndef USE_QT_4_3}
|
||
w: QWidgetH;
|
||
{$endif}
|
||
begin
|
||
TabWidget := TQtTabWidget(ANotebook.Handle);
|
||
if TabWidget.TabBar <> nil then
|
||
begin
|
||
APoint := QtPoint(AClientPos.x, AClientPos.y);
|
||
{$ifdef USE_QT_4_3}
|
||
Result := QTabBar_tabAt(TabWidget.TabBar, @APoint);
|
||
{$else}
|
||
w := QWidget_childAt(TabWidget.TabBar, @APoint);
|
||
if w <> nil then
|
||
Result := TabWidget.indexOf(w)
|
||
else
|
||
Result := -1;
|
||
{$endif}
|
||
end
|
||
else
|
||
Result := -1;
|
||
end;
|
||
|
||
class procedure TQtWSCustomNotebook.SetPageIndex(
|
||
const ANotebook: TCustomNotebook; const AIndex: integer);
|
||
var
|
||
TabWidget: TQtTabWidget;
|
||
OldIndex: Integer;
|
||
begin
|
||
TabWidget := TQtTabWidget(ANotebook.Handle);
|
||
|
||
// copy pasted from win32wsextctrls with corrections
|
||
|
||
OldIndex := TabWidget.getCurrentIndex;
|
||
TabWidget.setCurrentIndex(AIndex);
|
||
if not (csDestroying in ANotebook.ComponentState) then
|
||
begin
|
||
if (OldIndex >= 0) and (OldIndex <> AIndex) and
|
||
(OldIndex < ANotebook.PageCount) and
|
||
(ANotebook.CustomPage(OldIndex).HandleAllocated) then
|
||
TQtWidget(ANotebook.CustomPage(OldIndex).Handle).setVisible(False);
|
||
end;
|
||
end;
|
||
|
||
class procedure TQtWSCustomNotebook.SetTabCaption(
|
||
const ANotebook: TCustomNotebook; const AChild: TCustomPage;
|
||
const AText: string);
|
||
begin
|
||
TQtTabWidget(ANotebook.Handle).setTabText(ANoteBook.IndexOf(AChild), GetUtf8String(AText));
|
||
end;
|
||
|
||
class procedure TQtWSCustomNotebook.SetTabPosition(
|
||
const ANotebook: TCustomNotebook; const ATabPosition: TTabPosition);
|
||
begin
|
||
TQtTabWidget(ANotebook.Handle).SetTabPosition(QTabWidgetTabPositionMap[ATabPosition]);
|
||
end;
|
||
|
||
class procedure TQtWSCustomNotebook.ShowTabs(const ANotebook: TCustomNotebook;
|
||
AShowTabs: boolean);
|
||
var
|
||
TabWidget: TQtTabWidget;
|
||
begin
|
||
TabWidget := TQtTabWidget(ANotebook.Handle);
|
||
if TabWidget.TabBar <> nil then
|
||
QWidget_setVisible(TabWidget.TabBar, AShowTabs);
|
||
end;
|
||
|
||
{ TQtWSCustomRadioGroup }
|
||
|
||
{------------------------------------------------------------------------------
|
||
Method: TQtWSCustomRadioGroup.CreateHandle
|
||
Params: None
|
||
Returns: Nothing
|
||
|
||
Allocates memory and resources for the control and shows it
|
||
------------------------------------------------------------------------------}
|
||
|
||
class function TQtWSCustomRadioGroup.CreateHandle(const AWinControl: TWinControl;
|
||
const AParams: TCreateParams): TLCLIntfHandle;
|
||
var
|
||
QtGroupBox: TQtGroupBox;
|
||
Str: WideString;
|
||
begin
|
||
QtGroupBox := TQtGroupBox.Create(AWinControl, AParams);
|
||
|
||
Str := GetUtf8String(AWinControl.Caption);
|
||
QGroupBox_setTitle(QGroupBoxH(QtGroupBox.Widget), @Str);
|
||
|
||
QtGroupBox.AttachEvents;
|
||
|
||
Result := THandle(QtGroupBox);
|
||
end;
|
||
|
||
{ TQtWSCustomCheckGroup }
|
||
|
||
{------------------------------------------------------------------------------
|
||
Method: TQtWSCustomCheckGroup.CreateHandle
|
||
Params: None
|
||
Returns: Nothing
|
||
|
||
Allocates memory and resources for the control and shows it
|
||
------------------------------------------------------------------------------}
|
||
class function TQtWSCustomCheckGroup.CreateHandle(const AWinControl: TWinControl;
|
||
const AParams: TCreateParams): TLCLIntfHandle;
|
||
var
|
||
QtGroupBox: TQtGroupBox;
|
||
Str: WideString;
|
||
begin
|
||
QtGroupBox := TQtGroupBox.Create(AWinControl, AParams);
|
||
|
||
Str := GetUtf8String(AWinControl.Caption);
|
||
QGroupBox_setTitle(QGroupBoxH(QtGroupBox.Widget), @Str);
|
||
|
||
QtGroupBox.AttachEvents;
|
||
|
||
Result := THandle(QtGroupBox);
|
||
end;
|
||
|
||
{ TQtWSCustomTrayIcon }
|
||
|
||
class function TQtWSCustomTrayIcon.Hide(const ATrayIcon: TCustomTrayIcon): Boolean;
|
||
var
|
||
SystemTrayIcon: TQtSystemTrayIcon;
|
||
begin
|
||
Result := False;
|
||
|
||
SystemTrayIcon := TQtSystemTrayIcon(ATrayIcon.Handle);
|
||
|
||
SystemTrayIcon.Hide;
|
||
|
||
QIcon_destroy(SystemTrayIcon.IconHandle);
|
||
|
||
SystemTrayIcon.IconHandle := nil;
|
||
|
||
SystemTrayIcon.Free;
|
||
|
||
ATrayIcon.Handle := 0;
|
||
|
||
Result := True;
|
||
end;
|
||
|
||
class function TQtWSCustomTrayIcon.Show(const ATrayIcon: TCustomTrayIcon): Boolean;
|
||
var
|
||
Text: WideString;
|
||
SystemTrayIcon: TQtSystemTrayIcon;
|
||
begin
|
||
Result := False;
|
||
|
||
SystemTrayIcon.IconHandle := TQtSystemTrayIcon.TIconToQIconH(ATrayIcon.Icon);
|
||
|
||
SystemTrayIcon := TQtSystemTrayIcon.Create(SystemTrayIcon.IconHandle);
|
||
|
||
ATrayIcon.Handle := PtrInt(SystemTrayIcon);
|
||
|
||
Text := UTF8Decode(ATrayIcon.Hint);
|
||
SystemTrayIcon.setToolTip(Text);
|
||
|
||
if Assigned(ATrayIcon.PopUpMenu) then
|
||
if TQtMenu(ATrayIcon.PopUpMenu.Handle).Widget <> nil then
|
||
SystemTrayIcon.setContextMenu(QMenuH(TQtMenu(ATrayIcon.PopUpMenu.Handle).Widget));
|
||
|
||
SystemTrayIcon.show;
|
||
|
||
Result := True;
|
||
end;
|
||
|
||
{*******************************************************************
|
||
* TQtWSCustomTrayIcon.InternalUpdate ()
|
||
*
|
||
* DESCRIPTION: Makes modifications to the Icon while running
|
||
* i.e. without hiding it and showing again
|
||
*******************************************************************}
|
||
class procedure TQtWSCustomTrayIcon.InternalUpdate(const ATrayIcon: TCustomTrayIcon);
|
||
var
|
||
SystemTrayIcon: TQtSystemTrayIcon;
|
||
begin
|
||
if (ATrayIcon.Handle = 0) then Exit;
|
||
|
||
SystemTrayIcon := TQtSystemTrayIcon(ATrayIcon.Handle);
|
||
|
||
{ PopUpMenu }
|
||
if Assigned(ATrayIcon.PopUpMenu) then
|
||
if TQtMenu(ATrayIcon.PopUpMenu.Handle).Widget <> nil then
|
||
SystemTrayIcon.setContextMenu(QMenuH(TQtMenu(ATrayIcon.PopUpMenu.Handle).Widget));
|
||
end;
|
||
|
||
class function TQtWSCustomTrayIcon.GetPosition(const ATrayIcon: TCustomTrayIcon): TPoint;
|
||
begin
|
||
Result := Point(0, 0);
|
||
end;
|
||
|
||
initialization
|
||
|
||
////////////////////////////////////////////////////
|
||
// I M P O R T A N T
|
||
////////////////////////////////////////////////////
|
||
// To improve speed, register only classes
|
||
// which actually implement something
|
||
////////////////////////////////////////////////////
|
||
RegisterWSComponent(TCustomPage, TQtWSCustomPage);
|
||
RegisterWSComponent(TCustomNotebook, TQtWSCustomNotebook);
|
||
// RegisterWSComponent(TPage, TQtWSPage);
|
||
// RegisterWSComponent(TNotebook, TQtWSNotebook);
|
||
// RegisterWSComponent(TShape, TQtWSShape);
|
||
// RegisterWSComponent(TCustomSplitter, TQtWSCustomSplitter);
|
||
// RegisterWSComponent(TSplitter, TQtWSSplitter);
|
||
// RegisterWSComponent(TPaintBox, TQtWSPaintBox);
|
||
// RegisterWSComponent(TCustomImage, TQtWSCustomImage);
|
||
// RegisterWSComponent(TImage, TQtWSImage);
|
||
// RegisterWSComponent(TBevel, TQtWSBevel);
|
||
RegisterWSComponent(TCustomRadioGroup, TQtWSCustomRadioGroup);
|
||
// RegisterWSComponent(TRadioGroup, TQtWSRadioGroup);
|
||
RegisterWSComponent(TCustomCheckGroup, TQtWSCustomCheckGroup);
|
||
// RegisterWSComponent(TCheckGroup, TQtWSCheckGroup);
|
||
// RegisterWSComponent(TCustomLabeledEdit, TQtWSCustomLabeledEdit);
|
||
// RegisterWSComponent(TLabeledEdit, TQtWSLabeledEdit);
|
||
RegisterWSComponent(TCustomPanel, TQtWSCustomPanel);
|
||
// RegisterWSComponent(TPanel, TQtWSPanel);
|
||
RegisterWSComponent(TCustomTrayIcon, TQtWSCustomTrayIcon);
|
||
////////////////////////////////////////////////////
|
||
end.
|