add sdl2 for debugging
This commit is contained in:
parent
6da35ff25d
commit
8fcd668585
7 changed files with 263 additions and 43 deletions
43
inc/col.h
43
inc/col.h
|
@ -1,9 +1,10 @@
|
|||
|
||||
#ifndef _COL_H_
|
||||
#define _COL_H_
|
||||
|
||||
class Node;
|
||||
typedef void (*drawfun_t)(int offset, int size, Node*);
|
||||
|
||||
|
||||
|
||||
void draw_menu(int, int, Node*);
|
||||
|
||||
class Drawable{
|
||||
|
@ -11,7 +12,7 @@ class Drawable{
|
|||
const int minsize;
|
||||
const int maxsize;
|
||||
drawfun_t render;
|
||||
Drawable(drawfun_t fun, int min = 0, int max=~0): minsize(min), maxsize(max), render(fun){
|
||||
Drawable(drawfun_t fun, int min = 0, int max=0): minsize(min), maxsize(max), render(fun){
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -31,18 +32,20 @@ class Node{
|
|||
public:
|
||||
Drawable view;
|
||||
const char* title_ = 0;
|
||||
Node(): next_(nullptr), child_(nullptr), parent_(nullptr), view(nullptr){
|
||||
Node(int min = 24, int max=48): next_(nullptr), child_(nullptr), parent_(nullptr), view(nullptr, min, max){
|
||||
}
|
||||
Node(const char* t, drawfun_t fun=draw_menu) : title_(t), view(fun), next_(nullptr), child_(nullptr), parent_(nullptr){
|
||||
Node(const char* t, drawfun_t fun=draw_menu, int min = 24, int max=48) : title_(t), view(fun, min, max), next_(nullptr), child_(nullptr), parent_(nullptr){
|
||||
}
|
||||
|
||||
template<typename ... Args>
|
||||
Node(const char* t, Node* n, Args ... ns) : title_(t), view(nullptr){
|
||||
Node(const char* t, Node* n, Args ... ns) : title_(t), view(draw_menu, 24, 48){
|
||||
child_ = n;
|
||||
n->parent_=this;
|
||||
child_->addNodes(true,ns...);
|
||||
}
|
||||
|
||||
Node* getChild(){
|
||||
return child_;
|
||||
}
|
||||
void p(int i);
|
||||
};
|
||||
|
||||
|
@ -50,17 +53,33 @@ class Value: public Node{
|
|||
public:
|
||||
const char* header;
|
||||
int state;
|
||||
Value(const char* t, int val, drawfun_t fun): Node(t, fun), header(t), state(val){
|
||||
|
||||
Value(const char* t, int val, drawfun_t fun): Node(t, fun, 64, 96), header(t), state(val){
|
||||
}
|
||||
};
|
||||
|
||||
class Layout{
|
||||
class Slot{
|
||||
private:
|
||||
int pos_;
|
||||
int size_;
|
||||
public:
|
||||
Node* node;
|
||||
friend Layout;
|
||||
};
|
||||
private:
|
||||
int menuthrs_;
|
||||
const int maxwidth_;
|
||||
int allocated_;
|
||||
int allocate_(Node*, int);
|
||||
int expand_(int );
|
||||
int pack_(int);
|
||||
public:
|
||||
Layout(int max) : menuthrs_(max){
|
||||
static const int maxslots = 10;
|
||||
Layout(int max) : maxwidth_(max){
|
||||
|
||||
}
|
||||
//slots
|
||||
int apply(Node*);
|
||||
Slot slots[maxslots];
|
||||
void p();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
9
inc/example.h
Normal file
9
inc/example.h
Normal file
|
@ -0,0 +1,9 @@
|
|||
|
||||
#ifndef _EXAMPLE_H_
|
||||
#define _EXAMPLE_H_
|
||||
|
||||
void draw_foo(int offset, int size, Node* ptr);
|
||||
|
||||
void draw_blub(int offset, int size, Node* ptr);
|
||||
|
||||
#endif
|
12
inc/hal.h
12
inc/hal.h
|
@ -1,7 +1,14 @@
|
|||
|
||||
#ifndef _HAL_H_
|
||||
#define _HAL_H_
|
||||
|
||||
|
||||
void print(const char* str);
|
||||
void print(char str);
|
||||
void print(int str);
|
||||
void setup();
|
||||
void draw(int x, int y);
|
||||
void render();
|
||||
|
||||
#ifndef LINUX
|
||||
|
||||
|
@ -9,3 +16,8 @@ void * operator new(unsigned int size);
|
|||
void operator delete(void * ptr);
|
||||
|
||||
#endif
|
||||
|
||||
extern const int SCREEN_WIDTH;
|
||||
extern const int SCREEN_HEIGHT;
|
||||
|
||||
#endif
|
||||
|
|
76
src/col.cpp
76
src/col.cpp
|
@ -5,10 +5,6 @@
|
|||
|
||||
void Node::p(int i){
|
||||
for(int j = 0; j < i; j++){ print("__"); }
|
||||
if(title_)
|
||||
print(title_);
|
||||
else
|
||||
print("--");
|
||||
|
||||
if(view.render)
|
||||
view.render(0,0,this);
|
||||
|
@ -22,8 +18,72 @@ void Node::p(int i){
|
|||
next_->p(i);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void draw_menu(int offset, int size, Node* val){
|
||||
|
||||
void Layout::p(){
|
||||
for(int j = 0; j < allocated_; j++){
|
||||
Node * node;
|
||||
if((node = slots[j].node) && node->view.render){
|
||||
print(node->view.minsize);
|
||||
print("...");
|
||||
print(node->view.maxsize);
|
||||
print("\n");
|
||||
print(slots[j].pos_);
|
||||
print("...");
|
||||
print(slots[j].size_);
|
||||
print("\n");
|
||||
node->view.render(slots[j].pos_,slots[j].size_,node);
|
||||
}
|
||||
print("\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int Layout::apply(Node* node){
|
||||
int rootslot = allocate_(node, maxslots);
|
||||
print(rootslot);
|
||||
print("\n");
|
||||
int minsize = pack_(rootslot);
|
||||
print(minsize);
|
||||
print("\n");
|
||||
expand_(minsize);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Layout::pack_(int usedslots){
|
||||
int minsum = 0;
|
||||
int i;
|
||||
for(i = 0; i<usedslots; i++){
|
||||
if(!slots[i].node) break;
|
||||
if(minsum+slots[i].node->view.minsize>maxwidth_) break;
|
||||
minsum+=slots[i].node->view.minsize;
|
||||
}
|
||||
allocated_ = i;
|
||||
print(i);
|
||||
print("\n");
|
||||
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].node->view.minsize + (diff*slots[i].node->view.minsize)/packedsize;
|
||||
if(size > slots[i].node->view.maxsize)
|
||||
size = slots[i].node->view.maxsize;
|
||||
slots[i].size_=size;
|
||||
pos+=size;
|
||||
}
|
||||
print(pos);
|
||||
print("\n");
|
||||
}
|
||||
|
||||
int Layout::allocate_(Node* node, int depth){
|
||||
if(Node* next = node->getChild()){
|
||||
int i = allocate_(next, depth) + 1;
|
||||
slots[i].node = node;
|
||||
return i;
|
||||
}else{
|
||||
slots[0].node = node;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
46
src/example.cpp
Normal file
46
src/example.cpp
Normal file
|
@ -0,0 +1,46 @@
|
|||
|
||||
#include "hal.h"
|
||||
#include "col.h"
|
||||
#include "example.h"
|
||||
|
||||
|
||||
void draw_foo(int offset, int size, Node* ptr){
|
||||
Value* val = (Value*) ptr;
|
||||
print("|");
|
||||
if(ptr)
|
||||
print(ptr->title_);
|
||||
//print(ptr->state);
|
||||
print("|");
|
||||
|
||||
for(int i = 0; i<32; i++)
|
||||
draw(offset,i);
|
||||
for(int i = 0; i<size; i++)
|
||||
draw(offset+i,31-i%32);
|
||||
for(int i = 0; i<size; i++)
|
||||
draw(offset+i,31-(i+16)%32);
|
||||
}
|
||||
|
||||
void draw_blub(int offset, int size, Node* ptr){
|
||||
Value* val = (Value*) ptr;
|
||||
print("#");
|
||||
if(ptr)
|
||||
print(ptr->title_);
|
||||
//print(ptr->state);
|
||||
print("#");
|
||||
for(int i = 0; i<32;i++)
|
||||
draw(offset,i);
|
||||
}
|
||||
|
||||
void draw_menu(int offset, int size, Node* val){
|
||||
if(val&&val->title_){
|
||||
print("_");
|
||||
print(val->title_);
|
||||
print("_");
|
||||
//print(ptr->state);
|
||||
}
|
||||
|
||||
for(int i = 0; i<32;i++)
|
||||
draw(offset,i);
|
||||
for(int i = 0; i<32 && i<size;i++)
|
||||
draw(offset+(i%size),i);
|
||||
}
|
78
src/hal.cpp
78
src/hal.cpp
|
@ -1,11 +1,71 @@
|
|||
|
||||
const int SCREEN_WIDTH = 128;
|
||||
const int SCREEN_HEIGHT = 32;
|
||||
|
||||
#ifdef LINUX
|
||||
|
||||
#include <iostream>
|
||||
|
||||
//Using SDL and standard IO
|
||||
#include <SDL2/SDL.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
|
||||
SDL_Window* window = NULL;
|
||||
SDL_Event event;
|
||||
SDL_Renderer *renderer;
|
||||
|
||||
void setup(){
|
||||
if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {
|
||||
printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
//Create window
|
||||
window = SDL_CreateWindow( "SDL Tutorial", 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN|SDL_WINDOW_BORDERLESS );
|
||||
if( window == NULL ) {
|
||||
printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int i;
|
||||
|
||||
SDL_CreateWindowAndRenderer(SCREEN_WIDTH, SCREEN_HEIGHT, 0, &window, &renderer);
|
||||
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
|
||||
SDL_RenderClear(renderer);
|
||||
SDL_SetRenderDrawColor(renderer, 0, 255, 255, 255);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
void draw(int x, int y){
|
||||
SDL_RenderDrawPoint(renderer, x, y);
|
||||
}
|
||||
|
||||
void render(){
|
||||
SDL_RenderPresent(renderer);
|
||||
while (1) {
|
||||
if (SDL_PollEvent(&event) && event.type == SDL_QUIT)
|
||||
break;
|
||||
}
|
||||
SDL_DestroyRenderer(renderer);
|
||||
SDL_DestroyWindow(window);
|
||||
SDL_Quit();
|
||||
|
||||
}
|
||||
|
||||
|
||||
void print(const char* str){
|
||||
std::cout << str << std::flush;
|
||||
}
|
||||
void print(char chr){
|
||||
char arr[] = "_";
|
||||
arr[0] = chr;
|
||||
std::cout << arr << std::flush;
|
||||
}
|
||||
void print(int str){
|
||||
std::cout << str << std::flush;
|
||||
}
|
||||
|
@ -14,6 +74,18 @@ void print(int str){
|
|||
|
||||
#include <stdlib.h>
|
||||
|
||||
void setup(){
|
||||
//TODO implement
|
||||
}
|
||||
|
||||
void draw(int x, int y){
|
||||
//TODO implement
|
||||
}
|
||||
|
||||
void render(){
|
||||
//TODO implement
|
||||
}
|
||||
|
||||
void * operator new(unsigned int size)
|
||||
{
|
||||
return malloc(size);
|
||||
|
@ -25,11 +97,15 @@ void operator delete(void * ptr)
|
|||
}
|
||||
|
||||
void print(const char* str){
|
||||
//TODO implement
|
||||
}
|
||||
|
||||
void print(char str){
|
||||
//TODO implement
|
||||
}
|
||||
|
||||
void print(int str){
|
||||
|
||||
//TODO implement
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
42
src/main.cpp
42
src/main.cpp
|
@ -1,30 +1,23 @@
|
|||
|
||||
|
||||
#include "hal.h"
|
||||
#include "col.h"
|
||||
|
||||
void draw_foo(int offset, int size, Node* ptr){
|
||||
Value* val = (Value*) ptr;
|
||||
print("\t|");
|
||||
if(ptr)
|
||||
print(ptr->title_);
|
||||
//print(ptr->state);
|
||||
print("|");
|
||||
}
|
||||
#include "example.h"
|
||||
|
||||
void draw_blub(int offset, int size, Node* val){
|
||||
|
||||
}
|
||||
|
||||
int main() {
|
||||
|
||||
setup();
|
||||
|
||||
//build tree
|
||||
|
||||
Node root(nullptr,
|
||||
new Node("foo",
|
||||
new Node("foo",
|
||||
new Node("foo", new Value("FOO",5,draw_foo))
|
||||
new Node("foo1",
|
||||
new Node("foo2",
|
||||
new Node("foo3", new Value("FOO4",5,draw_foo))
|
||||
),
|
||||
new Node("foo", new Value("FOO",5,draw_foo)),
|
||||
new Node("foo", new Value("FOO",5,draw_foo))
|
||||
new Node("foo", new Value("BAR",5,draw_foo)),
|
||||
new Node("foo", new Value("BAZ",5,draw_foo))
|
||||
),
|
||||
new Node("blub", new Value("BLUB",5,draw_blub)),
|
||||
new Node("blub", new Value("BLUB",5,draw_blub)),
|
||||
|
@ -35,11 +28,16 @@ int main() {
|
|||
root.p(0);
|
||||
|
||||
|
||||
//walk tree + allocate slots
|
||||
//position slots
|
||||
|
||||
// 128 x 32
|
||||
Layout l(64);
|
||||
|
||||
//build tree
|
||||
//walk tree + allocate slots
|
||||
//position slots
|
||||
Layout l(128);
|
||||
l.apply(&root);
|
||||
|
||||
//render
|
||||
l.p();
|
||||
|
||||
render();
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue