From 022dc899da66572eaaefdb8d4b74a9d499a096dc Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Sun, 6 Jan 2019 12:53:31 -0600 Subject: [PATCH] Add transparency slider for overlayed collision tiles on the map --- forms/mainwindow.ui | 47 ++++++++++++++++++++++++-------- include/config.h | 4 +++ include/core/map.h | 2 +- include/editor.h | 1 + include/mainwindow.h | 6 +++- include/ui/collisionpixmapitem.h | 6 ++-- src/config.cpp | 17 ++++++++++++ src/core/map.cpp | 4 +-- src/editor.cpp | 2 +- src/mainwindow.cpp | 23 +++++++++++----- src/ui/collisionpixmapitem.cpp | 2 +- 11 files changed, 87 insertions(+), 27 deletions(-) diff --git a/forms/mainwindow.ui b/forms/mainwindow.ui index 93bc2c79..762c2cd4 100644 --- a/forms/mainwindow.ui +++ b/forms/mainwindow.ui @@ -1112,7 +1112,7 @@ 0 - + @@ -1128,20 +1128,20 @@ - - + + - Qt::Horizontal + Qt::Vertical - 40 - 20 + 20 + 40 - + Qt::Horizontal @@ -1154,19 +1154,42 @@ - - + + - Qt::Vertical + Qt::Horizontal - 20 - 40 + 40 + 20 + + + + 0 + + + 100 + + + 50 + + + Qt::Horizontal + + + + + + + Transparency + + + diff --git a/include/config.h b/include/config.h index a8979e96..31c91d9f 100644 --- a/include/config.h +++ b/include/config.h @@ -31,15 +31,18 @@ public: this->recentMap = ""; this->mapSortOrder = MapSortOrder::Group; this->prettyCursors = true; + this->collisionOpacity = 50; } void setRecentProject(QString project); void setRecentMap(QString map); void setMapSortOrder(MapSortOrder order); void setPrettyCursors(bool enabled); + void setCollisionOpacity(int opacity); QString getRecentProject(); QString getRecentMap(); MapSortOrder getMapSortOrder(); bool getPrettyCursors(); + int getCollisionOpacity(); protected: QString getConfigFilepath(); void parseConfigKeyValue(QString key, QString value); @@ -50,6 +53,7 @@ private: QString recentMap; MapSortOrder mapSortOrder; bool prettyCursors; + int collisionOpacity; }; extern PorymapConfig porymapConfig; diff --git a/include/core/map.h b/include/core/map.h index 252a8666..94dda0cf 100644 --- a/include/core/map.h +++ b/include/core/map.h @@ -59,7 +59,7 @@ public: int getWidth(); int getHeight(); QPixmap render(bool ignoreCache); - QPixmap renderCollision(bool ignoreCache); + QPixmap renderCollision(qreal opacity, bool ignoreCache); bool blockChanged(int, Blockdata*); void cacheBlockdata(); void cacheCollision(); diff --git a/include/editor.h b/include/editor.h index 622588ba..82a3ca9b 100644 --- a/include/editor.h +++ b/include/editor.h @@ -114,6 +114,7 @@ public: int scale_exp = 0; double scale_base = sqrt(2); // adjust scale factor with this + qreal collisionOpacity = 0.5; void objectsView_onMousePress(QMouseEvent *event); void objectsView_onMouseMove(QMouseEvent *event); diff --git a/include/mainwindow.h b/include/mainwindow.h index 2823ccff..a71e57e1 100644 --- a/include/mainwindow.h +++ b/include/mainwindow.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include "project.h" #include "config.h" @@ -52,7 +53,6 @@ private slots: void on_action_Exit_triggered(); void on_comboBox_Song_activated(const QString &arg1); void on_comboBox_Location_activated(const QString &arg1); - void on_comboBox_Visibility_activated(const QString &arg1); void on_comboBox_Weather_activated(const QString &arg1); void on_comboBox_Type_activated(const QString &arg1); void on_comboBox_BattleScene_activated(const QString &arg1); @@ -137,10 +137,14 @@ private slots: void on_lineEdit_filterBox_textChanged(const QString &arg1); + void closeEvent(QCloseEvent *); + void eventTabChanged(int index); void selectedEventIndexChanged(int index); + void on_horizontalSlider_CollisionTransparency_valueChanged(int value); + private: Ui::MainWindow *ui; TilesetEditor *tilesetEditor = nullptr; diff --git a/include/ui/collisionpixmapitem.h b/include/ui/collisionpixmapitem.h index 8fa87aff..63af0f6c 100644 --- a/include/ui/collisionpixmapitem.h +++ b/include/ui/collisionpixmapitem.h @@ -10,17 +10,19 @@ class CollisionPixmapItem : public MapPixmapItem { Q_OBJECT public: - CollisionPixmapItem(Map *map, MovementPermissionsSelector *movementPermissionsSelector, MetatileSelector *metatileSelector, Settings *settings) + CollisionPixmapItem(Map *map, MovementPermissionsSelector *movementPermissionsSelector, MetatileSelector *metatileSelector, Settings *settings, qreal *opacity) : MapPixmapItem(map, metatileSelector, settings){ this->movementPermissionsSelector = movementPermissionsSelector; + this->opacity = opacity; } MovementPermissionsSelector *movementPermissionsSelector; + qreal *opacity; void updateMovementPermissionSelection(QGraphicsSceneMouseEvent *event); virtual void paint(QGraphicsSceneMouseEvent*); virtual void floodFill(QGraphicsSceneMouseEvent*); virtual void magicFill(QGraphicsSceneMouseEvent*); virtual void pick(QGraphicsSceneMouseEvent*); - virtual void draw(bool ignoreCache = false); + void draw(bool ignoreCache = false); signals: void mouseEvent(QGraphicsSceneMouseEvent *, CollisionPixmapItem *); diff --git a/src/config.cpp b/src/config.cpp index 0fa7e01e..1a7a529f 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -119,6 +119,13 @@ void PorymapConfig::parseConfigKeyValue(QString key, QString value) { this->mapSortOrder = MapSortOrder::Group; logWarn(QString("Invalid config value for map_sort_order: '%1'. Must be 'group', 'area', or 'layout'.").arg(value)); } + } else if (key == "collision_opacity") { + bool ok; + this->collisionOpacity = qMax(0, qMin(100, value.toInt(&ok))); + if (!ok) { + logWarn(QString("Invalid config value for collision_opacity: '%1'. Must be an integer.").arg(value)); + this->collisionOpacity = 50; + } } else { logWarn(QString("Invalid config key found in config file %1: '%2'").arg(this->getConfigFilepath()).arg(key)); } @@ -130,6 +137,7 @@ QMap PorymapConfig::getKeyValueMap() { map.insert("recent_map", this->recentMap); map.insert("pretty_cursors", this->prettyCursors ? "1" : "0"); map.insert("map_sort_order", mapSortOrderMap.value(this->mapSortOrder)); + map.insert("collision_opacity", QString("%1").arg(this->collisionOpacity)); return map; } @@ -153,6 +161,11 @@ void PorymapConfig::setPrettyCursors(bool enabled) { this->save(); } +void PorymapConfig::setCollisionOpacity(int opacity) { + this->collisionOpacity = opacity; + // don't auto-save here because this can be called very frequently. +} + QString PorymapConfig::getRecentProject() { return this->recentProject; } @@ -169,6 +182,10 @@ bool PorymapConfig::getPrettyCursors() { return this->prettyCursors; } +int PorymapConfig::getCollisionOpacity() { + return this->collisionOpacity; +} + const QMap baseGameVersionMap = { {BaseGameVersion::pokeruby, "pokeruby"}, {BaseGameVersion::pokeemerald, "pokeemerald"}, diff --git a/src/core/map.cpp b/src/core/map.cpp index 16b436ab..e31825b3 100644 --- a/src/core/map.cpp +++ b/src/core/map.cpp @@ -110,7 +110,7 @@ void Map::cacheCollision() { } } -QPixmap Map::renderCollision(bool ignoreCache) { +QPixmap Map::renderCollision(qreal opacity, bool ignoreCache) { bool changed_any = false; int width_ = getWidth(); int height_ = getHeight(); @@ -141,7 +141,7 @@ QPixmap Map::renderCollision(bool ignoreCache) { painter.setOpacity(1); painter.drawImage(metatile_origin, metatile_image); painter.save(); - painter.setOpacity(0.55); + painter.setOpacity(opacity); painter.drawImage(metatile_origin, collision_metatile_image); painter.restore(); } diff --git a/src/editor.cpp b/src/editor.cpp index deec11cc..c3de616a 100644 --- a/src/editor.cpp +++ b/src/editor.cpp @@ -575,7 +575,7 @@ void Editor::displayMapMovementPermissions() { scene->removeItem(collision_item); delete collision_item; } - collision_item = new CollisionPixmapItem(map, this->movement_permissions_selector_item, this->metatile_selector_item, this->settings); + collision_item = new CollisionPixmapItem(map, this->movement_permissions_selector_item, this->metatile_selector_item, this->settings, &this->collisionOpacity); connect(collision_item, SIGNAL(mouseEvent(QGraphicsSceneMouseEvent*,CollisionPixmapItem*)), this, SLOT(mouseEvent_collision(QGraphicsSceneMouseEvent*,CollisionPixmapItem*))); connect(collision_item, SIGNAL(hoveredMapMovementPermissionChanged(int, int)), diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 241ac028..150ef37e 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -204,6 +204,10 @@ void MainWindow::loadUserSettings() { ui->actionBetter_Cursors->setChecked(porymapConfig.getPrettyCursors()); this->editor->settings->betterCursors = porymapConfig.getPrettyCursors(); mapSortOrder = porymapConfig.getMapSortOrder(); + ui->horizontalSlider_CollisionTransparency->blockSignals(true); + this->editor->collisionOpacity = static_cast(porymapConfig.getCollisionOpacity()) / 100; + ui->horizontalSlider_CollisionTransparency->setValue(porymapConfig.getCollisionOpacity()); + ui->horizontalSlider_CollisionTransparency->blockSignals(false); } bool MainWindow::openRecentProject() { @@ -482,13 +486,6 @@ void MainWindow::on_comboBox_Location_activated(const QString &location) } } -void MainWindow::on_comboBox_Visibility_activated(const QString &requiresFlash) -{ - if (editor && editor->map) { - editor->map->requiresFlash = requiresFlash; - } -} - void MainWindow::on_comboBox_Weather_activated(const QString &weather) { if (editor && editor->map) { @@ -1483,6 +1480,12 @@ void MainWindow::selectedEventIndexChanged(int index) editor->selectMapEvent(selectedEvent); } +void MainWindow::on_horizontalSlider_CollisionTransparency_valueChanged(int value) { + this->editor->collisionOpacity = static_cast(value) / 100; + porymapConfig.setCollisionOpacity(value); + this->editor->collision_item->draw(true); +} + void MainWindow::on_toolButton_deleteObject_clicked() { if (editor && editor->selected_events) { @@ -1753,3 +1756,9 @@ void MainWindow::on_actionTileset_Editor_triggered() this->tilesetEditor->activateWindow(); } } + +void MainWindow::closeEvent(QCloseEvent *event) { + porymapConfig.save(); + + QMainWindow::closeEvent(event); +} diff --git a/src/ui/collisionpixmapitem.cpp b/src/ui/collisionpixmapitem.cpp index c2bb34e5..723fe0da 100644 --- a/src/ui/collisionpixmapitem.cpp +++ b/src/ui/collisionpixmapitem.cpp @@ -26,7 +26,7 @@ void CollisionPixmapItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { void CollisionPixmapItem::draw(bool ignoreCache) { if (map) { - setPixmap(map->renderCollision(ignoreCache)); + setPixmap(map->renderCollision(*this->opacity, ignoreCache)); } }