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