No BSD License  

Highlights from
Graphic User Object (GUO) Toolbox

image thumbnail
from Graphic User Object (GUO) Toolbox by David Mackenzie
Programming tool for creating reusable Graphic User Interface (GUI) components.

GUOdemo(Action);
function GUOdemo(Action);

persistent GUOdemoFig1 GUOdemoFig2 GUO1 GUO2 GUO1TextPos GUO2SmallPos GUO1Ready;

% function GUOdemo(Action);
% 
% Demonstrates the graphicuserobject class.
% The Action argument selects the button callback code
% and should not be supplied from the command line.
%
% Copyright (c) SINUS Messtechnik GmbH 2002
% www.sinusmess.de - Sound & Vibration Instrumentation
%                  - PCB Services
%                  - Electronic Design & Production

if nargin == 0
   % No Action parameter supplied:  create figures, GUOs and other controls
   
   % Create figures
   GUO1Ready = 0;
   GUOdemoFig1 = figure('Position', [50 300 600 400], ...
                        'ResizeFcn', 'GUOdemo(''ResizeFig1'')');
   GUOdemoFig2 = figure('Position', [350 50 600 400]);
   
   % Create GUO1:  graphicuserobject with visible frame (default units=normalized)
   GUO1 = graphicuserobject(GUOdemoFig1, 'Position', [1/12 0.7 7/12 0.2], ...
                                         'Visible', 'on');
   GUO1 = uicontrol(GUO1, 'Tag', 'GUO1TextNormalized', ...
                          'Style', 'text', ...
                          'Position', [0.1 0.6 0.8 0.3], ...
                          'String', 'This text and this GUO have units=normalized');
   GUO1TextPos = [10 10 250 20];
   GUO1 = uicontrol(GUO1, 'Tag', 'GUO1TextPixels', ...
                          'Style', 'text', ...
                          'Units', 'pixels', ...
                          'Position', GUO1TextPos, ...
                          'String', 'This text and the other GUO have units=pixels');
   
   % Create child GUOs within GUO1
   GUOPB1N = PlaybackButtons('Tag', 'PBBinGUO1N', ...
                             'Position', [0.45 0.35 0.25 0.3], ...
                             'Visible', 'on');
   GUOPB1N = SetPBBCallbacks(GUOPB1N);  % SetPBBCallbacks is a subfunction of GUOdemo
   GUO1 = addchildguo(GUO1, GUOPB1N);   % Add GUOPB1N within GUO1
   GUOPB1P = PlaybackButtons('Tag', 'PBBinGUO1P', ...
                             'Units', 'pixels', ...
                             'Position', [260 10 80 20], ...
                             'Visible', 'on');
   GUOPB1P = SetPBBCallbacks(GUOPB1P);  % SetPBBCallbacks is a subfunction of GUOdemo
   GUO1 = addchildguo(GUO1, GUOPB1P);   % Add GUOPB1P within GUO1
   GUO1Ready = 1;  % Avoid "Child not found" error from initial resize (see below)
   
   % Create GUO2:  graphicuserobject with visible frame (units=pixels)
   GUO2SmallPos = [100 60 350 200];
   GUO2 = graphicuserobject(GUOdemoFig1, 'Units', 'Pixels', ...
                                         'Position', GUO2SmallPos, ...
                                         'Visible', 'on');
   % Pushbuttons are normalized relative to graphicuserobject (default units=normalized)
   GUO2 = uicontrol(GUO2, 'Style', 'pushbutton', ...
                          'Position', [0.1 0.8 0.15 0.1], ...
                          'String', 'Big', ...
                          'Callback', 'GUOdemo(''Big'')');
   GUO2 = uicontrol(GUO2, 'Style', 'pushbutton', ...
                          'Position', [0.1 0.7 0.15 0.1], ...
                          'String', 'Small', ...
                          'Callback', 'GUOdemo(''Small'')');
   GUO2 = uicontrol(GUO2, 'Style', 'pushbutton', ...
                          'Position', [0.1 0.6 0.15 0.1], ...
                          'String', 'Edit', ...
                          'Callback', 'GUOdemo(''Edit'')');
   GUO2 = uicontrol(GUO2, 'Style', 'pushbutton', ...
                          'Position', [0.1 0.5 0.15 0.1], ...
                          'String', 'Plot', ...
                          'Callback', 'GUOdemo(''Plot'')');
   GUO2 = uicontrol(GUO2, 'Style', 'pushbutton', ...
                          'Position', [0.1 0.4 0.15 0.1], ...
                          'String', 'Figure 1', ...
                          'Callback', 'GUOdemo(''Fig1'')');
   GUO2 = uicontrol(GUO2, 'Style', 'pushbutton', ...
                          'Position', [0.1 0.3 0.15 0.1], ...
                          'String', 'Figure 2', ...
                          'Callback', 'GUOdemo(''Fig2'')');
   GUO2 = uicontrol(GUO2, 'Style', 'pushbutton', ...
                          'Position', [0.1 0.2 0.15 0.1], ...
                          'String', 'Close', ...
                          'Callback', 'GUOdemo(''Close'')');
   % Axes are normalized relative to graphicuserobject (default units=normalized)
   GUO2 = axes(GUO2, 'Tag', 'PlotAxes', ...
                     'Position', [0.45 0.5 0.25 0.4], ...
                     'XLim', [0 100], ...
                     'YLim', [0 100]);
   axes(GUO2, '');  % Make GUO2 frame the current axes for rectangle
   rectangle('Position', [0.075 0.175 0.2 0.75], ...
             'Curvature', [0.1]);
   
   % Create child GUOs within GUO2
   GUOPB2N = PlaybackButtons('Tag', 'PBBinGUO2N', ...
                             'Position', [0.45 0.2 0.25 0.14], ...
                             'Visible', 'on');
   GUOPB2N = SetPBBCallbacks(GUOPB2N);  % SetPBBCallbacks is a subfunction of GUOdemo
   GUO2 = addchildguo(GUO2, GUOPB2N);   % Add GUOPB2N within GUO2
   GUOPB2P = PlaybackButtons('Tag', 'PBBinGUO2P', ...
                             'Units', 'pixels', ...
                             'Position', [260 10 80 20], ...
                             'Visible', 'on');
   GUOPB2P = SetPBBCallbacks(GUOPB2P);  % SetPBBCallbacks is a subfunction of GUOdemo
   GUO2 = addchildguo(GUO2, GUOPB2P);   % Add GUOPB2P within GUO2
   
   % Create and initialise text at fixed position relative to GUO2
   GUO2 = uicontrol(GUO2, 'Tag', 'FixedText', ...
                          'Style', 'text', ...
                          'Units', 'pixels', ...
                          'Position', [10 10 130 20]);
   GUOdemo('SetText');  % Update displayed position of GUO2 (pixels)
   
   % Demonstrate Display function
   GUO1
   GUO2
   
   % Create pushbuttons on figure GUOdemoFig1 (not in GUO)
   figure(GUOdemoFig1);
   uicontrol('Style', 'pushbutton', ...
             'Position', [100 25 100 20], ...
             'String', 'Hide GUO1', ...
             'Callback', 'GUOdemo(''HideGUO1'')');
   uicontrol('Style', 'pushbutton', ...
             'Position', [200 25 100 20], ...
             'String', 'Show GUO1', ...
             'Callback', 'GUOdemo(''ShowGUO1'')');
   uicontrol('Style', 'pushbutton', ...
             'Position', [300 25 100 20], ...
             'String', 'Hide Controls 1', ...
             'Callback', 'GUOdemo(''HideControls1'')');
   uicontrol('Style', 'pushbutton', ...
             'Position', [400 25 100 20], ...
             'String', 'Show Controls 1', ...
             'Callback', 'GUOdemo(''ShowControls1'')');
   uicontrol('Style', 'pushbutton', ...
             'Position', [100  5 100 20], ...
             'String', 'Hide GUO2', ...
             'Callback', 'GUOdemo(''HideGUO2'')');
   uicontrol('Style', 'pushbutton', ...
             'Position', [200  5 100 20], ...
             'String', 'Show GUO2', ...
             'Callback', 'GUOdemo(''ShowGUO2'')');
   uicontrol('Style', 'pushbutton', ...
             'Position', [300  5 100 20], ...
             'String', 'Hide Controls 2', ...
             'Callback', 'GUOdemo(''HideControls2'')');
   uicontrol('Style', 'pushbutton', ...
             'Position', [400  5 100 20], ...
             'String', 'Show Controls 2', ...
             'Callback', 'GUOdemo(''ShowControls2'')');

