hgegui.cpp
上传用户:jnfxsk
上传日期:2022-06-16
资源大小:3675k
文件大小:7k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /*
  2. ** Haaf's Game Engine 1.7
  3. ** Copyright (C) 2003-2007, Relish Games
  4. ** hge.relishgames.com
  5. **
  6. ** hgeGUI helper class implementation
  7. */
  8. #include "....includehgegui.h"
  9. HGE *hgeGUI::hge=0;
  10. HGE *hgeGUIObject::hge=0;
  11. hgeGUI::hgeGUI()
  12. {
  13. hge=hgeCreate(HGE_VERSION);
  14. ctrls=0;
  15. ctrlLock=0;
  16. ctrlFocus=0;
  17. ctrlOver=0;
  18. navmode=HGEGUI_NONAVKEYS;
  19. bLPressed=bLReleased=false;
  20. bRPressed=bRReleased=false;
  21. nWheel=0;
  22. mx=my=0.0f;
  23. nEnterLeave=0;
  24. sprCursor=0;
  25. }
  26. hgeGUI::~hgeGUI()
  27. {
  28. hgeGUIObject *ctrl=ctrls, *nextctrl;
  29. while(ctrl)
  30. {
  31. nextctrl=ctrl->next;
  32. delete ctrl;
  33. ctrl=nextctrl;
  34. }
  35. hge->Release();
  36. }
  37. void hgeGUI::AddCtrl(hgeGUIObject *ctrl)
  38. {
  39. hgeGUIObject *last=ctrls;
  40. ctrl->gui=this;
  41. if(!ctrls)
  42. {
  43. ctrls=ctrl;
  44. ctrl->prev=0;
  45. ctrl->next=0;
  46. }
  47. else
  48. {
  49. while(last->next) last=last->next;
  50. last->next=ctrl;
  51. ctrl->prev=last;
  52. ctrl->next=0;
  53. }
  54. }
  55. void hgeGUI::DelCtrl(int id)
  56. {
  57. hgeGUIObject *ctrl=ctrls;
  58. while(ctrl)
  59. {
  60. if(ctrl->id == id)
  61. {
  62. if(ctrl->prev) ctrl->prev->next = ctrl->next;
  63. else ctrls = ctrl->next;
  64. if(ctrl->next) ctrl->next->prev = ctrl->prev;
  65. delete ctrl;
  66. return;
  67. }
  68. ctrl=ctrl->next;
  69. }
  70. }
  71. hgeGUIObject* hgeGUI::GetCtrl(int id) const
  72. {
  73. hgeGUIObject *ctrl=ctrls;
  74. while(ctrl)
  75. {
  76. if(ctrl->id == id) return ctrl;
  77. ctrl=ctrl->next;
  78. }
  79. return NULL;
  80. }
  81. void hgeGUI::MoveCtrl(int id, float x, float y)
  82. {
  83. hgeGUIObject *ctrl=GetCtrl(id);
  84. ctrl->rect.x2=x + (ctrl->rect.x2 - ctrl->rect.x1);
  85. ctrl->rect.y2=y + (ctrl->rect.y2 - ctrl->rect.y1);
  86. ctrl->rect.x1=x;
  87. ctrl->rect.y1=y;
  88. }
  89. void hgeGUI::ShowCtrl(int id, bool bVisible)
  90. {
  91. GetCtrl(id)->bVisible=bVisible;
  92. }
  93. void hgeGUI::EnableCtrl(int id, bool bEnabled)
  94. {
  95. GetCtrl(id)->bEnabled=bEnabled;
  96. }
  97. void hgeGUI::SetNavMode(int mode)
  98. {
  99. navmode=mode;
  100. }
  101. void hgeGUI::SetCursor(hgeSprite *spr)
  102. {
  103. sprCursor=spr;
  104. }
  105. void hgeGUI::SetColor(DWORD color)
  106. {
  107. hgeGUIObject *ctrl=ctrls;
  108. while(ctrl)
  109. {
  110. ctrl->SetColor(color);
  111. ctrl=ctrl->next;
  112. }
  113. }
  114. void hgeGUI::Reset()
  115. {
  116. hgeGUIObject *ctrl=ctrls;
  117. while(ctrl)
  118. {
  119. ctrl->Reset();
  120. ctrl=ctrl->next;
  121. }
  122. ctrlLock=0;
  123. ctrlOver=0;
  124. ctrlFocus=0;
  125. }
  126. void hgeGUI::Move(float dx, float dy)
  127. {
  128. hgeGUIObject *ctrl=ctrls;
  129. while(ctrl)
  130. {
  131. ctrl->rect.x1 += dx;
  132. ctrl->rect.y1 += dy;
  133. ctrl->rect.x2 += dx;
  134. ctrl->rect.y2 += dy;
  135. ctrl=ctrl->next;
  136. }
  137. }
  138. void hgeGUI::SetFocus(int id)
  139. {
  140. hgeGUIObject *ctrlNewFocus=GetCtrl(id);
  141. if(ctrlNewFocus==ctrlFocus) return;
  142. if(!ctrlNewFocus)
  143. {
  144. if(ctrlFocus) ctrlFocus->Focus(false);
  145. ctrlFocus=0;
  146. }
  147. else if(!ctrlNewFocus->bStatic && ctrlNewFocus->bVisible && ctrlNewFocus->bEnabled)
  148. {
  149. if(ctrlFocus) ctrlFocus->Focus(false);
  150. if(ctrlNewFocus) ctrlNewFocus->Focus(true);
  151. ctrlFocus=ctrlNewFocus;
  152. }
  153. }
  154. int hgeGUI::GetFocus() const
  155. {
  156. if(ctrlFocus) return ctrlFocus->id;
  157. else return 0;
  158. }
  159. void hgeGUI::Enter()
  160. {
  161. hgeGUIObject *ctrl=ctrls;
  162. while(ctrl)
  163. {
  164. ctrl->Enter();
  165. ctrl=ctrl->next;
  166. }
  167. nEnterLeave=2;
  168. }
  169. void hgeGUI::Leave()
  170. {
  171. hgeGUIObject *ctrl=ctrls;
  172. while(ctrl)
  173. {
  174. ctrl->Leave();
  175. ctrl=ctrl->next;
  176. }
  177. ctrlFocus=0;
  178. ctrlOver=0;
  179. ctrlLock=0;
  180. nEnterLeave=1;
  181. }
  182. void hgeGUI::Render()
  183. {
  184. hgeGUIObject *ctrl=ctrls;
  185. while(ctrl)
  186. {
  187. if(ctrl->bVisible) ctrl->Render();
  188. ctrl=ctrl->next;
  189. }
  190. if(hge->Input_IsMouseOver() && sprCursor) sprCursor->Render(mx,my);
  191. }
  192. int hgeGUI::Update(float dt)
  193. {
  194. bool bDone;
  195. int key;
  196. hgeGUIObject *ctrl;
  197. // Update the mouse variables
  198. hge->Input_GetMousePos(&mx, &my);
  199. bLPressed  = hge->Input_KeyDown(HGEK_LBUTTON);
  200. bLReleased = hge->Input_KeyUp(HGEK_LBUTTON);
  201. bRPressed  = hge->Input_KeyDown(HGEK_RBUTTON);
  202. bRReleased = hge->Input_KeyUp(HGEK_RBUTTON);
  203. nWheel=hge->Input_GetMouseWheel();
  204. // Update all controls
  205. ctrl=ctrls;
  206. while(ctrl)
  207. {
  208. ctrl->Update(dt);
  209. ctrl=ctrl->next;
  210. }
  211. // Handle Enter/Leave
  212. if(nEnterLeave)
  213. {
  214. ctrl=ctrls; bDone=true;
  215. while(ctrl)
  216. {
  217. if(!ctrl->IsDone()) { bDone=false; break; }
  218. ctrl=ctrl->next;
  219. }
  220. if(!bDone) return 0;
  221. else
  222. {
  223. if(nEnterLeave==1) return -1;
  224. else nEnterLeave=0;
  225. }
  226. }
  227. // Handle keys
  228. key=hge->Input_GetKey();
  229. if(((navmode & HGEGUI_LEFTRIGHT) && key==HGEK_LEFT) ||
  230. ((navmode & HGEGUI_UPDOWN) && key==HGEK_UP))
  231. {
  232. ctrl=ctrlFocus;
  233. if(!ctrl)
  234. {
  235. ctrl=ctrls;
  236. if(!ctrl) return 0;
  237. }
  238. do {
  239. ctrl=ctrl->prev;
  240. if(!ctrl && ((navmode & HGEGUI_CYCLED) || !ctrlFocus))
  241. {
  242. ctrl=ctrls;
  243. while(ctrl->next) ctrl=ctrl->next;
  244. }
  245. if(!ctrl || ctrl==ctrlFocus) break;
  246. } while(ctrl->bStatic==true || ctrl->bVisible==false || ctrl->bEnabled==false);
  247. if(ctrl && ctrl!=ctrlFocus)
  248. {
  249. if(ctrlFocus) ctrlFocus->Focus(false);
  250. if(ctrl) ctrl->Focus(true);
  251. ctrlFocus=ctrl;
  252. }
  253. }
  254. else if(((navmode & HGEGUI_LEFTRIGHT) && key==HGEK_RIGHT) ||
  255. ((navmode & HGEGUI_UPDOWN) && key==HGEK_DOWN))
  256. {
  257. ctrl=ctrlFocus;
  258. if(!ctrl)
  259. {
  260. ctrl=ctrls;
  261. if(!ctrl) return 0;
  262. while(ctrl->next) ctrl=ctrl->next;
  263. }
  264. do {
  265. ctrl=ctrl->next;
  266. if(!ctrl && ((navmode & HGEGUI_CYCLED) || !ctrlFocus)) ctrl=ctrls;
  267. if(!ctrl || ctrl==ctrlFocus) break;
  268. } while(ctrl->bStatic==true || ctrl->bVisible==false || ctrl->bEnabled==false);
  269. if(ctrl && ctrl!=ctrlFocus)
  270. {
  271. if(ctrlFocus) ctrlFocus->Focus(false);
  272. if(ctrl) ctrl->Focus(true);
  273. ctrlFocus=ctrl;
  274. }
  275. }
  276. else if(ctrlFocus && key && key!=HGEK_LBUTTON && key!=HGEK_RBUTTON)
  277. {
  278. if(ctrlFocus->KeyClick(key, hge->Input_GetChar())) return ctrlFocus->id;
  279. }
  280. // Handle mouse
  281. bool bLDown = hge->Input_GetKeyState(HGEK_LBUTTON);
  282. bool bRDown = hge->Input_GetKeyState(HGEK_RBUTTON);
  283. if(ctrlLock)
  284. {
  285. ctrl=ctrlLock;
  286. if(!bLDown && !bRDown) ctrlLock=0;
  287. if(ProcessCtrl(ctrl)) return ctrl->id;
  288. }
  289. else
  290. {
  291. // Find last (topmost) control
  292. ctrl=ctrls;
  293. if(ctrl)
  294. while(ctrl->next) ctrl=ctrl->next;
  295. while(ctrl)
  296. {
  297. if(ctrl->rect.TestPoint(mx,my) && ctrl->bEnabled)
  298. {
  299. if(ctrlOver != ctrl)
  300. {
  301. if(ctrlOver) ctrlOver->MouseOver(false);
  302. ctrl->MouseOver(true);
  303. ctrlOver=ctrl;
  304. }
  305. if(ProcessCtrl(ctrl)) return ctrl->id;
  306. else return 0;
  307. }
  308. ctrl=ctrl->prev;
  309. }
  310. if(ctrlOver) {ctrlOver->MouseOver(false); ctrlOver=0;}
  311. }
  312. return 0;
  313. }
  314. bool hgeGUI::ProcessCtrl(hgeGUIObject *ctrl)
  315. {
  316. bool bResult=false;
  317. if(bLPressed) { ctrlLock=ctrl;SetFocus(ctrl->id);bResult=bResult || ctrl->MouseLButton(true); }
  318. if(bRPressed) { ctrlLock=ctrl;SetFocus(ctrl->id);bResult=bResult || ctrl->MouseRButton(true); }
  319. if(bLReleased) { bResult=bResult || ctrl->MouseLButton(false); }
  320. if(bRReleased) { bResult=bResult || ctrl->MouseRButton(false); }
  321. if(nWheel) { bResult=bResult || ctrl->MouseWheel(nWheel); }
  322. bResult=bResult || ctrl->MouseMove(mx-ctrl->rect.x1,my-ctrl->rect.y1);
  323. return bResult;
  324. }