Marcel Taeumel uploaded a new version of ToolBuilder-Morphic to project The Trunk:
http://source.squeak.org/trunk/ToolBuilder-Morphic-mt.270.mcz ==================== Summary ==================== Name: ToolBuilder-Morphic-mt.270 Author: mt Time: 11 January 2021, 5:36:43.295446 pm UUID: 5171b75b-ee89-b14f-8ec9-a27cdfaa52bb Ancestors: ToolBuilder-Morphic-mt.269 To pluggable dialogs, add an expand button if the model supports #preferredExtent. Also tweaks a list-chooser's initial extent show 5 to 15 items which each about 10 to 20 characters, depending on the list's content. This commit addresses the concerns raised in ToolBuilder-Morphic-cbc.270 (inbox). See http://forum.world.st/The-Inbox-ToolBuilder-Morphic-cbc-270-mcz-tp5126045.html =============== Diff against ToolBuilder-Morphic-mt.269 =============== Item was changed: ----- Method: ListChooser>>buildWith: (in category 'building') ----- buildWith: builder | dialogSpec searchBarHeight listSpec fieldSpec | + searchBarHeight := self searchBarHeight. - searchBarHeight := Preferences standardDefaultTextFont height * 1.75. dialogSpec := builder pluggableDialogSpec new model: self; title: #title; closeAction: #closed; extent: self initialExtent; autoCancel: true; "Behave like a pop-up menu. Historical reasons." children: OrderedCollection new; buttons: OrderedCollection new; yourself. listSpec := builder pluggableListSpec new. listSpec model: self; list: #items; getIndex: #selectedIndex; setIndex: #selectedIndex:; doubleClick: #accept; "keystrokePreview: #keyStrokeFromList:;" autoDeselect: false; filterableList: true; clearFilterAutomatically: false; name: #list; frame: (LayoutFrame fractions: (0@0 corner: 1@1) offsets: (0@searchBarHeight corner: 0@0)). dialogSpec children add: listSpec. fieldSpec := builder pluggableInputFieldSpec new. fieldSpec model: self; name: #searchText ; getText: #searchText; editText: #searchText:; setText: #acceptText:; selection: #textSelection; menu: nil; indicateUnacceptedChanges: false; askBeforeDiscardingEdits: false; help: (self addAllowed ifTrue: ['Type new or filter existing...' translated] ifFalse: ['Type to filter existing...' translated]); frame: (LayoutFrame fractions: (0@0 corner: 1@0) offsets: (0@0 corner: 0@searchBarHeight)). dialogSpec children add: fieldSpec. "Buttons" dialogSpec buttons add: ( builder pluggableButtonSpec new model: self; label: #acceptLabel; action: #accept; enabled: #canAcceptOrAdd; color: #acceptColor). dialogSpec buttons add: ( builder pluggableButtonSpec new model: self; label: 'Cancel'; action: #cancel; color: #cancelColor). dialogMorph := builder build: dialogSpec. dialogMorph addKeyboardCaptureFilter: self ; positionOverWidgetNamed: #searchText. listMorph := builder widgetAt: #list. listMorph allowEmptyFilterResult: true. ^ dialogMorph! Item was changed: ----- Method: ListChooser>>initialExtent (in category 'building') ----- initialExtent + | listFont itemCount maxItemSize cellSize | - | listFont | listFont := Preferences standardListFont. + itemCount := items size. + maxItemSize := items inject: 0 into: [:max :item | max max: item size]. + cellSize := (listFont widthOf: $m) @ listFont height. + + ^ ((maxItemSize + 1 "breathing space" min: 20 max: 10) + @ (itemCount + 1 "breathing space" min: 15 max: 5) + * cellSize) + (0@ self searchBarHeight)! - ^ (20 * (listFont widthOf: $m))@(15 * listFont height)! Item was added: + ----- Method: ListChooser>>preferredExtent (in category 'building') ----- + preferredExtent + + | listFont cellSize | + listFont := Preferences standardListFont. + cellSize := (listFont widthOf: $m) @ listFont height. + + ^ ((items inject: 0 into: [:max :item | max max: (listFont widthOfString: item)]) + @ (items size * listFont height)) + + ((1@1) * cellSize) "breathing space" + + (0@ self searchBarHeight)! Item was added: + ----- Method: ListChooser>>searchBarHeight (in category 'building') ----- + searchBarHeight + + ^ Preferences standardDefaultTextFont height * 1.75! Item was changed: ----- Method: ListMultipleChooser>>initialExtent (in category 'toolbuilder') ----- initialExtent + | listFont itemCount maxItemSize cellSize | - | listFont | listFont := Preferences standardListFont. + itemCount := labels size. + maxItemSize := labels inject: 0 into: [:max :item | max max: item size]. + cellSize := (listFont widthOf: $m) @ listFont height. + + ^ ((maxItemSize + 1 "breathing space" min: 20 max: 10) + @ (itemCount + 1 "breathing space" min: 15 max: 5) + * cellSize)! - ^ (20 * (listFont widthOf: $m))@(15 * listFont height)! Item was added: + ----- Method: ListMultipleChooser>>preferredExtent (in category 'toolbuilder') ----- + preferredExtent + + | listFont cellSize | + listFont := Preferences standardListFont. + cellSize := (listFont widthOf: $m) @ listFont height. + + ^ ((labels inject: 0 into: [:max :item | max max: (listFont widthOfString: item)]) + @ (labels size * listFont height)) + + ((1@1) * cellSize) "breathing space"! Item was changed: ----- Method: MorphicToolBuilder>>buildPluggableDialog: (in category 'widgets optional') ----- buildPluggableDialog: aSpec | widget | widget := self dialogClass new. self register: widget id: aSpec name. widget model: aSpec model. "Set child dependent layout properties. The pane morph holds the special contents." widget paneMorph wantsPaneSplitters: (aSpec wantsResizeHandles ifNil: [true]). self setLayoutHintsFor: widget paneMorph spec: aSpec. widget paneMorph layoutInset: (aSpec padding ifNil: [ProportionalSplitterMorph gripThickness]). widget paneMorph cellGap: (aSpec spacing ifNil: [ProportionalSplitterMorph gripThickness]). widget paneMorph wantsPaneSplitters ifTrue: [ widget paneMorph addCornerGrips"addEdgeGrips". widget paneMorph grips do: [:ea | ea showHandle: true]]. "Now create the children." panes := OrderedCollection new. aSpec children isSymbol ifTrue: [ widget getChildrenSelector: aSpec children. widget update: aSpec children] ifFalse: [ self buildAll: aSpec children in: widget paneMorph]. "Now create the buttons." aSpec buttons isSymbol ifTrue: [ widget getButtonsSelector: aSpec buttons. widget update: aSpec buttons] ifFalse: [ self buildAll: aSpec buttons in: widget buttonRowMorph. widget updateButtonProperties]. aSpec title ifNotNil: [:label | label isSymbol ifTrue:[widget getTitleSelector: label; update: label] ifFalse:[widget title: label]]. aSpec message ifNotNil: [:label | label isSymbol ifTrue:[widget getMessageSelector: label; update: label] ifFalse:[widget message: label]]. "Interaction behavior." aSpec autoCancel ifNotNil: [:b | widget autoCancel: b]. aSpec exclusive ifNotNil: [:b | widget exclusive: b]. widget closeDialogSelector: aSpec closeAction. self buildHelpFor: widget spec: aSpec. "Everything is shrink-wrapped around the pane morph." + widget paneMorph extent: (aSpec extent ifNil:[widget initialExtent]) + + (widget paneMorph layoutInset * 2) asPoint. - widget paneMorph extent: (aSpec extent ifNil:[widget initialExtent]). ^ widget! Item was added: + ----- Method: PluggableDialogWindow>>createTitle: (in category 'initialization') ----- + createTitle: aString + "Overridden to add an extra expand button. Yet, it depends on the model's interface whether that button will be visible. See #model:." + + | box expandButton| + super createTitle: aString. + + expandButton := SystemWindowButton new + name: #expandButton; + color: Color transparent; + target: self; + actionSelector: #expandDialogPane; + balloonText: 'Expand this dialog' translated; + borderWidth: 0; + yourself. + SystemWindow expandBoxImage scaleIconToDisplay in: [:icon | + expandButton labelGraphic: icon; extent: icon extent]. + + box := self submorphNamed: #title. + box addMorphBack: expandButton.! Item was added: + ----- Method: PluggableDialogWindow>>expandDialogPane (in category 'running') ----- + expandDialogPane + "Expand the dialog pane to its preferred extent. Honor the visible area in the world." + + | visibleArea decorationOffset expandedExtent | + visibleArea := self currentWorld visibleClearArea. + decorationOffset := self extent - self paneMorph extent. + expandedExtent := self model preferredExtent + (self paneMorph layoutInset * 2) asPoint. + + self paneMorph extent: (expandedExtent min: visibleArea extent - decorationOffset). + + self fullBounds. + self moveToPreferredPosition.! Item was changed: ----- Method: PluggableDialogWindow>>model: (in category 'accessing') ----- + model: newModel - model: anObject model ifNotNil: [model removeDependent: self]. + newModel ifNotNil: [ + newModel addDependent: self. + (newModel respondsTo: #preferredExtent) + ifFalse: [((self submorphNamed: #title) submorphNamed: #expandButton) delete]]. + model := newModel.! - anObject ifNotNil: [anObject addDependent: self]. - model := anObject.! |
|
Close. I'd still like to try and make it wide for the strings provided. Note that : width := ((items take: 15) collect: [:item| listFont widthOfString: item]) max. "A good estimate of what is needed in the list box width" works for both string and Text. That said, we should still have 2 bounds - one for width of world (dialog will build bigger than the world - not good) and lower bound for the size of the buttons - it would be nice not to stack the Choose/Cancel button. For the height - what you have is better than what I had - that part I like. On Mon, Jan 11, 2021 at 8:38 AM Marcel Taeumel <[hidden email]> wrote:
|
Would my current version 271 in the inbox be acceptable? -cbc On Mon, Jan 11, 2021 at 9:48 AM Chris Cunningham <[hidden email]> wrote:
|
Hi Chris. > Would my current version 271 in the inbox be acceptable? Not quite: - If you want to make use of horizontal scroll bars in such lists, please disable the preference "Always hise h scroll bar" - An initial world bounds check should be added to DialogWindow, not the dialog's model. I will do that. It is missing. - That "defaultCellWidthIndex" and "listBoxBoundaryLineSize" do not belong into the model. Not sure what you want to achieve here. The use of "searchBarHeight" is a compromise due to #buildWidth:. > it would be nice not to stack the Choose/Cancel button. Yeah, that's tricky. Buttons should not be stacked if there is enough width. There is an issue with HI-DPI usabge, though. But also we need a stacking logic for some ancient uses of list choose for yes/no/cancel. > That said, we should still have 2 bounds - one for width of world (dialog will build bigger than the world - not good) and lower bound for the size of the buttons. Agreed for the world bounds, disagreed for the buttons. Sorry about that button wrapping. It's due to some ancient but expected uses of list-choosers for yes/no/cancel. Maybe I can find a better solution in the future to avoid unnecessary button wraps. :-/ Best, Marcel
|
Free forum by Nabble | Edit this page |