Mattias Gaertner wrote:
On Tue, 17 Jan 2006 11:45:56 +0100
Mattias Gaertner <[EMAIL PROTECTED]> wrote:
[...]
Set color background and front don't work for tForms, tEdit and tLabel
And TListBox.
In fact, setting TListBox.Color changes all, but the TListBox color.
It seems the patch changes the current widget style, which is used by
several widgets. It should create a new style and apply that.
Will you fix that Darek, or should I reverse the patch?
Mattias
New patch to setColor
now it works for tButton and tBitBtn and don't change default style
Darek
Index: interfaces/gtk/gtkproc.inc
===================================================================
--- interfaces/gtk/gtkproc.inc (wersja 8579)
+++ interfaces/gtk/gtkproc.inc (kopia robocza)
@@ -6550,6 +6550,11 @@
Returns the associated string
------------------------------------------------------------------------------}
+
+
+
+
+
function GdkAtomToStr(const Atom: TGdkAtom): string;
var
p: Pgchar;
@@ -7610,23 +7615,7 @@
else begin
Widget := MainWidget;
end;
- // writeln('update ',longint(Widget),' color
',longint(aWinControl.Color),DbgSName(AWinControl));
- if (AWinControl.Color<>clNone) then begin
- if (csOpaque in AWinControl.ControlStyle)
- and GtkWidgetIsA(MainWidget,GTKAPIWidget_GetType) then exit;
-
- if AWinControl.ColorIsStored
- and ((AWinControl.Color and SYS_COLOR_BASE)=0) then begin
- DebugLn('UpdateWidgetStyleOfControl ',DbgSName(AWinControl),'
Color=',dbgs(AWinControl.Color));
- setWidgetBG(AWinControl.Color,Widget);
- end;
- end;
- if (AWinControl.Font.Color and SYS_COLOR_BASE)=0 then begin
- DebugLn('UpdateWidgetStyleOfControl ',DbgSName(AWinControl),'
Font.Color=',dbgs(AWinControl.Font.Color));
- setWidgetFG(AWinControl.Font.Color,Widget);
- end;
-
RCStyle:=nil;
FreeFontName:=false;
FreeFontSetName:=false;
@@ -7680,8 +7669,9 @@
// set font color
// set font (currently only TCustomLabel)
- if GtkWidgetIsA(Widget,gtk_label_get_type)
+ if (GtkWidgetIsA(Widget,gtk_label_get_type)
or GtkWidgetIsA(Widget,gtk_editable_get_type)
+ or GtkWidgetIsA(Widget,gtk_check_button_get_type))
and ((AWinControl.Font.Name<>DefFontData.Name)
or (AWinControl.Font.Size<>0)
or (AWinControl.Font.Style<>[]))
Index: interfaces/gtk/gtkdef.pp
===================================================================
--- interfaces/gtk/gtkdef.pp (wersja 8579)
+++ interfaces/gtk/gtkdef.pp (kopia robocza)
@@ -220,9 +220,11 @@
TWidgetInfoFlag = (
wwiNotOnParentsClientArea
);
TWidgetInfoFlags = set of TWidgetInfoFlag;
+ tGtkStateEnum = set of byte;
// Info needed by the API of a HWND (=Widget)
PWidgetInfo = ^TWidgetInfo;
Index: interfaces/gtk/gtkcallback.inc
===================================================================
--- interfaces/gtk/gtkcallback.inc (wersja 8579)
+++ interfaces/gtk/gtkcallback.inc (kopia robocza)
@@ -232,7 +232,7 @@
TheWinControl.CNPreferredSizeChanged;
SetCursor(TheWinControl, crDefault);
ConnectInternalWidgetsSignals(MainWidget,TheWinControl);
- UpdateWidgetStyleOfControl(TheWinControl);
+// UpdateWidgetStyleOfControl(TheWinControl);
if TheWinControl is TCustomPage then
UpdateNotebookPageTab(nil,TheWinControl);
Index: interfaces/gtk/gtkobject.inc
===================================================================
--- interfaces/gtk/gtkobject.inc (wersja 8579)
+++ interfaces/gtk/gtkobject.inc (kopia robocza)
@@ -1315,7 +1315,43 @@
else Accelerate(AComponent, ASignalWidget, Ord(AccelKey), 0, ASignal);
end;
+procedure TGtkWidgetSet.SetWidgetColor(const AWidget : PGtkWidget;const
FGColor,BGColor : longint; const Mask : tGtkStateEnum);
+var
+ WindowStyle: PGtkStyle;
+ RCStyle : PGtkRCStyle;
+ i : integer;
+ xfg,
+ xbg : TGDKColor;
+begin
+ if (GTK_WIDGET_REALIZED(AWidget)) then begin
+ WindowStyle := gtk_style_copy(gtk_widget_get_style (AWidget));
+ end else begin
+ WindowStyle := gtk_style_copy(gtk_rc_get_style (AWidget));
+ end ;
+ if (Windowstyle = nil) then begin
+ Windowstyle := gtk_style_new ;
+ end;
+
+ xfg:=AllocGDKColor(colorToRGB(FGColor));
+ xbg:=AllocGDKColor(colorToRGB(BGColor));
+ writeln('setwidget ',longint(colorToRGB(FGColor)),'
',longint(colorToRGB(BGColor)));
+ for i := 0 to 4 do begin
+ if i in mask then begin
+ if (FGCOlor<>clNone) then begin
+ windowStyle^.fg[i]:=xfg;
+ end;
+ if (BGCOlor<>clNone) then begin
+ windowStyle^.bg[i]:=xbg;
+ end;
+ end;
+ end;
+ gtk_widget_set_style(aWidget,windowStyle);
+end;
+
+
+
+
{------------------------------------------------------------------------------
procedure TGtkWidgetSet.RealizeWidgetSize(Widget: PGtkWidget; NewWidth,
NewHeight: integer);
Index: interfaces/gtk/gtkwsbuttons.pp
===================================================================
--- interfaces/gtk/gtkwsbuttons.pp (wersja 8579)
+++ interfaces/gtk/gtkwsbuttons.pp (kopia robocza)
@@ -80,6 +80,8 @@
class procedure SetMargin(const ABitBtn: TCustomBitBtn; const AValue:
Integer); override;
class procedure SetSpacing(const ABitBtn: TCustomBitBtn; const AValue:
Integer); override;
class procedure SetText(const AWinControl: TWinControl; const AText:
String); override;
+ class procedure SetColor(const AWinControl: TWinControl); override;
+
end;
{ TGtkWSSpeedButton }
@@ -136,6 +138,8 @@
SetCallbacks(PGtkWidget(Result), WidgetInfo);
end;
+
+
procedure TGtkWSButton.ActiveDefaultButtonChanged(const AButton:
TCustomButton);
begin
if (AButton.Active)
@@ -199,6 +203,7 @@
GtkWidgetSet.SetLabelCaption(LblWidget, AText, AWinControl,
PGtkWidget(BtnWidget), 'clicked');
end;
+
procedure TGtkWSButton.GetPreferredSize(const AWinControl: TWinControl;
var PreferredWidth, PreferredHeight: integer);
begin
@@ -369,6 +374,30 @@
WidgetInfo^.CoreWidget, 'clicked');
end;
+
+procedure TGtkWSBitBtn.SetColor(const AWinControl: TWinControl);
+var
+ WidgetInfo: PWidgetInfo;
+ BitBtnInfo: PBitBtnWidgetInfo;
+ Widget, FixWidget : PGTKWidget;
+
+
+
+begin
+ Widget:= PGtkWidget(AWinControl.Handle);
+ WidgetInfo := GetWidgetInfo(Widget);
+ BitBtnInfo := WidgetInfo^.UserData;
+ GtkWidgetSet.SetWidgetColor(Widget, AWinControl.font.color,
AWinControl.color,[GTK_STATE_NORMAL,GTK_STATE_ACTIVE,GTK_STATE_PRELIGHT,GTK_STATE_SELECTED]);
+
+
+ if BitBtnInfo^.LabelWidget = nil then Exit;
+ GtkWidgetSet.SetWidgetColor(BitBtnInfo^.LabelWidget, AWinControl.font.color,
AWinControl.color,[GTK_STATE_NORMAL,GTK_STATE_ACTIVE,GTK_STATE_PRELIGHT,GTK_STATE_SELECTED]);
+
+
+
+end;
+
+
procedure TGtkWSBitBtn.UpdateLayout(const AInfo: PBitBtnWidgetInfo;
const ALayout: TButtonLayout; const AMargin: Integer);
begin
Index: interfaces/gtk/gtkwscontrols.pp
===================================================================
--- interfaces/gtk/gtkwscontrols.pp (wersja 8579)
+++ interfaces/gtk/gtkwscontrols.pp (kopia robocza)
@@ -426,6 +426,13 @@
procedure TGtkWSWinControl.SetColor(const AWinControl: TWinControl);
begin
+ if ((csOpaque in AWinControl.ControlStyle)and
GtkWidgetIsA(pGtkWidget(AWinControl.handle),GTKAPIWidget_GetType)) then exit;
+ GtkWidgetSet.SetWidgetColor(pGtkWidget(AWinControl.handle),
AWinControl.font.color,
AWinControl.color,[GTK_STATE_NORMAL,GTK_STATE_ACTIVE,GTK_STATE_PRELIGHT,GTK_STATE_SELECTED]);
UpdateWidgetStyleOfControl(AWinControl);
end;
Index: interfaces/gtk/gtkint.pp
===================================================================
--- interfaces/gtk/gtkint.pp (wersja 8579)
+++ interfaces/gtk/gtkint.pp (kopia robocza)
@@ -252,6 +252,7 @@
public
// for gtk specific components:
procedure SetLabelCaption(const ALabel: PGtkLabel; const ACaption: String;
const AComponent: TComponent; const ASignalWidget: PGTKWidget; const ASignal:
PChar); virtual;
+ procedure SetWidgetColor(const AWidget : PGtkWidget;const FGColor,BGColor
: longint; const Mask : tGtkStateEnum);
procedure SetCallback(const AMsg: LongInt; const AGTKObject: PGTKObject;
const ALCLObject: TObject); virtual;
procedure SendPaintMessagesForInternalWidgets(AWinControl: TWinControl);
function LCLtoGtkMessagePending: boolean;virtual;