Skip to content

Commit 1e5e35b

Browse files
Welcome winrt ! (#402)
* Welcome winrt ! * fixed file dialog logic impl
1 parent e6dd15d commit 1e5e35b

File tree

14 files changed

+181
-80
lines changed

14 files changed

+181
-80
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ __externals/imgui/src/examples/example_glfw_vulkan/out/
4242
__externals/SDL2
4343
__externals/stb
4444
__externals/spdlog
45+
__externals/nuget
4546

4647
# Shader cache file folder
4748
Resources/Shaders/Cache

CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@ set_property (GLOBAL PROPERTY USE_FOLDERS ON)
1212
#
1313
get_filename_component (ENLISTMENT_ROOT "." ABSOLUTE CACHE)
1414
get_filename_component (EXTERNAL_DIR "${ENLISTMENT_ROOT}/__externals" ABSOLUTE CACHE)
15-
get_filename_component (EXAMPLE_DIR "${ENLISTMENT_ROOT}/Examples" ABSOLUTE CACHE)
15+
get_filename_component (EXTERNAL_NUGET_DIR "${ENLISTMENT_ROOT}/__externals/nuget" ABSOLUTE CACHE)
1616

1717
include(${ENLISTMENT_ROOT}/Scripts/CMake/NuGet.cmake)
18+
include(${ENLISTMENT_ROOT}/Scripts/CMake/CppWinRT.cmake)
19+
include(${ENLISTMENT_ROOT}/dependencies.cmake)
1820

1921

2022
option (COPY_EXAMPLE_PROJECT "Copy example projects that show how to use Launcher" ON)

Scripts/CMake/CppWinRT.cmake

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# Generates CppWinRT headers
2+
#
3+
# generate_winrt_headers(
4+
# EXECUTABLE
5+
# <path to cppwinrt.exe to use>
6+
# INPUT
7+
# <inputs>*
8+
# OUTPUT
9+
# <output path>
10+
# [OPTIMIZE]
11+
#
12+
# Remarks:
13+
#
14+
function(generate_winrt_headers)
15+
set(FLAG_ARGS OPTIMIZE)
16+
set(ONE_VALUE_ARGS EXECUTABLE OUTPUT)
17+
set(MULTI_VALUE_ARGS INPUT)
18+
19+
cmake_parse_arguments(CPPWINRT "${FLAG_ARGS}" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGV})
20+
21+
list(APPEND CPPWINRT_ARGUMENTS -output ${CPPWINRT_OUTPUT})
22+
23+
foreach(CPPWINRT_INPUT_ITEM ${CPPWINRT_INPUT})
24+
list(APPEND CPPWINRT_ARGUMENTS -input ${CPPWINRT_INPUT_ITEM})
25+
endforeach()
26+
27+
if(CPPWINRT_OPTIMIZE)
28+
list(APPEND CPPWINRT_ARGUMENTS -optimize)
29+
endif()
30+
31+
execute_process(
32+
COMMAND "${CPPWINRT_EXECUTABLE}" ${CPPWINRT_ARGUMENTS}
33+
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
34+
COMMAND_ECHO STDOUT
35+
OUTPUT_VARIABLE WINRT_OUTPUT
36+
OUTPUT_STRIP_TRAILING_WHITESPACE
37+
)
38+
endfunction()

