diff --git a/WidgetFolderBrowser.m b/WidgetFolderBrowser.m index c185640..2c0eb51 100644 --- a/WidgetFolderBrowser.m +++ b/WidgetFolderBrowser.m @@ -8,90 +8,104 @@ % sciclist@brain.mpg.de % Max-Planck Institute For Brain Research % - properties + + properties (Dependent) + + file + + end + + properties (Access = private) ui model end + events + + event_file + + end + methods function obj = WidgetFolderBrowser(varargin) % parse input parserObj = inputParser; - addParameter(parserObj, 'Parent', [], @(varin) (isempty(varin) || isgraphics(varin))); + addParameter(parserObj, 'Parent', [], @(varhandle) (isempty(varhandle) || isgraphics(varhandle))); addParameter(parserObj, 'Extension', '*.*', @ischar); parse(parserObj, varargin{:}); - - % create MVC + % ui component obj.ui = WidgetFolderBrowserUi(parserObj.Results.Parent); if ~isa(obj.ui, 'WidgetFolderBrowserUi') error('WidgetFolderBrowser: initializing ui failed!'); end + % model component obj.model = WidgetFolderBrowserModel(parserObj.Results.Extension); if ~isa(obj.model, 'WidgetFolderBrowserModel') error('WidgetFolderBrowserModel: initailizing model failed!'); end - % link controler with view and model - addlistener(obj.ui, 'event_fileLoad', @obj.fcnCallback_FileLoad); - addlistener(obj.ui, 'event_fileNext', @obj.fcnCallback_FileNext); - addlistener(obj.ui, 'event_filePrevious', @obj.fcnCallback_FilePrevious); - addlistener(obj.ui, 'event_folderLoad', @obj.fcnCallback_FolderLoad); - addlistener(obj.model, 'file', 'PostSet', @obj.fcnCallback_FileUpdated); + % link ui events + addlistener(obj.ui, 'event_fileLoad', @obj.fcnCallback_fileLoad); + addlistener(obj.ui, 'event_fileNext', @obj.fcnCallback_fileNext); + addlistener(obj.ui, 'event_filePrevious', @obj.fcnCallback_filePrevious); + addlistener(obj.ui, 'event_folderLoad', @obj.fcnCallback_folderLoad); + + % link model events + addlistener(obj.model, 'file', 'PostSet', @obj.fcnCallback_fileUpdated); end end methods - %%% --- callback functions --- %%% - - function obj = fcnCallback_FileLoad(obj, ~, ~) + %% @ ui event_fileLoad + function obj = fcnCallback_fileLoad(obj, ~, ~) obj.model.fileLoad(); - set(obj.ui.pushButton_PrevFile, 'Enable', 'off'); - set(obj.ui.pushButton_NextFile, 'Enable', 'off'); - end - function obj = fcnCallback_FileNext(obj, ~, ~) + %% @ ui event_fileNext + function obj = fcnCallback_fileNext(obj, ~, ~) obj.model.fileUpdate(1); end - function obj = fcnCallback_FilePrevious(obj, ~, ~) + %% @ ui event_filePrevious + function obj = fcnCallback_filePrevious(obj, ~, ~) obj.model.fileUpdate(-1); end - function obj = fcnCallback_FolderLoad(obj, ~, ~) + %% @ ui event_folderLoad + function obj = fcnCallback_folderLoad(obj, ~, ~) obj.model.folderLoad(); - set(obj.ui.pushButton_PrevFile, 'Enable', 'on'); - set(obj.ui.pushButton_NextFile, 'Enable', 'on'); - end - function obj = fcnCallback_FileUpdated(obj, ~, ~) + %% @ model event_fileUpdate + function obj = fcnCallback_fileUpdated(obj, ~, ~) - % update status - [~, fileTag] = fileparts(obj.model.file); - %fprintf('file: %s\n', obj.model.file); + obj.ui.updateFileName(obj.model.fileTag); + obj.ui.updateFileCounter(obj.model.index, obj.model.listSize); + notify(obj, 'event_file'); - set(obj.ui.text_FileName, 'String', fileTag); - set(obj.ui.text_FileCounter, 'String', ... - sprintf('%d / %d', obj.model.index, obj.model.listSize)); + end + + %% @ request file + function varfile = get.file(obj) + varfile = obj.model.file; end diff --git a/WidgetFolderBrowserModel.m b/WidgetFolderBrowserModel.m index 05c0127..f4e6e6d 100644 --- a/WidgetFolderBrowserModel.m +++ b/WidgetFolderBrowserModel.m @@ -26,6 +26,7 @@ properties (Dependent) listSize + fileTag end @@ -119,5 +120,11 @@ value = length(obj.list); end + + function vartag = get.fileTag(obj) + + [~, vartag] = fileparts(obj.file); + + end end end \ No newline at end of file diff --git a/WidgetFolderBrowserTest.m b/WidgetFolderBrowserTest.m new file mode 100644 index 0000000..44aa848 --- /dev/null +++ b/WidgetFolderBrowserTest.m @@ -0,0 +1,30 @@ +%% WidgetFolderBrowserTest +% test script and example usage +% +% Aug 2017 +% + +function WidgetFolderBrowserTest() + + %% clean test + clc + clear variables + close all + + + %% evoke widget + obj = WidgetFolderBrowser(); + if ~isa(obj, 'WidgetFolderBrowser') + error('WidgetFolderBrowser :: test failed!'); + end + + %% set listener callback + addlistener(obj, 'event_file', @fcnCallback_testEvent); + +end + +function fcnCallback_testEvent(~, ~) + + disp('EVENT_FILE'); + +end diff --git a/WidgetFolderBrowserUi.m b/WidgetFolderBrowserUi.m index c80a57a..dea189e 100644 --- a/WidgetFolderBrowserUi.m +++ b/WidgetFolderBrowserUi.m @@ -9,7 +9,7 @@ % Max-Planck Institute For Brain Research % - properties + properties (Access = private) parent panel @@ -49,12 +49,12 @@ methods - function obj = WidgetFolderBrowserUi(ui_parent) + function obj = WidgetFolderBrowserUi(varhandle) % render parent - if isempty(ui_parent) + if isempty(varhandle) obj.parent = figure(... 'Visible', 'on',... @@ -66,13 +66,13 @@ 'Position', obj.UIWINDOW_SIZE); movegui(obj.parent, 'northwest'); - elseif isgraphics(ui_parent) + elseif isgraphics(varhandle) - obj.parent = ui_parent; + obj.parent = varhandle; else - error('uirender::invalid input variable for file constructor'); + error('WidgetFolderBrowserUi::invalid input variable for file constructor'); end @@ -81,6 +81,24 @@ end + function obj = updateFileName(obj, vartext) + + set(obj.text_FileName, 'String', vartext); + + end + + function obj = updateFileCounter(obj, varcount, varsize) + + set(obj.text_FileCounter, 'String', ... + sprintf('%d / %d', varcount, varsize)); + + end + + + end + + methods (Access = private) + function obj = render(obj) %%% --- create widget panel --- %%% @@ -149,12 +167,16 @@ function obj = onClick_pushButton_LoadFile(obj, ~, ~) + set(obj.pushButton_PrevFile, 'Enable', 'off'); + set(obj.pushButton_NextFile, 'Enable', 'off'); notify(obj, 'event_fileLoad'); end function obj = onClick_pushButton_LoadFolder(obj, ~, ~) + set(obj.pushButton_PrevFile, 'Enable', 'on'); + set(obj.pushButton_NextFile, 'Enable', 'on'); notify(obj, 'event_folderLoad'); end @@ -173,7 +195,6 @@ end - end end diff --git a/test/test.m b/test/test.m deleted file mode 100644 index b4d0b85..0000000 --- a/test/test.m +++ /dev/null @@ -1,18 +0,0 @@ -%% WidgetFolderBrowser -% test script and example usage -% -% Aug 2017 -% - -clc -clear variables -close all - - -addpath([pwd, filesep, '..', filesep]); - -%% evoke widget -obj = WidgetFolderBrowser(); -if ~isa(obj, 'WidgetFolderBrowser') - error('WidgetFolderBrowser :: test failed!'); -end