00001
00002
00003
00004
00005
00006
00007
00008
00009
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef __UI_H__
00029 #define __UI_H__
00030
00032
00033
00034
00035
00036
00037 #include <vector>
00038 #include <string>
00039 #include <map>
00040
00041 #include "SDL.h"
00042 #include "upgrade_structs.h"
00043 #include "cursor.h"
00044 #include "interface.h"
00045 #include "minimap.h"
00046
00047
00048
00049
00050
00051 class CUnit;
00052 class CFile;
00053 class CFont;
00054 class LuaActionListener;
00055 struct lua_State;
00056
00057
00058
00059
00060
00061 enum TextAlignment {
00062 TextAlignUndefined,
00063 TextAlignCenter,
00064 TextAlignLeft,
00065 TextAlignRight,
00066 };
00067
00068 class ButtonStyleProperties {
00069 public:
00070 ButtonStyleProperties() : Sprite(NULL), Frame(0), BorderColor(0),
00071 BorderSize(0), TextAlign(TextAlignUndefined),
00072 TextX(0), TextY(0)
00073 {
00074 BorderColorRGB.r = BorderColorRGB.g = BorderColorRGB.b = 0;
00075 }
00076
00077 CGraphic *Sprite;
00078 int Frame;
00079 SDL_Color BorderColorRGB;
00080 Uint32 BorderColor;
00081 int BorderSize;
00082 TextAlignment TextAlign;
00083 int TextX;
00084 int TextY;
00085 std::string TextNormalColor;
00086 std::string TextReverseColor;
00087 } ;
00088
00089 class ButtonStyle {
00090 public:
00091 ButtonStyle() : Width(0), Height(0), Font(0),
00092 TextAlign(TextAlignUndefined), TextX(0), TextY(0) {}
00093
00094 int Width;
00095 int Height;
00096 CFont *Font;
00097 std::string TextNormalColor;
00098 std::string TextReverseColor;
00099 TextAlignment TextAlign;
00100 int TextX;
00101 int TextY;
00102 ButtonStyleProperties Default;
00103 ButtonStyleProperties Hover;
00104 ButtonStyleProperties Clicked;
00105 };
00106
00108 class CUIButton {
00109 public:
00110 CUIButton() : X(0), Y(0), Style(NULL), Callback(NULL) {}
00111 ~CUIButton() {}
00112
00113 int X;
00114 int Y;
00115 std::string Text;
00116 ButtonStyle *Style;
00117 LuaActionListener *Callback;
00118 };
00119
00120 #define MAX_NUM_VIEWPORTS 8
00121
00122
00148 class CViewport {
00149 public:
00150 CViewport() : X(0), Y(0), EndX(0), EndY(0), MapX(0), MapY(0),
00151 OffsetX(0), OffsetY(0), MapWidth(0), MapHeight(0), Unit(NULL) {};
00152
00154 bool IsInsideMapArea(int x, int y) const;
00156 int Viewport2MapX(int x) const;
00158 int Viewport2MapY(int y) const;
00160 int Map2ViewportX(int x) const;
00162 int Map2ViewportY(int y) const;
00164 void MapPixel2Viewport(int &x, int &y) const;
00165
00167 void Set(int x, int y, int offsetx, int offsety);
00169 void Center(int x, int y, int offsetx, int offsety);
00170 protected:
00172 void DrawMapBackgroundInViewport() const;
00174 void DrawMapFogOfWar() const;
00175 public:
00177 void Draw() const;
00178 void DrawBorder() const;
00180 bool AnyMapAreaVisibleInViewport(int sx, int sy, int ex, int ey) const;
00181
00182 int X;
00183 int Y;
00184 int EndX;
00185 int EndY;
00186
00187 int MapX;
00188 int MapY;
00189 int OffsetX;
00190 int OffsetY;
00191 int MapWidth;
00192 int MapHeight;
00193
00194 CUnit *Unit;
00195 };
00196
00203 enum ViewportModeType {
00204 VIEWPORT_SINGLE,
00205 VIEWPORT_SPLIT_HORIZ,
00206 VIEWPORT_SPLIT_HORIZ3,
00207 VIEWPORT_SPLIT_VERT,
00208 VIEWPORT_QUAD,
00209 NUM_VIEWPORT_MODES,
00210 };
00211
00212 class CMapArea
00213 {
00214 public:
00215 CMapArea() : X(0), Y(0), EndX(0), EndY(0),
00216 ScrollPaddingLeft(0), ScrollPaddingRight(0),
00217 ScrollPaddingTop(0), ScrollPaddingBottom(0) {}
00218
00219 int X;
00220 int Y;
00221 int EndX;
00222 int EndY;
00223 int ScrollPaddingLeft;
00224 int ScrollPaddingRight;
00225 int ScrollPaddingTop;
00226 int ScrollPaddingBottom;
00227 };
00228
00229 class CFiller
00230 {
00231 public:
00232 CFiller() : G(NULL), X(0), Y(0) {}
00233
00234 CGraphic *G;
00235 int X;
00236 int Y;
00237 };
00238
00239 class CButtonPanel
00240 {
00241 public:
00242 CButtonPanel() : G(NULL), X(0), Y(0), ShowCommandKey(true)
00243 {
00244 AutoCastBorderColorRGB.r = 0;
00245 AutoCastBorderColorRGB.g = 0;
00246 AutoCastBorderColorRGB.b = 0;
00247 }
00248
00249 void Draw();
00250 void Update();
00251 void DoClicked(int button);
00252 int DoKey(int key);
00253
00254 CGraphic *G;
00255 int X;
00256 int Y;
00257 std::vector<CUIButton> Buttons;
00258 SDL_Color AutoCastBorderColorRGB;
00259 bool ShowCommandKey;
00260 };
00261
00262 class CPieMenu {
00263 public:
00264 CPieMenu() : G(NULL), MouseButton(NoButton)
00265 {
00266 memset(this->X, 0, sizeof(this->X));
00267 memset(this->Y, 0, sizeof(this->Y));
00268 }
00269
00270 CGraphic *G;
00271 int MouseButton;
00272 int X[8];
00273 int Y[8];
00274
00275 void SetRadius(int radius) {
00276 const int coeffX[] = { 0, 193, 256, 193, 0, -193, -256, -193};
00277 const int coeffY[] = { -256, -193, 0, 193, 256, 193, 0, -193};
00278 for (int i = 0; i < 8; ++i) {
00279 this->X[i] = (coeffX[i] * radius) >> 8;
00280 this->Y[i] = (coeffY[i] * radius) >> 8;
00281 }
00282 }
00283 };
00284
00285 class CResourceInfo {
00286 public:
00287 CResourceInfo() : G(NULL), IconFrame(0), IconX(0), IconY(0),
00288 TextX(-1), TextY(-1) {}
00289
00290 CGraphic *G;
00291 int IconFrame;
00292 int IconX;
00293 int IconY;
00294 int TextX;
00295 int TextY;
00296 };
00297
00298 class CInfoPanel
00299 {
00300 public:
00301 CInfoPanel() : X(0), Y(0) {}
00302
00303 void Draw();
00304
00305 int X;
00306 int Y;
00307 };
00308
00309 class CStatusLine
00310 {
00311 public:
00312 CStatusLine() : Width(0), TextX(0), TextY(0), Font(0) {}
00313
00314 void Draw();
00315 void Set(const std::string &status);
00316 inline const std::string &Get() { return this->StatusLine; }
00317 void Clear();
00318
00319 int Width;
00320 int TextX;
00321 int TextY;
00322 CFont *Font;
00323
00324 private:
00325 std::string StatusLine;
00326 };
00327
00328 class CUITimer
00329 {
00330 public:
00331 CUITimer() : X(0), Y(0), Font(NULL) {}
00332
00333 int X;
00334 int Y;
00335 CFont *Font;
00336 };
00337
00338
00342 class CUserInterface
00343 {
00344 public:
00345 CUserInterface();
00346 ~CUserInterface();
00347
00348 void Load();
00349
00350
00351 bool MouseScroll;
00352 bool KeyScroll;
00353
00354 int MouseScrollSpeedDefault;
00356 int MouseScrollSpeedControl;
00357
00358 int MouseWarpX;
00359 int MouseWarpY;
00360
00361 std::string NormalFontColor;
00362 std::string ReverseFontColor;
00363
00364 std::vector<CFiller> Fillers;
00365
00366 CResourceInfo Resources[MaxCosts];
00367
00368 CInfoPanel InfoPanel;
00369
00370 CUIButton *SingleSelectedButton;
00371
00372 std::vector<CUIButton> SelectedButtons;
00373 CFont *MaxSelectedFont;
00374 int MaxSelectedTextX;
00375 int MaxSelectedTextY;
00376
00377 CUIButton *SingleTrainingButton;
00378 std::string SingleTrainingText;
00379 CFont *SingleTrainingFont;
00380 int SingleTrainingTextX;
00381 int SingleTrainingTextY;
00382
00383 std::vector<CUIButton> TrainingButtons;
00384 std::string TrainingText;
00385 CFont *TrainingFont;
00386 int TrainingTextX;
00387 int TrainingTextY;
00388
00389 std::vector<CUIButton> TransportingButtons;
00390
00391
00392 SDL_Color CompletedBarColorRGB;
00393 Uint32 CompletedBarColor;
00394 bool CompletedBarShadow;
00395
00396
00397 CButtonPanel ButtonPanel;
00398
00399
00400 CPieMenu PieMenu;
00401
00402
00403 ViewportModeType ViewportMode;
00404 CViewport *MouseViewport;
00405 CViewport *SelectedViewport;
00406 int NumViewports;
00407 CViewport Viewports[MAX_NUM_VIEWPORTS];
00408 CMapArea MapArea;
00409 CFont *MessageFont;
00410 int MessageScrollSpeed;
00411
00412
00413 CUIButton MenuButton;
00414 CUIButton NetworkMenuButton;
00415 CUIButton NetworkDiplomacyButton;
00416
00417
00418 CMinimap Minimap;
00419 Uint32 ViewportCursorColor;
00420
00421
00422 CStatusLine StatusLine;
00423
00424
00425 CUITimer Timer;
00426
00427
00428 int Offset640X;
00429 int Offset480Y;
00430
00431
00432
00433
00434 CursorConfig Point;
00435 CursorConfig Glass;
00436 CursorConfig Cross;
00437 CursorConfig YellowHair;
00438 CursorConfig GreenHair;
00439 CursorConfig RedHair;
00440 CursorConfig Scroll;
00441
00442 CursorConfig ArrowE;
00443 CursorConfig ArrowNE;
00444 CursorConfig ArrowN;
00445 CursorConfig ArrowNW;
00446 CursorConfig ArrowW;
00447 CursorConfig ArrowSW;
00448 CursorConfig ArrowS;
00449 CursorConfig ArrowSE;
00450
00456
00457 CGraphic *VictoryBackgroundG;
00458 CGraphic *DefeatBackgroundG;
00459 };
00460
00461
00462
00463
00464
00465 extern CUserInterface UI;
00466
00468 extern std::map<std::string, ButtonStyle *> ButtonStyleHash;
00469
00470 extern bool RightButtonAttacks;
00471 extern ButtonAction *CurrentButtons;
00472
00473 extern std::string UiGroupKeys;
00474
00475
00476
00477
00478
00479
00480
00482 extern void InitUserInterface(void);
00484 extern void SaveUserInterface(CFile *file);
00486 extern void CleanUserInterface(void);
00487 #ifdef DEBUG
00488 extern void FreeButtonStyles();
00489 #endif
00491 extern void UserInterfaceCclRegister(void);
00492
00494 extern ButtonStyle *FindButtonStyle(const std::string &style);
00495
00497 extern void UIHandleMouseMove(int x, int y);
00499 extern void UIHandleButtonDown(unsigned button);
00501 extern void UIHandleButtonUp(unsigned button);
00502
00504 extern void RestrictCursorToViewport(void);
00506 extern void RestrictCursorToMinimap(void);
00507
00509 extern CViewport *GetViewport(int x, int y);
00511 extern void CycleViewportMode(int);
00513 extern void SetViewportMode(ViewportModeType mode);
00514
00516 extern void MouseScrollMap(int x, int y);
00518 extern bool GetMouseScroll(void);
00520 extern void SetMouseScroll(bool enabled);
00522 extern bool GetKeyScroll(void);
00524 extern void SetKeyScroll(bool enabled);
00526 extern bool GetGrabMouse(void);
00528 extern void SetGrabMouse(bool enabled);
00530 extern bool GetLeaveStops(void);
00532 extern void SetLeaveStops(bool enabled);
00533
00534 extern int AddHandler(lua_State *l);
00535 extern void CallHandler(unsigned int handle, int value);
00536
00537
00539
00540 #endif // !__UI_H__