#include "bundle_info.h"
#include "AppViewIDs.h"
#include "ohos_types.h"
+#include "themestyle/include/ThemeStyleModel.h"
#define APP_MAX_NUM 50
uint16_t TextId;
} AppItem;
-enum AppListStyle {
- APPLIST_STYLE,
- HEXAGONS_STYLE,
- FOOTBALL_STYLE,
- WATERFALL_STYLE
-};
+#define AppListStyle ThemeStyle
class ApplistPresenter;
class ApplistModel {
--- /dev/null
+/*
+ * @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
--- /dev/null
+/*
+ * @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
--- /dev/null
+/*
+ * @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
--- /dev/null
+/***
+ * @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;
+ }
+
+}
--- /dev/null
+/*
+ * @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;
+ }
+
+}
--- /dev/null
+/*
+ * @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();
+ }
+ }
+}