StackOverflowMATLABchat / mlapptools

MATLAB class containing methods for programmatic uifigure modification
http://undocumentedmatlab.com/blog/customizing-uifigures-part-2
MIT License
25 stars 11 forks source link

Private function `figFromWebwindow` doesn't work on R2017a #18

Open Proxoso opened 6 years ago

Proxoso commented 6 years ago

Expected Behavior

    myGUI = DOMdemoGUI;
    mlapptools.fontColor(myGUI.TextArea, 'aqua');

Change color from TextArea font to 'aqua'

Actual Behavior

Error using arrayfun
matlab.internal.webwindow output type is not supported. Set 'UniformOutput' to false.

Error in mlapptools/figFromWebwindow (line 434)
            ww = arrayfun(@mlapptools.getWebWindow, hUIFigs);

Error in mlapptools/waitTillWebwindowLoaded (line 595)
              hFig = mlapptools.figFromWebwindow(hWebwindow);

Error in mlapptools.getWebElements (line 140)
            mlapptools.waitTillWebwindowLoaded(win);

Error in mlapptools.fontColor (line 69)
            [win, ID_struct] = mlapptools.getWebElements(uiElement);

If changing line 434 from: ww = arrayfun(@mlapptools.getWebWindow, hUIFigs); to ww = arrayfun(@mlapptools.getWebWindow, hUIFigs, 'un',0);

following error occurs:

Error using getappdata
Value must be a handle.

Error in mlapptools/getTimeout (line 488)
            to = getappdata(hFig, mlapptools.TAG_TIMEOUT);

Error in mlapptools/waitTillWebwindowLoaded (line 598)
            to = mlapptools.getTimeout(hFig);

Error in mlapptools.getWebElements (line 140)
            mlapptools.waitTillWebwindowLoaded(win);

Error in mlapptools.fontColor (line 69)
            [win, ID_struct] = mlapptools.getWebElements(uiElement);

Steps to Reproduce the Problem

Enter this command in the Matlab Command Line (or any other command from the examples):

    myGUI = DOMdemoGUI;
    mlapptools.fontColor(myGUI.TextArea, 'aqua');

Specifications

sco1 commented 6 years ago

This is likely version specific, the issue does not occur in R2017b.

Dev-iL commented 6 years ago

@Proxoso While we're adding a warning or a workaround for older versions, you can use the setStyle syntax, which should work :

myGUI = DOMdemoGUI;
[hWin, widgetID] = mlapptools.getWebElements(myGUI.TextArea);
mlapptools.setStyle(hWin, 'color', 'aqua', widgetID);
altmany commented 6 years ago

@Dev-iL - if you look at the error stack provided by @Proxoso , you'll see that it stems from mlapptools.fontColor:69 -

[win, ID_struct] = mlapptools.getWebElements(uiElement);

which indicates that your suggested workaround will also fail, because getWebElements fails.

My hunch is that it's due to a slow rendering, which means the timeout is reached before the widgetID is available.

Dev-iL commented 6 years ago

@altmany Good point. I have modified the waitTillWebwindowLoaded logic a bit to make getWebElements less likely to fail due to trivial problems; it might help with this issue as well.