[geometry] Not working third menu

This commit is contained in:
Laury
2021-11-11 17:46:45 +01:00
parent 5c1f192228
commit 6aad7d2279
25 changed files with 306 additions and 29 deletions

View File

@@ -3,9 +3,10 @@ app_headers += apps/geometry/app.h
app_geometry_src = $(addprefix apps/geometry/,\
app.cpp \
figures_controller.cpp \
definition_type_controller.cpp \
figure_type_controller.cpp \
list/figures_controller.cpp \
list/definition_type_controller.cpp \
list/figure_type_controller.cpp \
list/figure_parameters_controller.cpp \
)
apps_src += $(app_geometry_src)

View File

@@ -2,7 +2,7 @@
#define GEOMETRY_H
#include <escher.h>
#include "figures_controller.h"
#include "list/figures_controller.h"
namespace Geometry
{

View File

@@ -5,3 +5,4 @@ Point = "Point"
Circle = "Cercle"
FigureType = "Type de figure"
DefinitionType = "Définition de la figure"
ParametersChoice = "Choix des paramètres"

View File

@@ -5,3 +5,4 @@ Point = "Point"
Circle = "Cercle"
FigureType = "Type de figure"
DefinitionType = "Définition de la figure"
ParametersChoice = "Choix des paramètres"

View File

@@ -5,3 +5,4 @@ Point = "Point"
Circle = "Cercle"
FigureType = "Type de figure"
DefinitionType = "Définition de la figure"
ParametersChoice = "Choix des paramètres"

View File

@@ -5,3 +5,4 @@ Point = "Point"
Circle = "Cercle"
FigureType = "Type de figure"
DefinitionType = "Définition de la figure"
ParametersChoice = "Choix des paramètres"

View File

@@ -5,3 +5,4 @@ Point = "Point"
Circle = "Cercle"
FigureType = "Type de figure"
DefinitionType = "Définition de la figure"
ParametersChoice = "Choix des paramètres"

View File

@@ -5,3 +5,4 @@ Point = "Point"
Circle = "Cercle"
FigureType = "Type de figure"
DefinitionType = "Définition de la figure"
ParametersChoice = "Choix des paramètres"

View File

@@ -5,3 +5,4 @@ Point = "Point"
Circle = "Cercle"
FigureType = "Type de figure"
DefinitionType = "Définition de la figure"
ParametersChoice = "Choix des paramètres"

View File

@@ -5,3 +5,4 @@ Point = "Point"
Circle = "Cercle"
FigureType = "Type de figure"
DefinitionType = "Définition de la figure"
ParametersChoice = "Choix des paramètres"

View File

@@ -0,0 +1,15 @@
#ifndef GEOMETRY_FIGURE_TYPE_H
#define GEOMETRY_FIGURE_TYPE_H
namespace Geometry {
enum class FigureType {
None = 0, // Used to trigger assert in debug mode
Number, // It's not a real figure type but we use it to build figures like points
Point,
Circle
};
}
#endif

View File

@@ -2,26 +2,31 @@
namespace Geometry {
static I18n::Message sMessages[] = {
static I18n::Message sPointDefinitionsMessages[] = {
I18n::Message::QuentinGuidee,
I18n::Message::JeanBaptisteBoric
};
DefinitionTypeController::DefinitionTypeController(Responder * parentResponder) :
static I18n::Message sCircleDefinitionsMessages[] = {
I18n::Message::JoachimLeFournis,
I18n::Message::MaximeFriess
};
DefinitionTypeController::DefinitionTypeController(Responder * parentResponder, FigureParametersController * parametersController) :
ViewController(parentResponder),
m_selectableTableView(this)
m_selectableTableView(this),
m_messages(nullptr),
m_figureType(FigureType::None),
m_parametersController(parametersController)
{
for (int i = 0; i < k_numberOfCells; i ++) {
m_cells[i].setMessageFont(KDFont::LargeFont);
}
m_messages = sMessages;
}
const char * DefinitionTypeController::title() {
return I18n::translate(I18n::Message::DefinitionType);
}
void DefinitionTypeController::viewWillAppear() {
assert(m_figureType != FigureType::None && m_messages != nullptr);
m_selectableTableView.reloadVisibleCells(); // We reload the cell of the table view to update their message
selectRow(0);
}
@@ -32,12 +37,12 @@ void DefinitionTypeController::didBecomeFirstResponder() {
bool DefinitionTypeController::handleEvent(Ion::Events::Event event) {
if (event == Ion::Events::OK || event == Ion::Events::EXE || event == Ion::Events::Right) {
StackViewController * stack = static_cast<StackViewController *>(parentResponder()->parentResponder()->parentResponder());
stack->pop();
StackViewController * stack = static_cast<StackViewController *>(parentResponder());
stack->push(m_parametersController);
return true;
}
if (event == Ion::Events::Back) {
StackViewController * stack = static_cast<StackViewController *>(parentResponder()->parentResponder()->parentResponder());
StackViewController * stack = static_cast<StackViewController *>(parentResponder());
stack->pop();
return true;
}
@@ -55,4 +60,19 @@ void DefinitionTypeController::willDisplayCellForIndex(HighlightCell * cell, int
myCell->setMessage(m_messages[index]);
}
void DefinitionTypeController::setFigureType(FigureType figureType) {
m_figureType = figureType;
switch (m_figureType) {
case FigureType::Point:
m_messages = sPointDefinitionsMessages;
break;
case FigureType::Circle:
m_messages = sCircleDefinitionsMessages;
break;
default:
assert(false);
break;
}
}
}

View File

@@ -3,6 +3,8 @@
#include <escher.h>
#include "apps/i18n.h"
#include "../figure_type.h"
#include "figure_parameters_controller.h"
namespace Geometry {
/**
@@ -10,28 +12,39 @@ namespace Geometry {
*/
class DefinitionTypeController : public ViewController, public SimpleListViewDataSource, public SelectableTableViewDataSource {
public:
DefinitionTypeController(Responder * parentResponder/*, FigureDefinitionController * definitionController*/);
DefinitionTypeController(Responder * parentResponder, FigureParametersController * parametersController);
/* ViewController */
View * view() override { return &m_selectableTableView; }
const char * title() override;
// We want to avoid using half of the screen just for titles
virtual DisplayParameter displayParameter() override { return DisplayParameter::DoNotShowOwnTitle; }
const char * title() override { return I18n::translate(I18n::Message::DefinitionType); }
/* Responder */
bool handleEvent(Ion::Events::Event event) override;
/* ViewController */
void didBecomeFirstResponder() override;
void viewWillAppear() override;
TELEMETRY_ID("FigureType");
/* SelectableTableViewDataSource */
int numberOfRows() const override { return 2; }
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
KDCoordinate cellHeight() override { return k_cellHeight; }
HighlightCell * reusableCell(int index) override;
int reusableCellCount() const override { return k_numberOfCells; }
/* Customs methods */
void setFigureType(FigureType type);
private:
constexpr static KDCoordinate k_cellHeight = Metric::ParameterCellHeight;
constexpr static int k_numberOfCells = 2;
MessageTableCellWithChevron m_cells[k_numberOfCells];
SelectableTableView m_selectableTableView;
I18n::Message * m_messages;
/*FigureDefinitionController * m_FigureDefinitionController;*/
FigureType m_figureType;
FigureParametersController * m_parametersController;
};
}

View File

@@ -0,0 +1,73 @@
#include "figure_parameters_controller.h"
#include "../app.h"
namespace Geometry {
FigureParametersController::FigureParametersController(Responder * parentResponder):
ViewController(parentResponder),
m_selectableTableView(this)
{
}
void FigureParametersController::didBecomeFirstResponder() {
Container::activeApp()->setFirstResponder(&m_selectableTableView);
}
void FigureParametersController::viewWillAppear() {
selectRow(0);
}
bool FigureParametersController::handleEvent(Ion::Events::Event event) {
if (event == Ion::Events::OK || event == Ion::Events::EXE) {
StackViewController * stack = static_cast<StackViewController *>(parentResponder());
stack->pop();
stack->pop();
stack->pop();
return true;
}
return false;
}
/* ListViewDataSource */
int FigureParametersController::typeAtLocation(int i, int j) {
return 0;
}
int FigureParametersController::reusableCellCount(int type) {
return 2;
}
HighlightCell * FigureParametersController::reusableCell(int index, int type) {
return &m_choicesCells[index];
}
int FigureParametersController::numberOfRows() const {
return 2;
}
KDCoordinate FigureParametersController::rowHeight(int j) {
return Metric::ParameterCellHeight;
}
KDCoordinate FigureParametersController::cumulatedHeightFromIndex(int j) {
return Metric::ParameterCellHeight*j;
}
int FigureParametersController::indexFromCumulatedHeight(KDCoordinate offsetY) {
return (offsetY - 1) / Metric::ParameterCellHeight;
}
void FigureParametersController::willDisplayCellForIndex(HighlightCell * cell, int index) {
}
/*bool FigureParametersController::textFieldShouldFinishEditing(TextField * textField, Ion::Events::Event event) {
return (event == Ion::Events::Up);
/*return (event == Ion::Events::Down && selectedRow() < numberOfRows()-1)
|| (event == Ion::Events::Up && selectedRow() > 0)
|| TextFieldDelegate::textFieldShouldFinishEditing(textField, event);*//*
}
bool FigureParametersController::textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) {
return true;
}*/
}

View File

@@ -0,0 +1,54 @@
#ifndef GEOMETRY_FIGURE_PARAMETERS_CONTROLLER_H
#define GEOMETRY_FIGURE_PARAMETERS_CONTROLLER_H
#include <escher.h>
#include "apps/i18n.h"
#include "message_table_cell_with_selector.h"
namespace Geometry {
/**
* \brief Controller returnig the parameter choosen by the user to define the figure
*/
class FigureParametersController : public ViewController, public ListViewDataSource, public SelectableTableViewDataSource {
public:
FigureParametersController(Responder * parentResponder);
/* ViewController */
const char * title() override { return I18n::translate(I18n::Message::ParametersChoice); }
// We want to avoid using half of the screen just for titles
virtual DisplayParameter displayParameter() override { return DisplayParameter::DoNotShowOwnTitle; }
View * view() override { return &m_selectableTableView; };
/* Responder */
void didBecomeFirstResponder() override;
void viewWillAppear() override;
bool handleEvent(Ion::Events::Event event) override;
/* ListViewDataSource */
int typeAtLocation(int i, int j) override; // TO IMPLEMENT
int reusableCellCount(int type) override; // TO IMPLEMENT
HighlightCell * reusableCell(int index, int type) override; // TO IMPLEMENT
int numberOfRows() const override;
KDCoordinate rowHeight(int j) override;
KDCoordinate cumulatedHeightFromIndex(int j) override;
int indexFromCumulatedHeight(KDCoordinate offsetY) override;
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
/* InputEventHandlerDelegate */
//bool textFieldShouldFinishEditing(TextField * textField, Ion::Events::Event event) override;
//bool textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) override;
private:
SelectableTableView m_selectableTableView;
constexpr static int k_textCells = 2;
constexpr static int k_choiceCells = 3;
MessageTableCellWithEditableText m_textCells[k_textCells];
MessageTableCellWithSelector m_choicesCells[k_choiceCells];
};
}
#endif

View File

@@ -3,6 +3,11 @@
namespace Geometry {
static FigureType sTypes[] = {
FigureType::Point,
FigureType::Circle
};
static I18n::Message sMessages[] = {
I18n::Message::Point,
I18n::Message::Circle
@@ -11,16 +16,12 @@ static I18n::Message sMessages[] = {
FigureTypeController::FigureTypeController(Responder * parentResponder, DefinitionTypeController * definitionTypeController) :
ViewController(parentResponder),
m_selectableTableView(this),
m_definitionTypeController(definitionTypeController)
m_definitionTypeController(definitionTypeController),
m_messages(sMessages)
{
for (int i = 0; i < k_numberOfCells; i ++) {
m_cells[i].setMessageFont(KDFont::LargeFont);
}
m_messages = sMessages;
}
const char * FigureTypeController::title() {
return I18n::translate(I18n::Message::FigureType);
}
void FigureTypeController::viewWillAppear() {
@@ -35,6 +36,7 @@ void FigureTypeController::didBecomeFirstResponder() {
bool FigureTypeController::handleEvent(Ion::Events::Event event) {
if (event == Ion::Events::OK || event == Ion::Events::EXE || event == Ion::Events::Right) {
StackViewController * stack = static_cast<StackViewController *>(parentResponder());
m_definitionTypeController->setFigureType(sTypes[selectedRow()]);
stack->push(m_definitionTypeController);
return true;
}

View File

@@ -15,12 +15,19 @@ public:
/* ViewController */
View * view() override { return &m_selectableTableView; }
const char * title() override;
// We want to avoid using half of the screen just for titles
virtual DisplayParameter displayParameter() override { return DisplayParameter::DoNotShowOwnTitle; }
const char * title() override { return I18n::translate(I18n::Message::FigureType); }
/* Responder */
bool handleEvent(Ion::Events::Event event) override;
void didBecomeFirstResponder() override;
/* ViewController */
void viewWillAppear() override;
TELEMETRY_ID("FigureType");
/* TableViewDataSource */
int numberOfRows() const override { return 2; }
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
KDCoordinate cellHeight() override { return k_cellHeight; }
@@ -31,8 +38,8 @@ private:
constexpr static int k_numberOfCells = 2;
MessageTableCellWithChevron m_cells[k_numberOfCells];
SelectableTableView m_selectableTableView;
I18n::Message * m_messages;
DefinitionTypeController * m_definitionTypeController;
I18n::Message * m_messages;
};
}

View File

@@ -10,7 +10,8 @@ FiguresController::FiguresController(Responder * parentResponder):
m_addFigureCell(),
m_emptyCell(),
m_figureTypeController(this, &m_definitionTypeController),
m_definitionTypeController(&m_figureTypeController)
m_definitionTypeController(&m_figureTypeController, &m_parametersController),
m_parametersController(&m_definitionTypeController)
{
m_addFigureCell.setMessage(I18n::Message::AddFigure);
}

View File

@@ -6,7 +6,9 @@
namespace Geometry
{
/**
* \brief FiguresController is a controller to show the list of the figures
*/
class FiguresController : public ViewController, public SelectableTableViewDataSource, public SelectableTableViewDelegate, public TableViewDataSource {
public:
FiguresController(Responder * parentResponder);
@@ -37,6 +39,7 @@ private:
EvenOddCell m_emptyCell;
FigureTypeController m_figureTypeController;
DefinitionTypeController m_definitionTypeController;
FigureParametersController m_parametersController;
};
}

View File

@@ -0,0 +1,22 @@
#include "message_table_cell_with_selector.h"
namespace Geometry {
MessageTableCellWithSelector::MessageTableCellWithSelector(ToolboxMessageTree * root, const KDFont * font) :
Responder(nullptr),
MessageTableCell((I18n::Message)0, font),
m_objectsRoot(root),
m_selectedMessage(nullptr)
{
}
MessageTableCellWithSelector::handleEvent(Ion::Events::Event event) {
if (event == Ion::Events::OK || event == Ion::Events::EXE) {
//Container::activeApp()->displayModalViewController(m_toolbox, 0.f, 0.f)
return true;
}
return false;
}
}

View File

@@ -0,0 +1,23 @@
#ifndef ESHER_MESSAGE_TABLE_CELL_WITH_OBJECT_SELECTOR_H_
#define ESHER_MESSAGE_TABLE_CELL_WITH_OBJECT_SELECTOR_H_
#include <escher/message_table_cell_with_buffer.h>
#include <escher/toolbox_message_tree.h>
#include "objects_controller.h"
namespace Geometry {
class MessageTableCellWithSelector : public Responder, public MessageTableCell {
public:
MessageTableCellWithSelector(ToolboxMessageTree * root = nullptr, const KDFont * font = KDFont::SmallFont);
ToolboxMessageTree * getSelectedMessage() const { return m_selectedMessage; };
bool handleEvent(Ion::Events::Event event);
private:
ToolboxMessageTree * m_objectsRoot;
ToolboxMessageTree * m_selectedMessage;
ObjectsController m_toolbox;
};
}
#endif

View File

@@ -0,0 +1,20 @@
#ifndef APPS_MATH_VARIABLE_BOX_CONTROLLER_H
#define APPS_MATH_VARIABLE_BOX_CONTROLLER_H
#include <escher/nested_menu_controller.h>
namespace Geometry {
class ObjectsController : public NestedMenuController {
ObjectsController(Responder * parentResponder);
virtual int numberOfRows() const override;
virtual int reusableCellCount(int type) override;
virtual int typeAtLocation(int i, int j) override;
virtual bool selectLeaf(int selectedRow) override;
virtual HighlightCell * leafCellAtIndex(int index) override;
virtual HighlightCell * nodeCellAtIndex(int index) override;
};
}
#endif

View File

@@ -20,6 +20,7 @@ public:
virtual void scrollToCell(int i, int j);
HighlightCell * cellAtLocation(int i, int j);
void reloadCellAtLocation(int i, int j);
void reloadVisibleCells();
protected:
#if ESCHER_VIEW_LOGGING
const char * className() const override;
@@ -34,6 +35,7 @@ protected:
void setHorizontalCellOverlap(KDCoordinate o) { m_horizontalCellOverlap = o; }
void setVerticalCellOverlap(KDCoordinate o) { m_verticalCellOverlap = o; }
void reloadVisibleCells();
void reloadCellAtLocation(int i, int j);
HighlightCell * cellAtLocation(int i, int j);
TableViewDataSource * dataSource();

View File

@@ -56,6 +56,10 @@ void TableView::reloadCellAtLocation(int i, int j) {
m_contentView.reloadCellAtLocation(i, j);
}
void TableView::reloadVisibleCells() {
m_contentView.reloadVisibleCells();
}
/* TableView::ContentView */
TableView::ContentView::ContentView(TableView * tableView, TableViewDataSource * dataSource, KDCoordinate horizontalCellOverlap, KDCoordinate verticalCellOverlap) :
@@ -165,6 +169,15 @@ View * TableView::ContentView::subviewAtIndex(int index) {
return m_dataSource->reusableCell(typeIndex, type);
}
void TableView::ContentView::reloadVisibleCells() {
for (int index = 0; index < numberOfSubviews(); index++) {
View * cell = subview(index);
int i = absoluteColumnNumberFromSubviewIndex(index);
int j = absoluteRowNumberFromSubviewIndex(index);
m_dataSource->willDisplayCellAtLocation((HighlightCell *)cell, i, j);
}
}
void TableView::ContentView::layoutSubviews(bool force) {
/* The number of subviews might change during the layouting so it needs to be
* recomputed at each step of the for loop. */