📄 falstatictext.cpp
字号:
/***********************************************************************
filename: FalStaticText.cpp
created: Tue Jul 5 2005
author: Paul D Turner <paul@cegui.org.uk>
*************************************************************************/
/***************************************************************************
* Copyright (C) 2004 - 2006 Paul D Turner & The CEGUI Development Team
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
***************************************************************************/
#include "FalStaticText.h"
#include "falagard/CEGUIFalWidgetLookManager.h"
#include "falagard/CEGUIFalWidgetLookFeel.h"
#include "CEGUIWindowManager.h"
#include "elements/CEGUIScrollbar.h"
#include "CEGUIEvent.h"
// Start of CEGUI namespace section
namespace CEGUI
{
const utf8 FalagardStaticText::TypeName[] = "Falagard/StaticText";
/************************************************************************
Properties
*************************************************************************/
FalagardStaticTextProperties::TextColours FalagardStaticText::d_textColoursProperty;
FalagardStaticTextProperties::VertFormatting FalagardStaticText::d_vertFormattingProperty;
FalagardStaticTextProperties::HorzFormatting FalagardStaticText::d_horzFormattingProperty;
FalagardStaticTextProperties::VertScrollbar FalagardStaticText::d_vertScrollbarProperty;
FalagardStaticTextProperties::HorzScrollbar FalagardStaticText::d_horzScrollbarProperty;
/*************************************************************************
Child Widget name suffix constants
*************************************************************************/
const String FalagardStaticText::VertScrollbarNameSuffix( "__auto_vscrollbar__" );
const String FalagardStaticText::HorzScrollbarNameSuffix( "__auto_hscrollbar__" );
/************************************************************************
Constructor
*************************************************************************/
FalagardStaticText::FalagardStaticText(const String& type) :
FalagardStatic(type),
d_horzFormatting(LeftAligned),
d_vertFormatting(VertCentred),
d_textCols(0xFFFFFFFF),
d_enableVertScrollbar(false),
d_enableHorzScrollbar(false)
{
registerProperty(&d_textColoursProperty);
registerProperty(&d_vertFormattingProperty);
registerProperty(&d_horzFormattingProperty);
registerProperty(&d_vertScrollbarProperty);
registerProperty(&d_horzScrollbarProperty);
}
/************************************************************************
Populates the rendercache with imagery for this widget
*************************************************************************/
void FalagardStaticText::render()
{
// base class rendering
FalagardStatic::render();
// text rendering
renderScrolledText();
}
/************************************************************************
Caches the text according to scrollbar positions
*************************************************************************/
void FalagardStaticText::renderScrolledText()
{
Font* font = d_window->getFont();
// can't render text without a font :)
if (font == 0)
return;
// get destination area for the text.
Rect absarea(getTextRenderArea());
Rect clipper(absarea);
float textHeight = font->getFormattedLineCount(d_window->getText(), absarea, (TextFormatting)d_horzFormatting) * font->getLineSpacing();
Scrollbar* vertScrollbar = getVertScrollbar();
Scrollbar* horzScrollbar = getHorzScrollbar();
// see if we may need to adjust horizontal position
if (horzScrollbar->isVisible())
{
switch(d_horzFormatting)
{
case LeftAligned:
case WordWrapLeftAligned:
case Justified:
case WordWrapJustified:
absarea.offset(Point(-horzScrollbar->getScrollPosition(), 0));
break;
case Centred:
case WordWrapCentred:
absarea.setWidth(horzScrollbar->getDocumentSize());
absarea.offset(Point(-horzScrollbar->getScrollPosition(), 0));
break;
case RightAligned:
case WordWrapRightAligned:
absarea.offset(Point(horzScrollbar->getScrollPosition(), 0));
break;
}
}
// adjust y positioning according to formatting option
switch(d_vertFormatting)
{
case TopAligned:
absarea.d_top -= vertScrollbar->getScrollPosition();
break;
case VertCentred:
// if scroll bar is in use, act like TopAligned
if (vertScrollbar->isVisible())
{
absarea.d_top -= vertScrollbar->getScrollPosition();
}
// no scroll bar, so centre text instead.
else
{
absarea.d_top += PixelAligned((absarea.getHeight() - textHeight) * 0.5f);
}
break;
case BottomAligned:
absarea.d_top = absarea.d_bottom - textHeight;
absarea.d_top += vertScrollbar->getScrollPosition();
break;
}
// offset the font little down so that it's centered within its own spacing
absarea.d_top += (font->getLineSpacing() - font->getFontHeight()) * 0.5f;
// calculate final colours
ColourRect final_cols(d_textCols);
final_cols.modulateAlpha(d_window->getEffectiveAlpha());
// cache the text for rendering.
d_window->getRenderCache().cacheText(d_window->getText(), font, (TextFormatting)d_horzFormatting, absarea, 0, final_cols, &clipper);
}
/************************************************************************
Returns the vertical scrollbar component
*************************************************************************/
Scrollbar* FalagardStaticText::getVertScrollbar(void) const
{
// return component created by look'n'feel assignment.
return static_cast<Scrollbar*>(WindowManager::getSingleton().getWindow(d_window->getName() + VertScrollbarNameSuffix));
}
/************************************************************************
Returns the horizontal scrollbar component
*************************************************************************/
Scrollbar* FalagardStaticText::getHorzScrollbar(void) const
{
// return component created by look'n'feel assignment.
return static_cast<Scrollbar*>(WindowManager::getSingleton().getWindow(d_window->getName() + HorzScrollbarNameSuffix));
}
/************************************************************************
Gets the text rendering area
*************************************************************************/
Rect FalagardStaticText::getTextRenderArea(void) const
{
Scrollbar* vertScrollbar = getVertScrollbar();
Scrollbar* horzScrollbar = getHorzScrollbar();
bool v_visible = vertScrollbar->isVisible(true);
bool h_visible = horzScrollbar->isVisible(true);
// get WidgetLookFeel for the assigned look.
const WidgetLookFeel& wlf = getLookNFeel();
String area_name(d_frameEnabled ? "WithFrameTextRenderArea" : "NoFrameTextRenderArea");
// if either of the scrollbars are visible, we might want to use a special rendering area
if (v_visible || h_visible)
{
if (h_visible)
{
area_name += "H";
}
if (v_visible)
{
area_name += "V";
}
area_name += "Scroll";
}
if (wlf.isNamedAreaDefined(area_name))
{
return wlf.getNamedArea(area_name).getArea().getPixelRect(*d_window);
}
// default to plain WithFrameTextRenderArea
return wlf.getNamedArea("WithFrameTextRenderArea").getArea().getPixelRect(*d_window);
}
/************************************************************************
Gets the pixel size of the document
*************************************************************************/
Size FalagardStaticText::getDocumentSize(const Rect& renderArea) const
{
// we need a font to really measure anything
Font* font = d_window->getFont();
if (font==0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -