hgegui.cpp
资源名称:hge181.rar [点击查看]
上传用户:jnfxsk
上传日期:2022-06-16
资源大小:3675k
文件大小:7k
源码类别:
游戏引擎
开发平台:
Visual C++
- /*
- ** Haaf's Game Engine 1.7
- ** Copyright (C) 2003-2007, Relish Games
- ** hge.relishgames.com
- **
- ** hgeGUI helper class implementation
- */
- #include "....includehgegui.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;
- }