From c88bb49416aaeb13c3969727a305bc7ed3263963 Mon Sep 17 00:00:00 2001 From: Physick <96335032+DegustatorPonos@users.noreply.github.com> Date: Thu, 3 Sep 2026 19:11:39 +0500 Subject: more transitions --- src/scenes/collectionScene.c | 68 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 9 deletions(-) (limited to 'src/scenes/collectionScene.c') diff --git a/src/scenes/collectionScene.c b/src/scenes/collectionScene.c index f0f91f3..b8c1bc3 100644 --- a/src/scenes/collectionScene.c +++ b/src/scenes/collectionScene.c @@ -22,22 +22,51 @@ static const uint8_t ARROWS_ALPHA = 128; static const float ELEMENT_WIDTH_RATIO = 0.45f; typedef struct { + /// The collection we are displaying CollectionElement *collection; + /// The collection we selected. Used in the transitions CollectionElement *selected; Button *backButton; - size_t count; float blackout_state; PopUpState state; float scroll; } CollectionSceneData; + CollectionSceneData *getData(void *self) { return ((Scene *)self)->data; } +PopUpState getCollectionSceneState(void *self) { + if (self == NULL) return POPUP_ACTIVE; + CollectionSceneData *data = getData(self); + if (data == NULL) return POPUP_ACTIVE; + return data->state; +} + + +void reopenCollectionScene(void *self, PopUpState PreviousSceneState) { + if (self == NULL) return; + CollectionSceneData *data = getData(self); + if (data == NULL) return; + if (data->state != POPUP_HIDING) printf("xdx\n"); + switch (PreviousSceneState) { + case POPUP_HIDING: + data->state = POPUP_REVEALING; + data->blackout_state = 1.0f; + break; + default: + data->state = POPUP_ACTIVE; + break; + } +} + static void backButton_onClick(Scene *self) { - // CollectionSceneData *data = getData(self); - DeleteSceneFromStack(); + CollectionSceneData *data = getData(self); + data->state = POPUP_HIDING; + data->selected = NULL; + data->blackout_state = 0; + // DeleteSceneFromStack(); } void collectionElement_onSelect(CollectionElement *caller) { @@ -46,9 +75,18 @@ void collectionElement_onSelect(CollectionElement *caller) { switch (caller->type) { case COLLECTION_ELEMENT_PUZZLE: AddScene(CreatePuzzlePreview(ReadPuzzleFromFile(caller->path))); - break; case COLLECTION_ELEMENT_COLLECTION: - AddScene(CreatePuzzleCollectionScene(caller, false)); + if (caller->callbackData == NULL) { + TraceLog(LOG_WARNING, "The callback data is NULL. Cannot initiate the smooth transition"); + AddScene(CreatePuzzlePreview(ReadPuzzleFromFile(caller->path))); + } else { + TraceLog(LOG_WARNING, "The callback data is not NULL"); + CollectionSceneData *data = ((Scene *)caller->callbackData)->data; + data->selected = caller; + data->state = POPUP_HIDING; + data->blackout_state = 0; + } + // AddScene(CreatePuzzleCollectionScene(caller, false)); break; default: TraceLog(LOG_WARNING, "Invalid CollectionElement type for %s", caller->path); @@ -77,6 +115,7 @@ char *getCollectionName(char *path) { bool updateCollectionScene(void *self) { CollectionSceneData *data = getData(self); + if (data->state == POPUP_REVEALING) { data->blackout_state -= BLACKOUT_SPEED * GetFrameTime(); if (data->blackout_state <= 0) { @@ -87,6 +126,18 @@ bool updateCollectionScene(void *self) { return true; } + if (data->state == POPUP_HIDING) { + data->blackout_state += BLACKOUT_SPEED * GetFrameTime(); + if (data->blackout_state >= 1) { + TraceLog(LOG_INFO, "Done hiding"); + if (data->selected == NULL) + DeleteSceneFromStack(); + else + AddScene(CreatePuzzleCollectionScene(data->selected, true)); + } + return true; + } + if (data->collection != NULL) { for (size_t i = 0; i < data->collection->childCount; ++i) { UpdateCollectionElement(&data->collection->children[i]); @@ -101,7 +152,6 @@ bool drawCollectionScene(void *self) { CollectionSceneData *data = getData(self); DrawBackground(); DrawCollectionName(data->collection->name); - DrawPageView(GetScreenHeight() - 60, 5, 2); if (data->backButton != NULL) DrawButton(data->backButton, &(Rectangle) { .x = 10, @@ -180,8 +230,8 @@ Scene *CreatePuzzleCollectionScene(CollectionElement *el, bool smooothEntry) { outp->Deint = deinitCollectionScene; outp->IsTransparent = false; - outp->Reopen = NULL; - outp->GetCurrentState = NULL; + outp->Reopen = reopenCollectionScene; + outp->GetCurrentState = getCollectionSceneState; CollectionSceneData *data = malloc(sizeof(CollectionSceneData)); if (data == NULL) { @@ -189,7 +239,7 @@ Scene *CreatePuzzleCollectionScene(CollectionElement *el, bool smooothEntry) { return NULL; } - if (!el->IsInitialized) InitializeCollection(el, collectionElement_onSelect); + if (!el->IsInitialized) InitializeCollection(el, collectionElement_onSelect, outp); data->collection = el; data->selected = NULL; data->state = smooothEntry? POPUP_REVEALING : POPUP_ACTIVE; -- cgit v1.3