From b649302fe812662ca765815532b7d3adcb44b7d1 Mon Sep 17 00:00:00 2001 From: nakst <> Date: Thu, 10 Mar 2022 18:58:02 +0000 Subject: [PATCH] gui: add ES_ELEMENT_TRANSITION_CONTENT_ONLY; file manager: transition when changing folder view type --- apps/file_manager/commands.cpp | 9 ++++++--- apps/file_manager/main.cpp | 2 +- apps/file_manager/ui.cpp | 8 ++++++-- desktop/gui.cpp | 33 +++++++++++++++++++++++---------- desktop/os.header | 1 + res/Theme.dat | Bin 31932 -> 31956 bytes 6 files changed, 37 insertions(+), 16 deletions(-) diff --git a/apps/file_manager/commands.cpp b/apps/file_manager/commands.cpp index 74ed64d..975f8ad 100644 --- a/apps/file_manager/commands.cpp +++ b/apps/file_manager/commands.cpp @@ -499,20 +499,23 @@ void InstanceRegisterCommands(Instance *instance) { EsCommandRegister(&instance->commandRename, instance, INTERFACE_STRING(FileManagerRenameAction), CommandRename, stableCommandID++, "F2"); EsCommandRegister(&instance->commandViewDetails, instance, INTERFACE_STRING(CommonListViewTypeDetails), [] (Instance *instance, EsElement *, EsCommand *) { + uint8_t old = instance->viewSettings.viewType; instance->viewSettings.viewType = VIEW_DETAILS; - InstanceRefreshViewType(instance); + InstanceRefreshViewType(instance, old != instance->viewSettings.viewType); InstanceViewSettingsUpdated(instance); }, stableCommandID++); EsCommandRegister(&instance->commandViewTiles, instance, INTERFACE_STRING(CommonListViewTypeTiles), [] (Instance *instance, EsElement *, EsCommand *) { + uint8_t old = instance->viewSettings.viewType; instance->viewSettings.viewType = VIEW_TILES; - InstanceRefreshViewType(instance); + InstanceRefreshViewType(instance, old != instance->viewSettings.viewType); InstanceViewSettingsUpdated(instance); }, stableCommandID++); EsCommandRegister(&instance->commandViewThumbnails, instance, INTERFACE_STRING(CommonListViewTypeThumbnails), [] (Instance *instance, EsElement *, EsCommand *) { + uint8_t old = instance->viewSettings.viewType; instance->viewSettings.viewType = VIEW_THUMBNAILS; - InstanceRefreshViewType(instance); + InstanceRefreshViewType(instance, old != instance->viewSettings.viewType); InstanceViewSettingsUpdated(instance); }, stableCommandID++); diff --git a/apps/file_manager/main.cpp b/apps/file_manager/main.cpp index 8fc2655..9b506ba 100644 --- a/apps/file_manager/main.cpp +++ b/apps/file_manager/main.cpp @@ -227,7 +227,7 @@ void InstanceReportError(struct Instance *instance, int error, EsError code); bool InstanceLoadFolder(Instance *instance, String path /* takes ownership */, int historyMode = 0); void InstanceUpdateStatusString(Instance *instance); void InstanceViewSettingsUpdated(Instance *instance); -void InstanceRefreshViewType(Instance *instance); +void InstanceRefreshViewType(Instance *instance, bool startTransition); void InstanceFolderPathChanged(Instance *instance, bool fromLoadFolder); void InstanceAddContents(struct Instance *instance, HashTable *newEntries); void InstanceAddSingle(struct Instance *instance, ListEntry newEntry); diff --git a/apps/file_manager/ui.cpp b/apps/file_manager/ui.cpp index 4079178..516b277 100644 --- a/apps/file_manager/ui.cpp +++ b/apps/file_manager/ui.cpp @@ -153,7 +153,7 @@ bool InstanceLoadFolder(Instance *instance, String path /* takes ownership */, i } } - InstanceRefreshViewType(instance); + InstanceRefreshViewType(instance, false); // Update the user interface. @@ -168,7 +168,11 @@ bool InstanceLoadFolder(Instance *instance, String path /* takes ownership */, i return true; } -void InstanceRefreshViewType(Instance *instance) { +void InstanceRefreshViewType(Instance *instance, bool startTransition) { + if (startTransition) { + EsElementStartTransition(instance->list, ES_TRANSITION_FADE, ES_ELEMENT_TRANSITION_CONTENT_ONLY, 1.0f); + } + EsCommandSetCheck(&instance->commandViewDetails, instance->viewSettings.viewType == VIEW_DETAILS ? ES_CHECK_CHECKED : ES_CHECK_UNCHECKED, false); EsCommandSetCheck(&instance->commandViewTiles, instance->viewSettings.viewType == VIEW_TILES ? ES_CHECK_CHECKED : ES_CHECK_UNCHECKED, false); EsCommandSetCheck(&instance->commandViewThumbnails, instance->viewSettings.viewType == VIEW_THUMBNAILS ? ES_CHECK_CHECKED : ES_CHECK_UNCHECKED, false); diff --git a/desktop/gui.cpp b/desktop/gui.cpp index 7c3c903..2eaf8b9 100644 --- a/desktop/gui.cpp +++ b/desktop/gui.cpp @@ -251,6 +251,7 @@ struct EsElement : EsElementPublic { #define PAINT_NO_OFFSET (1 << 1) // Don't add the element's offset to the painter. #define PAINT_NO_TRANSITION (1 << 2) // Ignore entrance/exit transitions. #define PAINT_OVERLAY (1 << 3) // Paint the overlay layers. +#define PAINT_NO_BACKGROUND (1 << 4) // Don't paint the background. void InternalPaint(EsPainter *painter, int flags); void InternalMove(int _width, int _height, int _offsetX, int _offsetY); // Non-client offset. @@ -1374,7 +1375,8 @@ void EsElementStartTransition(EsElement *element, EsTransitionType transitionTyp painter.offsetX = paintOutsets.l; painter.offsetY = paintOutsets.t; painter.target = element->previousTransitionFrame; - element->InternalPaint(&painter, PAINT_NO_TRANSITION | PAINT_NO_OFFSET); + element->InternalPaint(&painter, PAINT_NO_TRANSITION | PAINT_NO_OFFSET + | ((flags & ES_ELEMENT_TRANSITION_CONTENT_ONLY) ? PAINT_NO_BACKGROUND : 0)); } } @@ -1522,6 +1524,16 @@ void EsElement::InternalPaint(EsPainter *painter, int paintFlags) { bounds.l -= paintOutsets.l, bounds.r += paintOutsets.r; bounds.t -= paintOutsets.t, bounds.b += paintOutsets.b; + if (transitionFlags & ES_ELEMENT_TRANSITION_CONTENT_ONLY) { + EsMessage m; + m.type = ES_MSG_PAINT_BACKGROUND; + m.painter = painter; + + if (!EsMessageSend(this, &m)) { + interpolatedStyle->PaintLayers(painter, ES_RECT_2S(painter->width, painter->height), childType, THEME_LAYER_MODE_BACKGROUND); + } + } + if (previousTransitionFrame) { UIDrawTransitionEffect(painter, previousTransitionFrame, bounds, (EsTransitionType) transitionType, progress, false); } @@ -1533,7 +1545,8 @@ void EsElement::InternalPaint(EsPainter *painter, int paintFlags) { p.offsetX = paintOutsets.l; p.offsetY = paintOutsets.t; p.target = ⌖ - InternalPaint(&p, PAINT_NO_TRANSITION | PAINT_NO_OFFSET); + InternalPaint(&p, PAINT_NO_TRANSITION | PAINT_NO_OFFSET + | ((transitionFlags & ES_ELEMENT_TRANSITION_CONTENT_ONLY) ? PAINT_NO_BACKGROUND : 0)); UIDrawTransitionEffect(painter, &target, bounds, (EsTransitionType) transitionType, progress, true); EsPaintTargetReturn(&target); } else { @@ -1542,16 +1555,16 @@ void EsElement::InternalPaint(EsPainter *painter, int paintFlags) { } } else { paintBackground:; - - // Paint the background. - EsMessage m; - m.type = ES_MSG_PAINT_BACKGROUND; - m.painter = painter; - if (!EsMessageSend(this, &m)) { - // TODO Optimisation: don't paint if overlapped by an opaque child. - interpolatedStyle->PaintLayers(painter, ES_RECT_2S(painter->width, painter->height), childType, THEME_LAYER_MODE_BACKGROUND); + if (~paintFlags & PAINT_NO_BACKGROUND) { + m.type = ES_MSG_PAINT_BACKGROUND; + m.painter = painter; + + if (!EsMessageSend(this, &m)) { + // TODO Optimisation: don't paint if overlapped by an opaque child. + interpolatedStyle->PaintLayers(painter, ES_RECT_2S(painter->width, painter->height), childType, THEME_LAYER_MODE_BACKGROUND); + } } // Apply the clipping insets. diff --git a/desktop/os.header b/desktop/os.header index 67f5a7d..d4d54c0 100644 --- a/desktop/os.header +++ b/desktop/os.header @@ -785,6 +785,7 @@ inttype EsElementTransitionFlags uint32_t none { ES_ELEMENT_TRANSITION_ENTRANCE = bit 0 ES_ELEMENT_TRANSITION_EXIT = bit 1 ES_ELEMENT_TRANSITION_HIDE_AFTER_COMPLETE = bit 2 + ES_ELEMENT_TRANSITION_CONTENT_ONLY = bit 3 // Don't apply the transition to the background. }; inttype EsSyntaxHighlightingLanguage uint32_t none { diff --git a/res/Theme.dat b/res/Theme.dat index 8f50ef7973c3e25f331c421d74f4982648a6bb77..0c3a9d8e2c02572ebf7ca559c44a896f9e106514 100644 GIT binary patch delta 4699 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