mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-18 17:39:22 +02:00
* Fixed scrolling for TScrollbox in GTK (gtklayout based controls)
git-svn-id: trunk@7734 -
This commit is contained in:
parent
904520640b
commit
1eb012c515
@ -8164,23 +8164,39 @@ const
|
||||
POLICY: array[BOOLEAN] of TGTKPolicyType = (GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
|
||||
var
|
||||
Adjustment: PGtkAdjustment;
|
||||
Layout: PgtkLayout;
|
||||
Scroll: PGTKWidget;
|
||||
NewPolicy: Integer;
|
||||
i: Integer;
|
||||
IsScrollWindow: Boolean;
|
||||
begin
|
||||
Result := 0;
|
||||
if (Handle = 0) then exit;
|
||||
|
||||
//DebugLn('TGtkWidgetSet.SetScrollInfo A Widget=',GetWidgetClassName(PGtkWidget(Handle)));
|
||||
|
||||
Adjustment := nil;
|
||||
Scroll := GTK_Object_Get_Data(PGTKObject(Handle), odnScrollArea);
|
||||
If not GtkWidgetIsA(PGtkWidget(Scroll),gtk_scrolled_window_get_type) then
|
||||
Scroll := gtk_object_get_data(PGTKObject(Handle), odnScrollArea);
|
||||
if GtkWidgetIsA(Scroll, gtk_scrolled_window_get_type)
|
||||
then begin
|
||||
IsScrollWindow := True;
|
||||
end
|
||||
else begin
|
||||
Scroll := PGTKWidget(Handle);
|
||||
IsScrollWindow := GtkWidgetIsA(Scroll, gtk_scrolled_window_get_type);
|
||||
end;
|
||||
|
||||
if IsScrollWindow
|
||||
then begin
|
||||
Layout := GetFixedWidget(PGTKObject(Handle));
|
||||
if not GtkWidgetIsA(PGtkWidget(Layout), gtk_layout_get_type)
|
||||
then Layout := nil;
|
||||
end
|
||||
else begin
|
||||
Layout := nil;
|
||||
end;
|
||||
|
||||
|
||||
// scrollbar update policy
|
||||
if (Scrollinfo.fmask and SIF_UPDATEPOLICY <> 0) then begin
|
||||
if GtkWidgetIsA(PGtkWidget(Scroll),gtk_scrolled_window_get_type) then
|
||||
if IsScrollWindow then
|
||||
SetScrolledWindowUpdatePolicy(PGTKScrolledWindow(Scroll))
|
||||
else if GtkWidgetIsA(PgtkWidget(Scroll), gtk_clist_get_type) then
|
||||
SetScrolledWindowUpdatePolicy(PGTKScrolledWindow(@PgtkCList(Scroll)^.container))
|
||||
@ -8196,50 +8212,66 @@ begin
|
||||
Adjustment:=nil;
|
||||
case SBStyle of
|
||||
SB_HORZ:
|
||||
If GtkWidgetIsA(PGtkWidget(Scroll),gtk_scrolled_window_get_type) then
|
||||
Adjustment := gtk_scrolled_window_get_hadjustment(
|
||||
PGTKScrolledWindow(Scroll))
|
||||
if IsScrollWindow
|
||||
then begin
|
||||
Adjustment := gtk_scrolled_window_get_hadjustment(PGTKScrolledWindow(Scroll));
|
||||
if Layout <> nil
|
||||
then gtk_layout_set_size(Layout, ScrollInfo.nMax - ScrollInfo.nMin, Layout^.height);
|
||||
end
|
||||
// obsolete stuff
|
||||
else if GtkWidgetIsA(PGtkWidget(Scroll),gtk_hscrollbar_get_type)
|
||||
then begin
|
||||
// this one shouldn't be possible, scrolbar messages are sent to the CTL
|
||||
DebugLN('!!! direct SB_HORZ call to scrollbar');
|
||||
Adjustment := PgtkhScrollBar(Scroll)^.Scrollbar.Range.Adjustment
|
||||
end
|
||||
else
|
||||
if GtkWidgetIsA(PGtkWidget(Scroll),gtk_clist_get_type)
|
||||
then begin
|
||||
//clist
|
||||
DebugLn('[SetScrollInfo] Obsolete use of CList ???');
|
||||
Adjustment := gtk_clist_get_hadjustment(PgtkCList(Scroll));
|
||||
end;
|
||||
|
||||
SB_VERT:
|
||||
If IsScrollWindow
|
||||
then begin
|
||||
Adjustment := gtk_scrolled_window_get_vadjustment(PGTKScrolledWindow(Scroll));
|
||||
if Layout <> nil
|
||||
then gtk_layout_set_size(Layout, Layout^.Width, ScrollInfo.nMax - ScrollInfo.nMin);
|
||||
end
|
||||
// obsolete stuff
|
||||
else if GtkWidgetIsA(PGtkWidget(Scroll),gtk_vscrollbar_get_type)
|
||||
then begin
|
||||
// this one shouldn't be possible, scrolbar messages are sent to the CTL
|
||||
DebugLN('!!! direct SB_VERT call to scrollbar');
|
||||
Adjustment := PgtkvScrollBar(Scroll)^.Scrollbar.Range.Adjustment;
|
||||
end
|
||||
else if GtkWidgetIsA(PGtkWidget(Scroll), gtk_clist_get_type)
|
||||
then begin
|
||||
//clist
|
||||
DebugLn('[SetScrollInfo] Obsolete use of CList ???');
|
||||
Adjustment := gtk_clist_get_vadjustment(PgtkCList(Scroll));
|
||||
end;
|
||||
|
||||
SB_CTL:
|
||||
if GtkWidgetIsA(PGtkWidget(Scroll),gtk_vscrollbar_get_type) then
|
||||
Adjustment := PgtkvScrollBar(Scroll)^.Scrollbar.Range.Adjustment
|
||||
else
|
||||
if GtkWidgetIsA(PGtkWidget(Scroll),gtk_hscrollbar_get_type) then
|
||||
Adjustment := PgtkhScrollBar(Scroll)^.Scrollbar.Range.Adjustment
|
||||
else //clist
|
||||
if GtkWidgetIsA(PGtkWidget(Scroll),gtk_clist_get_type) then
|
||||
Adjustment := gtk_clist_get_hadjustment(PgtkCList(Scroll));
|
||||
|
||||
SB_VERT:
|
||||
If GtkWidgetIsA(PGtkWidget(Scroll),gtk_scrolled_window_get_type) then
|
||||
Adjustment := gtk_scrolled_window_get_vadjustment(
|
||||
PGTKScrolledWindow(Scroll))
|
||||
else
|
||||
if GtkWidgetIsA(PGtkWidget(Scroll),gtk_vscrollbar_get_type) then
|
||||
Adjustment := PgtkvScrollBar(Scroll)^.Scrollbar.Range.Adjustment
|
||||
else //clist
|
||||
if GtkWidgetIsA(PGtkWidget(Scroll), gtk_clist_get_type) then
|
||||
Adjustment := gtk_clist_get_vadjustment(PgtkCList(Scroll));
|
||||
|
||||
SB_CTL:
|
||||
if GtkWidgetIsA(PGtkWidget(Scroll), gtk_range_get_type) then
|
||||
Adjustment := gtk_range_get_adjustment(PGTKRange(Scroll));
|
||||
|
||||
SB_BOTH:
|
||||
DebugLn('[SetScrollInfo] Got SB_BOTH ???');
|
||||
end;
|
||||
|
||||
if Adjustment = nil then exit;
|
||||
|
||||
with ScrollInfo, Adjustment^ do begin
|
||||
//DebugLn('SetScrollInfo Value=',Value);
|
||||
// workaround for strange floating point bug
|
||||
for i:=0 to 2 do begin
|
||||
try
|
||||
Result := RoundToInt(Value);
|
||||
break;
|
||||
except
|
||||
on e: Exception do begin
|
||||
DebugLn('TGtkWidgetSet.SetScrollInfo Workaround for ',E.Message,' try: ',dbgs(i));
|
||||
Result:=0;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
//DebugLn('SetScrollInfo Result=',Result);
|
||||
Result := Round(Value);
|
||||
|
||||
if (fMask and SIF_POS) <> 0
|
||||
then Value := nPos;
|
||||
if (fMask and SIF_RANGE) <> 0
|
||||
@ -8263,37 +8295,33 @@ begin
|
||||
' Handle=',DbgS(Handle));}
|
||||
|
||||
// do we have to set this always ?
|
||||
// ??? what is this for code ????
|
||||
// why not change adjustment if we don't do a redraw ???
|
||||
if bRedraw then
|
||||
begin
|
||||
if GtkWidgetIsA(PGtkWidget(Scroll),gtk_scrolled_window_get_type) then
|
||||
begin
|
||||
if SBStyle in [SB_BOTH, SB_HORZ] then begin
|
||||
NewPolicy:=POLICY[bRedraw];
|
||||
gtk_object_set(PGTKObject(Scroll),'hscrollbar_policy',[NewPolicy,nil]);
|
||||
end;
|
||||
if SBStyle in [SB_BOTH, SB_VERT] then begin
|
||||
NewPolicy:=POLICY[bRedraw];
|
||||
gtk_object_set(PGTKObject(Scroll),'vscrollbar_policy',[NewPolicy,nil]);
|
||||
if IsScrollWindow
|
||||
then begin
|
||||
case SBStyle of
|
||||
SB_HORZ: gtk_object_set(PGTKObject(Scroll),'hscrollbar_policy',[POLICY[bRedraw],nil]);
|
||||
SB_VERT: gtk_object_set(PGTKObject(Scroll),'vscrollbar_policy',[POLICY[bRedraw],nil]);
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
else begin
|
||||
if (SBSTYLE = SB_CTL)
|
||||
and GtkWidgetIsA(PGtkWidget(Scroll),gtk_widget_get_type) then
|
||||
gtk_widget_show(PGTKWidget(Scroll))
|
||||
else
|
||||
gtk_widget_hide(PGTKWidget(Scroll))
|
||||
end;
|
||||
{DebugLn('');
|
||||
DebugLn('TGtkWidgetSet.SetScrollInfo: ',
|
||||
' lower=',RoundToInt(lower),'/',nMin,
|
||||
' upper=',RoundToInt(upper),'/',nMax,
|
||||
' value=',RoundToInt(value),'/',nPos,
|
||||
' step_increment=',RoundToInt(step_increment),'/',1,
|
||||
' page_increment=',RoundToInt(page_increment),'/',nPage,
|
||||
' page_size=',RoundToInt(page_size),'/',nPage,
|
||||
'');}
|
||||
|
||||
(*
|
||||
DebugLn('TGtkWidgetSet.SetScrollInfo:' +
|
||||
' lower=%d/%d upper=%d/%d value=%d/%d' +
|
||||
' step_increment=%d/1 page_increment=%d/%d page_size=%d/%d', [
|
||||
Round(lower),nMin, Round(upper),nMax, Round(value),nPos,
|
||||
Round(step_increment), Round(page_increment),nPage, Round(page_size),nPage]
|
||||
);
|
||||
*)
|
||||
gtk_adjustment_changed(Adjustment);
|
||||
end;
|
||||
end;
|
||||
|
@ -683,7 +683,7 @@ const
|
||||
SB_Horz = 0;
|
||||
SB_Vert = 1;
|
||||
SB_CTL = 2;
|
||||
SB_BOTH = 3;
|
||||
SB_BOTH = 3; //What would this do ??? it is not a used winapi constant
|
||||
|
||||
{Scroll Bar Commands}
|
||||
SB_LINEUP = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user