Code covered by the BSD License  

Highlights from
3D Slicer

image thumbnail
from 3D Slicer by David Legland
Slicer for exploring 3D images (grayscale, color or vectorial) through planar or 3D slices.

uiextras.makeFlexDivider( parent, position, bgCol, orientation, showMarks )
function uic = makeFlexDivider( parent, position, bgCol, orientation, showMarks )
%makeFlexDivider  Create a divider widget and add markings if desired
%
%   This function is for internal use only.
%
%   See also: uiextras.VBoxFlex
%             uiextras.HBoxFlex
%             uiextras.GridFlex

%   Copyright 2010 The MathWorks, Inc.
%   $Revision: 354 $
%   $Date: 2010-11-01 10:07:13 +0000 (Mon, 01 Nov 2010) $

error( nargchk( 5, 5, nargin, 'struct' ) );

if strcmpi( showMarks, 'off' ) || position(3)<3 || position(4)<3
    % No amarkings or too small to show them, so draw a blank
    cdata = ones( position(4)-1, position(3)-1 ); % One less than the space since uicontrols always start with a blank pixel
    cdata = cat( 3, cdata*bgCol(1), cdata*bgCol(2), cdata*bgCol(3) );
else
    
    % Make the divider slightly darker than it's surroundings
    bgCol = 0.97*bgCol;
    
    % Determine the highlight and lowlight colors and create an empty image
    hiCol = 1-0.2*(1-bgCol);
    loCol = 0.8*bgCol;
    fgCol = 1-0.7*(1-bgCol);
    cdata = ones( position(4)-1, position(3)-1 ); % One less than the space since uicontrols always start with a blank pixel
    cdata = cat( 3, cdata*bgCol(1), cdata*bgCol(2), cdata*bgCol(3) );
    
    % Fill central region with foreground color. Note that the top and left get
    % a spare pixel anyway, so start at 1,1.
    cdata(1:end-1,1:end-1,1) = fgCol(1);
    cdata(1:end-1,1:end-1,2) = fgCol(2);
    cdata(1:end-1,1:end-1,3) = fgCol(3);
    
    % Add fletchings if there's space
    if strcmpi( orientation, 'Vertical' )
        % Vertical divider requires horizontal fletchings
        numFletches = min( 10, floor( position(4)/6 ) ); % Fill no more than half the space (3 pixels per mark, so divide by 6)
        y0 = round( (position(4)-numFletches*3 ) / 2 );
        for ii=1:numFletches
            y = y0+(ii-1)*3;
            % Add highlight
            cdata(y,1:end-1,1) = hiCol(1);
            cdata(y,1:end-1,2) = hiCol(2);
            cdata(y,1:end-1,3) = hiCol(3);
            % Add shadow
            cdata(y+1,1:end-1,1) = loCol(1);
            cdata(y+1,1:end-1,2) = loCol(2);
            cdata(y+1,1:end-1,3) = loCol(3);
        end
    else
        % Horizontal divider requires vertical fletchings
        numFletches = min( 10, floor( position(3)/6 ) ); % Fill no more than half the space (3 pixels per mark, so divide by 6)
        x0 = round( (position(3)-numFletches*3 ) / 2 );
        for ii=1:numFletches
            x = x0+(ii-1)*3;
            % Add highlight
            cdata(1:end-1,x,1) = hiCol(1);
            cdata(1:end-1,x,2) = hiCol(2);
            cdata(1:end-1,x,3) = hiCol(3);
            % Add shadow
            cdata(1:end-1,x+1,1) = loCol(1);
            cdata(1:end-1,x+1,2) = loCol(2);
            cdata(1:end-1,x+1,3) = loCol(3);
        end
        
    end
end

% If the first argument is a divider, we update it, otherwise create from
% scratch.
if strcmpi( get( parent, 'Type' ), 'UIControl' )
    % Update existing
    set( parent, ...
        'BackgroundColor', bgCol, ...
        'ForegroundColor', bgCol, ...
        'CData', cdata, ...
        'Position', position );
    uic = parent;
else
    % Create the widget
    uic = uicontrol( 'Parent', parent, ...
        'Style', 'Checkbox', ...
        'BackgroundColor', bgCol, ...
        'ForegroundColor', bgCol, ...
        'CData', cdata, ...
        'HitTest', 'on', ...
        'Enable', 'inactive', ...
        'Units', 'Pixels', ...
        'Position', position, ...
        'HandleVisibility', 'off' );
end

% Store the original position for later
setappdata( uic, 'OriginalPosition', position );

Contact us