uggly main menu

This commit is contained in:
2024-08-03 15:03:38 +02:00
parent b6530c1220
commit 2065ea8334
15 changed files with 729 additions and 354 deletions

View File

@@ -0,0 +1,32 @@
#pragma once
#include <Nazara/Core/ApplicationComponent.hpp>
namespace Nz {
class Window;
class Canvas;
class StateMachine;
} // namespace Nz
namespace blitz {
namespace client {
class StateData;
class ClientApp : public Nz::ApplicationComponent {
public:
ClientApp(Nz::ApplicationBase& app);
~ClientApp();
void Update(Nz::Time elapsedTime) override;
private:
Nz::Window* m_Window;
std::unique_ptr<Nz::StateMachine> m_StateMachine;
std::shared_ptr<StateData> m_StateData;
};
} // namespace client
} // namespace blitz

View File

@@ -0,0 +1,75 @@
#pragma once
#include <Nazara/Core/Components/DisabledComponent.hpp>
#include <Nazara/Core/State.hpp>
#include <Nazara/Graphics/RenderTarget.hpp>
#include <Nazara/Widgets/BaseWidget.hpp>
#include <client/states/StateData.h>
#include <functional>
#include <memory>
#include <vector>
namespace blitz {
namespace client {
class AbstractState : public Nz::State, public std::enable_shared_from_this<AbstractState> {
public:
AbstractState(std::shared_ptr<StateData> stateData);
~AbstractState();
protected:
template <typename T, typename... Args>
void ConnectSignal(T& signal, Args&&... args) {
m_CleanupFunctions.emplace_back(
[connection = signal.Connect(std::forward<Args>(args)...)]() mutable { connection.Disconnect(); });
}
template <typename T, typename... Args>
T* CreateWidget(Args&&... args) {
T* widget = m_StateData->m_Canvas->Add<T>(std::forward<Args>(args)...);
auto& entry = m_Widgets.emplace_back();
entry.m_Widget = widget;
if (!m_IsVisible)
entry.m_Widget->Hide();
return widget;
}
void DestroyWidget(Nz::BaseWidget* widget);
StateData& GetStateData() {
return *m_StateData;
}
const StateData& GetStateData() const {
return *m_StateData;
}
const std::shared_ptr<StateData>& GetStateDataPtr() {
return m_StateData;
}
void Enter(Nz::StateMachine& fsm) override;
void Leave(Nz::StateMachine& fsm) override;
bool Update(Nz::StateMachine& fsm, Nz::Time elapsedTime) override;
virtual void LayoutWidgets() {}
private:
NazaraSlot(Nz::RenderTarget, OnRenderTargetSizeChange, m_OnTargetChangeSizeSlot);
struct WidgetEntry {
Nz::BaseWidget* m_Widget;
bool m_WasVisible = true;
};
std::shared_ptr<StateData> m_StateData;
std::vector<std::function<void()>> m_CleanupFunctions;
std::vector<WidgetEntry> m_Widgets;
bool m_IsVisible;
};
} // namespace client
} // namespace blitz

View File

@@ -0,0 +1,28 @@
#pragma once
#include <Nazara/Widgets/ButtonWidget.hpp>
#include <client/states/AbstractState.h>
namespace blitz {
namespace client {
class CreateServerState : public AbstractState {
public:
CreateServerState(std::shared_ptr<StateData> a_StateData, std::shared_ptr<AbstractState> a_PreviousState);
~CreateServerState();
private:
Nz::ButtonWidget* m_CreateServerButton;
Nz::ButtonWidget* m_BackButton;
std::shared_ptr<AbstractState> m_NextState;
std::shared_ptr<AbstractState> m_PreviousState;
void LayoutWidgets() override;
bool Update(Nz::StateMachine& fsm, Nz::Time elapsedTime) override;
void OnCreateServerPressed();
void OnBackPressed();
};
} // namespace client
} // namespace blitz

View File

@@ -0,0 +1,28 @@
#pragma once
#include <Nazara/Widgets/ButtonWidget.hpp>
#include <client/states/AbstractState.h>
namespace blitz {
namespace client {
class JoinServerState : public AbstractState {
public:
JoinServerState(std::shared_ptr<StateData> a_StateData, std::shared_ptr<AbstractState> a_PreviousState);
~JoinServerState();
private:
Nz::ButtonWidget* m_JoinServerButton;
Nz::ButtonWidget* m_BackButton;
std::shared_ptr<AbstractState> m_NextState;
std::shared_ptr<AbstractState> m_PreviousState;
void LayoutWidgets() override;
bool Update(Nz::StateMachine& fsm, Nz::Time elapsedTime) override;
void OnJoinServerPressed();
void OnBackPressed();
};
} // namespace client
} // namespace blitz

View File

@@ -0,0 +1,31 @@
#pragma once
#include <Nazara/Widgets/ButtonWidget.hpp>
#include <client/states/AbstractState.h>
namespace blitz {
namespace client {
class MainMenuState : public AbstractState {
public:
MainMenuState(std::shared_ptr<StateData>);
~MainMenuState();
private:
Nz::ButtonWidget* m_JoinServerButton;
Nz::ButtonWidget* m_CreateServerButton;
Nz::ButtonWidget* m_OptionButton;
Nz::ButtonWidget* m_QuitButton;
std::shared_ptr<AbstractState> m_NextState;
void LayoutWidgets() override;
bool Update(Nz::StateMachine& fsm, Nz::Time elapsedTime) override;
void OnJoinServerPressed();
void OnCreateServerPressed();
void OnOptionPressed();
void OnQuitPressed();
};
} // namespace client
} // namespace blitz

View File

@@ -0,0 +1,28 @@
#pragma once
#include <Nazara/Widgets/ButtonWidget.hpp>
#include <client/states/AbstractState.h>
namespace blitz {
namespace client {
class OptionState : public AbstractState {
public:
OptionState(std::shared_ptr<StateData> a_StateData, std::shared_ptr<AbstractState> a_PreviousState);
~OptionState();
private:
Nz::ButtonWidget* m_OptionButton;
Nz::ButtonWidget* m_BackButton;
std::shared_ptr<AbstractState> m_NextState;
std::shared_ptr<AbstractState> m_PreviousState;
void LayoutWidgets() override;
bool Update(Nz::StateMachine& fsm, Nz::Time elapsedTime) override;
void OnOptionPressed();
void OnBackPressed();
};
} // namespace client
} // namespace blitz

View File

@@ -0,0 +1,34 @@
#pragma once
#include <Nazara/Core/EnttWorld.hpp>
#include <Nazara/Platform/Window.hpp>
#include <Nazara/Renderer/WindowSwapchain.hpp>
#include <Nazara/Widgets/Canvas.hpp>
#include <entt/fwd.hpp>
#include <memory>
#include <optional>
namespace Nz {
class ApplicationBase;
class RenderTarget;
} // namespace Nz
namespace blitz {
namespace client {
class ClientApp;
struct StateData {
std::optional<Nz::Canvas> m_Canvas;
std::shared_ptr<Nz::RenderTarget> m_RenderTarget;
ClientApp* m_AppComponent;
Nz::ApplicationBase* m_App;
Nz::EnttWorld* m_World;
Nz::Window* m_Window;
Nz::WindowSwapchain* m_Swapchain;
};
} // namespace client
} // namespace blitz