Commit 46e3bd84 authored by Jay Dubb's avatar Jay Dubb
Browse files

v1.31.8

-- Handle empty config file in ConfigFileClass and configSettingsGUI. Fix issues with GUI being too narrow with only one column of parameters. Add GUI argument for number of param panels per column to easily test GUI with various param dimensions (i.e., nrows X ncols).
-- Break up code in configSettingsGUI.m into functions to make it more manageable.
-- Add better GUI repositioning code using rePositionGuiWithinScreen
-- Rename section property to param and section.param to param.valueOptions in ConfigFileClass to more accurately reflect their function.  Also add methods for accessing param properties, name val and valOptions.
parent 9f959c68
Loading
Loading
Loading
Loading
+184 −98
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@ classdef ConfigFileClass < FileClass
    
    properties
        linestr;
        sections;
        params;
    end
    
    methods
@@ -10,7 +10,7 @@ classdef ConfigFileClass < FileClass
        % ----------------------------------------------------
        function obj = ConfigFileClass(filename0)
            obj.linestr = '';
            obj.sections = struct('name','','val',{{}},'param',{{}});
            obj.params = [];
            obj.filename = '';
            
            % Error checks
@@ -40,7 +40,6 @@ classdef ConfigFileClass < FileClass
                return;
            end


            % We have a filename of an existing readable file.
            try 
                obj.filename = filesepStandard(filename);
@@ -72,49 +71,60 @@ classdef ConfigFileClass < FileClass
            % =======
            % % END
            %
            %
            % Rule 2:
            % =======
            % % name1 # param1
            % % name1 # val11, val12, ... val1M
            %
            % % END
            %
            %
            % Rule 3:
            % =======
            % % name1 # param1
            % % name1
            % val11
            %
            % % END
            %
            %
            % Rule 2:
            % =======
            % % name1 # val11, val12, ... val1M
            %
            % % END
            %
            %
            % Rule 3:
            % =======
            % % name1 # val11, val12, ... val1M
            % val1i
            %
            % % END
            %
            %
            % Rule 4:
            % =======
            % % name1 # param1
            % val11
            % val12
            % ....
            % val1M
            % % name1 # val11, val12, ... val1M
            % val1i
            %
            % % END
            %
            %
            % Rule 5:
            % =======
            % % name1 # param1
            % val11
            % val12
            % ....
            % val1M
            % % name1 # val11, val12, ... val1M
            % val1i
            %
            % % name2 # param2
            % val21
            % val22
            % ....
            % val2M
            % % name2 # val21, val22, ... val2M
            % val2i
            %
            %  .....
            %
            % % nameN # paramN
            % valN1
            % valN2
            % ....
            % valNM
            % % nameN # valN1, valN2, ... valNM
            % valNi
            %
            % % END
            %
            obj.err = 0;
            iP=1;
            obj.linestr = '';
@@ -122,7 +132,7 @@ classdef ConfigFileClass < FileClass
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                %%%% Find next parameter's name %%%%
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                while ~obj.isSectionName()
                while ~obj.isParamName()
                    obj.linestr = fgetl(obj.fid);
                    if obj.eof()
                        obj.ExitWithError(1);
@@ -132,13 +142,13 @@ classdef ConfigFileClass < FileClass
                        obj.ExitWithError();
                        return;
                    end
                    if obj.isSectionVal()
                    if obj.isParamVal()
                        obj.ExitWithError(2);
                        return;
                    end
                end
                name = obj.getSectionNameFromLine();
                param = obj.getSectionParamFromLine();
                name = obj.getParamNameFromLine();
                valOptions = obj.getParamValOptionsFromLine();
                
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                %%%% Find next parameter's value %%%%
@@ -160,24 +170,21 @@ classdef ConfigFileClass < FileClass
                        fseek(obj.fid, fp_previous, 'bof');
                        break;
                    end
                    if obj.isSectionName()
                    if obj.isParamName()
                        fseek(obj.fid, fp_previous, 'bof');
                        break;
                    end
                    val{ii} = obj.getSectionValueFromLine();
                    val{ii} = obj.getParamValueFromLine();
                    ii = ii+1;
                end
                
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                %%%% Assign name/value pair to next param %%%%
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                obj.sections(iP).name = name;
                obj.sections(iP).param = param;
                obj.sections(iP).val = val;
                
                obj.AddParam(name, val, valOptions, iP);
                                
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                %%%% Move on to the next Section %%%%
                %%%% Move on to the next Param %%%%
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
                obj.linestr = '';
                iP = iP+1;
