mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-07-30 03:36:15 +02:00
157 lines
5.8 KiB
ObjectPascal
157 lines
5.8 KiB
ObjectPascal
{ $Id$}
|
|
{
|
|
*****************************************************************************
|
|
* GtkWSSpin.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 GtkWSSpin;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
{$IFDEF gtk2}
|
|
glib2, gdk2pixbuf, gdk2, gtk2, Pango,
|
|
{$ELSE}
|
|
glib, gdk, gtk,
|
|
{$ENDIF}
|
|
LCLProc, Spin, GtkProc, gtkExtra, GtkWSStdCtrls, WSSpin, WSLCLClasses, LCLType;
|
|
|
|
type
|
|
|
|
{ TGtkWSCustomFloatSpinEdit }
|
|
|
|
TGtkWSCustomFloatSpinEdit = class(TWSCustomFloatSpinEdit)
|
|
private
|
|
protected
|
|
public
|
|
class function GetSelStart(const ACustomFloatSpinEdit: TCustomFloatSpinEdit): integer; override;
|
|
class function GetSelLength(const ACustomFloatSpinEdit: TCustomFloatSpinEdit): integer; override;
|
|
class function GetValue(const ACustomFloatSpinEdit: TCustomFloatSpinEdit): single; override;
|
|
|
|
class procedure SetSelStart(const ACustomFloatSpinEdit: TCustomFloatSpinEdit; NewStart: integer); override;
|
|
class procedure SetSelLength(const ACustomFloatSpinEdit: TCustomFloatSpinEdit; NewLength: integer); override;
|
|
|
|
class procedure UpdateControl(const ACustomFloatSpinEdit: TCustomFloatSpinEdit); override;
|
|
end;
|
|
|
|
function GetGtkSpinEntry(Spin: PGtkSpinButton): PGtkEntry;
|
|
function GetSpinGtkEntry(Spin: TCustomFloatSpinEdit): PGtkEntry;
|
|
function GetGtkFloatSpinEditable(Spin: PGtkSpinButton): PGtkOldEditable;
|
|
function GetSpinGtkEditable(Spin: TCustomFloatSpinEdit): PGtkOldEditable;
|
|
|
|
implementation
|
|
|
|
function GetGtkSpinEntry(Spin: PGtkSpinButton): PGtkEntry;
|
|
begin
|
|
Result:=PGtkEntry(@(Spin^.entry));
|
|
end;
|
|
|
|
function GetSpinGtkEntry(Spin: TCustomFloatSpinEdit): PGtkEntry;
|
|
begin
|
|
Result:=GetGtkSpinEntry(PGtkSpinButton(Spin.Handle));
|
|
end;
|
|
|
|
function GetGtkFloatSpinEditable(Spin: PGtkSpinButton): PGtkOldEditable;
|
|
begin
|
|
Result:=PGtkOldEditable(@(Spin^.entry));
|
|
end;
|
|
|
|
function GetSpinGtkEditable(Spin: TCustomFloatSpinEdit): PGtkOldEditable;
|
|
begin
|
|
Result:=GetGtkFloatSpinEditable(PGtkSpinButton(Spin.Handle));
|
|
end;
|
|
|
|
{ TGtkWSCustomFloatSpinEdit }
|
|
|
|
//const
|
|
// GtkValueEmpty: array[boolean] of integer = (0,1);
|
|
|
|
class function TGtkWSCustomFloatSpinEdit.GetSelStart(
|
|
const ACustomFloatSpinEdit: TCustomFloatSpinEdit
|
|
): integer;
|
|
begin
|
|
Result :=
|
|
WidgetGetSelStart(PGtkWidget(GetSpinGtkEntry(ACustomFloatSpinEdit)));
|
|
end;
|
|
|
|
class function TGtkWSCustomFloatSpinEdit.GetSelLength(
|
|
const ACustomFloatSpinEdit: TCustomFloatSpinEdit): integer;
|
|
begin
|
|
with GetSpinGtkEditable(ACustomFloatSpinEdit)^ do
|
|
Result := Abs(integer(selection_end_pos)-integer(selection_start_pos));
|
|
end;
|
|
|
|
class function TGtkWSCustomFloatSpinEdit.GetValue(
|
|
const ACustomFloatSpinEdit: TCustomFloatSpinEdit): single;
|
|
begin
|
|
Result:=gtk_spin_button_get_value_as_float(
|
|
PGtkSpinButton(ACustomFloatSpinEdit.Handle));
|
|
end;
|
|
|
|
class procedure TGtkWSCustomFloatSpinEdit.SetSelStart(
|
|
const ACustomFloatSpinEdit: TCustomFloatSpinEdit; NewStart: integer);
|
|
begin
|
|
gtk_editable_set_position(GetSpinGtkEditable(ACustomFloatSpinEdit), NewStart);
|
|
end;
|
|
|
|
class procedure TGtkWSCustomFloatSpinEdit.SetSelLength(
|
|
const ACustomFloatSpinEdit: TCustomFloatSpinEdit; NewLength: integer);
|
|
begin
|
|
WidgetSetSelLength(PGtkWidget(GetSpinGtkEntry(ACustomFloatSpinEdit)),
|
|
NewLength);
|
|
end;
|
|
|
|
class procedure TGtkWSCustomFloatSpinEdit.UpdateControl(
|
|
const ACustomFloatSpinEdit: TCustomFloatSpinEdit);
|
|
var
|
|
AnAdjustment: PGtkAdjustment;
|
|
wHandle: HWND;
|
|
SpinWidget: PGtkSpinButton;
|
|
begin
|
|
//DebugLn(['TGtkWSCustomFloatSpinEdit.UpdateControl ',dbgsName(ACustomFloatSpinEdit)]);
|
|
wHandle := ACustomFloatSpinEdit.Handle;
|
|
SpinWidget:=GTK_SPIN_BUTTON(Pointer(wHandle));
|
|
AnAdjustment:=gtk_spin_button_get_adjustment(SpinWidget);
|
|
if (AnAdjustment^.lower<>ACustomFloatSpinEdit.MinValue)
|
|
or (AnAdjustment^.upper<>ACustomFloatSpinEdit.MaxValue) then
|
|
begin
|
|
AnAdjustment^.lower:=ACustomFloatSpinEdit.MinValue;
|
|
AnAdjustment^.upper:=ACustomFloatSpinEdit.MaxValue;
|
|
gtk_adjustment_changed(AnAdjustment);
|
|
end;
|
|
gtk_spin_button_set_digits(SpinWidget, ACustomFloatSpinEdit.DecimalPlaces);
|
|
gtk_spin_button_set_value(SpinWidget,ACustomFloatSpinEdit.Value);
|
|
AnAdjustment^.step_increment := ACustomFloatSpinEdit.Increment;
|
|
end;
|
|
|
|
initialization
|
|
|
|
////////////////////////////////////////////////////
|
|
// I M P O R T A N T
|
|
////////////////////////////////////////////////////
|
|
// To improve speed, register only classes
|
|
// which actually implement something
|
|
////////////////////////////////////////////////////
|
|
RegisterWSComponent(TCustomFloatSpinEdit, TGtkWSCustomFloatSpinEdit);
|
|
// RegisterWSComponent(TFloatSpinEdit, TGtkWSFloatSpinEdit);
|
|
////////////////////////////////////////////////////
|
|
end.
|