From 20f63e64e6836a879a58d803e8fd0bde1de1d340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erick=20P=C3=A9rez=20Castellanos?= Date: Sat, 31 Aug 2013 00:45:37 -0400 Subject: [PATCH] build: use Gtk.MenuButton Change internal implementation of MenuButton for the one in Gtk+ --- src/Makefile.am | 1 - src/contacts-menu-button.vala | 185 --------------------------- src/contacts-new-contact-dialog.vala | 5 +- 3 files changed, 3 insertions(+), 188 deletions(-) delete mode 100644 src/contacts-menu-button.vala diff --git a/src/Makefile.am b/src/Makefile.am index be2699b..e99343f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -33,7 +33,6 @@ vala_sources = \ contacts-list-pane.vala \ contacts-linked-accounts-dialog.vala \ contacts-linking.vala \ - contacts-menu-button.vala \ contacts-row.vala \ contacts-store.vala \ contacts-view.vala \ diff --git a/src/contacts-menu-button.vala b/src/contacts-menu-button.vala deleted file mode 100644 index 393cd27..0000000 --- a/src/contacts-menu-button.vala +++ /dev/null @@ -1,185 +0,0 @@ -/* -*- Mode: vala; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 8 -*- */ -/* - * Copyright (C) 2011 Alexander Larsson - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using Gtk; - -public class Contacts.MenuButton : ToggleButton { - Gtk.Menu? menu; - bool popup_in_progress; - - public MenuButton (string label) { - set_focus_on_click (false); - - var label_widget = new Label (label); - var arrow = new Arrow (ArrowType.DOWN, ShadowType.NONE); - var grid = new Grid (); - grid.set_orientation (Orientation.HORIZONTAL); - grid.add (label_widget); - grid.add (arrow); - grid.set_column_spacing (3); - grid.set_hexpand (true); - grid.set_halign (Align.CENTER); - this.add (grid); - } - - ~MenuButton () { - set_menu (null); - } - - public signal void popup (); - - private void menu_position (Gtk.Menu menu, out int x, out int y, out bool push_in) { - Allocation allocation; - get_allocation (out allocation); - - int sx = 0; - int sy = 0; - - if (!get_has_window ()) { - sx += allocation.x; - sy += allocation.y; - } - - get_window ().get_root_coords (sx, sy, out sx, out sy); - - Requisition menu_req; - Gdk.Rectangle monitor; - - menu.get_preferred_size (null, out menu_req); - - if (get_direction () == TextDirection.LTR) - x = sx; - else - x = sx + allocation.width - menu_req.width; - y = sy; - - var window = get_window (); - var screen = get_screen (); - var monitor_num = screen.get_monitor_at_window (window); - if (monitor_num < 0) - monitor_num = 0; - screen.get_monitor_geometry (monitor_num, out monitor); - - if (x < monitor.x) - x = monitor.x; - else if (x + menu_req.width > monitor.x + monitor.width) - x = monitor.x + monitor.width - menu_req.width; - - if (monitor.y + monitor.height - y - allocation.height >= menu_req.height) - y += allocation.height; - else if (y - monitor.y >= menu_req.height) - y -= menu_req.height; - else if (monitor.y + monitor.height - y - allocation.height > y - monitor.y) - y += allocation.height; - else - y -= menu_req.height; - - menu.set_monitor (monitor_num); - - Window? toplevel = menu.get_parent() as Window; - if (toplevel != null && !toplevel.get_visible()) - toplevel.set_type_hint (Gdk.WindowTypeHint.DROPDOWN_MENU); - - push_in = false; - } - - public override void toggled () { - var context = get_style_context (); - if (get_active ()) { - if (!popup_in_progress) { - this.popup (); - menu.popup (null, null, menu_position, 1, Gtk.get_current_event_time ()); - } - context.add_class (STYLE_CLASS_MENUBAR); - context.add_class (STYLE_CLASS_MENUITEM); - } else { - context.remove_class (STYLE_CLASS_MENUBAR); - context.remove_class (STYLE_CLASS_MENUITEM); - menu.popdown (); - } - reset_style (); - } - - public override bool button_press_event (Gdk.EventButton event) { - var ewidget = Gtk.get_event_widget ((Gdk.Event)(&event)); - - if (ewidget != this || - get_active ()) - return false; - - this.popup (); - menu.popup (null, null, menu_position, 1, Gtk.get_current_event_time ()); - set_active (true); - popup_in_progress = true; - return true; - } - - public override bool button_release_event (Gdk.EventButton event) { - bool popup_in_progress_saved = popup_in_progress; - popup_in_progress = false; - - var ewidget = Gtk.get_event_widget ((Gdk.Event)(&event)); - - if (ewidget == this && - !popup_in_progress_saved && - get_active ()) { - menu.popdown (); - return true; - } - if (ewidget != this) { - menu.popdown (); - return true; - } - return false; - } - - private void menu_show (Widget menu) { - popup_in_progress = true; - set_active (true); - popup_in_progress = false; - } - - private void menu_hide (Widget menu) { - set_active (false); - } - - private void menu_detach (Gtk.Menu menu) { - } - - public void set_menu (Gtk.Menu? menu) { - if (this.menu != null) { - this.menu.show.disconnect (menu_show); - this.menu.hide.disconnect (menu_hide); - this.menu.detach (); - } - - this.menu = menu; - - if (this.menu != null) { - this.menu.show.connect (menu_show); - this.menu.hide.connect (menu_hide); - this.menu.attach_to_widget (this, menu_detach); - } - } - - public override bool draw (Cairo.Context cr) { - base.draw (cr); - return false; - } - -} diff --git a/src/contacts-new-contact-dialog.vala b/src/contacts-new-contact-dialog.vala index db604ab..c660843 100644 --- a/src/contacts-new-contact-dialog.vala +++ b/src/contacts-new-contact-dialog.vala @@ -120,13 +120,14 @@ public class Contacts.NewContactDialog : Dialog { pack_spacing (16, ref y); - var menu_button = new MenuButton (_("Add Detail")); + var menu_button = new MenuButton (); + menu_button.set_label (_("Add Detail")); grid.attach (menu_button, 0, y, 2, 1); menu_button.set_hexpand (false); menu_button.set_halign (Align.START); var menu = new Gtk.Menu (); - menu_button.set_menu (menu); + menu_button.set_popup (menu); Utils.add_menu_item (menu, _("Email")).activate.connect ( () => { int row = row_after (email_entries.get (email_entries.size - 1));