[poincare] Factorize bracket pair rendering

Change-Id: I80f2d04c8833352f4097bcfdcf90b5ec147dc19f
This commit is contained in:
Hugo Saint-Vignes
2020-07-23 16:18:52 +02:00
committed by Émilie Feral
parent 3aa5e8bcd6
commit 2512425868
3 changed files with 37 additions and 31 deletions

View File

@@ -44,13 +44,18 @@ private:
constexpr static KDCoordinate k_bracketWidth = 5;
constexpr static KDCoordinate k_lineThickness = 1;
constexpr static KDCoordinate k_verticalMargin = 1;
KDCoordinate externWidthMargin() const { return k_externWidthMargin; }
constexpr static bool k_renderTopBar = true;
constexpr static bool k_renderBottomBar = true;
constexpr static bool k_renderDoubleBar = false;
virtual KDCoordinate externWidthMargin() const { return k_externWidthMargin; }
virtual KDCoordinate widthMargin() const { return k_widthMargin; }
virtual KDCoordinate verticalExternMargin() const { return k_verticalExternMargin; }
virtual bool renderTopBar() const { return true; }
virtual bool renderBottomBar() const { return true; }
virtual bool renderDoubleBar() const { return false; }
virtual KDCoordinate verticalMargin() const { return k_verticalMargin; }
virtual bool renderTopBar() const { return k_renderTopBar; }
virtual bool renderBottomBar() const { return k_renderBottomBar; }
virtual bool renderDoubleBar() const { return k_renderDoubleBar; }
void render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor, Layout * selectionStart = nullptr, Layout * selectionEnd = nullptr, KDColor selectionColor = KDColorRed) override;
static void renderWithParameters(KDSize childSize, KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor, KDCoordinate verticalMargin, KDCoordinate externWidthMargin, KDCoordinate verticalExternMargin, KDCoordinate widthMargin, bool renderTopBar, bool renderBottomBar, bool renderDoubleBar);
};
}

View File

@@ -29,6 +29,7 @@ public:
private:
KDCoordinate widthMargin() const override { return 2; }
KDCoordinate verticalMargin() const override { return 0; }
KDCoordinate verticalExternMargin() const override { return 1; }
bool renderTopBar() const override { return false; }
bool renderBottomBar() const override { return false; }

View File

