Selaa lähdekoodia

Update demo sample

Michael Ragazzon 6 vuotta sitten
vanhempi
sitoutus
97cb05f349
2 muutettua tiedostoa jossa 29 lisäystä ja 49 poistoa
  1. 2 2
      Samples/basic/demo/data/demo.rml
  2. 27 47
      Samples/basic/demo/src/main.cpp

+ 2 - 2
Samples/basic/demo/data/demo.rml

@@ -220,10 +220,10 @@ textarea {
 <tab>Buttons</tab>
 <tab>Buttons</tab>
 <panel>
 <panel>
 	<button id="start_game">Start Game</button><br />
 	<button id="start_game">Start Game</button><br />
-	<button id="high_scores" onkeydown="hello" autofocus>High Scores</button><br />
+	<button id="high_scores" autofocus>High Scores</button><br />
 	<button id="options">Options</button><br />
 	<button id="options">Options</button><br />
 	<button id="help">Help</button><br />
 	<button id="help">Help</button><br />
-	<div onclick="parent"><button id="exit" onclick="exit">Exit<span onclick="destroyed">?</span></button></div>
+	<div><button id="exit" onclick="exit">Exit</button></div>
 	<img src="../../../assets/high_scores_defender.tga"/>
 	<img src="../../../assets/high_scores_defender.tga"/>
 	<img src="icon-game" style="vertical-align: 10px;"/>
 	<img src="icon-game" style="vertical-align: 10px;"/>
 	<img src="../../../assets/high_scores_defender.tga" style="image-color: #fc5;" coords="0 0 64 64"/>
 	<img src="../../../assets/high_scores_defender.tga" style="image-color: #fc5;" coords="0 0 64 64"/>

+ 27 - 47
Samples/basic/demo/src/main.cpp

@@ -36,12 +36,6 @@
 
 
 #include <sstream>
 #include <sstream>
 
 
-bool run_loop = true;
-bool single_loop = false;
-
-class DemoWindow;
-DemoWindow* window = nullptr;
-
 class DemoWindow : public Rml::Core::EventListener
 class DemoWindow : public Rml::Core::EventListener
 {
 {
 public:
 public:
@@ -78,17 +72,9 @@ public:
 		case EventId::Keydown:
 		case EventId::Keydown:
 		{
 		{
 			Rml::Core::Input::KeyIdentifier key_identifier = (Rml::Core::Input::KeyIdentifier) event.GetParameter< int >("key_identifier", 0);
 			Rml::Core::Input::KeyIdentifier key_identifier = (Rml::Core::Input::KeyIdentifier) event.GetParameter< int >("key_identifier", 0);
+			bool ctrl_key = event.GetParameter< bool >("ctrl_key", false);
 
 
-			if (key_identifier == Rml::Core::Input::KI_SPACE)
-			{
-				run_loop = !run_loop;
-			}
-			else if (key_identifier == Rml::Core::Input::KI_RETURN)
-			{
-				run_loop = false;
-				single_loop = true;
-			}
-			else if (key_identifier == Rml::Core::Input::KI_ESCAPE)
+			if (key_identifier == Rml::Core::Input::KI_ESCAPE)
 			{
 			{
 				Shell::RequestExit();
 				Shell::RequestExit();
 			}
 			}
@@ -119,49 +105,43 @@ ShellRenderInterfaceExtensions *shell_renderer;
 
 
 void GameLoop()
 void GameLoop()
 {
 {
-	if(run_loop || single_loop)
-	{
-		context->Update();
+	context->Update();
 
 
-		shell_renderer->PrepareRenderBuffer();
-		context->Render();
-		shell_renderer->PresentRenderBuffer();
-
-		single_loop = false;
-	}
+	shell_renderer->PrepareRenderBuffer();
+	context->Render();
+	shell_renderer->PresentRenderBuffer();
 }
 }
 
 
 
 
 
 
 
 
-class Event : public Rml::Core::EventListener
+class DemoEventListener : public Rml::Core::EventListener
 {
 {
 public:
 public:
-	Event(const Rml::Core::String& value, Rml::Core::Element* element) : value(value), element(element) {}
+	DemoEventListener(const Rml::Core::String& value, Rml::Core::Element* element) : value(value), element(element) {}
 
 
 	void ProcessEvent(Rml::Core::Event& event) override
 	void ProcessEvent(Rml::Core::Event& event) override
 	{
 	{
 		using namespace Rml::Core;
 		using namespace Rml::Core;
 
 
-		Rml::Core::Log::Message(Rml::Core::Log::LT_WARNING, "%s", value.c_str());
-		if (value == "destroyed")
+		if (value == "exit")
 		{
 		{
-			element->GetParentNode()->GetParentNode()->SetInnerRML("");// "<button onclick='confirm_exit'>Are you sure?</button>");
-			//if (auto child = element->GetChild(0))
-			//	child->Focus();
-			//event.StopImmediatePropagation();
+			// Test replacing the current element.
+			// Need to be careful with regard to lifetime issues. The event's current element will be destroyed, so we cannot
+			// use it after SetInnerRml(). The library should handle this case safely internally when propagating the event further.
+			auto parent = element->GetParentNode();
+			parent->SetInnerRML("<button onclick='confirm_exit' onblur='cancel_exit' onmouseout='cancel_exit'>Are you sure?</button>");
+			if (auto child = parent->GetChild(0))
+				child->Focus();
 		}
 		}
 		else if (value == "confirm_exit")
 		else if (value == "confirm_exit")
 		{
 		{
 			Shell::RequestExit();
 			Shell::RequestExit();
 		}
 		}
-		else if (value == "destroyed")
-		{
-
-		}
-		else if (value == "parent")
+		else if (value == "cancel_exit")
 		{
 		{
-
+			if(auto parent = element->GetParentNode())
+				parent->SetInnerRML("<button id='exit' onclick='exit'>Exit</button>");
 		}
 		}
 	}
 	}
 
 
@@ -174,12 +154,12 @@ private:
 
 
 
 
 
 
-class EventInstancer : public Rml::Core::EventListenerInstancer
+class DemoEventListenerInstancer : public Rml::Core::EventListenerInstancer
 {
 {
 public:
 public:
 	Rml::Core::EventListener* InstanceEventListener(const Rml::Core::String& value, Rml::Core::Element* element) override
 	Rml::Core::EventListener* InstanceEventListener(const Rml::Core::String& value, Rml::Core::Element* element) override
 	{
 	{
-		return new Event(value, element);
+		return new DemoEventListener(value, element);
 	}
 	}
 };
 };
 
 
@@ -240,15 +220,15 @@ int main(int RMLUI_UNUSED_PARAMETER(argc), char** RMLUI_UNUSED_PARAMETER(argv))
 	
 	
 	context->SetDensityIndependentPixelRatio(1.0f);
 	context->SetDensityIndependentPixelRatio(1.0f);
 
 
-	EventInstancer event_listener_instancer;
+	DemoEventListenerInstancer event_listener_instancer;
 	Rml::Core::Factory::RegisterEventListenerInstancer(&event_listener_instancer);
 	Rml::Core::Factory::RegisterEventListenerInstancer(&event_listener_instancer);
 
 
 	Shell::LoadFonts("assets/");
 	Shell::LoadFonts("assets/");
 
 
-	window = new DemoWindow("Demo sample", Rml::Core::Vector2f(150, 80), context);
-	window->GetDocument()->AddEventListener(Rml::Core::EventId::Keydown, window);
-	window->GetDocument()->AddEventListener(Rml::Core::EventId::Keyup, window);
-	window->GetDocument()->AddEventListener(Rml::Core::EventId::Animationend, window);
+	auto window = std::make_unique<DemoWindow>("Demo sample", Rml::Core::Vector2f(150, 80), context);
+	window->GetDocument()->AddEventListener(Rml::Core::EventId::Keydown, window.get());
+	window->GetDocument()->AddEventListener(Rml::Core::EventId::Keyup, window.get());
+	window->GetDocument()->AddEventListener(Rml::Core::EventId::Animationend, window.get());
 
 
 	Shell::EventLoop(GameLoop);
 	Shell::EventLoop(GameLoop);
 
 
@@ -260,7 +240,7 @@ int main(int RMLUI_UNUSED_PARAMETER(argc), char** RMLUI_UNUSED_PARAMETER(argv))
 	Shell::CloseWindow();
 	Shell::CloseWindow();
 	Shell::Shutdown();
 	Shell::Shutdown();
 
 
-	delete window;
+	window.reset();
 
 
 	return 0;
 	return 0;
 }
 }