[Cuis-dev] Debug action for buttons
Juan Vuletich
juan at cuis.st
Tue Nov 21 11:14:23 PST 2023
Hi Facundo,
On 11/13/2023 8:16 PM, Facundo Javier Gelatti via Cuis-dev wrote:
> Hello folks!
> I include some code to add an option to debug the action of
> MenuItemMorphs and PluggableButtonMorphs. See demo video
> <https://drive.google.com/file/d/1cVMwcMS56EgpYOiQg5MawVF6W_RaEzX3/view>
> and screenshot below:
>
> image.png
> Cheers!
> Facu.
>
> PS: I leave additional details about the implementation, that could be
> useful during code-review 👇
>
> ------------------------------------------------------------------------
> 📝 The changes include support for MenuItemMorphs and
> PluggableButtonMorphs (for convenience, in this email, I'll refer to
> both of them as "buttons").
> It'd be nice to have a more general implementation¹, but I started
> only with those because I usually debug the actions of those kinds of
> morph types (manually, until now :P).
>
> The way it's implemented is by opening a debugger on the morph's
> action, and making it go forward² until it reaches the appropriate
> method on the morph's target/model (see #debugAction).
> Notice that it also shows a confirmation message in case you try to
> debug —and therefore run— the action of a disabled button³.
>
> To execute the button's action, I reused some code from
> PluggableButtonMorph>>#performAction and MenuItemMorph>>#invokeWithEvent:.
> To do that, I extracted a couple of methods; I include here the
> reasons that motivated the way I chose to do it:
>
> 1. To be able to skip the check to see if the button was enabled or
> not, I had to extract the code that runs the action without
> making any precondition checks.
> 2. In the case of MenuItemMorph>>#invokeWithEvent:, the
> #numArgs message is sent to the corresponding selector. During
> manual testing, I discovered that this caused the
> String>>#numArgs method to run in the debugger (stepping through
> it as part of the mechanism mentioned before), and it was /very
> slow/. So, to avoid running that part of the code in the
> debugger, I extracted a method that does all the pre-processing
> and returns a block that's ready to run the action
> (MenuItemMorph>>#actionBlockForEvent:). Then, I run /that/ block
> on the debugger.
> 3. The issue mentioned in point (2) did not happen for
> PluggableButtonMorph>>#performAction. Nonetheless, I made a
> similar implementation, just for consistency's sake
> (PluggableButtonMorph>>#actionBlock). The different name has to
> do with the different vocabulary used for the
> PluggableButtonMorph vs. the MenuItemMorph, and with the fact
> that the MenuItemMorph needs an event parameter.
> 4. As the MenuItemMorph needs an event, we have to simulate it. I
> wasn't sure what was the best way to do it, so I'm currently
> passing nil. While trying it out, I noticed that all of the menu
> items I tested the option with were /not/ using the event
> object. At any rate, if there's some menu option that uses it,
> it'll fail with a "does not understand" error.
>
> Additionally, as a refactor, to be able to open the debugger on a
> block without doing anything else, I extracted the method Debugger
> class>>#openDebugging:label: from Debugger
> class>>#openDebugging:to:label:.
> _____
> ¹ e.g. detecting the events supported by any morph and letting you
> simulate and debug the one of your choosing.
> ² i.e. "step into", by sending the #send message.
> ³ Since the action is not run by a normal interaction with the button,
> and if it's disabled maybe running the action could leave the system
> in an unexpected state. It does, though, let you debug the action if
> you really want to do it.
This is very nice! Thank you.
It is now at GitHub.
Cheers,
--
Juan Vuletich
cuis.st
github.com/jvuletich
researchgate.net/profile/Juan-Vuletich
independent.academia.edu/JuanVuletich
patents.justia.com/inventor/juan-manuel-vuletich
linkedin.com/in/juan-vuletich-75611b3
twitter.com/JuanVuletich
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20231121/26c5a546/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: image/png
Size: 92698 bytes
Desc: not available
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20231121/26c5a546/attachment-0001.png>
More information about the Cuis-dev
mailing list