1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "core/components/theme/icon_theme.h"
17 
18 namespace OHOS::Ace {
19 namespace {
20 static std::unordered_map<InternalResource::ResourceId, std::string> RESOURCE_ICON_MAP = {
21     { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_CLOSE, "container_modal_window_close" },
22     { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_CLOSE, "container_modal_window_defocus_close" },
23     { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_MAXIMIZE,
24         "container_modal_window_defocus_maximize" },
25     { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_MINIMIZE,
26         "container_modal_window_defocus_minimize" },
27     { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_RECOVER, "container_modal_window_defocus_recover" },
28     { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_DEFOCUS_SPLIT_LEFT,
29         "container_modal_window_defocus_split_left" },
30     { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_MAXIMIZE, "container_modal_window_maximize" },
31     { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_MINIMIZE, "container_modal_window_minimize" },
32     { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_RECOVER, "container_modal_window_recover" },
33     { InternalResource::ResourceId::CONTAINER_MODAL_WINDOW_SPLIT_LEFT, "container_modal_window_split_left" },
34     { InternalResource::ResourceId::CLOSE_SVG, "close" },
35     { InternalResource::ResourceId::CORRECT_SVG, "correct" },
36     { InternalResource::ResourceId::DOWN_ARROW_SVG, "down_arrow" },
37     { InternalResource::ResourceId::FA_BLACK_CLOCK_WIDGET_HOUR, "fa_black_clock_widget_hour" },
38     { InternalResource::ResourceId::FA_BLACK_CLOCK_WIDGET_MINUTE, "fa_black_clock_widget_minute" },
39     { InternalResource::ResourceId::FA_BLACK_CLOCK_WIDGET_SECOND, "fa_black_clock_widget_second" },
40     { InternalResource::ResourceId::FA_CLOCK_WIDGET_HOUR, "fa_clock_widget_hour" },
41     { InternalResource::ResourceId::FA_CLOCK_WIDGET_MINUTE, "fa_clock_widget_minute" },
42     { InternalResource::ResourceId::FA_CLOCK_WIDGET_SECOND, "fa_clock_widget_second" },
43     { InternalResource::ResourceId::FULLSCREEN_SVG, "full_screen" },
44     { InternalResource::ResourceId::HIDE_PASSWORD_SVG, "hide_password" },
45     { InternalResource::ResourceId::TITLEBAR_BACK, "titlebar_back" },
46     { InternalResource::ResourceId::IC_BACK, "ic_back" },
47     { InternalResource::ResourceId::IC_MORE, "ic_more" },
48     { InternalResource::ResourceId::INDEXER_ARROW_PNG, "indexer_arrow" },
49     { InternalResource::ResourceId::LEFT_ARROW_SVG, "left_arrow" },
50     { InternalResource::ResourceId::PAUSE_SVG, "pause" },
51     { InternalResource::ResourceId::PIECE_DELETE_SVG, "piece_delete" },
52     { InternalResource::ResourceId::PLAY_SVG, "play" },
53     { InternalResource::ResourceId::QUIT_FULLSCREEN_SVG, "exit_full_screen" },
54     { InternalResource::ResourceId::RATE_STAR_BIG_OFF_SVG, "rate_star_big_off" },
55     { InternalResource::ResourceId::RATE_STAR_BIG_ON_SVG, "rate_star_big_on" },
56     { InternalResource::ResourceId::RATE_STAR_SMALL_OFF_SVG, "rate_star_small_off" },
57     { InternalResource::ResourceId::RATE_STAR_SMALL_ON_SVG, "rate_star_small_on" },
58     { InternalResource::ResourceId::RIGHT_ARROW_SVG, "right_arrow" },
59     { InternalResource::ResourceId::SEARCH_SVG, "search" },
60     { InternalResource::ResourceId::SELECT_ARROW_DISABLED_PNG, "select_arrow_disabled" },
61     { InternalResource::ResourceId::SELECT_ARROW_NORMAL_PNG, "select_arrow_normal" },
62     { InternalResource::ResourceId::SEMI_MODAL_BAR_DOWN_SVG, "semi_modal_bar_down" },
63     { InternalResource::ResourceId::SEMI_MODAL_BAR_MIDDLE_SVG, "semi_modal_bar_middle" },
64     { InternalResource::ResourceId::SHARE_SVG, "share" },
65     { InternalResource::ResourceId::SHOW_PASSWORD_SVG, "show_password" },
66     { InternalResource::ResourceId::SIDE_BAR, "ic_public_drawer" },
67     { InternalResource::ResourceId::SPINNER, "ic_public_spinner" },
68     { InternalResource::ResourceId::SPINNER_DISABLE, "ic_public_spinner_disable" },
69     { InternalResource::ResourceId::STEPPER_BACK_ARROW, "stepper_back_arrow" },
70     { InternalResource::ResourceId::STEPPER_NEXT_ARROW, "stepper_next_arrow" },
71     { InternalResource::ResourceId::TRANSLATE_C2E_SVG, "translate_c2e" },
72     { InternalResource::ResourceId::UP_ARROW_SVG, "up_arrow" },
73     { InternalResource::ResourceId::WATCH_DOWN_ARROW_SVG, "watch_down_arrow" },
74     { InternalResource::ResourceId::WATCH_UP_ARROW_SVG, "watch_up_arrow" },
75     { InternalResource::ResourceId::WRONG_SVG, "wrong" },
76     { InternalResource::ResourceId::INPUT_SEARCH_SVG, "ic_public_input_search" },
77     { InternalResource::ResourceId::APP_BAR_BACK_SVG, "app_bar_back" },
78     { InternalResource::ResourceId::APP_BAR_FA_SVG, "app_bar_fa" },
79     { InternalResource::ResourceId::APP_BAR_MENU_SVG, "app_bar_menu" },
80     { InternalResource::ResourceId::APP_BAR_CLOSE_SVG, "app_bar_close" },
81     { InternalResource::ResourceId::MENU_OK_SVG, "ic_public_ok" },
82     { InternalResource::ResourceId::LOCATION_BUTTON_FILLED_SVG, "location_button_filled"},
83     { InternalResource::ResourceId::LOCATION_BUTTON_LINE_SVG, "location_button_line"},
84     { InternalResource::ResourceId::PASTE_BUTTON_LINE_SVG, "paste_button_line"},
85     { InternalResource::ResourceId::SAVE_BUTTON_FILLED_SVG, "save_button_filled"},
86     { InternalResource::ResourceId::SAVE_BUTTON_LINE_SVG, "save_button_line"},
87     { InternalResource::ResourceId::SAVE_BUTTON_PICTURE_SVG, "save_button_picture"},
88     { InternalResource::ResourceId::IC_PUBLIC_ARROW_LEFT_SVG, "ic_public_arrow_left" },
89     { InternalResource::ResourceId::IC_PUBLIC_ARROW_RIGHT_SVG, "ic_public_arrow_right" },
90     { InternalResource::ResourceId::IC_PUBLIC_ARROW_UP_SVG, "ic_public_arrow_up" },
91     { InternalResource::ResourceId::IC_PUBLIC_ARROW_DOWN_SVG, "ic_public_arrow_down" },
92     { InternalResource::ResourceId::IC_PUBLIC_DOUBLE_ARROW_LEFT_SVG, "ic_public_double_arrow_left" },
93     { InternalResource::ResourceId::IC_PUBLIC_DOUBLE_ARROW_RIGHT_SVG, "ic_public_double_arrow_right" },
94     { InternalResource::ResourceId::IC_CUT_SVG, "ic_public_cut" },
95     { InternalResource::ResourceId::IC_COPY_SVG, "ic_public_copy" },
96     { InternalResource::ResourceId::IC_PASTE_SVG, "ic_public_paste" },
97     { InternalResource::ResourceId::IC_SELECT_ALL_SVG, "ic_public_select_all" },
98     { InternalResource::ResourceId::IC_SHARE_SVG, "ic_public_share" },
99     { InternalResource::ResourceId::IC_TRANSLATE_SVG, "ic_public_translate_c2e" },
100     { InternalResource::ResourceId::IC_SEARCH_SVG, "ic_public_search_filled" },
101     { InternalResource::ResourceId::IC_AI_WRITE_SVG, "ic_public_ai_write" },
102     { InternalResource::ResourceId::MENU_OK_SVG, "ic_public_ok" },
103     { InternalResource::ResourceId::IC_WINDOW_CLOSE, "ic_window_close" },
104     { InternalResource::ResourceId::IC_WINDOW_MAX, "ic_window_max" },
105     { InternalResource::ResourceId::IC_WINDOW_MENU_FULLSCREEN, "ic_window_menu_fullscreen" },
106     { InternalResource::ResourceId::IC_WINDOW_MENU_MAXIMIZE, "ic_window_menu_maximize" },
107     { InternalResource::ResourceId::IC_WINDOW_MENU_OK, "ic_window_menu_ok" },
108     { InternalResource::ResourceId::IC_WINDOW_MENU_SCREEN_L, "ic_window_menu_screen_l" },
109     { InternalResource::ResourceId::IC_WINDOW_MENU_SCREEN_N, "ic_window_menu_screen_n" },
110     { InternalResource::ResourceId::IC_WINDOW_MIN, "ic_window_min" },
111     { InternalResource::ResourceId::IC_WINDOW_RESTORES, "ic_window_restores" },
112     { InternalResource::ResourceId::IC_BOTTOMSHEET_CLOSE_SVG, "ic_bottomsheet_close" },
113     { InternalResource::ResourceId::IC_CANCEL_SVG, "ic_public_cancel" },
114     { InternalResource::ResourceId::RADIO_TICK_SVG, "radio_tick_svg" },
115     { InternalResource::ResourceId::RADIO_DOT_SVG, "radio_dot_svg" },
116     { InternalResource::ResourceId::IC_TAKEPHOTO_SVG, "ic_public_camera" }
117 };
118 }
119 
Build(const RefPtr<ThemeConstants> & themeConstants) const120 RefPtr<IconTheme> IconTheme::Builder::Build(const RefPtr<ThemeConstants>& themeConstants) const
121 {
122     RefPtr<IconTheme>theme  = AceType::Claim(new IconTheme());
123     if (!themeConstants) {
124         return theme;
125     }
126     ParsePattern(themeConstants, theme);
127     return theme;
128 }
129 
ParsePattern(const RefPtr<ThemeConstants> & themeConstants,const RefPtr<IconTheme> & theme) const130 void IconTheme::Builder::ParsePattern(
131     const RefPtr<ThemeConstants>& themeConstants, const RefPtr<IconTheme>& theme) const
132 {
133     theme->pattern_ = themeConstants->GetPatternByName(THEME_PATTERN_ICON);
134 }
135 
GetIconPath(const InternalResource::ResourceId & resourceId) const136 std::string IconTheme::GetIconPath(const InternalResource::ResourceId& resourceId) const
137 {
138     if (!pattern_) {
139         return "";
140     }
141     auto iter = RESOURCE_ICON_MAP.find(resourceId);
142     if (iter == RESOURCE_ICON_MAP.end()) {
143         TAG_LOGW(AceLogTag::ACE_THEME, "Find iconPath fail in resourceMap, resourceId:%{public}d", resourceId);
144         return "";
145     }
146     return pattern_->GetAttr<std::string>(iter->second, "");
147 }
148 } // namespace OHOS::Ace
149