How to customize App Designer figures in more ways than officially documented?

前端 未结 1 1471
花落未央
花落未央 2020-12-16 05:09

A recently published article in UndocumentedMatlab, mentions that App Designer figures are actually web pages using the Dojo Toolkit. This means we could theoretica

相关标签:
1条回答
  • 2020-12-16 06:10

    In order to succeed in this task, we need several things:

    • Find where the HTML/CSS are located (so we can manipulate them).
    • Find which element of the DOM we want to edit.
    • Find what is the change we need to make.
    • Find a way to manipulate the element using MATLAB.

    Working step by step:

    1. Find where the figure's HTML/CSS are stored/located

    win = struct(struct(struct(app).UIFigure).Controller).Container.CEF;
    URL = win.URL; % Needed only for testing in browser
    

    2. Find which element of the DOM we need to edit

    data_tag = char(struct(app.ListBox).Controller.ProxyView.PeerNode.getId);
    

    Validation using a browser:

    3. Find what is the change we need to make

    Since we want to manipulate text alignment, we google some relevant keywords and find the CSS text-align property. Then we try it manually to see if it really works:

    4. Find a way to manipulate the element using MATLAB

    Using dojo.style and dojo.query:

    win.executeJS(['dojo.style(dojo.query("[data-tag^=''' data_tag ''']")[0],"textAlign","center")']);
    


    Complete code for this answer:

    classdef domDemo < matlab.apps.AppBase
    
        % Properties that correspond to app components
        properties (Access = public)
            UIFigure     matlab.ui.Figure          % UI Figure
            LabelListBox matlab.ui.control.Label   % List Box
            ListBox      matlab.ui.control.ListBox % Item 1, Item 2, Item 3, It...
        end
    
        methods (Access = private)
    
            % Code that executes after component creation
            function startupFcn(app)
              % Customizations (aka "MAGIC GOES HERE"):
              drawnow; rez = [];
              warning off MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame
              warning off MATLAB:structOnObject            
              while ~strcmp(rez,'"center"')
                try                
                  % 1. Get a handle to the webwindow:
                  win = struct(struct(struct(app).UIFigure).Controller).Container.CEF;
                  % 2. Find which element of the DOM we want to edit (as before):
                  data_tag = char(struct(app.ListBox).Controller.ProxyView.PeerNode.getId);    
                  % 3. Manipulate the DOM via a JS command
                  rez = win.executeJS(['dojo.style(dojo.query("[data-tag^=''' ...
                    data_tag ''']")[0],"textAlign","center")']);
                catch
                  pause(1); % Give the figure (webpage) some more time to load
                end
              end
            end
        end
    
        % App initialization and construction
        methods (Access = private)
    
            % Create UIFigure and components
            function createComponents(app)
    
                % Create UIFigure
                app.UIFigure = uifigure;
                app.UIFigure.Position = [100 100 260 147];
                app.UIFigure.Name = 'UI Figure';
                setAutoResize(app, app.UIFigure, true)
    
                % Create LabelListBox
                app.LabelListBox = uilabel(app.UIFigure);
                app.LabelListBox.HorizontalAlignment = 'right';
                app.LabelListBox.Position = [50 93 44 15];
                app.LabelListBox.Text = 'List Box';
    
                % Create ListBox
                app.ListBox = uilistbox(app.UIFigure);
                app.ListBox.Position = [109 36 100 74];
    
            end
        end
    
        methods (Access = public)
    
            % Construct app
            function app = domDemo()
    
                % Create and configure components
                createComponents(app)
    
                % Register the app with App Designer
                registerApp(app, app.UIFigure)
    
                % Execute the startup function
                runStartupFcn(app, @startupFcn)
    
                if nargout == 0
                    clear app
                end
            end
    
            % Code that executes before app deletion
            function delete(app)
    
                % Delete UIFigure when app is deleted
                delete(app.UIFigure)
            end
        end
    end
    
    0 讨论(0)
提交回复
热议问题