Scripts/CMake/NuGet.cmake

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,42 @@
1+
2+
# Installs a NuGet package
3+
#
4+
# install_nuget_package(<nuget name> <nuget version> <path property>)
5+
#
6+
# The NuGet will be download during CMake generation.
7+
#
8+
function(install_nuget_package NUGET_PACKAGE_NAME NUGET_PACKAGE_VERSION NUGET_PATH_PROPERTY)
9+
# NUGET_PACKAGE_NAME - The name of the NuGet package.
10+
# NUGET_PACKAGE_VERSION - The version of the NuGet package.
11+
find_program(NUGET_EXECUTABLE nuget REQUIRED)
12+
13+
if("${EXTERNAL_NUGET_DIR}" STREQUAL "")
14+
set(EXTERNAL_NUGET_DIR "${CMAKE_BINARY_DIR}/__packages")
15+
endif()
16+
17+
cmake_parse_arguments("NUGET" "" "SOURCE" "" ${ARGN})
18+
19+
if(NOT ("${NUGET_SOURCE}" STREQUAL ""))
20+
message(STATUS "Nuget source for ${NUGET_PACKAGE_NAME}@${NUGET_PACKAGE_VERSION} is ${NUGET_SOURCE}")
21+
set(NUGET_SOURCE_COMMAND -Source "${NUGET_SOURCE}")
22+
endif()
23+
24+
# The NUGET_PACKAGE_ROOT is where NUGET_EXECUTABLE installed the package to.
25+
set(NUGET_PACKAGE_ROOT "${EXTERNAL_NUGET_DIR}/${NUGET_PACKAGE_NAME}.${NUGET_PACKAGE_VERSION}")
26+
27+
if(NOT EXISTS "${NUGET_PACKAGE_ROOT}")
28+
message(STATUS "nuget install ${NUGET_PACKAGE_NAME} -Version ${NUGET_PACKAGE_VERSION} -OutputDirectory ${EXTERNAL_NUGET_DIR}")
29+
execute_process(
30+
COMMAND ${NUGET_EXECUTABLE} install ${NUGET_PACKAGE_NAME} -Version ${NUGET_PACKAGE_VERSION} -OutputDirectory "${EXTERNAL_NUGET_DIR}" ${NUGET_SOURCE_COMMAND}
31+
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
32+
OUTPUT_VARIABLE NUGET_OUTPUT
33+
OUTPUT_STRIP_TRAILING_WHITESPACE
34+
)
35+
endif()
36+
37+
set(${NUGET_PATH_PROPERTY} "${NUGET_PACKAGE_ROOT}" PARENT_SCOPE)
38+
endfunction()
39+
140
function(restore_nuget_packages VS_SLN_OR_PROJ)
241
# VS_SLN_OR_PROJ - the Visual Studio .sln, .vcxproj or .csproj defining the nuget dependencies
342

Tetragrama/Components/DockspaceUIComponent.cpp

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
#include <DockspaceUIComponent.h>
33
#include <Editor.h>
44
#include <Helpers/UIDispatcher.h>
5-
#include <Helpers/WindowsHelper.h>
65
#include <Importers/AssimpImporter.h>
76
#include <MessageToken.h>
87
#include <Messengers/Messenger.h>
@@ -164,12 +163,18 @@ namespace Tetragrama::Components
164163

