explose base and imgui as plugin
This commit is contained in:
parent
0078850db4
commit
95a037ea35
@ -13,6 +13,8 @@ else()
|
||||
endif()
|
||||
message("II SOLANACEAE_CRDTNOTES_STANDALONE " ${SOLANACEAE_CRDTNOTES_STANDALONE})
|
||||
|
||||
option(SOLANACEAE_CRDTNOTES_BUILD_PLUGINS "Build the crdtnotes plugins" ${SOLANACEAE_CRDTNOTES_STANDALONE})
|
||||
|
||||
if (SOLANACEAE_CRDTNOTES_STANDALONE)
|
||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||
|
||||
@ -31,7 +33,7 @@ if (SOLANACEAE_CRDTNOTES_STANDALONE)
|
||||
endif()
|
||||
|
||||
# external libs
|
||||
add_subdirectory(./external) # before increasing warn levels, sad :(
|
||||
add_subdirectory(./external EXCLUDE_FROM_ALL) # before increasing warn levels, sad :(
|
||||
|
||||
if (SOLANACEAE_CRDTNOTES_STANDALONE)
|
||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
||||
@ -65,3 +67,7 @@ endif()
|
||||
|
||||
add_subdirectory(./src)
|
||||
|
||||
if (SOLANACEAE_CRDTNOTES_BUILD_PLUGINS)
|
||||
add_subdirectory(./plugins)
|
||||
endif()
|
||||
|
||||
|
50
external/CMakeLists.txt
vendored
50
external/CMakeLists.txt
vendored
@ -10,3 +10,53 @@ if (NOT TARGET crdt_version3)
|
||||
FetchContent_MakeAvailable(crdt_version3)
|
||||
endif()
|
||||
|
||||
if (NOT TARGET imgui)
|
||||
FetchContent_Declare(imgui
|
||||
GIT_REPOSITORY https://github.com/ocornut/imgui.git
|
||||
GIT_TAG d4ddc46e7
|
||||
)
|
||||
|
||||
# imgui does not provide a cmake
|
||||
#FetchContent_GetProperties(imgui_interface)
|
||||
#if(NOT imgui_interface_POPULATED)
|
||||
#FetchContent_Populate(imgui_interface)
|
||||
|
||||
#add_library(imgui_interface INTERFACE
|
||||
#${imgui_interface_SOURCE_DIR}/imgui.h
|
||||
#${imgui_interface_SOURCE_DIR}/misc/cpp/imgui_stdlib.h
|
||||
#)
|
||||
#target_include_directories(imgui_interface INTERFACE ${imgui_interface_SOURCE_DIR})
|
||||
#endif()
|
||||
FetchContent_GetProperties(imgui)
|
||||
if(NOT imgui_POPULATED)
|
||||
FetchContent_Populate(imgui)
|
||||
|
||||
add_library(imgui STATIC
|
||||
${imgui_SOURCE_DIR}/imgui.h
|
||||
${imgui_SOURCE_DIR}/imgui_internal.h
|
||||
|
||||
${imgui_SOURCE_DIR}/imgui.cpp
|
||||
${imgui_SOURCE_DIR}/imgui_demo.cpp
|
||||
${imgui_SOURCE_DIR}/imgui_draw.cpp
|
||||
${imgui_SOURCE_DIR}/imgui_tables.cpp
|
||||
${imgui_SOURCE_DIR}/imgui_widgets.cpp
|
||||
${imgui_SOURCE_DIR}/imstb_rectpack.h
|
||||
${imgui_SOURCE_DIR}/imstb_textedit.h
|
||||
${imgui_SOURCE_DIR}/imstb_truetype.h
|
||||
|
||||
${imgui_SOURCE_DIR}/misc/cpp/imgui_stdlib.h
|
||||
${imgui_SOURCE_DIR}/misc/cpp/imgui_stdlib.cpp
|
||||
)
|
||||
target_include_directories(imgui PUBLIC ${imgui_SOURCE_DIR})
|
||||
endif()
|
||||
#FetchContent_MakeAvailable(imgui)
|
||||
endif()
|
||||
|
||||
if (NOT TARGET solanaceae_plugin)
|
||||
FetchContent_Declare(solanaceae_plugin
|
||||
GIT_REPOSITORY https://github.com/Green-Sky/solanaceae_plugin.git
|
||||
GIT_TAG master
|
||||
)
|
||||
FetchContent_MakeAvailable(solanaceae_plugin)
|
||||
endif()
|
||||
|
||||
|
24
plugins/CMakeLists.txt
Normal file
24
plugins/CMakeLists.txt
Normal file
@ -0,0 +1,24 @@
|
||||
cmake_minimum_required(VERSION 3.24 FATAL_ERROR)
|
||||
|
||||
add_library(plugin_crdtnotes SHARED
|
||||
./plugin_crdtnotes.cpp
|
||||
)
|
||||
target_compile_features(plugin_crdtnotes PUBLIC cxx_std_17)
|
||||
target_link_libraries(plugin_crdtnotes PUBLIC
|
||||
solanaceae_crdtnotes
|
||||
solanaceae_plugin
|
||||
)
|
||||
|
||||
########################################
|
||||
|
||||
add_library(plugin_crdtnotes_imgui SHARED
|
||||
./plugin_crdtnotes_imgui.cpp
|
||||
)
|
||||
target_compile_features(plugin_crdtnotes_imgui PUBLIC cxx_std_17)
|
||||
target_link_libraries(plugin_crdtnotes_imgui PUBLIC
|
||||
solanaceae_crdtnotes_imgui
|
||||
solanaceae_plugin
|
||||
)
|
||||
|
||||
########################################
|
||||
|
65
plugins/plugin_crdtnotes.cpp
Normal file
65
plugins/plugin_crdtnotes.cpp
Normal file
@ -0,0 +1,65 @@
|
||||
#include <solanaceae/plugin/solana_plugin_v1.h>
|
||||
|
||||
#include <solanaceae/crdtnotes/crdtnotes.hpp>
|
||||
//#include <solanaceae/util/config_model.hpp>
|
||||
|
||||
#include <memory>
|
||||
#include <iostream>
|
||||
|
||||
#define RESOLVE_INSTANCE(x) static_cast<x*>(solana_api->resolveInstance(#x))
|
||||
#define PROVIDE_INSTANCE(x, p, v) solana_api->provideInstance(#x, p, static_cast<x*>(v))
|
||||
|
||||
static std::unique_ptr<CRDTNotes> g_crdtn = nullptr;
|
||||
|
||||
extern "C" {
|
||||
|
||||
SOLANA_PLUGIN_EXPORT const char* solana_plugin_get_name(void) {
|
||||
return "CRDTNotes";
|
||||
}
|
||||
|
||||
SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_get_version(void) {
|
||||
return SOLANA_PLUGIN_VERSION;
|
||||
}
|
||||
|
||||
SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_start(struct SolanaAPI* solana_api) {
|
||||
std::cout << "PLUGIN CRDTN START()\n";
|
||||
|
||||
if (solana_api == nullptr) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
//ConfigModelI* conf = nullptr;
|
||||
|
||||
{ // make sure required types are loaded
|
||||
//conf = RESOLVE_INSTANCE(ConfigModelI);
|
||||
|
||||
//if (conf == nullptr) {
|
||||
//std::cerr << "PLUGIN CRDTN missing ConfigModelI\n";
|
||||
//return 2;
|
||||
//}
|
||||
}
|
||||
|
||||
// static store, could be anywhere tho
|
||||
// construct with fetched dependencies
|
||||
g_crdtn = std::make_unique<CRDTNotes>(/**conf*/);
|
||||
|
||||
// register types
|
||||
PROVIDE_INSTANCE(CRDTNotes, "CRDTNotes", g_crdtn.get());
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
SOLANA_PLUGIN_EXPORT void solana_plugin_stop(void) {
|
||||
std::cout << "PLUGIN CRDTN STOP()\n";
|
||||
|
||||
g_crdtn.reset();
|
||||
}
|
||||
|
||||
SOLANA_PLUGIN_EXPORT void solana_plugin_tick(float delta) {
|
||||
(void)delta;
|
||||
//std::cout << "PLUGIN CRDTN TICK()\n";
|
||||
//g_crdtn->iterate();
|
||||
}
|
||||
|
||||
} // extern C
|
||||
|
82
plugins/plugin_crdtnotes_imgui.cpp
Normal file
82
plugins/plugin_crdtnotes_imgui.cpp
Normal file
@ -0,0 +1,82 @@
|
||||
#include <solanaceae/plugin/solana_plugin_v1.h>
|
||||
|
||||
#include <solanaceae/crdtnotes_imgui/crdtnotes_imgui.hpp>
|
||||
//#include <solanaceae/util/config_model.hpp>
|
||||
#include <imgui.h>
|
||||
|
||||
#include <memory>
|
||||
#include <iostream>
|
||||
|
||||
#define RESOLVE_INSTANCE(x) static_cast<x*>(solana_api->resolveInstance(#x))
|
||||
#define PROVIDE_INSTANCE(x, p, v) solana_api->provideInstance(#x, p, static_cast<x*>(v))
|
||||
|
||||
static std::unique_ptr<CRDTNotesImGui> g_crdtn_imgui = nullptr;
|
||||
|
||||
extern "C" {
|
||||
|
||||
SOLANA_PLUGIN_EXPORT const char* solana_plugin_get_name(void) {
|
||||
return "CRDTNIMGUIotesImGui";
|
||||
}
|
||||
|
||||
SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_get_version(void) {
|
||||
return SOLANA_PLUGIN_VERSION;
|
||||
}
|
||||
|
||||
SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_start(struct SolanaAPI* solana_api) {
|
||||
std::cout << "PLUGIN CRDTNIMGUI START()\n";
|
||||
|
||||
if (solana_api == nullptr) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
//ConfigModelI* conf = nullptr;
|
||||
CRDTNotes* crdtn = nullptr;
|
||||
ImGuiContext* imguic = nullptr;
|
||||
|
||||
{ // make sure required types are loaded
|
||||
//conf = RESOLVE_INSTANCE(ConfigModelI);
|
||||
crdtn = RESOLVE_INSTANCE(CRDTNotes);
|
||||
imguic = RESOLVE_INSTANCE(ImGuiContext);
|
||||
|
||||
//if (conf == nullptr) {
|
||||
//std::cerr << "PLUGIN CRDTNIMGUI missing ConfigModelI\n";
|
||||
//return 2;
|
||||
//}
|
||||
|
||||
if (crdtn == nullptr) {
|
||||
std::cerr << "PLUGIN CRDTNIMGUI missing CRDTNotes\n";
|
||||
return 2;
|
||||
}
|
||||
|
||||
if (imguic == nullptr) {
|
||||
std::cerr << "PLUGIN CRDTNIMGUI missing ImGuiContext\n";
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
ImGui::SetCurrentContext(imguic);
|
||||
|
||||
// static store, could be anywhere tho
|
||||
// construct with fetched dependencies
|
||||
g_crdtn_imgui = std::make_unique<CRDTNotesImGui>(*crdtn);
|
||||
|
||||
// register types
|
||||
PROVIDE_INSTANCE(CRDTNotesImGui, "CRDTNotesImGui", g_crdtn_imgui.get());
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
SOLANA_PLUGIN_EXPORT void solana_plugin_stop(void) {
|
||||
std::cout << "PLUGIN CRDTNIMGUI STOP()\n";
|
||||
|
||||
g_crdtn_imgui.reset();
|
||||
}
|
||||
|
||||
SOLANA_PLUGIN_EXPORT void solana_plugin_tick(float delta) {
|
||||
(void)delta;
|
||||
//std::cout << "PLUGIN CRDTNIMGUI TICK()\n";
|
||||
g_crdtn_imgui->render();
|
||||
}
|
||||
|
||||
} // extern C
|
||||
|
@ -13,3 +13,17 @@ target_link_libraries(solanaceae_crdtnotes PUBLIC
|
||||
|
||||
########################################
|
||||
|
||||
add_library(solanaceae_crdtnotes_imgui
|
||||
./solanaceae/crdtnotes_imgui/crdtnotes_imgui.hpp
|
||||
./solanaceae/crdtnotes_imgui/crdtnotes_imgui.cpp
|
||||
)
|
||||
target_include_directories(solanaceae_crdtnotes_imgui PUBLIC .)
|
||||
target_compile_features(solanaceae_crdtnotes_imgui PUBLIC cxx_std_17)
|
||||
target_link_libraries(solanaceae_crdtnotes_imgui PUBLIC
|
||||
solanaceae_crdtnotes
|
||||
#imgui_interface
|
||||
imgui
|
||||
#solanaceae_util
|
||||
)
|
||||
|
||||
########################################
|
||||
|
60
src/solanaceae/crdtnotes_imgui/crdtnotes_imgui.cpp
Normal file
60
src/solanaceae/crdtnotes_imgui/crdtnotes_imgui.cpp
Normal file
@ -0,0 +1,60 @@
|
||||
#include "./crdtnotes_imgui.hpp"
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
#include <imgui.h>
|
||||
|
||||
namespace detail {
|
||||
uint8_t nib_from_hex(char c) {
|
||||
assert((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f'));
|
||||
|
||||
if (c >= '0' && c <= '9') {
|
||||
return static_cast<uint8_t>(c) - '0';
|
||||
} else if (c >= 'a' && c <= 'f') {
|
||||
return (static_cast<uint8_t>(c) - 'a') + 10u;
|
||||
} else {
|
||||
return 0u;
|
||||
}
|
||||
}
|
||||
char nib_to_hex(uint8_t c) {
|
||||
assert((c & 0xf0) == 0x00);
|
||||
|
||||
if (/*c >= 0x00 &&*/ c <= 0x09) {
|
||||
return static_cast<char>(c) + '0';
|
||||
} else if (c >= 0x0a && c <= 0x0f) {
|
||||
return (static_cast<char>(c) + 'a') - 10u;
|
||||
} else {
|
||||
return 0u;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename Container>
|
||||
std::string to_hex(const Container& data) {
|
||||
std::string res;
|
||||
for (const uint8_t it : data) {
|
||||
res += nib_to_hex(it << 4);
|
||||
res += nib_to_hex(it & 0x0f);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
} // detail
|
||||
|
||||
|
||||
CRDTNotesImGui::CRDTNotesImGui(CRDTNotes& notes) : _notes(notes) {
|
||||
}
|
||||
|
||||
float CRDTNotesImGui::render(void) {
|
||||
if (_show_global_list) {
|
||||
if (ImGui::Begin("CRDTNotes - Global list")) {
|
||||
const auto doclist = _notes.getDocList();
|
||||
for (const auto& docid : doclist) {
|
||||
const auto docid_str = detail::to_hex(docid);
|
||||
ImGui::TextUnformatted(docid_str.c_str());
|
||||
}
|
||||
}
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
return 1.f;
|
||||
}
|
||||
|
15
src/solanaceae/crdtnotes_imgui/crdtnotes_imgui.hpp
Normal file
15
src/solanaceae/crdtnotes_imgui/crdtnotes_imgui.hpp
Normal file
@ -0,0 +1,15 @@
|
||||
#pragma once
|
||||
|
||||
#include <solanaceae/crdtnotes/crdtnotes.hpp>
|
||||
|
||||
class CRDTNotesImGui {
|
||||
CRDTNotes& _notes;
|
||||
|
||||
bool _show_global_list {true};
|
||||
|
||||
public:
|
||||
CRDTNotesImGui(CRDTNotes& notes);
|
||||
|
||||
float render(void);
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user