添加后退多级Slice函数,优化EnterSlice
authorluozheng <1732036298@qq.com>
Fri, 2 Aug 2024 10:30:33 +0000 (18:30 +0800)
committerluozheng <1732036298@qq.com>
Fri, 2 Aug 2024 10:30:33 +0000 (18:30 +0800)
code/sdk/application/wearable/fd230app/nativeui/key/src/KeyInputListener.cpp
code/sdk/application/wearable/nativeabilityfwk/include/Ability.h
code/sdk/application/wearable/nativeabilityfwk/src/Ability.cpp

index 8f29363..19835ba 100644 (file)
@@ -135,6 +135,7 @@ void KeyInputListener::CallVolumeDipSwitchControl(VolumeChangeStatus status)
                     if (mcu_pms_is_screen_on())
                     {
                         PressAlarmNotify();
+                        NativeAbility::GetInstance().ClearSliceIdStack();
                         NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN, TransitionType::TRANSITION_ZOOM);
                     }
                 }
@@ -149,7 +150,8 @@ void KeyInputListener::CallVolumeDipSwitchControl(VolumeChangeStatus status)
                         }
                         else
                         {
-                            NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_ZOOM);
+                            // NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST, TransitionType::TRANSITION_ZOOM);
+                            NativeAbility::GetInstance().EnterSlice(VIEW_APPLIST, TransitionType::TRANSITION_ZOOM);
                         }
                     }
                 }
index 6127a7d..f7c6c79 100755 (executable)
@@ -67,7 +67,12 @@ public:
         return curSlicePriority_;
     }
 
-    // 当从一个Slice进入另一个Slice时调用
+    /* -------------------------------------------------------------------------- */
+
+    /// @brief 当从一个切片(Slice)进入另一个切片时被调用。
+    /// @param sliceId sliceId
+    /// @param transitionId 切换的动画类型
+    /// @param priority 切换优先级
     void EnterSlice(uint16_t sliceId,const TransitionType transitionId = TransitionType::TRANSITION_INVALID,
         const uint16_t priority = gSliceDefaultPriority) {
         // 获取当前SliceID
@@ -79,7 +84,11 @@ public:
     }
 
     // 处理后退操作
-     bool Back(const TransitionType transitionId = TransitionType::TRANSITION_INVALID,
+
+    /// @brief 处理后退操作。
+    /// @param transitionId 切换的动画类型
+    /// @param priority 切换优先级
+    bool Back(const TransitionType transitionId = TransitionType::TRANSITION_INVALID,
         const uint16_t priority = gSliceDefaultPriority) { 
         /*
         if (backStack_.empty()) {
@@ -100,6 +109,37 @@ public:
         }
     }
 
+    /// @brief 处理后退多级切片的操作。
+    /// @param transitionId 切换的动画类型
+    /// @param priority 切换优先级
+    /// @param count 指定的后退级数
+    bool BackCountSlice(const TransitionType transitionId = TransitionType::TRANSITION_INVALID,
+        const uint16_t priority = gSliceDefaultPriority,int count) { 
+        //如果指定的后退级数 count 为 0 ,直接返回 false 。
+        if(count == 0) {
+            return false;
+        }
+        while(!backStack_.empty() && count != 0) //当 count 不为 0 且 backStack_ 栈不为空时,弹出栈顶元素 count 次。
+        {
+            backStack_.pop();
+            count--;
+        }
+        if(!backStack_.empty())
+        {
+            // 如果此时 backStack_ 栈不为空,取出栈顶的切片 ID ,并调用 ChangeSlice 切换到该切片,返回 true 。
+            uint16_t preSlice = backStack_.top();
+            ChangeSlice(preSlice,transitionId,priority);
+            return true;
+        }
+        else
+        {
+            //如果 backStack_ 栈为空,切换到默认切片,返回 false 。
+            ChangeSlice(defaultSliceId_, transitionId, priority);
+            return false; // 返回false表示无前一个slice,退回到默认slice
+        }
+    }
+
+    /*清空后退栈*/
     void ClearSliceIdStack(void)
     {
         while(!backStack_.empty())
@@ -108,6 +148,22 @@ public:
         }
     }
 
+    /*打印栈中元素*/
+    void showsStackSliceId()
+    {
+        printf("\n%d\n",backStack_.size());
+        std::stack<uint16_t> tempStack = backStack_;
+        printf("\n[");
+        while(!tempStack.empty())
+        {
+            printf("%d,",tempStack.top());
+            tempStack.pop();
+        }
+        printf("]\n");
+        printf("\n%d\n",backStack_.size());
+    }
+    /* -------------------------------------------------------------------------- */
+
 protected:
     Ability() = default;
     virtual ~Ability() = default;
index 8d5467b..c1be851 100755 (executable)
@@ -118,6 +118,7 @@ ListsNode<Ability::ProxyStruct>* Ability::Find(const uint16_t sliceId)
  */
 void Ability::ChangeSlice(const uint16_t targetSliceId, TransitionType type, const uint16_t priority)
 {
+    showsStackSliceId();
     /*
         if (GetCurSliceId() == targetSliceId) {
         return;