mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-05 21:18:27 +02:00
LCL, gtk/qt, fix scrollbar issues in customcontrols generated since r31447 #ab611393ae, from August Klein, issue #14728
git-svn-id: trunk@31483 -
This commit is contained in:
parent
9926bd8fa2
commit
3e230c04f9
@ -2664,18 +2664,17 @@ function Gtk2RangeScrollCB(ARange: PGtkRange; AScrollType: TGtkScrollType;
|
|||||||
var
|
var
|
||||||
Msg: TLMVScroll;
|
Msg: TLMVScroll;
|
||||||
MaxValue: gdouble;
|
MaxValue: gdouble;
|
||||||
State: PByte;
|
Widget: PGTKWidget;
|
||||||
begin
|
begin
|
||||||
Result := CallBackDefaultReturn;
|
Result := CallBackDefaultReturn;
|
||||||
|
|
||||||
|
Widget:=PGTKWidget(ARange);
|
||||||
//DebugLn(Format('Trace:[Gtk2RangeScrollCB] Value: %d', [RoundToInt(AValue)]));
|
//DebugLn(Format('Trace:[Gtk2RangeScrollCB] Value: %d', [RoundToInt(AValue)]));
|
||||||
if G_OBJECT_TYPE(ARange) = gtk_hscrollbar_get_type then
|
if G_OBJECT_TYPE(ARange) = gtk_hscrollbar_get_type then
|
||||||
Msg.Msg := LM_HSCROLL
|
Msg.Msg := LM_HSCROLL
|
||||||
else
|
else
|
||||||
Msg.Msg := LM_VSCROLL;
|
Msg.Msg := LM_VSCROLL;
|
||||||
|
|
||||||
if (AWidgetInfo^.LCLObject is TScrollingWinControl) then
|
|
||||||
begin
|
|
||||||
if ARange^.adjustment^.page_size > 0 then
|
if ARange^.adjustment^.page_size > 0 then
|
||||||
MaxValue := ARange^.adjustment^.upper - ARange^.adjustment^.page_size
|
MaxValue := ARange^.adjustment^.upper - ARange^.adjustment^.page_size
|
||||||
else
|
else
|
||||||
@ -2685,7 +2684,6 @@ begin
|
|||||||
Result := not Result;
|
Result := not Result;
|
||||||
AValue := MaxValue;
|
AValue := MaxValue;
|
||||||
end;
|
end;
|
||||||
end;
|
|
||||||
|
|
||||||
with Msg do
|
with Msg do
|
||||||
begin
|
begin
|
||||||
@ -2698,16 +2696,11 @@ begin
|
|||||||
ScrollBar := HWND(PtrUInt(ARange));
|
ScrollBar := HWND(PtrUInt(ARange));
|
||||||
ScrollCode := GtkScrollTypeToScrollCode(AScrollType);
|
ScrollCode := GtkScrollTypeToScrollCode(AScrollType);
|
||||||
end;
|
end;
|
||||||
Result := DeliverMessage(AWidgetInfo^.LCLObject, Msg) <> 0;
|
DeliverMessage(AWidgetInfo^.LCLObject, Msg);
|
||||||
|
|
||||||
if not Result or not (AWidgetInfo^.LCLObject is TScrollBar) or
|
|
||||||
not Assigned(AWidgetInfo^.UserData) then exit;
|
|
||||||
|
|
||||||
State:=AWidgetInfo^.UserData;
|
|
||||||
|
|
||||||
if Msg.Scrollcode=SB_THUMBTRACK then
|
if Msg.Scrollcode=SB_THUMBTRACK then
|
||||||
begin
|
begin
|
||||||
if State^ = 0 then
|
if Widget^.state = 0 then
|
||||||
begin
|
begin
|
||||||
Msg.ScrollCode := SB_THUMBPOSITION;
|
Msg.ScrollCode := SB_THUMBPOSITION;
|
||||||
DeliverMessage(AWidgetInfo^.LCLObject, Msg);
|
DeliverMessage(AWidgetInfo^.LCLObject, Msg);
|
||||||
@ -2715,22 +2708,14 @@ begin
|
|||||||
DeliverMessage(AWidgetInfo^.LCLObject, Msg);
|
DeliverMessage(AWidgetInfo^.LCLObject, Msg);
|
||||||
end;
|
end;
|
||||||
end
|
end
|
||||||
else State^:=1;
|
else Widget^.state := 1;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function Gtk2RangeScrollPressCB(Widget: PGtkWidget;
|
function Gtk2RangeScrollPressCB(Widget: PGtkWidget;
|
||||||
Event: PGdkEventButton; Data: gPointer): gboolean; cdecl;
|
Event: PGdkEventButton; Data: gPointer): gboolean; cdecl;
|
||||||
var
|
|
||||||
State: PByte;
|
|
||||||
WidgetInfo: PWidgetInfo;
|
|
||||||
begin
|
begin
|
||||||
WidgetInfo:=GetWidgetInfo(Widget, false);
|
Widget^.state := 2;
|
||||||
if Assigned(WidgetInfo^.UserData) then
|
Result := CallBackDefaultReturn;;
|
||||||
begin
|
|
||||||
State:=WidgetInfo^.UserData;
|
|
||||||
State^:=2;
|
|
||||||
end;
|
|
||||||
Result:=False;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function Gtk2RangeScrollReleaseCB(Widget: PGtkWidget;
|
function Gtk2RangeScrollReleaseCB(Widget: PGtkWidget;
|
||||||
@ -2738,17 +2723,15 @@ function Gtk2RangeScrollReleaseCB(Widget: PGtkWidget;
|
|||||||
var
|
var
|
||||||
Avalue: gdouble;
|
Avalue: gdouble;
|
||||||
WidgetInfo: PWidgetInfo;
|
WidgetInfo: PWidgetInfo;
|
||||||
State: PByte;
|
|
||||||
begin
|
begin
|
||||||
AValue:=PGtkRange(Widget)^.adjustment^.value;
|
AValue:=PGtkRange(Widget)^.adjustment^.value;
|
||||||
WidgetInfo:=GetWidgetInfo(Widget, false);
|
WidgetInfo:=GetWidgetInfo(Widget, False);
|
||||||
If Assigned(WidgetInfo^.UserData) then
|
if not Assigned(WidgetInfo) then
|
||||||
begin
|
WidgetInfo:=GetWidgetInfo(Widget^.parent, False);
|
||||||
State:=WidgetInfo^.UserData;
|
if Assigned(WidgetInfo) and (Widget^.state = 1) then
|
||||||
if State^=1 then Gtk2RangeScrollCB(PGtkRange(Widget), 0, AValue, WidgetInfo);
|
Gtk2RangeScrollCB(PGtkRange(Widget), 0, AValue, WidgetInfo);
|
||||||
State^:=0;
|
Widget^.state := 0;
|
||||||
end;
|
Result := CallBackDefaultReturn;
|
||||||
Result:=False;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function Gtk2ScrolledWindowScrollCB(AScrollWindow: PGtkScrolledWindow; AEvent: PGdkEventScroll; AWidgetInfo: PWidgetInfo): gboolean; cdecl;
|
function Gtk2ScrolledWindowScrollCB(AScrollWindow: PGtkScrolledWindow; AEvent: PGdkEventScroll; AWidgetInfo: PWidgetInfo): gboolean; cdecl;
|
||||||
|
@ -190,6 +190,14 @@ begin
|
|||||||
TGCallback(@Gtk2RangeScrollCB), WidgetInfo);
|
TGCallback(@Gtk2RangeScrollCB), WidgetInfo);
|
||||||
g_signal_connect(GTK_SCROLLED_WINDOW(Widget)^.vscrollbar, 'change-value',
|
g_signal_connect(GTK_SCROLLED_WINDOW(Widget)^.vscrollbar, 'change-value',
|
||||||
TGCallback(@Gtk2RangeScrollCB), WidgetInfo);
|
TGCallback(@Gtk2RangeScrollCB), WidgetInfo);
|
||||||
|
g_signal_connect(GTK_SCROLLED_WINDOW(Widget)^.hscrollbar, 'button-press-event',
|
||||||
|
TGCallback(@Gtk2RangeScrollPressCB), WidgetInfo);
|
||||||
|
g_signal_connect(GTK_SCROLLED_WINDOW(Widget)^.hscrollbar, 'button-release-event',
|
||||||
|
TGCallback(@Gtk2RangeScrollReleaseCB), WidgetInfo);
|
||||||
|
g_signal_connect(GTK_SCROLLED_WINDOW(Widget)^.vscrollbar, 'button-press-event',
|
||||||
|
TGCallback(@Gtk2RangeScrollPressCB), WidgetInfo);
|
||||||
|
g_signal_connect(GTK_SCROLLED_WINDOW(Widget)^.vscrollbar, 'button-release-event',
|
||||||
|
TGCallback(@Gtk2RangeScrollReleaseCB), WidgetInfo);
|
||||||
|
|
||||||
g_signal_connect(Widget, 'scroll-event', TGCallback(@Gtk2ScrolledWindowScrollCB), WidgetInfo);
|
g_signal_connect(Widget, 'scroll-event', TGCallback(@Gtk2ScrolledWindowScrollCB), WidgetInfo);
|
||||||
end;
|
end;
|
||||||
|
@ -2442,7 +2442,6 @@ var
|
|||||||
Adjustment: PGtkAdjustment = nil;
|
Adjustment: PGtkAdjustment = nil;
|
||||||
Widget: PGtkWidget;
|
Widget: PGtkWidget;
|
||||||
WidgetInfo: PWidgetInfo;
|
WidgetInfo: PWidgetInfo;
|
||||||
State: PByte;
|
|
||||||
begin
|
begin
|
||||||
with TScrollBar(AWinControl) do
|
with TScrollBar(AWinControl) do
|
||||||
begin
|
begin
|
||||||
@ -2464,11 +2463,6 @@ begin
|
|||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
WidgetInfo := CreateWidgetInfo(Pointer(Result), AWinControl, AParams);
|
WidgetInfo := CreateWidgetInfo(Pointer(Result), AWinControl, AParams);
|
||||||
|
|
||||||
WidgetInfo^.DataOwner:=True;
|
|
||||||
State:=New(PByte);
|
|
||||||
WidgetInfo^.UserData:=State;
|
|
||||||
State^:=0;
|
|
||||||
|
|
||||||
Set_RC_Name(AWinControl, Widget);
|
Set_RC_Name(AWinControl, Widget);
|
||||||
SetCallbacks(Widget, WidgetInfo);
|
SetCallbacks(Widget, WidgetInfo);
|
||||||
end;
|
end;
|
||||||
|
@ -6208,7 +6208,7 @@ begin
|
|||||||
LMScroll.Pos := p1;
|
LMScroll.Pos := p1;
|
||||||
LMScroll.ScrollCode := SIF_POS;
|
LMScroll.ScrollCode := SIF_POS;
|
||||||
|
|
||||||
if not InUpdate then
|
if not InUpdate and not getTracking then
|
||||||
DeliverMessage(LMScroll);
|
DeliverMessage(LMScroll);
|
||||||
|
|
||||||
b := p1 = getMax;
|
b := p1 = getMax;
|
||||||
|
Loading…
Reference in New Issue
Block a user