Skip to content

Commit cb31cd2

Browse files
authored
Improve localization (#43)
2 parents 0e23c29 + 4261bb7 commit cb31cd2

File tree

15 files changed

+433
-18
lines changed

15 files changed

+433
-18
lines changed

.github/workflows/benchmark.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616
runs-on: ${{ matrix.os }}
1717
strategy:
1818
# Set fail-fast to false to ensure that feedback is delivered for all matrix combinations. Consider changing this to true when your workflow is stable.
19-
fail-fast: false
19+
fail-fast: true
2020
# Set up a matrix to run the following 3 configurations:
2121
# 1. <Windows, Release, latest MSVC compiler toolchain on the default runner image, default generator>
2222
# 2. <Linux, Release, latest GCC compiler toolchain on the default runner image, default generator>

.github/workflows/cmake-multi-platform.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
runs-on: ${{ matrix.os }}
1818
strategy:
1919
# Set fail-fast to false to ensure that feedback is delivered for all matrix combinations. Consider changing this to true when your workflow is stable.
20-
fail-fast: false
20+
fail-fast: true
2121
# Set up a matrix to run the following 3 configurations:
2222
# 1. <Windows, Release, latest MSVC compiler toolchain on the default runner image, default generator>
2323
# 2. <Linux, Release, latest GCC compiler toolchain on the default runner image, default generator>

.gitmodules

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,7 @@
44
[submodule "wiki"]
55
path = wiki
66
url = https://github.com/ZCG-coder/Steppable.wiki.git
7+
[submodule "include/imgui"]
8+
path = include/imgui
9+
url = https://github.com/ZCG-coder/imgui.git
10+
branch = docking

CMakeLists.txt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,18 +59,18 @@ IF(${OPERATING_SYSTEM} MATCHES "Android")
5959
SET(LINUX CACHE INTERNAL "Is Linux or Android" 1)
6060
ENDIF()
6161

62-
IF(WIN32)
62+
IF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
6363
ADD_COMPILE_DEFINITIONS(WINDOWS NOMINMAX) # Do not add min() and max() macros.
6464
IF(MSVC) # MSVC Has no UTF-8 support by default
6565
ADD_COMPILE_OPTIONS(/utf-8)
6666
ENDIF()
6767
SET(WINDOWS TRUE)
68-
ELSEIF(APPLE)
68+
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
6969
ADD_COMPILE_DEFINITIONS(MACOSX)
70-
ELSEIF(LINUX)
70+
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
7171
ADD_COMPILE_DEFINITIONS(LINUX)
7272
ELSE()
73-
MESSAGE(ERROR "Platform not defined")
73+
MESSAGE(WARNING "Platform not defined")
7474
ENDIF()
7575

7676
IF(CMAKE_BUILD_TYPE STREQUAL "Debug")
@@ -101,7 +101,9 @@ SET(COMPONENTS
101101
division
102102
root
103103
factorial
104-
trig hyp log)
104+
trig
105+
hyp
106+
log)
105107
# NEW_COMPONENT: PATCH Do NOT remove the previous comment.
106108

107109
SET(TARGETS ${COMPONENTS} util)
@@ -117,6 +119,7 @@ ENDFOREACH()
117119
ADD_SUBDIRECTORY(src/)
118120
ADD_SUBDIRECTORY(lib/)
119121
ADD_SUBDIRECTORY(tests/)
122+
ADD_SUBDIRECTORY(gui/)
120123
ADD_SUBDIRECTORY(include/) # The CMakeLists file there adds the include/ directory to everything
121124

122125
FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin)

