| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- /*
- *
- * 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.h
- *
- * Simple list screen.
- *
- */
- #pragma once
- #include "Screen.h"
- #include "ScreenManager.h"
- #if CONFIG_HAVE_DISPLAY
- #include <lib/support/CHIPMem.h>
- #include <functional>
- #include <string>
- #include <tuple>
- #include <vector>
- class ListScreen : public Screen
- {
- public:
- class Model
- {
- public:
- virtual ~Model() = default;
- virtual std::string GetTitle() { return std::string(); }
- virtual int GetItemCount() { return 0; }
- virtual std::string GetItemText(int i) { return std::string(); }
- virtual void ItemAction(int i) {}
- };
- private:
- Model * model = nullptr;
- bool hasFocus = false;
- int focusIndex = -1;
- public:
- ListScreen(Model * model) : model(model) {}
- virtual ~ListScreen() { chip::Platform::Delete(model); }
- std::string GetTitle() override { return model->GetTitle(); }
- std::string GetButtonText(int id) override;
- void Display() override;
- bool IsFocusable() override { return model->GetItemCount() > 0; }
- void Focus(FocusType focus) override;
- void Action() override { model->ItemAction(focusIndex); }
- };
- class SimpleListModel : public ListScreen::Model
- {
- std::string title;
- std::function<void(int)> action;
- std::vector<std::tuple<std::string, std::function<void()>>> items;
- public:
- std::string GetTitle() override { return title; }
- int GetItemCount() override { return items.size(); }
- std::string GetItemText(int i) override { return std::get<0>(items[i]); }
- void ItemAction(int i) override
- {
- auto & action = std::get<1>(items[i]);
- if (action)
- {
- action();
- }
- else if (this->action)
- {
- this->action(i);
- }
- }
- // Builder interface.
- SimpleListModel * Title(std::string title)
- {
- this->title = std::move(title);
- return this;
- }
- SimpleListModel * Action(std::function<void(int)> action)
- {
- this->action = std::move(action);
- return this;
- }
- SimpleListModel * Item(std::string text)
- {
- items.emplace_back(std::move(text), std::move(std::function<void()>()));
- return this;
- }
- SimpleListModel * Item(std::string text, std::function<void()> action)
- {
- items.emplace_back(std::move(text), std::move(action));
- return this;
- }
- };
- #endif // CONFIG_HAVE_DISPLAY
|