mirror of
https://github.com/wesnoth/wesnoth
synced 2025-04-24 20:27:40 +00:00

This implements an add-on extraction progress dialog that does not actually run its own event loop, allowing the caller to take ownership of it (display() static method) and update its state using a callback function object. The object in question is passed into the add-ons management API and used to update the dialog status each time an add-on file is written to disk as part of the pack extraction process. In order to avoid stalling the extraction process in UI code, the callback is invoked for every single file, but the dialog's progress update method places a time restriction on GUI2 API calls of 120 milliseconds -- this is a good throttle interval that allows add-ons to be extracted in about the same amount of time as before while still updating the progress bar smoothly enough for add-ons that take longer than that. (This is not the most trivial code to test, so it is suggested to add a sleep/delay API call in unarchive_file() in src/addon/manager.cpp to introduce artificial delays.) One issue with this code, however, is that because modeless_dialog doesn't execute its own event loop, the only way to get the dialog to be updated is to force a draw event in ourselves via the new gui2::dialogs::modeless_dialog::force_redraw() method. This is really a side-effect of my design choice here to run the dialog in the middle of a blocking operation instead of somewhere where events are being processed normally. I'm not entirely sure if the draw events would be pushed even in that case, however. Closes #1101.