@@ -185,6 +192,7 @@ classdef ConfigFileClass < FileClass
        end
        
        
        
        % -------------------------------------------------------------------------------------------------
        function Save(obj, options)
            if ~exist('options', 'var')
@@ -193,7 +201,6 @@ classdef ConfigFileClass < FileClass
            if strcmp(options, 'backup')
                copyfile(obj.filename, [obj.filename, '.bak'])
            end
            
            if obj.fid<0
                obj.fid = fopen(obj.filename, 'w');
            end
@@ -201,16 +208,16 @@ classdef ConfigFileClass < FileClass
                return;
            end
            fprintf(obj.fid, '\n');
            for ii=1:length(obj.sections)
                if iscell(obj.sections(ii).param) && all(~cellfun(@isempty,obj.sections(ii).param))
                    fprintf(obj.fid, '%% %s # %s\n', obj.sections(ii).name, strjoin(obj.sections(ii).param,', '));
                elseif iscell(obj.sections(ii).param) && all(cellfun(@isempty,obj.sections(ii).param))
                    fprintf(obj.fid, '%% %s #\n', obj.sections(ii).name);
            for ii = 1:length(obj.params)
                if iscell(obj.params(ii).valOptions) && all(~cellfun(@isempty,obj.params(ii).valOptions))
                    fprintf(obj.fid, '%% %s # %s\n', obj.params(ii).name, strjoin(obj.params(ii).valOptions,', '));
                elseif iscell(obj.params(ii).valOptions) && all(cellfun(@isempty,obj.params(ii).valOptions))
                    fprintf(obj.fid, '%% %s #\n', obj.params(ii).name);
                else
                    fprintf(obj.fid, '%% %s\n', obj.sections(ii).name);
                    fprintf(obj.fid, '%% %s\n', obj.params(ii).name);
                end
                for jj=1:length(obj.sections(ii).val)
                    fprintf(obj.fid, '%s\n', obj.sections(ii).val{jj});
                for jj = 1:length(obj.params(ii).val)
                    fprintf(obj.fid, '%s\n', obj.params(ii).val{jj});
                end
                fprintf(obj.fid, '\n');
            end
@@ -234,10 +241,35 @@ classdef ConfigFileClass < FileClass
    end
    
    
    
    methods

        % -------------------------------------------------------------------------------------------------
        function b = isSectionName(obj)
        function InitParams(obj)
            obj.params = struct('name','','val',{{}},'valOptions',{{}});
        end
        
        
        % -------------------------------------------------------------------------------------------------
        function AddParam(obj, name, val, valOptions, iP)
            if ~iscell(val)
                val = {val};
            end
            if ~exist('iP', 'var')
                iP = length(obj.params)+1;
            end
            if isempty(obj.params)
                obj.InitParams();
            end
            obj.params(iP).name = name;
            obj.params(iP).val = val;
            obj.params(iP).valOptions = valOptions;
        end        
        
        
                
        % -------------------------------------------------------------------------------------------------
        function b = isParamName(obj)
            b = false;
            if isempty(obj.linestr)
                return;
@@ -254,7 +286,7 @@ classdef ConfigFileClass < FileClass
        
        
        % -------------------------------------------------------------------------------------------------
        function b = isSectionVal(obj)
        function b = isParamVal(obj)
            b = false;
            if isempty(obj.linestr)
                return;
@@ -272,7 +304,7 @@ classdef ConfigFileClass < FileClass
                return;
            end
            
            % Do not remove spaces from section name 
            % Do not remove spaces from param name 
            % k = find(obj.linestr==' ');
            % obj.linestr(k)=[];
            if strcmpi(obj.linestr,'%end')
@@ -291,12 +323,11 @@ classdef ConfigFileClass < FileClass
            
        
        % -------------------------------------------------------------------------------------------------
        function name = getSectionNameFromLine(obj)
        function name = getParamNameFromLine(obj)
            name = '';
            if isempty(obj.linestr)
                return;
            end
            
            ii = 1;
            while ii<length(obj.linestr) && obj.linestr(ii)~='%'
                ii = ii+1;
