@@ -28,12 +28,12 @@ const DrawPoint IngameWindow::posAtMouse(std::numeric_limits<DrawPoint::ElementT
2828
2929const Extent IngameWindow::borderSize (1 , 1 );
3030IngameWindow::IngameWindow (unsigned id, const DrawPoint& pos, const Extent& size, std::string title,
31- glArchivItem_Bitmap* background, bool modal, bool isUserClosable , Window* parent)
31+ glArchivItem_Bitmap* background, bool modal, CloseBehavior closeBehavior , Window* parent)
3232 : Window(parent, id, pos, size), title_(std::move(title)), background(background), lastMousePos(0 , 0 ),
3333 last_down(false ), last_down2(false ), isModal_(modal), closeme(false ), isMinimized_(false ), isMoving(false ),
34- isUserClosable_(isUserClosable )
34+ closeBehavior_(closeBehavior )
3535{
36- std::fill (button_state .begin (), button_state .end (), ButtonState::Up);
36+ std::fill (buttonState .begin (), buttonState .end (), ButtonState::Up);
3737 contentOffset.x = LOADER.GetImageN (" resource" , 38 )->getWidth (); // left border
3838 contentOffset.y = LOADER.GetImageN (" resource" , 42 )->getHeight (); // title bar
3939 contentOffsetEnd.x = LOADER.GetImageN (" resource" , 39 )->getWidth (); // right border
@@ -142,37 +142,43 @@ void IngameWindow::MouseLeftDown(const MouseCoords& mc)
142142
143143 if (IsPointInRect (mc.GetPos (), title_rect))
144144 {
145- // Start mit Bewegung
145+ // start moving
146146 isMoving = true ;
147147 lastMousePos = mc.GetPos ();
148- }
149-
150- // beiden Buttons oben links und rechts prfen
151- const std::array<Rect, 2 > rec = {GetLeftButtonRect (), GetRightButtonRect ()};
152-
153- for (unsigned char i = 0 ; i < 2 ; ++i)
148+ } else
154149 {
155- if (IsPointInRect (mc.GetPos (), rec[i]))
156- button_state[i] = ButtonState::Pressed;
150+ // Check the 2 buttons
151+ const std::array<Rect, 2 > rec = {GetCloseButtonBounds (), GetMinimizeButtonBounds ()};
152+
153+ for (unsigned i = 0 ; i < 2 ; ++i)
154+ {
155+ if (IsPointInRect (mc.GetPos (), rec[i]))
156+ buttonState[i] = ButtonState::Pressed;
157+ }
157158 }
158159}
159160
160161void IngameWindow::MouseLeftUp (const MouseCoords& mc)
161162{
162- // Bewegung stoppen
163163 isMoving = false ;
164164
165- // beiden Buttons oben links und rechts prfen
166- const std::array<Rect, 2 > rec = {GetLeftButtonRect (), GetRightButtonRect ()};
165+ const std::array<Rect, 2 > rec = {GetCloseButtonBounds (), GetMinimizeButtonBounds ()};
167166
168167 for (unsigned i = 0 ; i < 2 ; ++i)
169168 {
170- button_state[i] = ButtonState::Up;
169+ buttonState[i] = ButtonState::Up;
170+
171+ if ((i == 0 && closeBehavior_ == CloseBehavior::Custom) // no close button
172+ || (i == 1 && isModal_)) // modal windows cannot be minimized
173+ {
174+ continue ;
175+ }
176+
171177 if (IsPointInRect (mc.GetPos (), rec[i]))
172178 {
173- if (i == 0 && isUserClosable_ )
179+ if (i == 0 )
174180 Close ();
175- else if (i == 1 && ! IsModal ())
181+ else
176182 {
177183 SetMinimized (!IsMinimized ());
178184 LOADER.GetSoundN (" sound" , 113 )->Play (255 , false );
@@ -196,21 +202,18 @@ void IngameWindow::MouseMove(const MouseCoords& mc)
196202
197203 SetPos (newPosBounded);
198204 lastMousePos = mc.GetPos ();
199- }
200-
201- // beiden Buttons oben links und rechts prfen
202- const std::array<Rect, 2 > rec = {GetLeftButtonRect (), GetRightButtonRect ()};
203-
204- for (unsigned char i = 0 ; i < 2 ; ++i)
205+ } else
205206 {
206- if (IsPointInRect (mc.GetPos (), rec[i]))
207+ // Check the 2 buttons
208+ const std::array<Rect, 2 > rec = {GetCloseButtonBounds (), GetMinimizeButtonBounds ()};
209+
210+ for (unsigned i = 0 ; i < 2 ; ++i)
207211 {
208- if (mc.ldown )
209- button_state [i] = ButtonState::Pressed;
212+ if (IsPointInRect ( mc.GetPos (), rec[i]) )
213+ buttonState [i] = mc. ldown ? ButtonState::Pressed : ButtonState::Hover ;
210214 else
211- button_state[i] = ButtonState::Hover;
212- } else
213- button_state[i] = ButtonState::Up;
215+ buttonState[i] = ButtonState::Up;
216+ }
214217 }
215218}
216219
@@ -229,8 +232,8 @@ void IngameWindow::Draw_()
229232 // This needs a change in GetDrawPos to add this offset and also change all control-add-calls but would be much
230233 // cleaner (no more hard coded offsets and we could restyle the ingame windows easily)
231234 //
232- Rect drawRect = GetDrawRect ();
233- Rect fullWndRect (drawRect.getOrigin () - borderSize, drawRect.getSize () + borderSize * 2u );
235+ const Rect drawRect = GetDrawRect ();
236+ const Rect fullWndRect (drawRect.getOrigin () - borderSize, drawRect.getSize () + borderSize * 2u );
234237 // Top
235238 DrawRectangle (Rect (fullWndRect.getOrigin (), fullWndRect.getSize ().x , borderSize.y ), COLOR_BLACK);
236239 // Left
@@ -242,48 +245,43 @@ void IngameWindow::Draw_()
242245 DrawRectangle (Rect (fullWndRect.left , fullWndRect.bottom - borderSize.y , fullWndRect.getSize ().x , borderSize.y ),
243246 COLOR_BLACK);
244247
245- // Linkes oberes Teil
248+ // Upper parts
246249 glArchivItem_Bitmap* leftUpperImg = LOADER.GetImageN (" resource" , 36 );
247250 leftUpperImg->DrawFull (GetPos ());
248- // Rechtes oberes Teil
249251 glArchivItem_Bitmap* rightUpperImg = LOADER.GetImageN (" resource" , 37 );
250252 rightUpperImg->DrawFull (GetPos () + DrawPoint (GetSize ().x - rightUpperImg->getWidth (), 0 ));
251253
252- // Die beiden Buttons oben
253- static constexpr std::array<helpers::EnumArray<uint16_t , ButtonState>, 2 > ids = {{{47 , 55 , 50 }, {48 , 56 , 52 }}};
254-
255- // Titelleiste
256- if (isUserClosable_)
257- LOADER.GetImageN (" resource" , ids[0 ][button_state[0 ]])->DrawFull (GetPos ());
254+ // The 2 buttons
255+ constexpr std::array<helpers::EnumArray<uint16_t , ButtonState>, 2 > ids = {{{47 , 55 , 50 }, {48 , 56 , 52 }}};
256+ if (closeBehavior_ != CloseBehavior::Custom)
257+ LOADER.GetImageN (" resource" , ids[0 ][buttonState[0 ]])->DrawFull (GetPos ());
258258 if (!IsModal ())
259- LOADER.GetImageN (" resource" , ids[1 ][button_state[1 ]])->DrawFull (GetPos () + DrawPoint (GetSize ().x - 16 , 0 ));
260-
261- // Breite berechnen
262- unsigned title_width = GetSize ().x - leftUpperImg->getWidth () - rightUpperImg->getWidth ();
259+ LOADER.GetImageN (" resource" , ids[1 ][buttonState[1 ]])->DrawFull (GetPos () + DrawPoint (GetSize ().x - 16 , 0 ));
263260
264- unsigned short title_index;
261+ // The title bar
262+ unsigned titleIndex;
265263 if (IsActive ())
266- title_index = isMoving ? 44 : 43 ;
264+ titleIndex = isMoving ? 44 : 43 ;
267265 else
268- title_index = 42 ;
266+ titleIndex = 42 ;
269267
270- glArchivItem_Bitmap& titleImg = *LOADER.GetImageN (" resource" , title_index );
268+ glArchivItem_Bitmap& titleImg = *LOADER.GetImageN (" resource" , titleIndex );
271269 DrawPoint titleImgPos = GetPos () + DrawPoint (leftUpperImg->getWidth (), 0 );
272- // Wieviel mal nebeneinanderzeichnen?
273- unsigned short title_count = title_width / titleImg.getWidth ();
274- for (unsigned short i = 0 ; i < title_count; ++i)
270+ const unsigned titleWidth = GetSize ().x - leftUpperImg->getWidth () - rightUpperImg->getWidth ();
271+ // How often should the image be drawn to get the full width
272+ unsigned tileCount = titleWidth / titleImg.getWidth ();
273+ for (unsigned i = 0 ; i < tileCount; ++i)
275274 {
276275 titleImg.DrawFull (titleImgPos);
277276 titleImgPos.x += titleImg.getWidth ();
278277 }
279278
280- // Rest zeichnen
281- unsigned short rest = title_width % titleImg.getWidth ();
282-
283- if (rest)
284- titleImg.DrawPart (Rect (titleImgPos, rest, titleImg.getHeight ()));
279+ // The remaining part (if any)
280+ unsigned remainingTileSize = titleWidth % titleImg.getWidth ();
281+ if (remainingTileSize)
282+ titleImg.DrawPart (Rect (titleImgPos, remainingTileSize, titleImg.getHeight ()));
285283
286- // Text auf die Leiste
284+ // Text on the title bar
287285 NormalFont->Draw (GetPos () + DrawPoint (GetSize ().x , titleImg.getHeight ()) / 2 , title_,
288286 FontStyle::CENTER | FontStyle::VCENTER, COLOR_YELLOW);
289287
@@ -293,44 +291,42 @@ void IngameWindow::Draw_()
293291 // Side bars
294292 if (!isMinimized_)
295293 {
296- unsigned side_height = GetSize ().y - leftUpperImg->getHeight () - bottomBorderSideImg->getHeight ();
294+ unsigned sideHeight = GetSize ().y - leftUpperImg->getHeight () - bottomBorderSideImg->getHeight ();
297295
298296 glArchivItem_Bitmap* leftSideImg = LOADER.GetImageN (" resource" , 38 );
299297 glArchivItem_Bitmap* rightSideImg = LOADER.GetImageN (" resource" , 39 );
300- title_count = side_height / leftSideImg->getHeight ();
298+ tileCount = sideHeight / leftSideImg->getHeight ();
301299 DrawPoint leftImgPos = GetPos () + DrawPoint (0 , leftUpperImg->getHeight ());
302300 DrawPoint rightImgPos = leftImgPos + DrawPoint (GetSize ().x - leftSideImg->getWidth (), 0 );
303- for (unsigned short i = 0 ; i < title_count ; ++i)
301+ for (unsigned i = 0 ; i < tileCount ; ++i)
304302 {
305303 leftSideImg->DrawFull (leftImgPos);
306304 rightSideImg->DrawFull (rightImgPos);
307305 rightImgPos.y = leftImgPos.y += leftSideImg->getHeight ();
308306 }
309307
310- // Rest zeichnen
311- rest = side_height % leftSideImg->getHeight ();
312-
313- if (rest)
308+ // And the partial part
309+ remainingTileSize = sideHeight % leftSideImg->getHeight ();
310+ if (remainingTileSize)
314311 {
315- leftSideImg->DrawPart (Rect (leftImgPos, leftSideImg->getWidth (), rest ));
316- rightSideImg->DrawPart (Rect (rightImgPos, rightSideImg->getWidth (), rest ));
312+ leftSideImg->DrawPart (Rect (leftImgPos, leftSideImg->getWidth (), remainingTileSize ));
313+ rightSideImg->DrawPart (Rect (rightImgPos, rightSideImg->getWidth (), remainingTileSize ));
317314 }
318315 }
319316
320- // Untere Leiste
321- unsigned side_width = GetSize ().x - bottomBorderSideImg->getWidth () * 2 ;
322- title_count = side_width / bottomBarImg->getWidth ();
317+ // Lower bar
318+ const unsigned bottomBarWidth = GetSize ().x - bottomBorderSideImg->getWidth () * 2 ;
319+ tileCount = bottomBarWidth / bottomBarImg->getWidth ();
323320 DrawPoint bottomImgPos = GetPos () + DrawPoint (bottomBorderSideImg->getWidth (), GetRightBottomBoundary ().y );
324- for (unsigned short i = 0 ; i < title_count ; ++i)
321+ for (unsigned i = 0 ; i < tileCount ; ++i)
325322 {
326323 bottomBarImg->DrawFull (bottomImgPos);
327324 bottomImgPos.x += bottomBarImg->getWidth ();
328325 }
329326
330- rest = side_width % bottomBarImg->getWidth ();
331-
332- if (rest)
333- bottomBarImg->DrawPart (Rect (bottomImgPos, rest, bottomBarImg->getHeight ()));
327+ remainingTileSize = bottomBarWidth % bottomBarImg->getWidth ();
328+ if (remainingTileSize)
329+ bottomBarImg->DrawPart (Rect (bottomImgPos, remainingTileSize, bottomBarImg->getHeight ()));
334330
335331 // Client area
336332 if (!isMinimized_)
@@ -341,40 +337,34 @@ void IngameWindow::Draw_()
341337 Window::Draw_ ();
342338 }
343339
344- // Links und rechts unten die 2 kleinen Knäufe
340+ // The 2 rects on the bottom left and right
345341 bottomBorderSideImg->DrawFull (GetPos () + DrawPoint (0 , GetSize ().y - bottomBorderSideImg->getHeight ()));
346- bottomBorderSideImg->DrawFull (
347- GetPos ()
348- + DrawPoint (GetSize ().x - bottomBorderSideImg->getWidth (), GetSize ().y - bottomBorderSideImg->getHeight ()));
342+ bottomBorderSideImg->DrawFull (GetPos () + GetSize () - bottomBorderSideImg->GetSize ());
349343}
350344
351- // / Verschiebt Fenster in die Bildschirmmitte
352345void IngameWindow::MoveToCenter ()
353346{
354347 SetPos (DrawPoint (VIDEODRIVER.GetRenderSize () - GetSize ()) / 2 );
355348}
356349
357- // / Verschiebt Fenster neben die Maus
358350void IngameWindow::MoveNextToMouse ()
359351{
360352 // Center vertically and move slightly right
361353 DrawPoint newPos = VIDEODRIVER.GetMousePos () - DrawPoint (-20 , GetSize ().y / 2 );
362354 SetPos (newPos);
363355}
364356
365- // / Weiterleitung von Nachrichten erlaubt oder nicht?
366357bool IngameWindow::IsMessageRelayAllowed () const
367358{
368- // Wenn es minimiert wurde, sollen keine Nachrichten weitergeleitet werden
369359 return !isMinimized_;
370360}
371361
372- Rect IngameWindow::GetLeftButtonRect () const
362+ Rect IngameWindow::GetCloseButtonBounds () const
373363{
374364 return Rect (GetPos (), 16 , 16 );
375365}
376366
377- Rect IngameWindow::GetRightButtonRect () const
367+ Rect IngameWindow::GetMinimizeButtonBounds () const
378368{
379369 return Rect (GetPos ().x + GetSize ().x - 16 , GetPos ().y , 16 , 16 );
380370}
0 commit comments