From 322480862b1e520e5f5035a681f9775ebcb2aa0c Mon Sep 17 00:00:00 2001 From: scrawl Date: Sat, 16 Aug 2014 17:31:36 +0200 Subject: [PATCH] InteractiveMessageBox: lay out buttons horizontally if button width does not exceed message width (Fixes #1812) Also fix some layout bugs. --- apps/openmw/mwgui/messagebox.cpp | 59 ++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp index adda49fc0..d6839d9a9 100644 --- a/apps/openmw/mwgui/messagebox.cpp +++ b/apps/openmw/mwgui/messagebox.cpp @@ -197,9 +197,9 @@ namespace MWGui WindowModal::open(); int textPadding = 10; // padding between text-widget and main-widget - int textButtonPadding = 20; // padding between the text-widget und the button-widget + int textButtonPadding = 10; // padding between the text-widget und the button-widget int buttonLeftPadding = 10; // padding between the buttons if horizontal - int buttonTopPadding = 5; // ^-- if vertical + int buttonTopPadding = 10; // ^-- if vertical int buttonPadding = 5; // padding between button label and button itself int buttonMainPadding = 10; // padding between buttons and bottom of the main widget @@ -219,6 +219,7 @@ namespace MWGui int biggestButtonWidth = 0; int buttonWidth = 0; int buttonsWidth = 0; + int buttonsHeight = 0; int buttonHeight = 0; MyGUI::IntCoord dummyCoord(0, 0, 0, 0); @@ -236,37 +237,41 @@ namespace MWGui mButtons.push_back(button); - buttonWidth = button->getTextSize().width + 2*buttonPadding + buttonLeftPadding; + if (buttonsWidth != 0) + buttonsWidth += buttonLeftPadding; + + buttonWidth = button->getTextSize().width + 2*buttonPadding; buttonsWidth += buttonWidth; - buttonHeight = button->getTextSize().height + 2*buttonPadding + buttonTopPadding; + + buttonHeight = button->getTextSize().height + 2*buttonPadding; + + if (buttonsHeight != 0) + buttonsHeight += buttonTopPadding; + buttonsHeight += buttonHeight; if(buttonWidth > biggestButtonWidth) { biggestButtonWidth = buttonWidth; } } - buttonsWidth += buttonLeftPadding; MyGUI::IntSize mainWidgetSize; - if(buttonsWidth < fixedWidth) + if(buttonsWidth < textSize.width) { // on one line - if(textSize.width + 2*textPadding < buttonsWidth) - { - mainWidgetSize.width = buttonsWidth; - } - else - { - mainWidgetSize.width = textSize.width + 3*textPadding; - } - mainWidgetSize.height = textSize.height + textButtonPadding + buttonHeight + buttonMainPadding; + mainWidgetSize.width = textSize.width + 3*textPadding; + mainWidgetSize.height = textPadding + textSize.height + textButtonPadding + buttonHeight + buttonMainPadding; + + MyGUI::IntSize realSize = mainWidgetSize + + // To account for borders + (mMainWidget->getSize() - mMainWidget->getClientWidget()->getSize()); MyGUI::IntPoint absPos; - absPos.left = (gameWindowSize.width - mainWidgetSize.width)/2; - absPos.top = (gameWindowSize.height - mainWidgetSize.height)/2; + absPos.left = (gameWindowSize.width - realSize.width)/2; + absPos.top = (gameWindowSize.height - realSize.height)/2; mMainWidget->setPosition(absPos); - mMainWidget->setSize(mainWidgetSize); + mMainWidget->setSize(realSize); MyGUI::IntCoord messageWidgetCoord; messageWidgetCoord.left = (mainWidgetSize.width - textSize.width)/2; @@ -277,13 +282,13 @@ namespace MWGui MyGUI::IntCoord buttonCord; MyGUI::IntSize buttonSize(0, buttonHeight); - int left = (mainWidgetSize.width - buttonsWidth)/2 + buttonPadding; + int left = (mainWidgetSize.width - buttonsWidth)/2; std::vector::const_iterator button; for(button = mButtons.begin(); button != mButtons.end(); ++button) { buttonCord.left = left; - buttonCord.top = textSize.height + textButtonPadding; + buttonCord.top = messageWidgetCoord.top + textSize.height + textButtonPadding; buttonSize.width = (*button)->getTextSize().width + 2*buttonPadding; buttonSize.height = (*button)->getTextSize().height + 2*buttonPadding; @@ -298,7 +303,7 @@ namespace MWGui { // among each other if(biggestButtonWidth > textSize.width) { - mainWidgetSize.width = biggestButtonWidth + buttonTopPadding; + mainWidgetSize.width = biggestButtonWidth + buttonTopPadding*2; } else { mainWidgetSize.width = textSize.width + 3*textPadding; @@ -307,7 +312,7 @@ namespace MWGui MyGUI::IntCoord buttonCord; MyGUI::IntSize buttonSize(0, buttonHeight); - int top = textButtonPadding + buttonTopPadding + textSize.height; + int top = textPadding + textSize.height + textButtonPadding; std::vector::const_iterator button; for(button = mButtons.begin(); button != mButtons.end(); ++button) @@ -316,16 +321,18 @@ namespace MWGui buttonSize.height = (*button)->getTextSize().height + buttonPadding*2; buttonCord.top = top; - buttonCord.left = (mainWidgetSize.width - buttonSize.width)/2 - 5; // FIXME: -5 is not so nice :/ + buttonCord.left = (mainWidgetSize.width - buttonSize.width)/2; (*button)->setCoord(buttonCord); (*button)->setSize(buttonSize); - top += buttonSize.height + 2*buttonTopPadding; + top += buttonSize.height + buttonTopPadding; } - mainWidgetSize.height = top + buttonMainPadding; - mMainWidget->setSize(mainWidgetSize); + mainWidgetSize.height = textPadding + textSize.height + textButtonPadding + buttonsHeight + buttonMainPadding; + mMainWidget->setSize(mainWidgetSize + + // To account for borders + (mMainWidget->getSize() - mMainWidget->getClientWidget()->getSize())); MyGUI::IntPoint absPos; absPos.left = (gameWindowSize.width - mainWidgetSize.width)/2;