123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206(* Lablgtk - Examples *)openStdLabelsopenMlpostmoduleP=Picturetypeauto_aspect=width:Num.t->height:Num.t->P.t->Mlpost.Transform.tletaa_nothing~width:_~height:__=[]letaa_center~width~heightpic=letp=Point.pt(Num.divfwidth2.,Num.divfheight2.)in[Transform.shifted(Point.subp(P.ctrpic))]letaa_fit_page~width~heightpic=letswidth=Num.divnwidth(P.widthpic)inletsheight=Num.divnheight(P.heightpic)inletscale=Num.minnswidthsheightinlett=Transform.scaledscaleint::aa_center~width~height(P.transform[t]pic)letaa_fit_width~width~heightpic=letswidth=Num.divnwidth(P.widthpic)inlett=Transform.scaledswidthint::aa_center~width~height(P.transform[t]pic)letaa_fit_height~width~heightpic=letsheight=Num.divnheight(P.heightpic)inlett=Transform.scaledsheightint::aa_center~width~height(P.transform[t]pic)classmlpost_pic?width?height?packing?show()=(* Create the drawing area. *)letda=GMisc.drawing_area?width?height?packing?show()inletdrawable=lazy(newGDraw.drawableda#misc#window)inletnew_pixmapcolorwidthheight=letdrawable=GDraw.pixmap~width~height()indrawable#set_foregroundcolor;drawableinobject(self)inheritGObj.widgetda#as_widgetvalmutableneed_update=true(* The mlpost pic. *)valmutablepic=Command.nopmethodset_pict=pic<-t;need_update<-truemethodpic=pic(* For the background color *)valmutablebackground=`WHITEmethodbackground=backgroundmethodset_backgroundc=background<-c(* For the aspect *)valmutableauto_aspect=aa_nothingmethodset_auto_aspectx=auto_aspect<-xvalmutableshow_corner=falsemethodset_show_cornerb=show_corner<-bvalmutablesize=(1,1)methodsize=sizevalmutablepm=new_pixmap`WHITE11valorigin=Point.originmethodprivaterepaint()=letdrawable=Lazy.forcedrawableinlet((width,height)asssize)=drawable#sizeinsize<-ssize;pm<-new_pixmapbackgroundwidthheight;(* reset the pixmap *)pm#rectangle~x:0~y:0~width~height~filled:true();letw,h=(float_of_intwidth,float_of_intheight)in(* *)letpic=ifshow_cornerthenletfx=Point.draw~color:Color.red(Picture.cornerxpic)inCommand.seq(pic::List.map~f[`Center;`Northeast;`Southeast;`Northwest;`Southwest])elsepicinlett=auto_aspect~width:(Num.ptw)~height:(Num.pth)picinletpic=Picture.transformtpicinletcr=Cairo_gtk.createpm#pixmapinCairost.emit_cairocr(w,h)pic;need_update<-false(* Repaint the widget. *)methodprivateexposeev=ifneed_updatethenself#repaint();letarea=GdkEvent.Expose.areaevinletgwin=da#misc#windowinletd=newGDraw.drawablegwininletx=Gdk.Rectangle.xareaandy=Gdk.Rectangle.yareainletwidth=Gdk.Rectangle.widthareaandheight=Gdk.Rectangle.heightareaind#put_pixmap~x~y~xsrc:x~ysrc:y~width~heightpm#pixmapinitializerignore(da#event#connect#expose~callback:(funev->self#exposeev;false));ignore(da#event#connect#configure~callback:(fun_->need_update<-true;false))endmoduleInterface=structtypeinterface={window:GWindow.window;main_vbox:GPack.box;mutableshow:bool;(* The main window is shown *)mutablepicda:((unit->Command.t)*(mlpost_pic*GWindow.window))list;}letnew_interface?width?height?title()=letwindow=GWindow.window?width?height?title()inletvbox=GPack.vbox~packing:window#add()inlet_=GMenu.menu_bar~packing:vbox#pack()inignore(window#connect#destroy~callback:GMain.quit);{window;main_vbox=vbox;show=false;picda=[]}letremove_picwindowpic=window.picda<-List.remove_assqpicwindow.picdaletadd_picw?width?height?title?(show_corner=false)?(auto_aspect=aa_nothing)pic=letwindow=GWindow.window?width?height?title()inletmlpost_pic=newmlpost_pic?width?height~packing:window#add()inmlpost_pic#set_pic(pic());mlpost_pic#set_auto_aspectauto_aspect;mlpost_pic#set_show_cornershow_corner;w.picda<-(pic,(mlpost_pic,window))::w.picda;ignore(window#connect#destroy~callback:(fun()->remove_picwpic));ifw.showthenignore(window#show())letrefreshw=List.iter~f:(fun(pic,(mlpic,_))->(trymlpic#set_pic(pic())withe->Format.eprintf"Error raised inside picure generation@ :@ %s@."(Printexc.to_stringe));GtkBase.Widget.queue_drawmlpic#as_widget)w.picda(** Editor window *)letcreate_optionw~packing?labell=(matchlabelwith|None->()|Sometext->ignore(GMisc.label~text~packing()));letmenu=GMenu.menu()inletoptionmenu=GMenu.option_menu~packing()inoptionmenu#set_menumenu;optionmenu#set_history3;ignore(List.fold_left~f:(fungroup(s,(c:unit->unit))->letc()=c();refreshwinletmenuitem=GMenu.radio_menu_item?group~label:s~packing:menu#append()inignore(menuitem#connect#toggled~callback:c);Somemenuitem#group)~init:Nonel)letcreate_optionw=create_optionw~packing:w.main_vbox#packletcreate_textw?labelfirstset=(matchlabelwith|None->()|Sometext->ignore(GMisc.label~text~packing:w.main_vbox#pack()));lettext=GText.view~packing:w.main_vbox#pack~show:true()intext#buffer#set_textfirst;ignore(text#buffer#connect#changed~callback:(fun()->set(text#buffer#get_text());refreshw))letmainw=ignore(w.window#show());List.iter~f:(fun(_,(_,window))->ignore(window#show()))w.picda;GMain.main()end