@@ -316,12 +347,11 @@ classdef ConfigFileClass < FileClass
        
        
        % -------------------------------------------------------------------------------------------------
        function param = getSectionParamFromLine(obj)
            param = '';
        function valOptions = getParamValOptionsFromLine(obj)
            valOptions = '';
            if isempty(obj.linestr)
                return;
            end
            
            ii = 1;
            while ii<length(obj.linestr) && obj.linestr(ii)~='#'
                ii = ii+1;
@@ -334,21 +364,20 @@ classdef ConfigFileClass < FileClass
                jj = jj+1;
            end
            if ii == jj
                param = {};
                valOptions = {};
            else
                param = strtrim_improve(obj.linestr(ii:jj));
                param = split(param,', ');
                valOptions = strtrim_improve(obj.linestr(ii:jj));
                valOptions = split(valOptions,', ');
            end
        end
        
        
        % -------------------------------------------------------------------------------------------------
        function val = getSectionValueFromLine(obj)
        function val = getParamValueFromLine(obj)
            val = '';
            if isempty(obj.linestr)
                return;
            end            
            
            ii = 1;
            while ii<length(obj.linestr) && obj.linestr(ii)==' '
                ii = ii+1;
@@ -362,38 +391,94 @@ classdef ConfigFileClass < FileClass
        
        
        % -------------------------------------------------------------------------------------------------
        function val = GetValue(obj, section)
        function val = GetValue(obj, paramName)
            val = '';
            if nargin<2
                return;
            end
            if ~ischar(section)
            if ~ischar(paramName)
                return;
            end
            for ii=1:length(obj.sections)
                if strcmp(obj.sections(ii).name, section)
                    if isempty(obj.sections(ii).val)
            for ii = 1:length(obj.params)
                if strcmp(obj.params(ii).name, paramName)
                    if isempty(obj.params(ii).val)
                        return;
                    end
                    val = obj.sections(ii).val{1};
                    val = obj.params(ii).val{1};
                end
            end
        end

        
        
        % -------------------------------------------------------------------------------------------------
        function SetValue(obj, section, val)
        function SetValue(obj, paramName, val)
            if nargin<3
                return;
            end
            if ~ischar(section)
            if ~ischar(paramName)
                return;
            end
            for ii = 1:length(obj.params)
                if strcmp(obj.params(ii).name, paramName)
                    obj.params(ii).val{1} = val;
                end
            end
        end
        
        
        
        % -------------------------------------------------------------------------------------------------
        function num = GetParamNum(obj)
            num = length(obj.params);
        end
            
            
        % -------------------------------------------------------------------------------------------------
        function name = GetParamName(obj, idx)
            name = '';
            if isempty(obj)
                return;
            end
            for ii=1:length(obj.sections)
                if strcmp(obj.sections(ii).name, section)
                    obj.sections(ii).val{1} = val;
            if isempty(obj.params)
                return;
            end
            if nargin == 0
                idx = 1;
            end
            name = obj.params(idx).name;
        end
            
            
        % -------------------------------------------------------------------------------------------------
        function val = GetParamValue(obj, idx)
            val = {};
            if isempty(obj)
                return;
            end
            if isempty(obj.params)
                return;
            end
            if nargin == 0
                idx = 1;
            end
            val = obj.params(idx).val;
        end
            
            
        % -------------------------------------------------------------------------------------------------
        function valOptions = GetParamValueOptions(obj, idx)
            valOptions = {};
            if isempty(obj)
                return;
            end
            if isempty(obj.params)
                return;
            end
            if nargin == 0
                idx = 1;
            end
            valOptions = obj.params(idx).valOptions;
        end
            
            
@@ -415,6 +500,7 @@ classdef ConfigFileClass < FileClass
        end
        
        
        
        % -------------------------------------------------------------------------------------------------
        function b = BackupExists(obj)
            b = exist([obj.filename, '.bak'], 'file');
+162 −64
Original line number Diff line number Diff line
function configSettingsGUI
global cfgSet
function configSettingsGUI(nParamsPerCol)

cfgSet = ConfigFileClass();
if nargin==0
    nParamsPerCol = 6;
end
if nParamsPerCol<1
    nParamsPerCol = 1;
end
if nParamsPerCol>12
    nParamsPerCol = 12;
end

% Hardcode size of each parameter panel in char units
ysize = 5;
xsize = 50;
InitializeGuiStruct();
hf = CreateGui();
ResetGui(hf);
ResizeGui(hf, nParamsPerCol);
DrawConfigParams(hf)
DrawBttns(hf);