gui/CMakeLists.txt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
FUNCTION(ADD_GUI SOURCE)
2+
GET_FILENAME_COMPONENT(NAME ${SOURCE} NAME_WE)
3+
SET(NAME "gui_${NAME}")
4+
5+
ADD_EXECUTABLE(${NAME} ${SOURCE})
6+
TARGET_LINK_LIBRARIES(${NAME} PRIVATE ${SDL2_LIBRARIES} ${OPENGL_LIBRARIES})
7+
TARGET_LINK_LIBRARIES(${NAME} PRIVATE imgui)
8+
TARGET_INCLUDE_DIRECTORIES(${NAME} PRIVATE ${SDL2_INCLUDE_DIRS})
9+
TARGET_INCLUDE_DIRECTORIES(${NAME} PRIVATE "${STP_BASE_DIRECTORY}/include/imgui")
10+
11+
# Link Steppable stuff
12+
TARGET_LINK_LIBRARIES(${NAME} PRIVATE calc util)
13+
TARGET_INCLUDE_DIRECTORIES(${NAME} PRIVATE ${STP_BASE_DIRECTORY}/include)
14+
15+
if(FREETYPE_FOUND)
16+
TARGET_LINK_LIBRARIES(${NAME} PRIVATE ${FREETYPE_LIBRARIES})
17+
TARGET_INCLUDE_DIRECTORIES(${NAME} PRIVATE ${FREETYPE_INCLUDE_DIRS})
18+
TARGET_COMPILE_DEFINITIONS(${NAME} PRIVATE IMGUI_ENABLE_FREETYPE)
19+
TARGET_LINK_LIBRARIES(${NAME} PRIVATE imgui_freetype)
20+
endif()
21+
ENDFUNCTION()
22+
23+
IF (STP_BUILD_GUI EQUAL 1)
24+
# Find and link SDL2 and OpenGL
25+
FIND_PACKAGE(SDL2 REQUIRED)
26+
FIND_PACKAGE(OpenGL REQUIRED)
27+
ADD_GUI(test.cpp)
28+
ENDIF()

gui/test.cpp

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
#include "backends/imgui_impl_opengl3.h"
2+
#include "backends/imgui_impl_sdl2.h"
3+
#include "gui.hpp"
4+
#include "imgui.h"
5+
#include "output.hpp"
6+
7+
#include <SDL.h>
8+
#include <SDL_opengl.h>
9+
#include <array>
10+
11+
using namespace steppable;
12+
using namespace steppable::gui::__internals;
13+
14+
int main()
15+
{
16+
// Setup SDL
17+
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0)
18+
{
19+
steppable::output::error("Error: {0}\n", std::string(SDL_GetError()));
20+
return -1;
21+
}
22+
23+
// Decide GL+GLSL versions
24+
#if defined(IMGUI_IMPL_OPENGL_ES2)
25+
// GL ES 2.0 + GLSL 100
26+
const char* glsl_version = "#version 100";
27+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0);
28+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
29+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
30+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
31+
#elif defined(__APPLE__)
32+
// GL 3.2 Core + GLSL 150
33+
const char* glsl_version = "#version 150";
34+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); // Always required on Mac
35+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
36+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
37+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
38+
#else
39+
// GL 3.0 + GLSL 130
40+
const char* glsl_version = "#version 130";
41+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0);
42+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
43+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
44+
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
45+
#endif
46+
47+
// From 2.0.18: Enable native IME.
48+
SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1");
49+
50+
// Create window with graphics context
51+
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
52+
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
53+
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8);
54+
auto window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI);
55+
SDL_Window* window = SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags);
56+
if (window == nullptr)
57+
{
58+
printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError());
59+
return -1;
60+
}
61+
62+
SDL_GLContext gl_context = SDL_GL_CreateContext(window);
63+
SDL_GL_MakeCurrent(window, gl_context);
64+
SDL_GL_SetSwapInterval(1); // Enable vsync
65+
66+
// Setup Dear ImGui context
67+
IMGUI_CHECKVERSION();
68+
ImGui::CreateContext();
69+
ImGuiIO& io = ImGui::GetIO();
70+
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
71+
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
72+
73+
// Setup Platform/Renderer backends
74+
ImGui_ImplSDL2_InitForOpenGL(window, gl_context);
75+
ImGui_ImplOpenGL3_Init(glsl_version);
76+
77+
bool done = false;
78+
ImVec4 clear_color = ImVec4(0.22, 0.22, 0.22, 1.00);
79+
std::array<char, 100> buf{};
80+
loadFonts(&io);
81+
82+
while (not done)
83+
{
84+
// Poll and handle events (inputs, window resize, etc.)
85+
// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your
86+
// inputs.
87+
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or
88+
// clear/overwrite your copy of the mouse data.
89+
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or
90+
// clear/overwrite your copy of the keyboard data. Generally you may always pass all inputs to dear imgui, and
91+
// hide them from your application based on those two flags.
92+
SDL_Event event;
93+
while (SDL_PollEvent(&event) != 0)
94+
{
95+
ImGui_ImplSDL2_ProcessEvent(&event);
96+
if (event.type == SDL_QUIT)
97+
done = true;
98+
if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE &&
99+
event.window.windowID == SDL_GetWindowID(window))
100+
done = true;
101+
}
102+
103+
// Start the Dear ImGui frame
104+
ImGui_ImplOpenGL3_NewFrame();
105+
ImGui_ImplSDL2_NewFrame();
106+
ImGui::NewFrame();
107+
108+
ImGui::Begin("My Window");
109+
ImGui::Text("Testing!");
110+
ImGui::InputText("Input", buf.data(), buf.size());
111+
ImGui::End();
112+
113+
if (isDarkModeEnabled())
114+
{
115+
glClearColor(0.22, 0.22, 0.22, 1.0);
116+
ImGui::StyleColorsDark();
117+
}
118+
else
119+
{
120+
glClearColor(0.95, 0.95, 0.95, 1.0);
121+
ImGui::StyleColorsLight();
122+
}
123+
124+
// Rendering
125+
ImGui::Render();
126+
glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
127+
glClear(GL_COLOR_BUFFER_BIT);
128+
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
129+
SDL_GL_SwapWindow(window);
130+
}
131+
132+
// Cleanup
133+
ImGui_ImplOpenGL3_Shutdown();
134+
ImGui_ImplSDL2_Shutdown();
135+
ImGui::DestroyContext();
136+
137+
SDL_GL_DeleteContext(gl_context);
138+
SDL_DestroyWindow(window);
139+
SDL_Quit();
140+
141+
return 0;
142+
}

