From d7aa2a882d6e5bc84c01265fd64e35384583a668 Mon Sep 17 00:00:00 2001 From: Julian Date: Mon, 24 Jul 2017 13:25:01 +0200 Subject: [PATCH] improve dialogue window performance --- apps/openmw/mwbase/windowmanager.hpp | 4 ++ apps/openmw/mwgui/bookpage.cpp | 17 +++++---- apps/openmw/mwgui/bookpage.hpp | 8 +++- apps/openmw/mwgui/dialogue.cpp | 51 ++++++++++++-------------- apps/openmw/mwgui/dialogue.hpp | 2 + apps/openmw/mwgui/journalbooks.cpp | 28 +++++++------- apps/openmw/mwgui/textcolours.hpp | 35 ++++++++++++++++++ apps/openmw/mwgui/windowmanagerimp.cpp | 36 ++++++++++++++++++ apps/openmw/mwgui/windowmanagerimp.hpp | 5 +++ 9 files changed, 134 insertions(+), 52 deletions(-) create mode 100644 apps/openmw/mwgui/textcolours.hpp diff --git a/apps/openmw/mwbase/windowmanager.hpp b/apps/openmw/mwbase/windowmanager.hpp index dd0e3321c..416a7ad87 100644 --- a/apps/openmw/mwbase/windowmanager.hpp +++ b/apps/openmw/mwbase/windowmanager.hpp @@ -72,6 +72,8 @@ namespace MWGui ShowInDialogueMode_Only, ShowInDialogueMode_Never }; + + struct TextColours; } namespace SFO @@ -361,6 +363,8 @@ namespace MWBase virtual void removeCell(MWWorld::CellStore* cell) = 0; virtual void writeFog(MWWorld::CellStore* cell) = 0; + + virtual const MWGui::TextColours& getTextColours() = 0; }; } diff --git a/apps/openmw/mwgui/bookpage.cpp b/apps/openmw/mwgui/bookpage.cpp index 5def91eb8..20d3448b5 100644 --- a/apps/openmw/mwgui/bookpage.cpp +++ b/apps/openmw/mwgui/bookpage.cpp @@ -35,22 +35,22 @@ struct TypesetBookImpl : TypesetBook MyGUI::Colour mNormalColour; InteractiveId mInteractiveId; - bool match (MyGUI::IFont* tstFont, MyGUI::Colour tstHotColour, MyGUI::Colour tstActiveColour, - MyGUI::Colour tstNormalColour, intptr_t tstInteractiveId) + bool match (MyGUI::IFont* tstFont, const MyGUI::Colour& tstHotColour, const MyGUI::Colour& tstActiveColour, + const MyGUI::Colour& tstNormalColour, intptr_t tstInteractiveId) { return (mFont == tstFont) && partal_match (tstHotColour, tstActiveColour, tstNormalColour, tstInteractiveId); } - bool match (char const * tstFont, MyGUI::Colour tstHotColour, MyGUI::Colour tstActiveColour, - MyGUI::Colour tstNormalColour, intptr_t tstInteractiveId) + bool match (char const * tstFont, const MyGUI::Colour& tstHotColour, const MyGUI::Colour& tstActiveColour, + const MyGUI::Colour& tstNormalColour, intptr_t tstInteractiveId) { return (mFont->getResourceName () == tstFont) && partal_match (tstHotColour, tstActiveColour, tstNormalColour, tstInteractiveId); } - bool partal_match (MyGUI::Colour tstHotColour, MyGUI::Colour tstActiveColour, - MyGUI::Colour tstNormalColour, intptr_t tstInteractiveId) + bool partal_match (const MyGUI::Colour& tstHotColour, const MyGUI::Colour& tstActiveColour, + const MyGUI::Colour& tstNormalColour, intptr_t tstInteractiveId) { return (mHotColour == tstHotColour ) && @@ -261,7 +261,7 @@ struct TypesetBookImpl::Typesetter : BookTypesetter { } - Style * createStyle (char const * fontName, Colour fontColour) + Style * createStyle (char const * fontName, const Colour& fontColour) { if (strcmp(fontName, "") == 0) return createStyle(MyGUI::FontManager::getInstance().getDefaultFont().c_str(), fontColour); @@ -284,7 +284,8 @@ struct TypesetBookImpl::Typesetter : BookTypesetter return &style; } - Style* createHotStyle (Style* baseStyle, Colour normalColour, Colour hoverColour, Colour activeColour, InteractiveId id, bool unique) + Style* createHotStyle (Style* baseStyle, const Colour& normalColour, const Colour& hoverColour, + const Colour& activeColour, InteractiveId id, bool unique) { StyleImpl* BaseStyle = static_cast (baseStyle); diff --git a/apps/openmw/mwgui/bookpage.hpp b/apps/openmw/mwgui/bookpage.hpp index e75e1e1d3..66d1834c7 100644 --- a/apps/openmw/mwgui/bookpage.hpp +++ b/apps/openmw/mwgui/bookpage.hpp @@ -37,6 +37,9 @@ namespace MWGui typedef uint8_t const * Utf8Point; typedef std::pair Utf8Span; + + + enum Alignment { AlignLeft = -1, AlignCenter = 0, @@ -53,12 +56,13 @@ namespace MWGui static Ptr create (int pageWidth, int pageHeight); /// Create a simple text style consisting of a font and a text color. - virtual Style* createStyle (char const * Font, Colour Colour) = 0; + virtual Style* createStyle (char const * Font, const Colour& Colour) = 0; /// Create a hyper-link style with a user-defined identifier based on an /// existing style. The unique flag forces a new instance of this style /// to be created even if an existing instance is present. - virtual Style* createHotStyle (Style * BaseStyle, Colour NormalColour, Colour HoverColour, Colour ActiveColour, InteractiveId Id, bool Unique = true) = 0; + virtual Style* createHotStyle (Style * BaseStyle, const Colour& NormalColour, const Colour& HoverColour, + const Colour& ActiveColour, InteractiveId Id, bool Unique = true) = 0; /// Insert a line break into the document. Newline characters in the input /// text have the same affect. The margin parameter adds additional space diff --git a/apps/openmw/mwgui/dialogue.cpp b/apps/openmw/mwgui/dialogue.cpp index 9e20ae71f..f478dad7e 100644 --- a/apps/openmw/mwgui/dialogue.cpp +++ b/apps/openmw/mwgui/dialogue.cpp @@ -22,19 +22,10 @@ #include "widgets.hpp" #include "bookpage.hpp" +#include "textcolours.hpp" #include "journalbooks.hpp" // to_utf8_span -namespace -{ - - MyGUI::Colour getDialogueTextColour (const std::string& type) - { - return MyGUI::Colour::parse(MyGUI::LanguageManager::getInstance().replaceTags("#{fontcolour=" + type + "}")); - } - -} - namespace MWGui { @@ -116,7 +107,8 @@ namespace MWGui if (mTitle != "") { - BookTypesetter::Style* title = typesetter->createStyle("", getDialogueTextColour("header")); + const MyGUI::Colour& headerColour = MWBase::Environment::get().getWindowManager()->getTextColours().header; + BookTypesetter::Style* title = typesetter->createStyle("", headerColour); typesetter->write(title, to_utf8_span(mTitle.c_str())); typesetter->sectionBreak(); } @@ -159,15 +151,16 @@ namespace MWGui if (hyperLinks.size() && MWBase::Environment::get().getWindowManager()->getTranslationDataStorage().hasTranslation()) { - BookTypesetter::Style* style = typesetter->createStyle("", getDialogueTextColour("normal")); + const TextColours& textColours = MWBase::Environment::get().getWindowManager()->getTextColours(); + + BookTypesetter::Style* style = typesetter->createStyle("", textColours.normal); size_t formatted = 0; // points to the first character that is not laid out yet for (std::map::iterator it = hyperLinks.begin(); it != hyperLinks.end(); ++it) { intptr_t topicId = it->second; - const MyGUI::Colour linkHot(getDialogueTextColour("link_over")); - const MyGUI::Colour linkNormal(getDialogueTextColour("link")); - const MyGUI::Colour linkActive(getDialogueTextColour("link_pressed")); - BookTypesetter::Style* hotStyle = typesetter->createHotStyle (style, linkNormal, linkHot, linkActive, topicId); + BookTypesetter::Style* hotStyle = typesetter->createHotStyle (style, textColours.link, + textColours.linkOver, textColours.linkPressed, + topicId); if (formatted < it->first.first) typesetter->write(style, formatted, it->first.first); typesetter->write(hotStyle, it->first.first, it->first.second); @@ -199,14 +192,13 @@ namespace MWGui void Response::addTopicLink(BookTypesetter::Ptr typesetter, intptr_t topicId, size_t begin, size_t end) const { - BookTypesetter::Style* style = typesetter->createStyle("", getDialogueTextColour("normal")); + const TextColours& textColours = MWBase::Environment::get().getWindowManager()->getTextColours(); + + BookTypesetter::Style* style = typesetter->createStyle("", textColours.normal); - const MyGUI::Colour linkHot(getDialogueTextColour("link_over")); - const MyGUI::Colour linkNormal(getDialogueTextColour("link")); - const MyGUI::Colour linkActive(getDialogueTextColour("link_pressed")); if (topicId) - style = typesetter->createHotStyle (style, linkNormal, linkHot, linkActive, topicId); + style = typesetter->createHotStyle (style, textColours.link, textColours.linkOver, textColours.linkPressed, topicId); typesetter->write (style, begin, end); } @@ -217,7 +209,8 @@ namespace MWGui void Message::write(BookTypesetter::Ptr typesetter, KeywordSearchT* keywordSearch, std::map& topicLinks) const { - BookTypesetter::Style* title = typesetter->createStyle("", getDialogueTextColour("notify")); + const MyGUI::Colour& textColour = MWBase::Environment::get().getWindowManager()->getTextColours().notify; + BookTypesetter::Style* title = typesetter->createStyle("", textColour); typesetter->sectionBreak(9); typesetter->write(title, to_utf8_span(mText.c_str())); } @@ -300,8 +293,12 @@ namespace MWGui void DialogueWindow::onWindowResize(MyGUI::Window* _sender) { + // if the window has only been moved, not resized, we don't need to update + if (mCurrentWindowSize == _sender->getSize()) return; + mTopicsList->adjustSize(); updateHistory(); + mCurrentWindowSize = _sender->getSize(); } void DialogueWindow::onMouseWheel(MyGUI::Widget* _sender, int _rel) @@ -486,16 +483,15 @@ namespace MWGui typesetter->sectionBreak(9); // choices - const MyGUI::Colour linkHot(getDialogueTextColour("answer_over")); - const MyGUI::Colour linkNormal(getDialogueTextColour("answer")); - const MyGUI::Colour linkActive(getDialogueTextColour("answer_pressed")); + const TextColours& textColours = MWBase::Environment::get().getWindowManager()->getTextColours(); for (std::vector >::iterator it = mChoices.begin(); it != mChoices.end(); ++it) { Choice* link = new Choice(it->second); mLinks.push_back(link); typesetter->lineBreak(); - BookTypesetter::Style* questionStyle = typesetter->createHotStyle(body, linkNormal, linkHot, linkActive, + BookTypesetter::Style* questionStyle = typesetter->createHotStyle(body, textColours.answer, textColours.answerOver, + textColours.answerPressed, TypesetBook::InteractiveId(link)); typesetter->write(questionStyle, to_utf8_span(it->first.c_str())); } @@ -505,7 +501,8 @@ namespace MWGui Goodbye* link = new Goodbye(); mLinks.push_back(link); std::string goodbye = MWBase::Environment::get().getWorld()->getStore().get().find("sGoodbye")->getString(); - BookTypesetter::Style* questionStyle = typesetter->createHotStyle(body, linkNormal, linkHot, linkActive, + BookTypesetter::Style* questionStyle = typesetter->createHotStyle(body, textColours.answer, textColours.answerOver, + textColours.answerPressed, TypesetBook::InteractiveId(link)); typesetter->lineBreak(); typesetter->write(questionStyle, to_utf8_span(goodbye.c_str())); diff --git a/apps/openmw/mwgui/dialogue.hpp b/apps/openmw/mwgui/dialogue.hpp index e1e427b3f..5b5ae5b68 100644 --- a/apps/openmw/mwgui/dialogue.hpp +++ b/apps/openmw/mwgui/dialogue.hpp @@ -171,6 +171,8 @@ namespace MWGui MyGUI::TextBox* mDispositionText; PersuasionDialog mPersuasionDialog; + + MyGUI::IntSize mCurrentWindowSize; }; } #endif diff --git a/apps/openmw/mwgui/journalbooks.cpp b/apps/openmw/mwgui/journalbooks.cpp index f84fb517b..5634eb080 100644 --- a/apps/openmw/mwgui/journalbooks.cpp +++ b/apps/openmw/mwgui/journalbooks.cpp @@ -2,13 +2,14 @@ #include +#include "../mwbase/environment.hpp" +#include "../mwbase/windowmanager.hpp" + +#include "textcolours.hpp" + + namespace { - MyGUI::Colour getTextColour (const std::string& type) - { - return MyGUI::Colour::parse(MyGUI::LanguageManager::getInstance().replaceTags("#{fontcolour=" + type + "}")); - } - struct AddContent { MWGui::BookTypesetter::Ptr mTypesetter; @@ -31,12 +32,10 @@ namespace { MWGui::BookTypesetter::Style* style = mBodyStyle; - static const MyGUI::Colour linkHot (getTextColour("journal_link_over")); - static const MyGUI::Colour linkNormal (getTextColour("journal_link")); - static const MyGUI::Colour linkActive (getTextColour("journal_link_pressed")); - + const MWGui::TextColours& textColours = MWBase::Environment::get().getWindowManager()->getTextColours(); if (topicId) - style = mTypesetter->createHotStyle (mBodyStyle, linkNormal, linkHot, linkActive, topicId); + style = mTypesetter->createHotStyle (mBodyStyle, textColours.journalLink, textColours.journalLinkOver, + textColours.journalLinkPressed, topicId); mTypesetter->write (style, begin, end); } @@ -233,11 +232,10 @@ book JournalBooks::createTopicIndexBook () sprintf (buffer, "( %c )", ch); - MyGUI::Colour linkHot (getTextColour("journal_topic_over")); - MyGUI::Colour linkActive (getTextColour("journal_topic_pressed")); - MyGUI::Colour linkNormal (getTextColour("journal_topic")); - - BookTypesetter::Style* style = typesetter->createHotStyle (body, linkNormal, linkHot, linkActive, ch); + const MWGui::TextColours& textColours = MWBase::Environment::get().getWindowManager()->getTextColours(); + BookTypesetter::Style* style = typesetter->createHotStyle (body, textColours.journalTopic, + textColours.journalTopicOver, + textColours.journalTopicPressed, ch); if (i == 13) typesetter->sectionBreak (); diff --git a/apps/openmw/mwgui/textcolours.hpp b/apps/openmw/mwgui/textcolours.hpp new file mode 100644 index 000000000..3fa55654b --- /dev/null +++ b/apps/openmw/mwgui/textcolours.hpp @@ -0,0 +1,35 @@ +#ifndef MWGUI_TEXTCOLORS_H +#define MWGUI_TEXTCOLORS_H + +#include + +namespace MWGui +{ + + struct TextColours + { + MyGUI::Colour header; + MyGUI::Colour normal; + MyGUI::Colour notify; + + + MyGUI::Colour link; + MyGUI::Colour linkOver; + MyGUI::Colour linkPressed; + + MyGUI::Colour answer; + MyGUI::Colour answerOver; + MyGUI::Colour answerPressed; + + MyGUI::Colour journalLink; + MyGUI::Colour journalLinkOver; + MyGUI::Colour journalLinkPressed; + + MyGUI::Colour journalTopic; + MyGUI::Colour journalTopicOver; + MyGUI::Colour journalTopicPressed; + }; + +} + +#endif diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp index 0ca378fe7..516da3ab6 100644 --- a/apps/openmw/mwgui/windowmanagerimp.cpp +++ b/apps/openmw/mwgui/windowmanagerimp.cpp @@ -113,6 +113,16 @@ #include "jailscreen.hpp" #include "itemchargeview.hpp" +namespace +{ + + MyGUI::Colour getTextColour(const std::string& type) + { + return MyGUI::Colour::parse(MyGUI::LanguageManager::getInstance().replaceTags("#{fontcolour=" + type + "}")); + } + +} + namespace MWGui { @@ -283,6 +293,27 @@ namespace MWGui int w = MyGUI::RenderManager::getInstance().getViewSize().width; int h = MyGUI::RenderManager::getInstance().getViewSize().height; + mTextColours.header = getTextColour("header"); + mTextColours.normal = getTextColour("normal"); + mTextColours.notify = getTextColour("notify"); + + mTextColours.link = getTextColour("link"); + mTextColours.linkOver = getTextColour("link_over"); + mTextColours.linkPressed = getTextColour("link_pressed"); + + mTextColours.answer = getTextColour("answer"); + mTextColours.answerOver = getTextColour("answer_over"); + mTextColours.answerPressed = getTextColour("answer_pressed"); + + mTextColours.journalLink = getTextColour("journal_link"); + mTextColours.journalLinkOver = getTextColour("journal_link_over"); + mTextColours.journalLinkPressed = getTextColour("journal_link_pressed"); + + mTextColours.journalTopic = getTextColour("journal_topic"); + mTextColours.journalTopicOver = getTextColour("journal_topic_over"); + mTextColours.journalTopicPressed = getTextColour("journal_topic_pressed"); + + mDragAndDrop = new DragAndDrop(); mRecharge = new Recharge(); @@ -2138,4 +2169,9 @@ namespace MWGui mLocalMapRender->saveFogOfWar(cell); } + const MWGui::TextColours& WindowManager::getTextColours() + { + return mTextColours; + } + } diff --git a/apps/openmw/mwgui/windowmanagerimp.hpp b/apps/openmw/mwgui/windowmanagerimp.hpp index 0d17b7f4f..f74ba21a3 100644 --- a/apps/openmw/mwgui/windowmanagerimp.hpp +++ b/apps/openmw/mwgui/windowmanagerimp.hpp @@ -19,6 +19,7 @@ #include #include "mapwindow.hpp" +#include "textcolours.hpp" #include #include @@ -391,6 +392,8 @@ namespace MWGui void removeCell(MWWorld::CellStore* cell); void writeFog(MWWorld::CellStore* cell); + virtual const MWGui::TextColours& getTextColours(); + private: const MWWorld::ESMStore* mStore; Resource::ResourceSystem* mResourceSystem; @@ -514,6 +517,8 @@ namespace MWGui std::string mVersionDescription; + MWGui::TextColours mTextColours; + /** * Called when MyGUI tries to retrieve a tag's value. Tags must be denoted in #{tag} notation and will be replaced upon setting a user visible text/property. * Supported syntax: