Skip to content

Commit b1347bf

Browse files
committed
Refactors eventManager and adds new useLivePlot class
1 parent 6ff30d4 commit b1347bf

11 files changed

Lines changed: 224 additions & 165 deletions

File tree

API/events/eventManager.m

Lines changed: 66 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ function setEvents(value)
2626
persistent events
2727

2828
if isempty(events)
29-
events = {};
29+
events = cell(0, 3);
3030
end
3131

3232
switch op
@@ -36,62 +36,56 @@ function setEvents(value)
3636
value = events;
3737
end
3838

39-
function value = getHandlers()
40-
% Gets the list of registered callbacks
39+
function funcID = getCallbackID(callback)
40+
% Generates a id for a callback handle function
4141
%
42-
% handlerList = eventManager.getHandlers();
43-
value = eventManager.handlers('get');
42+
% ID = getCallbackID(@disp)
43+
funcID = func2str(callback);
44+
funcDetails = functions(callback);
45+
if strcmp(funcDetails.type, 'anonymous')
46+
workspace = functions(callback).workspace{:};
47+
if isfield(workspace, 'obj') && isprop(workspace.obj, 'callback') && isprop(workspace.obj, 'figureId')
48+
funcID = sprintf('Function ''%s'' on figure %d', func2str(workspace.obj.callback), workspace.obj.figureId);
49+
end
50+
end
4451
end
4552

46-
function setHandlers(value)
47-
% Sets the list of registered callbacks
53+
function callback = validateCallback(callback)
54+
% Validate the given callback and return handle for the
55+
% callback
4856
%
49-
% eventManager.setHandlers(handlerList);
50-
eventManager.handlers('set', value);
51-
end
52-
53-
function value=handlers(op, newValue)
54-
% Helper to store the list of registered callbacks as static variable
55-
%
56-
% handlerList = eventManager.handlers('get');
57-
% eventManager.handlers('set', handlerList);
58-
persistent handlers
59-
60-
if isempty(handlers)
61-
handlers = {};
57+
% callback = validateCallback('disp');
58+
if ~isa(callback, 'function_handle') && (~isText(callback) || isempty(char(callback)))
59+
throw(exceptions.invalidType('Second value must be function name (text) or handle'));
6260
end
63-
64-
switch op
65-
case 'set'
66-
handlers = newValue;
61+
62+
if isText(callback)
63+
callback = str2func(callback);
6764
end
68-
value = handlers;
6965
end
7066

71-
function register(eventType, functionName)
67+
function register(eventType, callback)
7268
% Register a callback function for the given eventType. eventType
73-
% should be an eventTypes enum and functionName should be name of the
69+
% should be an eventTypes enum and callback should be name or handle of the
7470
% callback function.
7571
%
7672
% eventManager.register(eventTypes.Plot, 'plotRefSLDHelper');
7773
eventType = validateOption(eventType, 'eventTypes', 'Event type must be an eventTypes enum').value;
78-
79-
if ~isText(functionName) || isempty(char(functionName))
80-
throw(exceptions.invalidType('Second value must be function name (text)'));
81-
end
74+
callback = eventManager.validateCallback(callback);
8275

8376
events = eventManager.getEvents();
84-
handlers = eventManager.getHandlers();
77+
funcID = eventManager.getCallbackID(callback);
8578

86-
if isempty(events) || ~any([events{:}] == eventType)
87-
eventManagerInterface('register', eventType);
79+
if ~isempty(events)
80+
for i=1:size(events, 1)
81+
if strcmp(events{i, 1}, funcID) && events{i, 2} == eventType
82+
return
83+
end
84+
end
8885
end
8986

90-
events{end + 1} = eventType;
91-
handlers{end + 1} = functionName;
92-
93-
eventManager.setEvents(events)
94-
eventManager.setHandlers(handlers)
87+
events(end + 1, :) = {funcID, eventType, callback};
88+
eventManager.setEvents(events);
9589
end
9690

9791
function notify(eventType, data)
@@ -101,28 +95,50 @@ function notify(eventType, data)
10195
%
10296
% eventManager.notify(eventTypes.Message, 'wow');
10397
events = eventManager.getEvents();
104-
handlers = eventManager.getHandlers();
105-
10698
eventType = validateOption(eventType, 'eventTypes', 'Event type must be an eventTypes enum').value;
107-
for i=1:length(events)
108-
if (eventType == events{i})
99+
for i=1:size(events, 1)
100+
if eventType == events{i, 2}
109101
try
110-
funcHandle = str2func(handlers{i});
102+
funcHandle = events{i, 3};
111103
funcHandle(data);
112104
catch ME
113-
fprintf('EVENTMANAGER: calling %s function failed on line %d because: \n\n %s\n', handlers{i}, ME.stack(1).line, ME.message);
105+
fprintf('EVENTMANAGER: calling %s function failed on line %d because: \n\n %s\n', events{i, 1}, ME.stack(1).line, ME.message);
114106
end
115107
end
116108
end
117109
end
118110

119-
function clear()
120-
% Clear all register event callbacks
111+
function unregister(eventType, callback)
112+
% Remove specific event callbacks
113+
%
114+
% eventManager.unregister(eventTypes.Plot, 'plotRefSLDHelper');
115+
eventType = validateOption(eventType, 'eventTypes', 'Event type must be an eventTypes enum').value;
116+
callback = eventManager.validateCallback(callback);
117+
events = eventManager.getEvents();
118+
for i=size(events, 1):-1:1
119+
if (eventType == events{i, 2}) && strcmp(eventManager.getCallbackID(callback), events{i, 1})
120+
events(i, :) = [];
121+
end
122+
end
123+
eventManager.setEvents(events);
124+
end
125+
126+
function clear(varargin)
127+
% Clear all register event callbacks or specific types
121128
%
122129
% eventManager.clear();
123-
eventManager.setEvents({})
124-
eventManager.setHandlers({})
125-
eventManagerInterface('clear');
130+
% eventManager.clear(eventTypes.Plot);
131+
events = eventManager.getEvents();
132+
if isempty(events)
133+
return
134+
end
135+
if nargin == 0
136+
events = cell(0, 3);
137+
else
138+
eventType = validateOption(varargin{1}, 'eventTypes', 'Event type must be an eventTypes enum').value;
139+
events(eventType==[events{:, 2}], :) = [];
140+
end
141+
eventManager.setEvents(events);
126142
end
127143

128144
end

buildScript.m

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,6 @@
1414
ratMainCompileScript;
1515
ratMainCodeGen;
1616

17-
% Finally, change the paths back or the tests might fail...
18-
compilePath = fullfile(thisPath, 'compile', 'events');
19-
cd(compilePath);
20-
eventCompileScript;
21-
2217
compilePath = fullfile(thisPath, 'compile', 'customWrapper');
2318
cd(compilePath);
2419
wrapperCompileScript;

docs/source/livePlot.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ reflectivity, SLD's and so on as the fit progresses. By writing functions that '
99
In this section, we'll use this capability to build a live, updating plot of reflectivity and SLD, similar to that of the main RasCAL GUI.
1010

1111
.. note::
12-
The code in this section already exists in the repo (utilities / plotting), and you can activate the full updating plot at any time by just typing 'useUpdatePlot()' at the Matlab command window. But we detail it here to illustrate how to interact with events.
12+
The code in this section already exists in the repo (utilities / plotting), and you can activate the full updating plot at any time by just typing 'useLivePlot()' at the Matlab command window. But we detail it here to illustrate how to interact with events.
1313

1414
**Registering Listeners**
1515

docs/source/plotFunsBayes.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
==========================
44
Plotting Bayesian Analysis
5-
===========================
5+
==========================
66

77
A number of function exist for plotting the results of Bayesian analysis.
88

examples/miscellaneous/alternativeLanguages/speedTest.m

Lines changed: 0 additions & 29 deletions
This file was deleted.

0 commit comments

Comments
 (0)