Сповіщення
Очистити все

Опис GUI класів


NazarTmm
Ранг:
Досвідчений
Роль:
Модмейкер
Угруповання:
Бандити
Записи:
35
Приєднався:
9 місяців тому
Початок теми  

CUIWindow - базовий клас для решти віконних класів, у зв'язку з чим описаний найбільш докладно.

class CUIWindow {
CUIWindow(); // конструктор, як завжди доступний у вигляді глобальної функції

void SetPPMode(); // Увімкнення події подвійного кліку
void ResetPPMode(); // Вимкнення події подвійного кліку
void AttachChild (CUIWindow *); // Приєднання дочірнього вікна
void DetachChild (CUIWindow *); // від'єднання дочірнього вікна
void SetWindowName(string); // встановлення імені вікна, тег "window_name"
string WindowName(); // Отримання імені вікна
void SetFont(CGameFont*); // Тільки ТЧ, атрибут "font"
CGameFont* GetFont(); // Тільки ТЧ
void Enable (bool); // увімкнути/вимкнути можливість взаємодіяти з користувачем
bool IsEnabled(); // отримати статус активності
void SetAutoDelete(bool);
bool IsAutoDelete();
void Show(bool); // показати/приховати вікно
bool IsShown(); // отримати статус видимості
void Init(float x, float y, float width, float height); // Тільки ТЧ
void Init(Frect*); // Тільки ТЧ
// встановити положення верхнього лівого кута вікна щодо батьківського
void SetWndPos(float x, float y); // варіант ТЧ
void SetWndPos(vector2*); // варіант ПП
vector2 * GetWndPos (CUIWindow *); // Тільки ПП, отримати положення вікна
// встановити розміри вікна
void SetWndSize(float w, float h); // варіант ТЧ
void SetWndSize(vector2); // варіант ПП
// встановити положення та розміри вікна
void SetWndRect(Frect);
void SetWndRect(float x, float y, float width, float height); // Тільки ТЧ
void SetHeight(float h); // тільки ТЧ, встановити висоту вікна
float GetHeight(); // отримати висоту вікна
void SetWidth(float w); // тільки ТЧ, встановити ширину вікна
float GetWidth(); // отримати ширину вікна
};

Провідні від CUIWindow : CServerList список ігрових серверів. Очевидно, для синглового режиму мало застосовний.

class CServerList : CUIWindow {
CServerList();
void SetPlayerName(string);
void SetFilters(SServerFilters&);
 void RefreshList(bool);
void SetSortFunc(string, bool);
void NetRadioChanged(bool);
void ShowServerInfo();
void RefreshQuick();
void ConnectToSelected();
};

До нього (CServerList) додається службовий клас SServerFilters

class SServerFilters {
SServerFilters();

bool empty;
bool full;
bool listen_servers;
bool with_pass;
bool without_ff;
bool without_pass;
bool without_pb; // Тільки ТЧ
};

CUIComboBox - список, що випадає. У ТЧ є, але недоекспортований, у зв'язку з чим застосовувати його можна лише у ПП

class CUIComboBox : CUIWindow {
CUIComboBox();
void Init(float x, float y, float width); // Тільки ТЧ
void Init(float x, float y, float width, float height); // Тільки ТЧ
void ClearList(); // Тільки ПП
void SetListLength(int length);
void SetVertScroll(bool v);
void SetText(string s); // Тільки ПП
string GetText(); // Тільки ПП
void enable_id(int id); // Тільки ПП
void disable_id(int id); // Тільки ПП
CUIListBoxItem* AddItem(string s, int value); // Тільки ПП
void SetCurrentID(int id);
int CurrentID();
string GetTextOf(int id); // Тільки ПП
void SetCurrentValue(); // Тільки ПП
};

CUICustomEdit - поле редагування тексту:

class CUICustomEdit : CUIWindow {
void SetNumbersOnly(bool v); // Тільки ТЧ
void SetTextPosX(float x); // Тільки ТЧ
void SetTextPosY(float y); // Тільки ТЧ
void SetTextAlignment(enum CGameFont::EAligment); // Тільки ТЧ
CGameFont::EAligment GetTextAlignment(); // Тільки ТЧ
void SetTextColor(DWORD color); // Тільки ТЧ
DWORD GetTextColor(); // Тільки ТЧ
void SetText(string);
string GetText();
void SetNextFocusCapturer(CUICustomEdit*); // Тільки ПП
void CaptureFocus(bool v); // Тільки ПП
};

Від нього (CUICustomEdit) успадковані:

