moonfall/WindowDialoguePanel.cpp
2014-10-21 13:54:42 +09:00

112 lines
3.7 KiB
C++

/*
Moonfall Copyright (C) 2008 Alex Yatskov
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "Pch.h"
#include "WindowDialoguePanel.h"
#include "WindowText.h"
#include "Surface.h"
#include "Sprite.h"
void WindowDialoguePanel::SetPanel(const char* text, const char* textFontAlias, const char* title, const char* titleFontAlias, const char* spriteAlias, int padding, int maxWidth)
{
ClearChildren();
if (spriteAlias != NULL)
{
m_sprite = System::LoadSprite(spriteAlias);
}
else
{
m_sprite.reset();
}
if (maxWidth == 0)
{
maxWidth = GetSize().x;
}
boost::shared_ptr<WindowText> titleWindow;
if (title != NULL && maxWidth > 0)
{
titleWindow = boost::shared_ptr<WindowText>(new WindowText());
titleWindow->SetText(title, titleFontAlias, maxWidth);
titleWindow->SetSize(titleWindow->GetDesiredSize());
if (m_sprite && m_sprite->GetSize().x > titleWindow->GetSize().x)
{
titleWindow->SetPosition(Vector2i((m_sprite->GetSize().x - titleWindow->GetSize().x) / 2, m_sprite->GetSize().y + padding));
}
else
{
titleWindow->SetPosition(Vector2i(0, (m_sprite ? m_sprite->GetSize().y + padding : 0)));
}
AddChild(titleWindow);
}
boost::shared_ptr<WindowText> textWindow;
if (text != NULL)
{
const int titleWidth = titleWindow ? titleWindow->GetDesiredSize().x : 0;
const int spriteWidth = m_sprite ? m_sprite->GetSize().x : 0;
const int offsetWidth = MAX(titleWidth, spriteWidth) + ((titleWindow || m_sprite) ? padding : 0);
const int textWidth = maxWidth - offsetWidth;
if (textWidth > 0)
{
textWindow = boost::shared_ptr<WindowText>(new WindowText());
textWindow->SetText(text, textFontAlias, textWidth);
textWindow->SetPosition(Vector2i(offsetWidth, 0));
textWindow->SetSize(textWindow->GetDesiredSize());
AddChild(textWindow);
}
}
const Vector2i spriteSize = m_sprite ? m_sprite->GetSize() : Vector2i(0, 0);
const Vector2i titleSize = titleWindow ? titleWindow->GetDesiredSize() : Vector2i(0, 0);
const Vector2i textSize = textWindow ? textWindow->GetDesiredSize() : Vector2i(0, 0);
m_desiredSize = Vector2i(
MAX(titleSize.x, spriteSize.x) + textSize.x + (((m_sprite || titleWindow) && textWindow) ? padding : 0),
MAX(titleSize.y + spriteSize.y, textSize.y) + ((m_sprite && titleWindow) ? padding : 0)
);
if (m_sprite && titleWindow && titleWindow->GetSize().x > m_sprite->GetSize().x)
{
m_spritePosition = Vector2i((titleWindow->GetSize().x - m_sprite->GetSize().x) / 2, 0);
}
else
{
m_spritePosition = Vector2i(0, 0);
}
}
Vector2i WindowDialoguePanel::GetDesiredSize() const
{
return m_desiredSize;
}
void WindowDialoguePanel::OnRender(const boost::shared_ptr<Surface>& target)
{
Window::OnRender(target);
if (m_sprite)
{
target->SetTranslation(m_spritePosition);
m_sprite->Render(target);
}
}