diff --git a/escher/Makefile b/escher/Makefile index f2b3161aa..2e44c34d9 100644 --- a/escher/Makefile +++ b/escher/Makefile @@ -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 \ diff --git a/escher/include/escher.h b/escher/include/escher.h index 334325de2..780a670ca 100644 --- a/escher/include/escher.h +++ b/escher/include/escher.h @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include diff --git a/escher/include/escher/burger_menu_view.h b/escher/include/escher/burger_menu_view.h new file mode 100644 index 000000000..df457f2ea --- /dev/null +++ b/escher/include/escher/burger_menu_view.h @@ -0,0 +1,17 @@ +#ifndef ESCHER_BURGER_MENU_VIEW_H +#define ESCHER_BURGER_MENU_VIEW_H + +#include + +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 diff --git a/escher/src/burger_menu_view.cpp b/escher/src/burger_menu_view.cpp new file mode 100644 index 000000000..3246edac1 --- /dev/null +++ b/escher/src/burger_menu_view.cpp @@ -0,0 +1,55 @@ +#include +#include + +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()); +}