1 /*
2  * Copyright (c) 2020-2021 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 "ui_test_view_percent.h"
17 
18 #include <cstdio>
19 #include <cstdlib>
20 #include <string>
21 #include "common/screen.h"
22 #include "components/ui_label.h"
23 #include "components/ui_label_button.h"
24 #include "layout/grid_layout.h"
25 
26 namespace OHOS {
27 namespace {
28     static int16_t g_widthPercent = 100;
29     const uint16_t LABEL_HEIGHT = 60;
30     const uint16_t DEFAULT_WIDITH = 80;
31     const uint16_t DEFAULT_HEIGHT = 60;
32     const uint16_t DEFAULT_ELEMENT_COUNT = 10;
33     const uint16_t DEFAULT_PERCENT = 10;
34     const uint16_t MAX_PERCENT = 100;
35     const float DEFAULT_PERCENT_INTERVAL = 100.0f;
36     const int16_t TEXT_H = 20;
37     const int16_t GAP = 10;
38     static int16_t g_view1WidthPercent = DEFAULT_PERCENT;
39     static int16_t g_view1HeightPercent = DEFAULT_PERCENT;
40     static int16_t g_view2WidthPercent = DEFAULT_PERCENT;
41     static int16_t g_view2HeightPercent = DEFAULT_PERCENT;
42 }
43 
SetUp()44 void UITestViewPercent::SetUp()
45 {
46     if (container_ == nullptr) {
47         InitContainer();
48     }
49     viewGroup = new UIViewGroup();
50     view1_ = new UIButton();
51     view2_ = new UIView();
52     view3_ = new UIView();
53     resetfBtn_ = new UILabelButton();
54     BiggerBtn_ = new UILabelButton();
55     SmallerBtn_ = new UILabelButton();
56     positionX_ = 20; // default start x-coordinate as 20
57     positionY_ = 5; // default start y-coordinate as 5
58 }
59 
TearDown()60 void UITestViewPercent::TearDown()
61 {
62     DeleteChildren(container_);
63     container_ = nullptr;
64 }
65 
GetTestView()66 const UIView* UITestViewPercent::GetTestView()
67 {
68     InitView();
69     return container_;
70 }
71 
InitContainer()72 void UITestViewPercent::InitContainer()
73 {
74     container_ = new UIScrollView();
75     container_->SetThrowDrag(true);
76     container_->SetHorizontalScrollState(false);
77     container_->Resize(Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight() - BACK_BUTTON_HEIGHT);
78 }
79 
InitView()80 void UITestViewPercent::InitView()
81 {
82     if (container_ == nullptr) {
83         InitContainer();
84     }
85 
86     UILabel* label = new UILabel();
87     container_->Add(label);
88     positionY_ = TEXT_DISTANCE_TO_TOP_SIDE;
89     label->SetPosition(TEXT_DISTANCE_TO_LEFT_SIDE, positionY_,
90         Screen::GetInstance().GetWidth(), TITLE_LABEL_DEFAULT_HEIGHT);
91     label->SetText("Flex布局效果 ");
92     label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, FONT_DEFAULT_SIZE);
93     positionY_ += (TEXT_H + GAP);
94 
95     flexLayout_ = new FlexLayout();
96     container_->Add(flexLayout_);
97     InitFlexLayout();
98     positionY_ += flexLayout_->GetHeight() + GAP;
99 
100     InitViewGroup();
101     positionY_ += viewGroup->GetHeight() + GAP;
102 
103     GridLayout* gridLayout = new GridLayout();
104     container_->Add(gridLayout);
105     gridLayout->Resize(260, 60); // 260: width; 60: height
106     gridLayout->SetLayoutDirection(LAYOUT_HOR);
107     gridLayout->SetPosition(0, positionY_); // 260: width; 60: height
108     // 2: half of screen width; 2: half of gridLayout
109     gridLayout->LayoutLeftOfParent(Screen::GetInstance().GetWidth() / 2 - gridLayout->GetWidth() / 2);
110     gridLayout->SetRows(1); // set gridlayout row as 1
111     gridLayout->SetCols(3); // set gridlayout column as 3
112 
113     SetUpButton(*gridLayout, *resetfBtn_, "reset", UI_TEST_RESET);
114     SetUpButton(*gridLayout, *BiggerBtn_, "Bigger", UI_TEST_BIGGER);
115     SetUpButton(*gridLayout, *SmallerBtn_, "Smaller", UI_TEST_SMALLER);
116     gridLayout->LayoutChildren(true);
117     container_->LayoutChildren(true);
118 }
119 
InitFlexLayout()120 void UITestViewPercent::InitFlexLayout()
121 {
122     positionY_ = VIEW_DISTANCE_TO_TOP_SIDE;
123     flexLayout_->SetPosition(VIEW_DISTANCE_TO_LEFT_SIDE, positionY_);
124     flexLayout_->SetWidthPercent(0.9f); // set default width percent as 0.9
125     flexLayout_->SetHeightPercent(0.9f); // set default height percent as 0.9
126     flexLayout_->SetStyle(STYLE_BORDER_COLOR, Color::White().full);
127     flexLayout_->SetStyle(STYLE_BORDER_OPA, HALF_OPA_OPAQUE);
128     flexLayout_->SetStyle(STYLE_BORDER_WIDTH, VIEW_STYLE_BORDER_WIDTH);
129     flexLayout_->SetStyle(STYLE_BORDER_RADIUS, VIEW_STYLE_BORDER_RADIUS);
130     flexLayout_->SetStyle(STYLE_BACKGROUND_OPA, 0);
131     for (int16_t i = 1; i <= DEFAULT_ELEMENT_COUNT; i++) {
132         AddElement(i);
133     }
134     flexLayout_->SetFlexWrap(1);
135     flexLayout_->SetLayoutDirection(LAYOUT_HOR);
136     flexLayout_->SetMajorAxisAlign(ALIGN_START);
137     flexLayout_->SetSecondaryAxisAlign(ALIGN_CENTER);
138     flexLayout_->LayoutChildren();
139 }
140 
InitViewGroup() const141 void UITestViewPercent::InitViewGroup() const
142 {
143     container_->Add(viewGroup);
144     viewGroup->SetPosition(VIEW_DISTANCE_TO_LEFT_SIDE, positionY_);
145     viewGroup->SetWidthPercent(0.9f); // set default width percent as 0.9
146     viewGroup->SetHeight(viewGroup->GetParent()->GetHeight());
147     viewGroup->SetStyle(STYLE_BORDER_COLOR, Color::White().full);
148     viewGroup->SetStyle(STYLE_BORDER_OPA, HALF_OPA_OPAQUE);
149     viewGroup->SetStyle(STYLE_BORDER_WIDTH, VIEW_STYLE_BORDER_WIDTH);
150     viewGroup->SetStyle(STYLE_BORDER_RADIUS, VIEW_STYLE_BORDER_RADIUS);
151     viewGroup->SetStyle(STYLE_BACKGROUND_OPA, 0);
152     viewGroup->Add(view1_);
153     view1_->SetViewId("view1");
154     view1_->SetPositionPercent(0.1, 0.1); // set view1 position percent x-percent=0.1, y-percent=0.1
155     view1_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Green().full);
156     view1_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
157     view1_->SetStyle(STYLE_BORDER_COLOR, Color::Black().full);
158     view1_->SetStyle(STYLE_BORDER_OPA, OPA_OPAQUE);
159     view1_->SetStyle(STYLE_BORDER_WIDTH, 1); // set border width 1
160     view1_->SetStyle(STYLE_BORDER_RADIUS, 5); // set border radius 5
161     view1_->SetHeightPercent(g_view1WidthPercent / DEFAULT_PERCENT_INTERVAL);
162     view1_->SetWidthPercent(g_view1HeightPercent / DEFAULT_PERCENT_INTERVAL);
163 
164     viewGroup->Add(view2_);
165     view2_->SetViewId("view2");
166     view2_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Blue().full);
167     view2_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
168     view2_->SetStyle(STYLE_BORDER_COLOR, Color::Blue().full);
169     view2_->SetStyle(STYLE_BORDER_OPA, OPA_OPAQUE);
170     view2_->SetStyle(STYLE_BORDER_WIDTH, 1); // set border width 1
171     view2_->SetStyle(STYLE_BORDER_RADIUS, 5);  // set border radius 5
172     view2_->SetPositionPercent(
173         0.3, 0.1, /* set view2 position percent x-percent=0.3, y-percent=0.1 */
174         g_view2WidthPercent / DEFAULT_PERCENT_INTERVAL, g_view2HeightPercent / DEFAULT_PERCENT_INTERVAL);
175 
176     viewGroup->Add(view3_);
177     view3_->SetViewId("view3");
178     view3_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Red().full);
179     view3_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
180     view3_->SetStyle(STYLE_BORDER_COLOR, Color::Red().full);
181     view3_->SetStyle(STYLE_BORDER_OPA, OPA_OPAQUE);
182     view3_->SetStyle(STYLE_BORDER_WIDTH, 1);  // set border width 1
183     view3_->SetStyle(STYLE_BORDER_RADIUS, 5);  // set border radius 5
184     view3_->SetXPercent(0.5); // set view3 x-percent=0.5
185     view3_->SetYPercent(0.1); // set view3 , y-percent=0.1
186     view3_->SetWidthPercent(g_view2WidthPercent / DEFAULT_PERCENT_INTERVAL);
187     view3_->SetHeightPercent(g_view2HeightPercent / DEFAULT_PERCENT_INTERVAL);
188 }
189 
AddElement(int16_t index)190 void UITestViewPercent::AddElement(int16_t index)
191 {
192     if (flexLayout_ == nullptr) {
193         InitView();
194     }
195 
196     UILabel* label = new UILabel();
197     flexLayout_->Add(label);
198     float percent = DEFAULT_PERCENT / DEFAULT_PERCENT_INTERVAL;
199     label->SetWidthPercent(percent);
200     label->SetHeightPercent(percent);
201     label->SetText(std::to_string(index).c_str());
202     label->SetFont("HYQiHei-65S.otf", 20); // set default font size as 20
203     label->SetStyle(STYLE_TEXT_COLOR, Color::Black().full);
204     label->SetStyle(STYLE_BACKGROUND_COLOR, Color::White().full);
205     label->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
206     label->SetStyle(STYLE_BORDER_COLOR, Color::Black().full);
207     label->SetStyle(STYLE_BORDER_OPA, OPA_OPAQUE);
208     label->SetStyle(STYLE_BORDER_WIDTH, 1); // set border width 1
209     label->SetStyle(STYLE_BORDER_RADIUS, 5);  // set border radius 5
210     label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
211 }
212 
OnClick(UIView & view,const ClickEvent & event)213 bool UITestViewPercent::OnClick(UIView& view, const ClickEvent& event)
214 {
215     if (&view == resetfBtn_) {
216         g_view1HeightPercent = DEFAULT_PERCENT;
217         g_view1WidthPercent = DEFAULT_PERCENT;
218         g_view2HeightPercent = DEFAULT_PERCENT;
219         g_view2WidthPercent = DEFAULT_PERCENT;
220         view1_->ResizePercent(g_view1WidthPercent / DEFAULT_PERCENT_INTERVAL,
221             g_view1HeightPercent / DEFAULT_PERCENT_INTERVAL);
222         view2_->ResizePercent(g_view2WidthPercent / DEFAULT_PERCENT_INTERVAL,
223             g_view2HeightPercent / DEFAULT_PERCENT_INTERVAL);
224         g_widthPercent = DEFAULT_PERCENT;
225         flexLayout_->SetWidthPercent(g_widthPercent / DEFAULT_PERCENT_INTERVAL);
226     } else if (&view == BiggerBtn_) {
227         if (g_widthPercent < DEFAULT_PERCENT) {
228             g_widthPercent++;
229             flexLayout_->SetWidthPercent(g_widthPercent / DEFAULT_PERCENT_INTERVAL);
230         }
231         g_view1HeightPercent++;
232         g_view1WidthPercent++;
233         g_view2HeightPercent++;
234         g_view2WidthPercent++;
235         view1_->ResizePercent(g_view1WidthPercent / DEFAULT_PERCENT_INTERVAL,
236             g_view1HeightPercent / DEFAULT_PERCENT_INTERVAL);
237         view2_->ResizePercent(g_view2WidthPercent / DEFAULT_PERCENT_INTERVAL,
238             g_view2HeightPercent / DEFAULT_PERCENT_INTERVAL);
239     } else if (&view == SmallerBtn_) {
240         g_view1HeightPercent--;
241         g_view1WidthPercent--;
242         g_view2HeightPercent--;
243         g_view2WidthPercent--;
244         view1_->ResizePercent(g_view1WidthPercent / DEFAULT_PERCENT_INTERVAL,
245             g_view1HeightPercent / DEFAULT_PERCENT_INTERVAL);
246         view2_->ResizePercent(g_view2WidthPercent / DEFAULT_PERCENT_INTERVAL,
247             g_view2HeightPercent / DEFAULT_PERCENT_INTERVAL);
248         flexLayout_->SetWidthPercent((g_widthPercent--) / DEFAULT_PERCENT_INTERVAL);
249     }
250     view2_->GetParent()->Invalidate();
251     return true;
252 }
253 }
254 
255