diff --git a/src/gui/main_window.cpp b/src/gui/main_window.cpp index e127646..7dddab6 100644 --- a/src/gui/main_window.cpp +++ b/src/gui/main_window.cpp @@ -3,55 +3,31 @@ #include "memcard/memorycard.hpp" #include "make_nana_animation.hpp" #include "memcard/make_memory_card.hpp" +#include "widget/block_grid.hpp" +#include #include -#include +#include namespace duck { MainWindow::MainWindow (int icon_size, int icon_fps, const std::string& caption) : - m_grid1(*this, 3, true), - m_grid2(*this, 3, true), - m_label1(*this, "Slot 1"), - m_label2(*this, "Slot 2"), + nana::form(nana::API::make_center(800, 600)), m_menubar(*this), m_icon_size(icon_size), m_icon_fps(icon_fps) { - using mc::psx::MemoryCard; - -#if !defined(NDEBUG) - m_grid1.bgcolor(nana::colors::azure); -#endif this->caption(caption); this->init_menu(); - const MemoryCard mc1(mc::psx::make_memory_card("/home/michele/dev/code/cpp/memoserv/epsxe000_xa2.mcr")); - const MemoryCard mc2(mc::psx::make_memory_card("/home/michele/dev/code/cpp/memoserv/michele_epsxe000.mcr")); - - - //auto mc1_info = mc1.content_info(); - //std::cout << "memory card 1:\n"; - //std::cout << "\tuse byte: 0x" << std::hex << mc1_info.use_byte << std::dec << '\n'; - //std::cout << "\tavailable blocks: 0x" << std::hex << static_cast(mc1_info.available_blocks) << std::dec << '\n'; - - for (int z = 0; z < 15; ++z) { - if (mc1[z].has_magic()) - m_grid1.emplace_back(duck::make_nana_animation(mc1[z], m_icon_size, m_icon_size, m_icon_fps)); - if (mc2[z].has_magic()) - m_grid2.emplace_back(duck::make_nana_animation(mc2[z], m_icon_size, m_icon_size, m_icon_fps)); - } - - this->div("vert >"); + this->div("vert >"); (*this)["menu"] << m_menubar; - (*this)["slot1"] << m_label1 << m_grid1; - (*this)["slot2"] << m_label2 << m_grid2; this->collocate(); - - //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)); } +MainWindow::~MainWindow() noexcept = default; + void MainWindow::init_menu() { m_menubar.push_back("&File"); + m_menubar.at(0).append("&Open...", [this](nana::menu::item_proxy&){this->open_file_from_dialog();}); m_menubar.at(0).append("E&xit", [](nana::menu::item_proxy&){nana::API::exit();}); m_menubar.push_back("&Help"); @@ -61,4 +37,30 @@ void MainWindow::init_menu() { win.modality(); }); } + +void MainWindow::open_file_from_dialog() { + nana::filebox fb(*this, true); + fb.allow_multi_select(true); + fb.add_filter(("PSX MemoryCard"), ("*.mcr;*.sav;*.srm")); + fb.add_filter(("All files"), ("*.*")); + auto files = fb(); + + for (const auto& file : files) { + m_memcards.push_back(mc::psx::make_memory_card(file)); + m_grids.emplace_back(*this, 3, true); + m_grid_labels.emplace_back(*this, std::string("Slot ") + std::to_string(m_grid_labels.size() + 1)); +#if !defined(NDEBUG) + m_grids.back().bgcolor(nana::colors::azure); +#endif + + auto& mc = m_memcards.back(); + auto& grid = m_grids.back(); + for (int z = 0; z < 15; ++z) { + if (mc[z].has_magic()) + grid.emplace_back(duck::make_nana_animation(mc[z], m_icon_size, m_icon_size, m_icon_fps)); + } + (*this)["slots"] << m_grids.back(); + } + this->collocate(); +} } //namespace duck diff --git a/src/gui/main_window.hpp b/src/gui/main_window.hpp index 3c6ac23..b6c2385 100644 --- a/src/gui/main_window.hpp +++ b/src/gui/main_window.hpp @@ -1,26 +1,34 @@ #pragma once -#include "widget/block_grid.hpp" #include #include #include #include +#include + +namespace mc::psx { + class MemoryCard; +} //namespace mc::psx namespace duck { +namespace widget { +class BlockGrid; +} //namespace widget class MainWindow : public nana::form { public: MainWindow (int icon_size, int icon_fps, const std::string& caption); + ~MainWindow() noexcept; + + void open_file_from_dialog(); private: void init_menu(); - duck::widget::BlockGrid m_grid1; - duck::widget::BlockGrid m_grid2; - nana::label m_label1; - nana::label m_label2; nana::menubar m_menubar; - + std::list m_memcards; + std::list m_grids; + std::list m_grid_labels; int m_icon_size; int m_icon_fps; };