| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- /*
- *
- * Copyright (c) 2020 Project CHIP Authors
- * All rights reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- /**
- * @file ListScreen.cpp
- *
- * Simple list screen.
- *
- */
- #include "ListScreen.h"
- #if CONFIG_HAVE_DISPLAY
- #include <algorithm>
- namespace {
- const char * buttonText[] = { "Up", "Down", "Action" };
- };
- std::string ListScreen::GetButtonText(int id)
- {
- return buttonText[id - 1];
- }
- void ListScreen::Display()
- {
- int i = 0;
- int items = (DisplayHeight - ScreenTitleSafeTop - ScreenTitleSafeBottom) / ScreenFontHeight;
- if (items < model->GetItemCount())
- {
- i = std::max(0, focusIndex - items + (focusIndex == model->GetItemCount() - 1 ? 1 : 2));
- }
- for (int count = 0, y = ScreenTitleSafeTop; i < model->GetItemCount() && count < items; ++i, ++count, y += ScreenFontHeight)
- {
- tft_fg = focusIndex == i ? ScreenFocusColor : ScreenNormalColor;
- TFT_print(model->GetItemText(i).c_str(), ScreenTitleSafeTop, y);
- }
- }
- void ListScreen::Focus(FocusType focus)
- {
- switch (focus)
- {
- case FocusType::NONE:
- hasFocus = false;
- focusIndex = -1;
- break;
- case FocusType::BLUR:
- hasFocus = false;
- // leave focus index alone
- break;
- case FocusType::UNBLUR:
- hasFocus = true;
- // leave focus index alone
- break;
- case FocusType::NEXT:
- hasFocus = true;
- if (focusIndex == -1)
- {
- focusIndex = 0;
- break;
- }
- focusIndex = (focusIndex + 1) % model->GetItemCount(); // wraparound
- if (focusIndex == 0)
- {
- ScreenManager::FocusBack(); // try focus back if it did wrap
- }
- break;
- case FocusType::PREVIOUS:
- hasFocus = true;
- if (focusIndex == -1)
- {
- focusIndex = model->GetItemCount() - 1;
- break;
- }
- focusIndex = (focusIndex + model->GetItemCount() - 1) % model->GetItemCount(); // wraparound
- if (focusIndex == model->GetItemCount() - 1)
- {
- ScreenManager::FocusBack(); // try focus back if it did wrap
- }
- break;
- }
- }
- #endif // CONFIG_HAVE_DISPLAY
|