2016-11-25 00:33:18 -07:00

96 lines
2.5 KiB
Elixir

----------------------------------------------------------------------------------
--# More Graphics, demos translucency, resizing;
----------------------------------------------------------------------------------
include GtkEngine.e
include GtkCairo.e
include std/math.e
constant win = create(GtkWindow,{
{"title","Resize Me!"},
{"default size",300,300},
{"position",GTK_WIN_POS_CENTER},
{"border width",0},
{"background",#DBDBDB},
{"add events",GDK_BUTTON_PRESS_MASK},
{"app paintable",TRUE},
{"connect","destroy","Quit"}})
constant box = add(win,create(GtkBox,VERTICAL))
constant screen = create(GtkDrawingArea)
pack(box,screen,TRUE,TRUE)
connect(box,"draw","Paint") -- re-do as needed;
show_all(win)
atom dwin = get(screen,"window") -- for use in Paint func;
main()
----------------------------------------------------------
global function Paint(atom ctl, atom event, atom data)
----------------------------------------------------------
atom cr = create(GdkCairo_t,dwin)
object size = get(win,"size") - {0,40} -- allow for window header, etc
integer width = size[1]
integer height = size[2]
integer lesser = min(size)
-- coordinates for the center of the window;
atom xc = width / 2
atom yc = height / 2
-- clear previous drawing;
set(cr,{
{"source rgb",0.86,0.86,0.86}, -- a neutral gray;
{"paint"},
{"source rgb",0,0,0}, -- outine the 3 shapes in black
{"set_line_width",lesser * 0.02}, -- outline thickness increases with window size
{"save"},
-- first draw a simple unclosed arc;
{"arc",width / 3.0, height / 4.0, lesser / 4.0, -(PI / 5.0), PI},
{"close_path"}, -- line back to start point
{"set_source_rgb",0.0, 0.8, 0.0},
{"fill_preserve"}, -- fill with color, save shape
{"restore"}, -- back to opaque black
{"stroke"}, -- outline shape
-- now draw a circle;
{"save"},
{"arc",xc, yc, lesser / 4.0, 0.0, 2.0 * PI}, -- full circle
{"source rgba",0.6, 0.0, 0.8, 0.6}, -- partially translucent
{"fill_preserve"},
{"restore"}, -- back to opaque black
{"stroke"},
{"save"}})
-- and an ellipse;
atom ex, ey, ew, eh
-- center of ellipse
ex = xc
ey = 3 * height / 4
-- ellipse dimensions
ew = 3 * width / 4
eh = height / 3
set(cr,{
{"translate",ex, ey},
{"scale",ew / 2.0, eh / 2.0},
{"arc",0, 0, 1, 0, 2 * PI}, -- centered at (0, 0)
{"source rgba",0.8, 0, 0, 0.7},
{"fill_preserve"}, -- fill with color, save shape
{"restore"}, -- back to opaque black
{"stroke"}, -- outline the shape
{"destroy"}})
return 1
end function