import { DOMSource , VNode } from '@cycle/dom' ; import { List , Set } from 'immutable' ; import { MemoryStream , Stream } from 'xstream' ; import Action from './actions' ; import { DialogRequest , FileStat } from './makeFileDriver' ; import { KeyboardSource } from './makeKeyboardDriver' ; import AdjustedMouse from './utils/AdjustedMouse' ; import AppHistory , { emptyAction } from './utils/AppHistory' ; import ImgItem from './utils/ImgItem' ; import PolygonItem from './utils/PolygonItem' ; import PolylineItem from './utils/PolylineItem' ; import Sem from './utils/Sem' ; import State , { SelMode } from './utils/State' ; import UIClass , { UIIntent } from './utils/UI' ; export { AppHistory , UIIntent , Action , emptyAction , SelMode , State , PolygonItem , PolylineItem , ImgItem , } ; export interface Point { readonly x : number ; readonly y : number ; } export interface Rect { readonly x : number ; readonly y : number ; readonly width : number ; readonly height : number ; } export interface Updater < T , S = null > { ( t , s ? ) : T ; } export interface ItemMethods { render ( config ) : VNode ; getVertices ( ) : List < Point > ; containsPoint ( p ) : boolean ; move ( dx , dy ) : this ; resize ( anchor , config , startPos , endPos ) : this ; toJS ( ) : any ; supportEditVertex ( ) : boolean ; insertVertex ? ( insertIndex , p ) : this ; deleteVertex ? ( vertexIndex ) : this ; moveVertex ? ( vertexIndex , dx , dy ) : this ; getShortDescription ( ) : string ; } export type CommonRecordUpdaters = RecordUpdater < 'id' , number > & RecordUpdater < 'locked' , boolean > & RecordUpdater < 'opacity' , number > & RecordUpdater < 'sem' , Sem > ; export type Item = ( PolygonItem | PolylineItem | ImgItem ) & CommonRecordUpdaters & ItemMethods ; export interface RecordUpdater < K , V > { set ( key , value ) : this ; update ( key , fn ) : this ; merge ( ... args ) : this ; } export type ItemId = number ; export type NodeId = number ; export interface ResizeDirConfig { h : boolean ; v : boolean ; } export interface ComponentSources { DOM : DOMSource ; UI : UIClass ; svgDOMRect : MemoryStream < DOMRect > ; config : MemoryStream < AppConfig > ; clipboard : MemoryStream < Item > ; mouse : AdjustedMouse ; mode : MemoryStream < string > ; state : MemoryStream < State > ; keyboard : KeyboardSource ; FILE : Stream < FileStat > ; polygonCloseIndicator : MemoryStream < VNode > ; working : Partial < { editing : MemoryStream < Set < ItemId > > ; drawing : MemoryStream < Item > ; } > ; } export interface ComponentSinks { DOM : Stream < VNode > ; action : Stream < Action > ; nextMode : Stream < string > ; nextConfig : Stream < AppConfig > ; nextClipboard : Stream < Item > ; nextWorking : Partial < { editing : Stream < Set < ItemId > > ; drawing : Stream < Item > ; } > ; nextVertexIndex : Stream < any > ; nextVertexInsertIndex : Stream < any > ; nextAdjustConfigs : Stream < AdjustConfig [ ] > ; nextResizer : Stream < string > ; nextPolygonCloseIndicator : Stream < VNode > ; SAVE : Stream < SaveConfig > ; FILE : Stream < File | DialogRequest > ; } export interface Component { ( sources ) : Partial < ComponentSinks > ; } export interface SaveConfig { blob : Blob ; filename ? : string ; } export type AdjustConfig = AdjustConfigCement | AdjustConfigAlign | AdjustConfigRestrict ; export interface AdjustConfigCement { type : 'cement' ; include ? : Point [ ] ; exclude ? : Point [ ] ; } export interface AdjustConfigAlign { type : 'align' ; include ? : Point [ ] ; exclude ? : Point [ ] ; } export interface AdjustConfigRestrict { type : 'restrict' ; anchor : Point ; } export interface AdjustResult { point : Point ; applied : string [ ] ; ensure : ( p : Point ) => boolean ; info ? : AdjustResultExtraInfo ; } export type AdjustResultExtraInfo = Partial < { horizontalPoint : Point ; verticalPoint : Point ; } > ; export interface AppConfig { meta : { type : 'editor-config' ; version : 0.7 ; } ; minScale : number ; maxScale : number ; fontSize : number ; senseRange : number ; semantics : { tags : SemanticTagConfig [ ] ; } ; } export interface SemanticTagConfig { name : string ; styles : { fill ? : string ; stroke ? : string ; strokeWdith ? : number ; } ; }