165164
if (ImGui::Button("...", ImVec2(50, 0)) && is_import_button_enabled)
166165
{
167-
Helpers::UIDispatcher::RunAsync([]() -> std::future<void> {
168-
std::string filename = co_await Helpers::OpenFileDialogAsync();
169-
if (!filename.empty())
166+
Helpers::UIDispatcher::RunAsync([this]() -> std::future<void> {
167+
if (auto layer = m_parent_layer.lock())
170168
{
171-
ZEngine::Helpers::secure_memset(s_asset_importer_input_buffer, 0, IM_ARRAYSIZE(s_asset_importer_input_buffer), IM_ARRAYSIZE(s_asset_importer_input_buffer));
172-
ZEngine::Helpers::secure_memcpy(s_asset_importer_input_buffer, IM_ARRAYSIZE(s_asset_importer_input_buffer), filename.c_str(), filename.size());
169+
auto window = layer->GetAttachedWindow();
170+
std::vector<std::string_view> filters{".obj", ".gltf"};
171+
std::string filename = co_await window->OpenFileDialogAsync(filters);
172+
173+
if (!filename.empty())
174+
{
175+
ZEngine::Helpers::secure_memset(s_asset_importer_input_buffer, 0, IM_ARRAYSIZE(s_asset_importer_input_buffer), IM_ARRAYSIZE(s_asset_importer_input_buffer));
176+
ZEngine::Helpers::secure_memcpy(s_asset_importer_input_buffer, IM_ARRAYSIZE(s_asset_importer_input_buffer), filename.c_str(), filename.size());
177+
}
173178
}
174179
});
175180
}
@@ -551,13 +556,17 @@ namespace Tetragrama::Components
551556

552557
std::future<void> DockspaceUIComponent::OnOpenSceneAsync()
553558
{
554-
auto scene_filename = co_await Helpers::OpenFileDialogAsync();
555-
556-
if (!scene_filename.empty())
559+
if (auto layer = m_parent_layer.lock())
557560
{
558-
m_editor_serializer->Deserialize(scene_filename);
561+
auto window = layer->GetAttachedWindow();
562+
std::vector<std::string_view> filters = {"."};
563+
std::string scene_filename = co_await window->OpenFileDialogAsync(filters);
564+
565+
if (!scene_filename.empty())
566+
{
567+
m_editor_serializer->Deserialize(scene_filename);
568+
}
559569
}
560-
ZENGINE_CORE_WARN("Editor stopped")
561570
co_return;
562571
}
563572

Tetragrama/EditorWindow.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,25 @@
11
#include <pch.h>
22
#include <EditorWindow.h>
3+
#include <ZEngine/Core/Coroutine.h>
34
#include <ZEngine/Engine.h>
45
#include <ZEngine/Event/EngineClosedEvent.h>
56
#include <ZEngine/Logging/LoggerDefinition.h>
67
#include <ZEngine/Windows/Inputs/KeyCode.h>
78

89
#ifdef _WIN32
910
#define GLFW_EXPOSE_NATIVE_WIN32
11+
12+
#include <ShObjIdl.h>
13+
#include <winrt/Windows.Foundation.Collections.h>
14+
#include <winrt/Windows.Foundation.h>
15+
#include <winrt/Windows.Storage.Pickers.h>
16+
#include <winrt/Windows.Storage.h>
17+
18+
using namespace winrt;
19+
using namespace winrt::Windows::Foundation;
20+
using namespace winrt::Windows::Storage;
21+
using namespace winrt::Windows::Storage::Pickers;
22+
1023
#endif
1124
#include <GLFW/glfw3native.h>
1225

@@ -359,6 +372,39 @@ namespace Tetragrama
359372
m_swapchain->Present();
360373
}
361374

375+
std::future<std::string> EditorWindow::OpenFileDialogAsync(std::span<std::string_view> type_filters)
376+
{
377+
std::string path{""};
378+
#ifdef _WIN32
379+
380+
auto native_hwnd = glfwGetWin32Window(m_native_window);
381+
382+
FileOpenPicker file_picker;
383+
file_picker.ViewMode(PickerViewMode::Thumbnail);
384+
file_picker.SuggestedStartLocation(PickerLocationId::ComputerFolder);
385+
file_picker.as<::IInitializeWithWindow>()->Initialize(native_hwnd);
386+
387+
if (!type_filters.empty())
388+
{
389+
auto filters = file_picker.FileTypeFilter();
390+
filters.Clear();
391+
392+
for (std::string_view type : type_filters)
393+
{
394+
filters.Append(winrt::to_hstring(type));
395+
}
396+
}
397+
398+
IStorageFile file = co_await file_picker.PickSingleFileAsync();
399+
400+
if (file)
401+
{
402+
path = winrt::to_string(file.Path());
403+
}
404+
#endif
405+
co_return path;
406+
}
407+
362408
bool EditorWindow::CreateSurface(void* instance, void** out_window_surface)
363409
{
364410
if (!instance || !out_window_surface)

Tetragrama/EditorWindow.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ namespace Tetragrama
3434
virtual void Update(ZEngine::Core::TimeStep delta_time) override;
3535
virtual void Render() override;
3636

37+
virtual std::future<std::string> OpenFileDialogAsync(std::span<std::string_view> type_filters = {}) override;
38+
3739
virtual bool CreateSurface(void* instance, void** out_window_surface) override;
3840
virtual std::vector<std::string> GetRequiredExtensionLayers() override;
3941
ZEngine::Helpers::Ref<ZEngine::Rendering::Swapchain> GetSwapchain() const override;

Tetragrama/EntryPoint.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,9 +109,11 @@ int applicationEntryPoint(int argc, char* argv[])
109109

110110
#ifdef _WIN32
111111
#include <windows.h>
112+
#include <winrt/Windows.Foundation.h>
112113

113114
int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow)
114115
{
116+
winrt::init_apartment();
115117
return applicationEntryPoint(__argc, __argv);
116118
}
117119

Tetragrama/Helpers/WindowsHelper.cpp

Lines changed: 0 additions & 56 deletions
This file was deleted.

Tetragrama/Helpers/WindowsHelper.h

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)