From 2d1b38ce401de1775eb75f3d081396eb9b609b8d Mon Sep 17 00:00:00 2001 From: altalk23 <45172705+altalk23@users.noreply.github.com> Date: Fri, 19 Jul 2024 00:06:44 +0300 Subject: [PATCH] new ui implemented! --- CMakeLists.txt | 3 +- include/Allium/manager/BrushManager.hpp | 10 -- include/Allium/ui/AlliumButtonBar.hpp | 47 ++++++ include/Allium/ui/AlliumPopup.hpp | 33 ---- include/Allium/ui/SupportPopup.hpp | 14 ++ mod.json | 47 +++++- resources/EditorIcon.png | Bin 0 -> 17786 bytes resources/icons/BezierIcon.png | Bin 0 -> 6037 bytes resources/icons/BrushIcon.png | Bin 0 -> 4430 bytes resources/icons/FinalizeIcon.png | Bin 0 -> 2035 bytes resources/icons/GiftIcon.png | Bin 0 -> 4186 bytes resources/icons/LineIcon.png | Bin 0 -> 3768 bytes resources/icons/PaletteIcon.png | Bin 0 -> 7389 bytes resources/icons/PanIcon.png | Bin 0 -> 4933 bytes resources/icons/SettingIcon.png | Bin 0 -> 6217 bytes resources/icons/ThicknessIcon.png | Bin 0 -> 3317 bytes resources/images/ActiveButton.png | Bin 0 -> 4112 bytes resources/images/ButtonGlow.png | Bin 0 -> 8255 bytes resources/images/DeactiveButton.png | Bin 0 -> 4110 bytes resources/images/GiftButton.png | Bin 0 -> 4332 bytes resources/images/NeutralButton.png | Bin 0 -> 4037 bytes resources/{ => images}/SupportPopup.png | Bin src/hooks/EditorUI.cpp | 125 ++++++++------ src/manager/BrushManager.cpp | 18 +- src/ui/AlliumButtonBar.cpp | 206 ++++++++++++++++++++++ src/ui/AlliumPopup.cpp | 216 ------------------------ src/ui/SupportPopup.cpp | 57 +++++++ 27 files changed, 455 insertions(+), 321 deletions(-) create mode 100644 include/Allium/ui/AlliumButtonBar.hpp delete mode 100644 include/Allium/ui/AlliumPopup.hpp create mode 100644 include/Allium/ui/SupportPopup.hpp create mode 100644 resources/EditorIcon.png create mode 100644 resources/icons/BezierIcon.png create mode 100644 resources/icons/BrushIcon.png create mode 100644 resources/icons/FinalizeIcon.png create mode 100644 resources/icons/GiftIcon.png create mode 100644 resources/icons/LineIcon.png create mode 100644 resources/icons/PaletteIcon.png create mode 100644 resources/icons/PanIcon.png create mode 100644 resources/icons/SettingIcon.png create mode 100644 resources/icons/ThicknessIcon.png create mode 100644 resources/images/ActiveButton.png create mode 100644 resources/images/ButtonGlow.png create mode 100644 resources/images/DeactiveButton.png create mode 100644 resources/images/GiftButton.png create mode 100644 resources/images/NeutralButton.png rename resources/{ => images}/SupportPopup.png (100%) create mode 100644 src/ui/AlliumButtonBar.cpp delete mode 100644 src/ui/AlliumPopup.cpp create mode 100644 src/ui/SupportPopup.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index c7442a8..49473f0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,8 @@ add_library(${PROJECT_NAME} SHARED src/main.cpp src/hooks/EditorUI.cpp src/manager/BrushManager.cpp - src/ui/AlliumPopup.cpp + src/ui/AlliumButtonBar.cpp + src/ui/SupportPopup.cpp src/util/BrushDrawer.cpp src/util/CurveBrushDrawer.cpp src/util/EditorUtilities.cpp diff --git a/include/Allium/manager/BrushManager.hpp b/include/Allium/manager/BrushManager.hpp index 009ff74..88ccf73 100644 --- a/include/Allium/manager/BrushManager.hpp +++ b/include/Allium/manager/BrushManager.hpp @@ -3,22 +3,12 @@ #include namespace allium { - enum class BrushType { - None, - Line, - Curve, - Free - }; - class BrushDrawer; class BrushManager { public: static BrushManager* get(); - BrushType m_currentBrush = BrushType::None; - BrushDrawer* m_currentDrawer = nullptr; - cocos2d::ccColor3B getColor(); int getColorID(); diff --git a/include/Allium/ui/AlliumButtonBar.hpp b/include/Allium/ui/AlliumButtonBar.hpp new file mode 100644 index 0000000..0f6abb3 --- /dev/null +++ b/include/Allium/ui/AlliumButtonBar.hpp @@ -0,0 +1,47 @@ +#pragma once + +#include + +namespace allium { + class BrushDrawer; + class AlliumButtonBar : public cocos2d::CCNode { + protected: + geode::Ref m_buttonBar; + cocos2d::CCArray* m_buttons = nullptr; + + CCMenuItemToggler* m_lineToggle = nullptr; + CCMenuItemToggler* m_curveToggle = nullptr; + CCMenuItemToggler* m_freeToggle = nullptr; + BrushDrawer* m_brushDrawer = nullptr; + + public: + static AlliumButtonBar* create(EditorUI* editorUI); + + bool init(EditorUI* editorUI); + + void resetToggles(cocos2d::CCObject* sender); + + EditButtonBar* getButtonBar() const; + BrushDrawer* getBrushDrawer() const; + + CCMenuItemSpriteExtra* addButton( + std::string_view spriteName, std::string_view bgName, std::string_view id, + geode::utils::MiniFunction const& callback + ); + + CCMenuItemSpriteExtra* addDefaultButton( + std::string_view spriteName, std::string_view id, + geode::utils::MiniFunction const& callback + ); + + CCMenuItemToggler* addToggle( + std::string_view spriteName, std::string_view bgOnName, std::string_view bgOffName, std::string_view id, + geode::utils::MiniFunction const& callback + ); + + CCMenuItemToggler* addDefaultToggle( + std::string_view spriteName, std::string_view id, + geode::utils::MiniFunction const& callback + ); + }; +} \ No newline at end of file diff --git a/include/Allium/ui/AlliumPopup.hpp b/include/Allium/ui/AlliumPopup.hpp deleted file mode 100644 index e598a75..0000000 --- a/include/Allium/ui/AlliumPopup.hpp +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include - -namespace allium { - class AlliumPopup : public geode::Popup<> { - protected: - cocos2d::CCNode* m_mainColumn = nullptr; - cocos2d::CCMenu* m_brushMenu = nullptr; - - CCMenuItemToggler* m_noneBrushToggle = nullptr; - CCMenuItemToggler* m_lineBrushToggle = nullptr; - CCMenuItemToggler* m_curveBrushToggle = nullptr; - CCMenuItemToggler* m_freeBrushToggle = nullptr; - - public: - static AlliumPopup* create(); - - cocos2d::CCNode* getEnablePanningSprite(); - cocos2d::CCNode* getDisablePanningSprite(); - - void createPanButton(); - void createFinalizeButton(); - - void brushToggleCallback(CCMenuItemToggler* toggle); - - void createBrushToggle( - std::string_view name, std::string const& id, CCMenuItemToggler*& toggle - ); - - bool setup() override; - }; -} \ No newline at end of file diff --git a/include/Allium/ui/SupportPopup.hpp b/include/Allium/ui/SupportPopup.hpp new file mode 100644 index 0000000..1ace5f9 --- /dev/null +++ b/include/Allium/ui/SupportPopup.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include + +namespace allium { + class SupportPopup : public FLAlertLayer { + public: + static SupportPopup* create(); + bool init() override; + + void keyBackClicked() override; + void onClose(cocos2d::CCObject* sender); + }; +} \ No newline at end of file diff --git a/mod.json b/mod.json index 96c9b28..e590907 100644 --- a/mod.json +++ b/mod.json @@ -4,7 +4,7 @@ "win": "2.206", "android": "2.206" }, - "version": "v0.2.0-alpha", + "version": "v0.3.0-alpha", "id": "alk.allium", "name": "Allium Drawing Tool", "developer": "alk", @@ -24,5 +24,50 @@ ], "links": { "source": "https://github.com/altalk23/Allium" + }, + "resources": { + "spritesheets": { + "AlliumSpritesheet": [ + "resources/*.png", + "resources/icons/*.png" + ] + }, + "sprites": [ + "resources/images/*.png" + ] + }, + "settings": { + "brush-line-width": { + "type": "float", + "default": 5, + "min": 0.5, + "name": "Brush Width", + "description": "(Temporary) The thickness of the brush", + "max": 30 + }, + "brush-color-id": { + "type": "int", + "default": 1011, + "name": "Brush Color ID", + "description": "(Temporary) The ID of the brush color", + "min": 1, + "max": 1020 + }, + "brush-curve-detail": { + "type": "float", + "default": 0.4, + "min": 0.05, + "name": "Curve detail", + "description": "(Temporary) The detail of the curve", + "max": 3 + }, + "brush-free-threshold": { + "type": "float", + "default": 0.4, + "min": 0.05, + "name": "Free Threshold", + "description": "(Temporary) The threshold of the free tool", + "max": 1.5 + } } } \ No newline at end of file diff --git a/resources/EditorIcon.png b/resources/EditorIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..b40f2a437b660bf78a6b275b6b9dce3e7ff4a51c GIT binary patch literal 17786 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 literal 0 HcmV?d00001 diff --git a/resources/icons/BrushIcon.png b/resources/icons/BrushIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..d1f029323232632e35fac44f9b993c3e933a5584 GIT binary patch literal 4430 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 literal 0 HcmV?d00001 diff --git a/resources/icons/FinalizeIcon.png b/resources/icons/FinalizeIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..4b570703758be701416ee27320380537b3f7e1ac GIT binary patch literal 2035 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 z z>d0o0tker(MKXa+ccD_(aGe_&>rg39o+a9!iah(!BJ}t7Z#Si97FgHUI>mH&$66tMUg8XEn*+aRj(im;)hR5kN5$7w&g#17o)99I#v74(CgF|moNxuaz z(B2{&#Fa51wQ+cAN@GaBGm!EwB*P1a^SGGXoE$ZcG(y(QK1rW2zO^VjX%xRzZiXpz ziM8Ptfyb4K8o@9jVoRRzht=b1zQL!1_~exii4+~z=+id7`a)?38$P{4jDo2B_XY0% dC9Kz+<3u-=)BVfKvA{(WggNDKvJQP7{~s+GDXstj literal 0 HcmV?d00001 diff --git a/resources/icons/PaletteIcon.png b/resources/icons/PaletteIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..199d8e37f8f8d91830024082d5b1ffb231d829b2 GIT binary patch literal 7389 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 UTe8!CFEAqQM+o&wRok%t0ULc`$N&HU literal 0 HcmV?d00001 diff --git a/resources/icons/SettingIcon.png b/resources/icons/SettingIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..47557f8c28d8e27fb62685e21cfbc0a0f01d3a97 GIT binary patch literal 6217 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 Fe*kQV%25CS literal 0 HcmV?d00001 diff --git a/resources/icons/ThicknessIcon.png b/resources/icons/ThicknessIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..ac469da54360f842cf56657499a94b73c8f0dbc2 GIT binary patch literal 3317 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 literal 0 HcmV?d00001 diff --git a/resources/images/ActiveButton.png b/resources/images/ActiveButton.png new file mode 100644 index 0000000000000000000000000000000000000000..ad8bc62ddaefcab6e449b29f439d0f04ea9eb8b6 GIT binary patch literal 4112 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 literal 0 HcmV?d00001 diff --git a/resources/images/DeactiveButton.png b/resources/images/DeactiveButton.png new file mode 100644 index 0000000000000000000000000000000000000000..3019a08ccead73cb391fa3eff3f62c10f27c2e22 GIT binary patch literal 4110 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 #include -#include +#include #include #ifdef GEODE_IS_WINDOWS @@ -13,38 +13,78 @@ using namespace allium; #include struct EditorUIHook : Modify { + struct Fields { + geode::Ref m_buttonBar; + int tabTag = 0; + }; + + $override + void toggleMode(CCObject* sender) { + auto tag = sender->getTag(); + + if (tag != 1 && m_fields->m_buttonBar) { + m_fields->m_buttonBar->resetToggles(sender); + } + EditorUI::toggleMode(sender); + } + + $override + void onSelectBuildTab(CCObject* sender) { + auto tag = sender->getTag(); + + if (tag != m_fields->tabTag && m_fields->m_buttonBar) { + m_fields->m_buttonBar->resetToggles(sender); + } + EditorUI::onSelectBuildTab(sender); + } + $override bool init(LevelEditorLayer* editorLayer) { if (!EditorUI::init(editorLayer)) return false; - - BrushManager::get()->m_currentDrawer = nullptr; - BrushManager::get()->m_currentBrush = BrushType::None; - BrushManager::get()->m_panEditorInBrush = false; - auto buttonMenu = this->getChildByID("editor-buttons-menu"); + if (!Mod::get()->getSavedValue("allium-build-tab-announcement-shown", false)) { + auto popup = createQuickPopup( + "Allium", "Allium is available in the build tab now! You can access it there.", + "OK", nullptr, nullptr, false + ); + popup->m_scene = m_editorLayer; + popup->show(); - // temporary, will be changed with a custom sprite - auto mySprite = BasedButtonSprite::create( - CCLabelBMFont::create("Allium", "bigFont.fnt"), BaseType::Editor, - static_cast(EditorBaseSize::Normal), static_cast(EditorBaseColor::LightBlue) - ); - mySprite->setTopRelativeScale(1.6f); - - auto myButton = CCMenuItemExt::createSpriteExtra( - mySprite, [this](CCObject* sender) { - if (BrushManager::get()->m_currentDrawer) { - BrushManager::get()->m_currentDrawer->clearOverlay(); - BrushManager::get()->m_currentDrawer->updateLine(); - } - AlliumPopup::create()->show(); + Mod::get()->setSavedValue("allium-build-tab-announcement-shown", true); + } + + m_fields->m_buttonBar = AlliumButtonBar::create(this); + + m_fields->m_buttonBar->getButtonBar()->setZOrder(10); + m_fields->m_buttonBar->getButtonBar()->setVisible(false); + m_createButtonBars->addObject(m_fields->m_buttonBar->getButtonBar()); + + auto spriteOn = CCSprite::createWithSpriteFrameName("EditorIcon.png"_spr); + spriteOn->setScale(0.2f); + auto onBg = CCSprite::createWithSpriteFrameName("GJ_tabOn_001.png"); + onBg->addChildAtPosition(spriteOn, Anchor::Center, ccp(0, 0)); + + auto spriteOff = CCSprite::createWithSpriteFrameName("EditorIcon.png"_spr); + spriteOff->setScale(0.2f); + auto offBg = CCSprite::createWithSpriteFrameName("GJ_tabOff_001.png"); + offBg->addChildAtPosition(spriteOff, Anchor::Center, ccp(0, 0)); + offBg->setOpacity(150); + + m_fields->tabTag = m_tabsArray->count(); + + auto tabToggle = CCMenuItemExt::createToggler( + offBg, onBg, [this](CCObject* sender) { + this->onSelectBuildTab(sender); + static_cast(sender)->toggle(false); } ); - myButton->setID("allium-button"_spr); - // size set in Node IDs itself - myButton->setContentSize({ 40.f, 40.f }); + tabToggle->setID("allium-tab-toggle"_spr); + tabToggle->setTag(m_fields->tabTag); + m_tabsArray->addObject(tabToggle); + m_tabsMenu->addChild(tabToggle); + m_tabsMenu->updateLayout(); - buttonMenu->addChild(myButton); - buttonMenu->updateLayout(); + this->addChild(m_fields->m_buttonBar->getButtonBar()); #ifdef GEODE_IS_WINDOWS @@ -73,9 +113,9 @@ struct EditorUIHook : Modify { $override bool ccTouchBegan(CCTouch* touch, CCEvent* event) { - if (!BrushManager::get()->panEditorInBrush() && BrushManager::get()->m_currentDrawer) { + if (!BrushManager::get()->panEditorInBrush() && m_fields->m_buttonBar->getBrushDrawer()) { auto layerPosition = this->getLayerPosition(touch); - BrushManager::get()->m_currentDrawer->handleTouchStart(layerPosition); + m_fields->m_buttonBar->getBrushDrawer()->handleTouchStart(layerPosition); return true; } @@ -84,9 +124,9 @@ struct EditorUIHook : Modify { $override void ccTouchMoved(CCTouch* touch, CCEvent* event) { - if (!BrushManager::get()->panEditorInBrush() && BrushManager::get()->m_currentDrawer) { + if (!BrushManager::get()->panEditorInBrush() && m_fields->m_buttonBar->getBrushDrawer()) { auto layerPosition = this->getLayerPosition(touch); - BrushManager::get()->m_currentDrawer->handleTouchMove(layerPosition); + m_fields->m_buttonBar->getBrushDrawer()->handleTouchMove(layerPosition); return; } @@ -95,37 +135,14 @@ struct EditorUIHook : Modify { $override void ccTouchEnded(CCTouch* touch, CCEvent* event) { - if (!BrushManager::get()->panEditorInBrush() && BrushManager::get()->m_currentDrawer) { + if (!BrushManager::get()->panEditorInBrush() && m_fields->m_buttonBar->getBrushDrawer()) { auto layerPosition = this->getLayerPosition(touch); - BrushManager::get()->m_currentDrawer->handleTouchEnd(layerPosition); + m_fields->m_buttonBar->getBrushDrawer()->handleTouchEnd(layerPosition); return; } return EditorUI::ccTouchEnded(touch, event); } - - $override - void showUI(bool show) { - EditorUI::showUI(show); - - auto alliumButton = static_cast(this->getChildByIDRecursive("allium-button"_spr)); - if (alliumButton) { - alliumButton->setEnabled(show); - alliumButton->setVisible(show); - } - - auto panButton = static_cast(this->getChildByIDRecursive("allium-panning-button"_spr)); - if (panButton) { - panButton->setEnabled(show); - panButton->setVisible(show); - } - - auto finalizeButton = static_cast(this->getChildByIDRecursive("allium-finalize-button"_spr)); - if (finalizeButton) { - finalizeButton->setEnabled(show); - finalizeButton->setVisible(show); - } - } }; #ifdef GEODE_IS_WINDOWS diff --git a/src/manager/BrushManager.cpp b/src/manager/BrushManager.cpp index 42dcb61..636baf6 100644 --- a/src/manager/BrushManager.cpp +++ b/src/manager/BrushManager.cpp @@ -16,20 +16,26 @@ bool BrushManager::panEditorInBrush() { } cocos2d::ccColor3B BrushManager::getColor() { - return LevelEditorLayer::get()->m_levelSettings->m_effectManager->getColorSprite(this->getColorID())->m_color; + auto action = LevelEditorLayer::get()->m_levelSettings->m_effectManager->getColorAction(this->getColorID()); + if (!action) return ccc3(0xff, 0xff, 0xff); + return action->m_fromColor; } int BrushManager::getColorID() { - return Mod::get()->getSavedValue("brush-color-id", 1011); + return Mod::get()->getSettingValue("brush-color-id"); + // return Mod::get()->getSavedValue("brush-color-id", 1011); } float BrushManager::getLineWidth() { - return Mod::get()->getSavedValue("brush-line-width", 5.0f); + return Mod::get()->getSettingValue("brush-line-width"); + // return Mod::get()->getSavedValue("brush-line-width", 5.0f); } float BrushManager::getCurveRoughness() { - return Mod::get()->getSavedValue("brush-curve-roughness", 0.4f); + return Mod::get()->getSettingValue("brush-curve-detail"); + // return Mod::get()->getSavedValue("brush-curve-detail", 0.4f); } float BrushManager::getFreeThreshold() { - return Mod::get()->getSavedValue("brush-free-threshold", 0.4f); + return Mod::get()->getSettingValue("brush-free-threshold"); + // return Mod::get()->getSavedValue("brush-free-threshold", 0.4f); } void BrushManager::setColorID(int id) { @@ -39,7 +45,7 @@ void BrushManager::setLineWidth(float width) { Mod::get()->setSavedValue("brush-line-width", width); } void BrushManager::setCurveRoughness(float roughness) { - Mod::get()->setSavedValue("brush-curve-roughness", roughness); + Mod::get()->setSavedValue("brush-curve-detail", roughness); } void BrushManager::setFreeThreshold(float threshold) { Mod::get()->setSavedValue("brush-free-threshold", threshold); diff --git a/src/ui/AlliumButtonBar.cpp b/src/ui/AlliumButtonBar.cpp new file mode 100644 index 0000000..6dbfdd6 --- /dev/null +++ b/src/ui/AlliumButtonBar.cpp @@ -0,0 +1,206 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace allium; +using namespace geode::prelude; + +AlliumButtonBar* AlliumButtonBar::create(EditorUI* editorUI) { + auto ret = new (std::nothrow) AlliumButtonBar(); + if (ret && ret->init(editorUI)) { + ret->autorelease(); + return ret; + } + delete ret; + return nullptr; +} + +bool AlliumButtonBar::init(EditorUI* editorUI) { + if (!CCNode::init()) return false; + + m_buttons = CCArray::create(); + auto winSize = CCDirector::get()->getWinSize(); + auto winBottom = CCDirector::get()->getScreenBottom(); + auto offset = ccp(winSize.width / 2 - 5.f, winBottom + editorUI->m_toolbarHeight - 6.f); + auto rows = GameManager::get()->getIntGameVariable("0050"); + auto cols = GameManager::get()->getIntGameVariable("0049"); + + auto giftButton = this->addButton( + "GiftIcon.png"_spr, "GiftButton.png"_spr, "gift-button"_spr, + [](auto sender) { + SupportPopup::create()->show(); + } + ); + if (!Mod::get()->getSavedValue("allium-gift-popup-shown", false)) { + auto giftGlow = CCSprite::create("ButtonGlow.png"_spr); + giftGlow->setColor(ccc3(255, 255, 0)); + giftGlow->setScale(0.95f); + giftGlow->setZOrder(-1); + giftGlow->setOpacity(150); + giftGlow->setBlendFunc({GL_ONE, GL_ONE}); + giftGlow->runAction(CCRepeatForever::create( + CCSequence::create(CCFadeTo::create(1.5f, 50), CCFadeTo::create(1.5f, 150), nullptr) + )); + giftButton->addChildAtPosition(giftGlow, Anchor::Center, ccp(0, 0)); + } + + auto panToggle = this->addDefaultToggle( + "PanIcon.png"_spr, "pan-toggle"_spr, + [](auto sender) { + BrushManager::get()->m_panEditorInBrush = !BrushManager::get()->m_panEditorInBrush; + } + ); + BrushManager::get()->m_panEditorInBrush = false; + + + m_lineToggle = this->addDefaultToggle( + "LineIcon.png"_spr, "line-toggle"_spr, + [=, this](auto sender) { + this->resetToggles(sender); + if (sender->isToggled()) return; + m_brushDrawer = LineBrushDrawer::create(); + LevelEditorLayer::get()->m_objectLayer->addChild(m_brushDrawer); + m_brushDrawer->setID("brush-drawer"_spr); + } + ); + + m_curveToggle = this->addDefaultToggle( + "BezierIcon.png"_spr, "curve-toggle"_spr, + [=, this](auto sender) { + this->resetToggles(sender); + if (sender->isToggled()) return; + m_brushDrawer = CurveBrushDrawer::create(); + LevelEditorLayer::get()->m_objectLayer->addChild(m_brushDrawer); + m_brushDrawer->setID("brush-drawer"_spr); + } + ); + + m_freeToggle = this->addDefaultToggle( + "BrushIcon.png"_spr, "free-toggle"_spr, + [=, this](auto sender) { + this->resetToggles(sender); + if (sender->isToggled()) return; + m_brushDrawer = FreeBrushDrawer::create(); + LevelEditorLayer::get()->m_objectLayer->addChild(m_brushDrawer); + m_brushDrawer->setID("brush-drawer"_spr); + } + ); + + auto thicknessButton = this->addDefaultButton( + "ThicknessIcon.png"_spr, "thickness-button"_spr, + [](auto sender) { + geode::openSettingsPopup(Mod::get()); + } + ); + + auto colorButton = this->addDefaultButton( + "PaletteIcon.png"_spr, "color-button"_spr, + [](auto sender) { + geode::openSettingsPopup(Mod::get()); + } + ); + + auto settingButton = this->addDefaultButton( + "SettingIcon.png"_spr, "setting-button"_spr, + [](auto sender) { + geode::openSettingsPopup(Mod::get()); + } + ); + + auto finalizeButton = this->addDefaultButton( + "FinalizeIcon.png"_spr, "finalize-button"_spr, + [this](auto sender) { + if (m_brushDrawer) { + m_brushDrawer->clearOverlay(); + m_brushDrawer->updateLine(); + } + } + ); + + m_buttonBar = EditButtonBar::create(m_buttons, offset, 0, false, cols, rows); + m_buttonBar->setID("allium-tab-bar"_spr); + + return true; +} + +void AlliumButtonBar::resetToggles(CCObject* sender) { + if (sender != m_lineToggle) m_lineToggle->toggle(false); + if (sender != m_curveToggle) m_curveToggle->toggle(false); + if (sender != m_freeToggle) m_freeToggle->toggle(false); + if (m_brushDrawer) { + m_brushDrawer->clearOverlay(); + m_brushDrawer->updateLine(); + m_brushDrawer->removeFromParent(); + m_brushDrawer = nullptr; + } +} + +EditButtonBar* AlliumButtonBar::getButtonBar() const { + return m_buttonBar; +} + +BrushDrawer* AlliumButtonBar::getBrushDrawer() const { + return m_brushDrawer; +} + +CCMenuItemSpriteExtra* AlliumButtonBar::addDefaultButton( + std::string_view spriteName, std::string_view id, + utils::MiniFunction const& callback +) { + return this->addButton(spriteName, "NeutralButton.png"_spr, id, callback); +} + +CCMenuItemSpriteExtra* AlliumButtonBar::addButton( + std::string_view spriteName, std::string_view bgName, std::string_view id, + utils::MiniFunction const& callback +) { + auto sprite = CCSprite::createWithSpriteFrameName(spriteName.data()); + auto bg = CCSprite::create(bgName.data()); + bg->addChildAtPosition(sprite, Anchor::Center, ccp(0, 0)); + + auto button = CCMenuItemExt::createSpriteExtra( + bg, + [=](CCObject* sender) { + callback(static_cast(sender)); + } + ); + button->setID(id.data()); + m_buttons->addObject(button); + return button; +} + +CCMenuItemToggler* AlliumButtonBar::addDefaultToggle( + std::string_view spriteName, std::string_view id, + utils::MiniFunction const& callback +) { + return this->addToggle(spriteName, "DeactiveButton.png"_spr, "ActiveButton.png"_spr, id, callback); +} + +CCMenuItemToggler* AlliumButtonBar::addToggle( + std::string_view spriteName, std::string_view bgOnName, std::string_view bgOffName, std::string_view id, + utils::MiniFunction const& callback +) { + auto sprite = CCSprite::createWithSpriteFrameName(spriteName.data()); + auto bgOff = CCSprite::create(bgOffName.data()); + bgOff->addChildAtPosition(sprite, Anchor::Center, ccp(0, 0)); + + sprite = CCSprite::createWithSpriteFrameName(spriteName.data()); + auto bgOn = CCSprite::create(bgOnName.data()); + bgOn->addChildAtPosition(sprite, Anchor::Center, ccp(0, 0)); + + auto button = CCMenuItemExt::createToggler( + bgOn, + bgOff, + [=](CCObject* sender) { + callback(static_cast(sender)); + } + ); + button->setID(id.data()); + m_buttons->addObject(button); + return button; +} \ No newline at end of file diff --git a/src/ui/AlliumPopup.cpp b/src/ui/AlliumPopup.cpp deleted file mode 100644 index b1ec983..0000000 --- a/src/ui/AlliumPopup.cpp +++ /dev/null @@ -1,216 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -using namespace geode::prelude; -using namespace allium; - -AlliumPopup* AlliumPopup::create() { - auto ret = new (std::nothrow) AlliumPopup(); - if (ret && ret->initAnchored(400.f, 240.f)) { - ret->autorelease(); - return ret; - } - delete ret; - return nullptr; -} - -CCNode* AlliumPopup::getEnablePanningSprite() { - auto enableSprite = BasedButtonSprite::create( - CCLabelBMFont::create("Enable\nPanning", "bigFont.fnt"), BaseType::Editor, - static_cast(EditorBaseSize::Normal), static_cast(EditorBaseColor::Gray) - ); - enableSprite->setTopRelativeScale(1.6f); - return enableSprite; -} -CCNode* AlliumPopup::getDisablePanningSprite() { - auto disableSprite = BasedButtonSprite::create( - CCLabelBMFont::create("Disable\nPanning", "bigFont.fnt"), BaseType::Editor, - static_cast(EditorBaseSize::Normal), static_cast(EditorBaseColor::Green) - ); - disableSprite->setTopRelativeScale(1.6f); - return disableSprite; -} - -void AlliumPopup::createPanButton() { - auto buttonMenu = EditorUI::get()->getChildByID("editor-buttons-menu"); - auto myButton = CCMenuItemExt::createSpriteExtra( - BrushManager::get()->m_panEditorInBrush ? this->getDisablePanningSprite() : this->getEnablePanningSprite(), - [this](CCObject* sender) { - auto myButton = static_cast(sender); - if (BrushManager::get()->m_panEditorInBrush) { - BrushManager::get()->m_panEditorInBrush = false; - myButton->setNormalImage(this->getEnablePanningSprite()); - } - else { - BrushManager::get()->m_panEditorInBrush = true; - myButton->setNormalImage(this->getDisablePanningSprite()); - } - myButton->setContentSize({ 40.f, 40.f }); - } - ); - myButton->setID("allium-panning-button"_spr); - // size set in Node IDs itself - myButton->setContentSize({ 40.f, 40.f }); - - buttonMenu->addChild(myButton); - buttonMenu->updateLayout(); -} -void AlliumPopup::createFinalizeButton() { - auto buttonMenu = EditorUI::get()->getChildByID("editor-buttons-menu"); - - auto topSprite = CCLabelBMFont::create("Finalize", "bigFont.fnt"); - - auto mySprite = BasedButtonSprite::create( - topSprite, BaseType::Editor, - static_cast(EditorBaseSize::Normal), static_cast(EditorBaseColor::Orange) - ); - mySprite->setTopRelativeScale(1.6f); - - auto myButton = CCMenuItemExt::createSpriteExtra( - mySprite, [this](CCObject* sender) { - if (BrushManager::get()->m_currentDrawer) { - BrushManager::get()->m_currentDrawer->clearOverlay(); - BrushManager::get()->m_currentDrawer->updateLine(); - } - } - ); - myButton->setID("allium-finalize-button"_spr); - // size set in Node IDs itself - myButton->setContentSize({ 40.f, 40.f }); - - buttonMenu->addChild(myButton); - buttonMenu->updateLayout(); -} - -void AlliumPopup::brushToggleCallback(CCMenuItemToggler* toggle) { - if (toggle != m_noneBrushToggle) m_noneBrushToggle->toggle(false); - if (toggle != m_lineBrushToggle) m_lineBrushToggle->toggle(false); - if (toggle != m_curveBrushToggle) m_curveBrushToggle->toggle(false); - if (toggle != m_freeBrushToggle) m_freeBrushToggle->toggle(false); - - auto objectLayer = LevelEditorLayer::get()->m_objectLayer; - auto brushDrawer = static_cast(objectLayer->getChildByID("brush-drawer"_spr)); - if (brushDrawer) { - brushDrawer->removeFromParent(); - brushDrawer = nullptr; - } - auto buttonMenu = EditorUI::get()->getChildByID("editor-buttons-menu"); - auto finalizeButton = static_cast(buttonMenu->getChildByID("allium-finalize-button"_spr)); - if (finalizeButton) { - finalizeButton->removeFromParent(); - } - auto panningButton = static_cast(buttonMenu->getChildByID("allium-panning-button"_spr)); - if (panningButton) { - panningButton->removeFromParent(); - } - - if (toggle == m_lineBrushToggle) { - brushDrawer = LineBrushDrawer::create(); - - BrushManager::get()->m_currentBrush = BrushType::Line; - this->createPanButton(); - } - else if (toggle == m_curveBrushToggle) { - brushDrawer = CurveBrushDrawer::create(); - - BrushManager::get()->m_currentBrush = BrushType::Curve; - this->createPanButton(); - this->createFinalizeButton(); - } - else if (toggle == m_freeBrushToggle) { - brushDrawer = FreeBrushDrawer::create(); - - BrushManager::get()->m_currentBrush = BrushType::Free; - this->createPanButton(); - } - else { - BrushManager::get()->m_currentBrush = BrushType::None; - - BrushManager::get()->m_panEditorInBrush = false; - } - if (brushDrawer) { - brushDrawer->setID("brush-drawer"_spr); - objectLayer->addChild(brushDrawer); - } - BrushManager::get()->m_currentDrawer = brushDrawer; - -} - -void AlliumPopup::createBrushToggle(std::string_view name, std::string const& id, CCMenuItemToggler*& toggle) { - auto toggleAddress = &toggle; - toggle = CCMenuItemExt::createTogglerWithStandardSprites( - 0.5f, [=, this] (CCObject* sender) { - this->brushToggleCallback(*toggleAddress); - } - ); - toggle->toggle(false); - toggle->setID(Mod::get()->expandSpriteName(id + "-toggle"_spr).data()); - m_brushMenu->addChild(toggle); - - auto label = CCLabelBMFont::create(name.data(), "bigFont.fnt"); - label->setScale(0.4f); - label->setID(Mod::get()->expandSpriteName(id + "-label"_spr).data()); - m_brushMenu->addChild(label); -} - -bool AlliumPopup::setup() { - - // Every menu is put into this column - m_mainColumn = CCNode::create(); - m_mainColumn->setContentSize(m_mainLayer->getContentSize() - ccp(20.f, 20.f)); - m_mainColumn->setAnchorPoint(ccp(0.5f, 0.5f)); - m_mainColumn->setLayout( - ColumnLayout::create() - ->setGap(10.f) - ->setAxisReverse(true) - ->setAutoScale(false) - ->setAxisAlignment(AxisAlignment::Start) - ->setAutoGrowAxis(0) - ); - m_mainLayer->addChildAtPosition(m_mainColumn, Anchor::Center, ccp(0, 0)); - - // Brush menu - m_brushMenu = CCMenu::create(); - m_brushMenu->setLayout( - RowLayout::create() - ->setGap(5.f) - ->setAutoScale(false) - ->setAxisAlignment(AxisAlignment::Start) - ->setAutoGrowAxis(0) - ); - m_mainColumn->addChild(m_brushMenu); - - auto brushLabel = CCLabelBMFont::create("Brush type:", "goldFont.fnt"); - brushLabel->setScale(0.7f); - m_brushMenu->addChild(brushLabel); - - createBrushToggle("None", "none-brush", m_noneBrushToggle); - createBrushToggle("Line", "line-brush", m_lineBrushToggle); - createBrushToggle("Curve", "curve-brush", m_curveBrushToggle); - createBrushToggle("Free", "free-brush", m_freeBrushToggle); - - switch (BrushManager::get()->m_currentBrush) { - case BrushType::None: - m_noneBrushToggle->toggle(true); - break; - case BrushType::Line: - m_lineBrushToggle->toggle(true); - break; - case BrushType::Curve: - m_curveBrushToggle->toggle(true); - break; - case BrushType::Free: - m_freeBrushToggle->toggle(true); - break; - } - - m_brushMenu->updateLayout(); - m_mainColumn->updateLayout(); - - return true; -} \ No newline at end of file diff --git a/src/ui/SupportPopup.cpp b/src/ui/SupportPopup.cpp new file mode 100644 index 0000000..099ff1c --- /dev/null +++ b/src/ui/SupportPopup.cpp @@ -0,0 +1,57 @@ +#include + +using namespace allium; +using namespace geode::prelude; + +SupportPopup* SupportPopup::create() { + auto ret = new (std::nothrow) SupportPopup(); + if (ret && ret->init()) { + ret->autorelease(); + return ret; + } + delete ret; + return nullptr; +} + +bool SupportPopup::init() { + if (!FLAlertLayer::initWithColor({0, 0, 0, 160})) return false; + + this->setAnchorPoint(ccp(0, 0)); + this->setContentSize(CCDirector::sharedDirector()->getWinSize()); + + this->setKeypadEnabled(true); + + m_mainLayer = CCLayer::create(); + this->addChildAtPosition(m_mainLayer, Anchor::Center, ccp(0, 0)); + + auto sprite = CCSprite::create("SupportPopup.png"_spr); + m_mainLayer->addChildAtPosition(sprite, Anchor::Center, ccp(0, 0)); + + m_buttonMenu = CCMenu::create(); + m_buttonMenu->setContentSize(sprite->getContentSize()); + sprite->addChildAtPosition(m_buttonMenu, Anchor::Center, ccp(0, 0)); + + auto closeSprite = CCSprite::createWithSpriteFrameName("GJ_closeBtn_001.png"); + closeSprite->setScale(0.8f); + auto closeBtn = CCMenuItemSpriteExtra::create(closeSprite, closeSprite, this, menu_selector(SupportPopup::onClose)); + m_buttonMenu->addChildAtPosition(closeBtn, Anchor::TopLeft, ccp(10, -10)); + + auto buttonSprite = ButtonSprite::create("Support!", "bigFont.fnt", "GiftButton.png"_spr, 0.7f); + auto button = CCMenuItemExt::createSpriteExtra(buttonSprite, + [](auto sender) { + Mod::get()->setSavedValue("allium-gift-popup-shown", true); + CCApplication::sharedApplication()->openURL("https://ko-fi.com/alk1m123"); + } + ); + m_buttonMenu->addChildAtPosition(button, Anchor::Bottom, ccp(0, 0)); + + return true; +} + +void SupportPopup::keyBackClicked() { + this->removeFromParent(); +} + +void SupportPopup::onClose(CCObject* sender) { + this->removeFromParent(); +} \ No newline at end of file