gtk, gtk2: destroy internal labelWidget of TBitBtn if Caption is empty for better layouting

git-svn-id: trunk@20876 -
This commit is contained in:
paul 2009-07-17 14:36:46 +00:00
parent d23ecb2d45
commit 73afc18adf
2 changed files with 74 additions and 56 deletions

View File

@ -232,11 +232,24 @@ begin
WidgetInfo := GetWidgetInfo(Pointer(AWinControl.Handle)); WidgetInfo := GetWidgetInfo(Pointer(AWinControl.Handle));
BitBtnInfo := WidgetInfo^.UserData; BitBtnInfo := WidgetInfo^.UserData;
if BitBtnInfo^.LabelWidget = nil then Exit;
//debugln('TGtkWSBitBtn.SetText ',DbgStr(AText)); if AText = '' then
begin
gtk_container_remove(BitBtnInfo^.TableWidget, BitBtnInfo^.LabelWidget);
BitBtnInfo^.LabelWidget := nil;
end
else
begin
if BitBtnInfo^.LabelWidget = nil then
begin
BitBtnInfo^.LabelWidget := gtk_label_new(nil);
gtk_widget_show(BitBtnInfo^.LabelWidget);
end;
GtkWidgetSet.SetLabelCaption(BitBtnInfo^.LabelWidget, AText GtkWidgetSet.SetLabelCaption(BitBtnInfo^.LabelWidget, AText
{$IFDEF Gtk1},AWinControl,WidgetInfo^.CoreWidget, 'clicked'{$ENDIF}); {$IFDEF Gtk1},AWinControl,WidgetInfo^.CoreWidget, 'clicked'{$ENDIF});
end;
UpdateLayout(BitBtnInfo, TBitBtn(AWincontrol).Layout, TBitBtn(AWincontrol).Margin); UpdateLayout(BitBtnInfo, TBitBtn(AWincontrol).Layout, TBitBtn(AWincontrol).Margin);
end; end;
@ -340,81 +353,86 @@ end;
class procedure TGtkWSBitBtn.UpdateLayout(const AInfo: PBitBtnWidgetInfo; class procedure TGtkWSBitBtn.UpdateLayout(const AInfo: PBitBtnWidgetInfo;
const ALayout: TButtonLayout; const AMargin: Integer); const ALayout: TButtonLayout; const AMargin: Integer);
begin begin
if (AInfo^.ImageWidget = nil) if (AInfo^.ImageWidget = nil) and (AMargin < 0) then Exit; // nothing to do
and (AMargin < 0)
then exit; // nothing to do
// add references and remove it from the table // add references and remove it from the table
if AInfo^.LabelWidget <> nil then
begin
gtk_object_ref(AInfo^.LabelWidget); gtk_object_ref(AInfo^.LabelWidget);
if PGtkWidget(AInfo^.LabelWidget)^.Parent <> nil then
gtk_container_remove(AInfo^.TableWidget, AInfo^.LabelWidget); gtk_container_remove(AInfo^.TableWidget, AInfo^.LabelWidget);
if AInfo^.ImageWidget <> nil
then begin
gtk_object_ref(AInfo^.ImageWidget);
if PGtkWidget(AInfo^.ImageWidget)^.Parent <> nil
then gtk_container_remove(AInfo^.TableWidget, AInfo^.ImageWidget);
end; end;
if AInfo^.SpaceWidget <> nil if AInfo^.ImageWidget <> nil then
then begin begin
gtk_object_ref(AInfo^.ImageWidget);
if PGtkWidget(AInfo^.ImageWidget)^.Parent <> nil then
gtk_container_remove(AInfo^.TableWidget, AInfo^.ImageWidget);
end;
if AInfo^.SpaceWidget <> nil then
begin
gtk_object_ref(AInfo^.SpaceWidget); gtk_object_ref(AInfo^.SpaceWidget);
if PGtkWidget(AInfo^.SpaceWidget)^.Parent <> nil if PGtkWidget(AInfo^.SpaceWidget)^.Parent <> nil then
then gtk_container_remove(AInfo^.TableWidget, AInfo^.SpaceWidget); gtk_container_remove(AInfo^.TableWidget, AInfo^.SpaceWidget);
end; end;
if ((AInfo^.LabelWidget = nil) or (PGtkLabel(AInfo^.LabelWidget)^.{$ifdef gtk1}thelabel{$else}text{$endif} = '')) if ((AInfo^.LabelWidget = nil) or (PGtkLabel(AInfo^.LabelWidget)^.{$ifdef gtk1}thelabel{$else}text{$endif} = '')) and
and (AInfo^.ImageWidget <> nil) (AInfo^.ImageWidget <> nil) then
then begin begin
gtk_table_attach(AInfo^.TableWidget, AInfo^.ImageWidget, gtk_table_attach(AInfo^.TableWidget, AInfo^.ImageWidget,
1, 3, 1, 3, GTK_EXPAND, GTK_EXPAND, 0, 0); 0, 3, 0, 3, GTK_EXPAND or GTK_FILL, GTK_EXPAND or GTK_FILL, 0, 0);
gtk_table_attach(AInfo^.TableWidget, AInfo^.LabelWidget,
0, 1, 0, 1, GTK_SHRINK, GTK_SHRINK, 0, 0);
end end
else else
case ALayout of case ALayout of
blGlyphLeft: begin blGlyphLeft:
if AInfo^.ImageWidget <> nil begin
then gtk_table_attach(AInfo^.TableWidget, AInfo^.ImageWidget, if AInfo^.ImageWidget <> nil then
gtk_table_attach(AInfo^.TableWidget, AInfo^.ImageWidget,
1, 2, 1, 3, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0); 1, 2, 1, 3, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0);
gtk_table_attach(AInfo^.TableWidget, AInfo^.LabelWidget, gtk_table_attach(AInfo^.TableWidget, AInfo^.LabelWidget,
2, 3, 1, 3, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0); 2, 3, 1, 3, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0);
end; end;
blGlyphRight: begin blGlyphRight:
begin
gtk_table_attach(AInfo^.TableWidget, AInfo^.LabelWidget, gtk_table_attach(AInfo^.TableWidget, AInfo^.LabelWidget,
1, 2, 1, 3, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0); 1, 2, 1, 3, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0);
if AInfo^.ImageWidget <> nil if AInfo^.ImageWidget <> nil then
then gtk_table_attach(AInfo^.TableWidget, AInfo^.ImageWidget, gtk_table_attach(AInfo^.TableWidget, AInfo^.ImageWidget,
2, 3, 1, 3, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0); 2, 3, 1, 3, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0);
if AInfo^.SpaceWidget <> nil if AInfo^.SpaceWidget <> nil then
then gtk_table_attach(AInfo^.TableWidget, AInfo^.SpaceWidget, gtk_table_attach(AInfo^.TableWidget, AInfo^.SpaceWidget,
3, 4, 1, 3, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0); 3, 4, 1, 3, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0);
end; end;
blGlyphTop: begin blGlyphTop:
if AInfo^.ImageWidget <> nil begin
then gtk_table_attach(AInfo^.TableWidget, AInfo^.ImageWidget, if AInfo^.ImageWidget <> nil then
gtk_table_attach(AInfo^.TableWidget, AInfo^.ImageWidget,
1, 3, 1, 2, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0); 1, 3, 1, 2, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0);
gtk_table_attach(AInfo^.TableWidget, AInfo^.LabelWidget, gtk_table_attach(AInfo^.TableWidget, AInfo^.LabelWidget,
1, 3, 2, 3, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0); 1, 3, 2, 3, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0);
end; end;
blGlyphBottom: begin blGlyphBottom:
begin
gtk_table_attach(AInfo^.TableWidget, AInfo^.LabelWidget, gtk_table_attach(AInfo^.TableWidget, AInfo^.LabelWidget,
1, 3, 1, 2, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0); 1, 3, 1, 2, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0);
if AInfo^.ImageWidget <> nil if AInfo^.ImageWidget <> nil then
then gtk_table_attach(AInfo^.TableWidget, AInfo^.ImageWidget, gtk_table_attach(AInfo^.TableWidget, AInfo^.ImageWidget,
1, 3, 2, 3, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0); 1, 3, 2, 3, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0);
if AInfo^.SpaceWidget <> nil if AInfo^.SpaceWidget <> nil then
then gtk_table_attach(AInfo^.TableWidget, AInfo^.SpaceWidget, gtk_table_attach(AInfo^.TableWidget, AInfo^.SpaceWidget,
1, 3, 3, 4, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0); 1, 3, 3, 4, GTK_SHRINK or GTK_FILL, GTK_SHRINK or GTK_FILL, 0, 0);
end; end;
end; end;
// remove temp reference // remove temp reference
if AInfo^.SpaceWidget <> nil if AInfo^.SpaceWidget <> nil then
then gtk_object_unref(AInfo^.SpaceWidget); gtk_object_unref(AInfo^.SpaceWidget);
if AInfo^.ImageWidget <> nil if AInfo^.ImageWidget <> nil then
then gtk_object_unref(AInfo^.ImageWidget); gtk_object_unref(AInfo^.ImageWidget);
if AInfo^.LabelWidget <> nil then
gtk_object_unref(AInfo^.LabelWidget); gtk_object_unref(AInfo^.LabelWidget);
if AMargin >= 0 if AMargin >= 0 then
then UpdateMargin(AInfo, ALayout, AMargin) UpdateMargin(AInfo, ALayout, AMargin)
end; end;
class procedure TGtkWSBitBtn.UpdateMargin(const AInfo: PBitBtnWidgetInfo; class procedure TGtkWSBitBtn.UpdateMargin(const AInfo: PBitBtnWidgetInfo;

View File

@ -500,10 +500,10 @@ begin
Exit; Exit;
//DebugLn('TGtkWSWinControl.SetColor ',DbgSName(AWinControl)); //DebugLn('TGtkWSWinControl.SetColor ',DbgSName(AWinControl));
GtkWidgetSet.SetWidgetColor(pGtkWidget(AWinControl.handle), GtkWidgetSet.SetWidgetColor(PGtkWidget(AWinControl.Handle),
AWinControl.Font.Color, AWinControl.Color, AWinControl.Font.Color, AWinControl.Color,
[GTK_STATE_NORMAL,GTK_STATE_ACTIVE, [GTK_STATE_NORMAL, GTK_STATE_ACTIVE,
GTK_STATE_PRELIGHT,GTK_STATE_SELECTED]); GTK_STATE_PRELIGHT, GTK_STATE_SELECTED]);
// GtkWidgetSet.setWidgetFont(pGtkWidget(AWinControl.handle),aWinControl.font); // GtkWidgetSet.setWidgetFont(pGtkWidget(AWinControl.handle),aWinControl.font);
UpdateWidgetStyleOfControl(AWinControl); UpdateWidgetStyleOfControl(AWinControl);
end; end;