diff --git a/src/platform/qt/Swatch.cpp b/src/platform/qt/Swatch.cpp index f3332274b..cc575cff1 100644 --- a/src/platform/qt/Swatch.cpp +++ b/src/platform/qt/Swatch.cpp @@ -18,7 +18,6 @@ Swatch::Swatch(QWidget* parent) : QWidget(parent) { m_size = 10; - setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); } void Swatch::setSize(int size) { diff --git a/src/platform/qt/TilePainter.cpp b/src/platform/qt/TilePainter.cpp index 5c6ce2310..e78dd95c1 100644 --- a/src/platform/qt/TilePainter.cpp +++ b/src/platform/qt/TilePainter.cpp @@ -16,6 +16,7 @@ TilePainter::TilePainter(QWidget* parent) { m_backing = QPixmap(256, 768); m_backing.fill(Qt::transparent); + resize(256, 768); } void TilePainter::paintEvent(QPaintEvent* event) { @@ -23,18 +24,31 @@ void TilePainter::paintEvent(QPaintEvent* event) { painter.drawPixmap(QPoint(), m_backing); } +void TilePainter::resizeEvent(QResizeEvent* event) { + if (width() / 8 != m_backing.width() / 8) { + m_backing = QPixmap(width(), (3072 * 8) / (width() / 8)); + m_backing.fill(Qt::transparent); + } +} + void TilePainter::mousePressEvent(QMouseEvent* event) { int x = event->x() / 8; int y = event->y() / 8; - emit indexPressed(y * 32 + x); + emit indexPressed(y * (width() / 8) + x); } void TilePainter::setTile(int index, const uint16_t* data) { QPainter painter(&m_backing); - int x = index & 31; - int y = index / 32; + int w = width() / 8; + int x = index % w; + int y = index / w; QRect r(x * 8, y * 8, 8, 8); QImage tile(reinterpret_cast(data), 8, 8, QImage::Format_RGB555); painter.fillRect(r, tile.rgbSwapped()); update(r); } + +void TilePainter::setTileCount(int tiles) { + setMinimumSize(16, (tiles * 8) / (width() / 8)); + resizeEvent(nullptr); +} diff --git a/src/platform/qt/TilePainter.h b/src/platform/qt/TilePainter.h index 412006228..8786aa206 100644 --- a/src/platform/qt/TilePainter.h +++ b/src/platform/qt/TilePainter.h @@ -20,6 +20,7 @@ public: public slots: void setTile(int index, const uint16_t*); + void setTileCount(int tiles); signals: void indexPressed(int index); @@ -27,6 +28,7 @@ signals: protected: void paintEvent(QPaintEvent*) override; void mousePressEvent(QMouseEvent*) override; + void resizeEvent(QResizeEvent*) override; private: QPixmap m_backing; diff --git a/src/platform/qt/TileView.cpp b/src/platform/qt/TileView.cpp index 5d6c6b880..86087c4bf 100644 --- a/src/platform/qt/TileView.cpp +++ b/src/platform/qt/TileView.cpp @@ -8,6 +8,7 @@ #include "GBAApp.h" #include +#include extern "C" { #include "gba/gba.h" @@ -66,7 +67,7 @@ void TileView::selectIndex(int index) { m_ui.preview->update(); } -void TileView::updateTiles() { +void TileView::updateTiles(bool force) { if (!m_controller->thread() || !m_controller->thread()->core) { return; } @@ -75,31 +76,39 @@ void TileView::updateTiles() { GBAVideoTileCacheAssociate(&m_tileCache, &gba->video); if (m_ui.palette256->isChecked()) { - m_ui.tiles->setMinimumSize(256, 384); + m_ui.tiles->setTileCount(1536); for (int i = 0; i < 1024; ++i) { const uint16_t* data = GBAVideoTileCacheGetTile256IfDirty(&m_tileCache, i, 0); if (data) { m_ui.tiles->setTile(i, data); + } else if (force) { + m_ui.tiles->setTile(i, GBAVideoTileCacheGetTile256(&m_tileCache, i, 0)); } } for (int i = 1024; i < 1536; ++i) { const uint16_t* data = GBAVideoTileCacheGetTile256IfDirty(&m_tileCache, i, 1); if (data) { m_ui.tiles->setTile(i, data); + } else if (force) { + m_ui.tiles->setTile(i, GBAVideoTileCacheGetTile256(&m_tileCache, i, 1)); } } } else { - m_ui.tiles->setMinimumSize(256, 768); + m_ui.tiles->setTileCount(3072); for (int i = 0; i < 2048; ++i) { const uint16_t* data = GBAVideoTileCacheGetTile16IfDirty(&m_tileCache, i, m_paletteId); if (data) { m_ui.tiles->setTile(i, data); + } else if (force) { + m_ui.tiles->setTile(i, GBAVideoTileCacheGetTile16(&m_tileCache, i, m_paletteId)); } } for (int i = 2048; i < 3072; ++i) { const uint16_t* data = GBAVideoTileCacheGetTile16IfDirty(&m_tileCache, i, m_paletteId + 16); if (data) { m_ui.tiles->setTile(i, data); + } else if (force) { + m_ui.tiles->setTile(i, GBAVideoTileCacheGetTile16(&m_tileCache, i, m_paletteId + 16)); } } } @@ -109,3 +118,14 @@ void TileView::updatePalette(int palette) { m_paletteId = palette; updateTiles(); } + +void TileView::resizeEvent(QResizeEvent*) { + updateTiles(true); +} + +void TileView::showEvent(QShowEvent*) { + // XXX: Figure out how to prevent the first resizeEvent + QTimer::singleShot(10, [this]() { + updateTiles(true); + }); +} diff --git a/src/platform/qt/TileView.h b/src/platform/qt/TileView.h index 5ef4ad9c2..fec37afd2 100644 --- a/src/platform/qt/TileView.h +++ b/src/platform/qt/TileView.h @@ -26,12 +26,16 @@ public: virtual ~TileView(); public slots: - void updateTiles(); + void updateTiles(bool force = false); void updatePalette(int); private slots: void selectIndex(int); +protected: + void resizeEvent(QResizeEvent*) override; + void showEvent(QShowEvent*) override; + private: Ui::TileView m_ui; diff --git a/src/platform/qt/TileView.ui b/src/platform/qt/TileView.ui index cd662adb0..d3adae10d 100644 --- a/src/platform/qt/TileView.ui +++ b/src/platform/qt/TileView.ui @@ -6,8 +6,8 @@ 0 0 - 288 - 269 + 509 + 265 @@ -23,43 +23,31 @@ + + + 0 + 0 + + + + + 170 + 192 + + - Preview + - - - - - Qt::Horizontal - - - - - - - - 87 - 87 - - - - - - - - Qt::Horizontal - - - - 0 - 0 - - - - - + + + + 87 + 87 + + + @@ -108,6 +96,12 @@ + + + 170 + 16777215 + + 15 @@ -138,16 +132,10 @@ 0 0 - 16 - 16 + 282 + 768 - - - 0 - 0 - - 0 @@ -167,11 +155,17 @@ - + 0 0 + + + 256 + 768 + + @@ -195,5 +189,22 @@ - + + + palette256 + toggled(bool) + paletteId + setDisabled(bool) + + + 100 + 54 + + + 96 + 22 + + + +