--------------------------------------------------------------------- --# GtkDrawingArea - draws pie chart of disk usage --------------------------------------------------------------------- include GtkEngine.e include GtkCairo.e include std/math.e enum TOTAL, FREE, USED, NAME ifdef WINDOWS then constant diskinfo = disk_size("C:") elsedef constant diskinfo = disk_size("/") end ifdef -- note: no two disk size programs report anywhere near the same values, -- so there's no way to know if Euphoria's disk info is more - or less - -- accurate than any of the others. Eu and df -H reports match the most closely. constant win = create(GtkWindow, "size=300x300,border_width=10,resizable=FALSE,position=1,$destroy=Quit") constant panel = create(GtkBox,"orientation=VERTICAL,spacing=10") add(win,panel) constant screen = create(GtkDrawingArea) set(screen,"size request",280,200) add(panel,screen) constant css = create(GtkCssProvider,"GtkFrame {border-radius: 20px;}") constant frame = create(GtkFrame) add(panel,frame) constant evb = create(GtkEventBox) add(frame,evb) constant lbl = create(GtkLabel,{ {"font","10"}, {"color","blue"}, {"markup", format(` [] Size: [] Used: [] Free: []`, {diskinfo[NAME], format("[:8.0,,] meg.",diskinfo[TOTAL]/1_000_000), format("[:8.0,,] meg.",diskinfo[USED]/1_000_000), format("[:8.0,,] meg.",diskinfo[FREE]/1_000_000), " "})}}) add(evb,lbl) constant btn1 = create(GtkButton,"gtk-quit","Quit") constant box = create(GtkButtonBox,{ {"layout",GTK_BUTTONBOX_START}, {"margin top",10}}) add(box,btn1) pack(panel,-box) -- following line redraws the pie chart on program start and -- whenever window is obscured/restored. -- it must not be called until all widgets are created connect(panel,"draw",call_back(routine_id("DrawPieChart"))) show_all(win) main() ------------------------------- function DrawPieChart() ------------------------------- atom dwin = get(screen,"window") atom cr = create(GdkCairo_t,dwin) set(cr,{ {"source rgba",255,255,255,255}, {"operator",CAIRO_OPERATOR_SOURCE}, {"paint"}}) atom xc = 140.0 atom yc = 95.0 atom radius = 50.0 atom percent_used = (diskinfo[USED]/diskinfo[TOTAL]) atom percent_free = (diskinfo[FREE]/diskinfo[TOTAL]) atom degrees_used = 360 * percent_used atom degrees_free = 360 * percent_free -- angles are specified in radians; the zero radial is at 3 o'clock. -- to get a more natural display, we rotate it to start at high noon. atom offset = 90 * DEGREES_TO_RADIANS atom radians_used = (degrees_used * DEGREES_TO_RADIANS)-offset atom radians_free = (degrees_free - (90 * DEGREES_TO_RADIANS))-offset set(cr,{ -- fill free space; {"color","pale green"}, {"arc",xc, yc, 90.0, -offset, radians_free}, {"fill"}}) set(cr,{ -- draw border; {"color","blue"}, {"line width",3}, {"arc",xc, yc, 90.0, 0, math:TWOPI}, {"stroke"}}) set(cr,{ -- fill used space; {"color","red"}, {"move to",xc,yc}, {"arc", xc, yc,88, -offset, radians_used}, {"fill"}}) set(cr,{-- draw center dot; {"color","yellow"}, {"arc",xc, yc, 4.0, 0, math:TWOPI}, {"fill"}}) set(cr,"destroy") return 0 -- important to return 0 here! end function