diff --git a/apps/settings/Makefile b/apps/settings/Makefile index c2f0111c7..76f560d66 100644 --- a/apps/settings/Makefile +++ b/apps/settings/Makefile @@ -2,6 +2,8 @@ app_objs += $(addprefix apps/settings/,\ app.o\ preference.o\ main_controller.o\ + settings_node.o\ + sub_controller.o\ ) app_images += apps/settings/settings_icon.png diff --git a/apps/settings/main_controller.cpp b/apps/settings/main_controller.cpp index c4227bd4e..9d5ef95e1 100644 --- a/apps/settings/main_controller.cpp +++ b/apps/settings/main_controller.cpp @@ -3,17 +3,28 @@ namespace Settings { +const SettingsNode angleChildren[2] = {SettingsNode("Degre"), SettingsNode("Radian")}; +const SettingsNode displayModeChildren[2] = {SettingsNode("Auto"), SettingsNode("Scientifique")}; +const SettingsNode numberTypeChildren[2] = {SettingsNode("Reel"), SettingsNode("Complexe")}; +const SettingsNode complexFormatChildren[2] = {SettingsNode("Cartesien"), SettingsNode("Polaire")}; +const SettingsNode languageChildren[2] = {SettingsNode("Anglais"), SettingsNode("Francais")}; + +const SettingsNode menu[5] = {SettingsNode("Unite d'angles", angleChildren, 2), SettingsNode("Format resultat", displayModeChildren, 2), + SettingsNode("Reel ou complexe", numberTypeChildren, 2), SettingsNode("Format complexe", complexFormatChildren, 2), + SettingsNode("Langue", languageChildren, 2)}; +const SettingsNode model = SettingsNode("Parametres", menu, 5); + MainController::MainController(Responder * parentResponder) : ViewController(parentResponder), - m_cells{ChevronMenuListCell((char*)"Angles"), ChevronMenuListCell((char*)"Resultats"), ChevronMenuListCell((char*)"Forme nombre"), - ChevronMenuListCell((char*)"Forme complexe"), ChevronMenuListCell((char*)"Langue")}, m_selectableTableView(SelectableTableView(this, this, Metric::TopMargin, Metric::RightMargin, - Metric::BottomMargin, Metric::LeftMargin)) + Metric::BottomMargin, Metric::LeftMargin)), + m_nodeModel((Node *)&model), + m_subController(this) { } const char * MainController::title() const { - return "Parametres"; + return m_nodeModel->label(); } View * MainController::view() { @@ -28,11 +39,16 @@ void MainController::didBecomeFirstResponder() { } bool MainController::handleEvent(Ion::Events::Event event) { + if (event == Ion::Events::OK) { + m_subController.setNodeModel(m_nodeModel->children(m_selectableTableView.selectedRow())); + StackViewController * stack = stackController(); + stack->push(&m_subController); + } return false; } int MainController::numberOfRows() { - return k_totalNumberOfCell; + return m_nodeModel->numberOfChildren(); }; TableViewCell * MainController::reusableCell(int index) { @@ -49,4 +65,13 @@ KDCoordinate MainController::cellHeight() { return Metric::ParameterCellHeight; } +StackViewController * MainController::stackController() const { + return (StackViewController *)parentResponder(); +} + +void MainController::willDisplayCellForIndex(TableViewCell * cell, int index) { + ChevronMenuListCell * myCell = (ChevronMenuListCell *)cell; + myCell->setText(m_nodeModel->children(index)->label()); +} + } diff --git a/apps/settings/main_controller.h b/apps/settings/main_controller.h index 644142a2c..3db96dcda 100644 --- a/apps/settings/main_controller.h +++ b/apps/settings/main_controller.h @@ -2,6 +2,7 @@ #define SETTINGS_MAIN_CONTROLLER_H #include +#include "sub_controller.h" namespace Settings { @@ -17,10 +18,14 @@ public: KDCoordinate cellHeight() override; TableViewCell * reusableCell(int index) override; int reusableCellCount() override; + void willDisplayCellForIndex(TableViewCell * cell, int index) override; private: + StackViewController * stackController() const; constexpr static int k_totalNumberOfCell = 5; ChevronMenuListCell m_cells[k_totalNumberOfCell]; SelectableTableView m_selectableTableView; + Node * m_nodeModel; + SubController m_subController; }; } diff --git a/apps/settings/settings_node.cpp b/apps/settings/settings_node.cpp new file mode 100644 index 000000000..8c47204a9 --- /dev/null +++ b/apps/settings/settings_node.cpp @@ -0,0 +1,9 @@ +#include "settings_node.h" + +namespace Settings { + +const Node * SettingsNode::children(int index) const { + return &m_children[index]; +} + +} diff --git a/apps/settings/settings_node.h b/apps/settings/settings_node.h new file mode 100644 index 000000000..fd7b34e90 --- /dev/null +++ b/apps/settings/settings_node.h @@ -0,0 +1,23 @@ +#ifndef SETTINGS_NODE_H +#define SETTINGS_NODE_H + +#include "../node.h" + +namespace Settings { + +class SettingsNode : public Node { +public: + constexpr SettingsNode(const char * label = nullptr, const SettingsNode * children = nullptr, int numberOfChildren = 0) : + Node(label, numberOfChildren), + m_children(children) + { + }; + const Node * children(int index) const override; +private: + const SettingsNode * m_children; +}; + +} + +#endif + diff --git a/apps/settings/sub_controller.cpp b/apps/settings/sub_controller.cpp new file mode 100644 index 000000000..0c959f681 --- /dev/null +++ b/apps/settings/sub_controller.cpp @@ -0,0 +1,64 @@ +#include "sub_controller.h" +#include + +namespace Settings { + +SubController::SubController(Responder * parentResponder) : + ViewController(parentResponder), + m_selectableTableView(SelectableTableView(this, this, Metric::TopMargin, Metric::RightMargin, + Metric::BottomMargin, Metric::LeftMargin)), + m_nodeModel(nullptr) +{ +} + +const char * SubController::title() const { + if (m_nodeModel) { + return m_nodeModel->label(); + } + return ""; +} + +View * SubController::view() { + return &m_selectableTableView; +} + +void SubController::didBecomeFirstResponder() { + m_selectableTableView.selectCellAtLocation(0, 0); + app()->setFirstResponder(&m_selectableTableView); +} + +bool SubController::handleEvent(Ion::Events::Event event) { + return false; +} + +int SubController::numberOfRows() { + if (m_nodeModel) { + return m_nodeModel->numberOfChildren(); + } + return 0; +} + +TableViewCell * SubController::reusableCell(int index) { + assert(index >= 0); + assert(index < k_totalNumberOfCell); + return &m_cells[index]; +} + +int SubController::reusableCellCount() { + return k_totalNumberOfCell; +} + +KDCoordinate SubController::cellHeight() { + return Metric::ParameterCellHeight; +} + +void SubController::willDisplayCellForIndex(TableViewCell * cell, int index) { + MenuListCell * myCell = (MenuListCell *)cell; + myCell->setText(m_nodeModel->children(index)->label()); +} + +void SubController::setNodeModel(const Node * nodeModel) { + m_nodeModel = (Node *)nodeModel; +} + +} diff --git a/apps/settings/sub_controller.h b/apps/settings/sub_controller.h new file mode 100644 index 000000000..1b0736f62 --- /dev/null +++ b/apps/settings/sub_controller.h @@ -0,0 +1,31 @@ +#ifndef SETTINGS_SUB_CONTROLLER_H +#define SETTINGS_SUB_CONTROLLER_H + +#include +#include "settings_node.h" + +namespace Settings { + +class SubController : public ViewController, public SimpleListViewDataSource { +public: + SubController(Responder * parentResponder); + View * view() override; + const char * title() const override; + bool handleEvent(Ion::Events::Event event) override; + void didBecomeFirstResponder() override; + int numberOfRows() override; + KDCoordinate cellHeight() override; + TableViewCell * reusableCell(int index) override; + int reusableCellCount() override; + void willDisplayCellForIndex(TableViewCell * cell, int index) override; + void setNodeModel(const Node * nodeModel); +private: + constexpr static int k_totalNumberOfCell = 2; + MenuListCell m_cells[k_totalNumberOfCell]; + SelectableTableView m_selectableTableView; + Node * m_nodeModel; +}; + +} + +#endif