@@ -10,17 +10,7 @@ extern "C" {
namespace Poincare {
void BracketPairLayoutNode::RenderWithChildSize(KDSize childSize, KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) {
KDCoordinate verticalBarHeight = childSize.height() + 2*k_verticalMargin;
ctx->fillRect(KDRect(p.x()+k_externWidthMargin, p.y()+k_verticalExternMargin, k_lineThickness, verticalBarHeight), expressionColor);
ctx->fillRect(KDRect(p.x()+k_externWidthMargin+childSize.width()+2*k_widthMargin+k_lineThickness, p.y()+k_verticalExternMargin, k_lineThickness, verticalBarHeight), expressionColor);
// Render top bar
ctx->fillRect(KDRect(p.x()+k_externWidthMargin, p.y()+k_verticalExternMargin, k_bracketWidth, k_lineThickness), expressionColor);
ctx->fillRect(KDRect(p.x()+k_externWidthMargin+2*k_lineThickness+childSize.width()+2*k_widthMargin-k_bracketWidth, p.y()+k_verticalExternMargin, k_bracketWidth, k_lineThickness), expressionColor);
// Render bottom bar
ctx->fillRect(KDRect(p.x()+k_externWidthMargin, p.y()+k_verticalExternMargin+verticalBarHeight-k_lineThickness, k_bracketWidth, k_lineThickness), expressionColor);
ctx->fillRect(KDRect(p.x()+k_externWidthMargin+2*k_lineThickness+childSize.width()+2*k_widthMargin-k_bracketWidth, p.y()+k_verticalExternMargin+verticalBarHeight-k_lineThickness, k_bracketWidth, k_lineThickness), expressionColor);
renderWithParameters(childSize, ctx, p, expressionColor, backgroundColor, k_verticalMargin, k_externWidthMargin, k_verticalExternMargin, k_widthMargin, k_renderTopBar, k_renderBottomBar, k_renderDoubleBar);
}
void BracketPairLayoutNode::moveCursorLeft(LayoutCursor * cursor, bool * shouldRecomputeLayout, bool forSelection) {
@@ -112,32 +102,42 @@ int BracketPairLayoutNode::serialize(char * buffer, int bufferSize, Preferences:
}
void BracketPairLayoutNode::render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor, Layout * selectionStart, Layout * selectionEnd, KDColor selectionColor) {
KDSize childSize = childLayout()->layoutSize();
KDCoordinate verticalBarHeight = childSize.height() + 2*k_verticalMargin;
KDCoordinate horizontalPosition = p.x() + externWidthMargin();
KDCoordinate verticalPosition = p.y() + verticalExternMargin();
if (renderDoubleBar()) {
renderWithParameters(childLayout()->layoutSize(), ctx, p, expressionColor, backgroundColor, verticalMargin(), externWidthMargin(), verticalExternMargin(), widthMargin(), renderTopBar(), renderBottomBar(), renderDoubleBar());
}
void BracketPairLayoutNode::renderWithParameters(KDSize childSize, KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor, KDCoordinate verticalMargin, KDCoordinate externWidthMargin, KDCoordinate verticalExternMargin, KDCoordinate widthMargin, bool renderTopBar, bool renderBottomBar, bool renderDoubleBar) {
// This function allow rendering with either static or virtual parameters
KDCoordinate verticalBarHeight = childSize.height() + 2 * verticalMargin;
KDCoordinate horizontalPosition = p.x() + externWidthMargin;
KDCoordinate verticalPosition = p.y() + verticalExternMargin;
if (renderDoubleBar) {
ctx->fillRect(KDRect(horizontalPosition, verticalPosition, k_lineThickness, verticalBarHeight), expressionColor);
horizontalPosition += k_lineThickness + widthMargin();
horizontalPosition += k_lineThickness + widthMargin;
}
ctx->fillRect(KDRect(horizontalPosition, verticalPosition, k_lineThickness, verticalBarHeight), expressionColor);
if (renderTopBar()) {
if (renderTopBar) {
ctx->fillRect(KDRect(horizontalPosition, verticalPosition, k_bracketWidth, k_lineThickness), expressionColor);
}
if (renderBottomBar()) {
if (renderBottomBar) {
ctx->fillRect(KDRect(horizontalPosition, verticalPosition + verticalBarHeight - k_lineThickness, k_bracketWidth, k_lineThickness), expressionColor);
}
horizontalPosition += k_lineThickness + widthMargin() + childSize.width() + widthMargin();
horizontalPosition += k_lineThickness + widthMargin + childSize.width() + widthMargin;
ctx->fillRect(KDRect(horizontalPosition, verticalPosition, k_lineThickness, verticalBarHeight), expressionColor);
horizontalPosition += k_lineThickness;
if (renderTopBar()) {
if (renderTopBar) {
ctx->fillRect(KDRect(horizontalPosition - k_bracketWidth, verticalPosition, k_bracketWidth, k_lineThickness), expressionColor);
}
if (renderBottomBar()) {
if (renderBottomBar) {
ctx->fillRect(KDRect(horizontalPosition - k_bracketWidth, verticalPosition + verticalBarHeight - k_lineThickness, k_bracketWidth, k_lineThickness), expressionColor);
}
if (renderDoubleBar()) {
horizontalPosition += widthMargin();
if (renderDoubleBar) {
horizontalPosition += widthMargin;
ctx->fillRect(KDRect(horizontalPosition, verticalPosition, k_lineThickness, verticalBarHeight), expressionColor);
}
}
@@ -148,11 +148,11 @@ KDSize BracketPairLayoutNode::computeSize() {
if (renderDoubleBar()) {
horizontalCoordinates += 2*k_lineThickness + 2*widthMargin();
}
return KDSize(horizontalCoordinates, childSize.height() + 2 * k_verticalMargin + 2*verticalExternMargin());
return KDSize(horizontalCoordinates, childSize.height() + 2*verticalMargin() + 2*verticalExternMargin());
}
KDCoordinate BracketPairLayoutNode::computeBaseline() {
return childLayout()->baseline() + k_verticalMargin + verticalExternMargin();
return childLayout()->baseline() + verticalMargin() + verticalExternMargin();
}
KDPoint BracketPairLayoutNode::positionOfChild(LayoutNode * child) {
@@ -161,7 +161,7 @@ KDPoint BracketPairLayoutNode::positionOfChild(LayoutNode * child) {
if (renderDoubleBar()) {
horizontalCoordinates += k_lineThickness + widthMargin();
}
return KDPoint(horizontalCoordinates, k_verticalMargin + verticalExternMargin());
return KDPoint(horizontalCoordinates, verticalMargin() + verticalExternMargin());
}
}