% Hardcode size of each buttons
ysizeBttn = 2;
xsizeBttn = 20;
% -------------------------------------------------------------
function InitializeGuiStruct()
global cfgGui

if ~isempty(cfgGui)
    if ishandles(cfgGui.handle)
        return;
    end
end

cfgGui = struct(...
    'filedata',[], ...
    'ysizeParam',0, ...
    'xsizeParam',0, ...
    'ysizeBttn',0, ...
    'xsizeBttn',0, ...
    'ysizeGap',0, ...
    'xsizeGap',0, ...
    'nrows',0, ...
    'ncols',0, ...
    'ysizeTotal',0, ...
    'xsizeTotal',0, ...
    'ysizeParamsAll',0, ...
    'xsizeParamsAll',0, ...
    'nParamsPerCol',8, ...
    'handle',[] ...
    );

cfgGui.filedata = ConfigFileClass();

% char to pixel conversion
cfgGui.units = 'pixels';
[fx, fy] = guiUnitConversion('characters', cfgGui.units);

% Hardcode size of each parameter panel in char units
cfgGui.ysizeParam = 5*fy;
cfgGui.xsizeParam = 50*fx;

% Hardcode size of each buttons
cfgGui.ysizeBttn = 2*fy;
cfgGui.xsizeBttn = 20*fx;

% Gaps sizes between controls
ygapsize = 1;
xgapsize = 2;
cfgGui.ysizeGap = 1*fy;
cfgGui.xsizeGap = 2*fx;

cfgGui.fontsizeVals = 9;
cfgGui.posParam     = [.10,.10,.80,.80];

% Calculate number of columns and rows needed to accomodate all the
% parameters
np = length(cfgSet.sections);
nParamsPerCol = 8;
ncols = floor(np/nParamsPerCol)+1;
nrows = nParamsPerCol;


% Create figure and calculate it's size
hf = figure('name', 'App Setting Config GUI', 'NumberTitle','off', 'MenuBar','none', 'ToolBar','none', 'units','characters');

% -------------------------------------------------------------
function hf = CreateGui()
global cfgGui

if ~ishandles(cfgGui.handle)
    hf = figure('name', 'App Setting Config GUI', 'NumberTitle','off', 'MenuBar','none', 'ToolBar','none', 'units',cfgGui.units);
else
    hf = cfgGui.handle;
end
cfgGui.handle = hf;




% -------------------------------------------------------------
function ResetGui(hf)
hc = get(hf, 'children');
for ii = 1:length(hc)
    if strcmpi(get(hc(ii), 'type'), 'uimenu')
        continue;
    end
    delete(hc(ii));
end



% -------------------------------------------------------------
function ResizeGui(hf, nParamsPerCol)
global cfgGui

cfgGui.nParamsPerCol = nParamsPerCol;

p0 = get(hf, 'position');
ysizeParamsGui = nrows * (ysize + ygapsize) + 2*ygapsize;
xsizeParamsGui = ncols * (xsize + xgapsize) + 2*xgapsize;
d = ysizeParamsGui - p0(4);
offset = 0;
if d>0
    offset = d;

% Calculate number of columns and rows needed to accomodate all the
% parameters
cfgGui.np = cfgGui.filedata.GetParamNum();
if floor(cfgGui.np/cfgGui.nParamsPerCol) == 0
    k = 1;
elseif floor(cfgGui.np/cfgGui.nParamsPerCol) == cfgGui.np/cfgGui.nParamsPerCol
    k = 0;
else
    k = 1;
end
ysizeGui = ysizeParamsGui+ysizeBttn+4*ygapsize;
xsizeGui = xsizeParamsGui;
set(hf, 'position', [p0(1), p0(2)-offset, xsizeGui, ysizeGui])
cfgGui.ncols = floor(cfgGui.np/cfgGui.nParamsPerCol)+k;
cfgGui.nrows = cfgGui.nParamsPerCol;
cfgGui.ysizeParamsAll = cfgGui.nrows * (cfgGui.ysizeParam + cfgGui.ysizeGap) + 2*cfgGui.ysizeGap;
cfgGui.xsizeParamsAll = cfgGui.ncols * (cfgGui.xsizeParam + cfgGui.xsizeGap) + 2*cfgGui.xsizeGap;
cfgGui.ysizeTotal = cfgGui.ysizeParamsAll+cfgGui.ysizeBttn+4*cfgGui.ysizeGap;
cfgGui.xsizeTotal = cfgGui.xsizeParamsAll;
set(hf, 'position', [p0(1), p0(2), cfgGui.xsizeTotal, cfgGui.ysizeTotal])
rePositionGuiWithinScreen(hf);


