The Trunk: Morphic-tpr.1038.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Morphic-tpr.1038.mcz

commits-2
tim Rowledge uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-tpr.1038.mcz

==================== Summary ====================

Name: Morphic-tpr.1038
Author: tpr
Time: 13 November 2015, 4:49:05.868 pm
UUID: 677751c2-0b1e-4ae5-ab35-183319ec6919
Ancestors: Morphic-mt.1037, Morphic-tpr.996

DockingBarMorph - don't allow editing of menu items unless a preference is set. It isn't something you want in a production application.
The squeak menu ought to be a DockingBarMenuMorph, not a plain menu morph.
MenuMorph>popUpAdjacentTo:forHand:from: misuses 'owner owner' instead of 'world'
Add option for dragged Morphs to tell the Hand that they handlewhat happens when being dragged; useful for dragging Morphs that take a long time to draw the shadow, or perhaps want to render quite differently etc.

=============== Diff against Morphic-mt.1037 ===============

Item was changed:
  ----- Method: DockingBarItemMorph>>mouseDown: (in category 'events') -----
  mouseDown: evt
  "Handle a mouse down event. Menu items get activated when the mouse is over them."
 
+ (evt shiftPressed and:[self wantsKeyboardFocusOnShiftClick]) ifTrue: [ ^super mouseDown: evt ].  "enable label editing"
- evt shiftPressed ifTrue: [ ^super mouseDown: evt ].  "enable label editing"
  isSelected
  ifTrue: [
  evt hand newMouseFocus: nil.
  owner selectItem: nil event: evt. ]
  ifFalse: [
  (self containsPoint: evt position) ifFalse: [ self halt ].
  owner activate: evt. "Redirect to menu for valid transitions"
  owner selectItem: self event: evt. ]
  !

Item was added:
+ ----- Method: DockingBarItemMorph>>wantsKeyboardFocusOnShiftClick (in category 'events') -----
+ wantsKeyboardFocusOnShiftClick
+ "set this preference to false to prevent user editing of docking bar menu items"
+ ^Preferences enable: #allowMenubarItemEditing!

Item was changed:
  ----- Method: DockingBarMorph class>>squeakMenu (in category 'samples') -----
  squeakMenu
  | menu |
+ menu := DockingBarMenuMorph new defaultTarget: self.
- menu := MenuMorph new defaultTarget: self.
  menu
  add: 'Hello'
  target: self
  selector: #inform:
  argument: 'Hello World!!'.
  menu
  add: 'Long Hello'
  target: self
  selector: #inform:
  argument: 'Helloooo World!!'.
  menu
  add: 'A very long Hello'
  target: self
  selector: #inform:
  argument: 'Hellooooooooooooooo World!!'.
  menu
  add: 'An incredible long Hello'
  target: self
  selector: #inform:
  argument: 'Hellooooooooooooooooooooooo World!!'.
  ^ menu!

Item was changed:
  ----- Method: HandMorph>>fullDrawOn: (in category 'drawing') -----
  fullDrawOn: aCanvas
  "A HandMorph has unusual drawing requirements:
  1. the hand itself (i.e., the cursor) appears in front of its submorphs
  2. morphs being held by the hand cast a shadow on the world/morphs below
  The illusion is that the hand plucks up morphs and carries them above the world."
 
  "Note: This version caches an image of the morphs being held by the hand for
  better performance. This cache is invalidated if one of those morphs changes."
 
  | disableCaching subBnds |
  self visible ifFalse: [^self].
  (aCanvas isVisible: self fullBounds) ifFalse: [^self].
  (self hasProperty: #errorOnDraw) ifTrue:[^self drawErrorOn: aCanvas].
  disableCaching := false.
  disableCaching
  ifTrue:
  [self nonCachingFullDrawOn: aCanvas.
  ^self].
  submorphs isEmpty
  ifTrue:
  [cacheCanvas := nil.
  ^self drawOn: aCanvas]. "just draw the hand itself"
+
+ "special handling of a single submorph that wants to do its own thing
+ when being dragged"
+ (submorphs size = 1
+ and: [submorphs first handledOwnDraggingBy: self on: aCanvas])
+ ifTrue: [^ self drawOn: aCanvas].
+
  subBnds := Rectangle merging: (submorphs collect: [:m | m fullBounds]).
  self updateCacheCanvas: aCanvas.
  (cacheCanvas isNil
  or: [cachedCanvasHasHoles and: [cacheCanvas depth = 1]])
  ifTrue:
  ["could not use caching due to translucency; do full draw"
 
  self nonCachingFullDrawOn: aCanvas.
  ^self].
 
  "draw the shadow"
  aCanvas asShadowDrawingCanvas translateBy: self shadowOffset
  during:
  [:shadowCanvas |
  cachedCanvasHasHoles
  ifTrue:
  ["Have to draw the real shadow of the form"
 
  shadowCanvas paintImage: cacheCanvas form at: subBnds origin]
  ifFalse:
  ["Much faster if only have to shade the edge of a solid rectangle"
 
  (subBnds areasOutside: (subBnds translateBy: self shadowOffset negated))
  do: [:r | shadowCanvas fillRectangle: r color: Color black]]].
 
  "draw morphs in front of the shadow using the cached Form"
  cachedCanvasHasHoles
  ifTrue: [aCanvas paintImage: cacheCanvas form at: subBnds origin]
  ifFalse:
  [aCanvas
  drawImage: cacheCanvas form
  at: subBnds origin
  sourceRect: cacheCanvas form boundingBox].
  self drawOn: aCanvas "draw the hand itself in front of morphs"!

Item was changed:
  ----- Method: MenuMorph>>popUpAdjacentTo:forHand:from: (in category 'control') -----
  popUpAdjacentTo: rightOrLeftPoint forHand: hand from: sourceItem
  "Present this menu at the given point under control of the given hand."
 
  | tryToPlace selectedOffset rightPoint leftPoint |
  hand world startSteppingSubmorphsOf: self.
  popUpOwner := sourceItem.
 
  self fullBounds.
  self updateColor.
 
  "ensure layout is current"
  selectedOffset := (selectedItem
  ifNil: [self items first]) position - self position.
  tryToPlace := [:where :mustFit | | delta |
  self position: where - selectedOffset.
  delta := self boundsInWorld amountToTranslateWithin: sourceItem worldBounds.
  (delta x = 0
  or: [mustFit])
  ifTrue: [delta = (0 @ 0)
  ifFalse: [self position: self position + delta].
+ sourceItem world addMorphFront: self.
- sourceItem owner owner addMorphFront: self.
  ^ self]].
  rightPoint := rightOrLeftPoint first + ((self layoutInset + self borderWidth) @ 0).
  leftPoint := rightOrLeftPoint last - ((self layoutInset + self borderWidth + self width) @ 0).
  tryToPlace
  value: rightPoint value: false;
  value: leftPoint value: false;
  value: rightPoint value: true.!

Item was added:
+ ----- Method: Morph>>handledOwnDraggingBy:on: (in category 'dropping/grabbing') -----
+ handledOwnDraggingBy: aHandMorph on: aCanvas
+ "this is my chance to do something differrent to the normal dragging work. return true if I did what I wanted, false if not"
+ ^false!