Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-mt.1548.mcz ==================== Summary ==================== Name: Morphic-mt.1548 Author: mt Time: 30 September 2019, 10:29:19.20171 am UUID: 0cf91407-3c2e-724d-b444-6986a9ca91a7 Ancestors: Morphic-mt.1547 Some improvements for multi-selection lists: - hit [space] key to toggle selection - draw the current "selection" as outline to recognize multi-selection state - do not reset current "selection" to 0 when deselecting a row in the multi-selection state --- to better support keyboard navigation and [space] =============== Diff against Morphic-mt.1547 =============== Item was changed: ----- Method: LazyListMorph>>drawBackgroundForMulti:on: (in category 'drawing') ----- drawBackgroundForMulti: row on: aCanvas "shade the background paler, if this row is selected, but not the current selected row" | selectionDrawBounds | - selectedRow = row ifTrue: [^ self]. selectionDrawBounds := self drawBoundsForRow: row. selectionDrawBounds := selectionDrawBounds intersect: self bounds. aCanvas fillRectangle: selectionDrawBounds color: self multiSelectionColor! Item was changed: ----- Method: LazyListMorph>>drawOn: (in category 'drawing') ----- drawOn: aCanvas | topRow bottomRow | listItems ifEmpty: [ ^self ]. self drawPreSelectionOn: aCanvas. topRow := self topVisibleRowForCanvas: aCanvas. bottomRow := self bottomVisibleRowForCanvas: aCanvas. "Draw multi-selection." + listSource hasMultiSelection ifTrue: [ + topRow to: bottomRow do: [ :row | + (listSource itemSelectedAmongMultiple: row) ifTrue: [ + self drawBackgroundForMulti: row on: aCanvas ] ] ]. - topRow to: bottomRow do: [ :row | - (listSource itemSelectedAmongMultiple: row) ifTrue: [ - self drawBackgroundForMulti: row on: aCanvas ] ]. self drawSelectionOn: aCanvas. "Draw hovered row if preference enabled." PluggableListMorph highlightHoveredRow ifTrue: [ listSource hoverRow > 0 ifTrue: [ self highlightHoverRow: listSource hoverRow on: aCanvas ] ]. "Draw all visible rows." topRow to: bottomRow do: [ :row | self display: (self item: row) atRow: row on: aCanvas ]. "Finally, highlight drop row for drag/drop operations.." listSource potentialDropRow > 0 ifTrue: [ self highlightPotentialDropRow: listSource potentialDropRow on: aCanvas ].! Item was changed: ----- Method: LazyListMorph>>drawSelectionFor:withColor:on: (in category 'drawing') ----- drawSelectionFor: index withColor: color on: aCanvas | selectionDrawBounds fill | index ifNil: [ ^self ]. index = 0 ifTrue: [ ^self ]. selectionDrawBounds := self drawBoundsForRow: index. selectionDrawBounds := selectionDrawBounds intersect: self bounds. fill := color isColor ifTrue: [SolidFillStyle color: color] ifFalse: [color]. fill isGradientFill ifTrue: [ fill origin: selectionDrawBounds topLeft. fill direction: 0@ selectionDrawBounds height]. + listSource hasMultiSelection + ifFalse: [aCanvas fillRectangle: selectionDrawBounds fillStyle: fill] + ifTrue: [aCanvas frameRectangle: selectionDrawBounds color: fill asColor] .! - aCanvas fillRectangle: selectionDrawBounds fillStyle: fill.! Item was added: + ----- Method: PluggableListMorph>>hasMultiSelection (in category 'testing') ----- + hasMultiSelection + + ^ false! Item was added: + ----- Method: PluggableListMorphOfMany>>basicKeyPressed: (in category 'model access') ----- + basicKeyPressed: aCharacter + + aCharacter = Character space + ifTrue: [self specialKeyPressed: aCharacter asciiValue] + ifFalse: [super basicKeyPressed: aCharacter].! Item was added: + ----- Method: PluggableListMorphOfMany>>hasMultiSelection (in category 'testing') ----- + hasMultiSelection + + ^ true! Item was changed: ----- Method: PluggableListMorphOfMany>>mouseDown: (in category 'event handling') ----- mouseDown: event + | row index | - | oldIndex oldVal row index | event yellowButtonPressed ifTrue: [^ self yellowButtonActivity: event shiftPressed]. row := self rowAtLocation: event position. row = 0 ifTrue: [^super mouseDown: event]. index := self modelIndexFor: row. model okToChange ifFalse: [^ self]. "No change if model is locked" + self changeModelSelection: index. - "Set meaning for subsequent dragging of selection" - dragOnOrOff := (self listSelectionAt: index) not. - oldIndex := self getCurrentSelectionIndex. - oldIndex ~= 0 ifTrue: [oldVal := self listSelectionAt: oldIndex]. + "Set meaning for subsequent dragging of selection" + self + listSelectionAt: index + put: (dragOnOrOff := (self listSelectionAt: index) not) - "Set or clear new primary selection (listIndex)" - dragOnOrOff - ifTrue: [self changeModelSelection: index] - ifFalse: [self changeModelSelection: 0]. - - "Need to restore the old one, due to how model works, and set new one." - oldIndex ~= 0 ifTrue: [self listSelectionAt: oldIndex put: oldVal]. - self listSelectionAt: index put: dragOnOrOff. - "event hand releaseMouseFocus: aMorph." ! Item was changed: ----- Method: PluggableListMorphOfMany>>mouseMove: (in category 'event handling') ----- mouseMove: event "The mouse has moved, as characterized by the event provided. Adjust the scrollbar, and alter the selection as appropriate" + | row index | - | oldIndex oldVal row index | event position y < self top ifTrue: [scrollBar scrollUp: 1. row := self rowAtLocation: scroller topLeft + (1 @ 1)] ifFalse: [row := event position y > self bottom ifTrue: [scrollBar scrollDown: 1. self rowAtLocation: scroller bottomLeft + (1 @ -1)] ifFalse: [ self rowAtLocation: event position]]. row = 0 ifTrue: [^super mouseDown: event]. index := self modelIndexFor: row. model okToChange ifFalse: [^self]. "No change if model is locked" + dragOnOrOff ifNil: [ + "Was not set at mouse down, which means the mouse must have gone down in an area where there was no list item" + dragOnOrOff := (self listSelectionAt: index) not]. - dragOnOrOff ifNil: - ["Was not set at mouse down, which means the mouse must have gone down in an area where there was no list item" - dragOnOrOff := (self listSelectionAt: index) not]. + self changeModelSelection: index. + self listSelectionAt: index put: dragOnOrOff.! - "Set meaning for subsequent dragging of selection" - oldIndex := self getCurrentSelectionIndex. - oldIndex ~= 0 ifTrue: [oldVal := self listSelectionAt: oldIndex]. - - "Set or clear new primary selection (listIndex)" - dragOnOrOff - ifTrue: [self changeModelSelection: index] - ifFalse: [self changeModelSelection: 0]. - - "Need to restore the old one, due to how model works, and set new one." - oldIndex ~= 0 ifTrue: [self listSelectionAt: oldIndex put: oldVal]. - self listSelectionAt: index put: dragOnOrOff. - ! Item was added: + ----- Method: PluggableListMorphOfMany>>specialKeyPressed: (in category 'model access') ----- + specialKeyPressed: asciiValue + + asciiValue = Character space asciiValue + ifTrue: [ | index | + index := self getCurrentSelectionIndex. + self + listSelectionAt: index + put: ((self listSelectionAt: index) not). + ^ self]. + + super specialKeyPressed: asciiValue.! |
|
Free forum by Nabble | Edit this page |