Files
Upsilon/apps/shared/localization_controller.h
Gabriel Ozouf 62f598110e [apps/shared] Created LocalizationController
Classes LanguageController and CountryController have been fused into
one class LocalizationController, as they were very similar. This allows
the Settings and OnBoarding apps to only keep one controller for both
functions.

Change-Id: Ic23f300c37122249d34caaf18a633b5815240a78
2020-11-04 15:11:44 +01:00

80 lines
2.9 KiB
C++

#ifndef LOCALIZATION_CONTROLLER_H
#define LOCALIZATION_CONTROLLER_H
#include <escher.h>
#include <apps/i18n.h>
#include <algorithm>
namespace Shared {
class LocalizationController : public ViewController, public SimpleListViewDataSource, public SelectableTableViewDataSource {
public:
static int IndexOfCountry(I18n::Country country);
static I18n::Country CountryAtIndex(int i);
enum class Mode : uint8_t {
Language,
Country
};
LocalizationController(Responder * parentResponder, KDCoordinate verticalMargin, Mode mode);
void resetSelection();
Mode mode() const { return m_mode; }
void setMode(Mode mode);
virtual bool shouldDisplayTitle() = 0;
virtual bool shouldResetSelectionToTopCell() = 0;
bool shouldDisplayWarning() { return mode() == Mode::Country; }
View * view() override { return &m_contentView; }
const char * title() override;
void didBecomeFirstResponder() override { Container::activeApp()->setFirstResponder(selectableTableView()); }
void viewWillAppear() override;
bool handleEvent(Ion::Events::Event event) override;
int numberOfRows() const override { return (mode() == Mode::Country) ? I18n::NumberOfCountries : I18n::NumberOfLanguages; }
KDCoordinate cellHeight() override { return Metric::ParameterCellHeight; }
HighlightCell * reusableCell(int index) override { return &m_cells[index]; }
int reusableCellCount() const override { return (mode() == Mode::Country) ? I18n::NumberOfCountries : I18n::NumberOfLanguages; }
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
protected:
class ContentView : public View {
public:
ContentView(LocalizationController * controller, SelectableTableViewDataSource * dataSource);
SelectableTableView * selectableTableView() { return &m_selectableTableView; }
void drawRect(KDContext * ctx, KDRect rect) const override { ctx->fillRect(bounds(), Palette::WallScreen); }
void modeHasChanged();
private:
constexpr static int k_numberOfCountryWarningLines = 2;
void layoutSubviews(bool force = false) override;
KDCoordinate layoutTitleSubview(bool force, KDCoordinate verticalOrigin);
KDCoordinate layoutWarningSubview(bool force, KDCoordinate verticalOrigin);
KDCoordinate layoutTableSubview(bool force, KDCoordinate verticalOrigin);
int numberOfSubviews() const override;
View * subviewAtIndex(int i) override;
LocalizationController * m_controller;
SelectableTableView m_selectableTableView;
MessageTextView m_countryTitleMessage;
MessageTextView m_countryWarningLines[k_numberOfCountryWarningLines];
};
SelectableTableView * selectableTableView() { return m_contentView.selectableTableView(); }
ContentView m_contentView;
private:
static constexpr int k_numberOfCells = I18n::NumberOfLanguages > I18n::NumberOfCountries ? I18n::NumberOfLanguages : I18n::NumberOfCountries;
MessageTableCell m_cells[k_numberOfCells];
Mode m_mode;
};
}
#endif