StrokeView.st
author Jan Vrany <jan.vrany@labware.com>
Fri, 02 Sep 2022 11:25:39 +0100
branchjv
changeset 6261 9b7eb7159d29
parent 4770 6634b540fea2
permissions -rw-r--r--
Fix loong standing bug with some menus not being translated / resolved This has happened with browser "View" menu when sometimes it had the slice resolved and sometimes not. It turned out that it was because the code disabled resources (and therefore slices) resolution when processing shortcuts, so the menu was created and cached unresolved. This fixes the issue. eXept apparently run into the same problem.

"{ Package: 'stx:libwidg2' }"

"{ NameSpace: Smalltalk }"

View subclass:#StrokeView
	instanceVariableNames:'strokes currentStroke lastPoint clearButton clearLastButton
		strokeAction'
	classVariableNames:''
	poolDictionaries:''
	category:'Views-Special'
!

!StrokeView class methodsFor:'documentation'!

documentation
"
    a simple view, which collects strokes.
    will eventually become a character-input method
    for non-latin languages.
"
!

examples
"
        |v|

        v := StrokeView open.
        v inspect.



        |v|

        v := StrokeView openOnXScreenNamed:'bitsy:0'.    ' my pda !!!! '.
        v inspect.
"
! !

!StrokeView methodsFor:'accessing'!

strokeAction:something
    strokeAction := something.
! !

!StrokeView methodsFor:'button actions'!

newStrokeSequence
    strokes removeAll.
    currentStroke := lastPoint := nil.
    self updateButtonStates.
    self redraw.

    strokeAction notNil ifTrue:[
        strokeAction value:strokes.
    ]
!

removeLastStroke
    strokes size > 0 ifTrue:[
        strokes removeLast.
    ].

    currentStroke := lastPoint := nil.
    self updateButtonStates.
    self redraw.

    strokeAction notNil ifTrue:[
        strokeAction value:strokes.
    ]
!

updateButtonStates
    strokes isEmpty ifTrue:[
        clearButton disable.
        clearLastButton disable.
    ] ifFalse:[
        clearButton enable.
        clearLastButton enable.
    ]
! !

!StrokeView methodsFor:'event handling'!

buttonMotion:state x:x y:y
    |thisPoint|

    state == 0 ifTrue:[^ self].

    thisPoint := x@y.
    currentStroke add:(LineSegment from:lastPoint to:thisPoint).

    self paint:Color yellow.
    self displayLineFrom:lastPoint to:thisPoint.

    lastPoint := thisPoint.
!

buttonPress:state x:x y:y
    currentStroke isNil ifTrue:[
        currentStroke := OrderedCollection new.
    ].
    lastPoint := x@y.
!

buttonRelease:state x:x y:y
    currentStroke notNil ifTrue:[
        strokes add:currentStroke.
        currentStroke := nil.
        self updateButtonStates.
        self redrawStrokes.
        strokeAction notNil ifTrue:[
            strokeAction value:strokes.
        ]
    ].
! !

!StrokeView methodsFor:'initialization'!

drawStroke:aStroke
    aStroke do:[:eachSegment |
        self displayLineFrom:(eachSegment start) to:(eachSegment end).
    ].
!

initialize
    super initialize.

    self viewBackground:Color black.

    strokes := OrderedCollection new.

    clearButton := self newButton2D.
    clearButton label:'Clear'.
    clearButton layout:(LayoutFrame
                            leftFraction:0 offset:0 
                            rightFraction:0.5 offset:0
                            topFraction:1 offset:-20
                            bottomFraction:1 offset:0).

    clearButton action:[ self newStrokeSequence ].
    clearButton disable.

    clearLastButton := self newButton2D.
    clearLastButton label:'Undo'.
    clearLastButton layout:(LayoutFrame
                            leftFraction:0.5 offset:0 
                            rightFraction:1 offset:0
                            topFraction:1 offset:-20
                            bottomFraction:1 offset:0).

    clearLastButton action:[ self removeLastStroke ].
    clearLastButton disable.
!

newButton2D
    |button|

    "
     Times Are a'Changing -
        now it takes more effort to setup a 2D button,
        than to set up a 3D one ;-)"

    button := Button in:self.
    button passiveLevel:0.
    button activeLevel:0.
    button borderWidth:1.
    button borderColor:(Color black).
    button foregroundColor:(Color black).
    button backgroundColor:(Color white).
    ^ button
!

redraw
    self clear.
    self redrawStrokes.
!

redrawStrokes
    self paint:Color cyan.
    strokes do:[:eachStroke |
        self drawStroke:eachStroke
    ].

    self paint:Color yellow.
    currentStroke notNil ifTrue:[
        self drawStroke:currentStroke
    ].
! !

!StrokeView class methodsFor:'documentation'!

version
    ^ '$Header: /cvs/stx/stx/libwidg2/StrokeView.st,v 1.3 2004-03-02 08:44:45 cg Exp $'
! !