From 2c59cb8211c4bf46665d12ed174cf7efe512e0d0 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 17 Sep 2017 10:04:19 -0700 Subject: [PATCH] Qt: Initial map cache UI --- src/platform/qt/CMakeLists.txt | 2 + src/platform/qt/MapView.cpp | 65 +++++++++++++++++++++ src/platform/qt/MapView.h | 38 +++++++++++++ src/platform/qt/MapView.ui | 101 +++++++++++++++++++++++++++++++++ src/platform/qt/Window.cpp | 8 ++- 5 files changed, 213 insertions(+), 1 deletion(-) create mode 100644 src/platform/qt/MapView.cpp create mode 100644 src/platform/qt/MapView.h create mode 100644 src/platform/qt/MapView.ui diff --git a/src/platform/qt/CMakeLists.txt b/src/platform/qt/CMakeLists.txt index 239413635..8b4a823a2 100644 --- a/src/platform/qt/CMakeLists.txt +++ b/src/platform/qt/CMakeLists.txt @@ -85,6 +85,7 @@ set(SOURCE_FILES LoadSaveState.cpp LogController.cpp LogView.cpp + MapView.cpp MemoryModel.cpp MemorySearch.cpp MemoryView.cpp @@ -119,6 +120,7 @@ set(UI_FILES IOViewer.ui LoadSaveState.ui LogView.ui + MapView.ui MemorySearch.ui MemoryView.ui ObjView.ui diff --git a/src/platform/qt/MapView.cpp b/src/platform/qt/MapView.cpp new file mode 100644 index 000000000..bd70ac164 --- /dev/null +++ b/src/platform/qt/MapView.cpp @@ -0,0 +1,65 @@ +/* Copyright (c) 2013-2017 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "MapView.h" + +#include "CoreController.h" +#include "GBAApp.h" + +#include +#include + +using namespace QGBA; + +MapView::MapView(std::shared_ptr controller, QWidget* parent) + : AssetView(controller, parent) + , m_controller(controller) +{ + m_ui.setupUi(this); + m_ui.tile->setController(controller); + + switch (m_controller->platform()) { +#ifdef M_CORE_GBA + case PLATFORM_GBA: + m_ui.tile->setBoundary(2048, 0, 2); + break; +#endif +#ifdef M_CORE_GB + case PLATFORM_GB: + m_ui.tile->setBoundary(1024, 0, 0); + break; +#endif + default: + return; + } + + connect(m_ui.magnification, static_cast(&QSpinBox::valueChanged), [this]() { + updateTiles(true); + }); +} + +#ifdef M_CORE_GBA +void MapView::updateTilesGBA(bool force) { + QImage bg(QSize(256, 256), QImage::Format_ARGB32); + uchar* bgBits = bg.bits(); + mMapCache* mapCache = mMapCacheSetGetPointer(&m_cacheSet->maps, 0); + for (int j = 0; j < 32; ++j) { + for (int i = 0; i < 32; ++i) { + mMapCacheCleanTile(mapCache, &m_mapStatus[i + j * 32], i, j); + } + for (int i = 0; i < 8; ++i) { + memcpy(static_cast(&bgBits[256 * 4 * (i + j * 8)]), mMapCacheGetRow(mapCache, i + j * 8), 256 * 4); + } + } + bg = bg.convertToFormat(QImage::Format_RGB32).rgbSwapped(); + m_ui.map->setPixmap(QPixmap::fromImage(bg)); +} +#endif + +#ifdef M_CORE_GB +void MapView::updateTilesGB(bool force) { +} +#endif + diff --git a/src/platform/qt/MapView.h b/src/platform/qt/MapView.h new file mode 100644 index 000000000..affc5d4bf --- /dev/null +++ b/src/platform/qt/MapView.h @@ -0,0 +1,38 @@ +/* Copyright (c) 2013-2017 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#pragma once + +#include "AssetView.h" + +#include "ui_MapView.h" + +#include + +namespace QGBA { + +class CoreController; + +class MapView : public AssetView { +Q_OBJECT + +public: + MapView(std::shared_ptr controller, QWidget* parent = nullptr); + +private: +#ifdef M_CORE_GBA + void updateTilesGBA(bool force) override; +#endif +#ifdef M_CORE_GB + void updateTilesGB(bool force) override; +#endif + + Ui::MapView m_ui; + + std::shared_ptr m_controller; + mMapCacheEntry m_mapStatus[1024 * 1024] = {}; // TODO: Correct size +}; + +} diff --git a/src/platform/qt/MapView.ui b/src/platform/qt/MapView.ui new file mode 100644 index 000000000..683c6a611 --- /dev/null +++ b/src/platform/qt/MapView.ui @@ -0,0 +1,101 @@ + + + MapView + + + + 0 + 0 + 498 + 335 + + + + Maps + + + + + + + + + true + + + + + 0 + 0 + 314 + 309 + + + + + + + + + + + + + + + + + + Qt::Vertical + + + + 0 + 0 + + + + + + + + + + + 0 + 0 + + + + × + + + 1 + + + 4 + + + + + + + Magnification + + + + + + + + + + QGBA::AssetTile + QGroupBox +
AssetTile.h
+ 1 +
+
+ + +
diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index dbc3d915e..1b6232a00 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -35,9 +35,10 @@ #include "IOViewer.h" #include "LoadSaveState.h" #include "LogView.h" -#include "MultiplayerController.h" +#include "MapView.h" #include "MemorySearch.h" #include "MemoryView.h" +#include "MultiplayerController.h" #include "OverrideView.h" #include "ObjView.h" #include "PaletteView.h" @@ -1491,6 +1492,11 @@ void Window::setupMenu(QMenuBar* menubar) { m_gameActions.append(tileView); addControlledAction(toolsMenu, tileView, "tileWindow"); + QAction* mapView = new QAction(tr("View &map..."), toolsMenu); + connect(mapView, &QAction::triggered, openControllerTView()); + m_gameActions.append(mapView); + addControlledAction(toolsMenu, mapView, "mapWindow"); + QAction* memoryView = new QAction(tr("View memory..."), toolsMenu); connect(memoryView, &QAction::triggered, openControllerTView()); m_gameActions.append(memoryView);