all repos — mgba @ bd8fe4d87845186f84b667fc5ab1d8293c0df86c

mGBA Game Boy Advance Emulator

src/platform/qt/TileView.cpp (view raw)

  1/* Copyright (c) 2013-2016 Jeffrey Pfau
  2 *
  3 * This Source Code Form is subject to the terms of the Mozilla Public
  4 * License, v. 2.0. If a copy of the MPL was not distributed with this
  5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  6#include "TileView.h"
  7
  8#include "CoreController.h"
  9#include "GBAApp.h"
 10
 11#include <QFontDatabase>
 12#include <QTimer>
 13
 14#ifdef M_CORE_GB
 15#include <mgba/internal/gb/gb.h>
 16#endif
 17
 18using namespace QGBA;
 19
 20TileView::TileView(std::shared_ptr<CoreController> controller, QWidget* parent)
 21	: AssetView(controller, parent)
 22	, m_controller(controller)
 23{
 24	m_ui.setupUi(this);
 25	m_ui.tile->setController(controller);
 26
 27	connect(m_ui.tiles, &TilePainter::indexPressed, m_ui.tile, &AssetTile::selectIndex);
 28	connect(m_ui.paletteId, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &TileView::updatePalette);
 29
 30	switch (m_controller->platform()) {
 31#ifdef M_CORE_GBA
 32	case PLATFORM_GBA:
 33		m_ui.tile->setBoundary(2048, 0, 2);
 34		break;
 35#endif
 36#ifdef M_CORE_GB
 37	case PLATFORM_GB:
 38		m_ui.palette256->setEnabled(false);
 39		m_ui.tile->setBoundary(1024, 0, 0);
 40		break;
 41#endif
 42	default:
 43		return;
 44	}
 45
 46	connect(m_ui.palette256, &QAbstractButton::toggled, [this](bool selected) {
 47		if (selected) {
 48			m_ui.paletteId->setValue(0);
 49		}
 50		switch (m_controller->platform()) {
 51#ifdef M_CORE_GBA
 52		case PLATFORM_GBA:
 53			m_ui.tile->setBoundary(2048 >> selected, selected, selected + 2);
 54			break;
 55#endif
 56#ifdef M_CORE_GB
 57		case PLATFORM_GB:
 58			return;
 59#endif
 60		default:
 61			break;
 62		}
 63		updateTiles(true);
 64	});
 65	connect(m_ui.magnification, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), [this]() {
 66		updateTiles(true);
 67	});
 68
 69	connect(m_ui.tilesPerRow, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), [this](int count) {
 70		m_ui.tiles->setMinimumSize(m_ui.magnification->value() * 8 * count, m_ui.tiles->minimumSize().height());
 71		updateTiles(true);
 72	});
 73
 74	connect(m_ui.tileFit, &QAbstractButton::toggled, [this](bool selected) {
 75		if (!selected) {
 76			m_ui.tiles->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
 77			m_ui.tiles->setMinimumSize(m_ui.magnification->value() * 8 * m_ui.tilesPerRow->value(), m_ui.tiles->minimumSize().height());
 78		} else {
 79			m_ui.tiles->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
 80		}
 81		updateTiles(true);
 82	});
 83}
 84
 85#ifdef M_CORE_GBA
 86void TileView::updateTilesGBA(bool force) {
 87	if (m_ui.palette256->isChecked()) {
 88		m_ui.tiles->setTileCount(1536);
 89		mTileCache* cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 1);
 90		for (int i = 0; i < 1024; ++i) {
 91			const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i, 0);
 92			if (data) {
 93				m_ui.tiles->setTile(i, data);
 94			} else if (force) {
 95				m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i, 0));
 96			}
 97		}
 98		cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 3);
 99		for (int i = 1024; i < 1536; ++i) {
100			const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i - 1024, 0);
101			if (data) {
102				m_ui.tiles->setTile(i, data);
103			} else if (force) {
104				m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i - 1024, 0));
105			}
106		}
107	} else {
108		mTileCache* cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 0);
109		m_ui.tiles->setTileCount(3072);
110		for (int i = 0; i < 2048; ++i) {
111			const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i, m_paletteId);
112			if (data) {
113				m_ui.tiles->setTile(i, data);
114			} else if (force) {
115				m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i, m_paletteId));
116			}
117		}
118		cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 2);
119		for (int i = 2048; i < 3072; ++i) {
120			const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i - 2048, m_paletteId);
121			if (data) {
122				m_ui.tiles->setTile(i, data);
123			} else if (force) {
124				m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i - 2048, m_paletteId));
125			}
126		}
127	}
128}
129#endif
130
131#ifdef M_CORE_GB
132void TileView::updateTilesGB(bool force) {
133	const GB* gb = static_cast<const GB*>(m_controller->thread()->core->board);
134	int count = gb->model >= GB_MODEL_CGB ? 1024 : 512;
135	m_ui.tiles->setTileCount(count);
136	mTileCache* cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 0);
137	for (int i = 0; i < count; ++i) {
138		const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[8 * i], i, m_paletteId);
139		if (data) {
140			m_ui.tiles->setTile(i, data);
141		} else if (force) {
142			m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i, m_paletteId));
143		}
144	}
145}
146#endif
147
148void TileView::updatePalette(int palette) {
149	m_paletteId = palette;
150	m_ui.tile->setPalette(palette);
151	updateTiles(true);
152}