diff --git a/michele_epsxe000.mcr b/michele_epsxe000.mcr new file mode 100644 index 0000000..ddde59e Binary files /dev/null and b/michele_epsxe000.mcr differ diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 85c9752..d356ea0 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -5,6 +5,7 @@ add_executable(${PROJECT_NAME} memorycard.cpp block.cpp icon_fetch.cpp + grid.cpp ) target_link_libraries(${PROJECT_NAME} diff --git a/src/gui/grid.cpp b/src/gui/grid.cpp new file mode 100644 index 0000000..b85249f --- /dev/null +++ b/src/gui/grid.cpp @@ -0,0 +1,70 @@ +#include "grid.hpp" +#include "memorycard.hpp" +#include "block.hpp" +#include "icon_fetch.hpp" +#include + +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;