[escher] Add a class BurgerMenuView

This commit is contained in:
Émilie Feral
2019-10-15 11:04:18 +02:00
committed by Léa Saviot
parent bb8bf9862c
commit 8915148e72
4 changed files with 74 additions and 0 deletions

View File

@@ -5,6 +5,7 @@ escher_src += $(addprefix escher/src/,\
app.cpp \
bank_view_controller.cpp \
buffer_text_view.cpp \
burger_menu_view.cpp \
button.cpp \
button_row_controller.cpp \
chevron_view.cpp \

View File

@@ -5,6 +5,7 @@
#include <escher/alternate_empty_view_delegate.h>
#include <escher/bank_view_controller.h>
#include <escher/buffer_text_view.h>
#include <escher/burger_menu_view.h>
#include <escher/button.h>
#include <escher/button_row_controller.h>
#include <escher/chevron_view.h>

View File

@@ -0,0 +1,17 @@
#ifndef ESCHER_BURGER_MENU_VIEW_H
#define ESCHER_BURGER_MENU_VIEW_H
#include <escher/view.h>
class BurgerMenuView : public View {
public:
BurgerMenuView() : m_backgroundColor(KDColorWhite) {}
void drawRect(KDContext * ctx, KDRect rect) const override;
KDSize minimalSizeForOptimalDisplay() const override;
void setBackgroundColor(KDColor color);
constexpr static KDCoordinate k_burgerSize = 13;
private:
KDColor m_backgroundColor;
};
#endif

View File

@@ -0,0 +1,55 @@
#include <escher/burger_menu_view.h>
#include <kandinsky/color.h>
const uint8_t sBurgerMask[BurgerMenuView::k_burgerSize][BurgerMenuView::k_burgerSize] = {
{0xFF, 0xFF, 0xFF, 0xE0, 0xA5, 0x83, 0x76, 0x83, 0xA5, 0xE0, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFD, 0xAF, 0x84, 0xC8, 0xF0, 0xFC, 0xF0, 0xC8, 0x84, 0xAF, 0xFC, 0xFF},
{0xFF, 0xAC, 0x9C, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x9C, 0xAC, 0xFF},
{0xE1, 0x86, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x86, 0xE1},
{0xA6, 0xC8, 0xFF, 0xFF, 0x73, 0x73, 0x73, 0x73, 0x73, 0xFF, 0xFF, 0xC8, 0xA5},
{0x81, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x82},
{0x73, 0xFC, 0xFF, 0xFF, 0x73, 0x73, 0x73, 0x73, 0x73, 0xFF, 0xFF, 0xFC, 0x76},
{0x81, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0x82},
{0xA5, 0xC8, 0xFF, 0xFF, 0x73, 0x73, 0x73, 0x73, 0x73, 0xFF, 0xFF, 0xC8, 0xA5},
{0xE0, 0x87, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x86, 0xE0},
{0xFF, 0xB0, 0x9D, 0xF8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, 0x9D, 0xB0, 0xFF},
{0xFF, 0xFC, 0xAF, 0x85, 0xC8, 0xF0, 0xFC, 0xF0, 0xC8, 0x85, 0xAF, 0xFC, 0xFF},
{0xFF, 0xFF, 0xFF, 0xE0, 0xA5, 0x82, 0x76, 0x82, 0xA5, 0xE0, 0xFF, 0xFF, 0xFF}
};
const uint8_t sCircleMask[BurgerMenuView::k_burgerSize][BurgerMenuView::k_burgerSize] = {
{0xFF, 0xFE, 0xDD, 0x94, 0x4E, 0x1D, 0x03, 0x03, 0x1D, 0x4E, 0x94, 0xDD, 0xFE},
{0xFF, 0xDD, 0x7D, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x7D, 0xDD},
{0xF2, 0x94, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x94},
{0xCC, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E},
{0xA5, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D},
{0x91, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03},
{0x91, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03},
{0xA5, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D},
{0xCC, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E},
{0xF2, 0x94, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x94},
{0xFF, 0xDD, 0x7D, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x7D, 0xDD},
{0xFF, 0xFE, 0xDD, 0x94, 0x4E, 0x1D, 0x03, 0x03, 0x1D, 0x4E, 0x94, 0xDD, 0xFE},
{0xFF, 0xFF, 0xFF, 0xF2, 0xCC, 0xA5, 0x91, 0x91, 0xA4, 0xCC, 0xF2, 0xFF, 0xFF}
};
KDColor sBurgerWorkingBuffer[BurgerMenuView::k_burgerSize*BurgerMenuView::k_burgerSize];
void BurgerMenuView::drawRect(KDContext * ctx, KDRect rect) const {
/* Draw the burger vertically and horizontally centered in the view. */
KDCoordinate widthCenter = bounds().width()/2;
KDCoordinate heightCenter = bounds().height()/2;
KDCoordinate burgerHalfSize = k_burgerSize/2;
KDRect frame(widthCenter - burgerHalfSize, heightCenter - burgerHalfSize, k_burgerSize, k_burgerSize);
ctx->blendRectWithMask(frame, m_backgroundColor, (const uint8_t *)sCircleMask, sBurgerWorkingBuffer);
ctx->blendRectWithMask(frame, KDColorBlack, (const uint8_t *)sBurgerMask, sBurgerWorkingBuffer);
}
KDSize BurgerMenuView::minimalSizeForOptimalDisplay() const {
return KDSize(k_burgerSize, k_burgerSize);
}
void BurgerMenuView::setBackgroundColor(KDColor color) {
m_backgroundColor = color;
markRectAsDirty(bounds());
}