From 31ddb0a482c29aa64d62c4b75d8fbb5355a7fe4f Mon Sep 17 00:00:00 2001 From: Andrei Kortunov Date: Mon, 1 Apr 2019 21:47:12 +0400 Subject: [PATCH] Allow to calculate UI skin size based on texture resolution (feature #4968) --- CHANGELOG.md | 1 + apps/openmw/CMakeLists.txt | 2 +- apps/openmw/mwgui/bookwindow.cpp | 21 +- apps/openmw/mwgui/bookwindow.hpp | 3 +- apps/openmw/mwgui/itemwidget.cpp | 29 +- apps/openmw/mwgui/itemwidget.hpp | 2 + apps/openmw/mwgui/journalwindow.cpp | 17 +- apps/openmw/mwgui/journalwindow.hpp | 2 +- apps/openmw/mwgui/mainmenu.cpp | 11 +- apps/openmw/mwgui/resourceskin.cpp | 83 ++++++ apps/openmw/mwgui/resourceskin.hpp | 18 ++ apps/openmw/mwgui/scrollwindow.cpp | 18 +- apps/openmw/mwgui/scrollwindow.hpp | 2 +- apps/openmw/mwgui/windowbase.cpp | 29 ++ apps/openmw/mwgui/windowbase.hpp | 9 + apps/openmw/mwgui/windowmanagerimp.cpp | 24 +- files/mygui/openmw_box.skin.xml | 52 ++-- files/mygui/openmw_button.skin.xml | 52 ++-- files/mygui/openmw_hud_box.skin.xml | 16 +- files/mygui/openmw_hud_energybar.skin.xml | 54 ++-- files/mygui/openmw_journal.layout | 10 +- files/mygui/openmw_progress.skin.xml | 36 +-- files/mygui/openmw_windows.skin.xml | 333 +++++++++++----------- 23 files changed, 478 insertions(+), 346 deletions(-) create mode 100644 apps/openmw/mwgui/resourceskin.cpp create mode 100644 apps/openmw/mwgui/resourceskin.hpp diff --git a/CHANGELOG.md b/CHANGELOG.md index 77d3b9c35..effd3f7c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -72,6 +72,7 @@ Feature #4887: Add openmw command option to set initial random seed Feature #4890: Make Distant Terrain configurable Feature #4962: Add casting animations for magic items + Feature #4968: Scalable UI widget skins Task #4686: Upgrade media decoder to a more current FFmpeg API Task #4695: Optimize Distant Terrain memory consumption diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 554a3ac86..7bce1ce40 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -32,7 +32,7 @@ add_openmw_dir (mwinput add_openmw_dir (mwgui layout textinput widgets race class birth review windowmanagerimp console dialogue windowbase statswindow messagebox journalwindow charactercreation - mapwindow windowpinnablebase tooltips scrollwindow bookwindow + mapwindow windowpinnablebase tooltips scrollwindow bookwindow resourceskin formatting inventorywindow container hud countdialog tradewindow settingswindow confirmationdialog alchemywindow referenceinterface spellwindow mainmenu quickkeysmenu itemselection spellbuyingwindow loadingscreen levelupdialog waitdialog spellcreationdialog diff --git a/apps/openmw/mwgui/bookwindow.cpp b/apps/openmw/mwgui/bookwindow.cpp index c18548dad..86089051d 100644 --- a/apps/openmw/mwgui/bookwindow.cpp +++ b/apps/openmw/mwgui/bookwindow.cpp @@ -20,7 +20,7 @@ namespace MWGui { BookWindow::BookWindow () - : WindowBase("openmw_book.layout") + : BookWindowBase("openmw_book.layout") , mCurrentPage(0) , mTakeButtonShow(true) , mTakeButtonAllowed(true) @@ -43,10 +43,10 @@ namespace MWGui getWidget(mLeftPage, "LeftPage"); getWidget(mRightPage, "RightPage"); - adjustButton(mCloseButton); - adjustButton(mTakeButton); - adjustButton(mNextPageButton); - adjustButton(mPrevPageButton); + adjustButton("CloseButton"); + adjustButton("TakeButton"); + adjustButton("PrevPageBTN"); + float scale = adjustButton("NextPageBTN"); mLeftPage->setNeedMouseFocus(true); mLeftPage->eventMouseWheel += MyGUI::newDelegate(this, &BookWindow::onMouseWheel); @@ -62,7 +62,7 @@ namespace MWGui { // english button has a 7 pixel wide strip of garbage on its right edge mNextPageButton->setSize(64-7, mNextPageButton->getSize().height); - mNextPageButton->setImageCoord(MyGUI::IntCoord(0,0,64-7,mNextPageButton->getSize().height)); + mNextPageButton->setImageCoord(MyGUI::IntCoord(0,0,(64-7)*scale,mNextPageButton->getSize().height*scale)); } center(); @@ -187,15 +187,6 @@ namespace MWGui } } - void BookWindow::adjustButton (Gui::ImageButton* button) - { - MyGUI::IntSize diff = button->getSize() - button->getRequestedSize(); - button->setSize(button->getRequestedSize()); - - if (button->getAlign().isRight()) - button->setPosition(button->getPosition() + MyGUI::IntPoint(diff.width,0)); - } - void BookWindow::nextPage() { if ((mCurrentPage+1)*2 < mPages.size()) diff --git a/apps/openmw/mwgui/bookwindow.hpp b/apps/openmw/mwgui/bookwindow.hpp index 2459c3464..b0dfe09ce 100644 --- a/apps/openmw/mwgui/bookwindow.hpp +++ b/apps/openmw/mwgui/bookwindow.hpp @@ -9,7 +9,7 @@ namespace MWGui { - class BookWindow : public WindowBase + class BookWindow : public BookWindowBase { public: BookWindow(); @@ -34,7 +34,6 @@ namespace MWGui void updatePages(); void clearPages(); - void adjustButton(Gui::ImageButton* button); private: typedef std::pair Page; diff --git a/apps/openmw/mwgui/itemwidget.cpp b/apps/openmw/mwgui/itemwidget.cpp index 5ab69e722..193379570 100644 --- a/apps/openmw/mwgui/itemwidget.cpp +++ b/apps/openmw/mwgui/itemwidget.cpp @@ -2,6 +2,7 @@ #include #include +#include #include // correctIconPath @@ -30,6 +31,7 @@ namespace namespace MWGui { + std::map ItemWidget::mScales; ItemWidget::ItemWidget() : mItem(nullptr) @@ -146,10 +148,29 @@ namespace MWGui if (backgroundTex != "") backgroundTex += ".dds"; - if (state == Barter && !isMagic) - setFrame(backgroundTex, MyGUI::IntCoord(2,2,42,42)); - else - setFrame(backgroundTex, MyGUI::IntCoord(0,0,42,42)); + if (!backgroundTex.empty()) + { + float scale = 1.f; + auto found = mScales.find(backgroundTex); + if (found == mScales.end()) + { + // By default, background icons are supposed to use the 42x42 part of 64x64 image. + // If the image has a different size, we should use a different chunk size + // Cache result to do not retrieve background texture every frame. + MyGUI::ITexture* texture = MyGUI::RenderManager::getInstance().getTexture(backgroundTex); + if (texture) + scale = texture->getHeight() / 64.f; + + mScales[backgroundTex] = scale; + } + else + scale = found->second; + + if (state == Barter && !isMagic) + setFrame(backgroundTex, MyGUI::IntCoord(2*scale,2*scale,44*scale,44*scale)); + else + setFrame(backgroundTex, MyGUI::IntCoord(0,0,44*scale,44*scale)); + } setIcon(ptr); } diff --git a/apps/openmw/mwgui/itemwidget.hpp b/apps/openmw/mwgui/itemwidget.hpp index e9b9ba1d5..0cb22c7f7 100644 --- a/apps/openmw/mwgui/itemwidget.hpp +++ b/apps/openmw/mwgui/itemwidget.hpp @@ -50,6 +50,8 @@ namespace MWGui std::string mCurrentIcon; std::string mCurrentFrame; + + static std::map mScales; }; class SpellWidget : public ItemWidget diff --git a/apps/openmw/mwgui/journalwindow.cpp b/apps/openmw/mwgui/journalwindow.cpp index 095d74e8a..43e7edf1e 100644 --- a/apps/openmw/mwgui/journalwindow.cpp +++ b/apps/openmw/mwgui/journalwindow.cpp @@ -153,7 +153,7 @@ namespace } adjustButton(PrevPageBTN); - adjustButton(NextPageBTN); + float nextButtonScale = adjustButton(NextPageBTN); adjustButton(CloseBTN); adjustButton(CancelBTN); adjustButton(JournalBTN); @@ -168,7 +168,7 @@ namespace { // english button has a 7 pixel wide strip of garbage on its right edge nextButton->setSize(64-7, nextButton->getSize().height); - nextButton->setImageCoord(MyGUI::IntCoord(0,0,64-7,nextButton->getSize().height)); + nextButton->setImageCoord(MyGUI::IntCoord(0,0,(64-7)*nextButtonScale,nextButton->getSize().height*nextButtonScale)); } if (!questList) @@ -226,17 +226,6 @@ namespace mTopicsMode = false; } - void adjustButton (char const * name) - { - Gui::ImageButton* button = getWidget(name); - - MyGUI::IntSize diff = button->getSize() - button->getRequestedSize(); - button->setSize(button->getRequestedSize()); - - if (button->getAlign().isRight()) - button->setPosition(button->getPosition() + MyGUI::IntPoint(diff.width,0)); - } - void onOpen() { if (!MWBase::Environment::get().getWindowManager ()->getJournalAllowed ()) @@ -665,7 +654,7 @@ MWGui::JournalWindow * MWGui::JournalWindow::create (JournalViewModel::Ptr Model } MWGui::JournalWindow::JournalWindow() - :WindowBase("openmw_journal.layout") + : BookWindowBase("openmw_journal.layout") { } diff --git a/apps/openmw/mwgui/journalwindow.hpp b/apps/openmw/mwgui/journalwindow.hpp index 62080f72e..8cc0a5ef3 100644 --- a/apps/openmw/mwgui/journalwindow.hpp +++ b/apps/openmw/mwgui/journalwindow.hpp @@ -13,7 +13,7 @@ namespace MWGui { struct JournalViewModel; - struct JournalWindow : public WindowBase + struct JournalWindow : public BookWindowBase { JournalWindow(); diff --git a/apps/openmw/mwgui/mainmenu.cpp b/apps/openmw/mwgui/mainmenu.cpp index 2c2bd84df..4778ee7b0 100644 --- a/apps/openmw/mwgui/mainmenu.cpp +++ b/apps/openmw/mwgui/mainmenu.cpp @@ -285,15 +285,18 @@ namespace MWGui Gui::ImageButton* button = mButtons[buttonId]; button->setVisible(true); + // By default, assume that all menu buttons textures should have 64 height. + // If they have a different resolution, scale them. MyGUI::IntSize requested = button->getRequestedSize(); + float scale = requested.height / 64.f; button->setImageCoord(MyGUI::IntCoord(0, 0, requested.width, requested.height)); // Trim off some of the excessive padding // TODO: perhaps do this within ImageButton? - int height = requested.height-16; - button->setImageTile(MyGUI::IntSize(requested.width, height)); - button->setCoord((maxwidth-requested.width) / 2, curH, requested.width, height); - curH += height; + int height = requested.height; + button->setImageTile(MyGUI::IntSize(requested.width, requested.height-16*scale)); + button->setCoord((maxwidth-requested.width/scale) / 2, curH, requested.width/scale, height/scale-16); + curH += height/scale-16; } if (state == MWBase::StateManager::State_NoGame) diff --git a/apps/openmw/mwgui/resourceskin.cpp b/apps/openmw/mwgui/resourceskin.cpp new file mode 100644 index 000000000..21ca2de54 --- /dev/null +++ b/apps/openmw/mwgui/resourceskin.cpp @@ -0,0 +1,83 @@ +#include "resourceskin.hpp" + +#include + +#include + +namespace MWGui +{ + void resizeSkin(MyGUI::xml::ElementPtr _node) + { + _node->setAttribute("type", "ResourceSkin"); + const std::string size = _node->findAttribute("size"); + if (!size.empty()) + return; + + const std::string textureName = _node->findAttribute("texture"); + if (textureName.empty()) + return; + + MyGUI::ITexture* texture = MyGUI::RenderManager::getInstance().getTexture(textureName); + if (!texture) + return; + + MyGUI::IntCoord coord(0, 0, texture->getWidth(), texture->getHeight()); + MyGUI::xml::ElementEnumerator basis = _node->getElementEnumerator(); + const std::string textureSize = std::to_string(coord.width) + " " + std::to_string(coord.height); + _node->addAttribute("size", textureSize); + while (basis.next()) + { + if (basis->getName() != "BasisSkin") + continue; + + const std::string basisSkinType = basis->findAttribute("type"); + if (Misc::StringUtils::ciEqual(basisSkinType, "SimpleText")) + continue; + + const std::string offset = basis->findAttribute("offset"); + if (!offset.empty()) + continue; + + basis->addAttribute("offset", coord); + + MyGUI::xml::ElementEnumerator state = basis->getElementEnumerator(); + while (state.next()) + { + if (state->getName() == "State") + { + const std::string stateOffset = state->findAttribute("offset"); + if (!stateOffset.empty()) + continue; + + state->addAttribute("offset", coord); + if (Misc::StringUtils::ciEqual(basisSkinType, "TileRect")) + { + MyGUI::xml::ElementEnumerator property = state->getElementEnumerator(); + bool hasTileSize = false; + while (property.next("Property")) + { + const std::string key = property->findAttribute("key"); + if (key != "TileSize") + continue; + + hasTileSize = true; + } + + if (!hasTileSize) + { + MyGUI::xml::ElementPtr tileSizeProperty = state->createChild("Property"); + tileSizeProperty->addAttribute("key", "TileSize"); + tileSizeProperty->addAttribute("value", textureSize); + } + } + } + } + } + } + + void AutoSizedResourceSkin::deserialization(MyGUI::xml::ElementPtr _node, MyGUI::Version _version) + { + resizeSkin(_node); + Base::deserialization(_node, _version); + } +} diff --git a/apps/openmw/mwgui/resourceskin.hpp b/apps/openmw/mwgui/resourceskin.hpp new file mode 100644 index 000000000..5a1f05c05 --- /dev/null +++ b/apps/openmw/mwgui/resourceskin.hpp @@ -0,0 +1,18 @@ +#ifndef MWGUI_RESOURCESKIN_H +#define MWGUI_RESOURCESKIN_H + +#include + +namespace MWGui +{ + class AutoSizedResourceSkin : public MyGUI::ResourceSkin + { + MYGUI_RTTI_DERIVED( AutoSizedResourceSkin ) + + public: + virtual void deserialization(MyGUI::xml::ElementPtr _node, MyGUI::Version _version); + }; + +} + +#endif diff --git a/apps/openmw/mwgui/scrollwindow.cpp b/apps/openmw/mwgui/scrollwindow.cpp index ea811f5b1..f2c967da4 100644 --- a/apps/openmw/mwgui/scrollwindow.cpp +++ b/apps/openmw/mwgui/scrollwindow.cpp @@ -16,23 +16,11 @@ #include "formatting.hpp" -namespace -{ - void adjustButton (Gui::ImageButton* button) - { - MyGUI::IntSize diff = button->getSize() - button->getRequestedSize(); - button->setSize(button->getRequestedSize()); - - if (button->getAlign().isRight()) - button->setPosition(button->getPosition() + MyGUI::IntPoint(diff.width,0)); - } -} - namespace MWGui { ScrollWindow::ScrollWindow () - : WindowBase("openmw_scroll.layout") + : BookWindowBase("openmw_scroll.layout") , mTakeButtonShow(true) , mTakeButtonAllowed(true) { @@ -44,8 +32,8 @@ namespace MWGui getWidget(mTakeButton, "TakeButton"); mTakeButton->eventMouseButtonClick += MyGUI::newDelegate(this, &ScrollWindow::onTakeButtonClicked); - adjustButton(mCloseButton); - adjustButton(mTakeButton); + adjustButton("CloseButton"); + adjustButton("TakeButton"); mCloseButton->eventKeyButtonPressed += MyGUI::newDelegate(this, &ScrollWindow::onKeyButtonPressed); mTakeButton->eventKeyButtonPressed += MyGUI::newDelegate(this, &ScrollWindow::onKeyButtonPressed); diff --git a/apps/openmw/mwgui/scrollwindow.hpp b/apps/openmw/mwgui/scrollwindow.hpp index adc0bd93e..7f2a7a281 100644 --- a/apps/openmw/mwgui/scrollwindow.hpp +++ b/apps/openmw/mwgui/scrollwindow.hpp @@ -12,7 +12,7 @@ namespace Gui namespace MWGui { - class ScrollWindow : public WindowBase + class ScrollWindow : public BookWindowBase { public: ScrollWindow (); diff --git a/apps/openmw/mwgui/windowbase.cpp b/apps/openmw/mwgui/windowbase.cpp index 727493892..d483a0b4b 100644 --- a/apps/openmw/mwgui/windowbase.cpp +++ b/apps/openmw/mwgui/windowbase.cpp @@ -6,6 +6,8 @@ #include "../mwbase/windowmanager.hpp" #include "../mwbase/environment.hpp" +#include + #include "draganddrop.hpp" using namespace MWGui; @@ -120,3 +122,30 @@ void NoDrop::setAlpha(float alpha) if (mWidget) mWidget->setAlpha(alpha); } + +BookWindowBase::BookWindowBase(const std::string& parLayout) + : WindowBase(parLayout) +{ +} + +float BookWindowBase::adjustButton (char const * name) +{ + Gui::ImageButton* button; + WindowBase::getWidget (button, name); + MyGUI::IntSize requested = button->getRequestedSize(); + float scale = requested.height / button->getSize().height; + MyGUI::IntSize newSize = requested; + newSize.width /= scale; + newSize.height /= scale; + button->setSize(newSize); + + if (button->getAlign().isRight()) + { + MyGUI::IntSize diff = (button->getSize() - requested); + diff.width /= scale; + diff.height /= scale; + button->setPosition(button->getPosition() + MyGUI::IntPoint(diff.width,0)); + } + + return scale; +} diff --git a/apps/openmw/mwgui/windowbase.hpp b/apps/openmw/mwgui/windowbase.hpp index 7d8fb2f1e..8e7fb86b4 100644 --- a/apps/openmw/mwgui/windowbase.hpp +++ b/apps/openmw/mwgui/windowbase.hpp @@ -82,6 +82,15 @@ namespace MWGui DragAndDrop* mDrag; bool mTransparent; }; + + class BookWindowBase : public WindowBase + { + public: + BookWindowBase(const std::string& parLayout); + + protected: + float adjustButton (char const * name); + }; } #endif diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index ebbd8bf97..79762166b 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -13,7 +13,6 @@ #include #include #include -#include #include #include @@ -112,6 +111,7 @@ #include "jailscreen.hpp" #include "itemchargeview.hpp" #include "keyboardnavigation.hpp" +#include "resourceskin.hpp" namespace { @@ -240,6 +240,7 @@ namespace MWGui MyGUI::FactoryManager::getInstance().registerFactory("Controller"); MyGUI::FactoryManager::getInstance().registerFactory("Resource", "ResourceImageSetPointer"); + MyGUI::FactoryManager::getInstance().registerFactory("Resource", "AutoSizedResourceSkin"); MyGUI::ResourceManager::getInstance().load("core.xml"); loadUserFonts(); @@ -290,14 +291,13 @@ namespace MWGui void WindowManager::loadFontDelegate(MyGUI::xml::ElementPtr _node, const std::string& _file, MyGUI::Version _version) { - const std::string templateName = "Journalbook "; - MyGUI::xml::ElementEnumerator font = _node->getElementEnumerator(); + MyGUI::xml::ElementEnumerator resourceNode = _node->getElementEnumerator(); bool createCopy = false; - while (font.next("Resource")) + while (resourceNode.next("Resource")) { std::string type, name; - font->findAttribute("type", type); - font->findAttribute("name", name); + resourceNode->findAttribute("type", type); + resourceNode->findAttribute("name", name); if (name.empty()) continue; @@ -315,18 +315,19 @@ namespace MWGui float uiScale = Settings::Manager::getFloat("scaling factor", "GUI"); resolution *= uiScale; - MyGUI::xml::ElementPtr resolutionNode = font->createChild("Property"); + MyGUI::xml::ElementPtr resolutionNode = resourceNode->createChild("Property"); resolutionNode->addAttribute("key", "Resolution"); resolutionNode->addAttribute("value", std::to_string(resolution)); - MyGUI::xml::ElementPtr sizeNode = font->createChild("Property"); + MyGUI::xml::ElementPtr sizeNode = resourceNode->createChild("Property"); sizeNode->addAttribute("key", "Size"); sizeNode->addAttribute("value", std::to_string(mFontHeight)); } - else if (Misc::StringUtils::ciEqual(type, "ResourceSkin")) + else if (Misc::StringUtils::ciEqual(type, "ResourceSkin") || + Misc::StringUtils::ciEqual(type, "AutoSizedResourceSkin")) { // We should adjust line height for MyGUI widgets depending on font size - MyGUI::xml::ElementPtr heightNode = font->createChild("Property"); + MyGUI::xml::ElementPtr heightNode = resourceNode->createChild("Property"); heightNode->addAttribute("key", "HeightLine"); heightNode->addAttribute("value", std::to_string(mFontHeight+2)); } @@ -2087,6 +2088,9 @@ namespace MWGui void WindowManager::createCursors() { + // FIXME: currently we do not scale cursor since it is not a MyGUI widget. + // In theory, we can do it manually (rescale the cursor image via osg::Imag::scaleImage() and scale the hotspot position). + // Unfortunately, this apploach can lead to driver crashes on some setups (e.g. on laptops with nvidia-prime on Linux). MyGUI::ResourceManager::EnumeratorPtr enumerator = MyGUI::ResourceManager::getInstance().getEnumerator(); while (enumerator.next()) { diff --git a/files/mygui/openmw_box.skin.xml b/files/mygui/openmw_box.skin.xml index 8ff21807d..ed14e7485 100644 --- a/files/mygui/openmw_box.skin.xml +++ b/files/mygui/openmw_box.skin.xml @@ -5,60 +5,56 @@ as around the sections of the stats window, or around popup info windows --> - - - - + + + - - - - + + + - - - - + + + - - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + diff --git a/files/mygui/openmw_button.skin.xml b/files/mygui/openmw_button.skin.xml index ac9bf042d..b3defd373 100644 --- a/files/mygui/openmw_button.skin.xml +++ b/files/mygui/openmw_button.skin.xml @@ -2,68 +2,64 @@ - + - - - + + - + - - - + + - + - - - + + - + - - - + + - + - - + + - + - - + + - + - - + + - + - - + + diff --git a/files/mygui/openmw_hud_box.skin.xml b/files/mygui/openmw_hud_box.skin.xml index a1c4f608b..14c2eece7 100644 --- a/files/mygui/openmw_hud_box.skin.xml +++ b/files/mygui/openmw_hud_box.skin.xml @@ -55,19 +55,19 @@ - + - - - + + + - + - + - - + + diff --git a/files/mygui/openmw_hud_energybar.skin.xml b/files/mygui/openmw_hud_energybar.skin.xml index 2b41b5ea9..c3a574a47 100644 --- a/files/mygui/openmw_hud_energybar.skin.xml +++ b/files/mygui/openmw_hud_energybar.skin.xml @@ -2,60 +2,60 @@ - - - + + + - - - + + + - - - + + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + diff --git a/files/mygui/openmw_journal.layout b/files/mygui/openmw_journal.layout index 5d6e29066..cf81e22e4 100644 --- a/files/mygui/openmw_journal.layout +++ b/files/mygui/openmw_journal.layout @@ -57,13 +57,13 @@ - + - - - - + + + + diff --git a/files/mygui/openmw_progress.skin.xml b/files/mygui/openmw_progress.skin.xml index 324307d67..3e2d3916e 100644 --- a/files/mygui/openmw_progress.skin.xml +++ b/files/mygui/openmw_progress.skin.xml @@ -2,41 +2,41 @@ - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + diff --git a/files/mygui/openmw_windows.skin.xml b/files/mygui/openmw_windows.skin.xml index ef618b316..426d6dc06 100644 --- a/files/mygui/openmw_windows.skin.xml +++ b/files/mygui/openmw_windows.skin.xml @@ -17,115 +17,128 @@ - + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + + + + + + + - + + + + + + + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - - - + + + + @@ -135,10 +148,11 @@ - - - + + + + @@ -173,40 +187,36 @@ - - - - + + + - - - - + + + - - - - + + + - - - - + + + @@ -214,67 +224,63 @@ - - - + + + - + - - + + - - - + + + - - - + + + - + - - - + + - + - - - + + - + - - - + + - + - - - + + @@ -282,149 +288,146 @@ - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - - - - + + + - - - - + + + - - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + +