【主题样式】UI
authormaomao <2144439972@qq.com>
Thu, 24 Apr 2025 06:32:23 +0000 (14:32 +0800)
committermaomao <2144439972@qq.com>
Thu, 24 Apr 2025 06:32:23 +0000 (14:32 +0800)
code/sdk/application/wearable/fd230/nativeapp/nativeui/applist/include/ApplistModel.h
code/sdk/application/wearable/fd230/nativeapp/nativeui/themestyle/include/ThemeStyleModel.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/themestyle/include/ThemeStylePresenter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/themestyle/include/ThemeStyleView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/themestyle/src/ThemeStyleModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/themestyle/src/ThemeStylePresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/themestyle/src/ThemeStyleView.cpp [new file with mode: 0644]

index 35e69a8..7038967 100644 (file)
@@ -11,6 +11,7 @@
 #include "bundle_info.h"
 #include "AppViewIDs.h"
 #include "ohos_types.h"
+#include "themestyle/include/ThemeStyleModel.h"
 
 #define APP_MAX_NUM 50
 
@@ -25,12 +26,7 @@ typedef struct {
     uint16_t TextId;
 } AppItem;
 
-enum AppListStyle {
-    APPLIST_STYLE,
-    HEXAGONS_STYLE,
-    FOOTBALL_STYLE,
-    WATERFALL_STYLE
-};
+#define AppListStyle ThemeStyle
 
 class ApplistPresenter;
 class ApplistModel {
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/themestyle/include/ThemeStyleModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/themestyle/include/ThemeStyleModel.h
new file mode 100644 (file)
index 0000000..f194cec
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-06-14 09:40:13
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-11-21 17:21:29
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/themestyle/include/ThemeStyleModel.h
+ */
+#ifndef SET_THEMESTYLE_MODEL_H
+#define SET_THEMESTYLE_MODEL_H
+
+#include <cstdint>
+#include <map>
+#include <iostream>
+#include <unordered_map>
+#include "AppViewIDs.h"
+#include "UiConfig.h"
+
+
+namespace OHOS
+{
+    static constexpr const char *THEMESTYLE_KEY = "applist_style";
+    static constexpr const char *THEMESTYLE_VALUE_LIST = "list";
+    static constexpr const char *THEMESTYLE_VALUE_HEXAGONS = "hexagons";
+    static constexpr const char *THEMESTYLE_VALUE_FOOTBALL = "football";
+    static constexpr const char *THEMESTYLE_VALUE_ARC_SCALE_LIST = "arc_scale_list";
+    static constexpr const char *THEMESTYLE_VALUE_CIRCLE_LIST = "circle_list";
+
+    typedef enum : uint16_t
+    {
+        ARC_SCALE_LIST_STYLE,//弧形列表
+        HEXAGONS_STYLE, // 蜂窝显示
+        CIRCLE_LIST_STYLE,//拨号盘
+        APPLIST_STYLE,  // 列表显示
+        FOOTBALL_STYLE, //足球
+        WATERFALL_STYLE,
+        MAX_THEME_STYLE,
+    } ThemeStyle;
+
+    // 映射[枚举值]->[显示样式值}的关系
+    const std::map<ThemeStyle, std::string> ThemeStyleMap = {
+        {ThemeStyle::APPLIST_STYLE, THEMESTYLE_VALUE_LIST},
+        {ThemeStyle::HEXAGONS_STYLE, THEMESTYLE_VALUE_HEXAGONS},
+        {ThemeStyle::FOOTBALL_STYLE, THEMESTYLE_VALUE_FOOTBALL},
+        {ThemeStyle::ARC_SCALE_LIST_STYLE, THEMESTYLE_VALUE_ARC_SCALE_LIST},
+        {ThemeStyle::CIRCLE_LIST_STYLE, THEMESTYLE_VALUE_CIRCLE_LIST},
+        // 在此处添加更多的映射关系
+    };
+
+    // 映射[显示样式值]->[枚举值]的关系
+    const std::unordered_map<std::string, ThemeStyle> ReverseThemeStyleMap = {
+        {THEMESTYLE_VALUE_LIST, ThemeStyle::APPLIST_STYLE},
+        {THEMESTYLE_VALUE_HEXAGONS, ThemeStyle::HEXAGONS_STYLE},
+        {THEMESTYLE_VALUE_FOOTBALL, ThemeStyle::FOOTBALL_STYLE},
+        {THEMESTYLE_VALUE_ARC_SCALE_LIST, ThemeStyle::ARC_SCALE_LIST_STYLE},
+        {THEMESTYLE_VALUE_CIRCLE_LIST, ThemeStyle::CIRCLE_LIST_STYLE},
+        // 在此处添加更多的映射关系
+    };
+
+    class ThemeStyleModel
+    {
+    public:
+        static ThemeStyleModel &GetInstance(void);
+        ThemeStyle GetAppListDisplayStyle(void);
+        void SetAppListDisplayStyle(ThemeStyle style);
+        void SwitchApplistStyleOnPowerClick(void);
+        void SetPreApplistStyle(ThemeStyle style);
+        ThemeStyle GetPreApplistStyle(void);
+        void SetTheSameSliceChangeFlag(bool state);
+        bool GetTheSameSliceChangeFlag(void);
+
+    private:
+        ThemeStyleModel();
+        virtual ~ThemeStyleModel();
+        ThemeStyleModel(const ThemeStyleModel &) = delete;
+        ThemeStyleModel &operator=(const ThemeStyleModel &) = delete;
+        ThemeStyle preApplistStyle; //保存上一个applist的样式
+        bool theSameSliceChangeFlag{false};
+    };
+}
+
+#endif // SET_DESKTOP_MODEL_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/themestyle/include/ThemeStylePresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/themestyle/include/ThemeStylePresenter.h
new file mode 100644 (file)
index 0000000..61a16e9
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-06-14 09:40:13
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-07-06 16:41:49
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/themestyle/include/ThemeStylePresenter.h
+ */
+
+#ifndef SET_THEMESTYLE_PRESENTER_H
+#define SET_THEMESTYLE_PRESENTER_H
+
+#include "View.h"
+#include "Presenter.h"
+#include "components/ui_view.h"
+namespace OHOS
+{
+    class ThemeStyleView;
+    class ThemeStyleModel;
+    class ThemeStylePresenter : public Presenter<ThemeStyleView>,
+                                public UIView::OnClickListener,
+                                public RootView::OnKeyActListener,
+                                public UIView::OnDragListener
+    {
+    public:
+        ThemeStylePresenter();
+        ~ThemeStylePresenter() override;
+        static ThemeStylePresenter *GetInstance();
+        ThemeStyle GetSelectThemeStyleId(void);
+
+        void OnStart() override;
+        void OnPause() override;
+        void OnResume() override;
+        void OnStop() override;
+
+    private:
+        bool OnClick(UIView &view, const ClickEvent &event) override;
+        bool OnDrag(UIView &view, const DragEvent &event) override;
+        bool OnDragEnd(UIView &view, const DragEvent &event) override;
+        bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件
+
+        bool X_DRAG_FLAG{false};
+    };
+}
+
+#endif // SET_THEMESTYLE_PRESENTER_H
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/themestyle/include/ThemeStyleView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/themestyle/include/ThemeStyleView.h
new file mode 100644 (file)
index 0000000..a0d4bfc
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-06-14 09:40:13
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-11-21 17:22:12
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/themestyle/include/ThemeStyleView.h
+ */
+
+#ifndef SET_THEMESTYLE_VIEW_H
+#define SET_THEMESTYLE_VIEW_H
+
+#include "View.h"
+#include "components/ui_view_group.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_image_view.h"
+#include "components/ui_toggle_button.h"
+#include "components/ui_scroll_view.h"
+#include "components/ui_label_button_ext.h"
+#include "window/window.h"
+//#include "BaseView.h"
+#include "ChangeSliceListener.h"
+#include "UiConfig.h"
+#include "themestyle/include/ThemeStyleModel.h"
+
+namespace OHOS
+{
+    static constexpr const uint16_t MAX_STYLE = MAX_THEME_STYLE - 3; //直线列表和足球不显示所以删除了两个
+    static constexpr char *THEME_STYLE_LIST     = "themestyleList";       // 列表
+    static constexpr char *THEME_STYLE_HEXAGONS = "themestyleHexagons";   // 蜂窝
+    static constexpr char *THEME_STYLE_FOOTBALL = "themestyleFootball";   // 足球
+    static constexpr char *THEME_STYLE_ARC_LIST = "themestyleArcList";    // 弧形列表
+    static constexpr char *THEME_STYLE_CIRCLE_LIST = "themestyleCircleList"; // 拨号盘
+    static constexpr char *THEMESTYLEVIEWEXIT   = "ThemeStyleViewExit";   // exit
+
+    static constexpr char *THEMESTYLE_LIST_IMAGEPATH = "/user/res/themestyle/list.bin";
+    static constexpr char *THEMESTYLE_HEXAGONS_IMAGEPATH = "/user/res/themestyle/hexagons.bin";
+    static constexpr char *THEMESTYLE_FOOTBALL_IMAGEPATH = "/user/res/themestyle/grid.bin";
+    static constexpr char *THEMESTYLE_ARCLIST_IMAGEPATH = "/user/res/themestyle/arclist.bin";
+    static constexpr char *THEMESTYLE_CIRCLELIST_IMAGEPATH = "/user/res/themestyle/dialplate.bin";
+
+    class ThemeStylePresenter;
+    class ThemeStyleView : public View<ThemeStylePresenter>
+    {
+    public:
+        struct LabelButtonConfig
+        {
+            int16_t left;
+            int16_t top;
+            int16_t width;
+            int16_t height;
+            const char *viewId;
+        };
+
+        struct LabelConfig
+        {
+            int16_t left;
+            int16_t top;
+            int16_t width;
+            int16_t height;
+            int16_t fontSize;
+            int16_t lineHeigh;
+            int16_t textId;
+            uint8_t lineBreakMode;
+        };
+
+        struct ImageConfig
+        {
+            int16_t x;
+            int16_t y;
+            int16_t w;
+            int16_t h;
+            const char *src;
+        };
+
+        ThemeStyleView();
+        ~ThemeStyleView() override;
+        static ThemeStyleView *GetInstance();
+        void UpdateSelectedStyle();
+
+        void OnStart() override;
+
+    private:
+        UILabelExt *ThemeStyleLabelViewinit(LabelConfig &labelconfig);
+        bool CreateThemeStyleScrollView(void);
+        bool CreateThemeStyleLabelView(void);
+        bool CreateThemeStyleLabelButtonView(void);
+        bool CreateThemeStyleImageView(void);
+        UILabelButtonExt *ThemeStyleLabelButtonViewInit(LabelButtonConfig &labelbuttonconfig);
+        UIImageView *ThemeStyleImageViewInit(ImageConfig &imageconfig);
+        void ThemeStyleViewInit(void);
+        void ClearAll(void);
+        UIScrollView *scrollView{nullptr};
+        UILabelExt *titleText;
+        UILabelButtonExt *ThemeStyleLabelButton[MAX_STYLE]{nullptr};
+        UILabelExt *ThemeStyleLabel[MAX_STYLE]{nullptr};
+        UIImageView *ThemeStyleImage[MAX_STYLE]{nullptr};
+        UILabelButtonExt *ExitLabelButton{nullptr};
+        UILabelExt *ExitLabel{nullptr};
+        UIImageView *temp{nullptr};
+        bool initViewStatus{false};
+    };
+}
+#endif // SET_THEMESTYLE_VIEW_H
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/themestyle/src/ThemeStyleModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/themestyle/src/ThemeStyleModel.cpp
new file mode 100644 (file)
index 0000000..2443b75
--- /dev/null
@@ -0,0 +1,116 @@
+/***
+ * @Date: 2024-06-22 18:08:25
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-06-24 11:30:12
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/themestyle/src/ThemeStyleModel.cpp
+ */
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-06-07 09:21:47
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-11-05 14:49:01
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/set_desktop/src/ThemeStyleModel.cpp
+ */
+
+#include "themestyle/include/ThemeStyleModel.h"
+#include "kv_store.h"
+#include "securec.h"
+#include "wearable_log.h"
+#include <ohos_errno.h>
+#include "ConfigModel.h"
+namespace OHOS
+{
+    static const int STYLE_VALUE_LEN = 32;
+    ThemeStyleModel::ThemeStyleModel() {}
+    ThemeStyleModel::~ThemeStyleModel() {}
+
+    ThemeStyleModel &ThemeStyleModel::GetInstance()
+    {
+        static ThemeStyleModel instance;
+        return instance;
+    }
+
+    /// @brief 获取applist的显示样式
+    /// @param  void
+    /// @return 主题样式
+    ThemeStyle ThemeStyleModel::GetAppListDisplayStyle()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThemeStyleModel::GetAppListDisplayStyle");
+
+        // 检查是否存在对应的样式选项
+        auto it = ReverseThemeStyleMap.find(OHOS::ConfigModel::GetInstance()->get_configData_string(OHOS::ConfigModel::CONFIGMODEL_ITEM_APPLIST_STYLE));
+        if (it != ReverseThemeStyleMap.end())
+        {
+            return it->second;
+        }
+        else
+        {
+            // 默认返回列表显示
+            return ThemeStyle::APPLIST_STYLE;
+        }
+    }
+
+    /// @brief 设置applist的显示样式
+    /// @param style 要设置的风格样式
+    void ThemeStyleModel::SetAppListDisplayStyle(ThemeStyle style)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThemeStyleModel::SetAppListDisplayStyle,style = %d", style);
+
+        // 检查是否存在对应的样式选项
+        if (ThemeStyleMap.find(style) != ThemeStyleMap.end())
+        {
+            const char *value = ThemeStyleMap.at(style).c_str();
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "value:%s", value);
+            // 根据映射设置显示样式值
+            OHOS::ConfigModel::GetInstance()->set_condigData_String(OHOS::ConfigModel::CONFIGMODEL_ITEM_APPLIST_STYLE, value);
+        }
+        else
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetAppListDisplayStyle fail!!");
+        }
+    }
+
+    /*通过power建切换applist的样式*/
+    void ThemeStyleModel::SwitchApplistStyleOnPowerClick(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThemeStyleModel::SwitchApplistStyleOnPowerClick");
+        uint16_t style = GetAppListDisplayStyle();
+        style += 1;
+        if (style == FOOTBALL_STYLE)
+        {
+            style += 1;
+        }
+        if (style >= MAX_THEME_STYLE)
+        {
+            style = APPLIST_STYLE;
+        }
+        SetAppListDisplayStyle(static_cast<ThemeStyle>(style));
+        return;
+    }
+
+    /*设置上一个applist的显示样式*/
+    void ThemeStyleModel::SetPreApplistStyle(ThemeStyle style)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "preApplistStyle = %d", style);
+        preApplistStyle = style;
+    }
+
+    /*获取上一个applist的显示样式*/
+    ThemeStyle ThemeStyleModel::GetPreApplistStyle()
+    {
+        return preApplistStyle;
+    }
+
+    /*设置是否是相同Slice切换*/
+    void ThemeStyleModel::SetTheSameSliceChangeFlag(bool state)
+    {
+        theSameSliceChangeFlag = state;
+    }
+
+    /*获取是否是相同Slice切换*/
+    bool ThemeStyleModel::GetTheSameSliceChangeFlag(void)
+    {
+        return theSameSliceChangeFlag;
+    }
+
+}
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/themestyle/src/ThemeStylePresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/themestyle/src/ThemeStylePresenter.cpp
new file mode 100644 (file)
index 0000000..43d6071
--- /dev/null
@@ -0,0 +1,162 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-04-08 16:43:48
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-11-14 15:02:48
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/set_desktop/src/ThemeStylePresenter.cpp
+ */
+
+#include "themestyle/include/ThemeStyleView.h"
+#include "themestyle/include/ThemeStyleModel.h"
+#include "themestyle/include/ThemeStylePresenter.h"
+#include "common/key_code.h"
+#include <custom_utils.h>
+#include "NativeRegisterManager.h"
+#include "uicomponents/UIComponents.h"
+
+namespace OHOS
+{
+
+    REGIST_SLICE(VIEW_THEME_STYLE, ThemeStyleView, ThemeStylePresenter);
+
+    static ThemeStylePresenter *g_pThemeStylePresenter = nullptr;
+
+    ThemeStylePresenter::ThemeStylePresenter()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThemeStylePresenter::ThemeStylePresenter");
+        g_pThemeStylePresenter = this;
+    }
+
+    ThemeStylePresenter::~ThemeStylePresenter()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThemeStylePresenter::~ThemeStylePresenter");
+        g_pThemeStylePresenter = nullptr;
+    }
+
+    ThemeStylePresenter *ThemeStylePresenter::GetInstance()
+    {
+        return g_pThemeStylePresenter;
+    }
+
+    void ThemeStylePresenter::OnStart()
+    {
+        Presenter<ThemeStyleView>::OnStart();
+    }
+
+    void ThemeStylePresenter::OnPause()
+    {
+        Presenter<ThemeStyleView>::OnPause();
+    }
+
+    void ThemeStylePresenter::OnResume(void)
+    {
+        Presenter<ThemeStyleView>::OnResume();
+    }
+
+    void ThemeStylePresenter::OnStop(void)
+    {
+        Presenter<ThemeStyleView>::OnStop();
+    }
+
+    bool ThemeStylePresenter::OnClick(UIView &view, const ClickEvent &event)
+    {
+        UNUSED(event);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThemeStylePresenter::OnClick");
+
+        UILabelButtonExt *labelButtonExt = dynamic_cast<UILabelButtonExt *>(&view);
+        if (!labelButtonExt)
+        {
+            // 处理无法将 view 转换为 UILabelButtonExt 的情况
+            return false;
+        }
+
+        std::string viewId = labelButtonExt->GetViewId();
+        if (viewId == THEMESTYLEVIEWEXIT)
+        {
+            NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+            return true;
+        }
+
+        if (viewId == THEME_STYLE_LIST)
+        {
+            ThemeStyleModel::GetInstance().SetAppListDisplayStyle(ThemeStyle::APPLIST_STYLE);
+        }
+        else if (viewId == THEME_STYLE_HEXAGONS)
+        {
+            ThemeStyleModel::GetInstance().SetAppListDisplayStyle(ThemeStyle::HEXAGONS_STYLE);
+        }
+        else if (viewId == THEME_STYLE_FOOTBALL)
+        {
+            ThemeStyleModel::GetInstance().SetAppListDisplayStyle(ThemeStyle::FOOTBALL_STYLE);
+        }
+        else if (viewId == THEME_STYLE_ARC_LIST)
+        {
+            ThemeStyleModel::GetInstance().SetAppListDisplayStyle(ThemeStyle::ARC_SCALE_LIST_STYLE);
+        }
+        else if (viewId == THEME_STYLE_CIRCLE_LIST)
+        {
+            ThemeStyleModel::GetInstance().SetAppListDisplayStyle(ThemeStyle::CIRCLE_LIST_STYLE);
+        }
+        
+        /* -------------------------------------------------------------------------- */
+        view_->UpdateSelectedStyle();
+        /* -------------------------------------------------------------------------- */
+
+        uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId();
+        if (preSlice == VIEW_APPLIST)
+        {
+            NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+        }
+        else
+        {
+            NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+            NativeAbility::GetInstance().ClearSliceIdStack();
+        }
+
+        return true;
+    }
+
+    bool ThemeStylePresenter::OnDrag(UIView &view, const DragEvent &event)
+    {
+        UNUSED(view);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingPresenter::OnDrag");
+        if ((event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) // 拖动过程中判断是否是水平滑动
+        {
+            ThemeStylePresenter::X_DRAG_FLAG = true;
+        }
+        return true;
+    }
+
+    bool ThemeStylePresenter::OnDragEnd(UIView &view, const DragEvent &event)
+    {
+        UNUSED(view);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingPresenter::OnDragEnd");
+        if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT && ThemeStylePresenter::X_DRAG_FLAG)
+        {
+            NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+            ThemeStylePresenter::X_DRAG_FLAG = false;
+        }
+        return true;
+    }
+
+    bool ThemeStylePresenter::OnKeyAct(UIView &view, const KeyEvent &event)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThemeStylePresenter::OnKeyAct");
+        uint16 keyID = event.GetKeyId();
+        uint16 keyState = event.GetState();
+        // 如果是power键就返回上一级
+        if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 1 && uapi_get_screen_state() == 0)
+        {
+            NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+        }
+        return true;
+    }
+
+    // 获取选中的样式Id
+    ThemeStyle ThemeStylePresenter::GetSelectThemeStyleId(void)
+    {
+        ThemeStyle style = ThemeStyleModel::GetInstance().GetAppListDisplayStyle();
+        return style;
+    }
+
+}
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/themestyle/src/ThemeStyleView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/themestyle/src/ThemeStyleView.cpp
new file mode 100644 (file)
index 0000000..d3c285e
--- /dev/null
@@ -0,0 +1,359 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-06-14 09:40:20
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-11-21 17:12:45
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/themestyle/src/ThemeStyleView.cpp
+ */
+
+#include <string>
+#include "themestyle/include/ThemeStyleView.h"
+#include "themestyle/include/ThemeStylePresenter.h"
+#include "ui_resource_string.h"
+#include "dock/focus_manager.h"
+#include "ConfigModel.h"
+namespace OHOS
+{
+    static ThemeStyleView *g_pThemeStyleView{nullptr};
+    static constexpr uint16 SCROLLBLANKSIZE = 75;
+    static constexpr uint16 REBOUNDSIZE = 35;
+    ThemeStyleView::ThemeStyleView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThemeStyleView::ThemeStyleView");
+        g_pThemeStyleView = this;
+    }
+
+    ThemeStyleView::~ThemeStyleView()
+    {
+        ClearAll();
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThemeStyleView::~ThemeStyleView");
+        g_pThemeStyleView = nullptr;
+    }
+
+    ThemeStyleView *ThemeStyleView::GetInstance()
+    {
+        return g_pThemeStyleView;
+    }
+
+    void ThemeStyleView::ClearAll(void)
+    {
+        
+
+        if (initViewStatus)
+        {
+            if (scrollView != nullptr)
+            {
+                scrollView->RemoveAll();
+                if (titleText)
+                {
+                    delete titleText;
+                    titleText = nullptr;
+                }
+                for (int i = 0; i < MAX_STYLE; i++)
+                {
+                    delete ThemeStyleLabelButton[i];
+                    ThemeStyleLabelButton[i] = nullptr;
+
+                    delete ThemeStyleLabel[i];
+                    ThemeStyleLabel[i] = nullptr;
+
+                    delete ThemeStyleImage[i];
+                    ThemeStyleImage[i] = nullptr;
+                }
+                if (ExitLabelButton)
+                {
+                    delete ExitLabelButton;
+                    ExitLabelButton = nullptr;
+                }
+                if (ExitLabel)
+                {
+                    delete ExitLabel;
+                    ExitLabel = nullptr;
+                }
+                if(temp)
+                {
+                    delete temp;
+                    temp = nullptr;
+                }
+                delete scrollView;
+                scrollView = nullptr;
+            }
+        }
+    }
+
+    UILabelButtonExt *ThemeStyleView::ThemeStyleLabelButtonViewInit(LabelButtonConfig &labelbuttonconfig)
+    {
+        UILabelButtonExt *labelButton = new UILabelButtonExt();
+        if (labelButton == nullptr)
+        {
+            return nullptr;
+        }
+        labelButton->SetPosition(labelbuttonconfig.left, labelbuttonconfig.top);
+        labelButton->Resize(labelbuttonconfig.width, labelbuttonconfig.height);
+        labelButton->SetViewId(labelbuttonconfig.viewId);
+        labelButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
+        labelButton->SetImagePosition(300, 30);
+        labelButton->SetImageSrc(PNG_CHECKBOX_OFF_IMAGE, PNG_CHECKBOX_OFF_IMAGE);
+        // labelButton->SetTextId(labelbuttonconfig.textId);
+        // labelButton->SetAlign(TEXT_ALIGNMENT_LEFT);
+        // labelButton->SetLabelPosition(100, 0);
+        // labelButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelbuttonconfig.fontSize);
+        // labelButton->SetStyle(STYLE_LINE_HEIGHT, labelbuttonconfig.lineHeigh);
+        labelButton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff000000, UIButton::PRESSED);
+        labelButton->SetOnClickListener(presenter_);
+
+        return labelButton;
+    }
+
+    UIImageView *ThemeStyleView::ThemeStyleImageViewInit(ImageConfig &imageconfig)
+    {
+        UIImageView *Image = new UIImageView();
+        if (Image == nullptr)
+        {
+            return nullptr;
+        }
+        Image->SetPosition(imageconfig.x, imageconfig.y, imageconfig.w, imageconfig.h);
+        Image->SetSrc(imageconfig.src);
+        return Image;
+    }
+
+    UILabelExt *ThemeStyleView::ThemeStyleLabelViewinit(LabelConfig &labelconfig)
+    {
+        UILabelExt *label = new UILabelExt();
+        if (label == nullptr)
+        {
+            return nullptr;
+        }
+        label->SetPosition(labelconfig.left, labelconfig.top, labelconfig.width, labelconfig.height);
+        label->SetStyle(STYLE_TEXT_FONT, labelconfig.fontSize);
+        label->SetStyle(STYLE_LINE_HEIGHT, labelconfig.lineHeigh);
+        label->SetTextId(labelconfig.textId);//TODO::多国语言
+        label->SetLineBreakMode(labelconfig.lineBreakMode);
+        label->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);
+        label->SetRollSpeed(23);
+        label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelconfig.fontSize);
+        return label;
+    }
+
+    bool ThemeStyleView::CreateThemeStyleScrollView(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThemeStyleView::InitThemeStyleScrollView");
+        scrollView = new UIScrollView();
+        if (scrollView == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scrollView new fail!");
+            return false;
+        }
+        scrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+        scrollView->SetScrollBlankSize(30);
+        scrollView->SetReboundSize(30);
+        scrollView->SetDirection(1);
+        scrollView->SetThrowDrag(true);         // 设置手指抬起屏幕后是否继续滚动。
+        scrollView->SetMaxScrollDistance(1000); // 设置手指抬起屏幕后的最大滚动距离。
+        scrollView->SetSwipeACCLevel(200);      /*设置手指抬起屏幕后的补偿距离。*/
+        FocusManager::GetInstance()->RequestFocus(scrollView);
+        FocusManager::GetInstance()->RequestFocusByDirection(FOCUS_DIRECTION_UP);
+        scrollView->SetRotateFactor(1.0);
+        scrollView->SetOnDragListener(presenter_);
+        scrollView->SetTouchable(true);
+        scrollView->SetDraggable(true);
+        AddViewToRootContainer(scrollView);
+
+        return true;
+    }
+
+    bool ThemeStyleView::CreateThemeStyleLabelView(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThemeStyleView::InitThemeStyleLabelView");
+        titleText = new UILabelExt();
+        if (titleText == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "titleText new fail!");
+            return false;
+        }
+        titleText->SetPosition(83, 50, 300, 35);
+        titleText->SetTextId(STR_DISPLAY_MODE); // 显示方式
+        titleText->SetStyle(STYLE_TEXT_FONT, 30);
+        titleText->SetStyle(STYLE_LINE_HEIGHT, 35);
+        titleText->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+        titleText->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+        titleText->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        scrollView->Add(titleText);
+        /* -------------------------------------------------------------------------- */
+        // int16_t textId[] = {STR_LIST_DISPLAY, STR_CELLULAR_DISPLAY, STR_ARC_SCALE_LIST_DISPLAY,STR_DIAL_PLATE};
+        int16_t textId[] = {STR_ARC_SCALE_LIST_DISPLAY, STR_CELLULAR_DISPLAY,STR_DIAL_PLATE};
+        LabelConfig labelConfig = {
+            .left = 143,
+            .top = 153,
+            .width = 180,
+            .height = 35,
+            .fontSize = 30,
+            .lineHeigh = 35,
+            .textId = 0,
+            .lineBreakMode = UILabel::LINE_BREAK_OSCILLATION,
+        };
+        for (int16_t i = 0; i < sizeof(textId) / sizeof(textId[0]); i++)
+        {
+            labelConfig.top = 153 + 120 * i;
+            labelConfig.textId = textId[i];
+            ThemeStyleLabel[i] = ThemeStyleLabelViewinit(labelConfig);
+            if (ThemeStyleLabel[i] == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThemeStyleLabel[%d] is nullptr", i);
+                return false;
+            }
+            scrollView->Add(ThemeStyleLabel[i]);
+        }
+        /* -------------------------------------------------------------------------- */
+        ExitLabel = new UILabelExt();
+        if (ExitLabel == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ExitLabel new fail!");
+            return false;
+        }
+        ExitLabel->SetPosition(113, labelConfig.top + 120, 240, 35);
+        ExitLabel->SetTextId(STR_CLOSE); /*关闭*/
+        ExitLabel->SetStyle(STYLE_TEXT_FONT, 30);
+        ExitLabel->SetStyle(STYLE_LINE_HEIGHT, 35);
+        ExitLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+        ExitLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+        ExitLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        scrollView->Add(ExitLabel);
+
+        return true;
+    }
+
+    bool ThemeStyleView::CreateThemeStyleLabelButtonView(void)
+    {
+        LabelButtonConfig labelbuttonconfig = {
+            .left = 43,
+            .top = 120,
+            .width = 380,
+            .height = 100,
+            .viewId = THEME_STYLE_LIST,
+        };
+
+        // const char *viewId[] = {THEME_STYLE_LIST, THEME_STYLE_HEXAGONS, THEME_STYLE_ARC_LIST,THEME_STYLE_CIRCLE_LIST};
+        const char *viewId[] = {THEME_STYLE_ARC_LIST, THEME_STYLE_HEXAGONS,THEME_STYLE_CIRCLE_LIST};
+        for (int i = 0; i < sizeof(viewId) / sizeof(viewId[0]); i++)
+        {
+            labelbuttonconfig.top = 120 + 120 * i;
+            labelbuttonconfig.viewId = viewId[i];
+            ThemeStyleLabelButton[i] = ThemeStyleLabelButtonViewInit(labelbuttonconfig);
+            if (ThemeStyleLabelButton[i] == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThemeStyleLabelButton[%d] is nullptr", i);
+                return false;
+            }
+            scrollView->Add(ThemeStyleLabelButton[i]);
+        }
+        /* -------------------------------------------------------------------------- */
+        ExitLabelButton = new UILabelButtonExt();
+        if (ExitLabelButton == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ExitLabelButton is nullptr");
+            return false;
+        }
+        ExitLabelButton->SetPosition(labelbuttonconfig.left, labelbuttonconfig.top + 120);
+        ExitLabelButton->Resize(labelbuttonconfig.width, labelbuttonconfig.height);
+        ExitLabelButton->SetViewId(THEMESTYLEVIEWEXIT);
+        ExitLabelButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
+        ExitLabelButton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff000000, UIButton::PRESSED);
+        ExitLabelButton->SetOnClickListener(presenter_);
+        scrollView->Add(ExitLabelButton);
+
+        return true;
+    }
+
+    bool ThemeStyleView::CreateThemeStyleImageView(void)
+    {
+        ImageConfig imageconfig = {
+            .x = 83,
+            .y = 150,
+            .w = 40,
+            .h = 40,
+            .src = THEMESTYLE_LIST_IMAGEPATH,
+        };
+        int y = 150;
+        // const char *src[MAX_STYLE] = {THEMESTYLE_LIST_IMAGEPATH, THEMESTYLE_HEXAGONS_IMAGEPATH, THEMESTYLE_ARCLIST_IMAGEPATH,THEMESTYLE_CIRCLELIST_IMAGEPATH};
+        const char *src[] = {THEMESTYLE_ARCLIST_IMAGEPATH, THEMESTYLE_HEXAGONS_IMAGEPATH,THEMESTYLE_CIRCLELIST_IMAGEPATH};
+        for (int i = 0; i < sizeof(src) / sizeof(src[0]); i++)
+        {
+            imageconfig.y = y + 120 * i;
+            imageconfig.src = src[i];
+            ThemeStyleImage[i] = ThemeStyleImageViewInit(imageconfig);
+            if (ThemeStyleImage[i] == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThemeStyleImage[%d] is nullptr", i);
+                return false;
+            }
+            scrollView->Add(ThemeStyleImage[i]);
+        }
+
+        return true;
+    }
+
+    void ThemeStyleView::ThemeStyleViewInit(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThemeStyleView::ThemeStyleViewInit");
+        if (!CreateThemeStyleScrollView() || !CreateThemeStyleLabelButtonView() ||
+            !CreateThemeStyleLabelView() || !CreateThemeStyleImageView())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThemeStyleView::ThemeStyleViewInit fail!!");
+            return;
+        }
+        UpdateSelectedStyle();
+
+        /* ------------------- 该组件的使用是为了解决不能单独设置滚动视图底部空白大小问题,用一个不可见组件占位置 ------------------ */
+        /* ---------------------------- 因为使用SetScrollBlankSize设置过大后,下拉后无法恢复到原位置,有明显的向下偏移 --------------------------- */
+        if (temp == nullptr)
+        {
+            temp = new UIImageView();
+            if (temp == nullptr)
+            {
+                return;
+            }
+            if (ExitLabelButton)
+            {
+                temp->SetPosition(43, ExitLabelButton->GetY() + ExitLabelButton->GetHeight(), 380, 40);
+            }
+            temp->SetVisible(false);
+            scrollView->Add(temp);
+        }
+        initViewStatus = true;
+    }
+
+    void ThemeStyleView::OnStart()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThemeStyleView::OnStart");
+        View<ThemeStylePresenter>::OnStart();
+        AddViewToRootContainer(new UIViewGroup());
+        GetRootContainer()->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+        GetRootContainer()->SetTouchable(true);
+        GetRootContainer()->SetDraggable(true);
+
+        if (!initViewStatus)
+        {
+            ThemeStyleViewInit();
+        }
+        RootView::GetInstance()->SetOnKeyActListener(presenter_);
+    }
+
+
+    // 更新按钮的选中状态
+    void ThemeStyleView::UpdateSelectedStyle(void)
+    {
+        for (int i = 0; i < MAX_STYLE; i++)
+        {
+            if (i == presenter_->GetSelectThemeStyleId())
+            {
+                ThemeStyleLabelButton[i]->SetImageSrc(PNG_CHECKBOX_ON_IMAGE, PNG_CHECKBOX_ON_IMAGE);
+            }
+            else
+            {
+                ThemeStyleLabelButton[i]->SetImageSrc(PNG_CHECKBOX_OFF_IMAGE, PNG_CHECKBOX_OFF_IMAGE);
+            }
+            ThemeStyleLabelButton[i]->Invalidate();
+        }
+    }
+}