From 2ffba2360dc74250312eb28c40842349b6a03137 Mon Sep 17 00:00:00 2001 From: ducphamhong Date: Sat, 27 Feb 2021 18:45:30 +0700 Subject: [PATCH] #6 Add ProgressBar, #119 Add import ui --- Projects/Editor/Source/Editor/CEditor.cpp | 15 ++- Projects/Editor/Source/Editor/CEditor.h | 2 +- .../Editor/Space/Assets/CSpaceAssets.cpp | 2 +- .../Source/Editor/Space/Assets/CSpaceAssets.h | 6 +- .../Editor/Source/Editor/Space/CSpace.cpp | 6 +- Projects/Editor/Source/Editor/Space/CSpace.h | 10 +- .../Editor/Space/Console/CSpaceConsole.cpp | 4 +- .../Editor/Space/Console/CSpaceConsole.h | 4 +- .../Editor/Space/Import/CSpaceImport.cpp | 63 ++++++++++++ .../Source/Editor/Space/Import/CSpaceImport.h | 50 ++++++++++ .../Editor/Space/Property/CSpaceProperty.cpp | 2 +- .../Editor/Space/Property/CSpaceProperty.h | 2 +- .../Source/Editor/Space/Scene/CSpaceScene.cpp | 28 +++--- .../Source/Editor/Space/Scene/CSpaceScene.h | 24 ++--- Projects/Editor/Source/GUI/Controls/CLabel.h | 5 + .../Source/GUI/Controls/CProgressBar.cpp | 98 +++++++++++++++++++ .../Editor/Source/GUI/Controls/CProgressBar.h | 53 ++++++++++ Projects/Editor/Source/GUI/GUI.h | 3 +- 18 files changed, 327 insertions(+), 50 deletions(-) create mode 100644 Projects/Editor/Source/Editor/Space/Import/CSpaceImport.cpp create mode 100644 Projects/Editor/Source/Editor/Space/Import/CSpaceImport.h create mode 100644 Projects/Editor/Source/GUI/Controls/CProgressBar.cpp create mode 100644 Projects/Editor/Source/GUI/Controls/CProgressBar.h diff --git a/Projects/Editor/Source/Editor/CEditor.cpp b/Projects/Editor/Source/Editor/CEditor.cpp index 33dd07368..c57941648 100644 --- a/Projects/Editor/Source/Editor/CEditor.cpp +++ b/Projects/Editor/Source/Editor/CEditor.cpp @@ -27,6 +27,7 @@ This file is part of the "Skylicht Engine". #include "CWindowConfig.h" #include "Utils/CStringImp.h" +#include "Space/Import/CSpaceImport.h" #include "Space/Scene/CSpaceScene.h" #include "Space/Assets/CSpaceAssets.h" #include "Space/Console/CSpaceConsole.h" @@ -75,10 +76,12 @@ namespace Skylicht void CEditor::initImportGUI() { - m_importDialog = new GUI::CDialogWindow(m_canvas, 0.0f, 0.0f, 400.0f, 140.0f); + m_importDialog = new GUI::CDialogWindow(m_canvas, 0.0f, 0.0f, 400.0f, 120.0f); m_importDialog->setCaption(L"Import Assets"); m_importDialog->showCloseButton(false); m_importDialog->bringToFront(); + + initWorkspace(m_importDialog, m_importDialog->getCaption()); } void CEditor::initEditorGUI() @@ -304,17 +307,21 @@ namespace Skylicht initWorkspace(property, property->getCaption()); } - void CEditor::initWorkspace(GUI::CDockableWindow* window, const std::wstring& workspace) + void CEditor::initWorkspace(GUI::CWindow* window, const std::wstring& workspace) { if (workspace == L"Scene") { m_workspaces.push_back(new CSpaceScene(window, this)); } - if (workspace == L"GUI Design") + else if (workspace == L"Import Assets") + { + m_workspaces.push_back(new CSpaceImport(window, this)); + } + else if (workspace == L"GUI Design") { } - if (workspace == L"Animation") + else if (workspace == L"Animation") { } diff --git a/Projects/Editor/Source/Editor/CEditor.h b/Projects/Editor/Source/Editor/CEditor.h index fbef0d034..478e212bc 100644 --- a/Projects/Editor/Source/Editor/CEditor.h +++ b/Projects/Editor/Source/Editor/CEditor.h @@ -72,7 +72,7 @@ namespace Skylicht void initSessionLayout(const std::string& data); - void initWorkspace(GUI::CDockableWindow* window, const std::wstring& workspace); + void initWorkspace(GUI::CWindow* window, const std::wstring& workspace); void removeWorkspace(CSpace* space); diff --git a/Projects/Editor/Source/Editor/Space/Assets/CSpaceAssets.cpp b/Projects/Editor/Source/Editor/Space/Assets/CSpaceAssets.cpp index f21086af1..7d6ead301 100644 --- a/Projects/Editor/Source/Editor/Space/Assets/CSpaceAssets.cpp +++ b/Projects/Editor/Source/Editor/Space/Assets/CSpaceAssets.cpp @@ -30,7 +30,7 @@ namespace Skylicht { namespace Editor { - CSpaceAssets::CSpaceAssets(GUI::CDockableWindow* window, CEditor* editor) : + CSpaceAssets::CSpaceAssets(GUI::CWindow* window, CEditor* editor) : CSpace(window, editor) { GUI::CToolbar* toolbar = new GUI::CToolbar(window); diff --git a/Projects/Editor/Source/Editor/Space/Assets/CSpaceAssets.h b/Projects/Editor/Source/Editor/Space/Assets/CSpaceAssets.h index ecbc514d0..4aa05091e 100644 --- a/Projects/Editor/Source/Editor/Space/Assets/CSpaceAssets.h +++ b/Projects/Editor/Source/Editor/Space/Assets/CSpaceAssets.h @@ -34,11 +34,11 @@ namespace Skylicht class CSpaceAssets : public CSpace { protected: - GUI::CTreeControl *m_folder; - GUI::CTextBox *m_search; + GUI::CTreeControl* m_folder; + GUI::CTextBox* m_search; public: - CSpaceAssets(GUI::CDockableWindow *window, CEditor *editor); + CSpaceAssets(GUI::CWindow* window, CEditor* editor); virtual ~CSpaceAssets(); }; diff --git a/Projects/Editor/Source/Editor/Space/CSpace.cpp b/Projects/Editor/Source/Editor/Space/CSpace.cpp index f3270eab1..1c1e18d7a 100644 --- a/Projects/Editor/Source/Editor/Space/CSpace.cpp +++ b/Projects/Editor/Source/Editor/Space/CSpace.cpp @@ -30,7 +30,7 @@ namespace Skylicht { namespace Editor { - CSpace::CSpace(GUI::CDockableWindow *window, CEditor* editor) : + CSpace::CSpace(GUI::CWindow* window, CEditor* editor) : m_window(window), m_editor(editor) { @@ -48,12 +48,12 @@ namespace Skylicht } - void CSpace::onDestroy(GUI::CBase *base) + void CSpace::onDestroy(GUI::CBase* base) { m_editor->removeWorkspace(this); } - void CSpace::onWindowResize(GUI::CBase *base) + void CSpace::onWindowResize(GUI::CBase* base) { if (base == m_window) { diff --git a/Projects/Editor/Source/Editor/Space/CSpace.h b/Projects/Editor/Source/Editor/Space/CSpace.h index 1db128670..bcba302f1 100644 --- a/Projects/Editor/Source/Editor/Space/CSpace.h +++ b/Projects/Editor/Source/Editor/Space/CSpace.h @@ -35,19 +35,19 @@ namespace Skylicht class CSpace { protected: - GUI::CDockableWindow *m_window; - CEditor *m_editor; + GUI::CWindow* m_window; + CEditor* m_editor; public: - CSpace(GUI::CDockableWindow *window, CEditor* editor); + CSpace(GUI::CWindow* window, CEditor* editor); virtual ~CSpace(); virtual void update(); - virtual void onDestroy(GUI::CBase *base); + virtual void onDestroy(GUI::CBase* base); - virtual void onWindowResize(GUI::CBase *base); + virtual void onWindowResize(GUI::CBase* base); virtual void onResize(float w, float h) {} }; diff --git a/Projects/Editor/Source/Editor/Space/Console/CSpaceConsole.cpp b/Projects/Editor/Source/Editor/Space/Console/CSpaceConsole.cpp index ca5864bb6..abce58140 100644 --- a/Projects/Editor/Source/Editor/Space/Console/CSpaceConsole.cpp +++ b/Projects/Editor/Source/Editor/Space/Console/CSpaceConsole.cpp @@ -31,7 +31,7 @@ namespace Skylicht { namespace Editor { - CSpaceConsole::CSpaceConsole(GUI::CDockableWindow *window, CEditor *editor) : + CSpaceConsole::CSpaceConsole(GUI::CWindow* window, CEditor* editor) : CSpace(window, editor), m_lastID(0) { @@ -52,7 +52,7 @@ namespace Skylicht { CSpace::update(); - CConsoleLog *console = CConsoleLog::getInstance(); + CConsoleLog* console = CConsoleLog::getInstance(); if (console->getLogCount() > 0) { const CConsoleLog::SLogInfo& log = console->getLast(); diff --git a/Projects/Editor/Source/Editor/Space/Console/CSpaceConsole.h b/Projects/Editor/Source/Editor/Space/Console/CSpaceConsole.h index a0d2b65e0..4f3afe73a 100644 --- a/Projects/Editor/Source/Editor/Space/Console/CSpaceConsole.h +++ b/Projects/Editor/Source/Editor/Space/Console/CSpaceConsole.h @@ -34,12 +34,12 @@ namespace Skylicht class CSpaceConsole : public CSpace { protected: - GUI::CTextBox *m_textControl; + GUI::CTextBox* m_textControl; u32 m_lastID; public: - CSpaceConsole(GUI::CDockableWindow *window, CEditor *editor); + CSpaceConsole(GUI::CWindow* window, CEditor* editor); virtual ~CSpaceConsole(); diff --git a/Projects/Editor/Source/Editor/Space/Import/CSpaceImport.cpp b/Projects/Editor/Source/Editor/Space/Import/CSpaceImport.cpp new file mode 100644 index 000000000..ebb1fb705 --- /dev/null +++ b/Projects/Editor/Source/Editor/Space/Import/CSpaceImport.cpp @@ -0,0 +1,63 @@ +/* +!@ +MIT License + +CopyRight (c) 2020 Skylicht Technology CO., LTD + +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. + +This file is part of the "Skylicht Engine". +https://github.com/skylicht-lab/skylicht-engine +!# +*/ + +#include "pch.h" +#include "CSpaceImport.h" + +namespace Skylicht +{ + namespace Editor + { + CSpaceImport::CSpaceImport(GUI::CWindow* window, CEditor* editor) : + CSpace(window, editor) + { + m_progressBar = new GUI::CProgressBar(window); + m_progressBar->dock(GUI::EPosition::Top); + m_progressBar->setMargin(GUI::SMargin(14.0f, 14.0, 14.0, 0.0f)); + + m_statusText = new GUI::CLabel(window); + m_statusText->dock(GUI::EPosition::Fill); + m_statusText->setMargin(GUI::SMargin(14.0f, 5.0, 14.0, 0.0f)); + m_statusText->setWrapMultiline(true); + m_statusText->setString(L"Resolving...\nAssets/BuildIn"); + } + + CSpaceImport::~CSpaceImport() + { + + } + + void CSpaceImport::update() + { + m_progressBar->setPercent(0.3f); + + CSpace::update(); + } + + void CSpaceImport::onDestroy(GUI::CBase* base) + { + CSpace::onDestroy(base); + } + } +} \ No newline at end of file diff --git a/Projects/Editor/Source/Editor/Space/Import/CSpaceImport.h b/Projects/Editor/Source/Editor/Space/Import/CSpaceImport.h new file mode 100644 index 000000000..5f2d2a0ec --- /dev/null +++ b/Projects/Editor/Source/Editor/Space/Import/CSpaceImport.h @@ -0,0 +1,50 @@ +/* +!@ +MIT License + +CopyRight (c) 2021 Skylicht Technology CO., LTD + +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. + +This file is part of the "Skylicht Engine". +https://github.com/skylicht-lab/skylicht-engine +!# +*/ + +#pragma once + +#include "SkylichtEngine.h" +#include "Editor/Space/CSpace.h" + +namespace Skylicht +{ + namespace Editor + { + class CSpaceImport : public CSpace + { + protected: + GUI::CProgressBar* m_progressBar; + GUI::CLabel* m_statusText; + + public: + CSpaceImport(GUI::CWindow* window, CEditor* editor); + + virtual ~CSpaceImport(); + + virtual void update(); + + virtual void onDestroy(GUI::CBase* base); + }; + } +} \ No newline at end of file diff --git a/Projects/Editor/Source/Editor/Space/Property/CSpaceProperty.cpp b/Projects/Editor/Source/Editor/Space/Property/CSpaceProperty.cpp index 43692cf37..b8463c6ad 100644 --- a/Projects/Editor/Source/Editor/Space/Property/CSpaceProperty.cpp +++ b/Projects/Editor/Source/Editor/Space/Property/CSpaceProperty.cpp @@ -30,7 +30,7 @@ namespace Skylicht { namespace Editor { - CSpaceProperty::CSpaceProperty(GUI::CDockableWindow* window, CEditor* editor) : + CSpaceProperty::CSpaceProperty(GUI::CWindow* window, CEditor* editor) : CSpace(window, editor) { GUI::CScrollControl* scrollWindow = new GUI::CScrollControl(window); diff --git a/Projects/Editor/Source/Editor/Space/Property/CSpaceProperty.h b/Projects/Editor/Source/Editor/Space/Property/CSpaceProperty.h index d83171119..6d261ebdb 100644 --- a/Projects/Editor/Source/Editor/Space/Property/CSpaceProperty.h +++ b/Projects/Editor/Source/Editor/Space/Property/CSpaceProperty.h @@ -36,7 +36,7 @@ namespace Skylicht protected: public: - CSpaceProperty(GUI::CDockableWindow* window, CEditor* editor); + CSpaceProperty(GUI::CWindow* window, CEditor* editor); virtual ~CSpaceProperty(); diff --git a/Projects/Editor/Source/Editor/Space/Scene/CSpaceScene.cpp b/Projects/Editor/Source/Editor/Space/Scene/CSpaceScene.cpp index de7e099cb..a9875ec4b 100644 --- a/Projects/Editor/Source/Editor/Space/Scene/CSpaceScene.cpp +++ b/Projects/Editor/Source/Editor/Space/Scene/CSpaceScene.cpp @@ -32,7 +32,7 @@ namespace Skylicht { namespace Editor { - CSpaceScene::CSpaceScene(GUI::CDockableWindow *window, CEditor *editor) : + CSpaceScene::CSpaceScene(GUI::CWindow* window, CEditor* editor) : CSpace(window, editor), m_scene(NULL), m_renderRP(NULL), @@ -46,7 +46,7 @@ namespace Skylicht { initDefaultScene(); - GUI::CBase *panel = m_window->getInnerPanel(); + GUI::CBase* panel = m_window->getInnerPanel(); panel->OnRender = BIND_LISTENER(&CSpaceScene::onRender, this); panel->OnMouseMoved = std::bind(&CSpaceScene::onMouseMoved, this, _1, _2, _3, _4, _5); @@ -71,10 +71,10 @@ namespace Skylicht m_scene = new CScene(); // create a zone in Scene - CZone *zone = m_scene->createZone(); + CZone* zone = m_scene->createZone(); // create editor camera - CGameObject *camObj = zone->createEmptyObject(); + CGameObject* camObj = zone->createEmptyObject(); camObj->addComponent(); camObj->addComponent()->setMoveSpeed(2.0f); @@ -87,12 +87,12 @@ namespace Skylicht m_gridPlane->addComponent(); // lighting - CGameObject *lightObj = zone->createEmptyObject(); - CDirectionalLight *directionalLight = lightObj->addComponent(); + CGameObject* lightObj = zone->createEmptyObject(); + CDirectionalLight* directionalLight = lightObj->addComponent(); SColor c(255, 255, 244, 214); directionalLight->setColor(SColorf(c)); - CTransformEuler *lightTransform = lightObj->getTransformEuler(); + CTransformEuler* lightTransform = lightObj->getTransformEuler(); lightTransform->setPosition(core::vector3df(2.0f, 2.0f, 2.0f)); core::vector3df direction = core::vector3df(0.0f, -1.5f, 2.0f); @@ -122,7 +122,7 @@ namespace Skylicht m_scene->update(); } - void CSpaceScene::onRender(GUI::CBase *base) + void CSpaceScene::onRender(GUI::CBase* base) { if (m_renderRP != NULL) { @@ -144,12 +144,12 @@ namespace Skylicht } } - void CSpaceScene::onMouseMoved(GUI::CBase *base, float x, float y, float deltaX, float deltaY) + void CSpaceScene::onMouseMoved(GUI::CBase* base, float x, float y, float deltaX, float deltaY) { postMouseEventToScene(EMIE_MOUSE_MOVED, x, y); } - void CSpaceScene::onLeftMouseClick(GUI::CBase *base, float x, float y, bool down) + void CSpaceScene::onLeftMouseClick(GUI::CBase* base, float x, float y, bool down) { m_leftMouseDown = down; @@ -159,7 +159,7 @@ namespace Skylicht postMouseEventToScene(EMIE_LMOUSE_LEFT_UP, x, y); } - void CSpaceScene::onRightMouseClick(GUI::CBase *base, float x, float y, bool down) + void CSpaceScene::onRightMouseClick(GUI::CBase* base, float x, float y, bool down) { m_rightMouseDown = down; @@ -169,7 +169,7 @@ namespace Skylicht postMouseEventToScene(EMIE_RMOUSE_LEFT_UP, x, y); } - void CSpaceScene::onMiddleMouseClick(GUI::CBase *base, float x, float y, bool down) + void CSpaceScene::onMiddleMouseClick(GUI::CBase* base, float x, float y, bool down) { m_middleMouseDown = down; @@ -179,7 +179,7 @@ namespace Skylicht postMouseEventToScene(EMIE_MMOUSE_LEFT_UP, x, y); } - void CSpaceScene::onMouseWheeled(GUI::CBase *base, int wheel) + void CSpaceScene::onMouseWheeled(GUI::CBase* base, int wheel) { SEvent event; event.EventType = EET_MOUSE_INPUT_EVENT; @@ -223,7 +223,7 @@ namespace Skylicht m_scene->OnEvent(event); } - bool CSpaceScene::isEditorObject(CGameObject *object) + bool CSpaceScene::isEditorObject(CGameObject* object) { if (m_editorCamera->getGameObject() == object || m_gridPlane == object) diff --git a/Projects/Editor/Source/Editor/Space/Scene/CSpaceScene.h b/Projects/Editor/Source/Editor/Space/Scene/CSpaceScene.h index dbad34757..7c3b457a6 100644 --- a/Projects/Editor/Source/Editor/Space/Scene/CSpaceScene.h +++ b/Projects/Editor/Source/Editor/Space/Scene/CSpaceScene.h @@ -34,11 +34,11 @@ namespace Skylicht class CSpaceScene : public CSpace { protected: - CScene *m_scene; - CCamera *m_editorCamera; - IRenderPipeline *m_renderRP; + CScene* m_scene; + CCamera* m_editorCamera; + IRenderPipeline* m_renderRP; - CGameObject *m_gridPlane; + CGameObject* m_gridPlane; bool m_leftMouseDown; bool m_rightMouseDown; @@ -48,7 +48,7 @@ namespace Skylicht float m_mouseY; public: - CSpaceScene(GUI::CDockableWindow *window, CEditor *editor); + CSpaceScene(GUI::CWindow* window, CEditor* editor); virtual ~CSpaceScene(); @@ -56,21 +56,21 @@ namespace Skylicht virtual void onResize(float w, float h); - virtual void onRender(GUI::CBase *base); + virtual void onRender(GUI::CBase* base); - virtual void onMouseMoved(GUI::CBase *base, float x, float y, float deltaX, float deltaY); + virtual void onMouseMoved(GUI::CBase* base, float x, float y, float deltaX, float deltaY); - virtual void onLeftMouseClick(GUI::CBase *base, float x, float y, bool down); + virtual void onLeftMouseClick(GUI::CBase* base, float x, float y, bool down); - virtual void onRightMouseClick(GUI::CBase *base, float x, float y, bool down); + virtual void onRightMouseClick(GUI::CBase* base, float x, float y, bool down); - virtual void onMiddleMouseClick(GUI::CBase *base, float x, float y, bool down); + virtual void onMiddleMouseClick(GUI::CBase* base, float x, float y, bool down); - virtual void onMouseWheeled(GUI::CBase *base, int wheel); + virtual void onMouseWheeled(GUI::CBase* base, int wheel); virtual void update(); - bool isEditorObject(CGameObject *object); + bool isEditorObject(CGameObject* object); protected: diff --git a/Projects/Editor/Source/GUI/Controls/CLabel.h b/Projects/Editor/Source/GUI/Controls/CLabel.h index fa3380371..fc51ca182 100644 --- a/Projects/Editor/Source/GUI/Controls/CLabel.h +++ b/Projects/Editor/Source/GUI/Controls/CLabel.h @@ -51,6 +51,11 @@ namespace Skylicht void setFontSize(EFontSize fontsize); + void setWrapMultiline(bool b) + { + m_text->setWrapMultiline(b); + } + inline const std::wstring& getString() { return m_text->getString(); diff --git a/Projects/Editor/Source/GUI/Controls/CProgressBar.cpp b/Projects/Editor/Source/GUI/Controls/CProgressBar.cpp new file mode 100644 index 000000000..0aa51ba5c --- /dev/null +++ b/Projects/Editor/Source/GUI/Controls/CProgressBar.cpp @@ -0,0 +1,98 @@ +/* +!@ +MIT License + +Copyright (c) 2021 Skylicht Technology CO., LTD + +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. + +This file is part of the "Skylicht Engine". +https://github.com/skylicht-lab/skylicht-engine +!# +*/ + +#include "pch.h" +#include "CProgressBar.h" +#include "GUI/Theme/CThemeConfig.h" + +namespace Skylicht +{ + namespace Editor + { + namespace GUI + { + CProgressBar::CProgressBar(CBase* parent) : + CBase(parent), + m_percent(1.0f) + { + setSize(100.0f, 20.0f); + + m_text = new CLabel(this); + m_text->dock(EPosition::Fill); + m_text->setMargin(SMargin(0.0f, 3.0f, 0.0f, 0.0f)); + m_text->setTextAlignment(ETextAlign::TextCenter); + + setPercent(1.0f); + } + + CProgressBar::~CProgressBar() + { + + } + + void CProgressBar::setPercent(float percent) + { + m_percent = percent; + if (m_percent < 0.0f) + m_percent = 0.0f; + if (m_percent > 1.0f) + m_percent = 1.0f; + + int p = (int)(m_percent * 100.0f); + wchar_t text[32]; + swprintf(text, 32, L"%d%%", p); + m_text->setString(text); + } + + void CProgressBar::renderUnder() + { + CTheme* theme = CTheme::getTheme(); + CRenderer* renderer = CRenderer::getRenderer(); + + theme->drawTextBox(getRenderBounds(), CThemeConfig::SliderColor); + + SRect clip = m_bounds; + clip.Width = clip.Width * m_percent; + + if (clip.Width > 0.0f) + { + const SRect oldClipRect = renderer->clipRegion(); + bool isEnableClip = renderer->isEnableClip(); + + renderer->addClipRegion(clip); + renderer->enableClip(true); + renderer->startClip(); + + theme->drawTextBox(getRenderBounds(), CThemeConfig::SliderBarColor); + + renderer->setClipRegion(oldClipRect); + renderer->enableClip(isEnableClip); + renderer->startClip(); + } + + CBase::renderUnder(); + } + } + } +} \ No newline at end of file diff --git a/Projects/Editor/Source/GUI/Controls/CProgressBar.h b/Projects/Editor/Source/GUI/Controls/CProgressBar.h new file mode 100644 index 000000000..949f1151d --- /dev/null +++ b/Projects/Editor/Source/GUI/Controls/CProgressBar.h @@ -0,0 +1,53 @@ +/* +!@ +MIT License + +Copyright (c) 2021 Skylicht Technology CO., LTD + +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. + +This file is part of the "Skylicht Engine". +https://github.com/skylicht-lab/skylicht-engine +!# +*/ +#pragma once + +#include "GUI/Controls/CBase.h" +#include "GUI/Controls/CLabel.h" + +namespace Skylicht +{ + namespace Editor + { + namespace GUI + { + class CProgressBar : public CBase + { + protected: + CLabel* m_text; + float m_percent; + + public: + CProgressBar(CBase* parent); + + virtual ~CProgressBar(); + + virtual void renderUnder(); + + void setPercent(float percent); + + }; + } + } +} \ No newline at end of file diff --git a/Projects/Editor/Source/GUI/GUI.h b/Projects/Editor/Source/GUI/GUI.h index d30c2bf0d..2e889944a 100644 --- a/Projects/Editor/Source/GUI/GUI.h +++ b/Projects/Editor/Source/GUI/GUI.h @@ -46,4 +46,5 @@ This file is part of the "Skylicht Engine". #include "GUI/Controls/CSlider.h" #include "GUI/Controls/CCollapsibleGroup.h" #include "GUI/Controls/CBoxLayout.h" -#include "GUI/Controls/CContentSizeControl.h" \ No newline at end of file +#include "GUI/Controls/CContentSizeControl.h" +#include "GUI/Controls/CProgressBar.h" \ No newline at end of file