[APP] Create and Extract Zarchive packages

This commit is contained in:
Adrian
2024-04-10 15:57:15 +01:00
committed by Radosław Gliński
parent 06d7a5f0a3
commit 0fcdc12cb9
7 changed files with 389 additions and 34 deletions

View File

@@ -50,6 +50,16 @@ class FilePicker {
const std::string& title() const { return title_; }
void set_title(std::string title) { title_ = std::move(title); }
const std::string& default_extension() const { return default_extension_; }
void set_default_extension(std::string default_extension) {
default_extension_ = std::move(default_extension);
}
const std::string& file_name() const { return file_name_; }
void set_file_name(std::string file_name) {
file_name_ = std::move(file_name);
}
std::vector<std::pair<std::string, std::string>> extensions() const {
return extensions_;
}
@@ -76,6 +86,8 @@ class FilePicker {
Mode mode_;
Type type_;
std::string title_;
std::string default_extension_;
std::string file_name_;
std::vector<std::pair<std::string, std::string>> extensions_;
bool multi_selection_;

View File

@@ -111,13 +111,37 @@ Win32FilePicker::Win32FilePicker() = default;
Win32FilePicker::~Win32FilePicker() = default;
bool Win32FilePicker::Show(Window* parent_window) {
// TODO(benvanik): FileSaveDialog.
assert_true(mode() == Mode::kOpen);
Microsoft::WRL::ComPtr<IFileDialog> file_dialog;
Microsoft::WRL::ComPtr<IFileOpenDialog> file_dialog;
HRESULT hr =
CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&file_dialog));
Microsoft::WRL::ComPtr<IFileOpenDialog> open_dialog;
Microsoft::WRL::ComPtr<IFileSaveDialog> save_dialog;
HRESULT hr;
if (mode() == Mode::kOpen) {
hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&file_dialog));
if (!SUCCEEDED(hr)) {
return false;
}
hr = file_dialog.As(&open_dialog);
} else {
hr = CoCreateInstance(CLSID_FileSaveDialog, NULL, CLSCTX_INPROC_SERVER,
IID_PPV_ARGS(&file_dialog));
if (!SUCCEEDED(hr)) {
return false;
}
hr = file_dialog.As(&save_dialog);
}
if (!SUCCEEDED(hr)) {
return false;
}
hr = file_dialog->SetDefaultExtension(
(LPCWSTR)xe::to_utf16(default_extension()).c_str());
if (!SUCCEEDED(hr)) {
return false;
}
@@ -127,6 +151,17 @@ bool Win32FilePicker::Show(Window* parent_window) {
return false;
}
hr = file_dialog->SetDefaultExtension(
(LPCWSTR)xe::to_utf16(default_extension()).c_str());
if (!SUCCEEDED(hr)) {
return false;
}
hr = file_dialog->SetFileName((LPCWSTR)xe::to_utf16(file_name()).c_str());
if (!SUCCEEDED(hr)) {
return false;
}
DWORD flags;
hr = file_dialog->GetOptions(&flags);
if (!SUCCEEDED(hr)) {
@@ -192,23 +227,44 @@ bool Win32FilePicker::Show(Window* parent_window) {
return false;
}
// Obtain the result once the user clicks the 'Open' button.
// The result is an IShellItem object.
Microsoft::WRL::ComPtr<IShellItemArray> shell_items;
hr = file_dialog->GetResults(&shell_items);
if (!SUCCEEDED(hr)) {
return false;
}
if (mode() == Mode::kOpen) {
// Obtain the result once the user clicks the 'Open' button.
// The result is an IShellItem object.
Microsoft::WRL::ComPtr<IShellItemArray> shell_items;
hr = open_dialog->GetResults(&shell_items);
if (!SUCCEEDED(hr)) {
return false;
}
std::vector<std::filesystem::path> selected_files;
std::vector<std::filesystem::path> selected_files;
DWORD items_count = 0;
shell_items->GetCount(&items_count);
// Iterate over selected files
for (DWORD i = 0; i < items_count; i++) {
DWORD items_count = 0;
shell_items->GetCount(&items_count);
// Iterate over selected files
for (DWORD i = 0; i < items_count; i++) {
Microsoft::WRL::ComPtr<IShellItem> shell_item;
shell_items->GetItemAt(i, &shell_item);
// We are just going to print out the name of the file for sample sake.
PWSTR file_path = nullptr;
hr = shell_item->GetDisplayName(SIGDN_FILESYSPATH, &file_path);
if (!SUCCEEDED(hr)) {
return false;
}
selected_files.push_back(std::filesystem::path(file_path));
CoTaskMemFree(file_path);
}
set_selected_files(selected_files);
} else {
// Obtain the result once the user clicks the 'Save' button.
// The result is an IShellItem object.
Microsoft::WRL::ComPtr<IShellItem> shell_item;
shell_items->GetItemAt(i, &shell_item);
// We are just going to print out the name of the file for sample sake.
hr = save_dialog->GetResult(&shell_item);
if (!SUCCEEDED(hr)) {
return false;
}
std::vector<std::filesystem::path> selected_files;
PWSTR file_path = nullptr;
hr = shell_item->GetDisplayName(SIGDN_FILESYSPATH, &file_path);
if (!SUCCEEDED(hr)) {
@@ -216,8 +272,9 @@ bool Win32FilePicker::Show(Window* parent_window) {
}
selected_files.push_back(std::filesystem::path(file_path));
CoTaskMemFree(file_path);
set_selected_files(selected_files);
}
set_selected_files(selected_files);
return true;
}