1111#include < Geode/loader/Mod.hpp>
1212#include " ImGui.hpp"
1313
14+ template <>
15+ struct matjson ::Serialize<Settings> {
16+ static Result<Settings> fromJson (const matjson::Value& value) {
17+ Settings defaults;
18+
19+ return Ok (Settings {
20+ .GDInWindow = value[" game_in_window" ].asBool ().unwrapOr (std::move (defaults.GDInWindow )),
21+ .attributesInTree = value[" attributes_in_tree" ].asBool ().unwrapOr (std::move (defaults.attributesInTree )),
22+ .alwaysHighlight = value[" always_highlight" ].asBool ().unwrapOr (std::move (defaults.alwaysHighlight )),
23+ .highlightLayouts = value[" highlight_layouts" ].asBool ().unwrapOr (std::move (defaults.highlightLayouts )),
24+ .arrowExpand = value[" arrow_expand" ].asBool ().unwrapOr (std::move (defaults.arrowExpand )),
25+ .orderChildren = value[" order_children" ].asBool ().unwrapOr (std::move (defaults.orderChildren )),
26+ .advancedSettings = value[" advanced_settings" ].asBool ().unwrapOr (std::move (defaults.advancedSettings )),
27+ .showMemoryViewer = value[" show_memory_viewer" ].asBool ().unwrapOr (std::move (defaults.showMemoryViewer )),
28+ .theme = value[" theme" ].asString ().unwrapOr (std::move (defaults.theme )),
29+ });
30+ }
31+
32+ static matjson::Value toJson (const Settings& settings) {
33+ return matjson::makeObject ({
34+ { " game_in_window" , settings.GDInWindow },
35+ { " attributes_in_tree" , settings.attributesInTree },
36+ { " always_highlight" , settings.alwaysHighlight },
37+ { " highlight_layouts" , settings.highlightLayouts },
38+ { " arrow_expand" , settings.arrowExpand },
39+ { " order_children" , settings.orderChildren },
40+ { " advanced_settings" , settings.advancedSettings },
41+ { " show_memory_viewer" , settings.showMemoryViewer },
42+ { " theme" , settings.theme },
43+ });
44+ }
45+ };
46+
47+ $on_mod(DataSaved) { DevTools::get ()->saveSettings (); }
48+
1449DevTools* DevTools::get () {
15- static auto inst = new DevTools;
50+ static auto inst = new DevTools () ;
1651 return inst;
1752}
1853
54+ void DevTools::loadSettings () { m_settings = Mod::get ()->getSavedValue <Settings>(" settings" ); }
55+ void DevTools::saveSettings () { Mod::get ()->setSavedValue (" settings" , m_settings); }
56+
1957bool DevTools::shouldPopGame () const {
20- return m_visible && m_GDInWindow ;
58+ return m_visible && m_settings. GDInWindow ;
2159}
2260
2361bool DevTools::pausedGame () const {
@@ -29,7 +67,7 @@ bool DevTools::isSetup() const {
2967}
3068
3169bool DevTools::shouldOrderChildren () const {
32- return m_orderChildren ;
70+ return m_settings. orderChildren ;
3371}
3472
3573CCNode* DevTools::getSelectedNode () const {
@@ -51,17 +89,9 @@ void DevTools::drawPage(const char* name, void(DevTools::*pageFun)()) {
5189 ImGui::End ();
5290}
5391
54- #ifndef GEODE_IS_MACOS
55-
56- float DevTools::retinaFactor () {
57- return 1 .f ;
58- }
59-
60- #endif
61-
6292void DevTools::drawPages () {
6393 const auto size = CCDirector::sharedDirector ()->getOpenGLView ()->getFrameSize ();
64-
94+
6595 if ((!Mod::get ()->setSavedValue (" layout-loaded" , true ) || m_shouldRelayout)) {
6696 m_shouldRelayout = false ;
6797
@@ -97,7 +127,7 @@ void DevTools::drawPages() {
97127 &DevTools::drawSettings
98128 );
99129
100- if (m_advancedSettings ) {
130+ if (m_settings. advancedSettings ) {
101131 this ->drawPage (
102132 U8STR (FEATHER_SETTINGS " Advanced Settings###devtools/advanced/settings" ),
103133 &DevTools::drawAdvancedSettings
@@ -109,10 +139,13 @@ void DevTools::drawPages() {
109139 &DevTools::drawAttributes
110140 );
111141
142+ // TODO: fix preview tab
143+ #if 0
112144 this->drawPage(
113145 U8STR(FEATHER_DATABASE " Preview###devtools/preview"),
114146 &DevTools::drawPreview
115147 );
148+ #endif
116149
117150 if (m_showModGraph) {
118151 this ->drawPage (
@@ -121,23 +154,20 @@ void DevTools::drawPages() {
121154 );
122155 }
123156
124- if (m_showModIndex) {
125- this ->drawPage (
126- U8STR (FEATHER_LIST " Mod Index###devtools/advanced/mod-index" ),
127- &DevTools::drawModIndex
128- );
157+ if (m_settings.showMemoryViewer ) {
158+ this ->drawPage (" Memory viewer" , &DevTools::drawMemory);
129159 }
130160}
131161
132162void DevTools::draw (GLRenderCtx* ctx) {
133163 if (m_visible) {
134164 if (m_reloadTheme) {
135- applyTheme (m_theme );
165+ applyTheme (m_settings. theme );
136166 m_reloadTheme = false ;
137167 }
138168
139169 m_dockspaceID = ImGui::DockSpaceOverViewport (
140- nullptr , ImGuiDockNodeFlags_PassthruCentralNode
170+ 0 , nullptr , ImGuiDockNodeFlags_PassthruCentralNode
141171 );
142172
143173 ImGui::PushFont (m_defaultFont);
@@ -154,7 +184,7 @@ void DevTools::setupFonts() {
154184 static const ImWchar icon_ranges[] = { FEATHER_MIN_FA, FEATHER_MAX_FA, 0 };
155185 static const ImWchar box_ranges[] = { BOX_DRAWING_MIN_FA, BOX_DRAWING_MAX_FA, 0 };
156186 static const ImWchar* def_ranges = ImGui::GetIO ().Fonts ->GetGlyphRangesDefault ();
157-
187+
158188 static constexpr auto add_font = [](
159189 void * font, size_t realSize, float size, const ImWchar* range
160190 ) {
@@ -182,16 +212,16 @@ void DevTools::setup() {
182212 m_setup = true ;
183213
184214 IMGUI_CHECKVERSION ();
185-
215+
186216 auto ctx = ImGui::CreateContext ();
187-
217+
188218 auto & io = ImGui::GetIO ();
189219 io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
190220 // if this is true then it just doesnt work :( why
191221 io.ConfigDockingWithShift = false ;
192222 // io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
193223 io.ConfigWindowsResizeFromEdges = true ;
194-
224+
195225 this ->setupFonts ();
196226 this ->setupPlatform ();
197227
@@ -202,6 +232,15 @@ void DevTools::setup() {
202232#endif
203233}
204234
235+ void DevTools::destroy () {
236+ if (!m_setup) return ;
237+ m_setup = false ;
238+ m_visible = false ;
239+
240+ // crashes :(
241+ // ImGui::DestroyContext();
242+ }
243+
205244void DevTools::show (bool visible) {
206245 m_visible = visible;
207246}
0 commit comments