From 1c8f07d51d1a39cf54b971c1e4c48e9492cf74e1 Mon Sep 17 00:00:00 2001 From: King_DuckZ Date: Sat, 8 Sep 2018 10:05:54 +0100 Subject: [PATCH] Experiment writing a grid widget. WiP. --- michele_epsxe000.mcr | Bin 0 -> 131072 bytes src/gui/CMakeLists.txt | 1 + src/gui/grid.cpp | 70 +++++++++++++++++++++++++++++++++++++++++ src/gui/grid.hpp | 69 ++++++++++++++++++++++++++++++++++++++++ src/gui/main.cpp | 40 +++++++---------------- 5 files changed, 151 insertions(+), 29 deletions(-) create mode 100644 michele_epsxe000.mcr create mode 100644 src/gui/grid.cpp create mode 100644 src/gui/grid.hpp diff --git a/michele_epsxe000.mcr b/michele_epsxe000.mcr new file mode 100644 index 0000000000000000000000000000000000000000..ddde59e5aac4a69f535bd2161c4a0d02c283a9f4 GIT binary patch literal 131072 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 + +namespace implem { + void draw_icons ( + int icon_size, + const MemoryCard& mc, + std::array& icons, + nana::widget& wid + ) { + assert(icon_size); + + for (int z = 0; z < icons.size(); ++z) { + nana::frameset fset; + for (const auto& frame : icon_fetch(mc[z])) { + nana::paint::image img; + img.open(frame.data(), frame.size()); + fset.push_back(img); + } + + const int x = (16 + 2) * (z % 3); + const int y = (16 + 2) * (z / 3); + + nana::animation& ani = icons[z]; + ani.fps(3); + ani.push_back(fset); + ani.output(wid, nana::point(x, y)); + ani.looped(true); + ani.play(); + } + } +} //namespace implem + +grid_drawer_trigger::grid_drawer_trigger() = default; + +void grid_drawer_trigger::attached ( + nana::widget& widget, + nana::paint::graphics& graph +) { + using nana::effects::edge_nimbus; + using nana::API::dev::enable_space_click; + using nana::API::tabstop; + using nana::API::effects_edge_nimbus; + using nana::API::dev::set_measurer; + + m_graph = &graph; + m_widget = &widget; + + nana::window wd = widget; + + enable_space_click(widget, true); + tabstop(wd); + effects_edge_nimbus(wd, edge_nimbus::active); + effects_edge_nimbus(wd, edge_nimbus::over); +} + +void grid_drawer_trigger::set_memorycard (const MemoryCard* mc) { + m_memorycard = mc; +} + +void grid_drawer_trigger::_m_draw_background ( + nana::paint::graphics&, + bool is_mouse_down +) { + assert(m_memorycard); + implem::draw_icons(16, *m_memorycard, m_icons, *m_widget); +} diff --git a/src/gui/grid.hpp b/src/gui/grid.hpp new file mode 100644 index 0000000..15f7894 --- /dev/null +++ b/src/gui/grid.hpp @@ -0,0 +1,69 @@ +#pragma once + +#include "nana/gui/widgets/widget.hpp" +#include "nana/gui/animation.hpp" +#include + +class MemoryCard; + +namespace implem { + //void draw_icons ( + // int icon_size, + // const MemoryCard& mc, + // std::array& icons, + // nana::widget& wid + //); +} //namespace implem + +class grid_drawer_trigger : public nana::drawer_trigger { +public: + grid_drawer_trigger(); + void set_memorycard (const MemoryCard* mc); + +private: + virtual void attached(nana::widget&, nana::paint::graphics&) override; + + //void _m_draw_title (nana::paint::graphics&, bool is_mouse_down, bool is_focus); + void _m_draw_background (nana::paint::graphics&, bool is_mouse_down); + //void _m_draw_border (nana::paint::graphics&, bool is_mouse_down); + + std::array m_icons; + nana::widget* m_widget{nullptr}; + nana::paint::graphics* m_graph{nullptr}; + const MemoryCard* m_memorycard{nullptr}; + bool m_is_ms_down{false}; +}; + +template +class basic_grid : public nana::widget_object { +public: + basic_grid() = default; + basic_grid (nana::widget& widget, unsigned int icon_size, const MemoryCard* mc); + +private: + int m_icon_size{0}; + const MemoryCard* m_memorycard{nullptr}; +}; + +using grid = basic_grid; + +template +basic_grid::basic_grid ( + nana::widget& widget, + unsigned int icon_size, + const MemoryCard* mc +) : + m_icon_size(icon_size), + m_memorycard(mc) +{ + this->create( + widget.handle(), + nana::rectangle{ + 0, + 0, + (icon_size + 2) * 3 - 2, + (icon_size + 2) * 5 - 2 + } + ); + this->get_drawer_trigger().set_memorycard(m_memorycard); +} diff --git a/src/gui/main.cpp b/src/gui/main.cpp index 487cae6..f23143b 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -1,45 +1,27 @@ #include "nana/gui.hpp" -#include "nana/gui/animation.hpp" -#include "nana/gui/widgets/panel.hpp" #include "memorycard.hpp" -#include "block.hpp" -#include "icon_fetch.hpp" +#include "grid.hpp" #include -#include -#include -#include -#include -#include #include int main() { nana::form frm; + const MemoryCard mc(std::ifstream("/home/michele/dev/code/cpp/memoserv/michele_epsxe000.mcr", std::ios::binary)); + grid grid1{frm, 16, &mc}; +#if !defined(NDEBUG) + grid1.bgcolor(nana::colors::azure); +#endif + std::cout << "Hello world\n"; + frm.div("vert<>< <> ><>"); + frm["grid1"] << grid1; + frm.collocate(); frm.show(); - const MemoryCard mc(std::ifstream("/home/michele/emu/psx/WipEout 3 - Special Edition (Europe) (En,Fr,De,Es,It).srm", std::ios::binary)); - //MemoryCard mc(std::ifstream("/run/media/michele/roms/michele_epsxe000.mcr", std::ios::binary)); + //const MemoryCard mc(std::ifstream("/home/michele/emu/psx/WipEout 3 - Special Edition (Europe) (En,Fr,De,Es,It).srm", std::ios::binary)); //MemoryCard mc(std::ifstream("/home/michele/emu/psx/Rapid Racer (Europe) (En,Fr,De,Es,It).srm", std::ios::binary)); - std::array icons { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; - for (int z = 0; z < 15; ++z) { - nana::frameset fset; - for (const auto& frame : icon_fetch(mc[z])) { - nana::paint::image img; - img.open(frame.data(), frame.size()); - fset.push_back(img); - } - - const int x = 5 + 18 * (z % 3); - const int y = 5 + 18 * (z / 3); - - nana::animation& ani = icons[z]; - ani.push_back(fset); - ani.output(frm, nana::point(x, y)); - ani.looped(true); - ani.play(); - } nana::exec(); return 0;