function ui_grafika(varargin)

% Uživatelská grafika
%
% Funkce vytvoří grafické uživatelské okno, vykreslí kouli a umožní
% interaktivně měnit některé parametry zobrazení.
%

% základní funkcí pro tvorbu uživatelského rozhraní je:
%
%   uicontrol
%
% nastavením atributů objektu se ovlivní typ prvku, poloha,
% rozměry, ...
%
%    Style - typ graficého prvku (checkbox, slider, pushbutton, ...)
%    Units - rozměrové jednotky (normalized, centimeters, points, ...)
%            nomralized: levý dolní roh = [0,0], pravý horní roh = [1,1]
%    Position - pozice levého dolního rohu a rozměry grafického okna
%               [x, y, šířka, výška]
%    Tag - označení objektu pro potřeby pozdějšího vyhledání
%    String - text, popisek
%    Value - hodnota prvku (např. u checkboxu: zaškrtnuto = 1, jinak 0)
%    CallBack - vazba mezi grafickým prvkem a libovolnou funkcí, ta
%               je vyvolána změnou graf. prvku (stisknutím
%               tlačítka, zaškrtnutím boxu, výběrem v menu, ...)
%
% další funkce pro tvorbu uživatelského rozhraní jsou např.:
%
%   uigetfile, uiputfile, uimenu, menu, ...
%


% otestuj zda je zadán parametr, pokud ne, akce = 'inicializace'
if nargin >= 1
  akce = varargin{1};
else
  akce = 'init';
end

switch akce

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % inicializace UI, vykreslení koule
  case 'init'

    % vytvoření grafického okna
    figure('NumberTitle', 'off', ... % nezobrazuj číslo graf. okna
           'Name', 'Ukazkove GUI', ... % název graf. okna
           'Units', 'normalized', ... % jednotky 'normalized'
           'Position', [0.2 0.2 0.6 0.6 ]); % pozice a rozměry
                                            % grafického okna:
                                            % [x, y, šírka, výška]

    % vytvoření os
    axes('Units', 'normalized', ...
         'Position', [0.1 0.1 0.6 0.8 ]);  % pozice a rozměry os

    % zaškrtávací box pro zapnutí/vypnutí zobrazení osy
    uicontrol('Style','checkbox', ... % graf. prvek typu 'checkbox'
              'String', 'Osy', ... % popisek u graf. prvku
              'Units', 'normalized',... % jednotky 'normalized'
              'Position', [0.8 0.7 0.15 0.05], ... % pozice a rozměry
              'Value', [1], ... % počáteční hodnota, 1 = zaškrtnuto
              'Tag', 'osy_zapvyp', ... % označení prvku
              'CallBack', 'ui_grafika(''osy_zapvyp'')'); % vazba na akci

    % tlačítko konec
    uicontrol('Style', 'pushbutton', ... % graf. prvek typu tlačítko
              'String', 'Konec', ... % popisek tlačítka
              'Units', 'normalized', ... % jednotky 'normalized'
              'Position', [0.8 0.1 0.15 0.05], ...
              'CallBack', 'delete(gcf)'); % vazba na akci -
                                          % smazaní graf. okna

    % menu pro volbu barevné palety
    uicontrol('Style', 'popupmenu', ... % graf. prvek typu vyskakovací menu
              'String', 'hsv|gray|copper|autumn|cool|jet|hot|bone', ... % položky menu oddělené |
              'Units', 'normalized', ... % jednotky 'normalized'
              'Position', [0.8 0.6 0.15 0.05], ... % pozice a rozměry
              'Tag', 'barevna_mapa', ... % označení prvku
              'CallBack', 'ui_grafika(''barevna_mapa'')');  % vazba na akci

    % popisek grafu
    uicontrol('Style', 'edit', ... % graf. prvek typu editovatelné pole
              'String', 'Koule', ... % popisek grafu
              'Units', 'normalized', ... % jednotky 'normalized'
              'Position',[0.8 0.9 0.15 0.04], ... % pozice a rozměry
              'Tag', 'popis', ... % označení prvku
              'CallBack', 'ui_grafika(''popis'')'); % vazba na akci


    % změna průhlednosti
    uicontrol('Style', 'slider', ... % graf. prvek typu "šoupátko"
              'Units', 'normalized', ... % jednotky 'normalized'
              'Position', [0.8 0.8 0.15 0.04], ... % pozice a rozměry
              'Tag', 'pruhlednost', ... % označení prvku
              'Value', 1, ... % 1 = průhledné, 0 = neprůhledné
              'CallBack', 'ui_grafika(''pruhlednost'')'); % vazba na akci


    % vykreslení koule
    [X Y Z] = sphere(30);
    koule = surf(X, Y, Z, 'LineWidth', 2, 'Tag', 'koule');
    axis equal

    % vykreslení popisku z pole typu edit
    h = findobj('Tag', 'popis'); % nalezne ukazatel na objekt, který má
                                 % atribut 'Tag' nastaven na řetězec 'popis'
    title(get(h, 'String')); % pomocí get(h, 'String') zjištěn
                             % aktuální řetězec v poli edit

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % osy zapnout/vypnout
  case 'osy_zapvyp'

    h = findobj('Tag', 'osy_zapvyp'); % nalezne ukazatel na objekt, který má
                                      % atribut 'Tag' nastaven na řetězec 'osy_zapvyp'

    if get(h, 'Value') == 0
      axis off % osy vypnout
    else
      axis on % osy zapnout
    end

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % barevna paleta
  case 'barevna_mapa'

  h = findobj('Tag', 'barevna_mapa'); % nalezne ukazatel na objekt
                                      % s 'barevna_mapa' v atributu 'Tag'

  switch get(h, 'Value') % atribut 'Value' obsahuje pořadové číslo
                         % vybrané položky v menu
    case 1, colormap(hsv);
    case 2, colormap(gray);
    case 3, colormap(copper);
    case 4, colormap(autumn);
    case 5, colormap(cool);
    case 6, colormap(jet);
    case 7, colormap(hot);
    case 8, colormap(bone);
  end

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % popisek
  case 'popis'

    h = findobj('Tag', 'popis'); % nalezne ukazatel na objekt, který má
                                 % atribut 'Tag' nastaven na řetězec 'popis'
    title(get(h, 'String')); % pomocí get(h, 'String') zjištěn
                             % aktuální řetězec v poli edit

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % nastaveni pruhlednosti
  case 'pruhlednost'
    h = findobj('Tag', 'pruhlednost');
    alpha(get(h, 'Value'));
end

