unit ButtonWidget;
interface
implementation
uses glib2, gdk2pixbuf, gdk2, gtk2, ButtonWidgetHeader in
'/home/yarik/Desktop/Zhuzhculator' +
'/Prog/Units/ButtonWidgetUnit/ButtonWidgetHeader.pp';
procedure gtk_button_widget_class_init(class : PGtkButtonWidgetClass);
procedure gtk_button_widget_init(button_widget : PGtkButtonWidget);
procedure move_cursor(widget : PGtkWidget; event : PGdkEventCrossing;
user_data : gpointer);
procedure click_cursor(widget : PGtkWidget; event : PGdkEventButton;
user_data : gpointer);
type
signals = (CLICK_BUTTON_SIGNAL, LAST_SIGNAL);
SigArr = array[CLICK_BUTTON_SIGNAL..LAST_SIGNAL] of guint;
var
date_type : GType = 0;
date_info : TGTypeInfo;
parent_class : PGtkWidgetClass = nil;
button_widget_signals : SigArr;
hand_cursor : PGdkCursor = nil;
GTK_BUTTON_WIDGET_NORMAL : gint = 0;
GTK_BUTTON_WIDGET_ACTIVE : gint = 1;
procedure button_widget_signals_init();
begin
button_widget_signals[LAST_SIGNAL] := 0;
end;
procedure init_date_info();
begin
date_info.class_size := SizeOf(TGtkButtonWidgetClass);
date_info.base_init := nil;
date_info.base_finalize := nil;
date_info.class_init := TGClassInitFunc (@gtk_button_widget_class_init);
date_info.class_finalize := nil;
date_info.class_data := nil;
date_info.instance_size := SizeOf(TGtkButtonWidget);
date_info.n_preallocs := 0;
date_info.instance_init := TGInstanceInitFunc (@gtk_button_widget_init);
end;
function gtk_button_get_type() : GType;
begin
if (date_type = 0) then
begin
init_date_info();
date_type := g_type_register_static(
GTK_TYPE_EVENT_BOX, 'GtkButtonWidget', @date_info, 0
);
end;
gtk_button_get_type := date_type;
end;
procedure gtk_button_widget_class_init(class : PGtkButtonWidgetClass);
var
widget_class : PGtkWidgetClass;
begin
widget_class := GTK_WIDGET_CLASS(class);
parent_class := g_type_class_peek_parent(class);
class^.click_button := nil;
button_widget_signals[CLICK_BUTTON_SIGNAL] :=
g_signal_new(
'click_button',
G_OBJECT_CLASS_TYPE(G_OBJECT_CLASS(class)),
G_SIGNAL_RUN_FIRST,
@class^.click_button - pointer(class),
nil,
nil,
@g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE,
0);
end;
procedure gtk_button_widget_init(button_widget : PGtkButtonWidget);
begin
button_widget^.state := GTK_BUTTON_WIDGET_NORMAL;
button_widget^.color := nil;
button_widget^.clicked := false;
gtk_widget_set_events (GTK_WIDGET(button_widget), GDK_ENTER_NOTIFY_MASK
or GDK_LEAVE_NOTIFY_MASK);
g_signal_connect (G_OBJECT(button_widget), 'button-press-event',
G_CALLBACK(@click_cursor), nil);
g_signal_connect (G_OBJECT(button_widget), 'enter-notify-event',
G_CALLBACK(@move_cursor), nil);
g_signal_connect (G_OBJECT(button_widget), 'leave-notify-event',
G_CALLBACK(@move_cursor), nil);
end;
procedure move_cursor(widget : PGtkWidget; event : PGdkEventCrossing;
user_data : gpointer);
begin
if (event^._type = GDK_ENTER_NOTIFY) then
begin
if (hand_cursor = nil) then
begin
hand_cursor := gdk_cursor_new(GDK_HAND2);
gdk_window_set_cursor(widget^.window, hand_cursor)
end;
GTK_BUTTON_WIDGET(widget)^.state := GTK_BUTTON_WIDGET_ACTIVE;
end;
if (event^._type = GDK_LEAVE_NOTIFY) then
GTK_BUTTON_WIDGET(widget)^.state := GTK_BUTTON_WIDGET_NORMAL;
end;
procedure click_cursor(widget : PGtkWidget; event : PGdkEventButton;
user_data : gpointer);
begin
if (event^._type = GDK_BUTTON_PRESS) then
g_signal_emit(GTK_BUTTON_WIDGET(widget),
button_widget_signals[CLICK_BUTTON_SIGNAL], 0)
end;
function gtk_button_widget_new() : PGtkWidget;
var
w : PGtkWidget;
begin
w := GTK_WIDGET(g_object_new(GTK_TYPE_BUTTON_WIDGET, nil));
gtk_button_widget_new := w;
end;
end.