class CUIEditBox : CUICustomEdit {
CUIEditBox();

void InitTexture(string texture);
};

class CUIEditBoxEx : CUICustomEdit {
CUIEditBoxEx();

void InitTexture(string texture);
};

class CUIEditBox : CUICustomEdit {
CUIEditBox();

void InitTexture(string texture);
};

class CUIEditBoxEx : CUICustomEdit {
CUIEditBoxEx();

void InitTexture(string texture);
};

CUICustomSpin - поле прокручування значень. Не зовсім зрозуміло, чи можна його повноцінно використовувати через дуже мізерний набір власних властивостей:

class CUICustomSpin : CUIWindow {
string GetText();
};

class CUICustomSpin : CUIWindow {
string GetText();
};

Від CUICustomSpin успадковуються кілька класів, які взагалі нічого не додають до нього:

class CUISpinFlt : CUICustomSpin

class CUISpinNum : CUICustomSpin

class CUISpinText : CUICustomSpin

CUIDialogWnd – клас діалогового вікна. Сам по собі рідко використовується, але є базовим для надзвичайно важливого класу CUIScriptWnd:

lass CUIDialogWnd : CUIWindow {
void SetHolder (CDialogHolder *); // Тільки ТЧ
CDialogHolder* GetHolder();
void HideDialog(); // Тільки ПП
void ShowDialog(bool <приховувати індикатори>); // Тільки ПП
// замість цих функцій у ТЧ треба використовувати глобальну функцію level.start_stop_menu
};

Класи, успадковані від CUIDialogWnd:

*********************************************** ******** CUIMessageBoxEx ***************************** ***********************

CUIMessageBoxEx - діалогове вікно з функціональності схоже з CUIMessageBox:

class CUIMessageBoxEx : CUIDialogWnd {
CUIMessageBoxEx();

void Init(string template); // Тільки ТЧ
void InitMessageBox(string template); // Тільки ПП
setText(string text); // Тільки ПП
string GetPassword();
string GetHost();
};

Опис застосування:

Вікно створюється на кшталт нормального контролю у процесі ініціалізації головного вікна (зазвичай у типовому методі InitControls)

self.msg_box = CUIMessageBoxEx()

та реєструється для можливості обробляти події натискання на кнопки

self:Register(self.msg_box, "msg_box")

потім у методі InitCallBacks на кнопки цього вікна встановлюють колбеки

self:AddCallback("msg_box", ui_events.MESSAGE_BOX_OK_CLICKED, self.OnMsgOk, self)

Всі можливі колбеки для CUIMessageBoxEx:

 

MESSAGE_BOX_CANCEL_CLICKED
MESSAGE_BOX_COPY_CLICKED
MESSAGE_BOX_NO_CLICKED
MESSAGE_BOX_OK_CLICKED
MESSAGE_BOX_QUIT_GAME_CLICKED
MESSAGE_BOX_QUIT_WIN_CLICKED
MESSAGE_BOX_YES_CLICKED

у потрібний момент вікно можна викликати так:

для ТЧ

self.msg_box:Init(<рядок_ініціалізації_вікна>)

self:GetHolder():start_stop_menu(self.msg_box, true)

для ПП

self.msg_box:InitMessageBox(<рядок_ініціалізації_вікна>)

self.msg_box:SetText(<повідомлення>) // необов'язкова дія

self.msg_box:ShowDialog(true)

<рядок_ініціалізації_вікна> посилається на один із описів діалогів

з файлу config\ui\message_box.xml

приклади та подробиці дивись там. Лише кілька коментарів. Там можна створити своє вікно, але потрібно дотримуватись шаблонних імен частин цього вікна.

Можна змінювати текстури власне вікна, додавати типові кнопки "так, ні, ок, скасування", можна змінювати іконку вікна. Можна також додавати рядки введення. Після виходу з вікна, що можна відстежити колбеками, введені значення можна отримати за допомогою методів GetPassword та GetHost.

******************************************** ******** CUIMessageBoxEx ***************************** **************************

CUIScriptWnd – скриптовий діалог. Надзвичайно важливий клас, основа для побудови всього інтерфейсу користувача. Це єдиний із усіх віконних класів, що дозволяє скриптове успадкування від себе. Це дозволяє створювати вікна з реакцією на події миші та клавіатури.

class CUIScriptWnd : CUIDialogWnd,DLL_Pure {
CUIScriptWnd();
DLL_Pure* _construct(); // від DLL_Pure, призначення невідоме
bool Load(string xml); // Незрозуміло навіщо - немає жодного прикладу використання. Можливо, колбек на завантаження
void Register(CUIWindow*, string name); // реєстрація контролю для можливості обробки подій
void Register(CUIWindow*); // робить те саме, але не встановлює ім'я, в ПП прибрана
void AddCallback(string name, int event, const function<void>&, object); // встановлення колбека на дії користувача
// event - константа із класу-перерахування ui_events
void AddCallback(string name, int event, const function<void>&); // у ПП прибрано
bool OnKeyboard(int dic, enum EUIMessages); // обробка подій від клавіатури
bool Dispatch (int cmd, int param); // ще якийсь обробник
function Update(); // схоже оновлення вікна у сенсі оновлення полів введення, треба розбиратися
// перелічені далі функції практично не потрібні й у ПП видалені зовсім
CUIFrameLineWnd* GetFrameLineWnd(string);
CUICheckButton* GetCheckButton(string);
//function GetListWndEx(string); // цієї можливо і в ТЧ немає
CUIPropertiesBox* GetPropertiesBox(string);
CUIButton * GetButton (string);
CUIListWnd* GetListWnd(string);
CUIStatic* GetStatic(string);
CUITabControl* GetTabControl(string);
CUIRadioButton* GetRadioButton(string);
CUIFrameWindow* GetFrameWindow(string);
CUIDialogWnd* GetDialogWnd(string);
CUIEditBox* GetEditBox(string);
CUIProgressBar* GetProgressBar(string);
CUIMessageBox* GetMessageBox(string);
};

CUIFrameLineWnd - як вікно з рамкою. Сам собою (ймовірно) не цікавий, але породжує кілька практично важливих класів:

class CUIFrameLineWnd : CUIWindow {
CUIFrameLineWnd();
void Init(string base_name, float x, float y, float w, float h, bool horiz = true); // Тільки ТЧ
void SetOrientation(bool horiz); // Тільки ТЧ
CUIStatic* GetTitleStatic(); // Тільки ТЧ
// SetWidth і SetHeight є і в ТЧ і ПП, але в ТЧ вони успадковані від батьківського
// вікна, а ПП введені додатково
void SetWidth(float w);
void SetHeight(float h);
void SetColor(DWORD color);
};

від нього (CUIFrameLineWnd) успадковуються:

// Тільки ТЧ

class CUILabel : CUIFrameLineWnd {
CUILabel ();
string GetText();
void SetText(string);
}

// Тільки ПП

class CUIListBoxItem : CUIFrameLineWnd {
CUIListBoxItem(float heght);

CUITextWnd* GetTextItem();
void SetTextColor(DWORD color);

void AddIconField(float width);
void AddTextField(string text, float width);
};

// від нього (CUIListBoxItem ? ) своєю чергою (теж лише ПП):

class CUIListBoxItemMsgChain : CUIListBoxItem {
CUIListBoxItemMsgChain(float heght);
};
CUIFrameWindow - теж щось із рамкою:


CUIFrameWindow : CUIWindow {
CUIFrameWindow();

void Init(string name, int x, int y, int w, int h); // Тільки ТЧ
CUIStatic* GetTitleStatic(); // Тільки ТЧ
// як і в CUIFrameLineWnd SetWidth і SetHeight є і в ТЧ і ПП, але в ТЧ
// вони успадковані від батьківського вікна, а ЗП введено додатково
void SetWidth(float w);
void SetHeight(float h);
void SetColor(DWORD color);
};

class CUIPropertiesBox : CUIFrameWindow {
CUIPropertiesBox();
bool AddItem(string);
void AutoUpdateSize();
void RemoveAll();
void RemoveItem(DWORD);
void Hide();
void Show(int, int); //(Frect, vector2) ??????????
};

CUIListWnd – список. Клас є тільки в ТЧ та активно там використовується. У ПП замість нього використовується CUIListBox, який успадкований від CUIScrollView, який у ТЧ є, але виглядає непрацездатним.

class CUIListWnd : CUIWindow {
CUIListWnd();
void SetTextColor(DWORD);
void ActivateList(bool);
bool IsListActive();
void EnableScrollBar(bool);
bool IsScrollBarEnabled();
void ShowSelectedItem(bool);
void ResetFocusCapture();

void ScrollToBegin();
void ScrollToEnd();
void ScrollToPos(int);
void SetItemHeight(int);
int GetLongestSignWidth();
int GetSize(); // кількість елементів
void SetVertFlip(bool);
bool GetVertFlip();
int GetItemPos(CUIListItem*);
CUIListItem* GetItem(int);
bool AddItem(CUIListItem*); // завжди повертає true
int GetSelectedItem();
void SetFocusedItem(int);
int GetFocusedItem();
void RemoveAll();
void RemoveItem(int);
};

до цього класу (CUIListWnd) додаються два службові CUIListItem та CUIListItemEx, які будуть описані далі в розділі успадкування від CUIStatic

CUIMMShniaga - цей контроль є комплексною конструкцією зі списком елементів і повзунком зі збільшувальним склом. Це частина головного меню, якщо ще не забули. Одним словом це якось не назвати, от і у розробників певне фантазії не вистачило. Звідси і таке ім'я =)

class CUIMMShniaga : CUIWindow {
// enum CUIMMShniaga::enum_page_id // тільки ПП
const epi_main = 0;
const epi_new_game = 1;
const epi_new_network_game = 2;

void ShowPage(enum CUIMMShniaga::enum_page_id); // Тільки ПП
void SetPage(enum CUIMMShniaga::enum_page_id, string xml_file, string xml_path); // Тільки ЗП
void SetVisibleMagnifier(bool);
};

CUIMapList , CUIMapInfo - мабуть, список мультиплеєрних карток. Як і у випадку зі списком серверів для синглу інтересу не представляє:

lass CUIMapList : CUIWindow {
CUIMapList();

void LoadMapList();
viud SaveMapList();
bool IsEmpty();
void ClearList(); // Тільки ПП
string GetCommandLine(string player);
EGameTypes GetCurGameType();
void SetServerParams(string);
void SetWeatherSelector(CUIComboBox*);
void SetModeSelector(CUISpinText*);
void SetMapPic (CUIStatic *);
void SetMapInfo(CUIMapInfo*);
void StartDedicatedServer();
void OnModeChange();
};

//до нього додається додатковий клас

class CUIMapInfo : CUIWindow {
CUIMapInfo();

void InitMap (string name); // варіант ТЧ
void InitMap (string name, string version); // варіант ПП
void Init(vector2 pos, vector2 sz); // Тільки ПП
};

CUIProgressBar - повзунок прогресу. У ТЧ недоекспортований, у зв'язку з чим практичний інтерес представляє лише під ПП:

class CUIProgressBar : CUIWindow {
CUIProgressBar();

float GetRange_max();
float GetRange_min();
void SetRange(float min, float max); // Тільки ТЧ
void SetProgressPos(float); // Тільки ЗП
float GetProgressPos(); // Тільки ЗП
};

C UIScrollView - клас є у всіх версіях движка, але під ТЧ ніде не задіяний. У ПП навпаки - замінює клас CUIListWnd (якщо точніше, замінює не він самим, а успадкований від нього):

class CUIScrollView : CUIWindow {
CUIScrollView();

void AddWindow(CUIWindow*, bool auto_delete);
void RemoveWindow(CUIWindow*);
void Clear();
void ScrollToBegin();
void ScrollToEnd();
int GetMinScrollPos();
int GetMaxScrollPos();
void SetScrollPos(int);
int GetCurrentScrollPos();
};

в ПП від нього (C UIScrollView) успадковується:

class CUIListBox : CUIScrollView {
CUIListBox();

void AddExistingItem(CUIListBoxItem*);
CUIListBoxItem* AddTextItem(string text);
void RemoveItem(CUIWindow*);
CUIListBoxItem* GetItemByIndex(int);
int GetSelectedIndex();
CUIListBoxItem* GetSelectedItem();
int GetSize();
void RemoveAll();
void ShowSelectedItem(bool);
CUIWindow* GetItem(int);
};
до цього (CUIScrollView) класу додаються службові класи CUIListBoxItem та CUIListBoxItemMsgChain, описані раніше.

UIStatic – дуже важливий клас. У ТЧ його можливості величезні. У ПП - істотно менше (це один із класів, що постраждали від змін найбільшою мірою), проте, як і раніше, залишається дуже важливим. У зв'язку з великою різницею версій опис наводиться окремо для ТЧ та ПП

Для ТЧ:

CUIStatic : CUIWindow {
CUIStatic();

void Init(float x, float y, float w, float h);
void Init(string texture, float x, float y, float w, float h);
void InitTexture(string texture);
void SetColor(DWORD color); // тло
DWORD GetColor() const;
void SetOriginalRect(float x, float y, float w, float h);
void SetTextureOffset(float x, float y);
void SetStretchTexture(bool);
bool GetStretchTexture();
void ClipperOn();
void ClipperOff();
bool GetClipperState();
void SetHeading(float angle);
float GetHeading();
setText(string text);
void SetTextST(string text); // Додатково транслює рядок
string GetText();
void SetTextX(float x);
float GetTextX();
void SetTextY(float y);
float GetTextY();
setTextColor(int a, int r, int g, int b);
void SetTextAlign(CGameFont::EAligment);
CGameFont::EAligment GetTextAlign();
};

Для ПП:

CUIStatic : CUIWindow {
CUIStatic();

void InitTexture(string texture);
void SetTextureRect(Frect*);
Frect* GetTextureRect();
void SetStretchTexture(bool);
CUILines* TextControl();
};

Частково втрачена функціональність класу для ТЧ винесена у додатковий клас (тільки ПП):

class CUILines {
void SetText(string);
void SetTextST(string); // з трансляцією
string GetText();
void SetTextColor(DWORD color);
void SetFont(CGameFont*);
void SetElipsis(bool);
};

CUISstatic важливий не тільки сам по собі. Від нього ще й успадковується багато практично важливих спеціалізованих класів:

Класи, встановлені від CUIStatic :

CUIButton кнопка:

class CUIButton : CUIStatic {
    CUIButton ();

    void SetHighlightColor(DWORD color); // тільки ПП
    void EnableTextHighlighting(bool); // тільки ПП
};

від нього успадковані:

спеціальна кнопка для роботи з контролем управління закладками:

class CUITabButton : CUIButton // нічого не додає

кнопка з трьома станами (немає наведення курсору, наведення курсору, натискання):

class CUI3tButton : CUIButton // нічого не додає

від неї у свою чергу успадкований перемикач:

class CUICheckButton : CUI3tButton {
    CUICheckButton ();
    
    void SetCheck(boolean);
    bool GetCheck();
    void SetDependControl(CUIWindow*);
};

CUITabControl - клас для керування закладкамиі:

CUITabControl : CUIWindow {
CUITabControl();

void AddItem(CUITabButton*);
void AddItem(string item, string texture, float x, float y, float h, float w); // варіант ТЧ
void AddItem(string item, string texture, vector2 pos, vector2 size); // варіант ПП
void RemoveAll();
int GetTabsCount() const;
CUIButton* GetButtonByIndex(int i); // Тільки ТЧ
void SetNewActiveTab(int i); // Тільки ТЧ
int GetActiveIndex(); // Тільки ТЧ
void RemoveItem(int i); // Тільки ТЧ
string GetActiveId(); // Тільки ПП
void SetActiveTab(string tab); // Тільки ПП
CUITabButton* GetButtonById(string id); // Тільки ПП
};

CUIMessageBox Вікно повідомлення. Є фактично не контролем, а майже повноцінним діалогом з полем введення:

class CUIMessageBox : CUIStatic {
CUIMessageBox();

void Init(string template); // Тільки ТЧ
void InitMessageBox(string template); // Тільки ПП
setText(string text); // Тільки ПП
string GetPassword();
string GetHost();
};

вікно керування сном (тільки ПП):

class CUISleepStatic : CUIStatic // немає нових методів

елемент списку (тільки ТЧ)

class CUIListItem : CUIButton // немає нових методів

просунутий елемент списку (тільки ТЧ)

class CUIListItemEx : CUIListItem {
CUIListItemEx();
void SetSelectionColor(DWORD color);
};

клас CUIListItemPair, згаданий в lua_help і успадкований від CUIListItemEx, схоже не існує. Може, колись і був...

CUITrackBar - повзунок. Як і деякі інші класи в ТЧ недоекспортовано до застосовного стану:

CUITrackBar : CUIWindow {
CUITrackBar();

void SetCheck(bool);
bool GetCheck();
float GetFValue(); // Тільки ПП
int GetIValue(); // Тільки ПП
void SetCurrentValue(); // Тільки ПП
};

CUITextWnd – якесь текстове поле. Є лише під ПП. Мабуть, частково компенсує втрату аналогічних методів інших класів.

class CUITextWnd : CUIWindow {
CUITextWnd();

void SetText(string);
void SetTextST(string);
string GetText();
void SetTextColor(DWORD color);
DWORD GetTextColor();
void SetFont(CGameFont*);
CGameFont* GetFont();
void SetTextComplexMode(bool);
void SetTextOffset(float x, float y);
void SetTextAlignment(enum CGameFont::EAligment);
void SetVTextAlignment(enum EVTextAlignment);
void AdjustHeightToText();
void AdjustWidthToText();
void SetEllipsis(bool); // Установка обрізання тексту (використовуючи три крапки)
};

* Не погано було б розділити класи елементів простого виведення статиків та діалогового режиму.

 

 

 

 


   
Цитата
Теги теми