% Draw all param panels and their controls in the figure gui
fontsizeVals = 9;
posParam     = [.10,.10,.80,.80];

% -------------------------------------------------------------
function DrawConfigParams(hf)
global cfgGui

np = cfgGui.filedata.GetParamNum();
hp = zeros(np,1);
for i = 1:ncols
    for j = 1:nrows
for i = 1:cfgGui.ncols
    for j = 1:cfgGui.nrows
        % Figure out param panel position
        xpos    = (xsize+xgapsize)*(i-1) + xgapsize;
        ypos    = ysizeGui - 2*ygapsize - (ysize+ygapsize)*j;
        xpos    = (cfgGui.xsizeParam+cfgGui.xsizeGap)*(i-1) + cfgGui.xsizeGap;
        ypos    = cfgGui.ysizeTotal - 2*cfgGui.ysizeGap - (cfgGui.ysizeParam+cfgGui.ysizeGap)*j;
        posPanel = [xpos, ypos, cfgGui.xsizeParam, cfgGui.ysizeParam];

        ip = nParamsPerCol*(i-1) + j;
        ip = cfgGui.nParamsPerCol*(i-1) + j;
        if ip>np
            if np==0
                uicontrol(hf, 'Style','text', 'string','CONFIG FILE IS EMPTY', 'FontSize',11, ...
                          'fontweight','bold', 'units',cfgGui.units, 'Position',posPanel, 'foregroundcolor',[.6,.3,.1]);
            end
            break;
        end

        % Draw param panel
        posPanel = [xpos, ypos, xsize, ysize];
        hp(ip) = uipanel('Title',cfgSet.sections(ip).name, 'FontSize',10, 'fontweight','bold', 'foregroundcolor',[.6,.3,.1], ...
            'units','characters', 'Position',posPanel);
        hp(ip) = uipanel('parent',hf, 'Title',cfgGui.filedata.GetParamName(ip), 'FontSize',10, 'fontweight','bold', 'foregroundcolor',[.6,.3,.1], ...
            'units',cfgGui.units, 'Position',posPanel);
        
        % Draw param values control within panel. Note all controls have same relative position within panel 
        pval = '';
        if ~isempty(cfgSet.sections(ip).val)
            pval = cfgSet.sections(ip).val{1};
        end
        if isempty(cfgSet.sections(ip).param)
            hv = uicontrol(hp(ip), 'Style','edit', 'string',pval, 'FontSize',fontsizeVals, 'fontweight','bold', 'Tag',cfgSet.sections(ip).name, ...
                'units','normalized', 'position',posParam);
        pval = cfgGui.filedata.GetParamValue(ip);
        if isempty(cfgGui.filedata.GetParamValueOptions(ip))
            hv = uicontrol(hp(ip), 'Style','edit', 'string',pval, 'FontSize',cfgGui.fontsizeVals, 'fontweight','bold', 'Tag',cfgGui.filedata.GetParamName(ip), ...
                'units','normalized', 'position',cfgGui.posParam);
        else
            hv = uicontrol(hp(ip), 'Style','popupmenu', 'string',cfgSet.sections(ip).param, ...
                'FontSize',fontsizeVals, 'fontweight','bold', 'Tag',cfgSet.sections(ip).name, ...
                'units','normalized', 'position',posParam);
            k = find(strcmp(cfgSet.sections(ip).param, pval));
            hv = uicontrol(hp(ip), 'Style','popupmenu', 'string',cfgGui.filedata.GetParamValueOptions(ip), ...
                'FontSize',cfgGui.fontsizeVals, 'fontweight','bold', 'Tag',cfgGui.filedata.GetParamName(ip), ...
                'units','normalized', 'position',cfgGui.posParam);
            k = find(strcmp(cfgGui.filedata.GetParamValueOptions(ip), pval));
            if isempty(k)
                set(hv, 'string',[{''}, cfgSet.sections(ip).param(:)']);
                set(hv, 'string',[{''}, cfgGui.filedata.GetParamValueOptions(ip)]);
            else
                hv.Value = k;
            end
@@ -84,31 +171,42 @@ for i = 1:ncols
    end
end

% Draw buttons
xoffset = xsizeGui/5;
hBttnSave = uicontrol('Style','pushbutton', 'FontSize',15, 'Units','characters', 'String','Save', ...
    'Position', [xoffset, ysizeGui-(ysizeParamsGui+ysize), xsizeBttn, ysizeBttn]);


% -------------------------------------------------------------
function DrawBttns(hf)
global cfgGui

if cfgGui.ncols == 1
    k = 10;
else
    k = 5;
end
xoffset = cfgGui.xsizeTotal/k;
hBttnSave = uicontrol(hf, 'Style','pushbutton', 'FontSize',15, 'Units',cfgGui.units, 'String','Save', ...
    'Position', [xoffset, cfgGui.ysizeTotal-(cfgGui.ysizeParamsAll+cfgGui.ysizeParam), cfgGui.xsizeBttn, cfgGui.ysizeBttn]);
hBttnSave.Callback = @cfgSave;
hBttnExit = uicontrol('Style','pushbutton', 'FontSize',15, 'Units','characters', 'String','Exit', ...
    'Position', [xsizeGui-(xsizeBttn+xoffset), ysizeGui-(ysizeParamsGui+ysize), xsizeBttn, ysizeBttn]);
hBttnExit = uicontrol(hf, 'Style','pushbutton', 'FontSize',15, 'Units',cfgGui.units, 'String','Exit', ...
    'Position', [cfgGui.xsizeTotal-(cfgGui.xsizeBttn+xoffset), cfgGui.ysizeTotal-(cfgGui.ysizeParamsAll+cfgGui.ysizeParam), cfgGui.xsizeBttn, cfgGui.ysizeBttn]);
hBttnExit.Callback = @cfgExit;




% -------------------------------------------------------------
function setVal(src,~)
global cfgSet
global cfgGui
if iscell(src.String)
    cfgSet.SetValue(src.Tag, src.String{src.Value});
    cfgGui.filedata.SetValue(src.Tag, src.String{src.Value});
else
    cfgSet.SetValue(src.Tag, src.String);
    cfgGui.filedata.SetValue(src.Tag, src.String);
end


% -------------------------------------------------------------
function cfgSave(~,~) %#ok<*DEFNU>
global cfgSet
cfgSet.Save();
global cfgGui
cfgGui.filedata.Save();
close;


+1 −1
Original line number Diff line number Diff line
@@ -2,5 +2,5 @@ function vrnnum = getVernum()

vrnnum{1} = '1';   % Major version #
vrnnum{2} = '31';  % Major sub-version #
vrnnum{3} = '7';   % Minor version #
vrnnum{3} = '8';   % Minor version #
vrnnum{4} = '0';   % Minor sub-version # or patch #: 'p1', 'p2', etc
+2 −2
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ end

% Get screen borders 
buffer_x = Ps(ii,3)*.02;
buffer_y = Ps(ii,4)*.05;
buffer_y = Ps(ii,4)*.08;
ScreenWidth     = Ps(ii,3);
ScreenHeight    = Ps(ii,4);
ScreenSideLeft  = Ps(ii,1)+buffer_x;
+46 −0
Original line number Diff line number Diff line
function [fx, fy] = guiUnitConversion(units1, units2)
% 
% Syntax:
%   [fx, fy] = guiUnitConversion()
%   [fx, fy] = guiUnitConversion(units1)
%   [fx, fy] = guiUnitConversion(units1, units2)
%
%
% Description:
%   Function to find unit ratios between any 2 units in the current screen in
%   the x and y directions
%
%
% Examples:
%   [fx, fy] = guiUnitConversion('inches','centimeters')
%   fx = 2.5400
%   fy = 2.5400
% 
%   [fx, fy] = guiUnitConversion('centimeters','inches')
%   fx = 0.3937
%   fy = 0.3937
% 
%   [fx, fy] = guiUnitConversion('centimeters','pixels')
%   fx = 37.7953
%   fy = 37.7953
% 
%   [fx, fy] = guiUnitConversion('pixels','characters')
%   fx = 0.2000
%   fy = 0.0769
%
%
if nargin==0
    units1 = 'characters';
    units2 = 'pixels';
elseif nargin==0
    units2 = 'pixels';
end

hf = figure('visible','off');
hBttn = uicontrol('parent',hf, 'Style','pushbutton', 'Units',units1, 'position',[1,1,1,1], 'visible','off');
set(hBttn, 'units',units2);
p = get(hBttn, 'position');
delete(hBttn);

fx = p(3);
fy = p(4);