mirror of
https://github.com/godotengine/godot.git
synced 2024-11-21 03:18:37 +08:00
Merge pull request #95983 from bruvzg/win_fd_opt_fix
[Windows] Emit native file dialog callback from event loop, fix selected options not saved.
This commit is contained in:
commit
3cc99d3e31
@ -115,6 +115,8 @@ void EditorFileDialog::_native_dialog_cb(bool p_ok, const Vector<String> &p_file
|
||||
file_name = ProjectSettings::get_singleton()->localize_path(file_name);
|
||||
}
|
||||
}
|
||||
selected_options = p_selected_options;
|
||||
|
||||
String f = files[0];
|
||||
if (mode == FILE_MODE_OPEN_FILES) {
|
||||
emit_signal(SNAME("files_selected"), files);
|
||||
@ -146,7 +148,6 @@ void EditorFileDialog::_native_dialog_cb(bool p_ok, const Vector<String> &p_file
|
||||
}
|
||||
file->set_text(f);
|
||||
dir->set_text(f.get_base_dir());
|
||||
selected_options = p_selected_options;
|
||||
filter->select(p_filter);
|
||||
}
|
||||
|
||||
|
@ -522,7 +522,7 @@ void DisplayServerWindows::_thread_fd_monitor(void *p_ud) {
|
||||
if (!item.has("name") || !item.has("values") || !item.has("default")) {
|
||||
continue;
|
||||
}
|
||||
event_handler->add_option(pfdc, item["name"], item["values"], item["default_idx"]);
|
||||
event_handler->add_option(pfdc, item["name"], item["values"], item["default"]);
|
||||
}
|
||||
event_handler->set_root(fd->root);
|
||||
|
||||
@ -625,62 +625,41 @@ void DisplayServerWindows::_thread_fd_monitor(void *p_ud) {
|
||||
}
|
||||
}
|
||||
if (fd->callback.is_valid()) {
|
||||
if (fd->options_in_cb) {
|
||||
Variant v_result = true;
|
||||
Variant v_files = file_names;
|
||||
Variant v_index = index;
|
||||
Variant v_opt = options;
|
||||
const Variant *cb_args[4] = { &v_result, &v_files, &v_index, &v_opt };
|
||||
|
||||
fd->callback.call_deferredp(cb_args, 4);
|
||||
} else {
|
||||
Variant v_result = true;
|
||||
Variant v_files = file_names;
|
||||
Variant v_index = index;
|
||||
const Variant *cb_args[3] = { &v_result, &v_files, &v_index };
|
||||
|
||||
fd->callback.call_deferredp(cb_args, 3);
|
||||
}
|
||||
MutexLock lock(ds->file_dialog_mutex);
|
||||
FileDialogCallback cb;
|
||||
cb.callback = fd->callback;
|
||||
cb.status = true;
|
||||
cb.files = file_names;
|
||||
cb.index = index;
|
||||
cb.options = options;
|
||||
cb.opt_in_cb = fd->options_in_cb;
|
||||
ds->pending_cbs.push_back(cb);
|
||||
}
|
||||
} else {
|
||||
if (fd->callback.is_valid()) {
|
||||
if (fd->options_in_cb) {
|
||||
Variant v_result = false;
|
||||
Variant v_files = Vector<String>();
|
||||
Variant v_index = 0;
|
||||
Variant v_opt = Dictionary();
|
||||
const Variant *cb_args[4] = { &v_result, &v_files, &v_index, &v_opt };
|
||||
|
||||
fd->callback.call_deferredp(cb_args, 4);
|
||||
} else {
|
||||
Variant v_result = false;
|
||||
Variant v_files = Vector<String>();
|
||||
Variant v_index = 0;
|
||||
const Variant *cb_args[3] = { &v_result, &v_files, &v_index };
|
||||
|
||||
fd->callback.call_deferredp(cb_args, 3);
|
||||
}
|
||||
MutexLock lock(ds->file_dialog_mutex);
|
||||
FileDialogCallback cb;
|
||||
cb.callback = fd->callback;
|
||||
cb.status = false;
|
||||
cb.files = Vector<String>();
|
||||
cb.index = index;
|
||||
cb.options = options;
|
||||
cb.opt_in_cb = fd->options_in_cb;
|
||||
ds->pending_cbs.push_back(cb);
|
||||
}
|
||||
}
|
||||
pfd->Release();
|
||||
} else {
|
||||
if (fd->callback.is_valid()) {
|
||||
if (fd->options_in_cb) {
|
||||
Variant v_result = false;
|
||||
Variant v_files = Vector<String>();
|
||||
Variant v_index = 0;
|
||||
Variant v_opt = Dictionary();
|
||||
const Variant *cb_args[4] = { &v_result, &v_files, &v_index, &v_opt };
|
||||
|
||||
fd->callback.call_deferredp(cb_args, 4);
|
||||
} else {
|
||||
Variant v_result = false;
|
||||
Variant v_files = Vector<String>();
|
||||
Variant v_index = 0;
|
||||
const Variant *cb_args[3] = { &v_result, &v_files, &v_index };
|
||||
|
||||
fd->callback.call_deferredp(cb_args, 3);
|
||||
}
|
||||
MutexLock lock(ds->file_dialog_mutex);
|
||||
FileDialogCallback cb;
|
||||
cb.callback = fd->callback;
|
||||
cb.status = false;
|
||||
cb.files = Vector<String>();
|
||||
cb.index = 0;
|
||||
cb.options = Dictionary();
|
||||
cb.opt_in_cb = fd->options_in_cb;
|
||||
ds->pending_cbs.push_back(cb);
|
||||
}
|
||||
}
|
||||
{
|
||||
@ -768,6 +747,34 @@ Error DisplayServerWindows::_file_dialog_with_options_show(const String &p_title
|
||||
return OK;
|
||||
}
|
||||
|
||||
void DisplayServerWindows::process_file_dialog_callbacks() {
|
||||
MutexLock lock(file_dialog_mutex);
|
||||
while (!pending_cbs.is_empty()) {
|
||||
FileDialogCallback cb = pending_cbs.front()->get();
|
||||
pending_cbs.pop_front();
|
||||
|
||||
if (cb.opt_in_cb) {
|
||||
Variant ret;
|
||||
Callable::CallError ce;
|
||||
const Variant *args[4] = { &cb.status, &cb.files, &cb.index, &cb.options };
|
||||
|
||||
cb.callback.callp(args, 4, ret, ce);
|
||||
if (ce.error != Callable::CallError::CALL_OK) {
|
||||
ERR_PRINT(vformat("Failed to execute file dialog callback: %s.", Variant::get_callable_error_text(cb.callback, args, 4, ce)));
|
||||
}
|
||||
} else {
|
||||
Variant ret;
|
||||
Callable::CallError ce;
|
||||
const Variant *args[3] = { &cb.status, &cb.files, &cb.index };
|
||||
|
||||
cb.callback.callp(args, 3, ret, ce);
|
||||
if (ce.error != Callable::CallError::CALL_OK) {
|
||||
ERR_PRINT(vformat("Failed to execute file dialog callback: %s.", Variant::get_callable_error_text(cb.callback, args, 3, ce)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DisplayServerWindows::mouse_set_mode(MouseMode p_mode) {
|
||||
_THREAD_SAFE_METHOD_
|
||||
|
||||
@ -3190,6 +3197,7 @@ void DisplayServerWindows::process_events() {
|
||||
memdelete(E->get());
|
||||
E->erase();
|
||||
}
|
||||
process_file_dialog_callbacks();
|
||||
}
|
||||
|
||||
void DisplayServerWindows::force_process_and_drop_events() {
|
||||
|
@ -572,6 +572,16 @@ class DisplayServerWindows : public DisplayServer {
|
||||
Mutex file_dialog_mutex;
|
||||
List<FileDialogData *> file_dialogs;
|
||||
HashMap<HWND, FileDialogData *> file_dialog_wnd;
|
||||
struct FileDialogCallback {
|
||||
Callable callback;
|
||||
Variant status;
|
||||
Variant files;
|
||||
Variant index;
|
||||
Variant options;
|
||||
bool opt_in_cb = false;
|
||||
};
|
||||
List<FileDialogCallback> pending_cbs;
|
||||
void process_file_dialog_callbacks();
|
||||
|
||||
static void _thread_fd_monitor(void *p_ud);
|
||||
|
||||
|
@ -124,6 +124,8 @@ void FileDialog::_native_dialog_cb(bool p_ok, const Vector<String> &p_files, int
|
||||
file_name = ProjectSettings::get_singleton()->localize_path(file_name);
|
||||
}
|
||||
}
|
||||
selected_options = p_selected_options;
|
||||
|
||||
String f = files[0];
|
||||
if (mode == FILE_MODE_OPEN_FILES) {
|
||||
emit_signal(SNAME("files_selected"), files);
|
||||
@ -155,7 +157,6 @@ void FileDialog::_native_dialog_cb(bool p_ok, const Vector<String> &p_files, int
|
||||
}
|
||||
file->set_text(f);
|
||||
dir->set_text(f.get_base_dir());
|
||||
selected_options = p_selected_options;
|
||||
filter->select(p_filter);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user