mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-18 21:30:38 +01:00
[poincare] fraction_layout
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
SFLAGS += -Ipoincare/include
|
||||
objs += $(addprefix poincare/src/, addition.o expression.o integer.o fraction.o expression_lexer.o expression_parser.o)
|
||||
objs += $(addprefix poincare/src/layout/, expression_layout.o horizontal_layout.o string_layout.o)
|
||||
objs += $(addprefix poincare/src/layout/, expression_layout.o fraction_layout.o horizontal_layout.o string_layout.o)
|
||||
tests += $(addprefix poincare/test/, integer.cpp)
|
||||
|
||||
# Even though flex and bison will generate both implementation and headers at
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include <poincare/fraction.h>
|
||||
#include <string.h>
|
||||
#include "layout/horizontal_layout.h"
|
||||
#include "layout/fraction_layout.h"
|
||||
|
||||
/*
|
||||
static inline KDCoordinate max(KDCoordinate a, KDCoordinate b) {
|
||||
@@ -28,7 +28,7 @@ Expression ** Fraction::children() {
|
||||
*/
|
||||
|
||||
ExpressionLayout * Fraction::createLayout(ExpressionLayout * parent) {
|
||||
return new HorizontalLayout(parent, NUMERATOR, '-', DENOMINATOR);
|
||||
return new FractionLayout(parent, NUMERATOR, DENOMINATOR);
|
||||
}
|
||||
/*
|
||||
void Fraction::layout() {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include <poincare/fraction.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include "fraction_layout.h"
|
||||
|
||||
static inline KDCoordinate max(KDCoordinate a, KDCoordinate b) {
|
||||
@@ -10,9 +11,29 @@ static inline KDCoordinate max(KDCoordinate a, KDCoordinate b) {
|
||||
#define FRACTION_LINE_MARGIN 2
|
||||
#define FRACTION_LINE_HEIGHT 1
|
||||
|
||||
FractionLayout::FractionLayout(Expression * numerator, Expression * denominator) {
|
||||
m_numerator = numerator->createLayout();
|
||||
m_denominator = denominator->createLayout();
|
||||
FractionLayout::FractionLayout(ExpressionLayout * parent, Expression * numerator, Expression * denominator) :
|
||||
ExpressionLayout(parent) {
|
||||
m_numerator = numerator->createLayout(this);
|
||||
m_denominator = denominator->createLayout(this);
|
||||
}
|
||||
|
||||
FractionLayout::~FractionLayout() {
|
||||
delete m_denominator;
|
||||
delete m_numerator;
|
||||
}
|
||||
|
||||
void FractionLayout::render(KDPoint origin) {
|
||||
KDCoordinate fractionLineY = m_numerator->size().height + FRACTION_LINE_MARGIN;
|
||||
|
||||
KDDrawLine((KDPoint){.x = 0, .y = fractionLineY},
|
||||
(KDPoint){.x = size().width, .y = fractionLineY});
|
||||
}
|
||||
|
||||
KDSize FractionLayout::computeSize() {
|
||||
KDSize s;
|
||||
s.width = max(m_numerator->size().width, m_denominator->size().width) + 2*FRACTION_BORDER_LENGTH;
|
||||
s.height = m_numerator->size().height + FRACTION_LINE_MARGIN + FRACTION_LINE_HEIGHT + FRACTION_LINE_MARGIN + m_denominator->size().height;
|
||||
return s;
|
||||
}
|
||||
|
||||
ExpressionLayout * FractionLayout::child(uint16_t index) {
|
||||
@@ -26,30 +47,16 @@ ExpressionLayout * FractionLayout::child(uint16_t index) {
|
||||
}
|
||||
}
|
||||
|
||||
void FractionLayout::positionChildren() {
|
||||
/*
|
||||
m_numerator->m_frame.origin.x = (KDCoordinate)((m_frame.width - numFrame.width)/2);
|
||||
m_numerator->m_frame.origin.y = 0;
|
||||
|
||||
m_denominator->m_frame.origin.x = (KDCoordinate)((m_frame.width - denFrame.width)/2);
|
||||
m_denominator->m_frame.origin.y = (KDCoordinate)(numFrame.height + 2*FRACTION_LINE_MARGIN + FRACTION_LINE_HEIGHT);
|
||||
*/
|
||||
}
|
||||
|
||||
void FractionLayout::computeSize() {
|
||||
/*
|
||||
m_frame.width = max(numFrame.width, denFrame.width) + 2*FRACTION_BORDER_LENGTH;
|
||||
m_frame.height = numFrame.height + FRACTION_LINE_MARGIN + FRACTION_LINE_HEIGHT + FRACTION_LINE_MARGIN + denFrame.height;
|
||||
*/
|
||||
}
|
||||
|
||||
|
||||
void FractionLayout::draw() {
|
||||
m_numerator->draw();
|
||||
m_denominator->draw();
|
||||
|
||||
KDCoordinate fractionLineY = m_numerator->m_frame.height + FRACTION_LINE_MARGIN;
|
||||
|
||||
KDDrawLine((KDPoint){.x = 0, .y = fractionLineY},
|
||||
(KDPoint){.x = m_frame.width, .y = fractionLineY});
|
||||
KDPoint FractionLayout::positionOfChild(ExpressionLayout * child) {
|
||||
KDPoint p;
|
||||
if (child == m_numerator) {
|
||||
p.x = (KDCoordinate)((size().width - m_numerator->size().width)/2);
|
||||
p.y = 0;
|
||||
} else if (child == m_denominator) {
|
||||
p.x = (KDCoordinate)((size().width - m_denominator->size().width)/2);
|
||||
p.y = (KDCoordinate)(size().height + 2*FRACTION_LINE_MARGIN + FRACTION_LINE_HEIGHT);
|
||||
} else {
|
||||
assert(false); // Should not happen
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
@@ -6,11 +6,13 @@
|
||||
|
||||
class FractionLayout : public ExpressionLayout {
|
||||
public:
|
||||
FractionLayout(Expression * numerator, Expression * denominator);
|
||||
FractionLayout(ExpressionLayout * parent, Expression * numerator, Expression * denominator);
|
||||
~FractionLayout();
|
||||
protected:
|
||||
void render(KDPoint origin) override;
|
||||
KDSize computeSize() override;
|
||||
ExpressionLayout * child(uint16_t index) override;
|
||||
void draw() override;
|
||||
void positionChildren() override;
|
||||
void computeSize() override;
|
||||
KDPoint positionOfChild(ExpressionLayout * child) override;
|
||||
private:
|
||||
ExpressionLayout * m_numerator;
|
||||
ExpressionLayout * m_denominator;
|
||||
|
||||
Reference in New Issue
Block a user