[apps/sequence/graph] Create a class term sum controller

Change-Id: I5b15012d68460394629a5cc272876c39988c9785
This commit is contained in:
Émilie Feral
2017-02-23 12:04:47 +01:00
parent 76296e6d36
commit a5a4bb3caf
3 changed files with 207 additions and 0 deletions

View File

@@ -5,6 +5,7 @@ app_objs += $(addprefix apps/sequence/,\
graph/curve_view_range.o\
graph/graph_controller.o\
graph/graph_view.o\
graph/term_sum_controller.o\
graph/vertical_cursor_view.o\
list/list_controller.o\
list/list_parameter_controller.o\

View File

@@ -0,0 +1,147 @@
#include "term_sum_controller.h"
#include "../../shared/text_field_delegate.h"
#include <assert.h>
#include <math.h>
using namespace Shared;
namespace Sequence {
TermSumController::TermSumController(Responder * parentResponder, GraphView * graphView, CurveViewRange * graphRange, CurveViewCursor * cursor) :
ViewController(parentResponder),
m_contentView(ContentView(graphView)),
m_graphRange(graphRange),
m_sequence(nullptr),
m_cursor(cursor),
m_cursorView(VerticalCursorView())
{
}
const char * TermSumController::title() const {
return "Sommes des termes";
}
View * TermSumController::view() {
return &m_contentView;
}
void TermSumController::viewWillAppear() {
m_contentView.graphView()->setVerticalCursor(true);
m_contentView.graphView()->setCursorView(&m_cursorView);
m_contentView.graphView()->setBannerView(nullptr);
m_contentView.graphView()->selectMainView(true);
m_contentView.graphView()->reload();
m_contentView.layoutSubviews();
}
bool TermSumController::handleEvent(Ion::Events::Event event) {
if (event == Ion::Events::Left) {
if (step > 0) {
return false;
}
if (moveCursorHorizontallyToPosition(roundf(m_cursor->x()-1.0f))) {
m_contentView.graphView()->reload();
return true;
}
return false;
}
if (event == Ion::Events::Right) {
if (moveCursorHorizontallyToPosition(roundf(m_cursor->x()+1.0f))) {
m_contentView.graphView()->reload();
return true;
}
return false;
}
if (event.hasText() && event.text()[0] >= '0' && event.text()[0] <= '9') {
if (step > 0 && event.text()[0]-'0' < m_cursor->x()) {
return false;
}
if (moveCursorHorizontallyToPosition(event.text()[0]-'0')) {
m_contentView.graphView()->reload();
return true;
}
return false;
}
return false;
}
bool TermSumController::moveCursorHorizontallyToPosition(int position) {
if (position < 0) {
return false;
}
float x = position;
TextFieldDelegateApp * myApp = (TextFieldDelegateApp *)app();
if (m_sequence == nullptr) {
return false;
}
float y = m_sequence->evaluateAtAbscissa(x, myApp->localContext());
m_cursor->moveTo(x, y);
m_graphRange->panToMakePointVisible(x, y, k_cursorTopMarginRatio, k_cursorRightMarginRatio, k_cursorBottomMarginRatio, k_cursorLeftMarginRatio);
return true;
}
void TermSumController::setSequence(Sequence * sequence) {
m_sequence = sequence;
}
/* Content View */
TermSumController::ContentView::ContentView(GraphView * graphView) :
m_graphView(graphView)
{
}
int TermSumController::ContentView::numberOfSubviews() const {
return 2;
}
View * TermSumController::ContentView::subviewAtIndex(int index) {
assert(index >= 0 && index < 2);
if (index == 0) {
return m_graphView;
}
return &m_legendView;
}
void TermSumController::ContentView::layoutSubviews() {
m_graphView->setFrame(bounds());
m_legendView.setFrame(KDRect(0, bounds().height() - k_legendHeight, bounds().width(), k_legendHeight));
}
GraphView * TermSumController::ContentView::graphView() {
return m_graphView;
}
/* Legend View */
TermSumController::ContentView::LegendView::LegendView() :
m_sum(ExpressionView(0.0f, 0.5f, KDColorBlack, Palette::GreyBright)),
m_legend(PointerTextView(KDText::FontSize::Small, "SELECTIONNER LE PREMIER TERME", 0.0f, 0.5f, KDColorBlack, Palette::GreyBright))
{
}
void TermSumController::ContentView::LegendView::drawRect(KDContext * ctx, KDRect rect) const {
ctx->fillRect(KDRect(0, bounds().height() - k_legendHeight, bounds().width(), k_legendHeight), Palette::GreyBright);
}
int TermSumController::ContentView::LegendView::numberOfSubviews() const {
return 2;
}
View * TermSumController::ContentView::LegendView::subviewAtIndex(int index) {
assert(index >= 0 && index < 2);
if (index == 0) {
return &m_sum;
}
return &m_legend;
}
void TermSumController::ContentView::LegendView::layoutSubviews() {
KDCoordinate width = bounds().width();
KDCoordinate heigth = bounds().height();
m_sum.setFrame(KDRect(0, 0, width/2, heigth));
m_legend.setFrame(KDRect(width/2, 0, width/2, heigth));
}
}

View File

@@ -0,0 +1,59 @@
#ifndef SEQUENCE_TERM_SUM_CONTROLLER_H
#define SEQUENCE_TERM_SUM_CONTROLLER_H
#include <escher.h>
#include "graph_view.h"
#include "curve_view_range.h"
#include "vertical_cursor_view.h"
#include "../../shared/curve_view_cursor.h"
namespace Sequence {
class TermSumController : public ViewController {
public:
TermSumController(Responder * parentResponder, GraphView * graphView, CurveViewRange * graphRange, Shared::CurveViewCursor * cursor);
const char * title() const override;
View * view() override;
void viewWillAppear() override;
bool handleEvent(Ion::Events::Event event) override;
bool moveCursorHorizontallyToPosition(int position);
void setSequence(Sequence * sequence);
private:
constexpr static float k_cursorTopMarginRatio = 0.07f; // (cursorHeight/2)/graphViewHeight
constexpr static float k_cursorRightMarginRatio = 0.04f; // (cursorWidth/2)/graphViewWidth
constexpr static float k_cursorBottomMarginRatio = 0.15f; // (cursorHeight/2+bannerHeigh)/graphViewHeight
constexpr static float k_cursorLeftMarginRatio = 0.04f; // (cursorWidth/2)/graphViewWidth
class ContentView : public View {
public:
ContentView(GraphView * graphView);
void layoutSubviews() override;
GraphView * graphView();
private:
class LegendView : public View {
public:
LegendView();
void drawRect(KDContext * ctx, KDRect rect) const override;
private:
void layoutSubviews() override;
int numberOfSubviews() const override;
View * subviewAtIndex(int index) override;
ExpressionView m_sum;
PointerTextView m_legend;
};
int numberOfSubviews() const override;
View * subviewAtIndex(int index) override;
GraphView * m_graphView;
LegendView m_legendView;
constexpr static KDCoordinate k_legendHeight = 28;
};
ContentView m_contentView;
CurveViewRange * m_graphRange;
Sequence * m_sequence;
Shared::CurveViewCursor * m_cursor;
VerticalCursorView m_cursorView;
int step;
};
}
#endif