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}