Skip to content

Commit

Permalink
Common: hide GUIMain's Controls array
Browse files Browse the repository at this point in the history
  • Loading branch information
ivan-mogilko committed Feb 9, 2019
1 parent a2247b8 commit ab371f6
Show file tree
Hide file tree
Showing 16 changed files with 121 additions and 107 deletions.
103 changes: 55 additions & 48 deletions Common/gui/guimain.cpp
Expand Up @@ -84,7 +84,7 @@ void GUIMain::InitDefaults()

OnClickHandler.Empty();

Controls.clear();
_controls.clear();
_ctrlRefs.clear();
_ctrlDrawOrder.clear();
}
Expand All @@ -94,26 +94,26 @@ int GUIMain::FindControlUnderMouse(int leeway, bool must_be_clickable) const
if (loaded_game_file_version <= kGameVersion_262)
{
// Ignore draw order On 2.6.2 and lower
for (size_t i = 0; i < Controls.size(); ++i)
for (size_t i = 0; i < _controls.size(); ++i)
{
if (!Controls[i]->IsVisible())
if (!_controls[i]->IsVisible())
continue;
if (!Controls[i]->IsClickable() && must_be_clickable)
if (!_controls[i]->IsClickable() && must_be_clickable)
continue;
if (Controls[i]->IsOverControl(mousex, mousey, leeway))
if (_controls[i]->IsOverControl(mousex, mousey, leeway))
return i;
}
}
else
{
for (size_t i = Controls.size(); i-- > 0;)
for (size_t i = _controls.size(); i-- > 0;)
{
const int ctrl_index = _ctrlDrawOrder[i];
if (!Controls[ctrl_index]->IsVisible())
if (!_controls[ctrl_index]->IsVisible())
continue;
if (!Controls[ctrl_index]->IsClickable() && must_be_clickable)
if (!_controls[ctrl_index]->IsClickable() && must_be_clickable)
continue;
if (Controls[ctrl_index]->IsOverControl(mousex, mousey, leeway))
if (_controls[ctrl_index]->IsOverControl(mousex, mousey, leeway))
return ctrl_index;
}
}
Expand All @@ -132,7 +132,14 @@ int GUIMain::FindControlUnderMouse(int leeway) const

int GUIMain::GetControlCount() const
{
return (int32_t)Controls.size();
return (int32_t)_controls.size();
}

GUIObject *GUIMain::GetControl(int index) const
{
if (index < 0 || (size_t)index >= _controls.size())
return NULL;
return _controls[index];
}

GUIControlType GUIMain::GetControlType(int index) const
Expand Down Expand Up @@ -188,18 +195,18 @@ bool GUIMain::IsVisible() const
void GUIMain::AddControl(GUIControlType type, int id, GUIObject *control)
{
_ctrlRefs.push_back(std::make_pair(type, id));
Controls.push_back(control);
_controls.push_back(control);
}

void GUIMain::RemoveAllControls()
{
_ctrlRefs.clear();
Controls.clear();
_controls.clear();
}

bool GUIMain::BringControlToFront(int index)
{
return SetControlZOrder(index, (int)Controls.size() - 1);
return SetControlZOrder(index, (int)_controls.size() - 1);
}

void GUIMain::Draw(Bitmap *ds)
Expand Down Expand Up @@ -243,11 +250,11 @@ void GUIMain::DrawAt(Bitmap *ds, int x, int y)

SET_EIP(379)

for (size_t ctrl_index = 0; ctrl_index < Controls.size(); ++ctrl_index)
for (size_t ctrl_index = 0; ctrl_index < _controls.size(); ++ctrl_index)
{
set_eip_guiobj(_ctrlDrawOrder[ctrl_index]);

GUIObject *objToDraw = Controls[_ctrlDrawOrder[ctrl_index]];
GUIObject *objToDraw = _controls[_ctrlDrawOrder[ctrl_index]];

if (!objToDraw->IsEnabled() && gui_disabled_style == GUIDIS_BLACKOUT)
continue;
Expand Down Expand Up @@ -305,16 +312,16 @@ void GUIMain::Poll()
int ctrl_index = FindControlUnderMouse();

if (MouseOverCtrl == MOVER_MOUSEDOWNLOCKED)
Controls[MouseDownCtrl]->OnMouseMove(mousex, mousey);
_controls[MouseDownCtrl]->OnMouseMove(mousex, mousey);
else if (ctrl_index != MouseOverCtrl)
{
if (MouseOverCtrl >= 0)
Controls[MouseOverCtrl]->OnMouseLeave();
_controls[MouseOverCtrl]->OnMouseLeave();

if (ctrl_index >= 0 && !Controls[ctrl_index]->IsEnabled())
if (ctrl_index >= 0 && !_controls[ctrl_index]->IsEnabled())
// the control is disabled - ignore it
MouseOverCtrl = -1;
else if (ctrl_index >= 0 && !Controls[ctrl_index]->IsClickable())
else if (ctrl_index >= 0 && !_controls[ctrl_index]->IsClickable())
// the control is not clickable - ignore it
MouseOverCtrl = -1;
else
Expand All @@ -323,14 +330,14 @@ void GUIMain::Poll()
MouseOverCtrl = ctrl_index;
if (MouseOverCtrl >= 0)
{
Controls[MouseOverCtrl]->OnMouseEnter();
Controls[MouseOverCtrl]->OnMouseMove(mousex, mousey);
_controls[MouseOverCtrl]->OnMouseEnter();
_controls[MouseOverCtrl]->OnMouseMove(mousex, mousey);
}
}
guis_need_update = 1;
}
else if (MouseOverCtrl >= 0)
Controls[MouseOverCtrl]->OnMouseMove(mousex, mousey);
_controls[MouseOverCtrl]->OnMouseMove(mousex, mousey);
}

MouseWasAt.X = mousex;
Expand All @@ -344,8 +351,8 @@ void GUIMain::RebuildArray()
GUIControlType thistype;
int32_t thisnum;

Controls.resize(_ctrlRefs.size());
for (size_t i = 0; i < Controls.size(); ++i)
_controls.resize(_ctrlRefs.size());
for (size_t i = 0; i < _controls.size(); ++i)
{
thistype = _ctrlRefs[i].first;
thisnum = _ctrlRefs[i].second;
Expand All @@ -354,22 +361,22 @@ void GUIMain::RebuildArray()
quit("GUIMain: rebuild array failed (invalid object index)");

if (thistype == kGUIButton)
Controls[i] = &guibuts[thisnum];
_controls[i] = &guibuts[thisnum];
else if (thistype == kGUILabel)
Controls[i] = &guilabels[thisnum];
_controls[i] = &guilabels[thisnum];
else if (thistype == kGUIInvWindow)
Controls[i] = &guiinv[thisnum];
_controls[i] = &guiinv[thisnum];
else if (thistype == kGUISlider)
Controls[i] = &guislider[thisnum];
_controls[i] = &guislider[thisnum];
else if (thistype == kGUITextBox)
Controls[i] = &guitext[thisnum];
_controls[i] = &guitext[thisnum];
else if (thistype == kGUIListBox)
Controls[i] = &guilist[thisnum];
_controls[i] = &guilist[thisnum];
else
quit("guimain: unknown control type found On gui");

Controls[i]->ParentId = ID;
Controls[i]->Id = i;
_controls[i]->ParentId = ID;
_controls[i]->Id = i;
}

ResortZOrder();
Expand All @@ -382,7 +389,7 @@ bool GUIControlZOrder(const GUIObject *e1, const GUIObject *e2)

void GUIMain::ResortZOrder()
{
std::vector<GUIObject*> ctrl_sort = Controls;
std::vector<GUIObject*> ctrl_sort = _controls;
std::sort(ctrl_sort.begin(), ctrl_sort.end(), GUIControlZOrder);

_ctrlDrawOrder.resize(ctrl_sort.size());
Expand Down Expand Up @@ -413,29 +420,29 @@ bool GUIMain::SendControlToBack(int index)

bool GUIMain::SetControlZOrder(int index, int zorder)
{
if (index < 0 || (size_t)index >= Controls.size())
if (index < 0 || (size_t)index >= _controls.size())
return false; // no such control

zorder = Math::Clamp(zorder, 0, (int)Controls.size() - 1);
const int old_zorder = Controls[index]->ZOrder;
zorder = Math::Clamp(zorder, 0, (int)_controls.size() - 1);
const int old_zorder = _controls[index]->ZOrder;
if (old_zorder == zorder)
return false; // no change

const bool move_back = zorder < old_zorder; // back is at zero index
const int left = move_back ? zorder : old_zorder;
const int right = move_back ? old_zorder : zorder;
for (size_t i = 0; i < Controls.size(); ++i)
for (size_t i = 0; i < _controls.size(); ++i)
{
const int i_zorder = Controls[i]->ZOrder;
const int i_zorder = _controls[i]->ZOrder;
if (i_zorder == old_zorder)
Controls[i]->ZOrder = zorder; // the control we are moving
_controls[i]->ZOrder = zorder; // the control we are moving
else if (i_zorder >= left && i_zorder <= right)
{
// controls in between old and new positions shift towards free place
if (move_back)
Controls[i]->ZOrder++; // move to front
_controls[i]->ZOrder++; // move to front
else
Controls[i]->ZOrder--; // move to back
_controls[i]->ZOrder--; // move to back
}
}
ResortZOrder();
Expand Down Expand Up @@ -477,14 +484,14 @@ void GUIMain::OnMouseButtonDown()
return;

// don't activate disabled buttons
if (!Controls[MouseOverCtrl]->IsEnabled() || !Controls[MouseOverCtrl]->IsVisible() ||
!Controls[MouseOverCtrl]->IsClickable())
if (!_controls[MouseOverCtrl]->IsEnabled() || !_controls[MouseOverCtrl]->IsVisible() ||
!_controls[MouseOverCtrl]->IsClickable())
return;

MouseDownCtrl = MouseOverCtrl;
if (Controls[MouseOverCtrl]->OnMouseDown())
if (_controls[MouseOverCtrl]->OnMouseDown())
MouseOverCtrl = MOVER_MOUSEDOWNLOCKED;
Controls[MouseDownCtrl]->OnMouseMove(mousex - X, mousey - Y);
_controls[MouseDownCtrl]->OnMouseMove(mousex - X, mousey - Y);
guis_need_update = 1;
}

Expand All @@ -501,7 +508,7 @@ void GUIMain::OnMouseButtonUp()
if (MouseDownCtrl < 0)
return;

Controls[MouseDownCtrl]->OnMouseUp();
_controls[MouseDownCtrl]->OnMouseUp();
MouseDownCtrl = -1;
guis_need_update = 1;
}
Expand Down Expand Up @@ -707,9 +714,9 @@ void ResortGUI(std::vector<GUIMain> &guis, bool bwcompat_ctrl_zorder = false)
{
GUIMain &gui = guis[gui_index];
gui.RebuildArray();
for (size_t ctrl_index = 0; ctrl_index < gui.Controls.size(); ++ctrl_index)
for (int ctrl_index = 0; ctrl_index < gui.GetControlCount(); ++ctrl_index)
{
GUIObject *gui_ctrl = gui.Controls[ctrl_index];
GUIObject *gui_ctrl = gui.GetControl(ctrl_index);
gui_ctrl->ParentId = gui_index;
gui_ctrl->Id = ctrl_index;
if (bwcompat_ctrl_zorder)
Expand Down
7 changes: 4 additions & 3 deletions Common/gui/guimain.h
Expand Up @@ -90,6 +90,8 @@ class GUIMain
int32_t FindControlUnderMouse(int leeway, bool must_be_clickable) const;
// Gets the number of the GUI child controls
int32_t GetControlCount() const;
// Gets control by its child's index
GUIObject *GetControl(int index) const;
// Gets child control's type, looks up with child's index
GUIControlType GetControlType(int index) const;
// Gets child control's global ID, looks up with child's index
Expand Down Expand Up @@ -165,16 +167,15 @@ class GUIMain

String OnClickHandler; // script function name

// Array of child control references (not exclusively owned!)
std::vector<GUIObject*> Controls;

private:
int32_t _flags; // style and behavior flags

// Array of types and control indexes in global GUI object arrays;
// maps GUI child slots to actual controls and used for rebuilding Controls array
typedef std::pair<GUIControlType, int32_t> ControlRef;
std::vector<ControlRef> _ctrlRefs;
// Array of child control references (not exclusively owned!)
std::vector<GUIObject*> _controls;
// Sorted array of controls in z-order.
std::vector<int32_t> _ctrlDrawOrder;
};
Expand Down
4 changes: 2 additions & 2 deletions Editor/AGS.Native/agsnative.cpp
Expand Up @@ -2831,7 +2831,7 @@ void ConvertGUIToBinaryFormat(GUI ^guiObj, GUIMain *gui)
numguibuts++;
}

Common::GUIObject *newObj = gui->Controls[gui->GetControlCount() - 1];
Common::GUIObject *newObj = gui->GetControl(gui->GetControlCount() - 1);
newObj->X = control->Left;
newObj->Y = control->Top;
newObj->Width = control->Width;
Expand Down Expand Up @@ -3520,7 +3520,7 @@ Game^ import_compiled_game_dta(const char *fileName)

for (int j = 0; j < guis[i].GetControlCount(); j++)
{
Common::GUIObject* curObj = guis[i].Controls[j];
Common::GUIObject* curObj = guis[i].GetControl(j);
GUIControl ^newControl = nullptr;
Common::GUIControlType ctrl_type = guis[i].GetControlType(j);
switch (ctrl_type)
Expand Down
2 changes: 1 addition & 1 deletion Engine/ac/dynobj/cc_guiobject.cpp
Expand Up @@ -37,5 +37,5 @@ void CCGUIObject::Unserialize(int index, const char *serializedData, int dataSiz
StartUnserialize(serializedData, dataSize);
int guinum = UnserializeInt();
int objnum = UnserializeInt();
ccRegisterUnserializedObject(index, guis[guinum].Controls[objnum], this);
ccRegisterUnserializedObject(index, guis[guinum].GetControl(objnum), this);
}
8 changes: 4 additions & 4 deletions Engine/ac/global_button.cpp
Expand Up @@ -33,7 +33,7 @@ void SetButtonText(int guin,int objn, const char*newtx) {
if (guis[guin].GetControlType(objn)!=kGUIButton)
quit("!SetButtonText: specified control is not a button");

GUIButton*guil=(GUIButton*)guis[guin].Controls[objn];
GUIButton*guil=(GUIButton*)guis[guin].GetControl(objn);
Button_SetText(guil, newtx);
}

Expand All @@ -44,7 +44,7 @@ void AnimateButton(int guin, int objn, int view, int loop, int speed, int repeat
if (guis[guin].GetControlType(objn)!=kGUIButton)
quit("!AnimateButton: specified control is not a button");

Button_Animate((GUIButton*)guis[guin].Controls[objn], view, loop, speed, repeat);
Button_Animate((GUIButton*)guis[guin].GetControl(objn), view, loop, speed, repeat);
}


Expand All @@ -55,7 +55,7 @@ int GetButtonPic(int guin, int objn, int ptype) {
quit("!GetButtonPic: specified control is not a button");
if ((ptype < 0) | (ptype > 3)) quit("!GetButtonPic: invalid pic type");

GUIButton*guil=(GUIButton*)guis[guin].Controls[objn];
GUIButton*guil=(GUIButton*)guis[guin].GetControl(objn);

if (ptype == 0) {
// currently displayed pic
Expand Down Expand Up @@ -85,7 +85,7 @@ void SetButtonPic(int guin,int objn,int ptype,int slotn) {
quit("!SetButtonPic: specified control is not a button");
if ((ptype<1) | (ptype>3)) quit("!SetButtonPic: invalid pic type");

GUIButton*guil=(GUIButton*)guis[guin].Controls[objn];
GUIButton*guil=(GUIButton*)guis[guin].GetControl(objn);
if (ptype==1) {
Button_SetNormalGraphic(guil, slotn);
}
Expand Down
8 changes: 4 additions & 4 deletions Engine/ac/global_gui.cpp
Expand Up @@ -82,7 +82,7 @@ void InterfaceOff(int ifn) {
guis[ifn].SetVisible(false);
if (guis[ifn].MouseOverCtrl>=0) {
// Make sure that the overpic is turned off when the GUI goes off
guis[ifn].Controls[guis[ifn].MouseOverCtrl]->OnMouseLeave();
guis[ifn].GetControl(guis[ifn].MouseOverCtrl)->OnMouseLeave();
guis[ifn].MouseOverCtrl = -1;
}
guis[ifn].OnControlPositionChanged();
Expand All @@ -97,7 +97,7 @@ void SetGUIObjectEnabled(int guin, int objn, int enabled) {
if ((objn<0) || (objn>=guis[guin].GetControlCount()))
quit("!SetGUIObjectEnabled: invalid object number");

GUIControl_SetEnabled(guis[guin].Controls[objn], enabled);
GUIControl_SetEnabled(guis[guin].GetControl(objn), enabled);
}

void SetGUIObjectPosition(int guin, int objn, int xx, int yy) {
Expand All @@ -106,7 +106,7 @@ void SetGUIObjectPosition(int guin, int objn, int xx, int yy) {
if ((objn<0) || (objn>=guis[guin].GetControlCount()))
quit("!SetGUIObjectPosition: invalid object number");

GUIControl_SetPosition(guis[guin].Controls[objn], xx, yy);
GUIControl_SetPosition(guis[guin].GetControl(objn), xx, yy);
}

void SetGUIPosition(int ifn,int xx,int yy) {
Expand All @@ -123,7 +123,7 @@ void SetGUIObjectSize(int ifn, int objn, int newwid, int newhit) {
if ((objn<0) || (objn >= guis[ifn].GetControlCount()))
quit("!SetGUIObjectSize: invalid object number");

GUIControl_SetSize(guis[ifn].Controls[objn], newwid, newhit);
GUIControl_SetSize(guis[ifn].GetControl(objn), newwid, newhit);
}

void SetGUISize (int ifn, int widd, int hitt) {
Expand Down

0 comments on commit ab371f6

Please sign in to comment.