refactor naming
This commit is contained in:
parent
e0181cc3e8
commit
24d6e756ee
30 changed files with 569 additions and 534 deletions
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
build/*
|
||||||
|
lib/*
|
||||||
|
deps/*
|
||||||
|
.idea/*
|
||||||
|
cmake-build-debug/*
|
||||||
|
CMakeLists.txt
|
||||||
|
compile_commands.json
|
2
OBJECTS
2
OBJECTS
|
@ -1,7 +1,7 @@
|
||||||
TARGET = main
|
TARGET = main
|
||||||
SRC = hal.cpp main.cpp example.cpp buttons.cpp
|
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
|
SRC += fonts/basic_5x4.cpp
|
||||||
|
|
||||||
|
|
|
@ -2,27 +2,30 @@
|
||||||
// Created by jedi on 11/6/18.
|
// Created by jedi on 11/6/18.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef MGL_DMXMENU_INPUT_H
|
#pragma once
|
||||||
#define MGL_DMXMENU_INPUT_H
|
|
||||||
|
|
||||||
|
namespace micromenu {
|
||||||
|
|
||||||
|
enum direction {
|
||||||
|
I_LEFT = 0,
|
||||||
|
I_RIGHT,
|
||||||
|
I_UP,
|
||||||
|
I_DOWN
|
||||||
|
};
|
||||||
|
|
||||||
#define I_LEFT 0
|
class buttons {
|
||||||
#define I_RIGHT 1
|
private:
|
||||||
#define I_UP 2
|
static void onPush(direction id, bool state);
|
||||||
#define I_DOWN 3
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool raw[4] = {false, false, false, false};
|
||||||
|
bool last[4] = {false, false, false, false};
|
||||||
|
|
||||||
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();
|
void poll();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
extern buttons input;
|
extern buttons input;
|
||||||
|
|
||||||
#endif //MGL_DMXMENU_INPUT_H
|
|
||||||
|
}
|
||||||
|
|
|
@ -2,33 +2,38 @@
|
||||||
#ifndef _EXAMPLE_H_
|
#ifndef _EXAMPLE_H_
|
||||||
#define _EXAMPLE_H_
|
#define _EXAMPLE_H_
|
||||||
|
|
||||||
#include "gfx/canvas.h"
|
#include "gfx/Canvas.h"
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
|
|
||||||
|
using canvas = micromenu::Canvas;
|
||||||
|
using node = micromenu::node;
|
||||||
|
using value = micromenu::value;
|
||||||
|
|
||||||
class menu : public node {
|
class menu : public node {
|
||||||
public:
|
public:
|
||||||
template<typename ... Args>
|
template<typename ... Args>
|
||||||
menu(Args ... ns) : node(ns...) {
|
explicit menu(Args ... ns) : node(ns...) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void render(canvas &c);
|
void render(canvas &c) override;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class fooValue : public value {
|
class fooValue : public value {
|
||||||
public:
|
public:
|
||||||
fooValue(const char* str, int val) : value(str, val, 32, 48) {
|
fooValue(const char *str, int val) : value(str, val, 32, 48) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void render(canvas &c);
|
void render(canvas &c) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
class blubValue : public value{
|
class blubValue : public value {
|
||||||
public:
|
public:
|
||||||
template<typename ... Args>
|
template<typename ... Args>
|
||||||
blubValue(Args ... ns) : value(ns..., 64, 96) {
|
explicit blubValue(Args ... ns) : value(ns..., 64, 96) {
|
||||||
}
|
}
|
||||||
void render(canvas& c);
|
|
||||||
|
void render(canvas &c) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2,11 +2,11 @@
|
||||||
// Created by jedi on 11/2/18.
|
// Created by jedi on 11/2/18.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef MGL_DMXMENU_BASIC_5X4_H
|
#pragma once
|
||||||
#define MGL_DMXMENU_BASIC_5X4_H
|
|
||||||
|
|
||||||
#include "gfx/font.h"
|
#include "gfx/Font.h"
|
||||||
|
|
||||||
extern font basic_5x4;
|
namespace micromenu {
|
||||||
|
extern Font basic_5x4;
|
||||||
|
}
|
||||||
|
|
||||||
#endif //MGL_DMXMENU_BASIC_5X4_H
|
|
||||||
|
|
54
inc/gfx/Buffer.h
Normal file
54
inc/gfx/Buffer.h
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
//
|
||||||
|
// Created by jedi on 11/2/18.
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
namespace micromenu {
|
||||||
|
|
||||||
|
enum bufferBlocks {
|
||||||
|
_1bit = 1, _2bit = 2, _4bit = 4, _8bit = 8, _16bit = 16, _24bit = 24, _32bit = 32
|
||||||
|
};
|
||||||
|
|
||||||
|
template<bufferBlocks N>
|
||||||
|
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);
|
||||||
|
|
||||||
|
}
|
42
inc/gfx/Canvas.h
Normal file
42
inc/gfx/Canvas.h
Normal file
|
@ -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;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
27
inc/gfx/Font.h
Normal file
27
inc/gfx/Font.h
Normal file
|
@ -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);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
49
inc/gfx/Layout.h
Normal file
49
inc/gfx/Layout.h
Normal file
|
@ -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();
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
38
inc/gfx/Screen.h
Normal file
38
inc/gfx/Screen.h
Normal file
|
@ -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_;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -1,55 +0,0 @@
|
||||||
//
|
|
||||||
// Created by jedi on 11/2/18.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef MGL_DMXMENU_BUFFER_1_H
|
|
||||||
#define MGL_DMXMENU_BUFFER_1_H
|
|
||||||
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
|
|
||||||
enum bufferBlocks{
|
|
||||||
_1bit = 1, _2bit = 2, _4bit = 4, _8bit = 8, _16bit = 16, _24bit = 24, _32bit = 32
|
|
||||||
};
|
|
||||||
|
|
||||||
template <bufferBlocks N>
|
|
||||||
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);
|
|
||||||
|
|
||||||
#endif //MGL_DMXMENU_BUFFER_1_H
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
28
inc/node.h
28
inc/node.h
|
@ -2,13 +2,14 @@
|
||||||
// Created by jedi on 11/5/18.
|
// Created by jedi on 11/5/18.
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef MGL_DMXMENU_NODE_H
|
#pragma once
|
||||||
#define MGL_DMXMENU_NODE_H
|
|
||||||
|
|
||||||
#include "gfx/canvas.h"
|
#include "gfx/Canvas.h"
|
||||||
|
|
||||||
class node {
|
namespace micromenu {
|
||||||
private:
|
|
||||||
|
class node {
|
||||||
|
private:
|
||||||
node *parent_ = nullptr;
|
node *parent_ = nullptr;
|
||||||
node *child_ = nullptr;
|
node *child_ = nullptr;
|
||||||
node *cursor_ = nullptr;
|
node *cursor_ = nullptr;
|
||||||
|
@ -24,18 +25,19 @@ private:
|
||||||
next_->addNodes(!b, ns...);
|
next_->addNodes(!b, ns...);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
const char *title_ = 0;
|
const char *title_ = 0;
|
||||||
const int minsize;
|
const int minsize;
|
||||||
const int maxsize;
|
const int maxsize;
|
||||||
|
|
||||||
virtual void render(canvas &c) = 0;
|
virtual void render(Canvas &c) = 0;
|
||||||
|
|
||||||
explicit node(int min = 24, int max = 48) : next_(nullptr), child_(nullptr), parent_(nullptr), minsize(min),
|
explicit node(int min = 24, int max = 48) : next_(nullptr), child_(nullptr), parent_(nullptr), minsize(min),
|
||||||
maxsize(max) {
|
maxsize(max) {
|
||||||
}
|
}
|
||||||
|
|
||||||
explicit node(const char *t, int min = 24, int max = 48) : title_(t), minsize(min), maxsize(max), next_(nullptr),
|
explicit node(const char *t, int min = 24, int max = 48) : title_(t), minsize(min), maxsize(max),
|
||||||
|
next_(nullptr),
|
||||||
child_(nullptr),
|
child_(nullptr),
|
||||||
parent_(nullptr) {
|
parent_(nullptr) {
|
||||||
}
|
}
|
||||||
|
@ -67,17 +69,17 @@ public:
|
||||||
void setCursor(node *c) {
|
void setCursor(node *c) {
|
||||||
cursor_ = c;
|
cursor_ = c;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class value: public node {
|
class value : public node {
|
||||||
public:
|
public:
|
||||||
const char *header;
|
const char *header;
|
||||||
int state;
|
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
|
}
|
|
@ -8,7 +8,8 @@ OBJ = $(SRC_PATH:$(SRCDIR)/%.cpp=$(OBJDIR)/%.o)
|
||||||
REMOVEDIR = rm -rf
|
REMOVEDIR = rm -rf
|
||||||
|
|
||||||
CFLAGS += -std=gnu99
|
CFLAGS += -std=gnu99
|
||||||
CXXFLAGS += -std=c++17
|
CXXFLAGS += -std=gnu++20
|
||||||
|
LDFLAGS =
|
||||||
|
|
||||||
|
|
||||||
CFLAGS += -I$(INCDIR) -DLINUX
|
CFLAGS += -I$(INCDIR) -DLINUX
|
||||||
|
@ -24,7 +25,7 @@ all: $(OBJDIR)/$(TARGET)
|
||||||
.PRECIOUS: $(OBJ)
|
.PRECIOUS: $(OBJ)
|
||||||
$(OBJDIR)/$(TARGET): $(OBJ) | $(OBJDIR)
|
$(OBJDIR)/$(TARGET): $(OBJ) | $(OBJDIR)
|
||||||
@echo link $^
|
@echo link $^
|
||||||
@$(CXX) $(LDFLAGS) -o $@ $^
|
$(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)
|
||||||
|
|
||||||
$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
|
$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
|
||||||
@echo compile $<
|
@echo compile $<
|
||||||
|
|
|
@ -5,16 +5,18 @@
|
||||||
#include "hal/hal.h"
|
#include "hal/hal.h"
|
||||||
#include "buttons.h"
|
#include "buttons.h"
|
||||||
|
|
||||||
|
namespace micromenu {
|
||||||
|
|
||||||
buttons input;
|
buttons input;
|
||||||
|
|
||||||
void buttons::poll() {
|
void buttons::poll() {
|
||||||
hal_poll_input(raw);
|
hal_poll_input(raw);
|
||||||
|
|
||||||
for(int i = 0; i < 4; i++){
|
for (int i = 0; i < 4; i++) {
|
||||||
if(raw[i]!=last[i]){
|
if(raw[i] != last[i]) {
|
||||||
onPush(i, raw[i]);
|
onPush(static_cast<direction>(i), raw[i]);
|
||||||
last[i]=raw[i];
|
last[i] = raw[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,14 +1,15 @@
|
||||||
|
|
||||||
#include "string.h"
|
#include <cstring>
|
||||||
#include "buttons.h"
|
#include "buttons.h"
|
||||||
#include "example.h"
|
#include "example.h"
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
#include "gfx/canvas.h"
|
#include "gfx/Canvas.h"
|
||||||
|
|
||||||
char peng[] = {' ', ' ', ' ', ' ', ' ', 0};
|
char peng[] = {' ', ' ', ' ', ' ', ' ', 0};
|
||||||
|
|
||||||
int j = 0;
|
int j = 0;
|
||||||
|
|
||||||
|
|
||||||
void fooValue::render(canvas& c){
|
void fooValue::render(canvas& c){
|
||||||
|
|
||||||
for(int i = 0; i<c.getHeight(); i++)
|
for(int i = 0; i<c.getHeight(); i++)
|
||||||
|
@ -16,10 +17,10 @@ void fooValue::render(canvas& c){
|
||||||
|
|
||||||
|
|
||||||
c.print(10 , 10, title_);
|
c.print(10 , 10, title_);
|
||||||
peng[0] = input.raw[0] ? 'L' : ' ';
|
peng[0] = micromenu::input.raw[0] ? 'L' : ' ';
|
||||||
peng[1] = input.raw[1] ? 'R' : ' ';
|
peng[1] = micromenu::input.raw[1] ? 'R' : ' ';
|
||||||
peng[2] = input.raw[2] ? 'U' : ' ';
|
peng[2] = micromenu::input.raw[2] ? 'U' : ' ';
|
||||||
peng[3] = input.raw[3] ? 'D' : ' ';
|
peng[3] = micromenu::input.raw[3] ? 'D' : ' ';
|
||||||
j++;
|
j++;
|
||||||
j %= 10;
|
j %= 10;
|
||||||
peng[4] = 'A' + j;
|
peng[4] = 'A' + j;
|
||||||
|
|
|
@ -4,7 +4,9 @@
|
||||||
|
|
||||||
#include "fonts/basic_5x4.h"
|
#include "fonts/basic_5x4.h"
|
||||||
|
|
||||||
const bool basic_5x4_raw[32][20] = {
|
namespace micromenu {
|
||||||
|
|
||||||
|
const bool basic_5x4_raw[32][20] = {
|
||||||
//0
|
//0
|
||||||
{0,0,0,0,
|
{0,0,0,0,
|
||||||
0,0,0,0,
|
0,0,0,0,
|
||||||
|
@ -167,6 +169,8 @@ const bool basic_5x4_raw[32][20] = {
|
||||||
0,1,1,0,
|
0,1,1,0,
|
||||||
1,0,0,0,
|
1,0,0,0,
|
||||||
1,1,1,1},
|
1,1,1,1},
|
||||||
};
|
};
|
||||||
|
|
||||||
font basic_5x4(basic_5x4_raw);
|
Font basic_5x4(basic_5x4_raw);
|
||||||
|
|
||||||
|
}
|
|
@ -2,16 +2,16 @@
|
||||||
// Created by jedi on 11/2/18.
|
// Created by jedi on 11/2/18.
|
||||||
//
|
//
|
||||||
|
|
||||||
#include "gfx/buffer.h"
|
#include "gfx/Buffer.h"
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
int buffer<_32bit>::get(int i){
|
int Buffer<_32bit>::get(int i){
|
||||||
if (i >= size_) return 0;
|
if (i >= size_) return 0;
|
||||||
return ptr_[i];
|
return ptr_[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
void buffer<_32bit>::set(int i, int v) {
|
void Buffer<_32bit>::set(int i, int v) {
|
||||||
if (i < size_)
|
if (i < size_)
|
||||||
ptr_[i] = v;
|
ptr_[i] = v;
|
||||||
}
|
}
|
34
src/gfx/Font.cpp
Normal file
34
src/gfx/Font.cpp
Normal file
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
71
src/gfx/Layout.cpp
Normal file
71
src/gfx/Layout.cpp
Normal file
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
29
src/gfx/Screen.cpp
Normal file
29
src/gfx/Screen.cpp
Normal file
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -2,35 +2,39 @@
|
||||||
// Created by jedi on 11/1/18.
|
// 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) {
|
namespace micromenu {
|
||||||
|
|
||||||
|
Canvas::Canvas(int w, int h) : width_(w), height_(h), buffer_(w * h) {
|
||||||
clear();
|
clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void canvas::clear() {
|
void Canvas::clear() {
|
||||||
for (int x = 0; x < width_; x++)
|
for (int x = 0; x < width_; x++)
|
||||||
for (int y = 0; y < height_; y++)
|
for (int y = 0; y < height_; y++)
|
||||||
buffer_.set(x * height_ + y, false);
|
buffer_.set(x * height_ + y, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void canvas::draw(int x, int y, bool inv) {
|
void Canvas::draw(int x, int y, bool inv) {
|
||||||
if (y < height_ && x < width_)
|
if(y < height_ && x < width_)
|
||||||
buffer_.set(x * height_ + y, !inv);
|
buffer_.set(x * height_ + y, !inv);
|
||||||
}
|
}
|
||||||
|
|
||||||
void canvas::print(int x, int y, const char *str, bool inv, font& f) {
|
void Canvas::print(int x, int y, const char *str, bool inv, Font &f) {
|
||||||
f.print(x, y, str, *this, inv);
|
f.print(x, y, str, *this, inv);
|
||||||
}
|
}
|
||||||
|
|
||||||
void canvas::print(int x, int y, char *str, bool inv, font& f) {
|
void Canvas::print(int x, int y, char *str, bool inv, Font &f) {
|
||||||
f.print(x, y, str, *this, inv);
|
f.print(x, y, str, *this, inv);
|
||||||
}
|
}
|
||||||
|
|
||||||
int canvas::getWidth(){
|
int Canvas::getWidth() {
|
||||||
return width_;
|
return width_;
|
||||||
}
|
}
|
||||||
|
|
||||||
int canvas::getHeight(){
|
int Canvas::getHeight() {
|
||||||
return height_;
|
return height_;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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_;
|
|
||||||
}
|
|
|
@ -76,16 +76,16 @@ void hal_poll_input(bool *ptr) {
|
||||||
case SDL_KEYDOWN:
|
case SDL_KEYDOWN:
|
||||||
switch (event.key.keysym.sym) {
|
switch (event.key.keysym.sym) {
|
||||||
case SDLK_LEFT:
|
case SDLK_LEFT:
|
||||||
ptr[I_LEFT] = true;
|
ptr[micromenu::I_LEFT] = true;
|
||||||
break;
|
break;
|
||||||
case SDLK_RIGHT:
|
case SDLK_RIGHT:
|
||||||
ptr[I_RIGHT] = true;
|
ptr[micromenu::I_RIGHT] = true;
|
||||||
break;
|
break;
|
||||||
case SDLK_UP:
|
case SDLK_UP:
|
||||||
ptr[I_UP] = true;
|
ptr[micromenu::I_UP] = true;
|
||||||
break;
|
break;
|
||||||
case SDLK_DOWN:
|
case SDLK_DOWN:
|
||||||
ptr[I_DOWN] = true;
|
ptr[micromenu::I_DOWN] = true;
|
||||||
break;
|
break;
|
||||||
case 'q':
|
case 'q':
|
||||||
case 0x1b: //ESC
|
case 0x1b: //ESC
|
||||||
|
@ -97,16 +97,16 @@ void hal_poll_input(bool *ptr) {
|
||||||
case SDL_KEYUP:
|
case SDL_KEYUP:
|
||||||
switch (event.key.keysym.sym) {
|
switch (event.key.keysym.sym) {
|
||||||
case SDLK_LEFT:
|
case SDLK_LEFT:
|
||||||
ptr[I_LEFT] = false;
|
ptr[micromenu::I_LEFT] = false;
|
||||||
break;
|
break;
|
||||||
case SDLK_RIGHT:
|
case SDLK_RIGHT:
|
||||||
ptr[I_RIGHT] = false;
|
ptr[micromenu::I_RIGHT] = false;
|
||||||
break;
|
break;
|
||||||
case SDLK_UP:
|
case SDLK_UP:
|
||||||
ptr[I_UP] = false;
|
ptr[micromenu::I_UP] = false;
|
||||||
break;
|
break;
|
||||||
case SDLK_DOWN:
|
case SDLK_DOWN:
|
||||||
ptr[I_DOWN] = false;
|
ptr[micromenu::I_DOWN] = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
70
src/main.cpp
70
src/main.cpp
|
@ -1,32 +1,32 @@
|
||||||
|
|
||||||
#include "hal/hal.h"
|
#include "hal/hal.h"
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
#include "gfx/layout.h"
|
#include "gfx/Layout.h"
|
||||||
|
|
||||||
|
|
||||||
#include "example.h"
|
#include "example.h"
|
||||||
|
|
||||||
#include "gfx/screen.h"
|
#include "gfx/Screen.h"
|
||||||
#include "gfx/canvas.h"
|
#include "gfx/Canvas.h"
|
||||||
#include "buttons.h"
|
#include "buttons.h"
|
||||||
|
|
||||||
#ifdef LINUX
|
#ifdef LINUX
|
||||||
|
|
||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
extern SDL_Window *window;
|
||||||
extern SDL_Window* window;
|
|
||||||
extern SDL_Event event;
|
extern SDL_Event event;
|
||||||
extern SDL_Renderer *renderer;
|
extern SDL_Renderer *renderer;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
screen s(128,32);
|
micromenu::Screen screen(128, 32);
|
||||||
layout l(s);
|
micromenu::Layout layout(screen);
|
||||||
menu* root;
|
menu *root;
|
||||||
|
|
||||||
|
//using micromenu::menu;
|
||||||
int main() {
|
int main() {
|
||||||
|
|
||||||
root = new menu("",
|
root = new menu("",
|
||||||
|
@ -47,45 +47,41 @@ int main() {
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
hal_render();
|
hal_render();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void render(){
|
void render() {
|
||||||
l.apply(root);
|
layout.apply(root);
|
||||||
input.poll();
|
micromenu::input.poll();
|
||||||
l.render();
|
layout.render();
|
||||||
}
|
}
|
||||||
|
|
||||||
void buttons::onPush(int id, bool state) {
|
void micromenu::buttons::onPush(direction dir, bool state) {
|
||||||
if (state) {
|
if(state) {
|
||||||
node *c;
|
node *c;
|
||||||
node *p;
|
if(dir == I_DOWN) {
|
||||||
switch (id) {
|
c = layout.cursor;
|
||||||
case I_DOWN:
|
node *parent = c->getParent();
|
||||||
c = l.cursor;
|
if((c = c->getNext()) || parent && (c = parent->getChild())) {
|
||||||
p = c->getParent();
|
parent->setCursor(c);
|
||||||
if ((c = c->getNext()) || p && (c = p->getChild())) {
|
layout.cursor = c;
|
||||||
p->setCursor(c);
|
|
||||||
l.cursor = c;
|
|
||||||
}
|
}
|
||||||
break;
|
} else if(dir == I_UP) {
|
||||||
case I_UP:
|
|
||||||
// TODO implement
|
// TODO implement
|
||||||
break;
|
} else if(dir == I_RIGHT) {
|
||||||
case I_RIGHT:
|
c = layout.cursor;
|
||||||
c = l.cursor;
|
c = c->getCursor();
|
||||||
if (c = c->getCursor()) {
|
if(c) {
|
||||||
l.cursor = c;
|
layout.cursor = c;
|
||||||
}
|
}
|
||||||
break;
|
} else if(dir == I_LEFT) {
|
||||||
case I_LEFT:
|
c = layout.cursor;
|
||||||
c = l.cursor;
|
c = c->getParent();
|
||||||
if (c = c->getParent()) {
|
if(c) {
|
||||||
l.cursor = c;
|
layout.cursor = c;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in a new issue