123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778(**************************************************************************)(* Lablgtk *)(* *)(* This program is free software; you can redistribute it *)(* and/or modify it under the terms of the GNU Library General *)(* Public License as published by the Free Software Foundation *)(* version 2, with the exception described in file COPYING which *)(* comes with the library. *)(* *)(* This program 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 Library General Public License for more details. *)(* *)(* You should have received a copy of the GNU Library General *)(* Public License along with this program; if not, write to the *)(* Free Software Foundation, Inc., 59 Temple Place, Suite 330, *)(* Boston, MA 02111-1307 USA *)(* *)(* *)(**************************************************************************)(* $Id$ *)openStdLabelsopenGauxopenGobjectopenGtkopenGtkBaseopenGtkTreeopenOgtkBasePropsopenOgtkTreePropsopenGObjopenGContainer(* New GtkTreeView/Model framework *)type'acolumn={index:int;conv:'adata_conv;creator:int}classcolumn_list=object(self)valmutableindex=0valmutabletypes=[]valmutablelocked=falsemethodtypes=List.revtypesmethodadd:'a.'adata_conv->'acolumn=funconv->iflockedthenfailwith"GTree.column_list#add";letn=indexintypes<-Data.get_typeconv::types;index<-index+1;{index=n;conv=conv;creator=Oo.idself}methodid=Oo.idselfmethodlock()=locked<-trueendclassrow_referencerr~model=object(self)methodas_ref=rrmethodpath=RowReference.get_pathrrmethodvalid=RowReference.validrrmethoditer=TreeModel.get_itermodelself#pathendclassmodel_signalsobj=objectinherit['a]gobject_signalsobjinherittree_model_sigsendletmodel_ids=Hashtbl.create7letcustom_model_ids=Hashtbl.create7classmodelobj=object(self)valid=tryHashtbl.findmodel_ids(Gobject.get_oidobj)withNot_found->0valobj=objmethodas_model=(obj:>tree_model)methodcoerce=(self:>model)methodmisc=newgobject_opsobjmethodflags=TreeModel.get_flagsobjmethodn_columns=TreeModel.get_n_columnsobjmethodget_column_type=TreeModel.get_column_typeobjmethodget_iter=TreeModel.get_iterobjmethodget_path=TreeModel.get_pathobjmethodget_row_referencepath=newrow_reference(RowReference.createobjpath)objmethodget:'a.row:tree_iter->column:'acolumn->'a=fun~row~column->ifcolumn.creator<>idtheninvalid_arg"GTree.model#get: bad column";(* Prevent a class derived from an ancestor of a custom model from calling
get: this would be unsound. *)ifnot(Gobject.is_aobj"Custom_model")&&Hashtbl.memcustom_model_idsidtheninvalid_arg"GTree.model#get: embedded custom model for iterator. Please use model#get_path then custom_model#custom_get_iter.";letv=Value.create_empty()inTreeModel.get_valueobj~row~column:column.indexv;Data.of_valuecolumn.convvmethodget_iter_first=TreeModel.get_iter_firstobjmethoditer_next=TreeModel.iter_nextobjmethoditer_has_child=TreeModel.iter_has_childobjmethoditer_n_children=TreeModel.iter_n_childrenobjmethoditer_children=TreeModel.iter_childrenobjmethoditer_parent=TreeModel.iter_parentobjmethodforeach=TreeModel.foreachobjmethodrow_changed=TreeModel.row_changedobjendclasstree_sortable_signalsobj=objectinheritmodel_signalsobjinherittree_sortable_sigsendclasstree_sortableobj=objectinheritmodelobjmethodconnect=newtree_sortable_signalsobjmethodsort_column_changed()=GtkTree.TreeSortable.sort_column_changedobjmethodget_sort_column_id=GtkTree.TreeSortable.get_sort_column_idobjmethodset_sort_column_id=GtkTree.TreeSortable.set_sort_column_idobjmethodset_sort_funcidcmp=GtkTree.TreeSortable.set_sort_funcobjid(funmit_ait_b->cmp(newmodelm)it_ait_b)methodset_default_sort_funccmp=GtkTree.TreeSortable.set_default_sort_funcobj(funmit_ait_b->cmp(newmodelm)it_ait_b)methodhas_default_sort_func=GtkTree.TreeSortable.has_default_sort_funcobjendletdefault_sort_column_id=-1letunsorted_sort_column_id=-2classtree_storeobj=objectinherittree_sortableobjmethodset:'a.row:tree_iter->column:'acolumn->'a->unit=fun~row~columndata->ifcolumn.creator<>idtheninvalid_arg"GTree.tree_store#set: bad column";TreeStore.set_valueobj~row~column:column.index(Data.to_valuecolumn.convdata)methodremove=TreeStore.removeobjmethodinsert=TreeStore.insertobjmethodinsert_before=TreeStore.insert_beforeobjmethodinsert_after=TreeStore.insert_afterobjmethodappend=TreeStore.appendobjmethodprepend=TreeStore.prependobjmethodis_ancestor=TreeStore.is_ancestorobjmethoditer_depth=TreeStore.iter_depthobjmethodclear()=TreeStore.clearobjmethoditer_is_valid=TreeStore.iter_is_validobjmethodswap=TreeStore.swapobjmethodmove_before=TreeStore.move_beforeobjmethodmove_after=TreeStore.move_afterobjendlettree_store(cols:column_list)=cols#lock();letstore=TreeStore.create(Array.of_listcols#types)inHashtbl.addmodel_ids(Gobject.get_oidstore)cols#id;newtree_storestoreclasslist_storeobj=objectinherittree_sortableobjmethodset:'a.row:tree_iter->column:'acolumn->'a->unit=fun~row~columndata->ifcolumn.creator<>idtheninvalid_arg"GTree.list_store#set: bad column";ListStore.set_valueobj~row~column:column.index(Data.to_valuecolumn.convdata)methodremove=ListStore.removeobjmethodinsert=ListStore.insertobjmethodinsert_before=ListStore.insert_beforeobjmethodinsert_after=ListStore.insert_afterobjmethodappend=ListStore.appendobjmethodprepend=ListStore.prependobjmethodclear()=ListStore.clearobjmethoditer_is_valid=ListStore.iter_is_validobjmethodswap=ListStore.swapobjmethodmove_before=ListStore.move_beforeobjmethodmove_after=ListStore.move_afterobjendletlist_store(cols:column_list)=cols#lock();letstore=ListStore.create(Array.of_listcols#types)inHashtbl.addmodel_ids(Gobject.get_oidstore)cols#id;newlist_storestoreletstore_of_listconvdata=letcols=newcolumn_listinletcolumn=cols#addconvinletstore=list_storecolsinList.iter(fund->letrow=store#append()instore#set~row~columnd)data;store,columnclassmodel_sort(obj:Gtk.tree_model_sort)=objectinherittree_sortableobjmethodmodel=newmodel(Gobject.getGtkTree.TreeModelSort.P.modelobj)methodconvert_child_path_to_path=GtkTree.TreeModelSort.convert_child_path_to_pathobjmethodconvert_child_iter_to_iter=GtkTree.TreeModelSort.convert_child_iter_to_iterobjmethodconvert_path_to_child_path=GtkTree.TreeModelSort.convert_path_to_child_pathobjmethodconvert_iter_to_child_iter=GtkTree.TreeModelSort.convert_iter_to_child_iterobjmethodreset_default_sort_func()=GtkTree.TreeModelSort.reset_default_sort_funcobjmethoditer_is_valid=GtkTree.TreeModelSort.iter_is_validobjendletmodel_sortmodel=letchild_model=model#as_modelinletchild_oid=Gobject.get_oidchild_modelinleto=GtkTree.TreeModelSort.create~model:child_model[]inbegintryletchild_id=Hashtbl.findmodel_idschild_oidinHashtbl.addmodel_ids(Gobject.get_oido)child_idwithNot_found->()end;newmodel_sortoclassmodel_filter(obj:Gtk.tree_model_filter)=objectinheritmodelobjmethodconnect=newmodel_signalsobjmethodchild_model=newmodel(Gobject.getGtkTree.TreeModelFilter.P.child_modelobj)methodvirtual_root=Gobject.getGtkTree.TreeModelFilter.P.virtual_rootobjmethodset_visible_funcf=GtkTree.TreeModelFilter.set_visible_funcobj(funoit->f(newmodelo)it)methodset_visible_column(c:boolcolumn)=GtkTree.TreeModelFilter.set_visible_columnobjc.indexmethodconvert_child_path_to_path=GtkTree.TreeModelFilter.convert_child_path_to_pathobjmethodconvert_child_iter_to_iter=GtkTree.TreeModelFilter.convert_child_iter_to_iterobjmethodconvert_path_to_child_path=GtkTree.TreeModelFilter.convert_path_to_child_pathobjmethodconvert_iter_to_child_iter=GtkTree.TreeModelFilter.convert_iter_to_child_iterobjmethodrefilter()=GtkTree.TreeModelFilter.refilterobjendletmodel_filter?virtual_rootmodel=letchild_model=model#as_modelinletchild_oid=Gobject.get_oidchild_modelinleto=GtkTree.TreeModelFilter.create~child_model?virtual_root[]inbegintryletchild_id=Hashtbl.findmodel_idschild_oidinHashtbl.addmodel_ids(Gobject.get_oido)child_id;withNot_found->()end;newmodel_filteromodulePath=TreePath(*
open GTree.Data;;
let cols = new GTree.column_list ;;
let title = cols#add string;;
let author = cols#add string;;
let checked = cols#add boolean;;
let store = new GTree.tree_store cols;;
*)classtypecell_renderer=objectmethodas_renderer:Gtk.cell_rendererobjendclasscell_layoutobj=objectmethodpack:'a.?expand:bool->?from:Tags.pack_type->(#cell_rendereras'a)->unit=fun?expand?fromcrr->GtkTree.CellLayout.packobj?expand?fromcrr#as_renderermethodreorder:'a.(#cell_rendereras'a)->int->unit=funcrrpos->GtkTree.CellLayout.reorderobjcrr#as_rendererposmethodclear()=GtkTree.CellLayout.clearobjmethodadd_attribute:'a'b.(#cell_rendereras'a)->string->'bcolumn->unit=funcrrattrcol->GtkTree.CellLayout.add_attributeobjcrr#as_rendererattrcol.indexmethodset_cell_data_func:'a.(#cell_rendereras'a)->(model->Gtk.tree_iter->unit)->unit=funcrrcb->GtkTree.CellLayout.set_cell_data_funcobjcrr#as_renderer(Some(funmi->cb(newmodelm)i))methodunset_cell_data_func:'a.(#cell_rendereras'a)->unit=funcrr->GtkTree.CellLayout.set_cell_data_funcobjcrr#as_rendererNonemethodclear_attributes:'a.(#cell_rendereras'a)->unit=funcrr->GtkTree.CellLayout.clear_attributesobjcrr#as_rendererendclassview_column_signalsobj=object(self)inherit[_]gobject_signalsobjmethodclicked=self#connectTreeViewColumn.S.clickedendmoduleP=TreeViewColumn.Pclassview_column(_obj:tree_view_columnobj)=objectinheritGObj.gtkobj_objmethodprivateobj=_objinherittree_view_column_propsmethodas_column=objmethodmisc=newgobject_opsobjmethodconnect=newview_column_signalsobj(* in GTK 2.4 this will be in GtkCellLayout interface *)(* inherit cell_layout _obj *)methodclear()=TreeViewColumn.clearobjmethodreorder:'a.(#cell_rendereras'a)->int->unit=funcrrpos->GtkTree.CellLayout.reorderobjcrr#as_rendererposmethodpack:'a.?expand:_->?from:_->(#cell_rendereras'a)->_=fun?expand?fromr->TreeViewColumn.packobj?expand?fromr#as_renderermethodadd_attribute:'a'b.(#cell_rendereras'a)->string->'bcolumn->unit=funcrrattrcol->TreeViewColumn.add_attributeobjcrr#as_rendererattrcol.indexmethodclear_attributes:'a.(#cell_rendereras'a)->unit=funcrr->TreeViewColumn.clear_attributesobjcrr#as_renderermethodset_sort_column_id=TreeViewColumn.set_sort_column_idobjmethodget_sort_column_id=TreeViewColumn.get_sort_column_idobjmethodset_cell_data_func:'a.(#cell_rendereras'a)->(model->Gtk.tree_iter->unit)->unit=funcrrcb->TreeViewColumn.set_cell_data_funcobjcrr#as_renderer(Some(funmi->cb(newmodelm)i))methodunset_cell_data_func:'a.(#cell_rendereras'a)->unit=funcrr->TreeViewColumn.set_cell_data_funcobjcrr#as_rendererNoneendletview_column?title?renderer()=letw=newview_column(TreeViewColumn.create[])inmaytitle~f:w#set_title;mayrenderer~f:beginfun(crr,l)->w#packcrr;List.iterl~f:(fun(attr,col)->w#add_attributecrrattrcol)end;wletas_column(col:view_column)=col#as_columnclassselection_signals(obj:tree_selection)=object(self)inherit['a]gobject_signalsobjmethodchanged=self#connectTreeSelection.S.changedendclassselectionobj=objectvalobj=objmethodconnect=newselection_signalsobjmethodmisc=newgobject_opsobjmethodset_mode=TreeSelection.set_modeobjmethodget_mode=TreeSelection.get_modeobjmethodset_select_function=TreeSelection.set_select_functionobjmethodget_selected_rows=TreeSelection.get_selected_rowsobjmethodcount_selected_rows=TreeSelection.count_selected_rowsobjmethodselect_path=TreeSelection.select_pathobjmethodunselect_path=TreeSelection.unselect_pathobjmethodpath_is_selected=TreeSelection.path_is_selectedobjmethodselect_iter=TreeSelection.select_iterobjmethodunselect_iter=TreeSelection.unselect_iterobjmethoditer_is_selected=TreeSelection.iter_is_selectedobjmethodselect_all()=TreeSelection.select_allobjmethodunselect_all()=TreeSelection.unselect_allobjmethodselect_range=TreeSelection.select_rangeobjmethodunselect_range=TreeSelection.unselect_rangeobjendclassview_signalsobj=object(self)inheritcontainer_signals_implobjinherittree_view_sigsmethodrow_activated~callback=self#connectTreeView.S.row_activated~callback:(funitvc->callbackit(newview_columnvc))endopenTreeView.Pclassviewobj=objectinherit[Gtk.tree_view]GContainer.container_implobjinherittree_view_propsmethodas_tree_view=(obj:>Gtk.tree_viewGtk.obj)methodconnect=newview_signalsobjmethodevent=newGObj.event_opsobjmethodselection=newselection(TreeView.get_selectionobj)methodexpander_column=may_map(newview_column)(getexpander_columnobj)methodset_expander_columnc=setexpander_columnobj(may_mapas_columnc)methodmodel=newmodel(Property.get_someobjmodel)methodset_modelm=setmodelobj(may_map(fun(m:model)->m#as_model)m)methodappend_columncol=TreeView.append_columnobj(as_columncol)methodremove_columncol=TreeView.remove_columnobj(as_columncol)methodinsert_columncol=TreeView.insert_columnobj(as_columncol)methodget_columnn=newview_column(TreeView.get_columnobjn)methodmove_columncol~after=TreeView.move_column_afterobj(as_columncol)(as_columnafter)methodscroll_to_point=TreeView.scroll_to_pointobjmethodscroll_to_cell?alignpathcol=TreeView.scroll_to_cellobj?alignpath(as_columncol)methodrow_activatedpathcol=TreeView.row_activatedobjpath(as_columncol)methodexpand_all()=TreeView.expand_allobjmethodcollapse_all()=TreeView.collapse_allobjmethodexpand_row?(all=false)=TreeView.expand_rowobj~allmethodexpand_to_path=TreeView.expand_to_pathobjmethodcollapse_row=TreeView.collapse_rowobjmethodrow_expanded=TreeView.row_expandedobjmethodset_cursor:'a.?cell:(#cell_rendereras'a)->_=fun?cell?(edit=false)rowcol->matchcellwithNone->TreeView.set_cursorobj~editrow(as_columncol)|Somecell->TreeView.set_cursor_on_cellobj~editrow(as_columncol)cell#as_renderermethodget_cursor()=matchTreeView.get_cursorobjwithpath,Somevc->path,Some(newview_columnvc)|_,Noneaspair->pairmethodget_path_at_pos~x~y=matchTreeView.get_path_at_posobj~x~ywithSome(p,c,x,y)->Some(p,newview_columnc,x,y)|None->Nonemethodget_cell_area?path?col()=TreeView.get_cell_areaobj?path?col:(Gaux.may_mapas_columncol)()methodget_visible_range()=TreeView.get_visible_rangeobjmethodset_row_separator_funcfo=TreeView.set_row_separator_funcobj(Gaux.may_map(funfm->f(newmodelm))fo)endletview?model?hadjustment?vadjustment=letmodel=may_map(funm->m#as_model)modelinlethadjustment=may_mapGData.as_adjustmenthadjustmentinletvadjustment=may_mapGData.as_adjustmentvadjustmentinTreeView.make_params[]?model?hadjustment?vadjustment~cont:(GContainer.pack_container~create:(funp->newview(TreeView.createp)))typecell_properties=[`CELL_BACKGROUNDofstring|`CELL_BACKGROUND_GDKofGdk.color|`CELL_BACKGROUND_SETofbool|`HEIGHTofint|`IS_EXPANDEDofbool|`IS_EXPANDERofbool|`MODEofTags.cell_renderer_mode|`VISIBLEofbool|`WIDTHofint|`XALIGNoffloat|`XPADofint|`YALIGNoffloat|`YPADofint]typecell_properties_pixbuf_only=[`PIXBUFofGdkPixbuf.pixbuf|`PIXBUF_EXPANDER_CLOSEDofGdkPixbuf.pixbuf|`PIXBUF_EXPANDER_OPENofGdkPixbuf.pixbuf|`STOCK_DETAILofstring|`STOCK_IDofstring|`STOCK_SIZEofGtk.Tags.icon_size]typecell_properties_pixbuf=[cell_properties|cell_properties_pixbuf_only]typecell_properties_text_only=[`BACKGROUNDofstring|`BACKGROUND_GDKofGdk.color|`BACKGROUND_SETofbool|`EDITABLEofbool|`FAMILYofstring|`FONTofstring|`FONT_DESCofPango.font_description|`FOREGROUNDofstring|`FOREGROUND_GDKofGdk.color|`FOREGROUND_SETofbool|`MARKUPofstring|`RISEofint|`SINGLE_PARAGRAPH_MODEofbool|`SIZEofint|`SIZE_POINTSoffloat|`STRETCHofPango.Tags.stretch|`STRIKETHROUGHofbool|`STYLEofPango.Tags.style|`TEXTofstring|`UNDERLINEofPango.Tags.underline|`VARIANTofPango.Tags.variant]typecell_properties_text=[cell_properties|cell_properties_text_only|`SCALEofPango.Tags.scale|`WEIGHTofPango.Tags.weight]typecell_properties_toggle_only=[`ACTIVATABLEofbool|`ACTIVEofbool|`INCONSISTENTofbool|`RADIOofbool]typecell_properties_toggle=[cell_properties|cell_properties_toggle_only]typecell_properties_progress_only=[`VALUEofint|`TEXTofstringoption]typecell_properties_progress=[cell_properties|cell_properties_progress_only]typecell_properties_combo_only=[`MODELofmodeloption|`TEXT_COLUMNofstringcolumn|`HAS_ENTRYofbool]typecell_properties_combo=[cell_properties_text|cell_properties_combo_only]typecell_properties_accel_only=[`KEYofint|`ACCEL_MODEofGtkEnums.cell_renderer_accel_mode|`MODSofGdkEnums.modifierlist|`KEYCODEofint]typecell_properties_accel=[cell_properties_text|cell_properties_accel_only]letcell_renderer_pixbuf_param'=function|#cell_properties_pixbuf_onlyasx->cell_renderer_pixbuf_paramx|#cell_propertiesasx->cell_renderer_paramxletcell_renderer_text_param'=function|`SCALEs->cell_renderer_text_param(`SCALE(Pango.Tags.scale_to_floats))|`WEIGHTw->cell_renderer_text_param(`WEIGHT(Pango.Tags.weight_to_intw))|#cell_propertiesasx->cell_renderer_paramx|#cell_properties_text_onlyasx->cell_renderer_text_paramxletcell_renderer_toggle_param'=function|#cell_properties_toggle_onlyasx->cell_renderer_toggle_paramx|#cell_propertiesasx->cell_renderer_paramxletcell_renderer_progress_param'=function|#cell_properties_progress_onlyasx->cell_renderer_progress_paramx|#cell_propertiesasx->cell_renderer_paramxletcell_renderer_combo_param'=function|`MODELNone->Gobject.paramCellRendererCombo.P.modelNone|`MODEL(Somem:modeloption)->Gobject.paramCellRendererCombo.P.model(Somem#as_model)|`TEXT_COLUMNc->Gobject.paramCellRendererCombo.P.text_columnc.index|`HAS_ENTRYb->Gobject.paramCellRendererCombo.P.has_entryb|#cell_properties_textasx->cell_renderer_text_param'xletcell_renderer_accel_param'=function|`KEYCODEi->Gobject.paramCellRendererAccel.P.keycodei|`KEYi->Gobject.paramCellRendererAccel.P.accel_keyi|`ACCEL_MODEm->Gobject.paramCellRendererAccel.P.accel_modem|`MODSm->Gobject.paramCellRendererAccel.P.accel_mods(Gpointer.encode_flagsGdkEnums.Conv.modifier_tblm);|#cell_properties_textasx->cell_renderer_text_param'xclasstype['a,'b]cell_renderer_skel=objectinheritgtkobjvalobj:'aobjmethodas_renderer:Gtk.cell_rendererobjmethodget_property:('a,'c)property->'cmethodset_properties:'blist->unitendclassvirtual['a,'b]cell_renderer_implobj=object(self)inheritgtkobjobjmethodas_renderer=(obj:>Gtk.cell_rendererobj)methodprivatevirtualparam:'b->'aparammethodset_propertiesl=set_paramsobj(List.map~f:self#paraml)methodget_property:'c.('a,'c)property->'c=Gobject.Property.getobjendclasscell_renderer_pixbufobj=objectinherit[Gtk.cell_renderer_pixbuf,cell_properties_pixbuf]cell_renderer_implobjmethodprivateparam=cell_renderer_pixbuf_param'methodconnect=newgobject_signalsobjendclasscell_renderer_text_signalsobj=object(self)inherit[_]gobject_signals(obj:[>Gtk.cell_renderer_text]obj)methodedited=self#connectCellRendererText.S.editedendclasscell_renderer_textobj=objectinherit[Gtk.cell_renderer_text,cell_properties_text]cell_renderer_implobjmethodprivateparam=cell_renderer_text_param'methodset_fixed_height_from_font=CellRendererText.set_fixed_height_from_fontobjmethodconnect=newcell_renderer_text_signalsobjendclasscell_renderer_toggle_signalsobj=object(self)inherit[_]gobject_signals(obj:Gtk.cell_renderer_toggleobj)methodtoggled=self#connectCellRendererToggle.S.toggledendclasscell_renderer_toggleobj=objectinherit[Gtk.cell_renderer_toggle,cell_properties_toggle]cell_renderer_implobjmethodprivateparam=cell_renderer_toggle_param'methodconnect=newcell_renderer_toggle_signalsobjendclasscell_renderer_progressobj=objectinherit[Gtk.cell_renderer_progress,cell_properties_progress]cell_renderer_implobjmethodprivateparam=cell_renderer_progress_param'methodconnect=newgobject_signalsobjendclasscell_renderer_combo_signalsobj=object(self)inheritcell_renderer_text_signalsobjmethodchanged=self#connectCellRendererCombo.S.changedendclasscell_renderer_comboobj=objectinherit[Gtk.cell_renderer_combo,cell_properties_combo]cell_renderer_implobjmethodprivateparam=cell_renderer_combo_param'methodset_fixed_height_from_font=CellRendererText.set_fixed_height_from_fontobjmethodconnect=newcell_renderer_combo_signals(obj:>Gtk.cell_renderer_comboGtk.obj)endclasscell_renderer_accel_signals(obj:Gtk.cell_renderer_accelGtk.obj)=object(self)inherit[_]gobject_signalsobjmethodedited=self#connectCellRendererText.S.editedmethodaccel_edited=self#connectCellRendererAccel.S.accel_editedmethodaccel_cleared=self#connectCellRendererAccel.S.accel_clearedendclasscell_renderer_accelobj=objectinherit[Gtk.cell_renderer_accel,cell_properties_accel]cell_renderer_implobjmethodprivateparam=cell_renderer_accel_param'methodconnect=newcell_renderer_accel_signalsobjendletcell_renderer_pixbufl=newcell_renderer_pixbuf(CellRendererPixbuf.create(List.mapcell_renderer_pixbuf_param'l))letcell_renderer_textl=newcell_renderer_text(CellRendererText.create(List.mapcell_renderer_text_param'l))letcell_renderer_togglel=newcell_renderer_toggle(CellRendererToggle.create(List.mapcell_renderer_toggle_param'l))letcell_renderer_progressl=newcell_renderer_progress(CellRendererProgress.create(List.mapcell_renderer_progress_param'l))letcell_renderer_combol=newcell_renderer_combo(CellRendererCombo.create(List.mapcell_renderer_combo_param'l))letcell_renderer_accel(l:cell_properties_accellist)=newcell_renderer_accel(CellRendererAccel.create(List.mapcell_renderer_accel_param'l))classicon_view_signalsobj=object(self)inheritcontainer_signals_implobjinheritOgtkTreeProps.icon_view_sigsendclassicon_viewobj=objectinherit[[>Gtk.icon_view]]GContainer.container_implobjinheritOgtkTreeProps.icon_view_propsmethodconnect=newicon_view_signalsobjmethodevent=newGObj.event_opsobjmethodmodel=newmodel(Gobject.Property.get_someobjIconView.P.model)methodset_model(m:modeloption)=Gobject.setIconView.P.modelobj(Gaux.may_map(funm->m#as_model)m)methodset_markup_column(c:stringcolumn)=Gobject.setIconView.P.markup_columnobjc.indexmethodset_text_column(c:stringcolumn)=Gobject.setIconView.P.text_columnobjc.indexmethodset_pixbuf_column(c:GdkPixbuf.pixbufcolumn)=Gobject.setIconView.P.pixbuf_columnobjc.indexmethodget_path_at_pos=IconView.get_path_at_posobjmethodselected_foreach=IconView.selected_foreachobjmethodselect_path=IconView.select_pathobjmethodunselect_path=IconView.unselect_pathobjmethodpath_is_selected=IconView.path_is_selectedobjmethodget_selected_items=IconView.get_selected_itemsobjmethodselect_all()=IconView.select_allobjmethodunselect_all()=IconView.unselect_allobjmethoditem_activated=IconView.item_activatedobjendleticon_view?model=letmodel=Gaux.may_map(funm->m#as_model)modelinIconView.make_params?model[]~cont:(GContainer.pack_container~create:(funp->newicon_view(IconView.createp)))(* Custom models *)classtypevirtual['obj,'row,'a,'b,'c]custom_tree_model_type=objectinheritmodelvalobj:'objvaln_columns:intvalcolumns:Gobject.g_typearraymethodcustom_n_columns:intmethodcustom_get_column_type:int->Gobject.g_typemethodconnect:model_signals(** Signal emitters *)methodcustom_row_changed:Gtk.tree_path->'row->unitmethodcustom_row_deleted:Gtk.tree_path->unitmethodcustom_row_has_child_toggled:Gtk.tree_path->'row->unitmethodcustom_row_inserted:Gtk.tree_path->'row->unitmethodcustom_rows_reordered:Gtk.tree_path->'rowoption->intarray->unitmethodcustom_unref_node:'row->unitmethodcustom_ref_node:'row->unitmethodcustom_flags:GtkEnums.tree_model_flagslistmethodvirtualcustom_get_iter:Gtk.tree_path->'rowoptionmethodvirtualcustom_get_path:'row->Gtk.tree_pathmethodcustom_get_value:'row->int->Gobject.g_value->unitmethodvirtualcustom_value:'a.Gobject.g_type->'row->column:int->Gobject.basicmethodvirtualcustom_iter_children:'rowoption->'rowoptionmethodvirtualcustom_iter_has_child:'row->boolmethodvirtualcustom_iter_n_children:'rowoption->intmethodvirtualcustom_iter_next:'row->'rowoptionmethodvirtualcustom_iter_nth_child:'rowoption->int->'rowoptionmethodvirtualcustom_iter_parent:'row->'rowoptionmethodvirtualcustom_decode_iter:'a->'b->'c->'rowmethodvirtualcustom_encode_iter:'row->'a*'b*'cendclassvirtual['row,'a,'b,'c]custom_tree_model(column_list:column_list)=letobj=(GtkTree.CustomModel.create())inobject(self)inheritmodelobjmethodconnect=newmodel_signalsobjinherit['row,'a,'b,'c]GtkTree.CustomModel.callbackvaln_columns=List.lengthcolumn_list#typesvalcolumns=Array.of_listcolumn_list#typesmethodget~row:_~column:_=failwith"get not allowed on a custom model."methodcustom_n_columns=n_columnsmethodcustom_get_value(row:'row)(column:int)(value:Gobject.g_value)=Gobject.Value.initvalue(columns.(column));ifcolumn>=0&&column<n_columnsthenlet(#basicasvalue_to_set)=self#custom_valuecolumns.(column)row~columnintryGobject.Value.setvaluevalue_to_setwithFailure_->failwith("custom_value returned a value of incompatible type for column "^string_of_intcolumn^" of type "^(Gobject.Type.name(Gobject.Value.get_typevalue)))elseinvalid_arg("custom_get_value: invalid column id "^string_of_intcolumn)methodvirtualcustom_value:'a.Gobject.g_type->'row->column:int->Gobject.basicmethodcustom_get_column_typen:Gobject.g_type=if0<=n&&n<n_columnsthencolumns.(n)elseGobject.Type.of_fundamental`INVALIDmethodcustom_row_insertedpath(iter:'row)=CustomModel.custom_row_insertedobjpathitermethodcustom_row_changedpath(iter:'row)=CustomModel.custom_row_changedobjpathitermethodcustom_row_has_child_toggledpath(iter:'row)=CustomModel.custom_row_has_child_toggledobjpathitermethodcustom_row_deleted(path:Gtk.tree_path)=CustomModel.custom_row_deletedobjpathmethodcustom_rows_reorderedpath(iter_opt:'rowoption)new_order=CustomModel.custom_rows_reorderedobjpathiter_optnew_ordermethodcustom_flags:GtkEnums.tree_model_flagslist=[]initializerGtkTree.CustomModel.register_callbackobjself;column_list#lock();letid=Gobject.get_oidobjinHashtbl.addmodel_idsidcolumn_list#id;Hashtbl.addcustom_model_idscolumn_list#id();(* Invalidate all iterators before dying...*)Gc.finalise(funm->m#foreach(funp_->m#custom_row_deletedp;false))selfend