Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file grid_placement.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125typegrid_line=inttypet=|Auto(* Place item according to auto-placement algorithm *)|Lineofgrid_line(* Place item at specified line index *)|Named_lineofstring*int(* Place item at specified named line *)|Spanofint(* Item should span specified number of tracks *)|Named_spanofstring*int(* Item should span until nth line named <name> *)letauto=Autoletlineindex=Lineindexletspancount=Spancountletnamed_linenameindex=Named_line(name,index)letnamed_spannamecount=Named_span(name,count)letdefault=Autoletto_string=function|Auto->"auto"|Linen->string_of_intn|Named_line(name,n)->Printf.sprintf"%s %d"namen|Spann->Printf.sprintf"span %d"n|Named_span(name,n)->Printf.sprintf"span %s %d"namenletequalab=match(a,b)with|Auto,Auto->true|Linen1,Linen2->n1=n2|Named_line(name1,n1),Named_line(name2,n2)->String.equalname1name2&&n1=n2|Spann1,Spann2->n1=n2|Named_span(name1,n1),Named_span(name2,n2)->String.equalname1name2&&n1=n2|_->falseletcompareab=match(a,b)with|Auto,Auto->0|Auto,_->-1|_,Auto->1|Linen1,Linen2->Int.comparen1n2|Line_,_->-1|_,Line_->1|Named_line(name1,n1),Named_line(name2,n2)->letc=String.comparename1name2inifc<>0thencelseInt.comparen1n2|Named_line_,_->-1|_,Named_line_->1|Spann1,Spann2->Int.comparen1n2|Span_,_->-1|_,Span_->1|Named_span(name1,n1),Named_span(name2,n2)->letc=String.comparename1name2inifc<>0thencelseInt.comparen1n2letppfmtt=Format.pp_print_stringfmt(to_stringt)(* Check if placement is definite (has at least one non-auto placement) *)letis_definite=function|Linenwhenn<>0->true(* 0 is invalid and treated as Auto *)|Named_line_->true|_->false(* Convert grid placement to origin-zero placement, ignoring named lines *)letinto_origin_zero_placement_ignoring_namedtexplicit_track_count=matchtwith|Auto->Grid.Origin_zero_placement.Auto|Spanspan->Grid.Origin_zero_placement.Spanspan|Lineline->(* Grid line zero is an invalid index, so it gets treated as Auto *)ifline=0thenGrid.Origin_zero_placement.AutoelseGrid.Origin_zero_placement.Line(Grid.grid_line_to_origin_zero_linelineexplicit_track_count)|Named_line_->Grid.Origin_zero_placement.Auto|Named_span_->Grid.Origin_zero_placement.Auto(* Convert grid placement to origin-zero placement (named lines should already
be resolved) *)letinto_origin_zero_placementtexplicit_track_count=matchtwith|Auto->Grid.Origin_zero_placement.Auto|Spanspan->Grid.Origin_zero_placement.Spanspan|Lineline->(* Grid line zero is an invalid index, so it gets treated as Auto *)ifline=0thenGrid.Origin_zero_placement.AutoelseGrid.Origin_zero_placement.Line(Grid.grid_line_to_origin_zero_linelineexplicit_track_count)|Named_line_->failwith"into_origin_zero_placement: Named lines should be resolved before \
conversion"|Named_span_->failwith"into_origin_zero_placement: Named spans should be resolved before \
conversion"(* Module for operations on Line<GridPlacement> *)moduleLine=structletinto_origin_zero_ignoring_namedlineexplicit_track_count=letopenGeometry.Linein{start=into_origin_zero_placement_ignoring_namedline.startexplicit_track_count;end_=into_origin_zero_placement_ignoring_namedline.end_explicit_track_count;}letinto_origin_zerolineexplicit_track_count=letopenGeometry.Linein{start=into_origin_zero_placementline.startexplicit_track_count;end_=into_origin_zero_placementline.end_explicit_track_count;}letis_definiteline=match(line.Geometry.Line.start,line.Geometry.Line.end_)with|Linen,_whenn<>0->true|_,Linenwhenn<>0->true|Named_line_,_->true|_,Named_line_->true|_->falseend