Re: Problem with EventBox enter/leave_notify_event and Buttons
- From: Bill Czermak <czermak netspace net au>
- To: gtk-app-devel-list gnome org
- Subject: Re: Problem with EventBox enter/leave_notify_event and Buttons
- Date: Wed, 27 Jul 2011 07:43:58 +1000
A few comments.
Is the problem with gtk or the vala wrappers?
Setup a simple test with just a single eventbox in vala.
If you still have the problem then recode in C.
Check that after processing the callback on the button, it returns
true/false to stop the callback being passed to the parent.
Rgds Bill
On 27/07/11 05:07, Valentín wrote:
Hello!!
I have a problem with enter_notify_event and leave_notify_event. Let me
explain:
I have an VBox with 5 EventBox widgets, and inside each EventBox I have a
HBox with one Label and 2 Buttons. I connect the signals enter_notify_event
and leave_notify_event of each of the EventBox widgets to a callback and
everything seems to work well: If you move the mouse pointer vertically
between EventBox widgets you can see the events --I print a message from
those mentioned callbacks, and I also modify the Labels making their text
bold on enter_notify_event and normal on leave_notify_event.
But If you move the mouse pointer horizontally --within the same EventBox--
you'll also get enter/leave_notify_events, and this shouldn't happen since
the mouse pointer is always inside the EventBox. More precisely, you'll get
a leave_notify_event when moving the pointer to a button (although the
button is a child of the EventBox) and the corresponding enter_notify_event
when going back from the button's area to another area also inside the
EventBox.
I can solve this by setting above-child propriety of the EventBox to TRUE,
but this way I can't click the buttons :S
Below you can see an example written in Vala --if for some reason you don't
like Vala, I could rewrite it in C... I did it in Vala because it is
quicker.
How could I solve this situation?
private const int CONTROL_SPACING = 8;
private const int FRAME_BORDER = 6;
public class TestWidget : Gtk.HBox {
public Gtk.Button edit_button;
public Gtk.Button delete_button;
public Gtk.Label label;
private Pango.AttrList attrs_bold;
private Pango.AttrList attrs_normal;
public TestWidget (string name) {
homogeneous = true;
spacing = CONTROL_SPACING;
attrs_bold = new Pango.AttrList();
attrs_bold.insert(Pango.attr_weight_new(Pango.Weight.BOLD));
attrs_normal = new Pango.AttrList();
attrs_normal.insert(Pango.attr_weight_new(Pango.Weight.NORMAL));
edit_button = new Gtk.Button.from_stock(Gtk.Stock.EDIT);
delete_button = new Gtk.Button.from_stock(Gtk.Stock.DELETE);
label = new Gtk.Label(name);
label.set_alignment(0f, 0.5f);
add(label);
add(edit_button);
add(delete_button);
}
public bool on_enter_notify_event() {
label.set_attributes(attrs_bold);
stdout.printf("enter_notify_event\n");
return true;
}
public bool on_leave_notify_event() {
label.set_attributes(attrs_normal);
stdout.printf("leave_notify_event\n");
return true;
}
}
public class TestWindow : Gtk.Window {
private Gtk.VBox widgets_layout = null;
private Gtk.VBox layout = null;
public TestWindow() {
widgets_layout = new Gtk.VBox(false, CONTROL_SPACING);
widgets_layout.set_border_width(FRAME_BORDER);
layout = new Gtk.VBox(false, CONTROL_SPACING);
layout.pack_start(widgets_layout, false);
add(layout);
}
public void add_widget(TestWidget widget) {
widget.edit_button.clicked.connect(edit_working);
widget.delete_button.clicked.connect(delete_working);
Gtk.EventBox event_box = new Gtk.EventBox();
//~ event_box.set_above_child(true);
event_box.add_events(Gdk.EventMask.ENTER_NOTIFY_MASK |
Gdk.EventMask.LEAVE_NOTIFY_MASK);
event_box.add(widget);
event_box.enter_notify_event.connect(widget.on_enter_notify_event);
event_box.leave_notify_event.connect(widget.on_leave_notify_event);
widgets_layout.pack_start(event_box, false);
widgets_layout.show_all();
}
public void edit_working() {
stdout.printf("Edit button is working\n");
}
public void delete_working() {
stdout.printf("Delete button is working\n");
}
}
public class Test : Object {
public static int main(string[] args) {
Gtk.init(ref args);
TestWindow window = new TestWindow();
window.title = "enter/leave_notify_event test";
window.destroy.connect(Gtk.main_quit);
window.add_widget(new TestWidget("Test 01"));
window.add_widget(new TestWidget("Test 02"));
window.add_widget(new TestWidget("Test 03"));
window.add_widget(new TestWidget("Test 04"));
window.add_widget(new TestWidget("Test 05"));
window.show_all();
Gtk.main();
return 0;
}
}
You can compile it using
valac ./test.vala --pkg=gtk+-2.0
or
valac ./test.vala --pkg=gtk+-3.0
Thanks a lot for your time.
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list gnome org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]