mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-27 03:26:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			174 lines
		
	
	
	
		
			5.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
	
		
			5.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include "widgets.hpp"
 | |
| 
 | |
| #include <components/widgets/box.hpp>
 | |
| 
 | |
| namespace
 | |
| {
 | |
|     template <class T, class WidgetT>
 | |
|     void createVectorWidget(
 | |
|         const std::shared_ptr<fx::Types::UniformBase>& uniform, MyGUI::Widget* client, fx::Widgets::UniformBase* base)
 | |
|     {
 | |
|         int height = client->getHeight();
 | |
|         base->setSize(base->getSize().width, (base->getSize().height - height) + (height * T::num_components));
 | |
|         client->setSize(client->getSize().width, height * T::num_components);
 | |
| 
 | |
|         for (int i = 0; i < T::num_components; ++i)
 | |
|         {
 | |
|             auto* widget = client->createWidget<WidgetT>(
 | |
|                 "MW_ValueEditNumber", { 0, height * i, client->getWidth(), height }, MyGUI::Align::Default);
 | |
|             widget->setData(uniform, static_cast<fx::Widgets::Index>(i));
 | |
|             base->addItem(widget);
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| namespace fx
 | |
| {
 | |
|     namespace Widgets
 | |
|     {
 | |
|         void EditBool::setValue(bool value)
 | |
|         {
 | |
|             auto uniform = mUniform.lock();
 | |
| 
 | |
|             if (!uniform)
 | |
|                 return;
 | |
| 
 | |
|             mCheckbutton->setCaptionWithReplacing(value ? "#{Interface:On}" : "#{Interface:Off}");
 | |
|             mFill->setVisible(value);
 | |
| 
 | |
|             uniform->setValue<bool>(value);
 | |
|         }
 | |
| 
 | |
|         void EditBool::setValueFromUniform()
 | |
|         {
 | |
|             auto uniform = mUniform.lock();
 | |
| 
 | |
|             if (!uniform)
 | |
|                 return;
 | |
| 
 | |
|             setValue(uniform->template getValue<bool>());
 | |
|         }
 | |
| 
 | |
|         void EditBool::toDefault()
 | |
|         {
 | |
|             auto uniform = mUniform.lock();
 | |
| 
 | |
|             if (!uniform)
 | |
|                 return;
 | |
| 
 | |
|             setValue(uniform->getDefault<bool>());
 | |
|         }
 | |
| 
 | |
|         void EditBool::initialiseOverride()
 | |
|         {
 | |
|             Base::initialiseOverride();
 | |
| 
 | |
|             assignWidget(mCheckbutton, "Checkbutton");
 | |
|             assignWidget(mFill, "Fill");
 | |
| 
 | |
|             mCheckbutton->eventMouseButtonClick += MyGUI::newDelegate(this, &EditBool::notifyMouseButtonClick);
 | |
|         }
 | |
| 
 | |
|         void EditBool::notifyMouseButtonClick(MyGUI::Widget* sender)
 | |
|         {
 | |
|             auto uniform = mUniform.lock();
 | |
| 
 | |
|             if (!uniform)
 | |
|                 return;
 | |
| 
 | |
|             setValue(!uniform->getValue<bool>());
 | |
|         }
 | |
| 
 | |
|         void UniformBase::init(const std::shared_ptr<fx::Types::UniformBase>& uniform)
 | |
|         {
 | |
|             if (uniform->mDisplayName.empty())
 | |
|                 mLabel->setCaption(uniform->mName);
 | |
|             else
 | |
|                 mLabel->setCaptionWithReplacing(uniform->mDisplayName);
 | |
| 
 | |
|             if (uniform->mDescription.empty())
 | |
|             {
 | |
|                 mLabel->setUserString("ToolTipType", "");
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 mLabel->setUserString("ToolTipType", "Layout");
 | |
|                 mLabel->setUserString("ToolTipLayout", "TextToolTip");
 | |
|                 mLabel->setUserString("Caption_Text", uniform->mDescription);
 | |
|             }
 | |
| 
 | |
|             std::visit(
 | |
|                 [this, &uniform](auto&& arg) {
 | |
|                     using T = typename std::decay_t<decltype(arg)>::value_type;
 | |
| 
 | |
|                     if constexpr (std::is_same_v<osg::Vec4f, T>)
 | |
|                     {
 | |
|                         createVectorWidget<T, EditNumberFloat4>(uniform, mClient, this);
 | |
|                     }
 | |
|                     else if constexpr (std::is_same_v<osg::Vec3f, T>)
 | |
|                     {
 | |
|                         createVectorWidget<T, EditNumberFloat3>(uniform, mClient, this);
 | |
|                     }
 | |
|                     else if constexpr (std::is_same_v<osg::Vec2f, T>)
 | |
|                     {
 | |
|                         createVectorWidget<T, EditNumberFloat2>(uniform, mClient, this);
 | |
|                     }
 | |
|                     else if constexpr (std::is_same_v<T, float>)
 | |
|                     {
 | |
|                         auto* widget = mClient->createWidget<EditNumberFloat>("MW_ValueEditNumber",
 | |
|                             { 0, 0, mClient->getWidth(), mClient->getHeight() }, MyGUI::Align::Stretch);
 | |
|                         widget->setData(uniform);
 | |
|                         mBases.emplace_back(widget);
 | |
|                     }
 | |
|                     else if constexpr (std::is_same_v<T, int>)
 | |
|                     {
 | |
|                         auto* widget = mClient->createWidget<EditNumberInt>("MW_ValueEditNumber",
 | |
|                             { 0, 0, mClient->getWidth(), mClient->getHeight() }, MyGUI::Align::Stretch);
 | |
|                         widget->setData(uniform);
 | |
|                         mBases.emplace_back(widget);
 | |
|                     }
 | |
|                     else if constexpr (std::is_same_v<T, bool>)
 | |
|                     {
 | |
|                         auto* widget = mClient->createWidget<EditBool>("MW_ValueEditBool",
 | |
|                             { 0, 0, mClient->getWidth(), mClient->getHeight() }, MyGUI::Align::Stretch);
 | |
|                         widget->setData(uniform);
 | |
|                         mBases.emplace_back(widget);
 | |
|                     }
 | |
| 
 | |
|                     mReset->eventMouseButtonClick += MyGUI::newDelegate(this, &UniformBase::notifyResetClicked);
 | |
| 
 | |
|                     for (EditBase* base : mBases)
 | |
|                         base->setValueFromUniform();
 | |
|                 },
 | |
|                 uniform->mData);
 | |
|         }
 | |
| 
 | |
|         void UniformBase::addItem(EditBase* item)
 | |
|         {
 | |
|             mBases.emplace_back(item);
 | |
|         }
 | |
| 
 | |
|         void UniformBase::toDefault()
 | |
|         {
 | |
|             for (EditBase* base : mBases)
 | |
|             {
 | |
|                 if (base)
 | |
|                     base->toDefault();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         void UniformBase::notifyResetClicked(MyGUI::Widget* sender)
 | |
|         {
 | |
|             toDefault();
 | |
|         }
 | |
| 
 | |
|         void UniformBase::initialiseOverride()
 | |
|         {
 | |
|             Base::initialiseOverride();
 | |
| 
 | |
|             assignWidget(mReset, "Reset");
 | |
|             assignWidget(mLabel, "Label");
 | |
|             assignWidget(mClient, "Client");
 | |
|         }
 | |
|     }
 | |
| }
 |