mirror of
https://github.com/RGBCube/serenity
synced 2025-07-28 10:47:34 +00:00
GameOfLife: Add choosable patterns
This commit is contained in:
parent
b808815e57
commit
1965d60aeb
6 changed files with 309 additions and 7 deletions
|
@ -1,6 +1,7 @@
|
|||
/*
|
||||
* Copyright (c) 2021, Andres Crucitti <dasc495@gmail.com>
|
||||
* Copyright (c) 2021, Linus Groh <linusg@serenityos.org>
|
||||
* Copyright (c) 2021, Ryan Wilson <ryan@rdwilson.xyz>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
@ -8,11 +9,13 @@
|
|||
#pragma once
|
||||
|
||||
#include "Board.h"
|
||||
#include "Pattern.h"
|
||||
#include <AK/Function.h>
|
||||
#include <AK/NonnullOwnPtr.h>
|
||||
#include <AK/Optional.h>
|
||||
#include <AK/RefPtr.h>
|
||||
#include <LibCore/Timer.h>
|
||||
#include <LibGUI/Menu.h>
|
||||
#include <LibGUI/Widget.h>
|
||||
|
||||
class BoardWidget final : public GUI::Widget {
|
||||
|
@ -23,6 +26,7 @@ public:
|
|||
virtual void mousemove_event(GUI::MouseEvent&) override;
|
||||
virtual void mouseup_event(GUI::MouseEvent&) override;
|
||||
virtual void mousedown_event(GUI::MouseEvent&) override;
|
||||
virtual void context_menu_event(GUI::ContextMenuEvent&) override;
|
||||
|
||||
void set_toggling_cells(bool toggling)
|
||||
{
|
||||
|
@ -46,6 +50,15 @@ public:
|
|||
bool is_running() const { return m_running; }
|
||||
void set_running(bool r);
|
||||
|
||||
Pattern* selected_pattern() { return m_selected_pattern; }
|
||||
Function<void(Pattern*)> on_pattern_selection;
|
||||
template<typename Callback>
|
||||
void for_each_pattern(Callback callback)
|
||||
{
|
||||
for (auto& pattern : m_patterns)
|
||||
callback(pattern);
|
||||
}
|
||||
|
||||
void run_generation();
|
||||
|
||||
int running_timer_interval() const { return m_running_timer_interval; }
|
||||
|
@ -57,14 +70,24 @@ public:
|
|||
|
||||
private:
|
||||
BoardWidget(size_t rows, size_t columns);
|
||||
void setup_patterns();
|
||||
void place_pattern(size_t row, size_t column);
|
||||
|
||||
bool m_toggling_cells { false };
|
||||
Board::RowAndColumn m_last_cell_toggled {};
|
||||
Board::RowAndColumn m_last_cell_hovered {};
|
||||
Pattern* m_selected_pattern { nullptr };
|
||||
NonnullOwnPtrVector<Pattern> m_patterns;
|
||||
|
||||
NonnullOwnPtr<Board> m_board;
|
||||
|
||||
bool m_running { false };
|
||||
|
||||
int m_running_timer_interval { 500 };
|
||||
int m_running_pattern_preview_timer_interval { 100 };
|
||||
|
||||
RefPtr<GUI::Menu> m_context_menu;
|
||||
|
||||
RefPtr<Core::Timer> m_timer;
|
||||
RefPtr<Core::Timer> m_pattern_preview_timer;
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue