Explorar o código

tools: truly async refresh()

Daniele Bartolini hai 1 ano
pai
achega
8aa758105b
Modificáronse 2 ficheiros con 51 adicións e 8 borrados
  1. 9 0
      src/device/device.cpp
  2. 42 8
      tools/level_editor/level_editor.vala

+ 9 - 0
src/device/device.cpp

@@ -235,6 +235,15 @@ static void device_message_refresh(ConsoleServer &cs, u32 client_id, const char
 {
 	CE_UNUSED_2(cs, client_id);
 	((Device *)user_data)->refresh(json);
+
+	TempAllocator512 ta;
+	StringStream ss(ta);
+	ss << "{";
+	ss << "\"type\":\"refresh\",";
+	ss << "\"success\":" << (true ? "true" : "false");
+	ss << "}";
+
+	cs.send(client_id, string_stream::c_str(ss));
 }
 
 Device::Device(const DeviceOptions &opts, ConsoleServer &cs)

+ 42 - 8
tools/level_editor/level_editor.vala

@@ -87,6 +87,8 @@ public class RuntimeInstance
 	public uint32 _process_id;
 	public uint _revision;
 	public GLib.SourceFunc _stop_callback;
+	public GLib.SourceFunc _refresh_callback;
+	public bool _refresh_success;
 	public ConsoleClient _client;
 
 	public signal void connected(RuntimeInstance ri, string address, int port);
@@ -101,6 +103,8 @@ public class RuntimeInstance
 		_process_id = uint32.MAX;
 		_revision = 0;
 		_stop_callback = null;
+		_refresh_callback = null;
+		_refresh_success = false;
 		_client = new ConsoleClient();
 		_client.connected.connect(on_client_connected);
 		_client.message_received.connect(on_client_message_received);
@@ -203,6 +207,35 @@ public class RuntimeInstance
 	{
 		return _client.is_connected();
 	}
+
+	public async bool refresh(DataCompiler dc)
+	{
+		if (_refresh_callback != null)
+			return false;
+
+		if (!is_connected())
+			return false;
+
+		var compiler_revision = dc._revision;
+		var refresh_list = yield dc.refresh_list(_revision);
+		_client.send(DeviceApi.refresh(refresh_list));
+		_client.send(DeviceApi.frame());
+		_refresh_callback = refresh.callback;
+		yield; // Wait for client to refresh the resources.
+
+		if (_refresh_success)
+			_revision = compiler_revision;
+
+		return _refresh_success;
+	}
+
+	public void refresh_finished(bool success)
+	{
+		_refresh_success = success;
+		if (_refresh_callback != null)
+			_refresh_callback();
+		_refresh_callback = null;
+	}
 }
 
 public class LevelEditorWindow : Gtk.ApplicationWindow
@@ -1117,6 +1150,8 @@ public class LevelEditorApplication : Gtk.Application
 				_project.data_compiled();
 				_project_browser.queue_draw();
 			}
+		} else if (msg_type == "refresh") {
+			ri.refresh_finished((bool)msg["success"]);
 		} else if (msg_type == "refresh_list") {
 			_data_compiler.refresh_list_finished((ArrayList<Value?>)msg["list"]);
 		} else if (msg_type == "unit_spawned") {
@@ -2376,17 +2411,16 @@ public class LevelEditorApplication : Gtk.Application
 			});
 	}
 
-	private async void refresh_all_clients()
+	private async bool refresh_all_clients()
 	{
 		RuntimeInstance[] runtimes = new RuntimeInstance[] { _editor, _resource_preview, _game, _thumbnail };
+		bool success = true;
 
-		foreach (var ri in runtimes) {
-			var since_revision = ri._revision;
-			var refresh_list = yield _data_compiler.refresh_list(since_revision);
-			ri.send(DeviceApi.refresh(refresh_list));
-			ri.send(DeviceApi.frame());
-			ri._revision = _data_compiler._revision;
-		}
+		foreach (var ri in runtimes)
+			if (!yield ri.refresh(_data_compiler))
+				success = false;
+
+		return success;
 	}
 
 	private void on_snap_to_grid(GLib.SimpleAction action, GLib.Variant? param)