Dynamic scripted nested array keys?
Keith Clarke
keith.clarke at me.com
Sat Apr 24 13:11:07 EDT 2021
Thanks Brian this conversion to pPath to an array of keys hit the nail on the head.
So, for anyone else looking to show the (full non-truncated) content of a node in a read-only Tree widget in a tooltip, by clicking the actionInspect icon, is…
on actionInspect pPath
put the arrayData of widget "Tree" into aContent -- get the Tree's data
split pPath by comma -- convert pPath from list to an array of keys
set the tooltip of widget "Tree" to aContent[pPath] -- the current Tree node's content
end actionInspect
Thanks too Jaque, Paul, Bob & Henry for playing! :-)
Best,
Keith
> On 24 Apr 2021, at 14:31, Brian Milby via use-livecode <use-livecode at lists.runrev.com> wrote:
>
> I guess I should reply to myself and say why this works. At some point the
> feature was added that you could use an array as an index into an array.
> The format is a one based ordered array of keys. So tPath[1] is the first
> level key, tPath[2] is the second level, etc. If you wanted to get
> tTree["one"]["two"] then tPath[1]="one" and tPath[2]="two" so you could
> just get tTree[tPath]. Since comma is the default path delimiter (which
> can be changed), you can use split to turn a path list into a path array.
>
> On Sat, Apr 24, 2021 at 9:26 AM Brian Milby <brian at milby7.com> wrote:
>
>> Easiest way is to use split...
>>
>> Given a tree widget this will take a path from field 1 and put the value
>> at that path in field 2
>>
>> on mouseUp pMouseButton
>> local tTree, tLoc
>> put the arrayData of widget 1 into tTree
>> put field 1 into tLoc
>> split tLoc by comma
>> put tTree[tLoc] into field 2
>> end mouseUp
>>
>> Thanks,
>> Brian
>>
>> On Sat, Apr 24, 2021 at 9:06 AM Paul Dupuis via use-livecode <
>> use-livecode at lists.runrev.com> wrote:
>>
>>> I have only partially been following this thread, but if you need to
>>> find the array 'content' in an arbitrary nested array from a comma
>>> delimited path of array keys, recursion is the way to do it:
>>>
>>> function fetchArrayContentFromPath pArray,pPath
>>> -- pArray is an array
>>> -- pPath is a comma delimited 'path' of array keys to the desired
>>> content
>>> local tKey
>>> if pArray is not an array then
>>> return pArray -- I have reached the content, so return that content
>>> else if pPath is empty then
>>> return pArray -- should not happen in a tree widget, but this is if
>>> the path ends in an array instead of the content of an array element
>>> else
>>> put item 1 of pPath into tKey -- get the key of element in the
>>> currnet path
>>> delete item 1 of pPath -- remove it from the current path,
>>> so the path is the next set of key(s)
>>> return fetchArrayContentFromPath(pArray[tKey],pPath) - recursively
>>> fetch the remainig keys from the currnet array element
>>> end if
>>> end fetchArrayContentFromPath
>>>
>>> It will not matter is the 'path' is key1,key1 or
>>> key1,key2,key3,key4,key5,key6,key7, or whatever.
>>>
>>>
>>> On 4/24/2021 7:10 AM, Keith Clarke via use-livecode wrote:
>>>> Hi folks,
>>>> Inspired by Jaque’s (working - thank you!) response to my question
>>> “Show Tree widget row contents on hover” I’ve isolated the final piece of
>>> that puzzle that leaves me baffled.
>>>>
>>>> Specifically, can LiveCode accept a dynamically built key for a nested
>>> multi-dimensional array? Copy the button script recipe below to see the
>>> problem.
>>>>
>>>> Perhaps the LC array experts here can help explain why Jaque’s
>>> hard-wired key definition works but my attempts to replicate this syntax
>>> via scripting to support variable depth of arrays get ignored? Is it my
>>> syntax or just the way arrays work in LC…?
>>>> on mouseUp pButtonNumber
>>>>
>>>> # Create a nested array
>>>>
>>>> put "Content" into tArray["key1"]["key2"]["key3"]["key4"]
>>>>
>>>>
>>>> # Replicate the path response from the Tree widget actionInspect
>>> function
>>>>
>>>> put "key1,key2,key3,key4" into pPath
>>>>
>>>>
>>>> # Jaque's 'hard-wired' array key recipe works!
>>>>
>>>> answer tArray[item 1 of pPath][item 2 of pPath][item 3 of pPath][item 4
>>> of pPath] --returns 'Content'
>>>>
>>>>
>>>> # Replicate Jaque's syntax dynamically
>>>>
>>>> put the number of items in pPath into tKeyCount
>>>>
>>>> put empty into iNum
>>>>
>>>> repeat for each item i in pPath
>>>>
>>>> add 1 to iNum
>>>>
>>>> # Try building the full key string
>>>>
>>>> put "[" & item iNum of pPath & "]"after tKey1
>>>>
>>>>
>>>> # Try building keys string to 'embed' into the regular array key syntax
>>>>
>>>> put item iNum of pPath after tKey2
>>>>
>>>> if iNum < tKeyCount then put "][" after tKey2
>>>>
>>>>
>>>> # Try building by each key
>>>>
>>>> if i is not empty then put "[" & item iNum of pPath & "]" after tArray2
>>>>
>>>> end repeat
>>>>
>>>>
>>>> # Dynamic tKey1 results
>>>>
>>>> answer tKey1 -- returns '["key1"]["key2"]["key3"]["key4"]' ...seems
>>> 'correct'
>>>>
>>>> answer tArray & tKey1 -- returns '["key1"]["key2"]["key3"]["key4"]'
>>> ...dynamic key definition is not appended to array(?)
>>>>
>>>>
>>>> # Dynamic tKey2 results
>>>>
>>>> answer tKey2 -- returns '"key1"]["key2"]["key3"]["key4"'
>>>>
>>>> answer tArray[tKey2] -- returns null ...dynamic key definition is not
>>> understood (as first level key)?
>>>>
>>>>
>>>> answer tArray2 -- returns '["key1"]["key2"]["key3"]["key4"]' ...dynamic
>>> key definition is not appended to array(?)
>>>>
>>>> end mouseUp
>>>>
>>>>
>>>> Best,
>>>> Keith
>>>>
>>>> _______________________________________________
>>>> use-livecode mailing list
>>>> use-livecode at lists.runrev.com
>>>> Please visit this url to subscribe, unsubscribe and manage your
>>> subscription preferences:
>>>> http://lists.runrev.com/mailman/listinfo/use-livecode
>>>
>>>
>>> _______________________________________________
>>> use-livecode mailing list
>>> use-livecode at lists.runrev.com
>>> Please visit this url to subscribe, unsubscribe and manage your
>>> subscription preferences:
>>> http://lists.runrev.com/mailman/listinfo/use-livecode
>>>
>>
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode
More information about the use-livecode
mailing list