function theResult = ListPick(theSourceList, thePrompt, ... theName, theMode, varargin) % ListPick/ListPick -- Move items from one listbox to another. % ListPick({theSourceList}, 'thePrompt', 'theName', 'theMode') creates % a modal dialog with {theSourceList} strings in a listbox, whose items % can be moved to and from the adjacent listbox by clicking on them. % The "Okay" button causes the destination list to be returned. % Otherwise, the empty-list is returned. 'ThePrompt' appears at the % top of the dialog, and 'theName' is the dialog's figure name. % 'TheMode' is 'unique' (default) or 'multiple'. In 'unique' mode, % the clicked item moves from one list to the other, whereas in 'multiple' % mode, the SourceList remains intact and only copies of its items move % to and from the destination list. % ListPick (no argument) demonstrates itself. % N.B. Multiple-selections in a listbox can be enabled by setting % the "Max" property to the maximum number of selections allowed. % Do not try to set "Value" to 0. If the "String" is set to an % empty cell array, leave the "Value" as is. % % N.B. With an "edit" control, use the "Max" property to specify % the number of allowed lines, separated by newlines. if nargin < 1, help(mfilename), theSourceList = 'demo'; end if isstr(theSourceList) & strcmp(theSourceList, 'demo') theSourceList = {'fum'; 'fi'; 'fee'; 'fo'}; thePrompt = 'Rearrange' ; theMode = 'Unique'; theName = ['ListPick -- ' theMode]; theList = listpick(theSourceList, thePrompt, theName, theMode) theNotes = {'do', 'do_', 're', 'mi', 'mi_', 'fa', 'fa_', 'so', 'la', 'la_', 'ti', 'ti_', ... 'Do', 'Do_', 'Re', 'Mi', 'Mi_', 'Fa', 'Fa_', 'So', 'La', 'La_', 'Ti', 'Ti_', ... 'DO', 'DO_', 'RE', 'MI', 'MI_', 'FA', 'FA_', 'SO', 'LA', 'LA_', 'TI', 'TI_', ... 'rest'}; theSourceList = theNotes; thePrompt = 'Compose Music' ; theMode = 'Multiple'; theName = ['ListPick -- ' theMode]; theSampleRate = 8192; t = 2 .* pi .* (0:theSampleRate/2) ./ theSampleRate; theFundamental = 220; % A below middle-C (264 Hz). theFrequencies = theFundamental .* (2 .^ (1/12)) .^ (0:length(theNotes)-1); theFrequencies(length(theFrequencies)) = 0; % Frequencies from John Pierce's book. theFrequencies = [220.00, 233.08, 246.94, 261.63, 277.18, 293.66, ... 311.13, 329.63, 349.23, 369.99, 392.00, 415.30].'; theFrequencies = theFrequencies * [1 2 4]; theFrequencies = [theFrequencies(:).', 0]; % theSounds = []; for i = 1:length(theNotes) theSounds = setfield(theSounds, theNotes{i}, theFrequencies(i)); end theSounds; thePlayedNotes = listpick(theSourceList, thePrompt, theName, theMode) for i = 1:length(thePlayedNotes) f = getfield(theSounds, thePlayedNotes{i}); sound(sin(f .* t), theSampleRate) end return end if nargin < 2, thePrompt = '<== Pick Items ==>'; end if nargin < 3, theName = ''; end if nargin < 4, theMode = 'unique'; end % N.B. We should use the prompt as follows: % {thePrompt, from_label, to_label}. if ~iscell(thePrompt), thePrompt = {thePrompt}; end if length(thePrompt) < 2, thePrompt{2} = 'From'; end if length(thePrompt) < 3, thePrompt{3} = 'To'; end theSourceList = [theSourceList(:)]; theDestinationList = cell(0, 1); if nargout > 1, theResult = cell(0, 1); end theFigure = figure('Name', theName, 'NumberTitle', 'off', ... 'WindowStyle', 'modal', 'Visible', 'off', 'Resize', 'off'); thePosition = get(theFigure, 'Position'); thePosition(2) = thePosition(2) + 0.10 .* thePosition(4); thePosition(3) = 0.5 .* thePosition(3); thePosition(4) = 0.80 .* thePosition(4); set(theFigure, 'Position', thePosition) theStruct.itSelf = theFigure; self = class(theStruct, 'listpick'); set(theFigure, 'UserData', self) if isempty(self), return, end theFrame = uicontrol('Style', 'frame', 'Visible', 'on', ... 'Units', 'normalized', 'Position', [0 0 1 1], ... 'BackgroundColor', [0.5 1 1]); theControls = zeros(7, 1); theControls(1) = uicontrol('Style', 'text', 'Tag', 'Label', ... 'String', thePrompt{1}); theControls(2) = uicontrol('Style', 'text', 'Tag', 'Label', ... 'String', thePrompt{2}); theControls(3) = uicontrol('Style', 'text', 'Tag', 'Label', ... 'String', thePrompt{3}); theControls(4) = uicontrol('Style', 'listbox', 'Tag', 'Source', ... 'String', theSourceList); theControls(5) = uicontrol('Style', 'listbox', 'Tag', 'Destination', ... 'String', theDestinationList); theControls(6) = uicontrol('Style', 'pushbutton', 'Tag', 'Cancel', ... 'String', 'Cancel', 'UserData', []); theControls(7) = uicontrol('Style', 'pushbutton', 'Tag', 'Okay', ... 'String', 'Okay', 'UserData', theDestinationList); theLayout = [ 10 10 10 10 10 10 10 10 20 20 20 20 30 30 30 30 40 40 40 40 50 50 50 50 40 40 40 40 50 50 50 50 40 40 40 40 50 50 50 50 40 40 40 40 50 50 50 50 40 40 40 40 50 50 50 50 40 40 40 40 50 50 50 50 Inf 60 60 Inf Inf 70 70 Inf]; uilayout(theControls, theLayout, [2 2 96 92]./100) set(theFrame, 'UserData', theControls) theCallback = ['event(get(gcf, ''UserData''), ''' theMode ''')']; set(theControls(4:7), 'Callback', theCallback) set(theControls(1:3), 'BackgroundColor', [0.5 1 1]); if any(findstr(computer, 'MAC')) set(theControls(4:5), 'FontName', 'Monaco', ... 'FontSize', 12, ... 'FontAngle', 'normal', ... 'FontWeight', 'normal') end if length(varargin) > 0 set(theControls(4:5), varargin{:}) end set(theFigure, 'Visible', 'on') waitfor(theFigure, 'UserData', []) result = get(gco, 'UserData'); delete(theFigure) if nargout > 0 theResult = result; else disp(result) end