Mercurial > hg > ltpda
view m-toolbox/m/gui/gltpda/ltpdagui.m @ 43:bc767aaa99a8
CVS Update
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Tue, 06 Dec 2011 11:09:25 +0100 |
parents | f0afece42f48 |
children |
line wrap: on
line source
function ltpdagui(varargin) % ========================================================================= % LTPDA GUI % ========================================================================= % % Open the main LTPDA GUI. % % $Id: ltpdagui.m,v 1.27 2009/01/23 12:40:51 nicola Exp $ warning off all global LTPDAinvar LTPDAoutvar active labels scaleX tabbedFigName = 'Family GUI'; screenSize = get(0,'screensize'); scaleX = screenSize(3)/1280; if scaleX<1, scaleX = 1; end setappdata(0, 'ltpda_gui_scalefactor',scaleX); guiSize = [1 1 600*scaleX 550*scaleX]; guiSize = round([(screenSize(3)-guiSize(3))/2 , (screenSize(4)-guiSize(4))/2 , guiSize(3) , guiSize(4)]); if ~isempty(findobj('Tag','LTPDAGUI')) && nargin==0, return; end if isempty(LTPDAinvar), LTPDAinvar = {}; end if isempty(LTPDAoutvar), LTPDAoutvar = {}; end userID = getappdata(0,'ltpda_repo_user'); if isempty(userID), userID = ''; end passwd = getappdata(0,'ltpda_repo_pass'); if isempty(passwd), passwd = ''; end if nargin==0, setappdata(0,'startup',1); [userID passwd] = utils.mysql.logindlg(userID,'',1,tabbedFigName,guiSize); try cd(getappdata(0,'DefaultDataDirectory')); catch, end; end if isempty(userID), userID = 'JohnDoe'; passwd=''; end setappdata(0,'ltpda_repo_user',userID) setappdata(0,'ltpda_repo_pass',passwd) if nargin==0 clc disp('Please wait: starting LTPDA GUI...') disp('Loading Simulink...') drawnow load_system('simulink') load_system('ltpda_library') end try stop(timerfindall); delete(timerfindall); catch end t1 = timer('TimerFcn',@CheckTimerAlive,'ExecutionMode','fixedRate','Period',0.3); t2 = timer('TimerFcn',@CheckTimerAlive,'ExecutionMode','fixedRate','Period',1); start(t1) start(t2) %% tag = ''; units = 'normalized'; position = [0,0,1,1]; % text color in the label: foregroundcolor = [0.2,0.2,0.2]; % color in the background, behind tabs: backgroundcolor = [0.7,0.7,1]; % background color, inside every tab: panelbackgroundcolor = [0.98,0.98,0.98]; % color of the small highlight line, above the selected tab titlehighlightcolor = [1,0.3,0]; horizontalalignment = 'center'; active = 0; string = {'Main LTPDA panel','Parameters','Output','';'Repository','Partial execution','Nested loops','Globals'}; nrows = size(string,1); if nrows>1 for nn=1:nrows, labels{nn} = string(nn,:); end string = string(1,:); end ntab = numel(string); for jj=ntab:-1:1, ntab = ntab - strcmp(string(jj),''); end % Cycle to retrieve parameters from the user: for mm=1:2:nargin property = lower(varargin{mm}); value = varargin{mm+1}; switch property case {'title','string'} string = value; nrows = size(string,1); if nrows>1 for nn=1:nrows, labels{nn} = string(nn,:);end string = string(1,:); end ntab = numel(string); for jj=ntab:-1:1, ntab = ntab - strcmp(string(jj),''); end case {'frameposition','position'} position = value; case {'framebackgroundcolor','backgroundcolor'} backgroundcolor = value; case {'framebordertype','bordertype'} bordertype = value; case {'titleforegroundcolor','foregroundcolor'} foregroundcolor = value; case {'selecteditem','active'} active = value; case 'redraw' if value == 1 % main panel TopBottomTabCbk([],[],1,1) active = 1; return end if value == 1.1 % the user clicked the Start button TopBottomTabCbk([],[],1,1) active = 1; runSim = 1; end if value == 2 % Parameters panel TopBottomTabCbk([],[],2,1) active = 1; return end if value == 6 % globals panel TopBottomTabCbk([],[],4,2) active = 1; return end if value == 8 % nested loops TopBottomTabCbk([],[],3,2) active = 1; return end case 'callback' if value==1 && strcmp(bdroot,'ltpda_library') HelpCallback(); return; end if value==1 && isempty(findobj('Name',tabbedFigName)) return; end otherwise eval([property '= ' value ';']); end end parent = findobj('Tag','LTPDAGUI'); if ~isempty(parent), clf(parent); set(parent,'Resize','on','ResizeFcn',{@GUIResize,guiSize}); else parent = figure('Position',guiSize,'Name',tabbedFigName,'Resize','on','ResizeFcn',{@GUIResize,guiSize},'NumberTitle','off','Toolbar','none','Menubar','none'); end set(parent,'Tag','LTPDAGUI','NextPlot','new'); if ~exist('margins','var'), margins = {1,'pixels'}; end if ~iscell(margins), margins = {margins,units}; end if ~exist('bordertype','var'), bordertype = 'none'; end if ~exist('titlebackgroundcolor','var'), titlebackgroundcolor = 0.95*panelbackgroundcolor; end if ~active, active = 1; end clear htab htab = uipanel( ... 'Parent',parent, ... 'Units',units, ... 'Position',position, ... 'BackgroundColor',backgroundcolor, ... 'BorderType',bordertype, ... 'Visible','on', ... 'Tag',tag); set(htab,'Units','pixels'); tabpos = get(htab,'Position'); status = uicontainer( ... 'Parent',htab, ... 'BackgroundColor',backgroundcolor, ... 'Units',margins{2}, ... 'Position',[1,1,1,1], ... 'Visible','off'); set(status,'Units','pixels'); charsz = get(status,'Position'); margins = [charsz(1:2),charsz(1:2)].*margins{1}; set(status,'Units','characters'); set(status,'Position',[1,1,1,1]); set(status,'Units','pixels'); charsz = get(status,'Position'); titleheight = 2.4*charsz(4); titleheight = titleheight*scaleX; margins(3:4) = -(margins(1:2)+margins(3:4)); [loop,sign] = deal(1:ntab,[1,ntab,1,0]); addtitle = 2*[sign(3:4),-1,-1]; ttextpos = [0.05,0.08,0.9,0.76]; for kk=1:ntab title(kk) = uipanel( ... 'Parent',htab, ... 'Units','pixels', ... 'BackgroundColor',titlebackgroundcolor, ... 'BorderType','beveledout', ... 'ButtonDownFcn',{@TopBottomTabCbk,kk,1}, ... 'Visible','on'); ttext(kk) = uicontrol( ... 'Parent',title(kk), ... 'Units','normalized', ... 'Position',ttextpos, ... 'ForegroundColor',foregroundcolor, ... 'BackgroundColor',titlebackgroundcolor, ... 'HorizontalAlignment',horizontalalignment, ... 'Style','text', ... 'String',string{kk}, ... 'FontSize',11*scaleX,... 'Enable','inactive', ... 'HitTest','off',... 'Visible','on'); end set(htab,'Units','pixels'); dimension = get(htab,'Position'); dimension(4) = dimension(4)-nrows*titleheight+5; panel = uipanel('Parent',htab,'Tag','mainPanel','Units','pixels','Position',dimension,'BackgroundColor',panelbackgroundcolor,'BorderType','beveledout','Visible','on'); dimension = get(htab,'Position'); logosize = [52,52]; dimension = [dimension(3)-logosize(1)-3 , dimension(4)-logosize(2) , logosize]; logo = axes('Parent',htab,'Units','pixels','Position',dimension,'Tag','Logo'); image(imread('iconltp.jpg'),'Parent',logo,'AlphaData',imread('iconltpalpha.gif'),'ButtonDownFcn','try open_system(gcs); catch, end;'); axis(logo,'off'); axis(logo,'square'); set(logo,'HandleVisibility','callback'); dimension = get(htab,'Position'); logosize = [40 40]; dimension = [dimension(3)-logosize(1)-70 , dimension(4)-logosize(2)-9 , logosize]; start2 = axes('Parent',htab,'Units','pixels','Position',dimension,'Tag','Start2'); image(imread('startgreen.jpg'),'Parent',start2,'AlphaData',imread('startalpha.gif'),'ButtonDownFcn','ltpdagui(''redraw'',1.1);','Tag','StartButton'); axis(start2,'off'); set(start2,'HandleVisibility','callback'); if active>ntab, active=ntab; end inset(1) = uicontrol( ... 'Parent',htab, ... 'Units','pixels', ... 'BackgroundColor',panelbackgroundcolor, ... 'Style','text', ... 'Visible','on'); if ~isnan(titlehighlightcolor) inset(2) = uicontrol( ... 'Parent',htab, ... 'Units','pixels', ... 'BackgroundColor',titlehighlightcolor, ... 'Style','text', ... 'Visible','on'); inset(3) = uicontrol( ... 'Parent',htab, ... 'Units','pixels', ... 'BackgroundColor',0.85*titlehighlightcolor, ... 'Style','text', ... 'Visible','on'); end % ======================================================================= % OTHER BUTTONS for xx=2:nrows localString = labels{xx}; ntab = numel(localString); for tt=1:ntab titles(xx,tt) = uipanel( ... 'Parent',htab, ... 'Units','pixels', ... 'BackgroundColor',titlebackgroundcolor, ... 'BorderType','beveledout', ... 'ButtonDownFcn',{@TopBottomTabCbk,tt,xx}, ... 'Visible','on'); uicontrol( ... 'Parent',titles(xx,tt), ... 'Units','normalized', ... 'Position',ttextpos, ... 'ForegroundColor',foregroundcolor, ... 'BackgroundColor',titlebackgroundcolor, ... 'HorizontalAlignment',horizontalalignment, ... 'Style','text', ... 'String',localString{tt}, ... 'Enable','inactive', ... 'FontSize',11*scaleX,... 'HitTest','off',... 'Visible','on'); end end % ======================================================================= TopBottomTabResizeCbk(); panelTitle = get(ttext(active),'string'); setappdata(0, 'ltpda_currPanel', panel); % ======================================================================= % ======================================================================= % ======================================================================= CheckTimerAlive() switch panelTitle case 'Main LTPDA panel' if exist('runSim','var') && runSim==1 runSim = 0; %#ok<NASGU> pan1main(panel,1) else pan1main(panel) end case 'Parameters' pan2param(panel) case 'Repository' pan3repo(panel) case 'Import from workspace' pan4import(panel) case 'Output' pan5output(panel) case 'Globals' pan6globals(panel) case 'Partial execution' pan7partial(panel) case 'Nested loops' % panXyettocome(panel) pan8nested(panel) end % ======================================================================= % ======================================================================= % ======================================================================= %% %-------------------------------------------------------------------------- function TopBottomTabCbk(hobj,evdt,indx,numbrow) %#ok<INUSL> % Executed when the user clicks on a another tab or resize. if numbrow>1 % the user clicked on another row for pp=ntab:-1:1, ntab = ntab - strcmp(string(pp),''); end if ntab==1, active=1; end % Swop rows: temp = labels(1); labels(1) = labels(numbrow); labels(numbrow) = temp; clear temp % Rebuild the proper list: for ii=1:nrows temp(ii,1:numel(labels{ii}))=labels{ii}; end else active = indx; for ii=1:nrows temp(ii,1:numel(labels{ii}))=labels{ii}; end end % ====================================== ltpdagui('title',temp,'active',indx); % ====================================== end %-------------------------------------------------------------------------- %-------------------------------------------------------------------------- function TopBottomTabResizeCbk(varargin) % Properly draws the panels. units = get(htab,'Units'); set(htab,'Units','pixels'); tabpos = get(htab,'Position'); tabpos(3) = tabpos(3)-120; set(htab,'Units',units); ntab = numel(string); for oo=ntab:-1:1, ntab = ntab - strcmp(string(oo),''); end titlepos = [0,0,0,titleheight]; panelpos = [0,0,tabpos(3),tabpos(4)-titleheight]+margins; titlepos(2) = panelpos(2)+panelpos(4); panelpos(2) = panelpos(2)-titleheight*(nrows-1)+6; n = sum(cellfun('length',string))+2*ntab; titlepos(1) = panelpos(1)+(1-sign(3))*panelpos(3); upperpos = titlepos(2); for k=loop titlepos(3) = panelpos(3)*(length(string{k})+2)/n; addtopos = addtitle.*[k==1,1,k==1|k==ntab,1]; titlepos(1) = titlepos(1)-(1-sign(3))*titlepos(3); titlepos(2) = upperpos - titlepos(4)*(nrows-1)+3+1; set(title(k),'Position',titlepos+addtopos); titlepos(1) = titlepos(1)+sign(3)*titlepos(3); end % ======================================================================= if nrows>1 for xxx=2:nrows localString = labels{xxx}; ntab = numel(localString); for i=ntab:-1:1, ntab = ntab - strcmp(localString(i),''); end n = sum(cellfun('length',localString))+2*ntab; titlepos(1) = panelpos(1)+(1-sign(3))*panelpos(3); titlepos(2) = titlepos(2) + titlepos(4)-2; for k=1:ntab titlepos(3) = panelpos(3)*(length(localString{k})+2)/n; addtopos = addtitle.*[k==1,1,k==1|k==ntab,1]; titlepos(1) = titlepos(1)-(1-sign(3))*titlepos(3); if ntab==1, titlepos(3)=titlepos(3)-2; end set(titles(xxx,k),'Position',titlepos+addtopos); titlepos(1) = titlepos(1)+sign(3)*titlepos(3); end if ntab<numel(localString) for qq=ntab+1:numel(localString) nullpos=[0,0,1,1]; set(titles(xxx,qq),'Position',nullpos); end end end end % ======================================================================= titlepos = get(title(active),'Position'); titlepos = titlepos-addtitle.*[active==sign(1),1,active==sign(1),1]; titlepos(3) = titlepos(3)-addtitle(3)*(active==sign(2)); ntab = numel(string); for i=ntab:-1:1, ntab = ntab - strcmp(string(i),''); end if ntab==1, titlepos(3) = titlepos(3)-4; end set(title(active),'Position',titlepos,'BackgroundColor',panelbackgroundcolor); set(ttext(active),'FontWeight','bold','BackgroundColor',panelbackgroundcolor); insetpos = [titlepos(1)+1,titlepos(2)+sign(4)*titlepos(4)-2,titlepos(3)-1,3]; set(inset(1),'Position',insetpos); try insetpos = insetpos+[0,(1-2*sign(4))*titleheight+2*sign(4),0,-2]; set(inset(2),'Position',insetpos); set(inset(3),'Position',insetpos+[2,1-2*sign(4),-4,0]); catch end end %-------------------------------------------------------------------------- %-------------------------------------------------------------------------- function GUIResize(varargin) % Called whenever the user resize the GUI window. guiSize = varargin{3}; newSize = get(findobj('Tag','LTPDAGUI'),'Position'); % To avoid a width lower than the fixed minimum: if newSize(3)<guiSize(3), newSize(3)=guiSize(3); end % To avoid an height lower than the fixed minimum: if newSize(4)<guiSize(4), newSize(4)=guiSize(4); end % To avoid a window moved outside the screen border: screenSize = get(0,'screensize'); if newSize(2)+newSize(4)+30>screenSize(4), newSize(2)=screenSize(4)-newSize(4)-40; end if newSize(1)+newSize(3)>screenSize(3), newSize(1)=screenSize(3)-newSize(3)-5; end set(findobj('Tag','LTPDAGUI'),'Position',newSize); % Redraw the GUI on the current panel: % pause(0.1) if ~getappdata(0,'startup'), TopBottomTabCbk([],[],active,1) else setappdata(0,'startup',0); end end %-------------------------------------------------------------------------- %% %---------------------------------------------------------------------- function CheckTimerAlive(varargin) % This is the function to execute a continuous timer check % Keep alive the first timer: alltimers = timerfindall; if strcmp(get(alltimers(1),'Running'),'off'), start(alltimers(1)); end end %---------------------------------------------------------------------- %---------------------------------------------------------------------- function HelpCallback(varargin) % Whenever the user doubleclick a block in the library window (ie, the % OpenFcn callback is executed from the library). openSys = find_system('SearchDepth',0); for ii=1:numel(openSys) if ~isempty(find_system(openSys{ii},'FindAll','on','Type','Annotation','Tag','ltpda model')) add_block(gcb,[openSys{ii},'/',get_param(gcb,'Name')],'MakeNameUnique','on') return; end end try childpath = find_system(gcbh,'LookUnderMasks','all','BlockType','M-S-Function'); functionname = get_param(childpath,'Tag'); description = get_param(gcbh,'Description'); funcname = findstr('functionName=',description); if funcname i = funcname+14; while ~strcmp(description(i),';'), i=i+1; end functionname = description(funcname+14:i-2); end [func,classes] = strtok(get(gcbh,'Tag')); if strcmp(func,'method') helptext = help([strtrim(classes),'/',functionname]); else helptext = help(functionname); end helpFigure = figure('MenuBar','none','Toolbar','none','Name',strcat(functionname,' help'),'NumberTitle','off','Units','pixels','Position',[200,200,500,300],'Resize','on','ResizeFcn','refresh(gcf)','Tag','helpwindow','Color', get(0, 'defaultuicontrolbackgroundcolor')); % Help text: uicontrol('Parent',helpFigure,'Units','normalized','HorizontalAlignment','left','Position',[0 0 1 1],'FontSize',8,'String',helptext,'Visible','on','max',100,'Style','edit'); catch end end %---------------------------------------------------------------------- end