Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class FancyWindow : Gtk.Window
- {
- Gtk.Box container;
- Gtk.Toolbar toolbar;
- Gtk.ToolItem label;
- const int HEIGHT = 48;
- const int ICON_SIZE = Gtk.IconSize.LARGE_TOOLBAR;
- const string CSS = """
- .title {
- color: #666;
- text-shadow: 0px 1px 0px white;
- }
- .toolbar {
- padding: 0px;
- box-shadow: inset 0px 1px 0px rgba(255,255,255,0.3);
- }
- """;
- Gtk.CssProvider css;
- Gtk.Label _title;
- public new string title {
- get {
- return _title.label;
- }
- set {
- _title.label = value;
- }
- }
- public FancyWindow ()
- {
- css = new Gtk.CssProvider ();
- try {
- css.load_from_data (CSS, -1);
- } catch (Error e) { warning (e.message); }
- toolbar = new Gtk.Toolbar ();
- toolbar.icon_size = ICON_SIZE;
- toolbar.get_style_context ().add_class ("primary-toolbar");
- toolbar.get_style_context ().add_provider (css, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
- container = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);
- container.margin = 1;
- container.pack_start (toolbar, false);
- var close = new Gtk.ToolButton (new Gtk.Image.from_file ("/usr/share/themes/elementary/metacity-1/close.svg"), "Close");
- close.height_request = HEIGHT;
- close.width_request = HEIGHT;
- close.clicked.connect (() => destroy ());
- var maximize = new Gtk.ToolButton (new Gtk.Image.from_file ("/usr/share/themes/elementary/metacity-1/maximize.svg"), "Close");
- maximize.height_request = HEIGHT;
- maximize.width_request = HEIGHT;
- maximize.clicked.connect (() => this.maximize ());
- _title = new Gtk.Label ("");
- _title.override_font (Pango.FontDescription.from_string ("bold"));
- label = new Gtk.ToolItem ();
- label.add (_title);
- label.set_expand (true);
- label.get_style_context ().add_class ("title");
- label.get_style_context ().add_provider (css, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
- toolbar.insert (close, -1);
- toolbar.insert (create_separator (), -1);
- toolbar.insert (label, -1);
- toolbar.insert (create_separator (), -1);
- toolbar.insert (maximize, -1);
- draw.connect_after ((cr) => {
- Granite.Drawing.Utilities.cairo_rounded_rectangle (cr, 0, 0, get_allocated_width (), get_allocated_height (), 8);
- cr.set_source_rgba (0, 0, 0, 0.7);
- cr.set_line_width (1);
- cr.stroke ();
- return false;
- });
- base.add (container);
- }
- public override bool configure_event (Gdk.EventConfigure event)
- {
- if (get_window () != null)
- get_window ().shape_combine_region (get_window_shape (event.width, event.height, 8), 0, 0);
- return false;
- }
- public Gtk.ToolItem create_separator ()
- {
- var sep = new Gtk.ToolItem ();
- sep.height_request = HEIGHT;
- sep.width_request = 1;
- sep.draw.connect ((cr) => {
- cr.move_to (0, 0);
- cr.line_to (0, 60);
- cr.set_line_width (1);
- var grad = new Cairo.Pattern.linear (0, 0, 0, HEIGHT);
- grad.add_color_stop_rgba (0, 0.3, 0.3, 0.3, 0.4);
- grad.add_color_stop_rgba (0.8, 0, 0, 0, 0);
- cr.set_source (grad);
- cr.stroke ();
- return true;
- });
- sep.get_style_context ().add_class ("sep");
- sep.get_style_context ().add_provider (css, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
- return sep;
- }
- public override void add (Gtk.Widget widget)
- {
- container.pack_start (widget);
- }
- public override void remove (Gtk.Widget widget)
- {
- container.remove (widget);
- }
- public override void show ()
- {
- base.show ();
- get_window ().set_decorations (Gdk.WMDecoration.BORDER);
- }
- public void append_toolitem (Gtk.ToolItem item, bool after_title = false)
- {
- toolbar.insert (item, after_title ? toolbar.get_n_items () - 2 : toolbar.get_item_index (label));
- }
- public static Cairo.Region get_window_shape (int width, int height, int radius) {
- var rectangles = new Cairo.RectangleInt[0];
- for (int vertical_pixel = 1; vertical_pixel <= radius; vertical_pixel++) {
- int horizontal_offset = (int) Math.round (Math.sqrt (radius*radius - vertical_pixel*vertical_pixel) ) - radius;
- Cairo.RectangleInt rect = {horizontal_offset, vertical_pixel, width - horizontal_offset, 1};
- rectangles += rect;
- }
- var res = new Cairo.Region.rectangles (rectangles);
- return res;
- }
- }
- int main (string [] args)
- {
- Gtk.init (ref args);
- var w = new FancyWindow ();
- w.set_default_size (720, 600);
- w.destroy.connect (Gtk.main_quit);
- var lbl = new Gtk.Label ("Hello");
- lbl.margin = 100;
- var measure = new Gtk.ToolItem ();
- var m = new Gtk.ComboBoxText ();
- m.append ("px", "px");
- m.append ("cm", "cm");
- m.append ("in", "in");
- m.active = 0;
- measure.add (m);
- w.add (lbl);
- w.append_toolitem (new Gtk.ToolButton.from_stock (Gtk.Stock.NEW));
- w.append_toolitem (new Gtk.ToolButton.from_stock (Gtk.Stock.OPEN));
- w.append_toolitem (new Gtk.ToolButton.from_stock (Gtk.Stock.SAVE));
- w.append_toolitem (new Gtk.ToolButton.from_stock (Gtk.Stock.PRINT));
- w.append_toolitem (w.create_separator ());
- w.append_toolitem (new Gtk.ToolButton (new Gtk.Image.from_icon_name ("document-import", Gtk.IconSize.LARGE_TOOLBAR), ""));
- w.append_toolitem (new Gtk.ToolButton (new Gtk.Image.from_icon_name ("document-export", Gtk.IconSize.LARGE_TOOLBAR), ""));
- w.append_toolitem (measure, true);
- w.append_toolitem (w.create_separator (), true);
- w.append_toolitem (new Gtk.ToolButton.from_stock (Gtk.Stock.PRINT), true);
- w.append_toolitem (new Gtk.ToolButton.from_stock (Gtk.Stock.SAVE_AS), true);
- w.append_toolitem (w.create_separator (), true);
- w.append_toolitem (new Granite.Widgets.ToolButtonWithMenu (new Gtk.Image.from_icon_name ("application-menu", Gtk.IconSize.LARGE_TOOLBAR), "", new Gtk.Menu ()), true);
- w.show_all ();
- Gtk.main ();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement