source: trunk/src/read_GUI.m @ 643

Last change on this file since 643 was 591, checked in by sommeria, 11 years ago

various updates, in particular modification of series to do calculations in the cluster

File size: 4.9 KB
Line 
1% 'read_GUI':read a GUI and provide the data as a Matlab structure
2%----------------------------------------------------------------------
3% function struct=read_GUI(handle)
4%
5% OUTPUT:
6% struct: matlab structure containing the information displayed in the GUI
7% The content of a panel with tag 'tag' is displayed as a substructure struct.(tag) (recursive use of read_GUI)
8% Output of a GUI element with tag 'tag':
9%     -case 'checkbox','radiobutton','togglebutton': struct.(tag)=value
10%     -case'edit': struct.(tag)=string, 
11%         or, if the tag is in the form by 'num_tag',
12%         struct.(tag)=str2double(string). If the result is empty the  'UserData' is taken as the default input.
13%     -case 'listbox','popupmenu': struct.(tag)=selected string, or, if the tag is in the form by 'num_tag', struct.(tag)=str2double(string)
14%     -case 'table': struct.(tag)=data of the table
15%
16function struct=read_GUI(handle)
17%------------------------------------------------------------------------
18struct=[];%default
19hchild=get(handle,'children');
20hchild=flipdim(hchild,1);% reverse the order to respect the tab order in the GUI
21for ichild=1:numel(hchild)
22    if strcmp(get(hchild(ichild),'Visible'),'on')
23        object_type=get(hchild(ichild),'Type');
24        tag=get(hchild(ichild),'tag');
25        switch object_type
26            case 'uipanel'
27                eval(['struct.' tag '=read_GUI(hchild(ichild));'])
28            case 'uicontrol'
29                object_style=get(hchild(ichild),'Style');
30                check_input=1;%default
31                index=0;
32                switch object_style
33                    case {'checkbox','radiobutton','togglebutton'}
34                        input=get(hchild(ichild),'Value');
35                    case 'edit'
36                        separator=regexp(tag,'^num_','once');%look for the prefix 'num_'
37                        if isempty(separator)
38                            input=get(hchild(ichild),'String');
39                        else  %transform into numeric if the edit box begins by the prefix 'num_'                                           
40                            input=str2double(get(hchild(ichild),'String'));                       
41                            tag=regexprep(tag,'^num_','');
42                            % detect tag name ending by an index: then interpret the input as array(index)
43                            r=regexp(tag,'_(?<index>\d+)$','names');% detect tag name ending by an index
44                            if ~isempty(r)
45                                tag=regexprep(tag,['_' r.index '$'],'');
46                                index=str2double(r.index);
47                            end
48                            %deal with undefined input: retrieve the default value stored as UserData
49                            if isnan(input)
50                                input=get(hchild(ichild),'UserData');
51                                set(hchild(ichild),'String',num2str(input))
52                            end
53                        end                       
54                    case{'listbox','popupmenu'}
55                        listinput=get(hchild(ichild),'String');
56                        value=get(hchild(ichild),'Value');
57                        if ~isempty(listinput)
58                            if numel(value)==1% single selection
59                                if ischar(listinput)
60                                    input=listinput;
61                                else
62                                    input=listinput{value};
63                                end
64                            else % multiple selection
65                                input=listinput(value);
66                            end
67                        else
68                            check_input=0;
69                        end
70                        separator=regexp(tag,'^num_','once');
71                        if ~isempty(separator)
72                            input=str2double(input);% transform to numerical values if the uicontrol tag begins with 'num_'
73                            tag=regexprep(tag,'^num_','');
74                        end
75                    otherwise
76                        check_input=0;
77                end
78                if check_input%
79                    if index==0
80                       struct.(tag)=input;
81                    elseif ~isempty(input)
82                       struct.(tag)(index)=input;
83                    end
84                end
85            case 'uitable'
86                struct.(tag)=get(hchild(ichild),'Data');
87        end
88    end
89end
90% read UserData if relevant
91UserData=get(handle,'UserData');
92if isstruct(UserData)
93    List=fields(UserData);
94    for ilist=1:numel(List)
95        if isstruct(UserData.(List{ilist}))
96            heditbox=findobj(handle,'Tag',List{ilist},'Style','edit','Visible','on');
97            if isequal(numel(heditbox),1)
98                struct.(List{ilist})=UserData.(List{ilist});
99            end
100        end
101    end
102end
Note: See TracBrowser for help on using the repository browser.