From 24d6e756eea34f72b19922c535a3f79cc838ebe5 Mon Sep 17 00:00:00 2001 From: jedi Date: Wed, 24 Feb 2021 20:37:27 +0100 Subject: [PATCH] refactor naming --- .gitignore | 7 ++ OBJECTS | 2 +- inc/buttons.h | 43 +++++----- inc/example.h | 39 +++++---- inc/fonts/basic_5x4.h | 10 +-- inc/gfx/Buffer.h | 54 +++++++++++++ inc/gfx/Canvas.h | 42 ++++++++++ inc/gfx/Font.h | 27 +++++++ inc/gfx/Layout.h | 49 ++++++++++++ inc/gfx/Screen.h | 38 +++++++++ inc/gfx/buffer.h | 55 ------------- inc/gfx/canvas.h | 42 ---------- inc/gfx/font.h | 22 ------ inc/gfx/layout.h | 51 ------------ inc/gfx/screen.h | 34 -------- inc/node.h | 122 +++++++++++++++-------------- linux.Makefile | 5 +- src/buttons.cpp | 16 ++-- src/example.cpp | 13 +-- src/fonts/basic_5x4.cpp | 10 ++- src/gfx/{buffer.cpp => Buffer.cpp} | 6 +- src/gfx/Font.cpp | 34 ++++++++ src/gfx/Layout.cpp | 71 +++++++++++++++++ src/gfx/Screen.cpp | 29 +++++++ src/gfx/canvas.cpp | 52 ++++++------ src/gfx/font.cpp | 31 -------- src/gfx/layout.cpp | 66 ---------------- src/gfx/screen.cpp | 33 -------- src/hal/linux.cpp | 16 ++-- src/main.cpp | 84 ++++++++++---------- 30 files changed, 569 insertions(+), 534 deletions(-) create mode 100644 .gitignore create mode 100644 inc/gfx/Buffer.h create mode 100644 inc/gfx/Canvas.h create mode 100644 inc/gfx/Font.h create mode 100644 inc/gfx/Layout.h create mode 100644 inc/gfx/Screen.h delete mode 100644 inc/gfx/buffer.h delete mode 100644 inc/gfx/canvas.h delete mode 100644 inc/gfx/font.h delete mode 100644 inc/gfx/layout.h delete mode 100644 inc/gfx/screen.h rename src/gfx/{buffer.cpp => Buffer.cpp} (61%) create mode 100644 src/gfx/Font.cpp create mode 100644 src/gfx/Layout.cpp create mode 100644 src/gfx/Screen.cpp delete mode 100644 src/gfx/font.cpp delete mode 100644 src/gfx/layout.cpp delete mode 100644 src/gfx/screen.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a5b6917 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +build/* +lib/* +deps/* +.idea/* +cmake-build-debug/* +CMakeLists.txt +compile_commands.json diff --git a/OBJECTS b/OBJECTS index b8c836d..5f8ba0d 100644 --- a/OBJECTS +++ b/OBJECTS @@ -1,7 +1,7 @@ TARGET = main SRC = hal.cpp main.cpp example.cpp buttons.cpp -SRC += gfx/screen.cpp gfx/canvas.cpp gfx/font.cpp gfx/layout.cpp gfx/buffer.cpp +SRC += gfx/Screen.cpp gfx/Canvas.cpp gfx/Font.cpp gfx/Layout.cpp gfx/Buffer.cpp SRC += fonts/basic_5x4.cpp diff --git a/inc/buttons.h b/inc/buttons.h index 549cdea..1ff106d 100644 --- a/inc/buttons.h +++ b/inc/buttons.h @@ -2,27 +2,30 @@ // Created by jedi on 11/6/18. // -#ifndef MGL_DMXMENU_INPUT_H -#define MGL_DMXMENU_INPUT_H +#pragma once + +namespace micromenu { + + enum direction { + I_LEFT = 0, + I_RIGHT, + I_UP, + I_DOWN + }; + + class buttons { + private: + static void onPush(direction id, bool state); + + public: + bool raw[4] = {false, false, false, false}; + bool last[4] = {false, false, false, false}; + + void poll(); + }; - -#define I_LEFT 0 -#define I_RIGHT 1 -#define I_UP 2 -#define I_DOWN 3 + extern buttons input; -class buttons { -private: - void onPush(int id, bool state); -public: - bool raw[4]={false,false, false, false}; - bool last[4]={false,false, false, false}; - void poll(); -}; - - -extern buttons input; - -#endif //MGL_DMXMENU_INPUT_H +} diff --git a/inc/example.h b/inc/example.h index 7486609..88bfdea 100644 --- a/inc/example.h +++ b/inc/example.h @@ -2,33 +2,38 @@ #ifndef _EXAMPLE_H_ #define _EXAMPLE_H_ -#include "gfx/canvas.h" +#include "gfx/Canvas.h" #include "node.h" -class menu : public node { -public: - template - menu(Args ... ns) : node(ns...) { - } +using canvas = micromenu::Canvas; +using node = micromenu::node; +using value = micromenu::value; - void render(canvas &c); +class menu : public node { + public: + template + explicit menu(Args ... ns) : node(ns...) { + } + + void render(canvas &c) override; }; class fooValue : public value { -public: - fooValue(const char* str, int val) : value(str, val, 32, 48) { - } + public: + fooValue(const char *str, int val) : value(str, val, 32, 48) { + } - void render(canvas &c); + void render(canvas &c) override; }; -class blubValue : public value{ -public: - template - blubValue(Args ... ns) : value(ns..., 64, 96) { - } - void render(canvas& c); +class blubValue : public value { + public: + template + explicit blubValue(Args ... ns) : value(ns..., 64, 96) { + } + + void render(canvas &c) override; }; #endif diff --git a/inc/fonts/basic_5x4.h b/inc/fonts/basic_5x4.h index a011b45..72d17da 100644 --- a/inc/fonts/basic_5x4.h +++ b/inc/fonts/basic_5x4.h @@ -2,11 +2,11 @@ // Created by jedi on 11/2/18. // -#ifndef MGL_DMXMENU_BASIC_5X4_H -#define MGL_DMXMENU_BASIC_5X4_H +#pragma once -#include "gfx/font.h" +#include "gfx/Font.h" -extern font basic_5x4; +namespace micromenu { + extern Font basic_5x4; +} -#endif //MGL_DMXMENU_BASIC_5X4_H diff --git a/inc/gfx/Buffer.h b/inc/gfx/Buffer.h new file mode 100644 index 0000000..be4a46d --- /dev/null +++ b/inc/gfx/Buffer.h @@ -0,0 +1,54 @@ +// +// Created by jedi on 11/2/18. +// + + +#include +#include + +namespace micromenu { + + enum bufferBlocks { + _1bit = 1, _2bit = 2, _4bit = 4, _8bit = 8, _16bit = 16, _24bit = 24, _32bit = 32 + }; + + template + class Buffer { + private: + int *ptr_; + int size_; + constexpr static const int block_ = 8 * sizeof(int); + public: + Buffer(int size) : size_(size) { + ptr_ = (int *) malloc(size * N / 8); + } + + int get(int i) { + if(i >= size_) return 0; + return ptr_[i * N / block_] & ((1 << N) - 1) << (i * N % block_); + } + + int getBlock(int i) { + if(i >= size_) return 0; + return ptr_[i * N / block_]; + } + + void set(int i, int v) { + if(i < size_) { + ptr_[i * N / block_] &= ~(((1 << N) - 1) << (i * N % block_)); + ptr_[i * N / block_] |= (((1 << N) - 1) & v) << (i * N % block_); + } + } + + ~Buffer() { + free(ptr_); + } + }; + + template<> + int Buffer<_32bit>::get(int i); + + template<> + void Buffer<_32bit>::set(int i, int v); + +} \ No newline at end of file diff --git a/inc/gfx/Canvas.h b/inc/gfx/Canvas.h new file mode 100644 index 0000000..86ada3b --- /dev/null +++ b/inc/gfx/Canvas.h @@ -0,0 +1,42 @@ +// +// Created by jedi on 11/1/18. +// + +#pragma once + +#include "hal/hal.h" +#include "gfx/Font.h" +#include "fonts/basic_5x4.h" +#include "gfx/Buffer.h" + +namespace micromenu { + + class Screen; + + class Canvas { + private: + const int width_; + const int height_; + Buffer<_1bit> buffer_; + + void draw_onto_(Screen &); + + public: + Canvas(int w, int h); + + void clear(); + + void draw(int x, int y, bool inv = false); + + void print(int x, int y, const char *str, bool inv = false, Font & = basic_5x4); + + void print(int x, int y, char *str, bool inv = false, Font & = basic_5x4); + + int getWidth(); + + int getHeight(); + + friend Screen; + }; + +} diff --git a/inc/gfx/Font.h b/inc/gfx/Font.h new file mode 100644 index 0000000..7352f43 --- /dev/null +++ b/inc/gfx/Font.h @@ -0,0 +1,27 @@ +// +// Created by jedi on 11/1/18. +// + +#pragma once + +namespace micromenu { + + class Canvas; + + class Font { + public: + typedef const bool raw_font[32][20]; + private: + raw_font &raw_data_; + public: + explicit Font(raw_font &) noexcept; + + void print(int x, int y, char c, Canvas &, bool inv = false); + + void print(int x, int y, char *str, Canvas &, bool inv = false); + + void print(int x, int y, const char *str, Canvas &, bool inv = false); + }; + +} + diff --git a/inc/gfx/Layout.h b/inc/gfx/Layout.h new file mode 100644 index 0000000..2bab30c --- /dev/null +++ b/inc/gfx/Layout.h @@ -0,0 +1,49 @@ +// +// Created by jedi on 11/5/18. +// + +#pragma once + +#include "gfx/Canvas.h" +#include "gfx/Screen.h" + +namespace micromenu { + + class Layout { + class Slot { + private: + int pos_ = 0; + int size_ = 0; + Canvas *canvas_ = nullptr; + public: + node *content = nullptr; + friend Layout; + }; + + private: + const int maxwidth_; + const int maxheight_; + int allocated_ = 0; + Screen &screen_; + + int allocate_(node *, int); + + int expand_(int); + + int pack_(int); + + public: + static const int maxslots = 10; + Slot slots[maxslots]; + node *cursor = nullptr; + + explicit Layout(Screen &s) noexcept: maxwidth_(s.getWidth()), maxheight_(s.getHeight()), screen_(s) { + + } + + int apply(node *); + + void render(); + }; + +} diff --git a/inc/gfx/Screen.h b/inc/gfx/Screen.h new file mode 100644 index 0000000..da244b4 --- /dev/null +++ b/inc/gfx/Screen.h @@ -0,0 +1,38 @@ +// +// Created by jedi on 11/1/18. +// + +#pragma once + +#include "hal/hal.h" +#include "gfx/Canvas.h" + +namespace micromenu { + + class Screen { + private: + const int width_; + const int height_; + + public: + explicit Screen(int w, int h) noexcept; + + void draw(int x, int y); + + void draw(int x, int y, Canvas &c); + + void print(int x, int y, const char *str, Font & = basic_5x4); + + void print(int x, int y, char *str, Font & = basic_5x4); + + [[nodiscard]] int getWidth() const{ + return width_; + } + + [[nodiscard]] int getHeight() const{ + return height_; + } + + }; + +} diff --git a/inc/gfx/buffer.h b/inc/gfx/buffer.h deleted file mode 100644 index 19263aa..0000000 --- a/inc/gfx/buffer.h +++ /dev/null @@ -1,55 +0,0 @@ -// -// Created by jedi on 11/2/18. -// - -#ifndef MGL_DMXMENU_BUFFER_1_H -#define MGL_DMXMENU_BUFFER_1_H - - -#include -#include - -enum bufferBlocks{ - _1bit = 1, _2bit = 2, _4bit = 4, _8bit = 8, _16bit = 16, _24bit = 24, _32bit = 32 -}; - -template -class buffer { -private: - int *ptr_; - int size_; - constexpr static const int block_ = 8 * sizeof(int); -public: - buffer(int size) : size_(size) { - ptr_ = (int *) malloc(size * N / 8); - } - - int get(int i) { - if (i >= size_) return 0; - return ptr_[i*N/block_] & ((1<= size_) return 0; - return ptr_[i*N/block_]; - } - - void set(int i, int v) { - if (i < size_) { - ptr_[i*N/block_] &= ~(((1< -int buffer<_32bit>::get(int i); - -template <> -void buffer<_32bit>::set(int i, int v); - -#endif //MGL_DMXMENU_BUFFER_1_H diff --git a/inc/gfx/canvas.h b/inc/gfx/canvas.h deleted file mode 100644 index 5171db1..0000000 --- a/inc/gfx/canvas.h +++ /dev/null @@ -1,42 +0,0 @@ -// -// Created by jedi on 11/1/18. -// - -#ifndef MGL_DMXMENU_CANVAS_H -#define MGL_DMXMENU_CANVAS_H - -#include "hal/hal.h" -#include "gfx/font.h" -#include "fonts/basic_5x4.h" -#include "gfx/buffer.h" - -class screen; - -class canvas { -private: - const int width_; - const int height_; - buffer<_1bit> buffer_; - - void draw_onto_(screen &); - -public: - canvas(int w, int h); - - void clear(); - - void draw(int x, int y, bool inv = false); - - void print(int x, int y, const char *str, bool inv = 0, font & = basic_5x4); - - void print(int x, int y, char *str, bool inv = 0, font & = basic_5x4); - - int getWidth(); - - int getHeight(); - - friend screen; -}; - - -#endif //MGL_DMXMENU_CANVAS_H diff --git a/inc/gfx/font.h b/inc/gfx/font.h deleted file mode 100644 index 8dffc87..0000000 --- a/inc/gfx/font.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// Created by jedi on 11/1/18. -// - -#ifndef MGL_DMXMENU_FONT_H -#define MGL_DMXMENU_FONT_H - -class canvas; - -class font { -public: - typedef const bool raw_font[32][20]; -private: - raw_font& raw_data_; -public: - font(raw_font&); - void print(int x, int y, char c, canvas&, bool inv = 0); - void print(int x, int y, char* str, canvas&, bool inv = 0); - void print(int x, int y, const char* str, canvas&, bool inv = 0); -}; - -#endif //MGL_DMXMENU_FONT_H diff --git a/inc/gfx/layout.h b/inc/gfx/layout.h deleted file mode 100644 index 0de8ff8..0000000 --- a/inc/gfx/layout.h +++ /dev/null @@ -1,51 +0,0 @@ -// -// Created by jedi on 11/5/18. -// - -#ifndef MGL_DMXMENU_LAYOUT_H -#define MGL_DMXMENU_LAYOUT_H - -#include "gfx/canvas.h" -#include "gfx/screen.h" - -class layout { - class Slot { - private: - int pos_ = 0; - int size_ = 0; - canvas *canvas_ = nullptr; - public: - node *content = nullptr; - friend layout; - }; - -private: - const int maxwidth_; - const int maxheight_; - int allocated_; - screen& screen_; - - int allocate_(node *, int); - - int expand_(int); - - int pack_(int); - - -public: - static const int maxslots = 10; - Slot slots[maxslots]; - node *cursor; - - layout(screen& s) : maxwidth_(s.getWidth()), maxheight_(s.getHeight()), screen_(s) { - - } - - int apply(node *); - - void render(); -}; - - - -#endif //MGL_DMXMENU_LAYOUT_H diff --git a/inc/gfx/screen.h b/inc/gfx/screen.h deleted file mode 100644 index d6e2d7e..0000000 --- a/inc/gfx/screen.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// Created by jedi on 11/1/18. -// - -#ifndef MGL_DMXMENU_SCREEN_H -#define MGL_DMXMENU_SCREEN_H - -#include "hal/hal.h" -#include "gfx/canvas.h" - -class screen { -private: - const int width_; - const int height_; - -public: - screen(int w, int h); - - void draw(int x, int y); - - void draw(int x, int y, canvas &c); - - void print(int x, int y, const char *str, font & = basic_5x4); - - void print(int x, int y, char *str, font & = basic_5x4); - - int getWidth(); - - int getHeight(); - -}; - - -#endif //MGL_DMXMENU_SCREEN_H diff --git a/inc/node.h b/inc/node.h index 429434a..e4a7fdf 100644 --- a/inc/node.h +++ b/inc/node.h @@ -2,82 +2,84 @@ // Created by jedi on 11/5/18. // -#ifndef MGL_DMXMENU_NODE_H -#define MGL_DMXMENU_NODE_H +#pragma once -#include "gfx/canvas.h" +#include "gfx/Canvas.h" -class node { -private: - node *parent_ = nullptr; - node *child_ = nullptr; - node *cursor_ = nullptr; - node *next_ = nullptr; +namespace micromenu { - void addNodes(bool b) { - } + class node { + private: + node *parent_ = nullptr; + node *child_ = nullptr; + node *cursor_ = nullptr; + node *next_ = nullptr; - template - void addNodes(bool b, node *n, Us ... ns) { - next_ = n; - next_->parent_ = parent_; - next_->addNodes(!b, ns...); - } + void addNodes(bool b) { + } -public: - const char *title_ = 0; - const int minsize; - const int maxsize; + template + void addNodes(bool b, node *n, Us ... ns) { + next_ = n; + next_->parent_ = parent_; + next_->addNodes(!b, ns...); + } - virtual void render(canvas &c) = 0; + public: + const char *title_ = 0; + const int minsize; + const int maxsize; - explicit node(int min = 24, int max = 48) : next_(nullptr), child_(nullptr), parent_(nullptr), minsize(min), - maxsize(max) { - } + virtual void render(Canvas &c) = 0; - explicit node(const char *t, int min = 24, int max = 48) : title_(t), minsize(min), maxsize(max), next_(nullptr), - child_(nullptr), - parent_(nullptr) { - } + explicit node(int min = 24, int max = 48) : next_(nullptr), child_(nullptr), parent_(nullptr), minsize(min), + maxsize(max) { + } - template - node(const char *t, node *n, Args ... ns) : title_(t), minsize(24), maxsize(48) { - child_ = n; - cursor_ = n; - n->parent_ = this; - child_->addNodes(true, ns...); - } + explicit node(const char *t, int min = 24, int max = 48) : title_(t), minsize(min), maxsize(max), + next_(nullptr), + child_(nullptr), + parent_(nullptr) { + } - node *getChild() { - return child_; - } + template + node(const char *t, node *n, Args ... ns) : title_(t), minsize(24), maxsize(48) { + child_ = n; + cursor_ = n; + n->parent_ = this; + child_->addNodes(true, ns...); + } - node *getNext() { - return next_; - } + node *getChild() { + return child_; + } - node *getCursor() { - return cursor_; - } + node *getNext() { + return next_; + } - node *getParent() { - return parent_; - } + node *getCursor() { + return cursor_; + } - void setCursor(node *c) { - cursor_ = c; - } -}; + node *getParent() { + return parent_; + } + + void setCursor(node *c) { + cursor_ = c; + } + }; -class value: public node { -public: - const char *header; - int state; + class value : public node { + public: + const char *header; + int state; - value(const char *t, int val, int min = 64, int max = 96) : node(t, min, max), header(t), state(val) { - } -}; + value(const char *t, int val, int min = 64, int max = 96) : node(t, min, max), header(t), state(val) { + } + }; -#endif //MGL_DMXMENU_NODE_H +} \ No newline at end of file diff --git a/linux.Makefile b/linux.Makefile index f6f1ca3..ab30fb0 100644 --- a/linux.Makefile +++ b/linux.Makefile @@ -8,7 +8,8 @@ OBJ = $(SRC_PATH:$(SRCDIR)/%.cpp=$(OBJDIR)/%.o) REMOVEDIR = rm -rf CFLAGS += -std=gnu99 -CXXFLAGS += -std=c++17 +CXXFLAGS += -std=gnu++20 +LDFLAGS = CFLAGS += -I$(INCDIR) -DLINUX @@ -24,7 +25,7 @@ all: $(OBJDIR)/$(TARGET) .PRECIOUS: $(OBJ) $(OBJDIR)/$(TARGET): $(OBJ) | $(OBJDIR) @echo link $^ - @$(CXX) $(LDFLAGS) -o $@ $^ + $(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) $(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR) @echo compile $< diff --git a/src/buttons.cpp b/src/buttons.cpp index cece779..514ecb5 100644 --- a/src/buttons.cpp +++ b/src/buttons.cpp @@ -5,16 +5,18 @@ #include "hal/hal.h" #include "buttons.h" +namespace micromenu { -buttons input; + buttons input; -void buttons::poll() { - hal_poll_input(raw); + void buttons::poll() { + hal_poll_input(raw); - for(int i = 0; i < 4; i++){ - if(raw[i]!=last[i]){ - onPush(i, raw[i]); - last[i]=raw[i]; + for (int i = 0; i < 4; i++) { + if(raw[i] != last[i]) { + onPush(static_cast(i), raw[i]); + last[i] = raw[i]; + } } } } \ No newline at end of file diff --git a/src/example.cpp b/src/example.cpp index ba272be..dc916a6 100644 --- a/src/example.cpp +++ b/src/example.cpp @@ -1,14 +1,15 @@ -#include "string.h" +#include #include "buttons.h" #include "example.h" #include "node.h" -#include "gfx/canvas.h" +#include "gfx/Canvas.h" char peng[] = {' ', ' ', ' ', ' ', ' ', 0}; int j = 0; + void fooValue::render(canvas& c){ for(int i = 0; i -int buffer<_32bit>::get(int i){ +int Buffer<_32bit>::get(int i){ if (i >= size_) return 0; return ptr_[i]; } template <> -void buffer<_32bit>::set(int i, int v) { +void Buffer<_32bit>::set(int i, int v) { if (i < size_) ptr_[i] = v; } \ No newline at end of file diff --git a/src/gfx/Font.cpp b/src/gfx/Font.cpp new file mode 100644 index 0000000..63d9495 --- /dev/null +++ b/src/gfx/Font.cpp @@ -0,0 +1,34 @@ +// +// Created by jedi on 11/1/18. +// + +#include "gfx/Font.h" +#include "gfx/Canvas.h" + + +namespace micromenu { + + Font::Font(raw_font &raw) noexcept : raw_data_(raw) { + } + + void Font::print(int x, int y, char l, Canvas &c, bool inv) { + int j = (l - ' ') % 32; + for (int x_ = 0; x_ < 4; x_++) + for (int y_ = 0; y_ < 5; y_++) + if(raw_data_[j][x_ + 4 * y_]) + c.draw(x + x_, y + y_, inv); + } + + void Font::print(int x, int y, char *str, Canvas &c, bool inv) { + for (int i = 0; str[i]; i++) { + print(x + i * 5, y, str[i], c, inv); + } + } + + void Font::print(int x, int y, const char *str, Canvas &c, bool inv) { + for (int i = 0; str[i]; i++) { + print(x + i * 5, y, str[i], c, inv); + } + } + +} \ No newline at end of file diff --git a/src/gfx/Layout.cpp b/src/gfx/Layout.cpp new file mode 100644 index 0000000..17f2ae1 --- /dev/null +++ b/src/gfx/Layout.cpp @@ -0,0 +1,71 @@ +// +// Created by jedi on 11/5/18. +// + +#include "node.h" +#include "gfx/Layout.h" + +namespace micromenu { + + void Layout::render() { + for (int j = 0; j < allocated_; j++) { + node *node_ptr; + node_ptr = slots[j].content; + if(node_ptr) { + slots[j].canvas_->clear(); + node_ptr->render(*slots[j].canvas_); + screen_.draw(slots[j].pos_, 0, *slots[j].canvas_); + } + } + } + + int Layout::apply(node *node) { + int rootslot = allocate_(node, maxslots); + int minsize = pack_(rootslot + 1); + expand_(minsize); + if(cursor == nullptr) + cursor = slots[rootslot].content->getCursor(); + return 0; + } + + int Layout::pack_(int usedslots) { + int minsum = 0; + int i; + for (i = 0; i < usedslots; i++) { + if(!slots[i].content) break; + if(minsum + slots[i].content->minsize > maxwidth_) break; + minsum += slots[i].content->minsize; + } + allocated_ = i; + return minsum; + } + + int Layout::expand_(int packedsize) { + int diff = maxwidth_ - packedsize; + int pos = 0; + for (int i = allocated_ - 1; i >= 0; i--) { + slots[i].pos_ = pos; + int size = slots[i].content->minsize + (diff * slots[i].content->minsize) / packedsize; + if(size > slots[i].content->maxsize) + size = slots[i].content->maxsize; + slots[i].size_ = size; + + delete slots[i].canvas_; + slots[i].canvas_ = new Canvas(size, maxheight_); + pos += size; + } + return 0; + } + + int Layout::allocate_(node *current, int depth) { + if(node *next = current->getCursor()) { + int i = allocate_(next, depth) + 1; + slots[i].content = current; + return i; + } else { + slots[0].content = current; + return 0; + } + } + +} \ No newline at end of file diff --git a/src/gfx/Screen.cpp b/src/gfx/Screen.cpp new file mode 100644 index 0000000..1febd8e --- /dev/null +++ b/src/gfx/Screen.cpp @@ -0,0 +1,29 @@ +// +// Created by jedi on 11/1/18. +// + +#include "gfx/Screen.h" + +namespace micromenu { + + Screen::Screen(int w, int h) noexcept: width_(w), height_(h) { + hal_init_screen(w, h); + } + + void Screen::draw(int x, int y, Canvas &c) { + for (int x_ = 0; x_ < c.getWidth(); x_++) + for (int y_ = 0; y_ < c.getHeight(); y_ += 8 * sizeof(int)) + hal_draw(x + x_, y + y_, c.buffer_.getBlock(x_ * c.getHeight() + y_)); + } + + + void Screen::print(int x, int y, const char *str, Font &f) { + //f.print(x, y, str); + } + + void Screen::print(int x, int y, char *str, Font &f) { + //f.print(x, y, str); + } + + +} \ No newline at end of file diff --git a/src/gfx/canvas.cpp b/src/gfx/canvas.cpp index be40489..0ee8358 100644 --- a/src/gfx/canvas.cpp +++ b/src/gfx/canvas.cpp @@ -2,35 +2,39 @@ // Created by jedi on 11/1/18. // -#include "gfx/canvas.h" +#include "gfx/Canvas.h" -canvas::canvas(int w, int h) : width_(w), height_(h), buffer_(w*h) { - clear(); -} +namespace micromenu { -void canvas::clear() { - for (int x = 0; x < width_; x++) - for (int y = 0; y < height_; y++) - buffer_.set(x * height_ + y, false); -} + Canvas::Canvas(int w, int h) : width_(w), height_(h), buffer_(w * h) { + clear(); + } -void canvas::draw(int x, int y, bool inv) { - if (y < height_ && x < width_) - buffer_.set(x * height_ + y, !inv); -} + void Canvas::clear() { + for (int x = 0; x < width_; x++) + for (int y = 0; y < height_; y++) + buffer_.set(x * height_ + y, false); + } -void canvas::print(int x, int y, const char *str, bool inv, font& f) { - f.print(x, y, str, *this, inv); -} + void Canvas::draw(int x, int y, bool inv) { + if(y < height_ && x < width_) + buffer_.set(x * height_ + y, !inv); + } -void canvas::print(int x, int y, char *str, bool inv, font& f) { - f.print(x, y, str, *this, inv); -} + void Canvas::print(int x, int y, const char *str, bool inv, Font &f) { + f.print(x, y, str, *this, inv); + } -int canvas::getWidth(){ - return width_; -} + void Canvas::print(int x, int y, char *str, bool inv, Font &f) { + f.print(x, y, str, *this, inv); + } + + int Canvas::getWidth() { + return width_; + } + + int Canvas::getHeight() { + return height_; + } -int canvas::getHeight(){ - return height_; } \ No newline at end of file diff --git a/src/gfx/font.cpp b/src/gfx/font.cpp deleted file mode 100644 index 1575377..0000000 --- a/src/gfx/font.cpp +++ /dev/null @@ -1,31 +0,0 @@ -// -// Created by jedi on 11/1/18. -// - -#include "gfx/font.h" -#include "gfx/canvas.h" - - - -font::font(raw_font& raw ):raw_data_(raw){ -} - -void font::print(int x, int y, char l, canvas& c, bool inv) { - int j = (l - ' ') % 32; - for (int x_ = 0; x_ < 4; x_++) - for (int y_ = 0; y_ < 5; y_++) - if (raw_data_[j][x_ + 4 * y_]) - c.draw(x + x_, y + y_, inv); -} - -void font::print(int x, int y, char* str, canvas& c, bool inv) { - for (int i = 0; str[i]; i++) { - print(x + i * 5,y,str[i],c, inv); - } -} - -void font::print(int x, int y, const char* str, canvas& c, bool inv) { - for (int i = 0; str[i]; i++) { - print(x + i * 5,y,str[i],c, inv); - } -} \ No newline at end of file diff --git a/src/gfx/layout.cpp b/src/gfx/layout.cpp deleted file mode 100644 index 3fb828a..0000000 --- a/src/gfx/layout.cpp +++ /dev/null @@ -1,66 +0,0 @@ -// -// Created by jedi on 11/5/18. -// - -#include "node.h" -#include "gfx/layout.h" - -void layout::render() { - for (int j = 0; j < allocated_; j++) { - node *node_ptr; - if (node_ptr = slots[j].content) { - slots[j].canvas_->clear(); - node_ptr->render(*slots[j].canvas_); - screen_.draw(slots[j].pos_, 0, *slots[j].canvas_); - } - } -} - -int layout::apply(node* node) { - int rootslot = allocate_(node, maxslots); - int minsize = pack_(rootslot + 1); - expand_(minsize); - if (cursor == nullptr) - cursor = slots[rootslot].content->getCursor(); - return 0; -} - -int layout::pack_(int usedslots) { - int minsum = 0; - int i; - for (i = 0; i < usedslots; i++) { - if (!slots[i].content) break; - if (minsum + slots[i].content->minsize > maxwidth_) break; - minsum += slots[i].content->minsize; - } - allocated_ = i; - return minsum; -} - -int layout::expand_(int packedsize) { - int diff = maxwidth_ - packedsize; - int pos = 0; - for (int i = allocated_ - 1; i >= 0; i--) { - slots[i].pos_ = pos; - int size = slots[i].content->minsize + (diff * slots[i].content->minsize) / packedsize; - if (size > slots[i].content->maxsize) - size = slots[i].content->maxsize; - slots[i].size_ = size; - if(slots[i].canvas_) - delete slots[i].canvas_; - slots[i].canvas_ = new canvas(size, maxheight_); - pos += size; - } - return 0; -} - -int layout::allocate_(node* current, int depth) { - if (node* next = current->getCursor()) { - int i = allocate_(next, depth) + 1; - slots[i].content = current; - return i; - } else { - slots[0].content = current; - return 0; - } -} diff --git a/src/gfx/screen.cpp b/src/gfx/screen.cpp deleted file mode 100644 index aa07481..0000000 --- a/src/gfx/screen.cpp +++ /dev/null @@ -1,33 +0,0 @@ -// -// Created by jedi on 11/1/18. -// - -#include "gfx/screen.h" - -screen::screen(int w, int h) : width_(w), height_(h) { - hal_init_screen(w,h); -} - -void screen::draw(int x, int y, canvas &c) { - for (int x_ = 0; x_ < c.getWidth(); x_++) - for (int y_ = 0; y_ < c.getHeight(); y_+= 8 *sizeof(int)) - hal_draw(x + x_, y + y_,c.buffer_.getBlock(x_ * c.getHeight() + y_)); -} - -/* -void screen::print(int x, int y, const char *str, font& f) { - //f.print(x, y, str); -} - -void screen::print(int x, int y, char *str, font& f) { - //f.print(x, y, str); -} - */ - -int screen::getWidth(){ - return width_; -} - -int screen::getHeight(){ - return height_; -} \ No newline at end of file diff --git a/src/hal/linux.cpp b/src/hal/linux.cpp index d94b5ae..ea95eec 100644 --- a/src/hal/linux.cpp +++ b/src/hal/linux.cpp @@ -76,16 +76,16 @@ void hal_poll_input(bool *ptr) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_LEFT: - ptr[I_LEFT] = true; + ptr[micromenu::I_LEFT] = true; break; case SDLK_RIGHT: - ptr[I_RIGHT] = true; + ptr[micromenu::I_RIGHT] = true; break; case SDLK_UP: - ptr[I_UP] = true; + ptr[micromenu::I_UP] = true; break; case SDLK_DOWN: - ptr[I_DOWN] = true; + ptr[micromenu::I_DOWN] = true; break; case 'q': case 0x1b: //ESC @@ -97,16 +97,16 @@ void hal_poll_input(bool *ptr) { case SDL_KEYUP: switch (event.key.keysym.sym) { case SDLK_LEFT: - ptr[I_LEFT] = false; + ptr[micromenu::I_LEFT] = false; break; case SDLK_RIGHT: - ptr[I_RIGHT] = false; + ptr[micromenu::I_RIGHT] = false; break; case SDLK_UP: - ptr[I_UP] = false; + ptr[micromenu::I_UP] = false; break; case SDLK_DOWN: - ptr[I_DOWN] = false; + ptr[micromenu::I_DOWN] = false; break; } break; diff --git a/src/main.cpp b/src/main.cpp index 05e106b..4a39933 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,32 +1,32 @@ #include "hal/hal.h" #include "node.h" -#include "gfx/layout.h" - +#include "gfx/Layout.h" #include "example.h" -#include "gfx/screen.h" -#include "gfx/canvas.h" +#include "gfx/Screen.h" +#include "gfx/Canvas.h" #include "buttons.h" #ifdef LINUX + #include #include #include - -extern SDL_Window* window; +extern SDL_Window *window; extern SDL_Event event; extern SDL_Renderer *renderer; #endif -screen s(128,32); -layout l(s); -menu* root; +micromenu::Screen screen(128, 32); +micromenu::Layout layout(screen); +menu *root; +//using micromenu::menu; int main() { root = new menu("", @@ -47,45 +47,41 @@ int main() { ) ); - hal_render(); return 0; } -void render(){ - l.apply(root); - input.poll(); - l.render(); +void render() { + layout.apply(root); + micromenu::input.poll(); + layout.render(); } -void buttons::onPush(int id, bool state) { - if (state) { - node *c; - node *p; - switch (id) { - case I_DOWN: - c = l.cursor; - p = c->getParent(); - if ((c = c->getNext()) || p && (c = p->getChild())) { - p->setCursor(c); - l.cursor = c; - } - break; - case I_UP: - // TODO implement - break; - case I_RIGHT: - c = l.cursor; - if (c = c->getCursor()) { - l.cursor = c; - } - break; - case I_LEFT: - c = l.cursor; - if (c = c->getParent()) { - l.cursor = c; - } - break; - } - } +void micromenu::buttons::onPush(direction dir, bool state) { + if(state) { + node *c; + if(dir == I_DOWN) { + c = layout.cursor; + node *parent = c->getParent(); + if((c = c->getNext()) || parent && (c = parent->getChild())) { + parent->setCursor(c); + layout.cursor = c; + } + } else if(dir == I_UP) { + // TODO implement + } else if(dir == I_RIGHT) { + c = layout.cursor; + c = c->getCursor(); + if(c) { + layout.cursor = c; + } + } else if(dir == I_LEFT) { + c = layout.cursor; + c = c->getParent(); + if(c) { + layout.cursor = c; + } + } + + } } \ No newline at end of file