Advertisement
Guest User

Untitled

a guest
Jan 1st, 2013
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Vala 5.59 KB | None | 0 0
  1. public class FancyWindow : Gtk.Window
  2. {
  3.     Gtk.Box container;
  4.     Gtk.Toolbar toolbar;
  5.     Gtk.ToolItem label;
  6.  
  7.     const int HEIGHT = 48;
  8.     const int ICON_SIZE = Gtk.IconSize.LARGE_TOOLBAR;
  9.     const string CSS = """
  10.         .title {
  11.             color: #666;
  12.             text-shadow: 0px 1px 0px white;
  13.         }
  14.         .toolbar {
  15.             padding: 0px;
  16.             box-shadow: inset 0px 1px 0px rgba(255,255,255,0.3);
  17.         }
  18.     """;
  19.     Gtk.CssProvider css;
  20.  
  21.     Gtk.Label _title;
  22.     public new string title {
  23.         get {
  24.             return _title.label;
  25.         }
  26.         set {
  27.             _title.label = value;
  28.         }
  29.     }
  30.  
  31.     public FancyWindow ()
  32.     {
  33.         css = new Gtk.CssProvider ();
  34.         try {
  35.             css.load_from_data (CSS, -1);
  36.         } catch (Error e) { warning (e.message); }
  37.  
  38.         toolbar = new Gtk.Toolbar ();
  39.         toolbar.icon_size = ICON_SIZE;
  40.         toolbar.get_style_context ().add_class ("primary-toolbar");
  41.         toolbar.get_style_context ().add_provider (css, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
  42.         container = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);
  43.         container.margin = 1;
  44.         container.pack_start (toolbar, false);
  45.  
  46.         var close = new Gtk.ToolButton (new Gtk.Image.from_file ("/usr/share/themes/elementary/metacity-1/close.svg"), "Close");
  47.         close.height_request = HEIGHT;
  48.         close.width_request = HEIGHT;
  49.         close.clicked.connect (() => destroy ());
  50.  
  51.         var maximize = new Gtk.ToolButton (new Gtk.Image.from_file ("/usr/share/themes/elementary/metacity-1/maximize.svg"), "Close");
  52.         maximize.height_request = HEIGHT;
  53.         maximize.width_request = HEIGHT;
  54.         maximize.clicked.connect (() => this.maximize ());
  55.  
  56.         _title = new Gtk.Label ("");
  57.         _title.override_font (Pango.FontDescription.from_string ("bold"));
  58.         label = new Gtk.ToolItem ();
  59.         label.add (_title);
  60.         label.set_expand (true);
  61.         label.get_style_context ().add_class ("title");
  62.         label.get_style_context ().add_provider (css, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
  63.  
  64.         toolbar.insert (close, -1);
  65.         toolbar.insert (create_separator (), -1);
  66.         toolbar.insert (label, -1);
  67.         toolbar.insert (create_separator (), -1);
  68.         toolbar.insert (maximize, -1);
  69.  
  70.         draw.connect_after ((cr) => {
  71.             Granite.Drawing.Utilities.cairo_rounded_rectangle (cr, 0, 0, get_allocated_width (), get_allocated_height (), 8);
  72.             cr.set_source_rgba (0, 0, 0, 0.7);
  73.             cr.set_line_width (1);
  74.             cr.stroke ();
  75.             return false;
  76.         });
  77.  
  78.         base.add (container);
  79.     }
  80.  
  81.     public override bool configure_event (Gdk.EventConfigure event)
  82.     {
  83.         if (get_window () != null)
  84.             get_window ().shape_combine_region (get_window_shape (event.width, event.height, 8), 0, 0);
  85.  
  86.         return false;
  87.     }
  88.  
  89.     public Gtk.ToolItem create_separator ()
  90.     {
  91.         var sep = new Gtk.ToolItem ();
  92.         sep.height_request = HEIGHT;
  93.         sep.width_request = 1;
  94.         sep.draw.connect ((cr) => {
  95.             cr.move_to (0, 0);
  96.             cr.line_to (0, 60);
  97.             cr.set_line_width (1);
  98.             var grad = new Cairo.Pattern.linear (0, 0, 0, HEIGHT);
  99.             grad.add_color_stop_rgba (0, 0.3, 0.3, 0.3, 0.4);
  100.             grad.add_color_stop_rgba (0.8, 0, 0, 0, 0);
  101.             cr.set_source (grad);
  102.             cr.stroke ();
  103.             return true;
  104.         });
  105.         sep.get_style_context ().add_class ("sep");
  106.         sep.get_style_context ().add_provider (css, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
  107.  
  108.         return sep;
  109.     }
  110.  
  111.     public override void add (Gtk.Widget widget)
  112.     {
  113.         container.pack_start (widget);
  114.     }
  115.  
  116.     public override void remove (Gtk.Widget widget)
  117.     {
  118.         container.remove (widget);
  119.     }
  120.  
  121.     public override void show ()
  122.     {
  123.         base.show ();
  124.         get_window ().set_decorations (Gdk.WMDecoration.BORDER);
  125.     }
  126.  
  127.     public void append_toolitem (Gtk.ToolItem item, bool after_title = false)
  128.     {
  129.         toolbar.insert (item, after_title ? toolbar.get_n_items () - 2 : toolbar.get_item_index (label));
  130.     }
  131.  
  132.     public static Cairo.Region get_window_shape (int width, int height, int radius) {
  133.         var rectangles = new Cairo.RectangleInt[0];
  134.  
  135.         for (int vertical_pixel = 1; vertical_pixel <= radius; vertical_pixel++) {
  136.             int horizontal_offset = (int) Math.round (Math.sqrt (radius*radius - vertical_pixel*vertical_pixel) ) - radius;
  137.             Cairo.RectangleInt rect = {horizontal_offset, vertical_pixel, width - horizontal_offset, 1};
  138.             rectangles += rect;
  139.         }
  140.  
  141.         var res = new Cairo.Region.rectangles (rectangles);
  142.         return res;
  143.     }
  144. }
  145.  
  146. int main (string [] args)
  147. {
  148.     Gtk.init (ref args);
  149.  
  150.     var w = new FancyWindow ();
  151.     w.set_default_size (720, 600);
  152.     w.destroy.connect (Gtk.main_quit);
  153.     var lbl = new Gtk.Label ("Hello");
  154.     lbl.margin = 100;
  155.  
  156.     var measure = new Gtk.ToolItem ();
  157.     var m = new Gtk.ComboBoxText ();
  158.     m.append ("px", "px");
  159.     m.append ("cm", "cm");
  160.     m.append ("in", "in");
  161.     m.active = 0;
  162.     measure.add (m);
  163.  
  164.     w.add (lbl);
  165.     w.append_toolitem (new Gtk.ToolButton.from_stock (Gtk.Stock.NEW));
  166.     w.append_toolitem (new Gtk.ToolButton.from_stock (Gtk.Stock.OPEN));
  167.     w.append_toolitem (new Gtk.ToolButton.from_stock (Gtk.Stock.SAVE));
  168.     w.append_toolitem (new Gtk.ToolButton.from_stock (Gtk.Stock.PRINT));
  169.     w.append_toolitem (w.create_separator ());
  170.     w.append_toolitem (new Gtk.ToolButton (new Gtk.Image.from_icon_name ("document-import", Gtk.IconSize.LARGE_TOOLBAR), ""));
  171.     w.append_toolitem (new Gtk.ToolButton (new Gtk.Image.from_icon_name ("document-export", Gtk.IconSize.LARGE_TOOLBAR), ""));
  172.     w.append_toolitem (measure, true);
  173.     w.append_toolitem (w.create_separator (), true);
  174.     w.append_toolitem (new Gtk.ToolButton.from_stock (Gtk.Stock.PRINT), true);
  175.     w.append_toolitem (new Gtk.ToolButton.from_stock (Gtk.Stock.SAVE_AS), true);
  176.     w.append_toolitem (w.create_separator (), true);
  177.     w.append_toolitem (new Granite.Widgets.ToolButtonWithMenu (new Gtk.Image.from_icon_name ("application-menu", Gtk.IconSize.LARGE_TOOLBAR), "", new Gtk.Menu ()), true);
  178.     w.show_all ();
  179.  
  180.  
  181.     Gtk.main ();
  182.  
  183.     return 0;
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement