Works as follows:
Functions undo, redo unapply, re-apply all changes at once.
obj method canvaseditor numericDialog {} { $self memory before [$self undoRedoCode] $self basicBindings off $self statusLine Numerical input set dialogWin [my canvas].numeric destroy $dialogWin toplevel $dialogWin wm resizable $dialogWin no no wm transient $dialogWin [winfo toplevel [my canvas]] wm title $dialogWin Numerical bind $dialogWin <Enter> "$self selected blink off" bind $dialogWin <Leave> "$self selected blink on" bind $dialogWin <Escape> "destroy $dialogWin" # bind $dialogWin <Destroy> [list apply [list self { $self memory after [$self undoRedoCode] $self initUndoRedo [$self memory before] [$self memory after] $self basicBindings on $self selected blink on }] $self] # grid\ [label $dialogWin.widthLabel -text Width -anchor w -justify left]\ [entry $dialogWin.width]\ [label $dialogWin.widthComment -anchor w -justify left -text\ "Floating point calc allowed,"]\ -\ -sticky news bind $dialogWin.width <Return> [list apply { {self dialogWin} { lassign\ [$self adjustSelWidthHeightNumeric width [$dialogWin.width get]]\ x y $dialogWin.width delete 0 end $dialogWin.width insert end $x } } $self $dialogWin] # grid\ [label $dialogWin.heightLabel -text Height -anchor w -justify left]\ [entry $dialogWin.height]\ [label $dialogWin.heightComment -anchor w -justify left -text\ "e. g. 4.0/3.0"]\ -\ -sticky news bind $dialogWin.height <Return> [list apply { {self dialogWin} { lassign\ [$self adjustSelWidthHeightNumeric height [$dialogWin.height get]]\ x y $dialogWin.height delete 0 end $dialogWin.height insert end $y } } $self $dialogWin] # Move horizontal grid\ [label $dialogWin.movHorL -text "Move horizontal" -anchor w -justify left]\ [entry $dialogWin.movHor]\ [label $dialogWin.movHorComment\ -text "Number, or left, right, Left, Right" -anchor w -justify left]\ -\ -sticky news bind $dialogWin.movHor <Return> [list apply { {self entry} { set val [$entry get] if {[string is double -strict $val]} then { lmap dot [$self dots -selected] { $dot configure -x [+ [$dot cget -x] $val] } } else { switch -exact -- $val { left { lassign [$self bbox] left lmap dot [$self dots -selected] { $dot configure -x [- [$dot cget -x] $left] } } Left { set left [min {*}[$self dots -selected cget -x]] lmap dot [$self dots -selected] { $dot configure -x [- [$dot cget -x] $left] } } right { lassign [$self bbox] - - right set delta [- [$self setting width] $right] lmap dot [$self dots -selected] { $dot configure -x [+ [$dot cget -x] $delta] } } Right { set right [max {*}[$self dots -selected cget -x]] set delta [- [$self setting width] $right] lmap dot [$self dots -selected] { $dot configure -x [+ [$dot cget -x] $delta] } } default { return -code error\ "Only number, or left, right, Left, Right!" } } } $self selected draw coords } } $self $dialogWin.movHor] # Move vertical grid\ [label $dialogWin.movVerL -text "Move vertical" -anchor w -justify left]\ [entry $dialogWin.movVer]\ [label $dialogWin.movVerComment\ -text "Number, or top, bottom, Top, Bottom" -anchor w -justify left]\ -\ -sticky news bind $dialogWin.movVer <Return> [list apply { {self entry} { set val [$entry get] if {[string is double -strict $val]} then { lmap dot [$self dots -selected] { $dot configure -y [+ [$dot cget -y] $val] } } else { switch -exact -- $val { top { lassign [$self bbox] - top lmap dot [$self dots -selected] { $dot configure -y [- [$dot cget -y] $top] } } Top { set top [min {*}[$self dots -selected cget -y]] lmap dot [$self dots -selected] { $dot configure -y [- [$dot cget -y] $top] } } bottom { lassign [$self bbox] - - - bottom set delta [- [$self setting height] $bottom] lmap dot [$self dots -selected] { $dot configure -y [+ [$dot cget -y] $delta] } } Bottom { set bottom [max {*}[$self dots -selected cget -y]] set delta [- [$self setting height] $bottom] lmap dot [$self dots -selected] { $dot configure -y [+ [$dot cget -y] $delta] } } default { return -code error\ "Only number, or top, bottom, Top, Bottom!" } } } $self selected draw coords } } $self $dialogWin.movVer] set widthHeightLambda { {self dialogWin} { lassign [$self adjustSelWidthHeightNumeric] x y $dialogWin.width delete 0 end $dialogWin.width insert end $x $dialogWin.height delete 0 end $dialogWin.height insert end $y } } apply $widthHeightLambda $self $dialogWin # grid\ [label $dialogWin.scaleLabel -text Scale -anchor w -justify left]\ [entry $dialogWin.scale]\ [label $dialogWin.scaleComment -anchor w -justify left\ -text "One or two values, comma separated"]\ -\ -sticky news bind $dialogWin.scale <Return> [list apply [list {self win} { lassign [split [$win get] ,] width height set width [fexpr $width] if {$height eq ""} then { set height $width } else { set height [fexpr $height] } $self scaleSelectionNumeric $width $height $self memory scale [$win get] }] $self $dialogWin.scale] bind $dialogWin.scale <Return>\ +[list apply $widthHeightLambda $self $dialogWin] # grid\ [label $dialogWin.rotLabel -text Rotate -anchor w -justify left]\ [entry $dialogWin.rot]\ [label $dialogWin.rotComment -anchor w -justify left\ -text "Floating point calc allowed"]\ -\ -sticky news if {"angle" in [dict keys [$self memory]]} then { $dialogWin.rot insert end [$self memory angle] } bind $dialogWin.rot <Return> [list apply { {self win} { set val [expr [$win get]] $self rotateSelectionNumeric $val $self memory angle [$win get] } } $self $dialogWin.rot] bind $dialogWin.rot <Return>\ +[list apply $widthHeightLambda $self $dialogWin] # if {"scale" in [dict keys [$self memory]]} then { $dialogWin.scale insert end [$self memory scale] } # grid\ [label $dialogWin.fColLabel -text "Fill Color" -anchor w -justify left]\ [entry $dialogWin.fColor]\ [button $dialogWin.fBrighten -text Brighten\ -command "$self selected brighten fill 1.1"]\ [button $dialogWin.fDarken -text Darken\ -command "$self selected brighten fill 0.97"]\ -sticky news $dialogWin.fColor insert end [my lastFillColor] bind $dialogWin.fColor <Return> [list apply { {self win} { if {[$win get] in {{} transparent}} then { $self selected changeFillColor transparent } else { winfo rgb . [$win get] $self selected changeFillColor [$win get] $self private lastFillColor [$win get] } } } $self $dialogWin.fColor] # grid\ [label $dialogWin.lColLabel -text "Line Color" -anchor w -justify left]\ [entry $dialogWin.lColor]\ [button $dialogWin.lBrighten -text Brighten\ -command "$self selected brighten outline 1.1"]\ [button $dialogWin.lDarken -text Darken\ -command "$self selected brighten outline 0.97"]\ -sticky news $dialogWin.lColor insert end [my lastLineColor] bind $dialogWin.lColor <Return> [list apply { {self win} { if {[$win get] in {{} transparent}} then { $self selected changeLineColor transparent } else { winfo rgb . [$win get] $self selected changeLineColor [$win get] $self private lastLineColor [$win get] } } } $self $dialogWin.lColor] # grid\ [label $dialogWin.lWidthLabel -text "Line width" -anchor w -justify left]\ [entry $dialogWin.lWidth]\ [button $dialogWin.lWiden -text Widen\ -command "$self selected wider [expr {2**(1.0/3)}]"]\ [button $dialogWin.lNarrow -text Narrow\ -command "$self selected wider [expr {2**(-1.0/3)}]"]\ -sticky news $dialogWin.lWidth insert end 3.0 bind $dialogWin.lWidth <Return> [list apply { {self win} { $self selected changeLineWidth [expr [$win get]] } } $self $dialogWin.lWidth] adjustChildGeometry $dialogWin }
© Wolf-Dieter Busch | Home | Sitemap | Urheber | A-Z