Created inital window and cleaned up CMakeLists
This commit is contained in:
@@ -17,32 +17,42 @@ add_library(lunasvg::lunasvg ALIAS PkgConfig::LUNASVG)
|
||||
|
||||
find_package(RmlUi CONFIG REQUIRED)
|
||||
|
||||
add_executable(${PROJECT_NAME}
|
||||
src/main.cpp
|
||||
add_library(rmlui_backend STATIC
|
||||
vendor/rmlui_backend/RmlUi_Backend_SDL_GL3.cpp
|
||||
vendor/rmlui_backend/RmlUi_Platform_SDL.cpp
|
||||
vendor/rmlui_backend/RmlUi_Renderer_GL3.cpp
|
||||
)
|
||||
|
||||
target_include_directories(${PROJECT_NAME} PRIVATE
|
||||
src
|
||||
target_include_directories(rmlui_backend PUBLIC
|
||||
vendor/rmlui_backend
|
||||
${FREETYPE_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE
|
||||
target_compile_definitions(rmlui_backend PUBLIC
|
||||
RMLUI_SDL_VERSION_MAJOR=3
|
||||
RMLUI_NUM_MSAA_SAMPLES=4
|
||||
)
|
||||
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE
|
||||
target_link_libraries(rmlui_backend PUBLIC
|
||||
RmlUi::RmlUi
|
||||
SDL3::SDL3
|
||||
SDL3_image::SDL3_image
|
||||
Freetype::Freetype
|
||||
)
|
||||
|
||||
add_executable(${PROJECT_NAME}
|
||||
src/main.cpp
|
||||
)
|
||||
|
||||
target_include_directories(${PROJECT_NAME} PRIVATE
|
||||
src
|
||||
)
|
||||
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE
|
||||
rmlui_backend
|
||||
RmlUi::Debugger
|
||||
RmlUi::Lua
|
||||
${LUA_LIBRARIES}
|
||||
Freetype::Freetype
|
||||
lunasvg::lunasvg
|
||||
SDL3::SDL3
|
||||
SDL3_image::SDL3_image
|
||||
)
|
||||
|
||||
install(TARGETS ${PROJECT_NAME} DESTINATION bin)
|
||||
|
||||
9
assets/main.rml
Normal file
9
assets/main.rml
Normal file
@@ -0,0 +1,9 @@
|
||||
<rml>
|
||||
<head>
|
||||
<title>RmlShell</title>
|
||||
<link type="text/rcss" href="styles/main.rcss"/>
|
||||
</head>
|
||||
<body>
|
||||
<p>Hello world</p>
|
||||
</body>
|
||||
</rml>
|
||||
270
assets/styles/main.rcss
Normal file
270
assets/styles/main.rcss
Normal file
@@ -0,0 +1,270 @@
|
||||
/* ==========================================================================
|
||||
RCSS User Agent Defaults (Plain HTML Style)
|
||||
========================================================================== */
|
||||
|
||||
/* Core Application Window Foundation */
|
||||
body {
|
||||
display: block;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
font-family: "rmlui-debugger-font";
|
||||
font-size: 16px;
|
||||
background-color: #ffffff;
|
||||
color: #000000;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
/* Generic Structural Layout Defaults */
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
div, section, article, header, footer, main, nav, aside {
|
||||
display: block;
|
||||
}
|
||||
|
||||
span, em, strong, a {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
/* Typographic Defaults */
|
||||
p {
|
||||
display: block;
|
||||
margin: 1em 0px;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
display: block;
|
||||
font-weight: bold;
|
||||
margin: 0.83em 0px;
|
||||
}
|
||||
|
||||
h1 { font-size: 2em; }
|
||||
h2 { font-size: 1.5em; }
|
||||
h3 { font-size: 1.17em; }
|
||||
h4 { font-size: 1em; }
|
||||
h5 { font-size: 0.83em; }
|
||||
h6 { font-size: 0.67em; }
|
||||
|
||||
em {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #0000ee;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #551a8b;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
display: block;
|
||||
margin: 1em 40px;
|
||||
padding-left: 10px;
|
||||
border-left: 2px #cccccc;
|
||||
color: #555555;
|
||||
}
|
||||
|
||||
code, pre {
|
||||
font-family: "rmlui-debugger-font";
|
||||
background-color: #606060;
|
||||
color: #000000;
|
||||
padding: 3px;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
pre {
|
||||
display: block;
|
||||
white-space: pre;
|
||||
margin: 1em 0px;
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
/* Lists */
|
||||
ul, ol {
|
||||
display: block;
|
||||
margin: 1em 0px;
|
||||
padding-left: 40px;
|
||||
}
|
||||
|
||||
li {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Tables
|
||||
========================================================================== */
|
||||
table {
|
||||
display: table;
|
||||
}
|
||||
|
||||
tr {
|
||||
display: table-row;
|
||||
}
|
||||
|
||||
td, th {
|
||||
display: table-cell;
|
||||
padding: 4px 8px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
th {
|
||||
font-weight: bold;
|
||||
background-color: #eaeaea;
|
||||
}
|
||||
|
||||
col {
|
||||
display: table-column;
|
||||
}
|
||||
|
||||
colgroup {
|
||||
display: table-column-group;
|
||||
}
|
||||
|
||||
thead, tbody, tfoot {
|
||||
display: table-row-group;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Form Inputs & Interactive UI Components
|
||||
========================================================================== */
|
||||
button, input, select, textarea {
|
||||
display: inline-block;
|
||||
font-family: "rmlui-debugger-font";
|
||||
font-size: 14px;
|
||||
margin: 2px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
/* Traditional gray bevel button style */
|
||||
button, input[type="submit"], input[type="button"] {
|
||||
padding: 4px 12px;
|
||||
min-width: 40px;
|
||||
background-color: #e1e1e1;
|
||||
color: #000000;
|
||||
border: 1px #767676;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
button:hover, input[type="submit"]:hover, input[type="button"]:hover {
|
||||
background-color: #d0d0d0;
|
||||
border: 1px #4f4f4f;
|
||||
}
|
||||
|
||||
button:active, input[type="submit"]:active, input[type="button"]:active {
|
||||
background-color: #b5b5b5;
|
||||
border: 1px #000000;
|
||||
}
|
||||
|
||||
/* Standard text field styling */
|
||||
input[type="text"], input[type="password"], textarea {
|
||||
padding: 4px;
|
||||
background-color: #ffffff;
|
||||
color: #000000;
|
||||
border: 1px #767676;
|
||||
}
|
||||
|
||||
input[type="text"]:focus, input[type="password"]:focus, textarea:focus {
|
||||
border: 1px #005aff;
|
||||
}
|
||||
|
||||
textarea {
|
||||
display: block;
|
||||
white-space: pre-wrap;
|
||||
width: 300px;
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
/* Select Box & Dropdowns */
|
||||
select {
|
||||
padding: 4px;
|
||||
background-color: #ffffff;
|
||||
color: #000000;
|
||||
border: 1px #767676;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
RmlUi Specific Elements (Tabsets, Progress Bars, etc.)
|
||||
========================================================================== */
|
||||
tabset {
|
||||
display: block;
|
||||
}
|
||||
|
||||
tabset tabs {
|
||||
display: block;
|
||||
border-bottom: 1px #cccccc;
|
||||
}
|
||||
|
||||
/* Simple default layout style for built-in tabs */
|
||||
tab {
|
||||
display: inline-block;
|
||||
padding: 6px 12px;
|
||||
background-color: #f0f0f0;
|
||||
border: 1px #cccccc;
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
tab:selected {
|
||||
background-color: #ffffff;
|
||||
border-bottom: 1px #ffffff; /* Overlap the bottom border line */
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
panel {
|
||||
display: block;
|
||||
padding: 10px;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
/* Standard HTML5 / RmlUi Progress Bar Fallback */
|
||||
progress {
|
||||
display: inline-block;
|
||||
width: 160px;
|
||||
height: 20px;
|
||||
background-color: #e6e6e6;
|
||||
border: 1px #b0b0b0;
|
||||
}
|
||||
|
||||
progress-value {
|
||||
display: block;
|
||||
height: 100%;
|
||||
background-color: #0078d7; /* Classic Windows Blue fill */
|
||||
}
|
||||
|
||||
/* ==========================================================================
|
||||
Utility & Modern Layout Helpers
|
||||
========================================================================== */
|
||||
.flex {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.flex-row {
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.flex-col {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.justify-center {
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.align-center {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
|
||||
89
src/main.cpp
89
src/main.cpp
@@ -1,5 +1,94 @@
|
||||
#include <RmlUi/Core/Core.h>
|
||||
#include <RmlUi/Debugger/Debugger.h>
|
||||
#include <RmlUi/Lua/Lua.h>
|
||||
#include <SDL3/SDL_keyboard.h>
|
||||
#include <iostream>
|
||||
#include <RmlUi_Backend.h>
|
||||
#include <RmlUi/Core.h>
|
||||
#include <RmlUi/Core/Context.h>
|
||||
#include <RmlUi/Lua.h>
|
||||
#include <RmlUi/Debugger.h>
|
||||
#include <string>
|
||||
#include <filesystem>
|
||||
#include <SDL3/SDL.h>
|
||||
|
||||
|
||||
static Rml::Context *ctx;
|
||||
|
||||
bool f8_was_pressed = false;
|
||||
|
||||
void handle_input() {
|
||||
const bool *keystate = SDL_GetKeyboardState(nullptr);
|
||||
|
||||
bool f8_state = keystate[SDL_SCANCODE_F8];
|
||||
if (f8_state && !f8_was_pressed) {
|
||||
f8_was_pressed = true;
|
||||
bool is_visible = Rml::Debugger::IsVisible();
|
||||
Rml::Debugger::SetVisible(!is_visible);
|
||||
} else if (!f8_state) {
|
||||
f8_was_pressed = false;
|
||||
}
|
||||
}
|
||||
|
||||
std::string GetAssetsPath() {
|
||||
std::string install_path = std::string(ASSETS_DIR) + "/main.rml";
|
||||
if (std::filesystem::exists(install_path)) {
|
||||
return std::string(ASSETS_DIR);
|
||||
}
|
||||
if (std::filesystem::exists("./assets/main.rml")) {
|
||||
return "./assets";
|
||||
}
|
||||
return ".";
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
std::cout << "Hello world\n";
|
||||
|
||||
static std::string assets_path = std::string(ASSETS_DIR);
|
||||
|
||||
if (!Backend::Initialize("RmlShell", 800, 800, true)) {
|
||||
std::cout << "[ERROR] backend already initalized?\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
Rml::SetSystemInterface(Backend::GetSystemInterface());
|
||||
Rml::SetRenderInterface(Backend::GetRenderInterface());
|
||||
Rml::Initialise();
|
||||
Rml::Lua::Initialise();
|
||||
|
||||
ctx = Rml::CreateContext("main", Rml::Vector2i(800,800));
|
||||
if (!ctx) {
|
||||
std::cout << "[ERROR] failed to create context";
|
||||
Rml::Shutdown();
|
||||
Backend::Shutdown();
|
||||
return 1;
|
||||
}
|
||||
|
||||
Rml::Debugger::Initialise(ctx);
|
||||
|
||||
bool is_running = true;
|
||||
|
||||
Rml::ElementDocument* document = ctx->LoadDocument(GetAssetsPath() + "/main.rml");
|
||||
if (!document) {
|
||||
std::cout << "[ERROR] failed to load main.rml\n";
|
||||
} else {
|
||||
document->Show();
|
||||
}
|
||||
|
||||
while(is_running) {
|
||||
is_running = Backend::ProcessEvents(ctx);
|
||||
|
||||
handle_input();
|
||||
|
||||
ctx->Update();
|
||||
Backend::BeginFrame();
|
||||
ctx->Render();
|
||||
Backend::PresentFrame();
|
||||
}
|
||||
|
||||
Rml::Shutdown();
|
||||
Backend::Shutdown();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user