include/CMakeLists.txt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,35 @@
2424
FOREACH(TARGET IN LISTS TEST_TARGETS)
2525
TARGET_INCLUDE_DIRECTORIES(${TARGET} PUBLIC ${STP_BASE_DIRECTORY}/include/)
2626
ENDFOREACH(TARGET)
27+
28+
IF (STP_BUILD_GUI EQUAL 1)
29+
FIND_PACKAGE(SDL2 REQUIRED)
30+
ADD_LIBRARY(imgui
31+
imgui/imgui.cpp
32+
imgui/imgui_draw.cpp
33+
imgui/imgui_widgets.cpp
34+
imgui/imgui_tables.cpp
35+
imgui/imgui_demo.cpp
36+
imgui/backends/imgui_impl_sdl2.cpp
37+
imgui/backends/imgui_impl_opengl3.cpp)
38+
39+
# If we have freetype, we can use it to render text
40+
FIND_PACKAGE(Freetype QUIET)
41+
IF (FREETYPE_FOUND)
42+
MESSAGE(STATUS "Found Freetype")
43+
ADD_LIBRARY(imgui_freetype STATIC "${STP_BASE_DIRECTORY}/include/imgui/misc/freetype/imgui_freetype.cpp")
44+
TARGET_INCLUDE_DIRECTORIES(imgui_freetype PRIVATE "${STP_BASE_DIRECTORY}/include/imgui")
45+
TARGET_LINK_LIBRARIES(imgui_freetype PRIVATE ${FREETYPE_LIBRARIES})
46+
TARGET_LINK_LIBRARIES(imgui PRIVATE imgui_freetype)
47+
TARGET_INCLUDE_DIRECTORIES(imgui_freetype PRIVATE ${FREETYPE_INCLUDE_DIRS})
48+
TARGET_COMPILE_DEFINITIONS(imgui PRIVATE IMGUI_ENABLE_FREETYPE)
49+
ENDIF()
50+
51+
IF (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
52+
TARGET_LINK_LIBRARIES(imgui PRIVATE "-framework CoreFoundation")
53+
ENDIF()
54+
55+
TARGET_LINK_LIBRARIES(imgui PRIVATE SDL2::SDL2)
56+
TARGET_INCLUDE_DIRECTORIES(imgui PRIVATE ${SDL2_INCLUDE_DIRS})
57+
TARGET_INCLUDE_DIRECTORIES(imgui PRIVATE "${STP_BASE_DIRECTORY}/include/imgui")
58+
ENDIF()

0 commit comments

Comments
 (0)