123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133(**************************************************************************)(* *)(* This file is part of Frama-C. *)(* *)(* Copyright (C) 2007-2023 *)(* CEA (Commissariat à l'énergie atomique et aux énergies *)(* alternatives) *)(* *)(* you can redistribute it and/or modify it under the terms of the GNU *)(* Lesser General Public License as published by the Free Software *)(* Foundation, version 2.1. *)(* *)(* It is distributed in the hope that it will be useful, *)(* but WITHOUT ANY WARRANTY; without even the implied warranty of *)(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *)(* GNU Lesser General Public License for more details. *)(* *)(* See the GNU Lesser General Public License version 2.1 *)(* for more details (enclosed in the file licenses/LGPLv2.1). *)(* *)(**************************************************************************)openWidgettypeexpand=W|H|V|HVlethdir=functionW|V->false|H|HV->trueletvdir=functionW|H->false|V|HV->truetypebox=|Void|ToEnd|Packofexpand*int*widgetletbox?(expand=W)?(padding=0)?widget()=matchwidgetwith|None->Void|Somew->Pack(expand,padding,(w:>widget))letg?(expand=W)?(padding=0)g=Pack(expand,padding,newWutil.gobj_widgetg)letw?(expand=W)?(padding=0)a=Pack(expand,padding,(a:>widget))leth?(padding=0)a=Pack(H,padding,(a:>widget))letv?(padding=0)a=Pack(V,padding,(a:>widget))lethv?(padding=0)a=Pack(HV,padding,(a:>widget))letlabel?(fill=false)?style?align?paddingtext=w~expand:(iffillthenHelseW)?padding(newWidget.label~text?align?style())letrecpopulatedir(box:#GPack.box)from=function|[]->()|Pack(e,padding,w)::ws->box#pack~from~expand:(dire)~paddingw#coerce;populatedirboxfromws|Void::ws->populatedirboxfromws|ToEnd::ws->iffrom=`STARTthenpopulatedirbox`END(List.revws)elsepopulatedirboxfromwslethboxws=letbox=GPack.hbox~show:true()inpopulatehdirbox`STARTws;newWutil.gobj_widgetboxletvboxws=letbox=GPack.vbox~show:true()inpopulatevdirbox`STARTws;newWutil.gobj_widgetboxlethgroup(ws:widgetlist)=letbox=GPack.hbox~show:true~homogeneous:true()inList.iter(funw->box#pack~expand:falsew#coerce)ws;newWutil.gobj_widgetboxletvgroup(ws:widgetlist)=letbox=GPack.vbox~show:true~homogeneous:true()inList.iter(funw->box#pack~expand:falsew#coerce)ws;newWutil.gobj_widgetboxlet(<|>)xsys=ifys=[]thenxselse(xs@(ToEnd::ys))lettoolbarxsys=hbox(xs<|>ys)letsidebarxsys=vbox(xs<|>ys)letpanel?top?left?right?bottomcenter=letmiddle=matchleft,rightwith|None,None->(center:>widget)|Somea,Someb->hbox[va;hv~padding:2center;vb]|None,Someb->hbox[hv~padding:2center;vb]|Somea,None->hbox[va;hv~padding:2center]inmatchtop,bottomwith|None,None->middle|Somet,None->vbox[ht;hvmiddle]|None,Somet->vbox[hvmiddle;wt]|Somea,Someb->vbox[ha;hvmiddle;hb]classtypesplitter=objectinheritWutil.widgetmethodget:floatmethodset:float->unitmethodconnect:(float->unit)->unitendletsplit~dirw1w2=letpane=GPack.paneddir()inpane#add1w1#coerce;pane#add2w2#coerce;letsplitter=objectinherit(Wutil.gobj_widgetpane)methodget=Wutil.get_pane_ratiopanemethodset=Wutil.set_pane_ratiopanemethodconnectf=letcallback_=f(Wutil.get_pane_ratiopane);falseinignore(pane#event#connect#button_release~callback)endin(splitter:>splitter)letscroll?(hpolicy=`AUTOMATIC)?(vpolicy=`AUTOMATIC)w=(* Explicit conversion needed for lablgtk3, as policy_type has been extended
with another constructor but we still export the lablgtk2 type. *)letvpolicy=(vpolicy:>Gtk.Tags.policy_type)inlethpolicy=(hpolicy:>Gtk.Tags.policy_type)inletscrolled=GBin.scrolled_window~vpolicy~hpolicy()inscrolled#add_with_viewportw#coerce;newWutil.gobj_widgetscrolledlethscrollw=scroll~vpolicy:`NEVERwletvscrollw=scroll~hpolicy:`NEVERw