unit uGUI;
////////////////////////////
// версия 0,8
////////////////////////////
// модуль элементов
// интерфейса
////////////////////////////

interface

uses OMEGA,uGeneralData;

type tCButton=object                    //круглая кнопка
      tex:array [1..5] of string;       //спрайты кнопки
      font:PFont2D;                     //шрифт кнопки

      c1:oeRect;                     //коллизии кнопки, с кругом почемуто не получается.
                                     //Толи коордты неверно для круга, задаю толи что
      xbtn,ybtn,                       //положение кнопки
      wbtn,hbtn:integer;               //и её размеры

      focus,                           //в фокусе
      activ:boolean;                   //активна
      caption:PChar;                   //описание

      showhelp,                        //показывать подсказку?
      btnanm,                          //подсказка анимируется?
      btnanmend:boolean;               //анимация подсказки закончена?

      hlpw,                             //ширина окна подсказки
      thlpw:integer;                    //ширина текста подсказки

      procedure Draw;                  //рисуем кнопку
      procedure Init(capt,nm1,nm2:string;x1,y1:integer;act:boolean;fnt:PFont2D); //инициализируем
      procedure Process;               //что с ней происходит?
     end;
{==============================================================}
     tMenuPanel=object
      Btn:array [1..10] of tCButton;    //кнопки на панели меню
      QBtn:integer;                    //кол-во кнопок на панели

      texture:string;                  //текстура панели

      x,y,w,h:integer;                 //положение, размеры
      alpha:integer;                   //и прозрачность панели

      procedure AddBtn(capt,nm1,nm2:string;x1,y1:integer;act:boolean;fnt:PFont2D); //добовляем кнопку на панель
      procedure Init(nm:string;x1,y1,w1,h1:integer); //инициализация панели
      procedure Draw; //рисуем панель
      procedure Process; //и обрабатываем события
     end;

{==============================================================}
{==========    всякие процедуры    ============================}
{==============================================================}
//procedure DrawWind(x,y,w,h:integer);   //рисуем рабочий стол, в котором лежат карты

procedure DrawGWind(x,y,w,h,a:integer);  //рисуем небольшой прямоугольник с эфектом стекла
procedure DrawFWind(t,x,y,w,h:integer);//рисуем выделение на карте, круглое или прямоугольное
{==============================================================}
{==============================================================}
{==============================================================}

implementation
{==============================================================}
{==========    всякие процедуры    ============================}
{==============================================================}
{procedure DrawWind(x,y,w,h:integer);  //рисуем стол, в котором лежат перфокарты
var i1,i2:integer;
begin

//версия окна 1, спрайты удалены!!!
//for i1:=1 to w do
// for i2:=1 to h do
//  res.Spr[res.FindSpr('fon')].Draw(x+i1*128-128,y+i2*128-128,0,1);

//res.Spr[res.FindSpr('fonltopgr')].Draw(x,y,0,1);
//res.Spr[res.FindSpr('fonlbottongr')].Draw(x,y+h*128-128,0,1);
//res.Spr[res.FindSpr('fonrtopgr')].Draw(x+w*128-128,y,0,1);
//res.Spr[res.FindSpr('fonrbottongr')].Draw(x+w*128-128,y+h*128-128,0,1);

//for i1:=1 to w-2 do
//res.Spr[res.FindSpr('fonbottongr')].Draw(x+i1*128,y,180,1);
//for i1:=1 to w-2 do
// res.Spr[res.FindSpr('fonbottongr')].Draw(x+i1*128,y+h*128-128,0,1);
//for i1:=1 to h-2 do
// res.Spr[res.FindSpr('fonlgr')].Draw(x,y+i1*128,0,1);
//for i1:=1 to h-2 do
// res.Spr[res.FindSpr('fonlgr')].Draw(x+w*128-128,y+i1*128,180,1);

//версия окна 2, спрайты удалены!!!
Pr2D_Rect(x+64,y+64,w-128,h-128,$3c4451,255,PR_Fill );

res.Spr[res.FindSpr('window1')].Draw(x,y,0,1);
res.Spr[res.FindSpr('window4')].Draw(x+w-64,y,0,1);
res.Spr[res.FindSpr('window3')].Draw(x+w-64,y+h-64,0,1);
res.Spr[res.FindSpr('window2')].Draw(x,y+h-64,0,1);

for i1:=1 to w-128 do begin
 res.Spr[res.FindSpr('window5')].Draw(x+i1+63,y,0,1);
 res.Spr[res.FindSpr('window5')].Draw(x+i1+63,y+w-24,180,1);
end;

for i1:=1 to h-128 do begin
 res.Spr[res.FindSpr('window6')].Draw(x,y+i1+63,180,1);
 res.Spr[res.FindSpr('window6')].Draw(x+w-64,y+i1+63,0,1);
end;

end;}

procedure DrawGWind(x,y,w,h,a:integer); //рисуем маленькое прозрачное окошко
begin

Pr2D_Rect(x,y,w,h,$003B7D,a,PR_Default );
Pr2D_Rect(x,y,w,h div 2+1,$bbbbbb,a,PR_FILL );
Pr2D_Rect(x,y+h div 2+1,w,h-h div 2-1,$aaaaaa,a,PR_FILL );

end;

procedure DrawFWind(t,x,y,w,h:integer);
begin
//окно двух типов - круглое и прямоугольное, для разных нужд
if t=1 then begin
 Pr2D_Rect(x,y,w,h,$003B7D,255,PR_Default);
 Pr2D_Rect(x+1,y+1,w-2,h-2,$bbbbbb,80,PR_FILL);
