1 /*************************************************************************** 2 menueintrag.h - description 3 ------------------- 4 begin : Mit Jul 12 22:54:51 MEST 2000 5 copyright : (C) 2006 by Immi 6 email : cuyo@pcpool.mathematik.uni-freiburg.de 7 8 Modified 2006-2008,2010,2011 by the cuyo developers 9 10 ***************************************************************************/ 11 12 /*************************************************************************** 13 * * 14 * This program is free software; you can redistribute it and/or modify * 15 * it under the terms of the GNU General Public License as published by * 16 * the Free Software Foundation; either version 2 of the License, or * 17 * (at your option) any later version. * 18 * * 19 ***************************************************************************/ 20 21 #ifndef MENUEINTRAG_H 22 #define MENUEINTRAG_H 23 24 #include <vector> 25 #include <SDL.h> 26 27 #include "stringzeug.h" 28 #include "inkompatibel.h" 29 30 #include "blatt.h" 31 32 33 34 #define MaxDrawDinge 10 35 36 37 38 39 /* Malt in der Zukunft einen Teil eines Men�eintrags. 40 Das Bezugssystem f�r Koordinaten ist AlignTop im Men�eintrag. */ 41 42 struct DrawDing { 43 private: 44 enum { 45 dda_Nichts, 46 dda_Text, 47 dda_Icon, 48 dda_Bild 49 } mArt; 50 51 Str mText; 52 int mHotkey; 53 Font * mFont; 54 //int mDx;/* Wenn die Schrift nicht gleich bei mX0 losgehen soll */ 55 /* Soll sie nie. Soll immer L_menu_rand_lr dazu */ 56 bool mRahmen; 57 int mBild; // Index in BlattMenu::gBlattPics 58 int mBildchen; 59 SDL_Rect mRect; 60 61 public: 62 int mBinSubBereich; 63 int mX0,mX1; // mX1 ist wie immer um 1 zu gro� 64 int mY0,mY1; 65 int mXPos; 66 bool mAbschneiden; 67 68 /* Konstruktoren, passend zur Art: */ 69 DrawDingDrawDing70 DrawDing() : mArt(dda_Nichts) {}; 71 DrawDing(const Str & text, 72 int hotkey, /* Die Position des Hotkeys in text. 73 Negative Spezialwerte siehe 74 oben in menueintrag.cpp */ 75 int binSubBereich, /* Subbereich, zu dem dieses Drawding geh�rt */ 76 int x, int y, 77 int align = AlignHCenter, /* Akzeptiert nur waagerechtes Zeug, 78 senkrecht ist immer zentriert. */ 79 Font * font = NULL, /* Default h�ngt von aktSubBereich ab */ 80 int * xmin = NULL, int * xmax = NULL 81 /* Wenn die !=0 sind, wird dort schon mal unsere Ausdehung 82 reingeschrieben. */); 83 DrawDing(int bild, int bildchen, int x, int y); 84 //DrawDing(int bild, int xbd, int ybd, int x, int y); 85 DrawDing(int bild, int x, int y); 86 87 void abschneiden(int x0, int x1); 88 89 void anzeigen(int subBereich, int x, int y) const; 90 }; 91 92 93 94 95 class MenuEintrag { 96 97 public: 98 enum Art { 99 Art_normal, 100 Art_aktiv, /* Bekommt (durch doHyperaktiv) key-events, 101 wenn man drauf ist. */ 102 Art_hyper, /* Bekommt (durch doHyperaktiv) key-events, 103 nachdem es angeklickt wurde. */ 104 Art_hyperakt, /* "Art_aktiv + Art_hyper" */ 105 Art_deko 106 }; 107 const int mHoehe; /* Ganz viel wird einfacher, wenn das hier const ist, 108 also verl�sst sich auch ganz viel drauf. 109 Im Moment scheinen wir auch nicht mehr zu brauchen. 110 Wenn sich das mal �ndert, kann man sich immer noch 111 die Arbeit machen, BlattMenu::anzeigen() und so 112 anzupassen. */ 113 114 protected: 115 BlattMenu * mPapi; 116 Str mName; 117 int mAccel; /* Der Keycode des Hotkeys */ 118 int mAccIndex; 119 void (*mDoReturn)(); 120 bool (*mGetStrom)(); /* Ein Men�punkt, der grad keinen Strom kriegt, 121 kann auch nicht ausgew�hlt werden */ 122 Art mArt; 123 int mX0, mX1; 124 125 bool mUpdaten; 126 int mSubBereich; 127 128 private: 129 DrawDing mDraw[MaxDrawDinge]; 130 int mAnzDraw; 131 132 public: 133 MenuEintrag(BlattMenu * papi, Str na = "", void(*doret)() = 0, int accel = 0, 134 int hoehe = L_menueintrag_defaulthoehe); 135 MenuEintrag(BlattMenu * papi, Str na, Art ea, 136 int hoehe = L_menueintrag_defaulthoehe); ~MenuEintrag()137 virtual ~MenuEintrag() {} 138 setGetStrom(bool (* getstrom)())139 MenuEintrag * setGetStrom(bool(*getstrom)()) {mGetStrom = getstrom; return this;} 140 void setNieStrom(); 141 void setSubBereich(int subBereich); 142 /* Aufrufen, wenn sich m�glicherweise der Stromstatus ge�ndert hat */ 143 void updateStrom(); 144 void updateDrawDinge(); setUpdateFlag()145 void setUpdateFlag() { mUpdaten = true; } 146 getAccel()147 int getAccel() const { return mAccel; } 148 void deactivateAccel(); 149 150 virtual void anzeigen(int x, int y, bool graue); zeitSchritt()151 virtual void zeitSchritt() {} getInfo()152 virtual Str getInfo() {return "";} 153 /* y muss nicht �berpr�ft werden; liegt auf jeden Fall zwischen 0 und hoehe */ 154 virtual int getMausPos(int x, int y); 155 156 virtual void doReturn(bool durchMaus); doHyperaktiv(const SDL_keysym &,int)157 virtual void doHyperaktiv(const SDL_keysym &, int) {} 158 virtual bool getStrom() const; 159 160 bool getWaehlbar() const; 161 bool getAktiv() const; 162 bool getHyper() const; getX0()163 int getX0() const {return mX0;} getX1()164 int getX1() const {return mX1;} getZentrierLinie()165 virtual ZentrierLinie getZentrierLinie() const { 166 return mAccel == 0 ? zl_zentriert : zl_accel; 167 } 168 169 protected: 170 void doPapiEscape(); /* Damit auch die Erben das d�rfen. */ 171 void doPapiNavigiere(int); /* ebenso */ 172 173 /* Das f�llt DrawDinge auf, malt aber nicht selbst. 174 Wird auch aufgerufen, um die Breite des Men�punkts zu bestimmen */ 175 virtual void updateDDIntern(); 176 neuDraw()177 inline DrawDing & neuDraw() { 178 CASSERT(mAnzDraw+1<MaxDrawDinge); 179 return mDraw[mAnzDraw++]; 180 } 181 }; 182 183 184 class MenuEintragBild: public MenuEintrag { 185 int mBildNr; 186 int mXOffset; 187 public: 188 MenuEintragBild(BlattMenu * papi, int nr); 189 protected: 190 virtual void updateDDIntern(); 191 }; 192 193 194 class MenuEintragEscape: public MenuEintrag { 195 public: 196 MenuEintragEscape(BlattMenu * papi); 197 198 virtual void doReturn(bool durchMaus); 199 }; 200 201 202 203 class MenuEintragSubmenu: public MenuEintrag { 204 protected: 205 BlattMenu * mSub; 206 public: 207 MenuEintragSubmenu(BlattMenu * papi, const Str &, BlattMenu *, int accel=0, 208 int hoehe = L_menueintrag_defaulthoehe); 209 virtual ~MenuEintragSubmenu(); 210 211 virtual void doReturn(bool durchMaus); doUntermenuSchliessen()212 virtual void doUntermenuSchliessen() {} 213 }; 214 215 216 217 /* K�nnte man Sch�nfinkeln, w�re diese Klasse fast unn�tig... */ 218 class MenuEintragAuswahl: public MenuEintrag { 219 protected: 220 int mArg; 221 Str mInfo; 222 void (*mDoReturnInt) (int); 223 public: 224 MenuEintragAuswahl(BlattMenu * papi, const Str & na, const Str & info, 225 void(*doretint)(int), int arg, int accel=0); getInfo()226 virtual Str getInfo() {return mInfo;} 227 virtual void doReturn(bool durchMaus); 228 }; 229 230 231 232 class MenuEintragAuswahlmenu: public MenuEintragSubmenu { 233 const std::vector<Str> *const mAuswahlen; 234 int (*mGetAktuell) (); 235 void (*mEintragDoReturn) (int); 236 int mVorlauf; // Wie viele Eintr�ge hat das Men� vor dem "ersten"? 237 int mPfeil1X0, mPfeil1X1, mPfeil2X0, mPfeil2X1; 238 int mAnimation; 239 int mAnimationDX; 240 Str mAnimationWahlAlt; 241 public: 242 MenuEintragAuswahlmenu(BlattMenu * papi, 243 const Str & name, 244 const std::vector<Str> *const auswahlen, 245 const std::vector<Str> *const infos, 246 int (*getakt) (), void (*doret)(int), 247 const Str & info = Str(), 248 int accel=0); 249 250 virtual Str getInfo(); 251 virtual void doHyperaktiv(const SDL_keysym &, int); 252 virtual int getMausPos(int x, int y); 253 virtual void zeitSchritt(); 254 virtual void doReturn(bool durchMaus); 255 virtual void doUntermenuSchliessen(); 256 protected: 257 virtual void updateDDIntern(); 258 private: 259 void doPfeil(int d); 260 int schiebAktuell(int d); 261 }; 262 263 264 265 class MenuEintragSpielerModus: public MenuEintrag { 266 267 void (*mDoWechsel) (); 268 int mModus; 269 int mAnimation; 270 271 public: MenuEintragSpielerModus(BlattMenu * papi,Str na,void (* dowechs)(),int mo)272 MenuEintragSpielerModus(BlattMenu * papi, Str na, void(*dowechs)(), int mo): 273 MenuEintrag(papi,na), mDoWechsel(dowechs), mModus(mo), mAnimation(7) {} 274 275 virtual void zeitSchritt(); 276 virtual void doReturn(bool durchMaus); 277 protected: 278 virtual void updateDDIntern(); 279 }; 280 281 282 283 class MenuEintragTaste: public MenuEintrag { 284 public: 285 int mSpieler, mTaste; 286 MenuEintragTaste(BlattMenu * papi,Str na,int sp,int ta)287 MenuEintragTaste(BlattMenu * papi, Str na, int sp, int ta): 288 MenuEintrag(papi, na, Art_hyper), mSpieler(sp), mTaste(ta) {} 289 290 virtual Str getInfo(); 291 virtual void doHyperaktiv(const SDL_keysym & taste, int); getZentrierLinie()292 virtual ZentrierLinie getZentrierLinie() const { return zl_daten; } 293 protected: 294 virtual void updateDDIntern(); 295 }; 296 297 298 299 class MenuEintragAI: public MenuEintrag { 300 301 int mPfeil1X0, mPfeil1X1, mPfeil2X0, mPfeil2X1; 302 public: 303 MenuEintragAI(BlattMenu * papi,Str na)304 MenuEintragAI(BlattMenu * papi, Str na): 305 MenuEintrag(papi, na, Art_aktiv) {} 306 307 virtual int getMausPos(int x, int y); 308 virtual void doHyperaktiv(const SDL_keysym & taste, int); 309 virtual void doReturn(bool durchMaus); 310 virtual void doPfeil(int d); getZentrierLinie()311 virtual ZentrierLinie getZentrierLinie() const { return zl_daten; } 312 protected: 313 virtual void updateDDIntern(); 314 }; 315 316 317 318 class MenuEintragSound: public MenuEintrag { 319 320 bool mBitteWarten; 321 322 public: 323 MenuEintragSound(BlattMenu * papi,Str na)324 MenuEintragSound(BlattMenu * papi, Str na): 325 MenuEintrag(papi, na, Art_aktiv), mBitteWarten(false) {} 326 327 virtual void doReturn(bool durchMaus); 328 virtual void doHyperaktiv(const SDL_keysym & taste, int); getZentrierLinie()329 virtual ZentrierLinie getZentrierLinie() const { return zl_daten; } 330 protected: 331 virtual void updateDDIntern(); 332 333 void setSound(bool neu); 334 }; 335 336 337 class MenuEintragLevel: public MenuEintrag { 338 339 bool mGewonnen; 340 341 public: 342 MenuEintragLevel(BlattMenu * papi, Str na, bool gewonnen, bool strom); 343 344 protected: 345 virtual void updateDDIntern(); 346 }; 347 348 349 350 351 #endif 352