--------------------------------------
-- Drawing Primitives
--------------------------------------
include GtkEngine.e
include GtkEnums.e
include GtkRoutines.e
include std/filesys.e

enum CLEAR, BKGND, LINES, DOTS, RECTS, ARCS, PIX
object drawable, canvas, gc

constant img = create(GdkPixbuf,"from_file::" 
  & canonical_path("~/demos/MorningRain.jpg")) 
sequence dim = {512,348} 

----------------------------------
function random(integer x)
----------------------------------
if x < 1 then x = 1 end if
return rand(x)
end function

----------------------------------
function Draw(atom ctl, atom what)
----------------------------------
-- generate random coordinates;
sequence size  = get_size(canvas) 
integer x1 = random(size[1])
integer x2 = random(size[1])
integer y1 = random(size[2])
integer y2 = random(size[2])
integer w = random(size[1]-x1)
integer h = random(size[2]-y1)
integer a1 = random(360*64)
integer a2 = random(360*64)

-- generate a random background color;
sequence rcolor = sprintf("#%02x%02x%02x", {rand(#FF),rand(#FF),rand(#FF)})

-- generate a random drawing color;
set_foreground(gc,rand(#FFFFFF))

switch what do
  case CLEAR then set(drawable,"modify bg",0,"white") clear(canvas)
  case BKGND then set(drawable,"modify bg",0,rcolor)
  case LINES then draw_line(canvas,gc,x1,y1,x2,y2) 
  case DOTS  then 
    for i = 1 to 1000 do
      set_foreground(gc,rand(#FFFFFFF))
      raw_point(canvas,gc,rand(size[1]),rand(size[2]))
    end for     
  case RECTS then draw_rectangle(canvas,gc,TRUE,x1,y1,w,h) 
  case ARCS  then draw_arc(canvas,gc,TRUE,x1,y1,w,h,a1,a2) 
  case PIX   then draw_pixbuf(canvas,gc,img,0,0,0,0,dim[1],dim[2]) 
end switch
return 1
end function
constant draw = call_back(routine_id("Draw"))

constant win = create(GtkWindow)
	connect(win,"destroy",quit)
	set(win,"position",GTK_WIN_POS_CENTER)
	set(win,"default size",dim[1],dim[2])

constant panel = create(GtkVBox)
	add(win,panel)

drawable = create(GtkDrawingArea)
	add(panel,drawable)

constant btnbox = create(GtkHButtonBox)
	pack(panel,-btnbox)

constant btn1 = create(GtkButton,"gtk-quit")
	set(btn1,"tooltip text","Click to quit")
	connect(btn1,"clicked",quit)

constant btn2 = create(GtkButton,"_Lines")
	set(btn2,"tooltip text","Draw a line in random color")
	connect(btn2,"clicked",draw,LINES)

constant btn3 = create(GtkButton,"_Dots")
	set(btn3,"tooltip text","Draw 1000 random dots")
	connect(btn3,"clicked",draw,DOTS)

constant btn4 = create(GtkButton,"_Rects")
	set(btn4,"tooltip text","Draw a random rectangle")
	connect(btn4,"clicked",draw,RECTS)

constant btn5 = create(GtkButton,"_Arcs")
	set(btn5,"tooltip text","Draw random arcs")
	connect(btn5,"clicked",draw,ARCS)

constant btn6 = create(GtkButton,"_Img")
	set(btn6,"tooltip text","Insert an image")
	connect(btn6,"clicked",draw,PIX)

constant btn7 = create(GtkButton,"_Bkgnd")
	set(btn7,"tooltip text","Change to a random background color")
	connect(btn7,"clicked",draw,BKGND)

constant btn8 = create(GtkButton,"_Clear")
	set(btn8,"tooltip text","Clear the canvas")
	connect(btn8,"clicked",draw,CLEAR)

add(btnbox,{btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8})

show_all(win)

-- following must be done after drawing surface is shown:
   constant style = get(drawable,"style")
   canvas = peek4u(drawable + 52)
   gc = peek4u(style + 540)

main()