Guest User

Untitled

a guest
Sep 2nd, 2018
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Vala 3.32 KB | None | 0 0
  1.  
  2. public class ExtendedMenuItem : Gtk.MenuItem
  3. {
  4.    
  5.     public Gtk.EventBox container;
  6.    
  7.     const string style = "
  8.     * {
  9.         padding: 0px;
  10.         margin: 0px;
  11.         -GtkWidget-focus-padding: 0;
  12.         -GtkMenuItem-horizontal-padding: 0;
  13.         -GtkMenu-vertical-padding: 0px;
  14.         -GtkMenuItem-arrow-scaling: 0.0;
  15.         border-width: 0px;
  16.         background-image: none;
  17.         -unico-border-width: 0px;
  18.         -unico-outer-stroke-width: 0px;
  19.         -unico-inner-stroke-width: 0px;
  20.         -unico-glow-radius: 0;
  21.     }";
  22.    
  23.     public ExMenuItem ()
  24.     {
  25.         container = new Gtk.EventBox ();
  26.         container.margin_right = 12;
  27.        
  28.         var css = new Gtk.CssProvider ();
  29.         try {
  30.             css.load_from_data (style, -1);
  31.         } catch (Error e) { warning (e.message); }
  32.         get_style_context ().add_provider (css, 20000);
  33.        
  34.         add (container);
  35.        
  36.         show_all ();
  37.        
  38.         container.realize.connect (() => {
  39.             var event = new Gdk.Event (Gdk.EventType.FOCUS_CHANGE);
  40.             container.grab_focus ();
  41.            
  42.             event.focus_change.type = Gdk.EventType.FOCUS_CHANGE;
  43.             event.focus_change.window = (Gdk.Window)container.get_window ().ref ();
  44.             event.focus_change.in = 1;
  45.            
  46.             //event.free ();
  47.         });
  48.     }
  49.    
  50.     public override bool button_press_event (Gdk.EventButton event)
  51.     {
  52.        
  53.         if (container.get_window () != null)
  54.             container.get_window ().raise ();
  55.        
  56.         if (!container.has_focus)
  57.             container.grab_focus ();
  58.        
  59.         var new_event = Gdk.EventButton ();
  60.         new_event.type = event.type;
  61.         new_event.window = event.window;
  62.         new_event.send_event = event.send_event;
  63.         new_event.time = event.time;
  64.         new_event.x = event.x;
  65.         new_event.y = event.y;
  66.         new_event.state = event.state;
  67.         new_event.button = event.button;
  68.         new_event.device = event.device;
  69.         new_event.x_root = event.x_root;
  70.         new_event.y_root = event.y_root;
  71.        
  72.         var children = container.get_window ().get_children ();
  73.        
  74.         foreach (var child in children) {
  75.             if (child == null)
  76.                 continue;
  77.            
  78.             new_event.window = child;
  79.            
  80.             int winx, winy;
  81.             child.get_origin (out winx, out winy);
  82.            
  83.             int newx = (int)event.x_root - winx;
  84.             int newy = (int)event.y_root - winy;
  85.            
  86.             if (newx >= 0 && newy >= 0 && newx < child.get_width () && newy < child.get_height ()) {
  87.                 new_event.x = newx;
  88.                 new_event.y = newy;
  89.                
  90.                 container.button_press_event (new_event);
  91.             }
  92.         }
  93.        
  94.         return true;
  95.     }
  96.    
  97.     public override bool button_release_event (Gdk.EventButton e)
  98.     {
  99.         container.button_release_event (e);
  100.         return true;
  101.     }
  102. }
  103.  
  104. public static void main (string [] args)
  105. {
  106.     Gtk.init (ref args);
  107.    
  108.     var w = new Gtk.Window ();
  109.     var e = new Gtk.EventBox ();
  110.     var m = new Gtk.Menu ();
  111.     var i = new ExtendedMenuItem ();
  112.     var b = new Gtk.Box (Gtk.Orientation.VERTICAL, 12);
  113.     var n = new Granite.Widgets.StaticNotebook ();
  114.    
  115.    
  116.     b.pack_start (n);
  117.    
  118.     n.set_size_request (300, 200);
  119.     n.append_page (new Gtk.Image.from_icon_name ("document-export", Gtk.IconSize.DIALOG), new Gtk.Label ("A"));
  120.     n.append_page (new Gtk.Image.from_icon_name ("document-save", Gtk.IconSize.DIALOG), new Gtk.Label ("A"));
  121.     n.append_page (new Gtk.Image.from_icon_name ("document-import", Gtk.IconSize.DIALOG), new Gtk.Label ("A"));
  122.    
  123.     i.container.add (b);
  124.    
  125.     m.add (i);
  126.    
  127.     w.add (e);
  128.    
  129.    
  130.     e.button_press_event.connect ((e) => {
  131.         m.popup (null, null, null, e.button, e.time);
  132.         m.show_all ();
  133.         return true;
  134.     });
  135.    
  136.     w.show_all ();
  137.    
  138.     Gtk.main ();
  139. }
Add Comment
Please, Sign In to add comment