diff options
-rw-r--r-- | Scancode.h | 11 | ||||
-rw-r--r-- | View.cpp | 41 | ||||
-rw-r--r-- | View.h | 6 | ||||
-rw-r--r-- | ViewController.cpp | 50 | ||||
-rw-r--r-- | ViewController.h | 14 | ||||
-rw-r--r-- | main.cpp | 24 |
6 files changed, 113 insertions, 33 deletions
diff --git a/Scancode.h b/Scancode.h new file mode 100644 index 0000000..d838bf2 --- /dev/null +++ b/Scancode.h @@ -0,0 +1,11 @@ +#pragma once + +typedef enum { + KEY_SPACE = 44, + KEY_ENTER = 40, + KEY_O = 18, + KEY_A = 4, + KEY_LEFT = 80, + KEY_RIGHT = 79, +} Scancode; + @@ -1,10 +1,14 @@ #include <SDL3/SDL.h> +#include <SDL3/SDL_events.h> #include <thread> +#include <vector> #include "View.h" #include "ViewController.h" -View::View(Museum & m) : controller(m) { +using namespace std; + +View::View(Museum & m) : controller(m, *this) { this->worker = new std::thread(&View::work, this); } @@ -24,18 +28,27 @@ void View::work() { for (SDL_Event e; SDL_PollEvent(&e);) { if (e.type == SDL_EVENT_QUIT) { this->open = false; - return; + continue; + } + if (e.type == SDL_EVENT_KEY_DOWN) { + this->ev_keydown(e.key); + continue; } } this->draw_begin(); - this->controller.update(*this); + this->controller.update(); this->draw_end(); } this->window_deinit(); } +void View::ev_keydown(SDL_KeyboardEvent ev) { + if (ev.repeat) return; + this->controller.keypress(static_cast<Scancode>(ev.scancode)); +} + void View::window_init() { SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS); this->window = SDL_CreateWindow( @@ -60,7 +73,7 @@ void View::window_deinit() { SDL_Quit(); } -void View::set_size(unsigned int width, unsigned int height) { +void View::window_size(unsigned int width, unsigned int height) { if (this->width == width && this->height == height) return; SDL_SetWindowSize(this->window, width, height); @@ -88,3 +101,23 @@ void View::draw_rect(Rectangle r, Color c) { SDL_RenderFillRect(this->renderer, &rect); } +typedef struct { + bool open; + vector<string> out; +} dialog_file_tmp_data; +vector<string> View::dialog_file() { + dialog_file_tmp_data data = { + .open = true, + .out = {}, + }; + SDL_DialogFileCallback callback = [](void * userdata, const char * const * files, int) -> void { + dialog_file_tmp_data * data = static_cast<dialog_file_tmp_data*>(userdata); + for (; *files != NULL; files++) + data->out.push_back(std::string(*files)); + data->open = false; + }; + SDL_ShowOpenFileDialog(callback, &data, this->window, NULL, 0, NULL, true); + while (data.open); + return data.out; +} + @@ -2,6 +2,8 @@ #include <SDL2/SDL.h> #include <thread> +#include <vector> +#include <string> #include "Color.h" #include "Rectangle.h" @@ -13,7 +15,8 @@ public: virtual ~View(); public: - virtual void set_size(unsigned int width, unsigned int height); + virtual void window_size(unsigned int width, unsigned int height); + virtual std::vector<std::string> dialog_file(); virtual void draw_rect(Rectangle r, Color c); private: @@ -21,6 +24,7 @@ private: virtual void draw_end(); virtual void window_init(); virtual void window_deinit(); + virtual void ev_keydown(SDL_KeyboardEvent); public: bool open = true; diff --git a/ViewController.cpp b/ViewController.cpp index 269edaa..c7fa50d 100644 --- a/ViewController.cpp +++ b/ViewController.cpp @@ -1,23 +1,24 @@ #include "ViewController.h" +#include "Scancode.h" #include "View.h" #include "Museum.h" -ViewController::ViewController(Museum & m) : museum(m) {}; +ViewController::ViewController(Museum & m, View & v) : museum(m), view(v) {}; -void ViewController::update(View & view) { - this->update_size(view); - this->update_tiles(view); - this->update_artists(view); +void ViewController::update() { + this->update_size(); + this->update_tiles(); + this->update_artists(); } -void ViewController::update_size(View & view) { - view.set_size( +void ViewController::update_size() { + this->view.window_size( this->scale * this->museum.canvas.data.columns, this->scale * this->museum.canvas.data.rows ); } -void ViewController::update_tiles(View & view) { +void ViewController::update_tiles() { for (unsigned y = 0; y < this->museum.canvas.data.rows; y++) { for (unsigned x = 0; x < this->museum.canvas.data.columns; x++) { Tile & tile = this->museum.canvas.get_tile(x, y); @@ -27,12 +28,12 @@ void ViewController::update_tiles(View & view) { .width = scale - line_width, .height = scale - line_width, }; - view.draw_rect(rect, tile.color); + this->view.draw_rect(rect, tile.color); } } } -void ViewController::update_artists(View & view) { +void ViewController::update_artists() { People & people = this->museum.people; for (Artist * artist : people.get_artists()) { if (artist == nullptr) continue; @@ -42,7 +43,34 @@ void ViewController::update_artists(View & view) { .width = artist_size, .height = artist_size, }; - view.draw_rect(rect, artist->color); + this->view.draw_rect(rect, artist->color); + } +} + +void ViewController::keypress(Scancode scancode) { + switch (scancode) { + KEY_SPACE: { + printf("TODO: toggle museum.pause\n"); + break; + } + KEY_ENTER: { + break; + } + KEY_O: { + printf("TODO: open dialog\n"); + this->view.dialog_file(); + break; + } + KEY_A: { + break; + } + KEY_LEFT: { + break; + } + KEY_RIGHT: { + break; + } + default: break; } } diff --git a/ViewController.h b/ViewController.h index bffd0b2..9e1e812 100644 --- a/ViewController.h +++ b/ViewController.h @@ -1,22 +1,26 @@ #pragma once +#include "Scancode.h" + class View; class Museum; class ViewController { public: - ViewController(Museum & m); + ViewController(Museum & m, View & v); public: - void update(View & v); + void update(); + void keypress(Scancode scancode); private: - void update_size(View & v); - void update_tiles(View & v); - void update_artists(View & v); + void update_size(); + void update_tiles(); + void update_artists(); private: Museum & museum; + View & view; private: unsigned int scale = 16; @@ -31,22 +31,22 @@ static void parse(FileStrategy & file, Deserializer & deserializer, const char * int main(int argc, char** argv) { Museum museum {}; + View view { museum }; - museum.set_pause(true); - - Deserializer deserializer { museum }; - - for (int i = 1; i < argc; i++) { - char * url = argv[i]; + { // load files provided on command line + Deserializer deserializer { museum }; + museum.set_pause(true); + for (int i = 1; i < argc; i++) { + char * url = argv[i]; - unique_ptr<FileStrategy> file = open(url); - parse(*file, deserializer, url); + unique_ptr<FileStrategy> file = open(url); + parse(*file, deserializer, url); + } + museum.set_pause(false); } - View view { museum }; - - museum.set_pause(false); - + // Museum and View both create their own worker threads, so the main thread + // should remain to keep the view active. while (view.open); return EXIT_SUCCESS; |