else
   % Action argument supplied (selects callback function)
   
   switch Action
   case 'ResizeFig1'  % ResizeFcn for GUOdemoFig1
      if GUO1Ready    % GUO1Ready avoids "Child not found" error from initial resize.
         GUO1 = resizefcn(GUO1);  % resizefcn necessary because GUO1 is normalized
      end                         % but has children with Units=pixels
   case 'Big'         % "Big" pushbutton in GUO2 resizes GUO2 and normalized children
      GUO2 = set(GUO2, 'Position', [50 60 500 300]);
      GUOdemo('SetText');  % Update displayed position of GUO2 (pixels)
   case 'Small'       % "Small" pushbutton in GUO2 resizes GUO2 and normalized children
      GUO2 = set(GUO2, 'Position', GUO2SmallPos);
      GUOdemo('SetText');  % Update displayed position of GUO2 (pixels)
   case 'Edit'        % "Edit" pushbutton in GUO2 demonstrates access to child uicontrol
      try             % "EditText":  creation, getting child properties and deletion
         MsgText = getchild(GUO2, 'EditText', 'String');
      catch
         MsgText = [];
         GUO2 = uicontrol(GUO2, 'Tag', 'EditText', ...
                                'Style', 'edit', ...
                                'Position', [0.2 0.85 0.6 0.1], ...
                                'HorizontalAlignment', 'left');
      end
      if length(MsgText) > 0
         GUO2 = deletechild(GUO2, 'EditText');
         msgbox(['EditText contained: ' MsgText], 'GUOdemo');
      end
   case 'Plot'        % "Plot" pushbutton in GUO2 demonstrates access to child axes
      % Demonstrate indexing by number instead of Tag...
      axes(GUO2, 8);  % ... but "axes(GUO2, 'PlotAxes')" would normally be better
      plot([0:100], [0:100], 'r');
      text(50, 50, 'XYZ');  % Create text relative to PlotAxes
   case 'Fig1'        % "Fig1" pushbutton in GUO2 moves GUO2 to GUOdemoFig1
      GUO2 = set(GUO2, 'Parent', GUOdemoFig1);
   case 'Fig2'        % "Fig2" pushbutton in GUO2 moves GUO2 to GUOdemoFig2
      GUO2 = set(GUO2, 'Parent', GUOdemoFig2);
   case 'Close'       % "Close" pushbutton in GUO2 ends demonstration
      GUO2 = delete(GUO2);  % Demonstrate GUO deletion
      close(GUOdemoFig1);
      close(GUOdemoFig2);
   case 'SetText'     % Update displayed position of GUO2 (pixels)
      PosText = ['Pos:  ' num2str(get(GUO2, 'Position'))];
      GUO2 = setchild(GUO2, 'FixedText', 'String', PosText);
   case {'PBBnormalized', 'PBBpixels'}  % Callback for all pushbuttons in
      Tag = get(gcbo, 'Tag');           % PlaybackButttons GUOs - see SetPBBCallbacks
      msgbox(['"' Tag '" button in child GUO with units = ' Action(4:end)], 'GUOdemo');
      
   % The remaining Actions are for the pushbuttons on figure GUOdemoFig1,
   % which demonstrate the hiding and showing of GUOs and their children.
   case 'HideGUO1'       % Hide GUO1
      GUO1 = hide(GUO1);
   case 'ShowGUO1'       % Show GUO1
      GUO1 = show(GUO1);
   case 'HideControls1'  % Hide normalized child GUO & control in GUO1
      GUO1 = guoeval(GUO1, 'PBBinGUO1N', 'hide');
      GUO1 = setchild(GUO1, 'GUO1TextNormalized', 'Visible', 'off');
   case 'ShowControls1'  % Show normalized child GUO & control in GUO1
      GUO1 = guoeval(GUO1, 'PBBinGUO1N', 'show');
      GUO1 = setchild(GUO1, 'GUO1TextNormalized', 'Visible', 'on');
   case 'HideGUO2'       % Hide GUO2
      GUO2 = hide(GUO2);
   case 'ShowGUO2'       % Show GUO2
      GUO2 = show(GUO2);
   case 'HideControls2'  % Hide normalized child GUO & control in GUO2
      GUO2 = guoeval(GUO2, 'PBBinGUO2N', 'hide');
      GUO2 = setchild(GUO2, 'PlotAxes', 'Visible', 'off');
      % Line and text are children of PlotAxes
      set(getchild(GUO2, 'PlotAxes', 'Children'), 'Visible', 'off');
   case 'ShowControls2'  % Show normalized child GUO & control in GUO2
      GUO2 = guoeval(GUO2, 'PBBinGUO2N', 'show');
      GUO2 = setchild(GUO2, 'PlotAxes', 'Visible', 'on');
      % Line and text are children of PlotAxes
      set(getchild(GUO2, 'PlotAxes', 'Children'), 'Visible', 'on');
      
   otherwise  % This should never happen...
      msgbox(['Unknown Action: ' Action], 'GUOdemo', 'error');
   end
end


function  GUOPBB = SetPBBCallbacks(GUOPBB);

% Subfunction of GUOdemo:  sets the same callback function for each of 
% the four pushbuttons within GUOPBB (which is a PlaybackButtons GUO).

PBBunits = get(GUOPBB, 'Units');
for Tag = {'First', 'Previous', 'Next', 'Last'}
   GUOPBB = setchild(GUOPBB, Tag{:}, 'Callback', ['GUOdemo(''PBB' PBBunits ''')']);
end

Contact us at files@mathworks.com