From 6f9436dd60e2462a677822ce9ba9dce119dff637 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 30 Oct 2013 21:35:29 +0100 Subject: [PATCH] UISprite widget added Display single sprites --- src/client/CMakeLists.txt | 2 + src/client/declarations.h | 2 + src/client/luafunctions.cpp | 8 ++++ src/client/uisprite.cpp | 87 +++++++++++++++++++++++++++++++++++++ src/client/uisprite.h | 54 +++++++++++++++++++++++ 5 files changed, 153 insertions(+) create mode 100644 src/client/uisprite.cpp create mode 100644 src/client/uisprite.h diff --git a/src/client/CMakeLists.txt b/src/client/CMakeLists.txt index 27eeac50..6e012ef2 100644 --- a/src/client/CMakeLists.txt +++ b/src/client/CMakeLists.txt @@ -100,6 +100,8 @@ set(client_SOURCES ${client_SOURCES} ${CMAKE_CURRENT_LIST_DIR}/uiprogressrect.h ${CMAKE_CURRENT_LIST_DIR}/uimapanchorlayout.cpp ${CMAKE_CURRENT_LIST_DIR}/uimapanchorlayout.h + ${CMAKE_CURRENT_LIST_DIR}/uisprite.cpp + ${CMAKE_CURRENT_LIST_DIR}/uisprite.h # util ${CMAKE_CURRENT_LIST_DIR}/position.h diff --git a/src/client/declarations.h b/src/client/declarations.h index b9955501..c3dc86c7 100644 --- a/src/client/declarations.h +++ b/src/client/declarations.h @@ -98,9 +98,11 @@ class UIMinimap; class UIProgressRect; class UIMapAnchorLayout; class UIPositionAnchor; +class UISprite; typedef stdext::shared_object_ptr UIItemPtr; typedef stdext::shared_object_ptr UICreaturePtr; +typedef stdext::shared_object_ptr UISpritePtr; typedef stdext::shared_object_ptr UIMapPtr; typedef stdext::shared_object_ptr UIMinimapPtr; typedef stdext::shared_object_ptr UIProgressRectPtr; diff --git a/src/client/luafunctions.cpp b/src/client/luafunctions.cpp index c0338d5e..22bfe4e3 100644 --- a/src/client/luafunctions.cpp +++ b/src/client/luafunctions.cpp @@ -47,6 +47,7 @@ #include "uiminimap.h" #include "uimapanchorlayout.h" #include "uiprogressrect.h" +#include "uisprite.h" #include "outfit.h" #include @@ -577,6 +578,13 @@ void Client::registerLuaFunctions() g_lua.bindClassMemberFunction("isVirtual", &UIItem::isVirtual); g_lua.bindClassMemberFunction("isItemVisible", &UIItem::isItemVisible); + g_lua.registerClass(); + g_lua.bindClassStaticFunction("create", []{ return UISpritePtr(new UISprite); }); + g_lua.bindClassMemberFunction("setSpriteId", &UISprite::setSpriteId); + g_lua.bindClassMemberFunction("clearSprite", &UISprite::clearSprite); + g_lua.bindClassMemberFunction("getSpriteId", &UISprite::getSpriteId); + g_lua.bindClassMemberFunction("setSpriteColor", &UISprite::setSpriteColor); + g_lua.registerClass(); g_lua.bindClassStaticFunction("create", []{ return UICreaturePtr(new UICreature); } ); g_lua.bindClassMemberFunction("setCreature", &UICreature::setCreature); diff --git a/src/client/uisprite.cpp b/src/client/uisprite.cpp new file mode 100644 index 00000000..d6fc3687 --- /dev/null +++ b/src/client/uisprite.cpp @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2010-2013 OTClient + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "uisprite.h" +#include +#include +#include +#include + +UISprite::UISprite() : + m_spriteId(0), + m_spriteColor(Color::white) +{ } + +void UISprite::drawSelf(Fw::DrawPane drawPane) +{ + if((drawPane & Fw::ForegroundPane) == 0) + return; + + // draw style components in order + if(m_backgroundColor.aF() > Fw::MIN_ALPHA) { + Rect backgroundDestRect = m_rect; + backgroundDestRect.expand(-m_borderWidth.top, -m_borderWidth.right, -m_borderWidth.bottom, -m_borderWidth.left); + drawBackground(m_rect); + } + + drawImage(m_rect); + + if(m_spriteVisible && m_sprite) { + g_painter->setColor(m_spriteColor); + g_painter->drawTexturedRect(getPaddingRect(), m_sprite); + } + + drawBorder(m_rect); + drawIcon(m_rect); + drawText(m_rect); +} + +void UISprite::setSpriteId(int id) +{ + if(!g_sprites.isLoaded()) + return; + + m_spriteId = id; + if(id == 0) + m_sprite = nullptr; + else { + ImagePtr image = g_sprites.getSpriteImage(id); + if(image) + m_sprite = new Texture(image); + else + m_sprite = nullptr; + } +} + +void UISprite::onStyleApply(const std::string& styleName, const OTMLNodePtr& styleNode) +{ + UIWidget::onStyleApply(styleName, styleNode); + + for(const OTMLNodePtr& node : styleNode->children()) { + if(node->tag() == "sprite-id") + setSpriteId(node->value()); + else if(node->tag() == "sprite-visible") + setSpriteVisible(node->value()); + else if(node->tag() == "sprite-color") + setSpriteColor(node->value()); + } +} diff --git a/src/client/uisprite.h b/src/client/uisprite.h new file mode 100644 index 00000000..1ed37023 --- /dev/null +++ b/src/client/uisprite.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2010-2013 OTClient + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef UISPRITE_H +#define UISPRITE_H + +#include "declarations.h" +#include + +class UISprite : public UIWidget +{ +public: + UISprite(); + void drawSelf(Fw::DrawPane drawPane); + + void setSpriteId(int id); + int getSpriteId() { return m_spriteId; } + void clearSprite() { setSpriteId(0); } + + void setSpriteColor(Color color) { m_spriteColor = color; } + + bool isSpriteVisible() { return m_spriteVisible; } + void setSpriteVisible(bool visible) { m_spriteVisible = visible; } + +protected: + void onStyleApply(const std::string& styleName, const OTMLNodePtr& styleNode); + + TexturePtr m_sprite; + uint16 m_spriteId; + Color m_spriteColor; + + stdext::boolean m_spriteVisible; +}; + +#endif