forked from teamnwah/openmw-tes3coop
Add various custom widgets used in OpenMW to the MyGUI plugin
This commit is contained in:
parent
ee3b1e800c
commit
c6bcd75058
18 changed files with 587 additions and 552 deletions
|
@ -36,7 +36,7 @@ add_openmw_dir (mwgui
|
||||||
formatting inventorywindow container hud countdialog tradewindow settingswindow
|
formatting inventorywindow container hud countdialog tradewindow settingswindow
|
||||||
confirmationdialog alchemywindow referenceinterface spellwindow mainmenu quickkeysmenu
|
confirmationdialog alchemywindow referenceinterface spellwindow mainmenu quickkeysmenu
|
||||||
itemselection spellbuyingwindow loadingscreen levelupdialog waitdialog spellcreationdialog
|
itemselection spellbuyingwindow loadingscreen levelupdialog waitdialog spellcreationdialog
|
||||||
enchantingdialog trainingwindow travelwindow imagebutton exposedwindow cursor spellicons
|
enchantingdialog trainingwindow travelwindow exposedwindow cursor spellicons
|
||||||
merchantrepair repair soulgemdialog companionwindow bookpage journalviewmodel journalbooks
|
merchantrepair repair soulgemdialog companionwindow bookpage journalviewmodel journalbooks
|
||||||
keywordsearch itemmodel containeritemmodel inventoryitemmodel sortfilteritemmodel itemview
|
keywordsearch itemmodel containeritemmodel inventoryitemmodel sortfilteritemmodel itemview
|
||||||
tradeitemmodel companionitemmodel pickpocketitemmodel controllers savegamedialog
|
tradeitemmodel companionitemmodel pickpocketitemmodel controllers savegamedialog
|
||||||
|
|
|
@ -193,7 +193,7 @@ namespace MWGui
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void BookWindow::adjustButton (MWGui::ImageButton* button)
|
void BookWindow::adjustButton (Gui::ImageButton* button)
|
||||||
{
|
{
|
||||||
MyGUI::IntSize diff = button->getSize() - button->getRequestedSize();
|
MyGUI::IntSize diff = button->getSize() - button->getRequestedSize();
|
||||||
button->setSize(button->getRequestedSize());
|
button->setSize(button->getRequestedSize());
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
#include "../mwworld/ptr.hpp"
|
#include "../mwworld/ptr.hpp"
|
||||||
|
|
||||||
#include "imagebutton.hpp"
|
#include <components/widgets/imagebutton.hpp>
|
||||||
|
|
||||||
namespace MWGui
|
namespace MWGui
|
||||||
{
|
{
|
||||||
|
@ -31,13 +31,13 @@ namespace MWGui
|
||||||
|
|
||||||
void updatePages();
|
void updatePages();
|
||||||
void clearPages();
|
void clearPages();
|
||||||
void adjustButton(MWGui::ImageButton* button);
|
void adjustButton(Gui::ImageButton* button);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MWGui::ImageButton* mCloseButton;
|
Gui::ImageButton* mCloseButton;
|
||||||
MWGui::ImageButton* mTakeButton;
|
Gui::ImageButton* mTakeButton;
|
||||||
MWGui::ImageButton* mNextPageButton;
|
Gui::ImageButton* mNextPageButton;
|
||||||
MWGui::ImageButton* mPrevPageButton;
|
Gui::ImageButton* mPrevPageButton;
|
||||||
MyGUI::TextBox* mLeftPageNumber;
|
MyGUI::TextBox* mLeftPageNumber;
|
||||||
MyGUI::TextBox* mRightPageNumber;
|
MyGUI::TextBox* mRightPageNumber;
|
||||||
MyGUI::Widget* mLeftPage;
|
MyGUI::Widget* mLeftPage;
|
||||||
|
|
|
@ -15,9 +15,10 @@
|
||||||
#include <boost/function.hpp>
|
#include <boost/function.hpp>
|
||||||
#include "boost/lexical_cast.hpp"
|
#include "boost/lexical_cast.hpp"
|
||||||
|
|
||||||
|
#include <components/widgets/imagebutton.hpp>
|
||||||
|
|
||||||
#include "bookpage.hpp"
|
#include "bookpage.hpp"
|
||||||
#include "windowbase.hpp"
|
#include "windowbase.hpp"
|
||||||
#include "imagebutton.hpp"
|
|
||||||
#include "journalviewmodel.hpp"
|
#include "journalviewmodel.hpp"
|
||||||
#include "journalbooks.hpp"
|
#include "journalbooks.hpp"
|
||||||
#include "list.hpp"
|
#include "list.hpp"
|
||||||
|
@ -82,7 +83,7 @@ namespace
|
||||||
|
|
||||||
void adviseButtonClick (char const * name, void (JournalWindowImpl::*Handler) (MyGUI::Widget* _sender))
|
void adviseButtonClick (char const * name, void (JournalWindowImpl::*Handler) (MyGUI::Widget* _sender))
|
||||||
{
|
{
|
||||||
getWidget <MWGui::ImageButton> (name) ->
|
getWidget <Gui::ImageButton> (name) ->
|
||||||
eventMouseButtonClick += newDelegate(this, Handler);
|
eventMouseButtonClick += newDelegate(this, Handler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,12 +147,12 @@ namespace
|
||||||
adjustButton(ShowActiveBTN, true);
|
adjustButton(ShowActiveBTN, true);
|
||||||
adjustButton(JournalBTN);
|
adjustButton(JournalBTN);
|
||||||
|
|
||||||
MWGui::ImageButton* optionsButton = getWidget<MWGui::ImageButton>(OptionsBTN);
|
Gui::ImageButton* optionsButton = getWidget<Gui::ImageButton>(OptionsBTN);
|
||||||
if (optionsButton->getWidth() == 0)
|
if (optionsButton->getWidth() == 0)
|
||||||
{
|
{
|
||||||
// If tribunal is not installed (-> no options button), we still want the Topics button available,
|
// If tribunal is not installed (-> no options button), we still want the Topics button available,
|
||||||
// so place it where the options button would have been
|
// so place it where the options button would have been
|
||||||
MWGui::ImageButton* topicsButton = getWidget<MWGui::ImageButton>(TopicsBTN);
|
Gui::ImageButton* topicsButton = getWidget<Gui::ImageButton>(TopicsBTN);
|
||||||
topicsButton->detachFromWidget();
|
topicsButton->detachFromWidget();
|
||||||
topicsButton->attachToWidget(optionsButton->getParent());
|
topicsButton->attachToWidget(optionsButton->getParent());
|
||||||
topicsButton->setPosition(optionsButton->getPosition());
|
topicsButton->setPosition(optionsButton->getPosition());
|
||||||
|
@ -159,7 +160,7 @@ namespace
|
||||||
topicsButton->eventMouseButtonClick += MyGUI::newDelegate(this, &JournalWindowImpl::notifyOptions);
|
topicsButton->eventMouseButtonClick += MyGUI::newDelegate(this, &JournalWindowImpl::notifyOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
MWGui::ImageButton* nextButton = getWidget<MWGui::ImageButton>(NextPageBTN);
|
Gui::ImageButton* nextButton = getWidget<Gui::ImageButton>(NextPageBTN);
|
||||||
if (nextButton->getSize().width == 64)
|
if (nextButton->getSize().width == 64)
|
||||||
{
|
{
|
||||||
// english button has a 7 pixel wide strip of garbage on its right edge
|
// english button has a 7 pixel wide strip of garbage on its right edge
|
||||||
|
@ -182,7 +183,7 @@ namespace
|
||||||
|
|
||||||
void adjustButton (char const * name, bool optional = false)
|
void adjustButton (char const * name, bool optional = false)
|
||||||
{
|
{
|
||||||
MWGui::ImageButton* button = getWidget<MWGui::ImageButton>(name);
|
Gui::ImageButton* button = getWidget<Gui::ImageButton>(name);
|
||||||
|
|
||||||
MyGUI::IntSize diff = button->getSize() - button->getRequestedSize(!optional);
|
MyGUI::IntSize diff = button->getSize() - button->getRequestedSize(!optional);
|
||||||
button->setSize(button->getRequestedSize(!optional));
|
button->setSize(button->getRequestedSize(!optional));
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
|
|
||||||
#include <components/version/version.hpp>
|
#include <components/version/version.hpp>
|
||||||
|
|
||||||
|
#include <components/widgets/imagebutton.hpp>
|
||||||
|
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
#include "../mwbase/windowmanager.hpp"
|
#include "../mwbase/windowmanager.hpp"
|
||||||
#include "../mwbase/soundmanager.hpp"
|
#include "../mwbase/soundmanager.hpp"
|
||||||
|
@ -16,7 +18,6 @@
|
||||||
|
|
||||||
#include "savegamedialog.hpp"
|
#include "savegamedialog.hpp"
|
||||||
#include "confirmationdialog.hpp"
|
#include "confirmationdialog.hpp"
|
||||||
#include "imagebutton.hpp"
|
|
||||||
#include "backgroundimage.hpp"
|
#include "backgroundimage.hpp"
|
||||||
#include "videowidget.hpp"
|
#include "videowidget.hpp"
|
||||||
|
|
||||||
|
@ -249,7 +250,7 @@ namespace MWGui
|
||||||
{
|
{
|
||||||
if (mButtons.find(*it) == mButtons.end())
|
if (mButtons.find(*it) == mButtons.end())
|
||||||
{
|
{
|
||||||
MWGui::ImageButton* button = mButtonBox->createWidget<MWGui::ImageButton>
|
Gui::ImageButton* button = mButtonBox->createWidget<Gui::ImageButton>
|
||||||
("ImageBox", MyGUI::IntCoord(0, curH, 0, 0), MyGUI::Align::Default);
|
("ImageBox", MyGUI::IntCoord(0, curH, 0, 0), MyGUI::Align::Default);
|
||||||
button->setProperty("ImageHighlighted", "textures\\menu_" + *it + "_over.dds");
|
button->setProperty("ImageHighlighted", "textures\\menu_" + *it + "_over.dds");
|
||||||
button->setProperty("ImageNormal", "textures\\menu_" + *it + ".dds");
|
button->setProperty("ImageNormal", "textures\\menu_" + *it + ".dds");
|
||||||
|
@ -262,7 +263,7 @@ namespace MWGui
|
||||||
|
|
||||||
// Start by hiding all buttons
|
// Start by hiding all buttons
|
||||||
int maxwidth = 0;
|
int maxwidth = 0;
|
||||||
for (std::map<std::string, MWGui::ImageButton*>::iterator it = mButtons.begin(); it != mButtons.end(); ++it)
|
for (std::map<std::string, Gui::ImageButton*>::iterator it = mButtons.begin(); it != mButtons.end(); ++it)
|
||||||
{
|
{
|
||||||
it->second->setVisible(false);
|
it->second->setVisible(false);
|
||||||
MyGUI::IntSize requested = it->second->getRequestedSize();
|
MyGUI::IntSize requested = it->second->getRequestedSize();
|
||||||
|
@ -274,7 +275,7 @@ namespace MWGui
|
||||||
for (std::vector<std::string>::iterator it = buttons.begin(); it != buttons.end(); ++it)
|
for (std::vector<std::string>::iterator it = buttons.begin(); it != buttons.end(); ++it)
|
||||||
{
|
{
|
||||||
assert(mButtons.find(*it) != mButtons.end());
|
assert(mButtons.find(*it) != mButtons.end());
|
||||||
MWGui::ImageButton* button = mButtons[*it];
|
Gui::ImageButton* button = mButtons[*it];
|
||||||
button->setVisible(true);
|
button->setVisible(true);
|
||||||
|
|
||||||
MyGUI::IntSize requested = button->getRequestedSize();
|
MyGUI::IntSize requested = button->getRequestedSize();
|
||||||
|
|
|
@ -3,10 +3,14 @@
|
||||||
|
|
||||||
#include <openengine/gui/layout.hpp>
|
#include <openengine/gui/layout.hpp>
|
||||||
|
|
||||||
|
namespace Gui
|
||||||
|
{
|
||||||
|
class ImageButton;
|
||||||
|
}
|
||||||
|
|
||||||
namespace MWGui
|
namespace MWGui
|
||||||
{
|
{
|
||||||
|
|
||||||
class ImageButton;
|
|
||||||
class BackgroundImage;
|
class BackgroundImage;
|
||||||
class SaveGameDialog;
|
class SaveGameDialog;
|
||||||
class VideoWidget;
|
class VideoWidget;
|
||||||
|
@ -39,7 +43,7 @@ namespace MWGui
|
||||||
MyGUI::ImageBox* mVideoBackground;
|
MyGUI::ImageBox* mVideoBackground;
|
||||||
VideoWidget* mVideo; // For animated main menus
|
VideoWidget* mVideo; // For animated main menus
|
||||||
|
|
||||||
std::map<std::string, MWGui::ImageButton*> mButtons;
|
std::map<std::string, Gui::ImageButton*> mButtons;
|
||||||
|
|
||||||
void onButtonClicked (MyGUI::Widget* sender);
|
void onButtonClicked (MyGUI::Widget* sender);
|
||||||
void onNewGameConfirmed();
|
void onNewGameConfirmed();
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
void adjustButton (MWGui::ImageButton* button)
|
void adjustButton (Gui::ImageButton* button)
|
||||||
{
|
{
|
||||||
MyGUI::IntSize diff = button->getSize() - button->getRequestedSize();
|
MyGUI::IntSize diff = button->getSize() - button->getRequestedSize();
|
||||||
button->setSize(button->getRequestedSize());
|
button->setSize(button->getRequestedSize());
|
||||||
|
|
|
@ -2,7 +2,8 @@
|
||||||
#define MWGUI_SCROLLWINDOW_H
|
#define MWGUI_SCROLLWINDOW_H
|
||||||
|
|
||||||
#include "windowbase.hpp"
|
#include "windowbase.hpp"
|
||||||
#include "imagebutton.hpp"
|
|
||||||
|
#include <components/widgets/imagebutton.hpp>
|
||||||
|
|
||||||
#include "../mwworld/ptr.hpp"
|
#include "../mwworld/ptr.hpp"
|
||||||
|
|
||||||
|
@ -23,8 +24,8 @@ namespace MWGui
|
||||||
void onTakeButtonClicked (MyGUI::Widget* _sender);
|
void onTakeButtonClicked (MyGUI::Widget* _sender);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MWGui::ImageButton* mCloseButton;
|
Gui::ImageButton* mCloseButton;
|
||||||
MWGui::ImageButton* mTakeButton;
|
Gui::ImageButton* mTakeButton;
|
||||||
MyGUI::ScrollView* mTextView;
|
MyGUI::ScrollView* mTextView;
|
||||||
|
|
||||||
MWWorld::Ptr mScroll;
|
MWWorld::Ptr mScroll;
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
|
|
||||||
|
#include <components/widgets/box.hpp>
|
||||||
|
|
||||||
#include "../mwbase/windowmanager.hpp"
|
#include "../mwbase/windowmanager.hpp"
|
||||||
#include "../mwbase/world.hpp"
|
#include "../mwbase/world.hpp"
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
|
@ -190,7 +192,7 @@ namespace MWGui
|
||||||
|
|
||||||
mSleeping = canRest;
|
mSleeping = canRest;
|
||||||
|
|
||||||
dynamic_cast<Widgets::Box*>(mMainWidget)->notifyChildrenSizeChanged();
|
dynamic_cast<Gui::Box*>(mMainWidget)->notifyChildrenSizeChanged();
|
||||||
center();
|
center();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -537,412 +537,6 @@ namespace MWGui
|
||||||
assignWidget(mBarTextWidget, "BarText");
|
assignWidget(mBarTextWidget, "BarText");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void AutoSizedWidget::notifySizeChange (MyGUI::Widget* w)
|
|
||||||
{
|
|
||||||
MyGUI::Widget * parent = w->getParent();
|
|
||||||
if (parent != 0)
|
|
||||||
{
|
|
||||||
if (mExpandDirection == MyGUI::Align::Left)
|
|
||||||
{
|
|
||||||
int hdiff = getRequestedSize ().width - w->getSize().width;
|
|
||||||
w->setPosition(w->getPosition() - MyGUI::IntPoint(hdiff, 0));
|
|
||||||
}
|
|
||||||
w->setSize(getRequestedSize ());
|
|
||||||
|
|
||||||
while (parent != 0)
|
|
||||||
{
|
|
||||||
Box * b = dynamic_cast<Box*>(parent);
|
|
||||||
if (b)
|
|
||||||
b->notifyChildrenSizeChanged();
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
parent = parent->getParent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
MyGUI::IntSize AutoSizedTextBox::getRequestedSize()
|
|
||||||
{
|
|
||||||
return getTextSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AutoSizedTextBox::setCaption(const MyGUI::UString& _value)
|
|
||||||
{
|
|
||||||
TextBox::setCaption(_value);
|
|
||||||
|
|
||||||
notifySizeChange (this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AutoSizedTextBox::setPropertyOverride(const std::string& _key, const std::string& _value)
|
|
||||||
{
|
|
||||||
if (_key == "ExpandDirection")
|
|
||||||
{
|
|
||||||
mExpandDirection = MyGUI::Align::parse (_value);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
TextBox::setPropertyOverride (_key, _value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MyGUI::IntSize AutoSizedEditBox::getRequestedSize()
|
|
||||||
{
|
|
||||||
if (getAlign().isHStretch())
|
|
||||||
throw std::runtime_error("AutoSizedEditBox can't have HStretch align (" + getName() + ")");
|
|
||||||
return MyGUI::IntSize(getSize().width, getTextSize().height);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AutoSizedEditBox::setCaption(const MyGUI::UString& _value)
|
|
||||||
{
|
|
||||||
EditBox::setCaption(_value);
|
|
||||||
|
|
||||||
notifySizeChange (this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AutoSizedEditBox::setPropertyOverride(const std::string& _key, const std::string& _value)
|
|
||||||
{
|
|
||||||
if (_key == "ExpandDirection")
|
|
||||||
{
|
|
||||||
mExpandDirection = MyGUI::Align::parse (_value);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
EditBox::setPropertyOverride (_key, _value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
MyGUI::IntSize AutoSizedButton::getRequestedSize()
|
|
||||||
{
|
|
||||||
MyGUI::IntSize padding(24, 8);
|
|
||||||
if (isUserString("TextPadding"))
|
|
||||||
padding = MyGUI::IntSize::parse(getUserString("TextPadding"));
|
|
||||||
|
|
||||||
MyGUI::IntSize size = getTextSize() + MyGUI::IntSize(padding.width,padding.height);
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
void AutoSizedButton::setCaption(const MyGUI::UString& _value)
|
|
||||||
{
|
|
||||||
Button::setCaption(_value);
|
|
||||||
|
|
||||||
notifySizeChange (this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AutoSizedButton::setPropertyOverride(const std::string& _key, const std::string& _value)
|
|
||||||
{
|
|
||||||
if (_key == "ExpandDirection")
|
|
||||||
{
|
|
||||||
mExpandDirection = MyGUI::Align::parse (_value);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Button::setPropertyOverride (_key, _value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Box::Box()
|
|
||||||
: mSpacing(4)
|
|
||||||
, mPadding(0)
|
|
||||||
, mAutoResize(false)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void Box::notifyChildrenSizeChanged ()
|
|
||||||
{
|
|
||||||
align();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Box::_setPropertyImpl(const std::string& _key, const std::string& _value)
|
|
||||||
{
|
|
||||||
if (_key == "Spacing")
|
|
||||||
mSpacing = MyGUI::utility::parseValue<int>(_value);
|
|
||||||
else if (_key == "Padding")
|
|
||||||
mPadding = MyGUI::utility::parseValue<int>(_value);
|
|
||||||
else if (_key == "AutoResize")
|
|
||||||
mAutoResize = MyGUI::utility::parseValue<bool>(_value);
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void HBox::align ()
|
|
||||||
{
|
|
||||||
unsigned int count = getChildCount ();
|
|
||||||
size_t h_stretched_count = 0;
|
|
||||||
int total_width = 0;
|
|
||||||
int total_height = 0;
|
|
||||||
std::vector< std::pair<MyGUI::IntSize, bool> > sizes;
|
|
||||||
sizes.resize(count);
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i < count; ++i)
|
|
||||||
{
|
|
||||||
MyGUI::Widget* w = getChildAt(i);
|
|
||||||
bool hstretch = w->getUserString ("HStretch") == "true";
|
|
||||||
bool hidden = w->getUserString("Hidden") == "true";
|
|
||||||
if (hidden)
|
|
||||||
continue;
|
|
||||||
h_stretched_count += hstretch;
|
|
||||||
AutoSizedWidget* aw = dynamic_cast<AutoSizedWidget*>(w);
|
|
||||||
if (aw)
|
|
||||||
{
|
|
||||||
sizes[i] = std::make_pair(aw->getRequestedSize (), hstretch);
|
|
||||||
total_width += aw->getRequestedSize ().width;
|
|
||||||
total_height = std::max(total_height, aw->getRequestedSize ().height);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sizes[i] = std::make_pair(w->getSize(), hstretch);
|
|
||||||
total_width += w->getSize().width;
|
|
||||||
if (!(w->getUserString("VStretch") == "true"))
|
|
||||||
total_height = std::max(total_height, w->getSize().height);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i != count-1)
|
|
||||||
total_width += mSpacing;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mAutoResize && (total_width+mPadding*2 != getSize().width || total_height+mPadding*2 != getSize().height))
|
|
||||||
{
|
|
||||||
setSize(MyGUI::IntSize(total_width+mPadding*2, total_height+mPadding*2));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int curX = 0;
|
|
||||||
for (unsigned int i = 0; i < count; ++i)
|
|
||||||
{
|
|
||||||
if (i == 0)
|
|
||||||
curX += mPadding;
|
|
||||||
|
|
||||||
MyGUI::Widget* w = getChildAt(i);
|
|
||||||
|
|
||||||
bool hidden = w->getUserString("Hidden") == "true";
|
|
||||||
if (hidden)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
bool vstretch = w->getUserString ("VStretch") == "true";
|
|
||||||
int max_height = getSize().height - mPadding*2;
|
|
||||||
int height = vstretch ? max_height : sizes[i].first.height;
|
|
||||||
|
|
||||||
MyGUI::IntCoord widgetCoord;
|
|
||||||
widgetCoord.left = curX;
|
|
||||||
widgetCoord.top = mPadding + (getSize().height-mPadding*2 - height) / 2;
|
|
||||||
int width = sizes[i].second ? sizes[i].first.width + (getSize().width-mPadding*2 - total_width)/h_stretched_count
|
|
||||||
: sizes[i].first.width;
|
|
||||||
widgetCoord.width = width;
|
|
||||||
widgetCoord.height = height;
|
|
||||||
w->setCoord(widgetCoord);
|
|
||||||
curX += width;
|
|
||||||
|
|
||||||
if (i != count-1)
|
|
||||||
curX += mSpacing;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void HBox::setPropertyOverride(const std::string& _key, const std::string& _value)
|
|
||||||
{
|
|
||||||
if (!Box::_setPropertyImpl (_key, _value))
|
|
||||||
MyGUI::Widget::setPropertyOverride(_key, _value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void HBox::setSize (const MyGUI::IntSize& _value)
|
|
||||||
{
|
|
||||||
MyGUI::Widget::setSize (_value);
|
|
||||||
align();
|
|
||||||
}
|
|
||||||
|
|
||||||
void HBox::setCoord (const MyGUI::IntCoord& _value)
|
|
||||||
{
|
|
||||||
MyGUI::Widget::setCoord (_value);
|
|
||||||
align();
|
|
||||||
}
|
|
||||||
|
|
||||||
void HBox::onWidgetCreated(MyGUI::Widget* _widget)
|
|
||||||
{
|
|
||||||
align();
|
|
||||||
}
|
|
||||||
|
|
||||||
MyGUI::IntSize HBox::getRequestedSize ()
|
|
||||||
{
|
|
||||||
MyGUI::IntSize size(0,0);
|
|
||||||
for (unsigned int i = 0; i < getChildCount (); ++i)
|
|
||||||
{
|
|
||||||
bool hidden = getChildAt(i)->getUserString("Hidden") == "true";
|
|
||||||
if (hidden)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
AutoSizedWidget* w = dynamic_cast<AutoSizedWidget*>(getChildAt(i));
|
|
||||||
if (w)
|
|
||||||
{
|
|
||||||
MyGUI::IntSize requested = w->getRequestedSize ();
|
|
||||||
size.height = std::max(size.height, requested.height);
|
|
||||||
size.width = size.width + requested.width;
|
|
||||||
if (i != getChildCount()-1)
|
|
||||||
size.width += mSpacing;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MyGUI::IntSize requested = getChildAt(i)->getSize ();
|
|
||||||
size.height = std::max(size.height, requested.height);
|
|
||||||
|
|
||||||
if (getChildAt(i)->getUserString("HStretch") != "true")
|
|
||||||
size.width = size.width + requested.width;
|
|
||||||
|
|
||||||
if (i != getChildCount()-1)
|
|
||||||
size.width += mSpacing;
|
|
||||||
}
|
|
||||||
size.height += mPadding*2;
|
|
||||||
size.width += mPadding*2;
|
|
||||||
}
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void VBox::align ()
|
|
||||||
{
|
|
||||||
unsigned int count = getChildCount ();
|
|
||||||
size_t v_stretched_count = 0;
|
|
||||||
int total_height = 0;
|
|
||||||
int total_width = 0;
|
|
||||||
std::vector< std::pair<MyGUI::IntSize, bool> > sizes;
|
|
||||||
sizes.resize(count);
|
|
||||||
for (unsigned int i = 0; i < count; ++i)
|
|
||||||
{
|
|
||||||
MyGUI::Widget* w = getChildAt(i);
|
|
||||||
|
|
||||||
bool hidden = w->getUserString("Hidden") == "true";
|
|
||||||
if (hidden)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
bool vstretch = w->getUserString ("VStretch") == "true";
|
|
||||||
v_stretched_count += vstretch;
|
|
||||||
AutoSizedWidget* aw = dynamic_cast<AutoSizedWidget*>(w);
|
|
||||||
if (aw)
|
|
||||||
{
|
|
||||||
sizes[i] = std::make_pair(aw->getRequestedSize (), vstretch);
|
|
||||||
total_height += aw->getRequestedSize ().height;
|
|
||||||
total_width = std::max(total_width, aw->getRequestedSize ().width);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sizes[i] = std::make_pair(w->getSize(), vstretch);
|
|
||||||
total_height += w->getSize().height;
|
|
||||||
|
|
||||||
if (!(w->getUserString("HStretch") == "true"))
|
|
||||||
total_width = std::max(total_width, w->getSize().width);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (i != count-1)
|
|
||||||
total_height += mSpacing;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mAutoResize && (total_width+mPadding*2 != getSize().width || total_height+mPadding*2 != getSize().height))
|
|
||||||
{
|
|
||||||
setSize(MyGUI::IntSize(total_width+mPadding*2, total_height+mPadding*2));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int curY = 0;
|
|
||||||
for (unsigned int i = 0; i < count; ++i)
|
|
||||||
{
|
|
||||||
if (i==0)
|
|
||||||
curY += mPadding;
|
|
||||||
|
|
||||||
MyGUI::Widget* w = getChildAt(i);
|
|
||||||
|
|
||||||
bool hidden = w->getUserString("Hidden") == "true";
|
|
||||||
if (hidden)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
bool hstretch = w->getUserString ("HStretch") == "true";
|
|
||||||
int maxWidth = getSize().width - mPadding*2;
|
|
||||||
int width = hstretch ? maxWidth : sizes[i].first.width;
|
|
||||||
|
|
||||||
MyGUI::IntCoord widgetCoord;
|
|
||||||
widgetCoord.top = curY;
|
|
||||||
widgetCoord.left = mPadding + (getSize().width-mPadding*2 - width) / 2;
|
|
||||||
int height = sizes[i].second ? sizes[i].first.height + (getSize().height-mPadding*2 - total_height)/v_stretched_count
|
|
||||||
: sizes[i].first.height;
|
|
||||||
widgetCoord.height = height;
|
|
||||||
widgetCoord.width = width;
|
|
||||||
w->setCoord(widgetCoord);
|
|
||||||
curY += height;
|
|
||||||
|
|
||||||
if (i != count-1)
|
|
||||||
curY += mSpacing;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void VBox::setPropertyOverride(const std::string& _key, const std::string& _value)
|
|
||||||
{
|
|
||||||
if (!Box::_setPropertyImpl (_key, _value))
|
|
||||||
MyGUI::Widget::setPropertyOverride(_key, _value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void VBox::setSize (const MyGUI::IntSize& _value)
|
|
||||||
{
|
|
||||||
MyGUI::Widget::setSize (_value);
|
|
||||||
align();
|
|
||||||
}
|
|
||||||
|
|
||||||
void VBox::setCoord (const MyGUI::IntCoord& _value)
|
|
||||||
{
|
|
||||||
MyGUI::Widget::setCoord (_value);
|
|
||||||
align();
|
|
||||||
}
|
|
||||||
|
|
||||||
MyGUI::IntSize VBox::getRequestedSize ()
|
|
||||||
{
|
|
||||||
MyGUI::IntSize size(0,0);
|
|
||||||
for (unsigned int i = 0; i < getChildCount (); ++i)
|
|
||||||
{
|
|
||||||
bool hidden = getChildAt(i)->getUserString("Hidden") == "true";
|
|
||||||
if (hidden)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
AutoSizedWidget* w = dynamic_cast<AutoSizedWidget*>(getChildAt(i));
|
|
||||||
if (w)
|
|
||||||
{
|
|
||||||
MyGUI::IntSize requested = w->getRequestedSize ();
|
|
||||||
size.width = std::max(size.width, requested.width);
|
|
||||||
size.height = size.height + requested.height;
|
|
||||||
if (i != getChildCount()-1)
|
|
||||||
size.height += mSpacing;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MyGUI::IntSize requested = getChildAt(i)->getSize ();
|
|
||||||
size.width = std::max(size.width, requested.width);
|
|
||||||
|
|
||||||
if (getChildAt(i)->getUserString("VStretch") != "true")
|
|
||||||
size.height = size.height + requested.height;
|
|
||||||
|
|
||||||
if (i != getChildCount()-1)
|
|
||||||
size.height += mSpacing;
|
|
||||||
}
|
|
||||||
size.height += mPadding*2;
|
|
||||||
size.width += mPadding*2;
|
|
||||||
}
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
void VBox::onWidgetCreated(MyGUI::Widget* _widget)
|
|
||||||
{
|
|
||||||
align();
|
|
||||||
}
|
|
||||||
|
|
||||||
MWScrollBar::MWScrollBar()
|
MWScrollBar::MWScrollBar()
|
||||||
: mEnableRepeat(true)
|
: mEnableRepeat(true)
|
||||||
, mRepeatTriggerTime(0.5)
|
, mRepeatTriggerTime(0.5)
|
||||||
|
|
|
@ -298,118 +298,6 @@ namespace MWGui
|
||||||
};
|
};
|
||||||
typedef MWDynamicStat* MWDynamicStatPtr;
|
typedef MWDynamicStat* MWDynamicStatPtr;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class AutoSizedWidget
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual MyGUI::IntSize getRequestedSize() = 0;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void notifySizeChange(MyGUI::Widget* w);
|
|
||||||
|
|
||||||
MyGUI::Align mExpandDirection;
|
|
||||||
};
|
|
||||||
|
|
||||||
class AutoSizedTextBox : public AutoSizedWidget, public MyGUI::TextBox
|
|
||||||
{
|
|
||||||
MYGUI_RTTI_DERIVED( AutoSizedTextBox )
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual MyGUI::IntSize getRequestedSize();
|
|
||||||
virtual void setCaption(const MyGUI::UString& _value);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void setPropertyOverride(const std::string& _key, const std::string& _value);
|
|
||||||
};
|
|
||||||
|
|
||||||
class AutoSizedEditBox : public AutoSizedWidget, public MyGUI::EditBox
|
|
||||||
{
|
|
||||||
MYGUI_RTTI_DERIVED( AutoSizedEditBox )
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual MyGUI::IntSize getRequestedSize();
|
|
||||||
virtual void setCaption(const MyGUI::UString& _value);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void setPropertyOverride(const std::string& _key, const std::string& _value);
|
|
||||||
};
|
|
||||||
|
|
||||||
class AutoSizedButton : public AutoSizedWidget, public MyGUI::Button
|
|
||||||
{
|
|
||||||
MYGUI_RTTI_DERIVED( AutoSizedButton )
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual MyGUI::IntSize getRequestedSize();
|
|
||||||
virtual void setCaption(const MyGUI::UString& _value);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void setPropertyOverride(const std::string& _key, const std::string& _value);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief A container widget that automatically sizes its children
|
|
||||||
* @note the box being an AutoSizedWidget as well allows to put boxes inside a box
|
|
||||||
*/
|
|
||||||
class Box : public AutoSizedWidget
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
Box();
|
|
||||||
|
|
||||||
void notifyChildrenSizeChanged();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void align() = 0;
|
|
||||||
|
|
||||||
virtual bool _setPropertyImpl(const std::string& _key, const std::string& _value);
|
|
||||||
|
|
||||||
int mSpacing; // how much space to put between elements
|
|
||||||
|
|
||||||
int mPadding; // outer padding
|
|
||||||
|
|
||||||
bool mAutoResize; // auto resize the box so that it exactly fits all elements
|
|
||||||
};
|
|
||||||
|
|
||||||
class HBox : public Box, public MyGUI::Widget
|
|
||||||
{
|
|
||||||
MYGUI_RTTI_DERIVED( HBox )
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual void setSize (const MyGUI::IntSize &_value);
|
|
||||||
virtual void setCoord (const MyGUI::IntCoord &_value);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void align();
|
|
||||||
virtual MyGUI::IntSize getRequestedSize();
|
|
||||||
|
|
||||||
virtual void setPropertyOverride(const std::string& _key, const std::string& _value);
|
|
||||||
|
|
||||||
virtual void onWidgetCreated(MyGUI::Widget* _widget);
|
|
||||||
};
|
|
||||||
|
|
||||||
class VBox : public Box, public MyGUI::Widget
|
|
||||||
{
|
|
||||||
MYGUI_RTTI_DERIVED( VBox)
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual void setSize (const MyGUI::IntSize &_value);
|
|
||||||
virtual void setCoord (const MyGUI::IntCoord &_value);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void align();
|
|
||||||
virtual MyGUI::IntSize getRequestedSize();
|
|
||||||
|
|
||||||
virtual void setPropertyOverride(const std::string& _key, const std::string& _value);
|
|
||||||
|
|
||||||
virtual void onWidgetCreated(MyGUI::Widget* _widget);
|
|
||||||
};
|
|
||||||
|
|
||||||
class MWScrollBar : public MyGUI::ScrollBar
|
class MWScrollBar : public MyGUI::ScrollBar
|
||||||
{
|
{
|
||||||
MYGUI_RTTI_DERIVED(MWScrollBar)
|
MYGUI_RTTI_DERIVED(MWScrollBar)
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
|
|
||||||
#include <components/fontloader/fontloader.hpp>
|
#include <components/fontloader/fontloader.hpp>
|
||||||
|
|
||||||
|
#include <components/widgets/box.hpp>
|
||||||
|
|
||||||
#include "../mwbase/inputmanager.hpp"
|
#include "../mwbase/inputmanager.hpp"
|
||||||
#include "../mwbase/statemanager.hpp"
|
#include "../mwbase/statemanager.hpp"
|
||||||
|
|
||||||
|
@ -161,12 +163,12 @@ namespace MWGui
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWSpellEffect>("Widget");
|
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWSpellEffect>("Widget");
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWDynamicStat>("Widget");
|
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWDynamicStat>("Widget");
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWList>("Widget");
|
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWList>("Widget");
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::HBox>("Widget");
|
MyGUI::FactoryManager::getInstance().registerFactory<Gui::HBox>("Widget");
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::VBox>("Widget");
|
MyGUI::FactoryManager::getInstance().registerFactory<Gui::VBox>("Widget");
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::AutoSizedTextBox>("Widget");
|
MyGUI::FactoryManager::getInstance().registerFactory<Gui::AutoSizedTextBox>("Widget");
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::AutoSizedEditBox>("Widget");
|
MyGUI::FactoryManager::getInstance().registerFactory<Gui::AutoSizedEditBox>("Widget");
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::AutoSizedButton>("Widget");
|
MyGUI::FactoryManager::getInstance().registerFactory<Gui::AutoSizedButton>("Widget");
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::ImageButton>("Widget");
|
MyGUI::FactoryManager::getInstance().registerFactory<Gui::ImageButton>("Widget");
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::ExposedWindow>("Widget");
|
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::ExposedWindow>("Widget");
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWScrollBar>("Widget");
|
MyGUI::FactoryManager::getInstance().registerFactory<MWGui::Widgets::MWScrollBar>("Widget");
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<VideoWidget>("Widget");
|
MyGUI::FactoryManager::getInstance().registerFactory<VideoWidget>("Widget");
|
||||||
|
|
|
@ -92,7 +92,7 @@ add_component_dir (ogreinit
|
||||||
)
|
)
|
||||||
|
|
||||||
add_component_dir (widgets
|
add_component_dir (widgets
|
||||||
box
|
box imagebutton
|
||||||
)
|
)
|
||||||
|
|
||||||
add_component_dir (fontloader
|
add_component_dir (fontloader
|
||||||
|
|
407
components/widgets/box.cpp
Normal file
407
components/widgets/box.cpp
Normal file
|
@ -0,0 +1,407 @@
|
||||||
|
#include "box.hpp"
|
||||||
|
|
||||||
|
namespace Gui
|
||||||
|
{
|
||||||
|
|
||||||
|
void AutoSizedWidget::notifySizeChange (MyGUI::Widget* w)
|
||||||
|
{
|
||||||
|
MyGUI::Widget * parent = w->getParent();
|
||||||
|
if (parent != 0)
|
||||||
|
{
|
||||||
|
if (mExpandDirection == MyGUI::Align::Left)
|
||||||
|
{
|
||||||
|
int hdiff = getRequestedSize ().width - w->getSize().width;
|
||||||
|
w->setPosition(w->getPosition() - MyGUI::IntPoint(hdiff, 0));
|
||||||
|
}
|
||||||
|
w->setSize(getRequestedSize ());
|
||||||
|
|
||||||
|
while (parent != 0)
|
||||||
|
{
|
||||||
|
Box * b = dynamic_cast<Box*>(parent);
|
||||||
|
if (b)
|
||||||
|
b->notifyChildrenSizeChanged();
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
parent = parent->getParent();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MyGUI::IntSize AutoSizedTextBox::getRequestedSize()
|
||||||
|
{
|
||||||
|
return getTextSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AutoSizedTextBox::setCaption(const MyGUI::UString& _value)
|
||||||
|
{
|
||||||
|
TextBox::setCaption(_value);
|
||||||
|
|
||||||
|
notifySizeChange (this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AutoSizedTextBox::setPropertyOverride(const std::string& _key, const std::string& _value)
|
||||||
|
{
|
||||||
|
if (_key == "ExpandDirection")
|
||||||
|
{
|
||||||
|
mExpandDirection = MyGUI::Align::parse (_value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TextBox::setPropertyOverride (_key, _value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MyGUI::IntSize AutoSizedEditBox::getRequestedSize()
|
||||||
|
{
|
||||||
|
if (getAlign().isHStretch())
|
||||||
|
throw std::runtime_error("AutoSizedEditBox can't have HStretch align (" + getName() + ")");
|
||||||
|
return MyGUI::IntSize(getSize().width, getTextSize().height);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AutoSizedEditBox::setCaption(const MyGUI::UString& _value)
|
||||||
|
{
|
||||||
|
EditBox::setCaption(_value);
|
||||||
|
|
||||||
|
notifySizeChange (this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AutoSizedEditBox::setPropertyOverride(const std::string& _key, const std::string& _value)
|
||||||
|
{
|
||||||
|
if (_key == "ExpandDirection")
|
||||||
|
{
|
||||||
|
mExpandDirection = MyGUI::Align::parse (_value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
EditBox::setPropertyOverride (_key, _value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MyGUI::IntSize AutoSizedButton::getRequestedSize()
|
||||||
|
{
|
||||||
|
MyGUI::IntSize padding(24, 8);
|
||||||
|
if (isUserString("TextPadding"))
|
||||||
|
padding = MyGUI::IntSize::parse(getUserString("TextPadding"));
|
||||||
|
|
||||||
|
MyGUI::IntSize size = getTextSize() + MyGUI::IntSize(padding.width,padding.height);
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AutoSizedButton::setCaption(const MyGUI::UString& _value)
|
||||||
|
{
|
||||||
|
Button::setCaption(_value);
|
||||||
|
|
||||||
|
notifySizeChange (this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AutoSizedButton::setPropertyOverride(const std::string& _key, const std::string& _value)
|
||||||
|
{
|
||||||
|
if (_key == "ExpandDirection")
|
||||||
|
{
|
||||||
|
mExpandDirection = MyGUI::Align::parse (_value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Button::setPropertyOverride (_key, _value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Box::Box()
|
||||||
|
: mSpacing(4)
|
||||||
|
, mPadding(0)
|
||||||
|
, mAutoResize(false)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void Box::notifyChildrenSizeChanged ()
|
||||||
|
{
|
||||||
|
align();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Box::_setPropertyImpl(const std::string& _key, const std::string& _value)
|
||||||
|
{
|
||||||
|
if (_key == "Spacing")
|
||||||
|
mSpacing = MyGUI::utility::parseValue<int>(_value);
|
||||||
|
else if (_key == "Padding")
|
||||||
|
mPadding = MyGUI::utility::parseValue<int>(_value);
|
||||||
|
else if (_key == "AutoResize")
|
||||||
|
mAutoResize = MyGUI::utility::parseValue<bool>(_value);
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HBox::align ()
|
||||||
|
{
|
||||||
|
unsigned int count = getChildCount ();
|
||||||
|
size_t h_stretched_count = 0;
|
||||||
|
int total_width = 0;
|
||||||
|
int total_height = 0;
|
||||||
|
std::vector< std::pair<MyGUI::IntSize, bool> > sizes;
|
||||||
|
sizes.resize(count);
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < count; ++i)
|
||||||
|
{
|
||||||
|
MyGUI::Widget* w = getChildAt(i);
|
||||||
|
bool hstretch = w->getUserString ("HStretch") == "true";
|
||||||
|
bool hidden = w->getUserString("Hidden") == "true";
|
||||||
|
if (hidden)
|
||||||
|
continue;
|
||||||
|
h_stretched_count += hstretch;
|
||||||
|
AutoSizedWidget* aw = dynamic_cast<AutoSizedWidget*>(w);
|
||||||
|
if (aw)
|
||||||
|
{
|
||||||
|
sizes[i] = std::make_pair(aw->getRequestedSize (), hstretch);
|
||||||
|
total_width += aw->getRequestedSize ().width;
|
||||||
|
total_height = std::max(total_height, aw->getRequestedSize ().height);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sizes[i] = std::make_pair(w->getSize(), hstretch);
|
||||||
|
total_width += w->getSize().width;
|
||||||
|
if (!(w->getUserString("VStretch") == "true"))
|
||||||
|
total_height = std::max(total_height, w->getSize().height);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i != count-1)
|
||||||
|
total_width += mSpacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mAutoResize && (total_width+mPadding*2 != getSize().width || total_height+mPadding*2 != getSize().height))
|
||||||
|
{
|
||||||
|
setSize(MyGUI::IntSize(total_width+mPadding*2, total_height+mPadding*2));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int curX = 0;
|
||||||
|
for (unsigned int i = 0; i < count; ++i)
|
||||||
|
{
|
||||||
|
if (i == 0)
|
||||||
|
curX += mPadding;
|
||||||
|
|
||||||
|
MyGUI::Widget* w = getChildAt(i);
|
||||||
|
|
||||||
|
bool hidden = w->getUserString("Hidden") == "true";
|
||||||
|
if (hidden)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
bool vstretch = w->getUserString ("VStretch") == "true";
|
||||||
|
int max_height = getSize().height - mPadding*2;
|
||||||
|
int height = vstretch ? max_height : sizes[i].first.height;
|
||||||
|
|
||||||
|
MyGUI::IntCoord widgetCoord;
|
||||||
|
widgetCoord.left = curX;
|
||||||
|
widgetCoord.top = mPadding + (getSize().height-mPadding*2 - height) / 2;
|
||||||
|
int width = sizes[i].second ? sizes[i].first.width + (getSize().width-mPadding*2 - total_width)/h_stretched_count
|
||||||
|
: sizes[i].first.width;
|
||||||
|
widgetCoord.width = width;
|
||||||
|
widgetCoord.height = height;
|
||||||
|
w->setCoord(widgetCoord);
|
||||||
|
curX += width;
|
||||||
|
|
||||||
|
if (i != count-1)
|
||||||
|
curX += mSpacing;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void HBox::setPropertyOverride(const std::string& _key, const std::string& _value)
|
||||||
|
{
|
||||||
|
if (!Box::_setPropertyImpl (_key, _value))
|
||||||
|
MyGUI::Widget::setPropertyOverride(_key, _value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HBox::setSize (const MyGUI::IntSize& _value)
|
||||||
|
{
|
||||||
|
MyGUI::Widget::setSize (_value);
|
||||||
|
align();
|
||||||
|
}
|
||||||
|
|
||||||
|
void HBox::setCoord (const MyGUI::IntCoord& _value)
|
||||||
|
{
|
||||||
|
MyGUI::Widget::setCoord (_value);
|
||||||
|
align();
|
||||||
|
}
|
||||||
|
|
||||||
|
void HBox::onWidgetCreated(MyGUI::Widget* _widget)
|
||||||
|
{
|
||||||
|
align();
|
||||||
|
}
|
||||||
|
|
||||||
|
MyGUI::IntSize HBox::getRequestedSize ()
|
||||||
|
{
|
||||||
|
MyGUI::IntSize size(0,0);
|
||||||
|
for (unsigned int i = 0; i < getChildCount (); ++i)
|
||||||
|
{
|
||||||
|
bool hidden = getChildAt(i)->getUserString("Hidden") == "true";
|
||||||
|
if (hidden)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
AutoSizedWidget* w = dynamic_cast<AutoSizedWidget*>(getChildAt(i));
|
||||||
|
if (w)
|
||||||
|
{
|
||||||
|
MyGUI::IntSize requested = w->getRequestedSize ();
|
||||||
|
size.height = std::max(size.height, requested.height);
|
||||||
|
size.width = size.width + requested.width;
|
||||||
|
if (i != getChildCount()-1)
|
||||||
|
size.width += mSpacing;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MyGUI::IntSize requested = getChildAt(i)->getSize ();
|
||||||
|
size.height = std::max(size.height, requested.height);
|
||||||
|
|
||||||
|
if (getChildAt(i)->getUserString("HStretch") != "true")
|
||||||
|
size.width = size.width + requested.width;
|
||||||
|
|
||||||
|
if (i != getChildCount()-1)
|
||||||
|
size.width += mSpacing;
|
||||||
|
}
|
||||||
|
size.height += mPadding*2;
|
||||||
|
size.width += mPadding*2;
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void VBox::align ()
|
||||||
|
{
|
||||||
|
unsigned int count = getChildCount ();
|
||||||
|
size_t v_stretched_count = 0;
|
||||||
|
int total_height = 0;
|
||||||
|
int total_width = 0;
|
||||||
|
std::vector< std::pair<MyGUI::IntSize, bool> > sizes;
|
||||||
|
sizes.resize(count);
|
||||||
|
for (unsigned int i = 0; i < count; ++i)
|
||||||
|
{
|
||||||
|
MyGUI::Widget* w = getChildAt(i);
|
||||||
|
|
||||||
|
bool hidden = w->getUserString("Hidden") == "true";
|
||||||
|
if (hidden)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
bool vstretch = w->getUserString ("VStretch") == "true";
|
||||||
|
v_stretched_count += vstretch;
|
||||||
|
AutoSizedWidget* aw = dynamic_cast<AutoSizedWidget*>(w);
|
||||||
|
if (aw)
|
||||||
|
{
|
||||||
|
sizes[i] = std::make_pair(aw->getRequestedSize (), vstretch);
|
||||||
|
total_height += aw->getRequestedSize ().height;
|
||||||
|
total_width = std::max(total_width, aw->getRequestedSize ().width);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sizes[i] = std::make_pair(w->getSize(), vstretch);
|
||||||
|
total_height += w->getSize().height;
|
||||||
|
|
||||||
|
if (!(w->getUserString("HStretch") == "true"))
|
||||||
|
total_width = std::max(total_width, w->getSize().width);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i != count-1)
|
||||||
|
total_height += mSpacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mAutoResize && (total_width+mPadding*2 != getSize().width || total_height+mPadding*2 != getSize().height))
|
||||||
|
{
|
||||||
|
setSize(MyGUI::IntSize(total_width+mPadding*2, total_height+mPadding*2));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int curY = 0;
|
||||||
|
for (unsigned int i = 0; i < count; ++i)
|
||||||
|
{
|
||||||
|
if (i==0)
|
||||||
|
curY += mPadding;
|
||||||
|
|
||||||
|
MyGUI::Widget* w = getChildAt(i);
|
||||||
|
|
||||||
|
bool hidden = w->getUserString("Hidden") == "true";
|
||||||
|
if (hidden)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
bool hstretch = w->getUserString ("HStretch") == "true";
|
||||||
|
int maxWidth = getSize().width - mPadding*2;
|
||||||
|
int width = hstretch ? maxWidth : sizes[i].first.width;
|
||||||
|
|
||||||
|
MyGUI::IntCoord widgetCoord;
|
||||||
|
widgetCoord.top = curY;
|
||||||
|
widgetCoord.left = mPadding + (getSize().width-mPadding*2 - width) / 2;
|
||||||
|
int height = sizes[i].second ? sizes[i].first.height + (getSize().height-mPadding*2 - total_height)/v_stretched_count
|
||||||
|
: sizes[i].first.height;
|
||||||
|
widgetCoord.height = height;
|
||||||
|
widgetCoord.width = width;
|
||||||
|
w->setCoord(widgetCoord);
|
||||||
|
curY += height;
|
||||||
|
|
||||||
|
if (i != count-1)
|
||||||
|
curY += mSpacing;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void VBox::setPropertyOverride(const std::string& _key, const std::string& _value)
|
||||||
|
{
|
||||||
|
if (!Box::_setPropertyImpl (_key, _value))
|
||||||
|
MyGUI::Widget::setPropertyOverride(_key, _value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VBox::setSize (const MyGUI::IntSize& _value)
|
||||||
|
{
|
||||||
|
MyGUI::Widget::setSize (_value);
|
||||||
|
align();
|
||||||
|
}
|
||||||
|
|
||||||
|
void VBox::setCoord (const MyGUI::IntCoord& _value)
|
||||||
|
{
|
||||||
|
MyGUI::Widget::setCoord (_value);
|
||||||
|
align();
|
||||||
|
}
|
||||||
|
|
||||||
|
MyGUI::IntSize VBox::getRequestedSize ()
|
||||||
|
{
|
||||||
|
MyGUI::IntSize size(0,0);
|
||||||
|
for (unsigned int i = 0; i < getChildCount (); ++i)
|
||||||
|
{
|
||||||
|
bool hidden = getChildAt(i)->getUserString("Hidden") == "true";
|
||||||
|
if (hidden)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
AutoSizedWidget* w = dynamic_cast<AutoSizedWidget*>(getChildAt(i));
|
||||||
|
if (w)
|
||||||
|
{
|
||||||
|
MyGUI::IntSize requested = w->getRequestedSize ();
|
||||||
|
size.width = std::max(size.width, requested.width);
|
||||||
|
size.height = size.height + requested.height;
|
||||||
|
if (i != getChildCount()-1)
|
||||||
|
size.height += mSpacing;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MyGUI::IntSize requested = getChildAt(i)->getSize ();
|
||||||
|
size.width = std::max(size.width, requested.width);
|
||||||
|
|
||||||
|
if (getChildAt(i)->getUserString("VStretch") != "true")
|
||||||
|
size.height = size.height + requested.height;
|
||||||
|
|
||||||
|
if (i != getChildCount()-1)
|
||||||
|
size.height += mSpacing;
|
||||||
|
}
|
||||||
|
size.height += mPadding*2;
|
||||||
|
size.width += mPadding*2;
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void VBox::onWidgetCreated(MyGUI::Widget* _widget)
|
||||||
|
{
|
||||||
|
align();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
118
components/widgets/box.hpp
Normal file
118
components/widgets/box.hpp
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
#ifndef OPENMW_WIDGETS_BOX_H
|
||||||
|
#define OPENMW_WIDGETS_BOX_H
|
||||||
|
|
||||||
|
#include <MyGUI_Widget.h>
|
||||||
|
#include <MyGUI_TextBox.h>
|
||||||
|
#include <MyGUI_EditBox.h>
|
||||||
|
#include <MyGUI_Button.h>
|
||||||
|
|
||||||
|
namespace Gui
|
||||||
|
{
|
||||||
|
|
||||||
|
class AutoSizedWidget
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual MyGUI::IntSize getRequestedSize() = 0;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void notifySizeChange(MyGUI::Widget* w);
|
||||||
|
|
||||||
|
MyGUI::Align mExpandDirection;
|
||||||
|
};
|
||||||
|
|
||||||
|
class AutoSizedTextBox : public AutoSizedWidget, public MyGUI::TextBox
|
||||||
|
{
|
||||||
|
MYGUI_RTTI_DERIVED( AutoSizedTextBox )
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual MyGUI::IntSize getRequestedSize();
|
||||||
|
virtual void setCaption(const MyGUI::UString& _value);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void setPropertyOverride(const std::string& _key, const std::string& _value);
|
||||||
|
};
|
||||||
|
|
||||||
|
class AutoSizedEditBox : public AutoSizedWidget, public MyGUI::EditBox
|
||||||
|
{
|
||||||
|
MYGUI_RTTI_DERIVED( AutoSizedEditBox )
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual MyGUI::IntSize getRequestedSize();
|
||||||
|
virtual void setCaption(const MyGUI::UString& _value);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void setPropertyOverride(const std::string& _key, const std::string& _value);
|
||||||
|
};
|
||||||
|
|
||||||
|
class AutoSizedButton : public AutoSizedWidget, public MyGUI::Button
|
||||||
|
{
|
||||||
|
MYGUI_RTTI_DERIVED( AutoSizedButton )
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual MyGUI::IntSize getRequestedSize();
|
||||||
|
virtual void setCaption(const MyGUI::UString& _value);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void setPropertyOverride(const std::string& _key, const std::string& _value);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A container widget that automatically sizes its children
|
||||||
|
* @note the box being an AutoSizedWidget as well allows to put boxes inside a box
|
||||||
|
*/
|
||||||
|
class Box : public AutoSizedWidget
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Box();
|
||||||
|
|
||||||
|
void notifyChildrenSizeChanged();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void align() = 0;
|
||||||
|
|
||||||
|
virtual bool _setPropertyImpl(const std::string& _key, const std::string& _value);
|
||||||
|
|
||||||
|
int mSpacing; // how much space to put between elements
|
||||||
|
|
||||||
|
int mPadding; // outer padding
|
||||||
|
|
||||||
|
bool mAutoResize; // auto resize the box so that it exactly fits all elements
|
||||||
|
};
|
||||||
|
|
||||||
|
class HBox : public Box, public MyGUI::Widget
|
||||||
|
{
|
||||||
|
MYGUI_RTTI_DERIVED( HBox )
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void setSize (const MyGUI::IntSize &_value);
|
||||||
|
virtual void setCoord (const MyGUI::IntCoord &_value);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void align();
|
||||||
|
virtual MyGUI::IntSize getRequestedSize();
|
||||||
|
|
||||||
|
virtual void setPropertyOverride(const std::string& _key, const std::string& _value);
|
||||||
|
|
||||||
|
virtual void onWidgetCreated(MyGUI::Widget* _widget);
|
||||||
|
};
|
||||||
|
|
||||||
|
class VBox : public Box, public MyGUI::Widget
|
||||||
|
{
|
||||||
|
MYGUI_RTTI_DERIVED( VBox)
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void setSize (const MyGUI::IntSize &_value);
|
||||||
|
virtual void setCoord (const MyGUI::IntCoord &_value);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void align();
|
||||||
|
virtual MyGUI::IntSize getRequestedSize();
|
||||||
|
|
||||||
|
virtual void setPropertyOverride(const std::string& _key, const std::string& _value);
|
||||||
|
|
||||||
|
virtual void onWidgetCreated(MyGUI::Widget* _widget);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
#include <OgreTextureManager.h>
|
#include <OgreTextureManager.h>
|
||||||
|
|
||||||
namespace MWGui
|
namespace Gui
|
||||||
{
|
{
|
||||||
|
|
||||||
void ImageButton::setPropertyOverride(const std::string &_key, const std::string &_value)
|
void ImageButton::setPropertyOverride(const std::string &_key, const std::string &_value)
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
#include <MyGUI_ImageBox.h>
|
#include <MyGUI_ImageBox.h>
|
||||||
|
|
||||||
namespace MWGui
|
namespace Gui
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -4,11 +4,15 @@
|
||||||
#include <MyGUI_FactoryManager.h>
|
#include <MyGUI_FactoryManager.h>
|
||||||
#include <MyGUI_ScrollBar.h>
|
#include <MyGUI_ScrollBar.h>
|
||||||
#include <MyGUI_Gui.h>
|
#include <MyGUI_Gui.h>
|
||||||
|
#include <MyGUI_Window.h>
|
||||||
|
|
||||||
#include <components/bsa/resources.hpp>
|
#include <components/bsa/resources.hpp>
|
||||||
#include <components/files/configurationmanager.hpp>
|
#include <components/files/configurationmanager.hpp>
|
||||||
#include <components/fontloader/fontloader.hpp>
|
#include <components/fontloader/fontloader.hpp>
|
||||||
|
|
||||||
|
#include <components/widgets/imagebutton.hpp>
|
||||||
|
#include <components/widgets/box.hpp>
|
||||||
|
|
||||||
#include <OgreTextureManager.h>
|
#include <OgreTextureManager.h>
|
||||||
#include <OgreHardwarePixelBuffer.h>
|
#include <OgreHardwarePixelBuffer.h>
|
||||||
|
|
||||||
|
@ -47,6 +51,12 @@ namespace MyGUIPlugin
|
||||||
MYGUI_RTTI_DERIVED( MWDynamicStat )
|
MYGUI_RTTI_DERIVED( MWDynamicStat )
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Dummy - runtime use only
|
||||||
|
class ExposedWindow : public MyGUI::Window
|
||||||
|
{
|
||||||
|
MYGUI_RTTI_DERIVED( ExposedWindow )
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
const std::string& ResourcePlugin::getName() const
|
const std::string& ResourcePlugin::getName() const
|
||||||
{
|
{
|
||||||
|
@ -114,6 +124,13 @@ namespace MyGUIPlugin
|
||||||
void ResourcePlugin::registerWidgets()
|
void ResourcePlugin::registerWidgets()
|
||||||
{
|
{
|
||||||
MyGUI::FactoryManager::getInstance().registerFactory<MWScrollBar>("Widget");
|
MyGUI::FactoryManager::getInstance().registerFactory<MWScrollBar>("Widget");
|
||||||
|
|
||||||
|
MyGUI::FactoryManager::getInstance().registerFactory<Gui::ImageButton>("Widget");
|
||||||
|
MyGUI::FactoryManager::getInstance().registerFactory<Gui::HBox>("Widget");
|
||||||
|
MyGUI::FactoryManager::getInstance().registerFactory<Gui::VBox>("Widget");
|
||||||
|
MyGUI::FactoryManager::getInstance().registerFactory<Gui::AutoSizedTextBox>("Widget");
|
||||||
|
MyGUI::FactoryManager::getInstance().registerFactory<Gui::AutoSizedEditBox>("Widget");
|
||||||
|
MyGUI::FactoryManager::getInstance().registerFactory<Gui::AutoSizedButton>("Widget");
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourcePlugin::createTransparentBGTexture()
|
void ResourcePlugin::createTransparentBGTexture()
|
||||||
|
|
Loading…
Reference in a new issue