Best practice for menus...

Paul Dupuis paul at researchware.com
Tue Jan 17 16:04:48 EST 2017


Richard,

Thanks for the timing information. It was reassuring to see changing the
text was faster. In dealing with bug
http://quality.livecode.com/show_bug.cgi?id=19097 I have been looking to
clean up menu code and was looking for best practice feedback exactly
like yours. My own inclination has been towards changing the text of the
menu button precisely because I can be assured of the context as you noted.

However, before systemically changing all code that doesn't conform to
one specific way of menu handling to another, I thought I would check
and see if most people agreed on one method or if there was a difference
of opinions or what.

With all the performance benchmarking data you have collected and
conducted over the years, you should someday write a book on "LiveCode
Best Practices".


On 1/17/2017 3:27 PM, Richard Gaskin via use-livecode wrote:
> Paul Dupuis wrote:
>
> > For desktop applications on Windows and OSX, I am lookingf or what
> > people consider the best practice to be for enabling, disabling, or
> > updating menu items based on context.
> >
> > You have so many ways in the LiveCode language to do this:
> >
> > enable menuItem 2 of menu "Edit"
> > disable menuItem 3 or menu "File"
> >
> > get the text of btn "Edit"
> > if first char of line 3 of it is "(" then delete first char of line 3
> > of it -- enables 3 menuItem in Edit menu
> > set the text of btn "Edit" to it
> >
> > enable menuitem 2 of btn "File" of grp "Menubar" -- Enable Open
> >
> > and probably a number of other syntax variations I have forgotten. So
> > is there one of the many syntax variations for menus that is "Best"
> > (i.e most reliable, best performance, best balance between
> > reliability and performance)
>
>
> IIRC the "menu" keyword will favor whatever's in the default menu bar,
> which may or may not be ideal depending on your circumstance.
>
> For example, if you script:
>
>   disable menuitem 2 of menu "File"
>
> ...if the topmost stack has a File menu, or you have a custom menu
> stack being used as a menu bar and the defaultMenubar points to it,
> you may get what you expect.
>
> But if you're not quite so careful you may wind up disabling something
> in the LC IDE menubar while it's set to the defaultMenubar.
>
> Also, IIRC the "menuItem" keyword is useful only for enabling and
> disabling menu items, but I don't believe it can be used for setting
> checkmarks, mnemonics, or other options.
>
> Given that the "menu" reference is finicky and "menuItem" limited, I
> rarely use either.
>
> Working with the menuitems as text give me complete control and
> unambiguous object references, for the small price of a little extra
> typing.
>
> I was curious about performance, so I ran the test copied below, with
> these results:
>
>   MenuItem: 219 ms
>   As text:  10 ms
>
> The difference may not be surprising given that the menuItems are a
> single property (rather than separately stored elements for each item
> as with SuperCard), so it seems the engine needs to get all the items
> for a menu, manipulate the ones in question, and restore them to the
> menu object each time a change is made to any one of them.
>
> Those results were in v9.
>
> Interestingly, v6 seems much slower (thanks team for the speed bump
> with menu updating):
>
>  MenuItem: 3473 ms
>  As text:  131 ms
>
>
> -----------------------------------------------------------------------
> -- Test script
> -- Compare speed of disabling all even-numbered items in a menu
> -- containing 100 items.
> -- Requires 1 pulldown menu named "m1"
>
> on mouseUp
>    -- Setup menu:
>    repeat with i = 1 to 100
>       put "item "& i &cr after s
>    end repeat
>    delete last char of s -- trailing CR
>    put s into btn "m1"
>    --
>    -- Params for test:
>    put 10 into n
>    put the text of btn "m1" into s
>    --
>    -- Test 1: menuItem
>    put the millisecs into t
>    repeat n
>       put s into btn "m1"
>       SetMenu1
>    end repeat
>    put the millisecs - t into t1
>    put the text of btn 1 into r1
>    --
>    -- Test 2: text
>    put the millisecs into t
>    repeat n
>       put s into btn "m1"
>       SetMenu2
>    end repeat
>    put the millisecs - t into t2
>    put the text of btn 1 into r2
>    --
>    -- Display results:
>    put "MenuItem: "& t1 &" ms" &cr \
>          & "As text: "& t2 &" ms" &cr \
>          & "Match?: "& (r1 is r2)
> end mouseUp
>
>
> on SetMenu1
>    repeat with i = 2 to the number of lines of the text of btn "m1"
> step 2
>       disable menuitem i of btn "m1"
>    end repeat
> end SetMenu1
>
>
> on SetMenu2
>    put the text of btn 1 into s
>    put 0 into i
>    put empty into tNuS
>    repeat for each line tLine in s
>       add 1 to i
>       if i mod 2 = 0 then
>          put "("& tLine &cr after tNuS
>       else
>          put tLine &cr after tNuS
>       end if
>    end repeat
>    delete last char of tNuS
>    set the text of btn "m1" to tNuS
> end SetMenu2
>
>
>





More information about the use-livecode mailing list