1 /*
2  * Copyright (c) 2021-2022 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_v2/indexer/indexer_element.h"
17 
18 #include "core/components_v2/indexer/indexer_component.h"
19 
20 namespace OHOS::Ace::V2 {
PerformBuild()21 void IndexerElement::PerformBuild()
22 {
23     RefPtr<IndexerComponent> indexer = AceType::DynamicCast<IndexerComponent>(component_);
24     if (indexer) {
25         LOGI("[indexer] PerformBuild: Build Indexer");
26         ComponentGroupElement::PerformBuild();
27     }
28 }
29 
IndexMoveUp()30 bool IndexerElement::IndexMoveUp()
31 {
32     RefPtr<RenderIndexer> renderIndexer = AceType::DynamicCast<RenderIndexer>(renderNode_);
33     int32_t index = renderIndexer->GetFocusIndex();
34     auto prevItem = prevFocusedItem_.Upgrade();
35     if (prevItem) {
36         prevItem->SetFocused(false);
37     }
38     index -= 1;
39     if (index < 0) {
40         renderIndexer->SetFocusIndex(-1);
41         renderIndexer->ClearFocusAnimation();
42         return false;
43     }
44     auto indexerItem = renderIndexer->GetSpecificItem(index);
45     if (!indexerItem) {
46         return false;
47     }
48 
49     indexerItem->SetFocused(true);
50     renderIndexer->HandleFocusAnimation(indexerItem->GetLayoutSize(), indexerItem->GetGlobalOffset());
51     renderIndexer->MoveSectionWithIndexer(index);
52     renderIndexer->SetFocusIndex(index);
53     prevFocusedItem_ = indexerItem;
54     return true;
55 }
56 
IndexMoveDown()57 bool IndexerElement::IndexMoveDown()
58 {
59     RefPtr<RenderIndexer> renderIndexer = AceType::DynamicCast<RenderIndexer>(renderNode_);
60     int32_t index = renderIndexer->GetFocusIndex();
61     auto prevItem = prevFocusedItem_.Upgrade();
62     if (prevItem) {
63         prevItem->SetFocused(false);
64     }
65     index += 1;
66     auto indexerItem = renderIndexer->GetSpecificItem(index);
67     if (!indexerItem) {
68         renderIndexer->ClearFocusAnimation();
69         return false;
70     }
71 
72     indexerItem->SetFocused(true);
73     renderIndexer->HandleFocusAnimation(indexerItem->GetLayoutSize(), indexerItem->GetGlobalOffset());
74     renderIndexer->MoveSectionWithIndexer(index);
75     renderIndexer->SetFocusIndex(index);
76     prevFocusedItem_ = indexerItem;
77     return true;
78 }
79 
OnKeyEvent(const KeyEvent & keyEvent)80 bool IndexerElement::OnKeyEvent(const KeyEvent& keyEvent)
81 {
82     if (keyEvent.action != KeyAction::DOWN) {
83         return false;
84     }
85     if (keyEvent.code == KeyCode::KEY_DPAD_UP) {
86         return IndexMoveUp();
87     } else if (keyEvent.code == KeyCode::KEY_DPAD_DOWN) {
88         return IndexMoveDown();
89     } else if (keyEvent.code == KeyCode::KEY_ENTER || keyEvent.code == KeyCode::KEY_NUMPAD_ENTER) {
90         RefPtr<RenderIndexer> renderIndexer = AceType::DynamicCast<RenderIndexer>(renderNode_);
91         int32_t index = renderIndexer->GetFocusIndex();
92         if (index > -1) {
93             renderIndexer->MoveSectionWithIndexer(index);
94             return true;
95         }
96         return false;
97     } else {
98         return false;
99     }
100 }
101 } // namespace OHOS::Ace::V2