فهرست منبع

Solitaire: Disable filling with background color during end animation

This fixes #7792.

The visual glitches with card corners, and the screen-clear when
opening a menu, were both caused by the widgets having
`fill_with_background_color` set. We need that set most of the time,
so we just disable it for the duration of the game-over animation.

Also resove a FIXME that no longer applies. :^)
Sam Atkins 4 سال پیش
والد
کامیت
364d728e66
2فایلهای تغییر یافته به همراه12 افزوده شده و 1 حذف شده
  1. 11 1
      Userland/Games/Solitaire/Game.cpp
  2. 1 0
      Userland/Games/Solitaire/Game.h

+ 11 - 1
Userland/Games/Solitaire/Game.cpp

@@ -52,6 +52,7 @@ void Game::timer_event(Core::TimerEvent&)
     if (m_start_game_over_animation_next_frame) {
         m_start_game_over_animation_next_frame = false;
         m_game_over_animation = true;
+        set_background_fill_enabled(false);
     } else if (m_game_over_animation) {
         VERIFY(!m_animation.card().is_null());
         if (m_animation.card()->position().x() >= Game::width || m_animation.card()->rect().right() <= 0)
@@ -73,6 +74,15 @@ void Game::create_new_animation_card()
     m_animation = Animation(card, rand_float() + .4f, x_sgn * ((rand() % 3) + 2), .6f + rand_float() * .4f);
 }
 
+void Game::set_background_fill_enabled(bool enabled)
+{
+    Widget* widget = this;
+    while (widget) {
+        widget->set_fill_with_background_color(enabled);
+        widget = widget->parent_widget();
+    }
+}
+
 void Game::start_game_over_animation()
 {
     if (m_game_over_animation)
@@ -100,6 +110,7 @@ void Game::stop_game_over_animation()
     if (!m_game_over_animation)
         return;
 
+    set_background_fill_enabled(true);
     m_game_over_animation = false;
     update();
 
@@ -188,7 +199,6 @@ void Game::keydown_event(GUI::KeyEvent& event)
         auto_move_eligible_cards_to_foundations();
     } else if (event.key() == KeyCode::Key_Space) {
         draw_cards();
-        invalidate_layout(); // FIXME: Stock stack won't render properly after draw_cards() without this
     } else if (event.shift() && event.key() == KeyCode::Key_F11) {
         dump_layout();
     }

+ 1 - 0
Userland/Games/Solitaire/Game.h

@@ -170,6 +170,7 @@ private:
     void start_game_over_animation();
     void stop_game_over_animation();
     void create_new_animation_card();
+    void set_background_fill_enabled(bool);
     void check_for_game_over();
     void dump_layout() const;