diff --git a/CMakeLists.txt b/CMakeLists.txt index e03208b..49b9d4b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -106,6 +106,7 @@ set(sources_pcmockup pcmockup/debugwindowset.c pcmockup/windowcontainer.c pcmockup/imagewindow.c + pcmockup/windowgrid.c ) assign_source_group(${sources_pcmockup}) diff --git a/pcmockup/imagewindow.c b/pcmockup/imagewindow.c index 3118428..689a045 100644 --- a/pcmockup/imagewindow.c +++ b/pcmockup/imagewindow.c @@ -11,6 +11,7 @@ struct ImageWindow float aspect; SDL_Rect lastContentPos; bool isOpen, isEssential; + ImVec2 initialPosition; }; ImageWindow* imageWindow_init(const char* title, GSize initialSize, bool_t isEssential) @@ -48,6 +49,7 @@ ImageWindow* imageWindow_init(const char* title, GSize initialSize, bool_t isEss me->isEssential = isEssential; me->windowSize = initialSize; me->aspect = (float)initialSize.w / initialSize.h; + me->initialPosition.x = -1; // undefined initial position return me; } @@ -95,6 +97,8 @@ void imageWindow_update(ImageWindow* me) ? NULL // essential windows don't get a close button : &me->isOpen; + if (me->initialPosition.x >= 0 && me->initialPosition.y >= 0) + igSetNextWindowPos(me->initialPosition, ImGuiCond_Once, zero); igSetNextWindowContentSize(size); igPushStyleVarVec2(ImGuiStyleVar_WindowPadding, zero); // space between image and window border igPushStyleVarVec2(ImGuiStyleVar_ItemSpacing, zero); // space between vertical centering dummy and image @@ -122,6 +126,14 @@ void imageWindow_update(ImageWindow* me) }; } +void imageWindow_setInitialPosition(ImageWindow* me, GPoint initialPosition) +{ + me->initialPosition = (ImVec2) { + (float)initialPosition.x, + (float)initialPosition.y + }; +} + void imageWindow_toggle(ImageWindow* me, bool_t isOpen) { me->isOpen = isOpen; diff --git a/pcmockup/pcmockup.h b/pcmockup/pcmockup.h index da81694..3127982 100644 --- a/pcmockup/pcmockup.h +++ b/pcmockup/pcmockup.h @@ -20,6 +20,7 @@ void imageWindow_free(ImageWindow* me); void imageWindow_setImageData(ImageWindow* me, GSize size, const SDL_Color* data); SDL_Rect imageWindow_getContentPos(ImageWindow* me); // in screen coordinates void imageWindow_update(ImageWindow* me); +void imageWindow_setInitialPosition(ImageWindow* me, GPoint initialPosition); void imageWindow_toggle(ImageWindow* me, bool_t isOpen); bool_t imageWindow_isOpen(ImageWindow* me); @@ -46,6 +47,9 @@ void debugWindowSet_update(DebugWindowSet* set); void debugWindowSet_updateMenubar(DebugWindowSet* set); void debugWindowSet_handleUpdate(DebugWindowSet* set, const SDL_Event* ev); +GSize windowGrid_getSingleSize(int nWindows, GSize totalSize); +GPoint windowGrid_getSinglePos(int nWindows, GSize totalSize, int windowI); + typedef struct PCMockup PCMockup; PCMockup* pcmockup_init(); void pcmockup_free(PCMockup* me); diff --git a/pcmockup/windowgrid.c b/pcmockup/windowgrid.c new file mode 100644 index 0000000..e69de29