diff --git a/client/lobby/CSelectionBase.cpp b/client/lobby/CSelectionBase.cpp index 35f3adf66..9afb617b5 100644 --- a/client/lobby/CSelectionBase.cpp +++ b/client/lobby/CSelectionBase.cpp @@ -173,34 +173,47 @@ InfoCard::InfoCard() labelGroupPlayersAssigned = std::make_shared(FONT_SMALL, TOPLEFT, Colors::WHITE); labelGroupPlayersUnassigned = std::make_shared(FONT_SMALL, TOPLEFT, Colors::WHITE); + disableLabelRedraws(); } setChat(false); } +void InfoCard::disableLabelRedraws() +{ + labelSaveDate->setAutoRedraw(false); + mapName->setAutoRedraw(false); + mapDescription->label->setAutoRedraw(false); + labelVictoryConditionText->setAutoRedraw(false); + labelLossConditionText->setAutoRedraw(false); + labelDifficulty->setAutoRedraw(false); + labelDifficultyPercent->setAutoRedraw(false); +} + void InfoCard::changeSelection() { - if(!SEL->getMapInfo()) + auto mapInfo = SEL->getMapInfo(); + if(!mapInfo) return; - labelSaveDate->setText(SEL->getMapInfo()->date); - mapName->setText(SEL->getMapInfo()->getName()); - mapDescription->setText(SEL->getMapInfo()->getDescription()); + labelSaveDate->setText(mapInfo->date); + mapName->setText(mapInfo->getName()); + mapDescription->setText(mapInfo->getDescription()); - mapDescription->label->scrollTextTo(0); + mapDescription->label->scrollTextTo(0, false); if(mapDescription->slider) mapDescription->slider->moveToMin(); if(SEL->screenType == ESelectionScreen::campaignList) return; - iconsMapSizes->setFrame(SEL->getMapInfo()->getMapSizeIconId()); - const CMapHeader * header = SEL->getMapInfo()->mapHeader.get(); + iconsMapSizes->setFrame(mapInfo->getMapSizeIconId()); + const CMapHeader * header = mapInfo->mapHeader.get(); iconsVictoryCondition->setFrame(header->victoryIconIndex); labelVictoryConditionText->setText(header->victoryMessage); iconsLossCondition->setFrame(header->defeatIconIndex); labelLossConditionText->setText(header->defeatMessage); flagbox->recreate(); - labelDifficulty->setText(CGI->generaltexth->arraytxt[142 + SEL->getMapInfo()->mapHeader->difficulty]); + labelDifficulty->setText(CGI->generaltexth->arraytxt[142 + mapInfo->mapHeader->difficulty]); iconDifficulty->setSelected(SEL->getCurrentDifficulty()); const std::array difficultyPercent = {"80%", "100%", "130%", "160%", "200%"}; labelDifficultyPercent->setText(difficultyPercent[SEL->getCurrentDifficulty()]); diff --git a/client/lobby/CSelectionBase.h b/client/lobby/CSelectionBase.h index 497960b9f..e157607fd 100644 --- a/client/lobby/CSelectionBase.h +++ b/client/lobby/CSelectionBase.h @@ -101,6 +101,7 @@ public: std::shared_ptr iconDifficulty; InfoCard(); + void disableLabelRedraws(); void changeSelection(); void toggleChat(); void setChat(bool activateChat); diff --git a/client/widgets/TextControls.cpp b/client/widgets/TextControls.cpp index 166543131..bb771f15f 100644 --- a/client/widgets/TextControls.cpp +++ b/client/widgets/TextControls.cpp @@ -102,13 +102,14 @@ CMultiLineLabel::CMultiLineLabel(Rect position, EFonts Font, EAlignment Align, c { pos.w = position.w; pos.h = position.h; - splitText(Text); + splitText(Text, true); } -void CMultiLineLabel::setVisibleSize(Rect visibleSize) +void CMultiLineLabel::setVisibleSize(Rect visibleSize, bool redrawElement) { this->visibleSize = visibleSize; - redraw(); + if(redrawElement) + redraw(); } void CMultiLineLabel::scrollTextBy(int distance) @@ -116,16 +117,16 @@ void CMultiLineLabel::scrollTextBy(int distance) scrollTextTo(visibleSize.y + distance); } -void CMultiLineLabel::scrollTextTo(int distance) +void CMultiLineLabel::scrollTextTo(int distance, bool redrawAfterScroll) { Rect size = visibleSize; size.y = distance; - setVisibleSize(size); + setVisibleSize(size, redrawAfterScroll); } void CMultiLineLabel::setText(const std::string &Txt) { - splitText(Txt); + splitText(Txt, false); //setText used below can handle redraw CLabel::setText(Txt); } @@ -221,7 +222,7 @@ void CMultiLineLabel::showAll(SDL_Surface * to) } } -void CMultiLineLabel::splitText(const std::string &Txt) +void CMultiLineLabel::splitText(const std::string &Txt, bool redrawAfter) { lines.clear(); @@ -234,7 +235,8 @@ void CMultiLineLabel::splitText(const std::string &Txt) textSize.x = 0; for(const std::string &line : lines) vstd::amax( textSize.x, f->getStringWidth(line.c_str())); - redraw(); + if(redrawAfter) + redraw(); } Rect CMultiLineLabel::getTextLocation() diff --git a/client/widgets/TextControls.h b/client/widgets/TextControls.h index f01a2d3b6..835b1f059 100644 --- a/client/widgets/TextControls.h +++ b/client/widgets/TextControls.h @@ -80,7 +80,7 @@ class CMultiLineLabel : public CLabel // area of text that actually will be printed, default is widget size Rect visibleSize; - void splitText(const std::string &Txt); + void splitText(const std::string &Txt, bool redrawAfter); Rect getTextLocation(); public: // total size of text, x = longest line of text, y = total height of lines @@ -91,9 +91,9 @@ public: void setText(const std::string &Txt) override; void showAll(SDL_Surface * to) override; - void setVisibleSize(Rect visibleSize); + void setVisibleSize(Rect visibleSize, bool redrawElement = true); // scrolls text visible in widget. Positive value will move text up - void scrollTextTo(int distance); + void scrollTextTo(int distance, bool redrawAfterScroll = true); void scrollTextBy(int distance); };