end else begin
 Pr2D_Circle(x,y,w,$003B7D,255,16,PR_DEFAULT);
 Pr2D_Circle(x,y,w-1,$bbbbbb,80,16,PR_FILL);
end;

end;
{==============================================================}
{=============   tCButton   ===================================}
{==============================================================}
procedure tCButton.Init(capt,nm1,nm2:string;x1,y1:integer;act:boolean;fnt:PFont2D);
begin

caption:=PChar(capt);

//типа получаем ссылку на спрайты для кнопки
tex[1]:=nm1;
tex[2]:=nm2;
tex[3]:='buttoncirclnormaltop';
tex[4]:='buttoncirclfocustop';
//параметры кнопки задаём
xbtn:=x1;
ybtn:=y1;
wbtn:=res.Spr[res.FindSpr(tex[1])].wx;
hbtn:=res.Spr[res.FindSpr(tex[1])].hx;

activ:=act;
focus:=false;

font:=fnt;
//задаём параметры коллизии кнопки
c1.X:=xbtn;
c1.Y:=ybtn;
c1.Width:=wbtn;
c1.Height:=hbtn;
//задаём параметры подсказки
showhelp:=false;
//задаём параметры анимации подсказки
btnanm:=false;
btnanmend:=false;

end;

procedure tCButton.Draw;
var t,x:integer;
    ts:PChar;
begin

//рисуем кнопку
res.Spr[res.FindSpr(tex[1])].Draw(xbtn,ybtn,0,1);
res.Spr[res.FindSpr(tex[2])].Draw(xbtn,ybtn,0,1);
if activ then
 if focus then res.Spr[res.FindSpr(tex[4])].Draw(xbtn,ybtn,0,1)
          else res.Spr[res.FindSpr(tex[3])].Draw(xbtn,ybtn,0,1);

//рисуем подсказку
if activ then ts:=caption
         else ts:=PChar(caption+' *не активна*');
t:=trunc(Text_GetWidth(font,ts,1,0)); //узнаём ширину текста

if mouse_x+30+t+20>=scrw then x:=mouse_x-10-t-20 else x:=mouse_x+30;
//прозрачность окошка обр. пропорционална его ширине
//чем шире тем менее прозрачно.
if hlpw<>0 then DrawGWind(x,mouse_y,hlpw,20,trunc(200*hlpw/thlpw+20));
//если анимация подсказки закончена, то рисуем текст подсказки
if btnanmend and showhelp then Text_Draw(font,x+10,mouse_y,ts,1,0,255,$003B7D);

end;

procedure tCButton.Process;
var ts:PChar;
begin

//если наведена мышка, меняем цвет текста
if col_pointinaabb(mouse_x,mouse_y,@c1) then focus:=true else focus:=false;
//если в фокусе, показываем подсказку и включаем анимацию
if focus then
begin
 showhelp:=true;
 btnanm:=true;
end else
begin
//если не в фокусе, подсказку не показываем
//выключаем анимацию и обнуляе показатель окончания анимации
 showhelp:=false;
 btnanm:=false;
 btnanmend:=false;
end;
//если показываем подсказку и включена анимация
//то увеличиваем ширину окна подсказки
if showhelp and btnanm then hlpw:=hlpw+20;
//если не показываем подсказку и ширина окна подсказки
//больше или = 1 то уменьшаем его ширину
if not showhelp and (hlpw>=1)then hlpw:=hlpw-40;
//если кнопка не активна, то укажем это в подсказке
if activ then ts:=caption
         else ts:=PChar(caption+' *не активна*');
//узнаём ширину текста подсказки
thlpw:=trunc(Text_GetWidth(font,ts,1,0))+20;
//если ширина окна подсказки сравняется с
//шириной текста подсказки
//то заканчиваем анимацию и
//укажем это в счётчике
if hlpw>thlpw-1 then begin
 btnanm:=false;
 hlpw:=thlpw;
 btnanmend:=true;
end;
//если ширина окна подсказки меньше 1 и не = 0
//то делаем её равной 0
if (hlpw<1) and (hlpw<>0) then hlpw:=0;

end;
{==============================================================}
{================   tMenuPanel   ==============================}
{==============================================================}
procedure tMenuPanel.Init(nm:string;x1,y1,w1,h1:integer);
begin
//получаем параметры
texture:=nm;
x:=x1;
y:=y1;
w:=w1;
h:=h1;
//задаём кол-во кнопок=0
QBtn:=0;

end;

procedure tMenuPanel.Draw;
var i:integer;
begin

//разные цвета пробывал
{ $6d5030}
{ $4a4235}
{ $4b6173}
//рисуем фон
Pr2D_Rect(x,y,w,h,$6d5030,255,PR_FILL );
//и клёпки
for i:=0 to h div res.Spr[res.FindSpr('menupanel')].hx do
 res.Spr[res.FindSpr('menupanel')].Draw(x+w-res.Spr[res.FindSpr('menupanel')].wx,y+i*res.Spr[res.FindSpr('menupanel')].hx,0,1);
//рисуем кнопки
for i:=1 to QBtn do
 Btn[i].Draw;

end;

procedure tMenuPanel.Process;
var i:integer;
begin

for i:=1 to QBtn do
 Btn[i].Process;

end;

procedure tMenuPanel.AddBtn(capt,nm1,nm2:string;x1,y1:integer;act:boolean;fnt:PFont2D);
begin

if QBtn<10 then begin
 Btn[QBtn+1].Init(capt,nm1,nm2,x1,y1,act,fnt);
 QBtn:=QBtn+1;
end else begin
 erorname:=SceneName+' - количество кнопок превышает максимальное';
 OE_Quit;
end;

end;

end.
