build: use Gtk.MenuButton
Change internal implementation of MenuButton for the one in Gtk+
This commit is contained in:
parent
ec01bcd957
commit
20f63e64e6
3 changed files with 3 additions and 188 deletions
|
@ -33,7 +33,6 @@ vala_sources = \
|
||||||
contacts-list-pane.vala \
|
contacts-list-pane.vala \
|
||||||
contacts-linked-accounts-dialog.vala \
|
contacts-linked-accounts-dialog.vala \
|
||||||
contacts-linking.vala \
|
contacts-linking.vala \
|
||||||
contacts-menu-button.vala \
|
|
||||||
contacts-row.vala \
|
contacts-row.vala \
|
||||||
contacts-store.vala \
|
contacts-store.vala \
|
||||||
contacts-view.vala \
|
contacts-view.vala \
|
||||||
|
|
|
@ -1,185 +0,0 @@
|
||||||
/* -*- Mode: vala; indent-tabs-mode: t; c-basic-offset: 2; tab-width: 8 -*- */
|
|
||||||
/*
|
|
||||||
* Copyright (C) 2011 Alexander Larsson <alexl@redhat.com>
|
|
||||||
*
|
|
||||||
* 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -120,13 +120,14 @@ public class Contacts.NewContactDialog : Dialog {
|
||||||
|
|
||||||
pack_spacing (16, ref y);
|
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);
|
grid.attach (menu_button, 0, y, 2, 1);
|
||||||
menu_button.set_hexpand (false);
|
menu_button.set_hexpand (false);
|
||||||
menu_button.set_halign (Align.START);
|
menu_button.set_halign (Align.START);
|
||||||
|
|
||||||
var menu = new Gtk.Menu ();
|
var menu = new Gtk.Menu ();
|
||||||
menu_button.set_menu (menu);
|
menu_button.set_popup (menu);
|
||||||
|
|
||||||
Utils.add_menu_item (menu, _("Email")).activate.connect ( () => {
|
Utils.add_menu_item (menu, _("Email")).activate.connect ( () => {
|
||||||
int row = row_after (email_entries.get (email_entries.size - 1));
|
int row = row_after (email_entries.get (email_entries.size - 1));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue