aboutsummaryrefslogtreecommitdiff
path: root/archive/hgehelp/hgegui.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'archive/hgehelp/hgegui.cpp')
-rw-r--r--archive/hgehelp/hgegui.cpp397
1 files changed, 397 insertions, 0 deletions
diff --git a/archive/hgehelp/hgegui.cpp b/archive/hgehelp/hgegui.cpp
new file mode 100644
index 0000000..2faf24c
--- /dev/null
+++ b/archive/hgehelp/hgegui.cpp
@@ -0,0 +1,397 @@
+/*
+** Haaf's Game Engine 1.7
+** Copyright (C) 2003-2007, Relish Games
+** hge.relishgames.com
+**
+** hgeGUI helper class implementation
+*/
+
+
+#include "hgegui.h"
+
+
+HGE *hgeGUI::hge=0;
+HGE *hgeGUIObject::hge=0;
+
+
+hgeGUI::hgeGUI()
+{
+ hge=hgeCreate(HGE_VERSION);
+
+ ctrls=0;
+ ctrlLock=0;
+ ctrlFocus=0;
+ ctrlOver=0;
+ navmode=HGEGUI_NONAVKEYS;
+ bLPressed=bLReleased=false;
+ bRPressed=bRReleased=false;
+ nWheel=0;
+ mx=my=0.0f;
+ nEnterLeave=0;
+ sprCursor=0;
+}
+
+hgeGUI::~hgeGUI()
+{
+ hgeGUIObject *ctrl=ctrls, *nextctrl;
+
+ while(ctrl)
+ {
+ nextctrl=ctrl->next;
+ delete ctrl;
+ ctrl=nextctrl;
+ }
+
+ hge->Release();
+}
+
+void hgeGUI::AddCtrl(hgeGUIObject *ctrl)
+{
+ hgeGUIObject *last=ctrls;
+
+ ctrl->gui=this;
+
+ if(!ctrls)
+ {
+ ctrls=ctrl;
+ ctrl->prev=0;
+ ctrl->next=0;
+ }
+ else
+ {
+ while(last->next) last=last->next;
+ last->next=ctrl;
+ ctrl->prev=last;
+ ctrl->next=0;
+ }
+}
+
+void hgeGUI::DelCtrl(int id)
+{
+ hgeGUIObject *ctrl=ctrls;
+
+ while(ctrl)
+ {
+ if(ctrl->id == id)
+ {
+ if(ctrl->prev) ctrl->prev->next = ctrl->next;
+ else ctrls = ctrl->next;
+ if(ctrl->next) ctrl->next->prev = ctrl->prev;
+ delete ctrl;
+ return;
+ }
+ ctrl=ctrl->next;
+ }
+}
+
+hgeGUIObject* hgeGUI::GetCtrl(int id) const
+{
+ hgeGUIObject *ctrl=ctrls;
+
+ while(ctrl)
+ {
+ if(ctrl->id == id) return ctrl;
+ ctrl=ctrl->next;
+ }
+
+ return NULL;
+}
+
+void hgeGUI::MoveCtrl(int id, float x, float y)
+{
+ hgeGUIObject *ctrl=GetCtrl(id);
+ ctrl->rect.x2=x + (ctrl->rect.x2 - ctrl->rect.x1);
+ ctrl->rect.y2=y + (ctrl->rect.y2 - ctrl->rect.y1);
+ ctrl->rect.x1=x;
+ ctrl->rect.y1=y;
+}
+
+void hgeGUI::ShowCtrl(int id, bool bVisible)
+{
+ GetCtrl(id)->bVisible=bVisible;
+}
+
+void hgeGUI::EnableCtrl(int id, bool bEnabled)
+{
+ GetCtrl(id)->bEnabled=bEnabled;
+}
+
+void hgeGUI::SetNavMode(int mode)
+{
+ navmode=mode;
+}
+
+void hgeGUI::SetCursor(hgeSprite *spr)
+{
+ sprCursor=spr;
+}
+
+
+void hgeGUI::SetColor(DWORD color)
+{
+ hgeGUIObject *ctrl=ctrls;
+
+ while(ctrl)
+ {
+ ctrl->SetColor(color);
+ ctrl=ctrl->next;
+ }
+}
+
+
+void hgeGUI::Reset()
+{
+ hgeGUIObject *ctrl=ctrls;
+
+ while(ctrl)
+ {
+ ctrl->Reset();
+ ctrl=ctrl->next;
+ }
+
+ ctrlLock=0;
+ ctrlOver=0;
+ ctrlFocus=0;
+}
+
+
+void hgeGUI::Move(float dx, float dy)
+{
+ hgeGUIObject *ctrl=ctrls;
+
+ while(ctrl)
+ {
+ ctrl->rect.x1 += dx;
+ ctrl->rect.y1 += dy;
+ ctrl->rect.x2 += dx;
+ ctrl->rect.y2 += dy;
+
+ ctrl=ctrl->next;
+ }
+}
+
+
+void hgeGUI::SetFocus(int id)
+{
+ hgeGUIObject *ctrlNewFocus=GetCtrl(id);
+
+ if(ctrlNewFocus==ctrlFocus) return;
+ if(!ctrlNewFocus)
+ {
+ if(ctrlFocus) ctrlFocus->Focus(false);
+ ctrlFocus=0;
+ }
+ else if(!ctrlNewFocus->bStatic && ctrlNewFocus->bVisible && ctrlNewFocus->bEnabled)
+ {
+ if(ctrlFocus) ctrlFocus->Focus(false);
+ if(ctrlNewFocus) ctrlNewFocus->Focus(true);
+ ctrlFocus=ctrlNewFocus;
+ }
+}
+
+int hgeGUI::GetFocus() const
+{
+ if(ctrlFocus) return ctrlFocus->id;
+ else return 0;
+}
+
+void hgeGUI::Enter()
+{
+ hgeGUIObject *ctrl=ctrls;
+
+ while(ctrl)
+ {
+ ctrl->Enter();
+ ctrl=ctrl->next;
+ }
+
+ nEnterLeave=2;
+}
+
+void hgeGUI::Leave()
+{
+ hgeGUIObject *ctrl=ctrls;
+
+ while(ctrl)
+ {
+ ctrl->Leave();
+ ctrl=ctrl->next;
+ }
+
+ ctrlFocus=0;
+ ctrlOver=0;
+ ctrlLock=0;
+ nEnterLeave=1;
+}
+
+void hgeGUI::Render()
+{
+ hgeGUIObject *ctrl=ctrls;
+
+ while(ctrl)
+ {
+ if(ctrl->bVisible) ctrl->Render();
+ ctrl=ctrl->next;
+ }
+
+ if(hge->Input_IsMouseOver() && sprCursor) sprCursor->Render(mx,my);
+}
+
+int hgeGUI::Update(float dt)
+{
+ bool bDone;
+ int key;
+ hgeGUIObject *ctrl;
+
+// Update the mouse variables
+
+ hge->Input_GetMousePos(&mx, &my);
+ bLPressed = hge->Input_KeyDown(HGEK_LBUTTON);
+ bLReleased = hge->Input_KeyUp(HGEK_LBUTTON);
+ bRPressed = hge->Input_KeyDown(HGEK_RBUTTON);
+ bRReleased = hge->Input_KeyUp(HGEK_RBUTTON);
+ nWheel=hge->Input_GetMouseWheel();
+
+// Update all controls
+
+ ctrl=ctrls;
+ while(ctrl)
+ {
+ ctrl->Update(dt);
+ ctrl=ctrl->next;
+ }
+
+// Handle Enter/Leave
+
+ if(nEnterLeave)
+ {
+ ctrl=ctrls; bDone=true;
+ while(ctrl)
+ {
+ if(!ctrl->IsDone()) { bDone=false; break; }
+ ctrl=ctrl->next;
+ }
+ if(!bDone) return 0;
+ else
+ {
+ if(nEnterLeave==1) return -1;
+ else nEnterLeave=0;
+ }
+ }
+
+// Handle keys
+
+ key=hge->Input_GetKey();
+ if(((navmode & HGEGUI_LEFTRIGHT) && key==HGEK_LEFT) ||
+ ((navmode & HGEGUI_UPDOWN) && key==HGEK_UP))
+ {
+ ctrl=ctrlFocus;
+ if(!ctrl)
+ {
+ ctrl=ctrls;
+ if(!ctrl) return 0;
+ }
+ do {
+ ctrl=ctrl->prev;
+ if(!ctrl && ((navmode & HGEGUI_CYCLED) || !ctrlFocus))
+ {
+ ctrl=ctrls;
+ while(ctrl->next) ctrl=ctrl->next;
+ }
+ if(!ctrl || ctrl==ctrlFocus) break;
+ } while(ctrl->bStatic==true || ctrl->bVisible==false || ctrl->bEnabled==false);
+
+ if(ctrl && ctrl!=ctrlFocus)
+ {
+ if(ctrlFocus) ctrlFocus->Focus(false);
+ if(ctrl) ctrl->Focus(true);
+ ctrlFocus=ctrl;
+ }
+ }
+ else if(((navmode & HGEGUI_LEFTRIGHT) && key==HGEK_RIGHT) ||
+ ((navmode & HGEGUI_UPDOWN) && key==HGEK_DOWN))
+ {
+ ctrl=ctrlFocus;
+ if(!ctrl)
+ {
+ ctrl=ctrls;
+ if(!ctrl) return 0;
+ while(ctrl->next) ctrl=ctrl->next;
+ }
+ do {
+ ctrl=ctrl->next;
+ if(!ctrl && ((navmode & HGEGUI_CYCLED) || !ctrlFocus)) ctrl=ctrls;
+ if(!ctrl || ctrl==ctrlFocus) break;
+ } while(ctrl->bStatic==true || ctrl->bVisible==false || ctrl->bEnabled==false);
+
+ if(ctrl && ctrl!=ctrlFocus)
+ {
+ if(ctrlFocus) ctrlFocus->Focus(false);
+ if(ctrl) ctrl->Focus(true);
+ ctrlFocus=ctrl;
+ }
+ }
+ else if(ctrlFocus && key && key!=HGEK_LBUTTON && key!=HGEK_RBUTTON)
+ {
+ if(ctrlFocus->KeyClick(key, hge->Input_GetChar())) return ctrlFocus->id;
+ }
+
+// Handle mouse
+
+ bool bLDown = hge->Input_GetKeyState(HGEK_LBUTTON);
+ bool bRDown = hge->Input_GetKeyState(HGEK_RBUTTON);
+
+ if(ctrlLock)
+ {
+ ctrl=ctrlLock;
+ if(!bLDown && !bRDown) ctrlLock=0;
+ if(ProcessCtrl(ctrl)) return ctrl->id;
+ }
+ else
+ {
+ // Find last (topmost) control
+
+ ctrl=ctrls;
+ if(ctrl)
+ while(ctrl->next) ctrl=ctrl->next;
+
+ while(ctrl)
+ {
+ if(ctrl->rect.TestPoint(mx,my) && ctrl->bEnabled)
+ {
+ if(ctrlOver != ctrl)
+ {
+ if(ctrlOver) ctrlOver->MouseOver(false);
+ ctrl->MouseOver(true);
+ ctrlOver=ctrl;
+ }
+
+ if(ProcessCtrl(ctrl)) return ctrl->id;
+ else return 0;
+ }
+ ctrl=ctrl->prev;
+ }
+
+ if(ctrlOver) {ctrlOver->MouseOver(false); ctrlOver=0;}
+
+ }
+
+ return 0;
+}
+
+bool hgeGUI::ProcessCtrl(hgeGUIObject *ctrl)
+{
+ bool bResult=false;
+
+ if(bLPressed) { ctrlLock=ctrl;SetFocus(ctrl->id);bResult=bResult || ctrl->MouseLButton(true); }
+ if(bRPressed) { ctrlLock=ctrl;SetFocus(ctrl->id);bResult=bResult || ctrl->MouseRButton(true); }
+ if(bLReleased) { bResult=bResult || ctrl->MouseLButton(false); }
+ if(bRReleased) { bResult=bResult || ctrl->MouseRButton(false); }
+ if(nWheel) { bResult=bResult || ctrl->MouseWheel(nWheel); }
+ bResult=bResult || ctrl->MouseMove(mx-ctrl->rect.x1,my-ctrl->rect.y1);
+
+ return bResult;
+}
+
+
+