Sync. last work.

This commit is contained in:
Offray Vladimir Luna Cárdenas 2019-11-09 11:43:48 +00:00
parent c6d346eea8
commit 18a3192e44
4 changed files with 281 additions and 31 deletions

View File

@ -13,8 +13,13 @@ Class {
#superclass : #Object, #superclass : #Object,
#instVars : [ #instVars : [
'header', 'header',
'created',
'edited',
'headers', 'headers',
'key', 'key',
'id',
'selected',
'expanded',
'icon', 'icon',
'body', 'body',
'tags', 'tags',
@ -102,7 +107,10 @@ GrafoscopioNode >> addNode: aNode [
GrafoscopioNode >> addNodeAfterMe [ GrafoscopioNode >> addNodeAfterMe [
"Adds a generic node after the given node so they become slibings of the same parent" "Adds a generic node after the given node so they become slibings of the same parent"
| genericNode | | genericNode |
genericNode := self class new header: 'newNode'; body: ''. genericNode := self class new
created: DateAndTime now printString;
header: 'newNode';
body: ''.
self parent children add: genericNode after: self. self parent children add: genericNode after: self.
genericNode parent: self parent. genericNode parent: self parent.
genericNode level: self level. genericNode level: self level.
@ -182,6 +190,17 @@ GrafoscopioNode >> asSton [
"Exports current tree as STON format" "Exports current tree as STON format"
| stonOutput | | stonOutput |
stonOutput := '' writeStream.
stonOutput nextPutAll: (STON toStringPretty: self "flatten").
^stonOutput contents
]
{ #category : #exporting }
GrafoscopioNode >> asStonFromRoot [
"Exports current tree as STON format"
| stonOutput |
stonOutput := '' writeStream. stonOutput := '' writeStream.
self flatten. self flatten.
stonOutput nextPutAll: (STON toStringPretty: self children). stonOutput nextPutAll: (STON toStringPretty: self children).
@ -198,24 +217,29 @@ GrafoscopioNode >> asText [
GrafoscopioNode >> becomeDefaultTestTree [ GrafoscopioNode >> becomeDefaultTestTree [
| node1 node2 node3 node4 | | node1 node2 node3 node4 |
self self
created: DateAndTime now printString;
level: 0; level: 0;
header: 'Arbol principal'. header: 'Arbol principal'.
node1 := self class new node1 := self class new
created: DateAndTime now printString;
header: 'Markup'; header: 'Markup';
body: 'I am <b>just a node with markup</b>'; body: 'I am <b>just a node with markup</b>';
tagAs: 'text'; tagAs: 'text';
links: 'temp.md'; links: 'temp.md';
level: 1. level: 1.
node2 := self class new node2 := self class new
created: DateAndTime now printString;
header: '%output Code'; header: '%output Code';
tagAs: 'código'; tagAs: 'código';
body: '(ConfigurationOfGrafoscopio>>#version14:) sourceCode'. body: '(ConfigurationOfGrafoscopio>>#version14:) sourceCode'.
node3 := self class new node3 := self class new
created: DateAndTime now printString;
header: '%invisible'; header: '%invisible';
tagAs: 'text'; tagAs: 'text';
body: '<i>Just testing</i>'. body: '<i>Just testing</i>'.
node1 addNode: node3. node1 addNode: node3.
node4 := self class new node4 := self class new
created: DateAndTime now printString;
header: 'Something'; header: 'Something';
tagAs: 'text'; tagAs: 'text';
body: '<h1>else</h1>'. body: '<h1>else</h1>'.
@ -231,10 +255,12 @@ GrafoscopioNode >> becomeDefaultTree [
| node1 | | node1 |
self class new. self class new.
self self
created: DateAndTime now printString;
level: 0; level: 0;
header: 'Arbol principal'; header: 'Arbol principal';
tagAs: 'código'. tagAs: 'código'.
node1 := self class new node1 := self class new
created: DateAndTime now printString;
header: 'Node 1'; header: 'Node 1';
body: ''; body: '';
tagAs: 'text'. tagAs: 'text'.
@ -252,8 +278,6 @@ GrafoscopioNode >> body [
{ #category : #accessing } { #category : #accessing }
GrafoscopioNode >> body: anObject [ GrafoscopioNode >> body: anObject [
"Sets the receivers body to the given object"
body := anObject body := anObject
] ]
@ -278,9 +302,26 @@ GrafoscopioNode >> bodyAsMarkdownInto: aStream [
{ #category : #operation } { #category : #operation }
GrafoscopioNode >> checksum [ GrafoscopioNode >> checksum [
"I return the SHA1SUM of the current node.
I'm used to test changes on the node contents, without including changes in the children."
| nodeCopy |
nodeCopy := self surfaceCopy.
^ self checksumFor: nodeCopy asSton.
]
{ #category : #utility }
GrafoscopioNode >> checksumFor: aText [
"I return the SHA1SUM of the current tree. I'm used to test changes on the contents "I return the SHA1SUM of the current tree. I'm used to test changes on the contents
and for traceability of how the document tree is converted to other formats, as markdown." and for traceability of how the document tree is converted to other formats, as markdown."
^ (SHA1 new hashMessage: self root flatten asSton) hex ^ (SHA1 new hashMessage: aText) hex
]
{ #category : #operation }
GrafoscopioNode >> checksumForRootSubtree [
"I return the SHA1SUM of the current tree. I'm used to test changes on the contents
and for traceability of how the document tree is converted to other formats, as markdown."
^ self checksumFor: self root flatten asStonFromRoot.
"^ (SHA1 new hashMessage: self root flatten asStonFromRoot) hex"
] ]
{ #category : #accessing } { #category : #accessing }
@ -302,7 +343,7 @@ GrafoscopioNode >> children: aCollection [
GrafoscopioNode >> content [ GrafoscopioNode >> content [
"Returns the receivers body" "Returns the receivers body"
^ body ^ self body
] ]
@ -320,6 +361,19 @@ GrafoscopioNode >> copyToClipboard [
] ]
{ #category : #accessing }
GrafoscopioNode >> created [
^ created
]
{ #category : #accessing }
GrafoscopioNode >> created: aTimestamp [
"I tell when this object was created"
created := aTimestamp
]
{ #category : #operation } { #category : #operation }
GrafoscopioNode >> currentLink [ GrafoscopioNode >> currentLink [
"TODO: This method should not only select sanitized links, but also provide ways to detect wich link "TODO: This method should not only select sanitized links, but also provide ways to detect wich link
@ -350,6 +404,34 @@ GrafoscopioNode >> demote [
] ]
{ #category : #'as yet unclassified' }
GrafoscopioNode >> detectSelectionIndex [
"I tell which is the index of the current selected node or return the first childre
(indexed at 1) if is not found."
| root |
root := self root.
root preorderTraversal allButFirst doWithIndex: [ :currentNode :index |
currentNode isSelected ifTrue: [ ^ index ] ].
^ 1.
]
{ #category : #accessing }
GrafoscopioNode >> edited [
^ edited
]
{ #category : #accessing }
GrafoscopioNode >> edited: aTimestamp [
"I store the last time when a node was edited.
Because nodes in the notebook have a autosave feature, I'm updated automatically when nodes are
edited from the GUI.
If I'm in the notebook root (i.e. node's level equals 0) I should store the last time the notebook
was saved on the hard drive."
edited := aTimestamp
]
{ #category : #'custom markup' } { #category : #'custom markup' }
GrafoscopioNode >> embedAll [ GrafoscopioNode >> embedAll [
"This is just a previous part of the messy markDownContent. The %embed-all keyword should be revaluated. "This is just a previous part of the messy markDownContent. The %embed-all keyword should be revaluated.
@ -384,6 +466,13 @@ GrafoscopioNode >> embeddedNodes [
^ self children select: [:each | each headerStartsWith: '%embed'] ^ self children select: [:each | each headerStartsWith: '%embed']
] ]
{ #category : #accessing }
GrafoscopioNode >> expanded: aBoolean [
"I tell if the node is expanded from the UI, showing my children.
Several nodes can be expanded in a single document."
selected := aBoolean
]
{ #category : #exporting } { #category : #exporting }
GrafoscopioNode >> exportCodeBlockTo: aStream [ GrafoscopioNode >> exportCodeBlockTo: aStream [
"I convert the content of a node taged as 'código' (code) as pandoc markdown and put it "I convert the content of a node taged as 'código' (code) as pandoc markdown and put it
@ -564,6 +653,18 @@ GrafoscopioNode >> icon: aSymbol [
icon := aSymbol icon := aSymbol
] ]
{ #category : #accessing }
GrafoscopioNode >> id [
^id
]
{ #category : #accessing }
GrafoscopioNode >> id: aChecksum [
"I'm a unique identifier that changes when node content changes (i.e. header, body, links)."
id := aChecksum
]
{ #category : #importing } { #category : #importing }
GrafoscopioNode >> importHtmlLink [ GrafoscopioNode >> importHtmlLink [
"I take the last link and import its contents in node body. " "I take the last link and import its contents in node body. "
@ -607,6 +708,21 @@ GrafoscopioNode >> isEmpty [
body ifNil: [ ^ true ] ifNotNil: [ ^ false ] body ifNil: [ ^ true ] ifNotNil: [ ^ false ]
] ]
{ #category : #operation }
GrafoscopioNode >> isSavedAfterLastEdition [
| root |
root := self root.
root edited ifNil: [ ^ false ].
^ self unsavedNodes isEmpty.
"self unsavedNodes isEmpty ifFalse: [ ^ self unsavedNodes inspect ]"
]
{ #category : #testing }
GrafoscopioNode >> isSelected [
self selected ifNil: [ ^ false ].
^ self selected.
]
{ #category : #operation } { #category : #operation }
GrafoscopioNode >> isTaggedAs: aString [ GrafoscopioNode >> isTaggedAs: aString [
self tags ifEmpty: [ self tagAs: 'text' ]. self tags ifEmpty: [ self tagAs: 'text' ].
@ -688,12 +804,12 @@ GrafoscopioNode >> links: anObject [
] ]
{ #category : #operation } { #category : #operation }
GrafoscopioNode >> linksToMarkdownFile [ GrafoscopioNode >> linksToMarkupFile [
"I detect if the links contains any reference to a file ending in '.md' or '.markdown'" "I detect if the links contains any reference to a file ending in '.md' or '.markdown'"
self links self links
ifNotNil: [ ifNotNil: [
self links self links
detect: [:l | (l endsWith: '.md') or: [ l endsWith: '.markdown']] detect: [:l | (l endsWithAnyOf: #('.md' '.markdown' '.md.html'))]
ifFound: [ ^ true ] ifFound: [ ^ true ]
ifNone: [^ false]]. ifNone: [^ false]].
^ false ^ false
@ -901,6 +1017,21 @@ GrafoscopioNode >> preorderTraversal [
^ nodesInPreorder. ^ nodesInPreorder.
] ]
{ #category : #'as yet unclassified' }
GrafoscopioNode >> preorderTraversalIndex [
"I tell which place I occupy in the tree children (without counting the root)."
| root |
root := self root.
root preorderTraversalRootChildren doWithIndex: [ :currentNode :index |
currentNode = self ifTrue: [^ index] ].
]
{ #category : #'as yet unclassified' }
GrafoscopioNode >> preorderTraversalRootChildren [
^ self root preorderTraversal allButFirst
]
{ #category : #movement } { #category : #movement }
GrafoscopioNode >> promote [ GrafoscopioNode >> promote [
"Moves the current node up in the hierachy, making it a slibing of its current parent" "Moves the current node up in the hierachy, making it a slibing of its current parent"
@ -991,8 +1122,20 @@ GrafoscopioNode >> saveContent: anObject [
] ]
{ #category : #operation } { #category : #operation }
GrafoscopioNode >> selectMarkdownSubtreesToExport [ GrafoscopioNode >> selectMarkupSubtreesToExport [
^ (self root preorderTraversal) select: [ :each | each linksToMarkdownFile ]. ^ (self root preorderTraversal) select: [ :each | each linksToMarkupFile ].
]
{ #category : #accessing }
GrafoscopioNode >> selected [
^ selected
]
{ #category : #accessing }
GrafoscopioNode >> selected: aBoolean [
"I tell if the node is selected from the UI.
Once other node is selected my value becomes false."
selected := aBoolean
] ]
{ #category : #accessing } { #category : #accessing }
@ -1024,10 +1167,13 @@ GrafoscopioNode >> surfaceCopy [
to the rest of the container tree, which could end in copying the whole tree." to the rest of the container tree, which could end in copying the whole tree."
| newNode | | newNode |
newNode := self class new. newNode := self class new.
^ newNode newNode
header: self header; header: self header;
body: self body; body: self body;
tags: self tags. tags: self tags;
level: self level.
self links ifNotEmpty: [ newNode links addAll: self links ].
^ newNode.
] ]
@ -1083,6 +1229,36 @@ GrafoscopioNode >> toggleCodeText [
ifTrue: [ ^ self tags replaceAll: 'código' with: 'text' ]. ifTrue: [ ^ self tags replaceAll: 'código' with: 'text' ].
] ]
{ #category : #accessing }
GrafoscopioNode >> toggleSelected [
"I made the receiver the current selected node and deselect all other nodes."
| root previousSelection |
self isSelected ifTrue: [ ^ self ].
root := self root.
previousSelection := self preorderTraversalRootChildren at: (self detectSelectionIndex).
previousSelection selected: false.
self selected: true.
^ self.
]
{ #category : #operation }
GrafoscopioNode >> unsavedNodes [
"I collect all nodes that have changed after the last saving"
| lastSavedOn root unsavedNodes |
root := self root.
lastSavedOn := root edited asDateAndTime.
unsavedNodes := root preorderTraversal select: [ :currentNode |
currentNode edited isNotNil and: [currentNode edited asDateAndTime > lastSavedOn] ].
^ unsavedNodes.
]
{ #category : #'as yet unclassified' }
GrafoscopioNode >> updateEditionTimestamp [
self edited: DateAndTime now printString
]
{ #category : #importing } { #category : #importing }
GrafoscopioNode >> uploadBodyFrom: fileLocator filteredFor: selectedLink [ GrafoscopioNode >> uploadBodyFrom: fileLocator filteredFor: selectedLink [
(self linksFilters contains: selectedLink) (self linksFilters contains: selectedLink)

View File

@ -60,7 +60,7 @@ GrafoscopioNodeTest >> testHasMarkdownSubtreesToExport [
Please see look #becomeDefaultTestTree message to see the details that makes this test true." Please see look #becomeDefaultTestTree message to see the details that makes this test true."
| tree | | tree |
tree := GrafoscopioNode new becomeDefaultTestTree. tree := GrafoscopioNode new becomeDefaultTestTree.
self assert: tree selectMarkdownSubtreesToExport isNotEmpty equals: true. self assert: tree selectMarkupSubtreesToExport isNotEmpty equals: true.
] ]
@ -69,6 +69,17 @@ GrafoscopioNodeTest >> testInitializeIsOk [
self shouldnt: [ GrafoscopioNode new ] raise: Error self shouldnt: [ GrafoscopioNode new ] raise: Error
] ]
{ #category : #tests }
GrafoscopioNodeTest >> testNodeSelection [
| tree child1 |
tree := GrafoscopioNode new becomeDefaultTestTree.
child1 := tree preorderTraversalRootChildren at: 1.
child1 selected: true.
self assert: tree detectSelectionIndex equals: 1
]
{ #category : #tests } { #category : #tests }
GrafoscopioNodeTest >> testPromoteNode [ GrafoscopioNodeTest >> testPromoteNode [
| tree child1 child2 | | tree child1 child2 |
@ -135,3 +146,16 @@ GrafoscopioNodeTest >> testSanitizedLink [
self assert: (node sanitizeDefaultLink = 'https://docutopia.tupale.co/hackbo:hackbot') equals: true self assert: (node sanitizeDefaultLink = 'https://docutopia.tupale.co/hackbo:hackbot') equals: true
] ]
{ #category : #tests }
GrafoscopioNodeTest >> testToggleNodeSelection [
"I verify that a selected node can be unchosen once a new selection has been done."
| tree testNode1 testNode2 |
tree := GrafoscopioNode new becomeDefaultTestTree.
testNode1 := (tree preorderTraversalRootChildren at: 1) selected: true.
self assert: tree detectSelectionIndex equals: testNode1 preorderTraversalIndex.
testNode2 := (tree preorderTraversalRootChildren at: 2).
testNode2 toggleSelected.
self assert: tree detectSelectionIndex equals: testNode2 preorderTraversalIndex
]

View File

@ -72,17 +72,41 @@ GrafoscopioNotebook >> addNode [
self notebookContent: notebook. self notebookContent: notebook.
] ]
{ #category : #persistence }
GrafoscopioNotebook >> askToSaveBeforeClosing [
| saveChanges |
saveChanges := UIManager default
question: 'Do you want to save changes in the notebook before closing?'
title: 'Save changes before closing?'.
saveChanges ifNil: [ ^ self notebook unsavedNodes inspect ].
^ saveChanges
]
{ #category : #operation } { #category : #operation }
GrafoscopioNotebook >> autoSaveBodyOf: aNode [ GrafoscopioNotebook >> autoSaveBodyOf: aNode [
| playground | | playground bodyContents |
bodyContents := aNode body.
self body class = GrafoscopioTextModel self body class = GrafoscopioTextModel
ifTrue: [ body body whenTextChanged: [ :arg | aNode body: arg ] ]. ifTrue: [ self body body whenTextChanged: [ :arg |
body body class = GlamourPresentationModel aNode body: arg.
"self body body whenTextIsAccepted: [:bodyText |
self inform: bodyText.
aNode updateEditionTimestamp ]."
bodyContents = arg ifFalse: [
"self inform: arg."
"aNode updateEditionTimestamp" ]]].
self body body class = GlamourPresentationModel
ifFalse: [ ^ self ]. ifFalse: [ ^ self ].
playground := body body glmPres. playground := self body body glmPres.
playground playground
onChangeOfPort: #text onChangeOfPort: #text
act: [ :x | aNode body: (x pane port: #entity) value content ] act: [ :x |
aNode body: (x pane port: #entity) value content.
"aNode updateEditionTimestamp."
"self inform: aNode edited" ]
] ]
{ #category : #accessing } { #category : #accessing }
@ -96,7 +120,7 @@ GrafoscopioNotebook >> body: anObject [
] ]
{ #category : #utilities } { #category : #utilities }
GrafoscopioNotebook >> checksum [ GrafoscopioNotebook >> checksumForRootSubtree [
"I return the checksum (crypto hash) of the workingFile where this notebook is being stored. "I return the checksum (crypto hash) of the workingFile where this notebook is being stored.
I'm useful for data provenance and traceability of derivated files coming from this source I'm useful for data provenance and traceability of derivated files coming from this source
notebook." notebook."
@ -187,9 +211,9 @@ GrafoscopioNotebook >> downloadImages [
] ]
{ #category : #persistence } { #category : #persistence }
GrafoscopioNotebook >> exportAllSubtreesAsMarkdow [ GrafoscopioNotebook >> exportAllSubtreesAsMarkup [
| toBeExported | | toBeExported |
toBeExported := self notebook selectMarkdownSubtreesToExport. toBeExported := self notebook selectMarkupSubtreesToExport.
toBeExported ifEmpty: [ ^ self ]. toBeExported ifEmpty: [ ^ self ].
toBeExported do: [ :each | self subtreeAsMarkdownFileFor: each ]. toBeExported do: [ :each | self subtreeAsMarkdownFileFor: each ].
self inform: toBeExported size asString , ' exported markdown subtrees.' self inform: toBeExported size asString , ' exported markdown subtrees.'
@ -262,11 +286,13 @@ GrafoscopioNotebook >> exportAsPDF [
{ #category : #persistence } { #category : #persistence }
GrafoscopioNotebook >> exportAsSton: aNotebook on: aFileStream [ GrafoscopioNotebook >> exportAsSton: aNotebook on: aFileStream [
aNotebook flatten. aNotebook flatten.
(STON writer on: aFileStream) self notebook root updateEditionTimestamp.
(STON writer on: aFileStream)
newLine: String crlf; newLine: String crlf;
prettyPrint: true; prettyPrint: true;
keepNewLines: true; keepNewLines: true;
nextPut: aNotebook children nextPut: aNotebook children.
] ]
{ #category : #utility } { #category : #utility }
@ -284,7 +310,7 @@ GrafoscopioNotebook >> exportNode: aGrafoscopioNode asMarkdownIn: aFile [
stream stream
nextPutAll: nextPutAll:
('---', String cr, ('---', String cr,
'exportedFrom: ', self checksum, String cr) withInternetLineEndings. 'exportedFrom: ', self checksumForRootSubtree, String cr) withInternetLineEndings.
aGrafoscopioNode metadataAsYamlIn: stream. aGrafoscopioNode metadataAsYamlIn: stream.
stream stream
nextPutAll: nextPutAll:
@ -313,6 +339,11 @@ GrafoscopioNotebook >> findAndReplace [
] ]
{ #category : #testing }
GrafoscopioNotebook >> hasAWorkingFileDefined [
self workingFile ifNil: [ ^ false ] ifNotNil: [ ^ true ]
]
{ #category : #accessing } { #category : #accessing }
GrafoscopioNotebook >> header [ GrafoscopioNotebook >> header [
^ header ^ header
@ -394,8 +425,12 @@ GrafoscopioNotebook >> initializePresenter [
(tree highlightedItem content header) = arg (tree highlightedItem content header) = arg
ifFalse: [ ifFalse: [
tree highlightedItem content header: arg. tree highlightedItem content header: arg.
tree highlightedItem content updateEditionTimestamp.
tree roots: tree roots]]. tree roots: tree roots]].
links whenTextChanged: [ :arg | tree highlightedItem content addLink: arg ] links whenTextChanged: [ :arg |
tree highlightedItem content addLink: arg.
tree highlightedItem content updateEditionTimestamp.
]
] ]
{ #category : #initialization } { #category : #initialization }
@ -404,6 +439,7 @@ GrafoscopioNotebook >> initializeWidgets [
header := self newTextInput. header := self newTextInput.
header autoAccept: true. header autoAccept: true.
body := self newText. body := self newText.
body class logCr.
body disable. body disable.
body text: '<- Select a node'. body text: '<- Select a node'.
body autoAccept: true. body autoAccept: true.
@ -420,6 +456,17 @@ GrafoscopioNotebook >> initializeWidgets [
self askOkToClose: true. self askOkToClose: true.
] ]
{ #category : #persistence }
GrafoscopioNotebook >> isSaved [
"I tell if a notebook has been saved in a persistence storage, including last editions."
^ self hasAWorkingFileDefined and: [self isSavedAfterLastEdition ].
]
{ #category : #testing }
GrafoscopioNotebook >> isSavedAfterLastEdition [
^ self notebook isSavedAfterLastEdition
]
{ #category : #accessing } { #category : #accessing }
GrafoscopioNotebook >> links [ GrafoscopioNotebook >> links [
^ links ^ links
@ -630,9 +677,10 @@ GrafoscopioNotebook >> notebookSubMenu [
action: [ self defineDebugMessageUI ] ] ] action: [ self defineDebugMessageUI ] ] ]
] ]
{ #category : #private } { #category : #'event handling' }
GrafoscopioNotebook >> okToChange [ GrafoscopioNotebook >> okToChange [
^ true
self isSaved ifTrue: [ ^ true ] ifFalse: [ ^ self askToSaveBeforeClosing ]
] ]
{ #category : #persistence } { #category : #persistence }
@ -799,7 +847,7 @@ GrafoscopioNotebook >> removeNode [
{ #category : #persistence } { #category : #persistence }
GrafoscopioNotebook >> saveToFile: aFileReference [ GrafoscopioNotebook >> saveToFile: aFileReference [
"I save the current tree/document to a file." "I save the current tree/document to a file and update storage timestamp."
aFileReference ifNil: [ self inform: 'No file selected for saving. Save NOT done.'. ^ self ]. aFileReference ifNil: [ self inform: 'No file selected for saving. Save NOT done.'. ^ self ].
workingFile := aFileReference. workingFile := aFileReference.
@ -831,6 +879,7 @@ GrafoscopioNotebook >> saveWorkingNotebook [
self workingFile self workingFile
ifNil: [ self saveToFileUI ] ifNil: [ self saveToFileUI ]
ifNotNil: [ self saveToFile: workingFile ]. ifNotNil: [ self saveToFile: workingFile ].
self notebook root updateEditionTimestamp.
GfUIHelpers updateRecentNotebooksWith: workingFile GfUIHelpers updateRecentNotebooksWith: workingFile
@ -891,7 +940,7 @@ GrafoscopioNotebook >> topBar [
name: nil; name: nil;
description: 'Export all Markdown subtrees'; description: 'Export all Markdown subtrees';
icon: (self iconNamed: #glamorousMore); icon: (self iconNamed: #glamorousMore);
action: [ self exportAllSubtreesAsMarkdow ] ]. action: [ self exportAllSubtreesAsMarkup ] ].
group group
addItem: [ :item | addItem: [ :item |
item item
@ -1062,6 +1111,7 @@ GrafoscopioNotebook >> updateBodyFor: aNodeContainer [
tree needRebuild: false. tree needRebuild: false.
body needRebuild: true. body needRebuild: true.
aNode := aNodeContainer content. aNode := aNodeContainer content.
aNode toggleSelected.
header text: aNode header. header text: aNode header.
body := self instantiate: aNode specModelClass new. body := self instantiate: aNode specModelClass new.
body content: aNode body. body content: aNode body.

View File

@ -4,7 +4,7 @@ Usually my content is markdown text.
" "
Class { Class {
#name : #GrafoscopioTextModel, #name : #GrafoscopioTextModel,
#superclass : #ComposableModel, #superclass : #ComposablePresenter,
#instVars : [ #instVars : [
'body' 'body'
], ],