First commit
commit
9f66f1d773
|
@ -0,0 +1,22 @@
|
|||
# Auto detect text files and perform LF normalization
|
||||
* text=auto
|
||||
|
||||
# Custom for Visual Studio
|
||||
*.cs diff=csharp
|
||||
*.sln merge=union
|
||||
*.csproj merge=union
|
||||
*.vbproj merge=union
|
||||
*.fsproj merge=union
|
||||
*.dbproj merge=union
|
||||
|
||||
# Standard to msysgit
|
||||
*.doc diff=astextplain
|
||||
*.DOC diff=astextplain
|
||||
*.docx diff=astextplain
|
||||
*.DOCX diff=astextplain
|
||||
*.dot diff=astextplain
|
||||
*.DOT diff=astextplain
|
||||
*.pdf diff=astextplain
|
||||
*.PDF diff=astextplain
|
||||
*.rtf diff=astextplain
|
||||
*.RTF diff=astextplain
|
|
@ -0,0 +1,163 @@
|
|||
#################
|
||||
## Eclipse
|
||||
#################
|
||||
|
||||
*.pydevproject
|
||||
.project
|
||||
.metadata
|
||||
bin/
|
||||
tmp/
|
||||
*.tmp
|
||||
*.bak
|
||||
*.swp
|
||||
*~.nib
|
||||
local.properties
|
||||
.classpath
|
||||
.settings/
|
||||
.loadpath
|
||||
|
||||
# External tool builders
|
||||
.externalToolBuilders/
|
||||
|
||||
# Locally stored "Eclipse launch configurations"
|
||||
*.launch
|
||||
|
||||
# CDT-specific
|
||||
.cproject
|
||||
|
||||
# PDT-specific
|
||||
.buildpath
|
||||
|
||||
|
||||
#################
|
||||
## Visual Studio
|
||||
#################
|
||||
|
||||
## Ignore Visual Studio temporary files, build results, and
|
||||
## files generated by popular Visual Studio add-ons.
|
||||
|
||||
# User-specific files
|
||||
*.suo
|
||||
*.user
|
||||
*.sln.docstates
|
||||
|
||||
# Build results
|
||||
[Dd]ebug/
|
||||
[Rr]elease/
|
||||
*_i.c
|
||||
*_p.c
|
||||
*.ilk
|
||||
*.meta
|
||||
*.obj
|
||||
*.pch
|
||||
*.pdb
|
||||
*.pgc
|
||||
*.pgd
|
||||
*.rsp
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
*.tlh
|
||||
*.tmp
|
||||
*.vspscc
|
||||
.builds
|
||||
*.dotCover
|
||||
|
||||
## TODO: If you have NuGet Package Restore enabled, uncomment this
|
||||
#packages/
|
||||
|
||||
# Visual C++ cache files
|
||||
ipch/
|
||||
*.aps
|
||||
*.ncb
|
||||
*.opensdf
|
||||
*.sdf
|
||||
|
||||
# Visual Studio profiler
|
||||
*.psess
|
||||
*.vsp
|
||||
|
||||
# ReSharper is a .NET coding add-in
|
||||
_ReSharper*
|
||||
|
||||
# Installshield output folder
|
||||
[Ee]xpress
|
||||
|
||||
# DocProject is a documentation generator add-in
|
||||
DocProject/buildhelp/
|
||||
DocProject/Help/*.HxT
|
||||
DocProject/Help/*.HxC
|
||||
DocProject/Help/*.hhc
|
||||
DocProject/Help/*.hhk
|
||||
DocProject/Help/*.hhp
|
||||
DocProject/Help/Html2
|
||||
DocProject/Help/html
|
||||
|
||||
# Click-Once directory
|
||||
publish
|
||||
|
||||
# Others
|
||||
[Bb]in
|
||||
[Oo]bj
|
||||
sql
|
||||
TestResults
|
||||
*.Cache
|
||||
ClientBin
|
||||
stylecop.*
|
||||
~$*
|
||||
*.dbmdl
|
||||
Generated_Code #added for RIA/Silverlight projects
|
||||
|
||||
# Backup & report files from converting an old project file to a newer
|
||||
# Visual Studio version. Backup files are not needed, because we have git ;-)
|
||||
_UpgradeReport_Files/
|
||||
Backup*/
|
||||
UpgradeLog*.XML
|
||||
|
||||
|
||||
|
||||
############
|
||||
## Windows
|
||||
############
|
||||
|
||||
# Windows image file caches
|
||||
Thumbs.db
|
||||
|
||||
# Folder config file
|
||||
Desktop.ini
|
||||
|
||||
|
||||
#############
|
||||
## Python
|
||||
#############
|
||||
|
||||
*.py[co]
|
||||
|
||||
# Packages
|
||||
*.egg
|
||||
*.egg-info
|
||||
dist
|
||||
build
|
||||
eggs
|
||||
parts
|
||||
bin
|
||||
var
|
||||
sdist
|
||||
develop-eggs
|
||||
.installed.cfg
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
.coverage
|
||||
.tox
|
||||
|
||||
#Translations
|
||||
*.mo
|
||||
|
||||
#Mr Developer
|
||||
.mr.developer.cfg
|
||||
|
||||
# Mac crap
|
||||
.DS_Store
|
|
@ -0,0 +1,59 @@
|
|||
RichText
|
||||
========
|
||||
|
||||
Rich text class for [SFML2](https://github.com/LaurentGomila/SFML/). Allows the
|
||||
user to draw lines of text with different styles and colors.
|
||||
|
||||
Author
|
||||
------
|
||||
|
||||
* [Cristian Pallarés](https://github.com/Skyrpex) - Original code
|
||||
* [Lukas Dürrenberger](https://github.com/eXpl0it3r/) - Conversion to the new SFML2 API
|
||||
|
||||
How to use
|
||||
----------
|
||||
|
||||
1. Include the header and the source to your project.
|
||||
2. Link to SFML2 (obviously :P!).
|
||||
|
||||
Repository
|
||||
----------
|
||||
|
||||
You can get the current development version from the [git repository](https://github.com/Skyrpex/RichText).
|
||||
|
||||
Example
|
||||
-------
|
||||
|
||||
#include "RichText.hpp"
|
||||
#include <SFML/Graphics.hpp>
|
||||
|
||||
int main()
|
||||
{
|
||||
sf::RichText text;
|
||||
text << sf::Text::Bold << sf::Color::Cyan << "This"
|
||||
<< sf::Text::Italic << sf::Color::White << " is cool "
|
||||
<< sf::Text::Regular << sf::Color::Green << "mate"
|
||||
<< sf::Color::White << ". "
|
||||
<< sf::Text::Underlined << "I wish I could lick it!";
|
||||
|
||||
text.setCharacterSize(25);
|
||||
text.setPosition(400, 300);
|
||||
text.setOrigin(text.getWidth()/2.f, text.getHeight()/2.f);
|
||||
|
||||
sf::RenderWindow window;
|
||||
window.create(sf::VideoMode(800, 600), "Rich text");
|
||||
|
||||
while(window.isOpen())
|
||||
{
|
||||
sf::Event event;
|
||||
while(window.pollEvent(event))
|
||||
{
|
||||
if(event.type == sf::Event::Closed)
|
||||
window.close();
|
||||
}
|
||||
|
||||
window.clear();
|
||||
window.draw(text);
|
||||
window.display();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,239 @@
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Headers
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
#include "RichText.hpp"
|
||||
#include <Sfml/Graphics/RenderTarget.hpp>
|
||||
#include <iostream>
|
||||
|
||||
namespace sfe
|
||||
{
|
||||
RichText::RichText()
|
||||
: myCurrentColor(sf::Color::White),
|
||||
myCurrentStyle(sf::Text::Regular),
|
||||
mySizeUpdated(false),
|
||||
myPositionUpdated(false)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Operator << sf::Color
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
RichText & RichText::operator << (const sf::Color &color)
|
||||
{
|
||||
myCurrentColor = color;
|
||||
return *this;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Operator << sf::Text::Style
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
RichText & RichText::operator << (sf::Text::Style style)
|
||||
{
|
||||
myCurrentStyle = style;
|
||||
return *this;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Operator << sf::String
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/*
|
||||
** Must parse the strings to look for '\n' characters. If found, we break
|
||||
** the string into two pieces.
|
||||
*/
|
||||
RichText & RichText::operator << (const sf::String &string)
|
||||
{
|
||||
// It is not updated
|
||||
mySizeUpdated = false;
|
||||
myPositionUpdated = false;
|
||||
|
||||
// Find \n characters (assert)
|
||||
//assert(string.Find('\n') == std::string::npos);
|
||||
if(string.find('\n') != std::string::npos)
|
||||
std::cerr << "sfe::RichtText: Oops, character \n found."
|
||||
"You will get visual errors." << std::endl;
|
||||
|
||||
// Add string
|
||||
myTexts.resize(myTexts.size()+1);
|
||||
|
||||
// Setup string
|
||||
sf::Text &text = *(--myTexts.end());
|
||||
text.setColor(myCurrentColor);
|
||||
text.setStyle(myCurrentStyle);
|
||||
text.setString(string);
|
||||
|
||||
// Return
|
||||
return *this;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Set size
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void RichText::setCharacterSize(unsigned int size)
|
||||
{
|
||||
// Set character size
|
||||
for(std::list<sf::Text>::iterator it = myTexts.begin();
|
||||
it != myTexts.end(); ++it)
|
||||
{
|
||||
it->setCharacterSize(size);
|
||||
}
|
||||
|
||||
// It is not updated
|
||||
mySizeUpdated = false;
|
||||
myPositionUpdated = false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Set font
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void RichText::setFont(const sf::Font &font)
|
||||
{
|
||||
// Set character size
|
||||
for(std::list<sf::Text>::iterator it = myTexts.begin();
|
||||
it != myTexts.end(); ++it)
|
||||
{
|
||||
it->setFont(font);
|
||||
}
|
||||
|
||||
// It is not updated
|
||||
mySizeUpdated = false;
|
||||
myPositionUpdated = false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Clear
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void RichText::clear()
|
||||
{
|
||||
// Clear text list
|
||||
myTexts.clear();
|
||||
|
||||
// Reset size
|
||||
mySize = sf::Vector2f(0.f, 0.f);
|
||||
|
||||
// It is updated
|
||||
mySizeUpdated = true;
|
||||
myPositionUpdated = true;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Get text list
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
const std::list<sf::Text> & RichText::getTextList() const
|
||||
{
|
||||
return myTexts;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Get character size
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
unsigned int RichText::getCharacterSize() const
|
||||
{
|
||||
if(myTexts.size()) return myTexts.begin()->getCharacterSize();
|
||||
return 0;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Get font
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
const sf::Font & RichText::getFont() const
|
||||
{
|
||||
if(myTexts.size()) return myTexts.begin()->getFont();
|
||||
return sf::Font::getDefaultFont();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Get width
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
float RichText::getWidth() const
|
||||
{
|
||||
updateSize();
|
||||
return mySize.x;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Get height
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
float RichText::getHeight() const
|
||||
{
|
||||
updateSize();
|
||||
return mySize.y;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Render
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void RichText::draw(sf::RenderTarget& target, sf::RenderStates states) const
|
||||
{
|
||||
// Update position
|
||||
updatePosition();
|
||||
|
||||
states.transform *= getTransform();
|
||||
|
||||
// Draw
|
||||
for(std::list<sf::Text>::const_iterator it = myTexts.begin();
|
||||
it != myTexts.end(); ++it)
|
||||
{
|
||||
// Add transformation
|
||||
//it->setT
|
||||
|
||||
// Draw text
|
||||
target.draw(*it, states);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Update size
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void RichText::updateSize() const
|
||||
{
|
||||
// Return if updated
|
||||
if(mySizeUpdated) return;
|
||||
|
||||
// Return if empty
|
||||
if(myTexts.begin() == myTexts.end()) return;
|
||||
|
||||
// It is updated
|
||||
mySizeUpdated = true;
|
||||
|
||||
// Sum all sizes (height not implemented)
|
||||
mySize.x = 0.f;
|
||||
mySize.y = myTexts.begin()->getGlobalBounds().height;
|
||||
for(std::list<sf::Text>::const_iterator it = myTexts.begin();
|
||||
it != myTexts.end(); ++it)
|
||||
{
|
||||
// Update width
|
||||
mySize.x += it->getGlobalBounds().width;
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Update position
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void RichText::updatePosition() const
|
||||
{
|
||||
// Return if updated
|
||||
if(myPositionUpdated) return;
|
||||
|
||||
// Return if empty
|
||||
if(myTexts.begin() == myTexts.end()) return;
|
||||
|
||||
// It is updated
|
||||
myPositionUpdated = true;
|
||||
|
||||
// Get starting position
|
||||
sf::Vector2f offset;
|
||||
|
||||
// Draw
|
||||
for(std::list<sf::Text>::iterator it = myTexts.begin();
|
||||
it != myTexts.end(); ++it)
|
||||
{
|
||||
// Set all the origins to the first one
|
||||
it->setOrigin(it->getPosition() - myTexts.begin()->getPosition() - offset);
|
||||
|
||||
// Set offset
|
||||
const sf::FloatRect rect = it->getGlobalBounds();
|
||||
offset.x += rect.width;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,101 @@
|
|||
#ifndef RICHTEXT_HPP
|
||||
#define RICHTEXT_HPP
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Headers
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
#include <SFML/Graphics/Drawable.hpp>
|
||||
#include <SFML/Graphics/Color.hpp>
|
||||
#include <SFML/Graphics/Text.hpp>
|
||||
#include <SFML/System/String.hpp>
|
||||
#include <list>
|
||||
|
||||
namespace sf
|
||||
{
|
||||
|
||||
class RichText : public sf::Drawable, public sf::Transformable
|
||||
{
|
||||
public:
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Constructor
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
RichText();
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Operators
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
RichText & operator << (const sf::Color &color);
|
||||
RichText & operator << (sf::Text::Style style);
|
||||
RichText & operator << (const sf::String &string);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Set character size
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void setCharacterSize(unsigned int size);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Set font
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void setFont(const sf::Font &font);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Clear
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void clear();
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Get text list
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
const std::list<sf::Text> &getTextList() const;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Get character size
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
unsigned int getCharacterSize() const;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Get font
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
const sf::Font & getFont() const;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Get width
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
float getWidth() const;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Get height
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
float getHeight() const;
|
||||
|
||||
private:
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Update size
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void updateSize() const;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Update position
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void updatePosition() const;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Render
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
void draw(sf::RenderTarget& target, sf::RenderStates states) const;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Member data
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
mutable std::list<sf::Text> myTexts; ///< List of texts
|
||||
sf::Color myCurrentColor; ///< Last used color
|
||||
sf::Text::Style myCurrentStyle; ///< Last style used
|
||||
mutable sf::Vector2f mySize; ///< Size of the text
|
||||
mutable bool mySizeUpdated; ///< Do we need to recompute the size?
|
||||
mutable bool myPositionUpdated; ///< Do we need to recompute the
|
||||
///< position?
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // RICHTEXT_HPP
|
Loading…
Reference in New Issue