Merge branch 'develop' into feature/develop-atys

feature/develop-atys
kaetemi 4 years ago
commit 7adbb84514

@ -54,8 +54,8 @@ ENDIF()
CMAKE_MINIMUM_REQUIRED(VERSION 2.6) CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
PROJECT(RyzomCore CXX C) PROJECT(RyzomCore CXX C)
SET(NL_VERSION_MAJOR 1) SET(NL_VERSION_MAJOR 1)
SET(NL_VERSION_MINOR 0) SET(NL_VERSION_MINOR 1)
SET(NL_VERSION_PATCH 2) SET(NL_VERSION_PATCH 0 CACHE STRING "Patch version")
SET(YEAR "2001-${CURRENT_YEAR}") SET(YEAR "2001-${CURRENT_YEAR}")
SET(AUTHOR "Winch Gate and The Ryzom Core Community") SET(AUTHOR "Winch Gate and The Ryzom Core Community")

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2014-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -181,7 +181,8 @@ public:
CVertexBuffer Vertices; CVertexBuffer Vertices;
CMaterial *Material; CMaterial *Material;
CRGBA Color; CRGBA Color;
ucstring Text; std::string Text;
size_t Length;
uint32 CacheVersion; uint32 CacheVersion;

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013-2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2013-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -262,10 +262,10 @@ public:
virtual NLMISC::IEventEmitter *getEventEmitter() = 0; virtual NLMISC::IEventEmitter *getEventEmitter() = 0;
/// Copy a string to system clipboard. /// Copy a string to system clipboard.
virtual bool copyTextToClipboard(const ucstring &text) = 0; virtual bool copyTextToClipboard(const std::string &text) = 0;
/// Paste a string from system clipboard. /// Paste a string from system clipboard.
virtual bool pasteTextFromClipboard(ucstring &text) = 0;/// Return the depth of the driver after init(). virtual bool pasteTextFromClipboard(std::string &text) = 0;/// Return the depth of the driver after init().
virtual uint8 getBitPerPixel() = 0; virtual uint8 getBitPerPixel() = 0;

@ -4,7 +4,7 @@
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2010 Matt RAYKOWSKI (sfb) <matt.raykowski@gmail.com> // Copyright (C) 2010 Matt RAYKOWSKI (sfb) <matt.raykowski@gmail.com>
// Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de> // Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de>
// Copyright (C) 2013-2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2013-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -558,10 +558,10 @@ public:
// @} // @}
// Copy a string to system clipboard. // Copy a string to system clipboard.
virtual bool copyTextToClipboard(const ucstring &text); virtual bool copyTextToClipboard(const std::string &text);
// Paste a string from system clipboard. // Paste a string from system clipboard.
virtual bool pasteTextFromClipboard(ucstring &text); virtual bool pasteTextFromClipboard(std::string &text);
virtual uint64 getSwapBufferCounter(); virtual uint64 getSwapBufferCounter();

@ -1,6 +1,9 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the
@ -64,17 +67,17 @@ public:
* \param height height of the generated bitmap, this value is set by this function * \param height height of the generated bitmap, this value is set by this function
* \param pitch pitch of the generated bitmap (+ or - the number of bytes per row), this value is set by this function * \param pitch pitch of the generated bitmap (+ or - the number of bytes per row), this value is set by this function
*/ */
uint8 *getBitmap (ucchar c, uint32 size, bool embolden, bool oblique, uint32 &width, uint32 &height, uint32 &pitch, sint32 &left, sint32 &top, sint32 &advx, uint32 &glyphIndex); uint8 *getBitmap (u32char c, uint32 size, bool embolden, bool oblique, uint32 &width, uint32 &height, uint32 &pitch, sint32 &left, sint32 &top, sint32 &advx, uint32 &glyphIndex);
/** returns the width and height of a character using a specific size and /** returns the width and height of a character using a specific size and
* *
* \warning this function is not very fast (but faster than getBitmap()) because it has to load the char before. * \warning this function is not very fast (but faster than getBitmap()) because it has to load the char before.
*/ */
void getSizes (ucchar c, uint32 size, uint32 &width, uint32 &height); void getSizes (u32char c, uint32 size, uint32 &width, uint32 &height);
void getKerning (ucchar left, ucchar right, sint32 &kernx); void getKerning (u32char left, u32char right, sint32 &kernx);
uint32 getCharIndex (ucchar c); uint32 getCharIndex (u32char c);
uint32 getUID() { return _UID; } uint32 getUID() { return _UID; }

@ -1,6 +1,9 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the
@ -19,6 +22,7 @@
#include "nel/misc/types_nl.h" #include "nel/misc/types_nl.h"
#include "nel/misc/smart_ptr.h" #include "nel/misc/smart_ptr.h"
#include "nel/misc/utf_string_view.h"
#include "nel/3d/texture.h" #include "nel/3d/texture.h"
#include "nel/3d/material.h" #include "nel/3d/material.h"
#include "nel/3d/texture_font.h" #include "nel/3d/texture_font.h"
@ -111,6 +115,7 @@ public:
* \param output computed string * \param output computed string
* \param keep800x600Ratio true if you want that CFontManager look at Driver window size, and resize fontSize so it keeps same size... * \param keep800x600Ratio true if you want that CFontManager look at Driver window size, and resize fontSize so it keeps same size...
*/ */
/*
void computeString (const std::string& s, void computeString (const std::string& s,
CFontGenerator *fontGen, CFontGenerator *fontGen,
const NLMISC::CRGBA &color, const NLMISC::CRGBA &color,
@ -120,11 +125,12 @@ public:
IDriver *driver, IDriver *driver,
CComputedString& output, CComputedString& output,
bool keep800x600Ratio= true); bool keep800x600Ratio= true);
*/
/** /**
* Same as computeString but works with a unicode string (ucstring) * Same as computeString but works with a unicode string (ucstring)
*/ */
void computeString (const ucstring &s, void computeString (NLMISC::CUtfStringView sv,
CFontGenerator *fontGen, CFontGenerator *fontGen,
const NLMISC::CRGBA &color, const NLMISC::CRGBA &color,
uint32 fontSize, uint32 fontSize,
@ -137,7 +143,21 @@ public:
/** /**
* Same as computeString but do not make vertex buffers and primitives * Same as computeString but do not make vertex buffers and primitives
*/ */
void computeStringInfo (const ucstring &s, void computeStringInfo (NLMISC::CUtfStringView sv,
size_t len,
CFontGenerator *fontGen,
const NLMISC::CRGBA &color,
uint32 fontSize,
bool embolden,
bool oblique,
IDriver *driver,
CComputedString &output,
bool keep800x600Ratio= true);
/**
* Same as computeString but do not make vertex buffers and primitives
*/
void computeStringInfo (NLMISC::CUtfStringView sv,
CFontGenerator *fontGen, CFontGenerator *fontGen,
const NLMISC::CRGBA &color, const NLMISC::CRGBA &color,
uint32 fontSize, uint32 fontSize,

@ -1,6 +1,9 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2014-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -134,7 +134,7 @@ public:
uint32 textPush (const char *format, ...); uint32 textPush (const char *format, ...);
/// computes an ucstring and adds the result to the cache (return the index) /// computes an ucstring and adds the result to the cache (return the index)
uint32 textPush (const ucstring &str); uint32 textPush (NLMISC::CUtfStringView sv);
/// remove a string from the cache /// remove a string from the cache
void erase (uint32 index); void erase (uint32 index);
@ -262,12 +262,12 @@ public:
} }
/// Directly print a string /// Directly print a string
void printAt (float x, float z, const ucstring &ucstr) void printAt (float x, float z, NLMISC::CUtfStringView sv)
{ {
nlassert(_FontGen); nlassert(_FontGen);
// compute the string just one time // compute the string just one time
_FontManager->computeString (ucstr, _FontGen, _Color, _FontSize, _Embolden, _Oblique, _Driver, _TempString, _Keep800x600Ratio); _FontManager->computeString (sv, _FontGen, _Color, _FontSize, _Embolden, _Oblique, _Driver, _TempString, _Keep800x600Ratio);
// draw shaded // draw shaded
if (_Shaded) if (_Shaded)
@ -372,14 +372,19 @@ public:
* \param an ucstring * \param an ucstring
* \param the computed string * \param the computed string
*/ */
void computeString (const ucstring& s, CComputedString& output) void computeString (NLMISC::CUtfStringView sv, CComputedString& output)
{ {
_FontManager->computeString (s, _FontGen, _Color, _FontSize, _Embolden, _Oblique, _Driver, output, _Keep800x600Ratio); _FontManager->computeString (sv, _FontGen, _Color, _FontSize, _Embolden, _Oblique, _Driver, output, _Keep800x600Ratio);
}
void computeStringInfo (NLMISC::CUtfStringView sv, CComputedString& output)
{
_FontManager->computeStringInfo (sv, _FontGen, _Color, _FontSize, _Embolden, _Oblique, _Driver, output, _Keep800x600Ratio);
} }
void computeStringInfo (const ucstring& s, CComputedString& output) void computeStringInfo (NLMISC::CUtfStringView sv, CComputedString& output, size_t len)
{ {
_FontManager->computeStringInfo (s, _FontGen, _Color, _FontSize, _Embolden, _Oblique, _Driver, output, _Keep800x600Ratio); _FontManager->computeStringInfo (sv, len, _FontGen, _Color, _FontSize, _Embolden, _Oblique, _Driver, output, _Keep800x600Ratio);
} }
/// Debug : write to the disk the texture cache /// Debug : write to the disk the texture cache

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2014-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -97,13 +97,14 @@ public:
*/ */
// @{ // @{
uint32 textPush(const char *format, ...) ; uint32 textPush(const char *format, ...) ;
uint32 textPush(const ucstring &str) ; uint32 textPush(NLMISC::CUtfStringView sv) ;
void setStringColor(uint32 i, CRGBA newCol); void setStringColor(uint32 i, CRGBA newCol);
void setStringSelection(uint32 i, uint32 selectStart, uint32 selectSize); void setStringSelection(uint32 i, uint32 selectStart, uint32 selectSize);
void resetStringSelection(uint32 i); void resetStringSelection(uint32 i);
void erase(uint32 i) ; void erase(uint32 i) ;
virtual CStringInfo getStringInfo (uint32 i); virtual CStringInfo getStringInfo (uint32 i);
virtual CStringInfo getStringInfo (const ucstring &ucstr); virtual CStringInfo getStringInfo (NLMISC::CUtfStringView sv);
virtual CStringInfo getStringInfo (NLMISC::CUtfStringView sv, size_t len);
void clear() ; void clear() ;
void printAt(float x, float y, uint32 i) ; void printAt(float x, float y, uint32 i) ;
@ -111,10 +112,10 @@ public:
void printClipAtUnProjected(URenderStringBuffer &renderBuffer, class NL3D::CFrustum &frustum, const NLMISC::CMatrix &scaleMatrix, float x, float y, float depth, uint32 i, float xmin, float ymin, float xmax, float ymax); void printClipAtUnProjected(URenderStringBuffer &renderBuffer, class NL3D::CFrustum &frustum, const NLMISC::CMatrix &scaleMatrix, float x, float y, float depth, uint32 i, float xmin, float ymin, float xmax, float ymax);
void printClipAtOld (float x, float y, uint32 i, float xmin, float ymin, float xmax, float ymax); void printClipAtOld (float x, float y, uint32 i, float xmin, float ymin, float xmax, float ymax);
void printAt(float x, float y, const ucstring &ucstr) ; void printAt(float x, float y, NLMISC::CUtfStringView sv) ;
void printfAt(float x, float y, const char * format, ...) ; void printfAt(float x, float y, const char * format, ...) ;
void render3D(const CMatrix &mat, const ucstring &ucstr) ; void render3D(const CMatrix &mat, NLMISC::CUtfStringView sv) ;
void render3D(const CMatrix &mat, const char *format, ...) ; void render3D(const CMatrix &mat, const char *format, ...) ;
float getLastXBound() const ; float getLastXBound() const ;

@ -1,6 +1,9 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2019 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the

@ -1,6 +1,9 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the
@ -69,7 +72,7 @@ public:
// Holds info for glyphs displayed on screen // Holds info for glyphs displayed on screen
struct SLetterInfo struct SLetterInfo
{ {
ucchar Char; u32char Char;
sint Size; sint Size;
bool Embolden; bool Embolden;
bool Oblique; bool Oblique;
@ -94,7 +97,7 @@ public:
struct SLetterKey struct SLetterKey
{ {
ucchar Char; u32char Char;
sint Size; sint Size;
bool Embolden; bool Embolden;
bool Oblique; bool Oblique;

@ -4,7 +4,7 @@
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2010 Matt RAYKOWSKI (sfb) <matt.raykowski@gmail.com> // Copyright (C) 2010 Matt RAYKOWSKI (sfb) <matt.raykowski@gmail.com>
// Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de> // Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de>
// Copyright (C) 2013-2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2013-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -835,10 +835,10 @@ public:
/// \name Clipboard management /// \name Clipboard management
// @{ // @{
// Copy a string to system clipboard. // Copy a string to system clipboard.
virtual bool copyTextToClipboard(const ucstring &text) =0; virtual bool copyTextToClipboard(const std::string &text) =0;
// Paste a string from system clipboard. // Paste a string from system clipboard.
virtual bool pasteTextFromClipboard(ucstring &text) =0; virtual bool pasteTextFromClipboard(std::string &text) =0;
// @} // @}
public: public:

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2014-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -24,7 +24,7 @@
#include "nel/misc/rgba.h" #include "nel/misc/rgba.h"
#include "nel/misc/ucstring.h" #include "nel/misc/ucstring.h"
#include "nel/misc/matrix.h" #include "nel/misc/matrix.h"
#include "nel/misc/utf_string_view.h"
namespace NL3D { namespace NL3D {
@ -104,8 +104,11 @@ public:
*/ */
float StringLine; float StringLine;
CStringInfo() {StringWidth= StringHeight= StringLine= 0;} /// The length in characters
CStringInfo(float w, float h, float l) {StringWidth= w; StringHeight= h; StringLine = l;} size_t StringLength;
CStringInfo() { StringWidth = StringHeight = StringLine = 0; StringLength = 0; }
CStringInfo(float w, float h, float l, size_t len) { StringWidth = w; StringHeight = h; StringLine = l; StringLength = len; }
/** /**
* Get the string's origin * Get the string's origin
@ -248,7 +251,7 @@ public:
* \param an ucstring * \param an ucstring
* \return the index where computed string has been inserted * \return the index where computed string has been inserted
*/ */
virtual uint32 textPush (const ucstring &str) = 0; virtual uint32 textPush (NLMISC::CUtfStringView sv) = 0;
/** /**
* set the color of a string. * set the color of a string.
*/ */
@ -274,7 +277,12 @@ public:
* Get a string information from the ucstring * Get a string information from the ucstring
* The returned string info is in pixel size per default. * The returned string info is in pixel size per default.
*/ */
virtual CStringInfo getStringInfo (const ucstring &ucstr) = 0; virtual CStringInfo getStringInfo (NLMISC::CUtfStringView sv) = 0;
/**
* Get a string information from the ucstring
* The returned string info is in pixel size per default.
*/
virtual CStringInfo getStringInfo (NLMISC::CUtfStringView sv, size_t len) = 0;
/** /**
* empty the map * empty the map
*/ */
@ -299,7 +307,7 @@ public:
/** /**
* compute and print a ucstring at the location (2D method) x/y E [0,1] * compute and print a ucstring at the location (2D method) x/y E [0,1]
*/ */
virtual void printAt (float x, float y, const ucstring &ucstr) = 0; virtual void printAt (float x, float y, NLMISC::CUtfStringView sv) = 0;
/** /**
* compute and print a string at the location (2D method) x/y E [0,1] * compute and print a string at the location (2D method) x/y E [0,1]
*/ */
@ -309,7 +317,7 @@ public:
* compute and render a ucstring at the location (3D method) * compute and render a ucstring at the location (3D method)
* render3D() use UDriver Matrix context for Frustum/ViewMatrix, but use its own modelmatrix (mat). * render3D() use UDriver Matrix context for Frustum/ViewMatrix, but use its own modelmatrix (mat).
*/ */
virtual void render3D (const NLMISC::CMatrix &mat, const ucstring &ucstr) = 0; virtual void render3D (const NLMISC::CMatrix &mat, NLMISC::CUtfStringView sv) = 0;
/** /**
* compute and render a string at the location (3D method) * compute and render a string at the location (3D method)
* render3D() use UDriver Matrix context for Frustum/ViewMatrix, but use its own modelmatrix (mat). * render3D() use UDriver Matrix context for Frustum/ViewMatrix, but use its own modelmatrix (mat).

@ -1,6 +1,9 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/> // Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the
@ -38,7 +41,7 @@ namespace NLGUI
private: private:
// stylesheet currently parsed // stylesheet currently parsed
ucstring _Style; std::string _Style;
// keep track of current position in _Style // keep track of current position in _Style
size_t _Position; size_t _Position;
@ -70,49 +73,49 @@ namespace NLGUI
void preprocess(); void preprocess();
// parse selectors + combinators // parse selectors + combinators
std::vector<CCssSelector> parse_selector(const ucstring &sel, std::string &pseudoElement) const; std::vector<CCssSelector> parse_selector(const std::string &sel, std::string &pseudoElement) const;
// parse selector and style // parse selector and style
void parseRule(const ucstring &selectorString, const ucstring &styleString); void parseRule(const std::string &selectorString, const std::string &styleString);
inline bool is_eof() const inline bool is_eof() const
{ {
return _Position >= _Style.size(); return _Position >= _Style.size();
} }
inline bool is_whitespace(ucchar ch) const inline bool is_whitespace(char ch) const
{ {
return (ch == (ucchar)' ' || ch == (ucchar)'\t' || ch == (ucchar)'\n'); return (ch == ' ' || ch == '\t' || ch == '\n');
} }
inline bool is_hex(ucchar ch) const inline bool is_hex(char ch) const
{ {
return ((ch >= (ucchar)'0' && ch <= (ucchar)'9') || return ((ch >= '0' && ch <= '9') ||
(ch >= (ucchar)'a' && ch <= (ucchar)'f') || (ch >= 'a' && ch <= 'f') ||
(ch >= (ucchar)'A' && ch <= (ucchar)'F')); (ch >= 'A' && ch <= 'F'));
} }
inline bool maybe_escape() const inline bool maybe_escape() const
{ {
// escaping newline (\n) only allowed inside strings // escaping newline (\n) only allowed inside strings
return (_Style.size() - _Position) >= 1 && _Style[_Position] == (ucchar)'\\' && _Style[_Position+1] != '\n'; return (_Style.size() - _Position) >= 1 && _Style[_Position] == '\\' && _Style[_Position+1] != '\n';
} }
inline bool is_quote(ucchar ch) const inline bool is_quote(char ch) const
{ {
return ch== (ucchar)'"' || ch == (ucchar)'\''; return ch== '"' || ch == '\'';
} }
inline bool is_block_open(ucchar ch) const inline bool is_block_open(char ch) const
{ {
return ch == (ucchar)'{' || ch == (ucchar)'[' || ch == (ucchar)'('; return ch == (char)'{' || ch == (char)'[' || ch == (char)'(';
} }
inline bool is_block_close(ucchar ch, ucchar open) const inline bool is_block_close(char ch, char open) const
{ {
return ((open == '{' && ch == (ucchar)'}') || return ((open == '{' && ch == (char)'}') ||
(open == '[' && ch == (ucchar)']') || (open == '[' && ch == (char)']') ||
(open == '(' && ch == (ucchar)')')); (open == '(' && ch == (char)')'));
} }
inline bool is_comment_open() const inline bool is_comment_open() const
@ -120,25 +123,25 @@ namespace NLGUI
if (_Position+1 > _Style.size()) if (_Position+1 > _Style.size())
return false; return false;
return _Style[_Position] == (ucchar)'/' && _Style[_Position+1] == (ucchar)'*'; return _Style[_Position] == (char)'/' && _Style[_Position+1] == (char)'*';
} }
inline bool is_nonascii(ucchar ch) const inline bool is_nonascii(char ch) const
{ {
return ch >= 0x80 /*&& ch <= 255*/; return ch >= 0x80 /*&& ch <= 255*/;
} }
inline bool is_alpha(ucchar ch) const inline bool is_alpha(char ch) const
{ {
return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'); return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z');
} }
inline bool is_digit(ucchar ch) const inline bool is_digit(char ch) const
{ {
return ch >= '0' && ch <= '9'; return ch >= '0' && ch <= '9';
} }
inline bool is_nmchar(ucchar ch) const inline bool is_nmchar(char ch) const
{ {
// checking escape here does not check if next char is '\n' or not // checking escape here does not check if next char is '\n' or not
return ch == '_' || ch == '-' || is_alpha(ch) || is_digit(ch) || is_nonascii(ch) || ch == '\\'/*is_escape(ch)*/; return ch == '_' || ch == '-' || is_alpha(ch) || is_digit(ch) || is_nonascii(ch) || ch == '\\'/*is_escape(ch)*/;

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -85,9 +86,10 @@ namespace NLGUI
/// Get the ContextHelp for this control. Default is to return _ContextHelp /// Get the ContextHelp for this control. Default is to return _ContextHelp
virtual void getContextHelp(ucstring &help) const {help= _ContextHelp;} virtual void getContextHelp(std::string &help) const {help= _ContextHelp;}
virtual void getContextHelpAsUtf16(ucstring &help) const {help.fromUtf8(_ContextHelp);}
/// Get the ContextHelp for this control, with tooltip specific code. Default behaviour is identical to getContextHelp. /// Get the ContextHelp for this control, with tooltip specific code. Default behaviour is identical to getContextHelp.
virtual void getContextHelpToolTip(ucstring &help) const { getContextHelp(help); } virtual void getContextHelpToolTip(std::string &help) const { getContextHelp(help); }
// Get the name of the context help window. Default to "context_help" // Get the name of the context help window. Default to "context_help"
virtual std::string getContextHelpWindowName() const; virtual std::string getContextHelpWindowName() const;
/// Get the ContextHelp ActionHandler. If "", noop /// Get the ContextHelp ActionHandler. If "", noop
@ -123,8 +125,10 @@ namespace NLGUI
void setToolTipPosRef(THotSpot pos) { _ToolTipPosRef = pos;} void setToolTipPosRef(THotSpot pos) { _ToolTipPosRef = pos;}
/// replace the default contextHelp /// replace the default contextHelp
ucstring getDefaultContextHelp() const {return _ContextHelp;} std::string getDefaultContextHelp() const {return _ContextHelp;}
void setDefaultContextHelp(const ucstring &help) {_ContextHelp= help;} void setDefaultContextHelp(const std::string &help) {_ContextHelp= help;}
ucstring getDefaultContextHelpAsUtf16() const {return ucstring::makeFromUtf8(_ContextHelp);}
void setDefaultContextHelpAsUtf16(const ucstring &help) {_ContextHelp= help.toUtf8();}
void setOnContextHelp(const std::string &help) {_OnContextHelp= help;} void setOnContextHelp(const std::string &help) {_OnContextHelp= help;}
void setOnContextHelpAHParams(const std::string &p) {_OnContextHelpParams= p;} void setOnContextHelpAHParams(const std::string &p) {_OnContextHelpParams= p;}
@ -158,7 +162,7 @@ namespace NLGUI
int luaSetTooltipUtf8(CLuaState &ls); int luaSetTooltipUtf8(CLuaState &ls);
REFLECT_EXPORT_START(CCtrlBase, CViewBase) REFLECT_EXPORT_START(CCtrlBase, CViewBase)
REFLECT_UCSTRING("tooltip", getDefaultContextHelp, setDefaultContextHelp); REFLECT_UCSTRING("tooltip", getDefaultContextHelpAsUtf16, setDefaultContextHelpAsUtf16); // FIXME: Lua UTF-8
REFLECT_LUA_METHOD("setTooltipUtf8", luaSetTooltipUtf8); REFLECT_LUA_METHOD("setTooltipUtf8", luaSetTooltipUtf8);
REFLECT_EXPORT_END REFLECT_EXPORT_END
@ -171,7 +175,7 @@ namespace NLGUI
protected: protected:
// This is the ContextHelp filled by default in parse() // This is the ContextHelp filled by default in parse()
ucstring _ContextHelp; std::string _ContextHelp;
CStringShared _OnContextHelp; CStringShared _OnContextHelp;
CStringShared _OnContextHelpParams; CStringShared _OnContextHelpParams;
CStringShared _ToolTipSpecialParent; CStringShared _ToolTipSpecialParent;

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -96,8 +97,10 @@ namespace NLGUI
bool getTextModulateGlobalColorOver() const {return _TextModulateGlobalColorOver;} bool getTextModulateGlobalColorOver() const {return _TextModulateGlobalColorOver;}
void setTextModulateGlobalColorOver(bool v) {_TextModulateGlobalColorOver= v;} void setTextModulateGlobalColorOver(bool v) {_TextModulateGlobalColorOver= v;}
// Set text (noop if text id) // Set text (noop if text id)
void setText (const ucstring &text); void setText (const std::string &text);
ucstring getText () const; std::string getText () const;
void setTextAsUtf16 (const ucstring &text);
ucstring getTextAsUtf16 () const;
void setHardText (const std::string &text); void setHardText (const std::string &text);
std::string getHardText () const; std::string getHardText () const;
@ -140,7 +143,7 @@ namespace NLGUI
int luaGetViewText(CLuaState &ls); int luaGetViewText(CLuaState &ls);
REFLECT_EXPORT_START(CCtrlTextButton, CCtrlBaseButton) REFLECT_EXPORT_START(CCtrlTextButton, CCtrlBaseButton)
REFLECT_UCSTRING("uc_hardtext", getText, setText); REFLECT_UCSTRING("uc_hardtext", getTextAsUtf16, setTextAsUtf16);
REFLECT_STRING("hardtext", getHardText, setHardText); REFLECT_STRING("hardtext", getHardText, setHardText);
REFLECT_SINT32("text_x", getTextX, setTextX) REFLECT_SINT32("text_x", getTextX, setTextX)
REFLECT_SINT32("wmargin", getWMargin, setWMargin) REFLECT_SINT32("wmargin", getWMargin, setWMargin)

@ -3,7 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2015 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2015-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -60,13 +60,15 @@ namespace NLGUI
// Combo Texts // Combo Texts
void resetTexts(); void resetTexts();
void addText(const ucstring &text); void addText(const std::string &text);
void setText(uint i, const ucstring &text); void setText(uint i, const std::string &text);
void insertText(uint i, const ucstring &text); void insertText(uint i, const std::string &text);
const ucstring &getText(uint i) const; const std::string &getText(uint i) const;
ucstring getTextAsUtf16(uint i) const;
uint getTextId(uint i) const; uint getTextId(uint i) const;
uint getTextPos(uint nId) const; uint getTextPos(uint nId) const;
const ucstring &getTexture(uint i) const; const std::string &getTexture(uint i) const;
ucstring getTextureAsUtf16(uint i) const;
void setGrayed(uint i, bool g); void setGrayed(uint i, bool g);
bool getGrayed(uint i) const; bool getGrayed(uint i) const;
void removeText(uint nPos); void removeText(uint nPos);
@ -87,11 +89,13 @@ namespace NLGUI
std::string getSelectionText() const; std::string getSelectionText() const;
// view text // view text
void setViewText(const ucstring & text); void setViewText(const std::string & text);
ucstring getViewText() const; std::string getViewText() const;
void setViewTextAsUtf16(const ucstring &text) { setViewText(text.toUtf8()); }
ucstring getViewTextAsUtf16() const;
CViewText *getViewText(); CViewText *getViewText();
void setTexture(uint i, const ucstring &texture); void setTexture(uint i, const std::string &texture);
sint32 evalContentWidth() const; sint32 evalContentWidth() const;
@ -122,7 +126,7 @@ namespace NLGUI
REFLECT_LUA_METHOD("resetTexts", luaResetTexts) REFLECT_LUA_METHOD("resetTexts", luaResetTexts)
REFLECT_SINT32 ("selectionNb", getSelectionNb, setSelectionNb) REFLECT_SINT32 ("selectionNb", getSelectionNb, setSelectionNb)
REFLECT_STRING ("selection_text", getSelectionText, setSelectionText) REFLECT_STRING ("selection_text", getSelectionText, setSelectionText)
REFLECT_UCSTRING ("view_text", getViewText, setViewText) REFLECT_UCSTRING ("view_text", getViewTextAsUtf16, setViewTextAsUtf16) // FIXME: Better to have UTF-8
REFLECT_EXPORT_END REFLECT_EXPORT_END
@ -137,8 +141,8 @@ namespace NLGUI
// sint32 // sint32
CInterfaceProperty _Selection; CInterfaceProperty _Selection;
sint32 _NotLinkedToDBSelection; sint32 _NotLinkedToDBSelection;
std::vector<std::pair<uint, ucstring> > _Texts; std::vector<std::pair<uint, std::string> > _Texts;
std::vector<ucstring> _Textures; std::vector<std::string> _Textures;
std::vector<bool> _Grayed; std::vector<bool> _Grayed;
// Action Handler called on combo click // Action Handler called on combo click
@ -155,7 +159,7 @@ namespace NLGUI
CCtrlBaseButton *_SelectButton; CCtrlBaseButton *_SelectButton;
bool _IsExternViewText; bool _IsExternViewText;
ucstring _ExternViewText; std::string _ExternViewText;
private: private:

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -57,7 +58,7 @@ namespace NLGUI
CInterfaceProperty _NumberMax; CInterfaceProperty _NumberMax;
sint32 _Cache; sint32 _Cache;
sint32 _CacheMax; sint32 _CacheMax;
ucstring _EmptyText; std::string _EmptyText;
void buildTextFromCache(); void buildTextFromCache();
}; };

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -60,7 +61,7 @@ public:
keydown = 0, // a key has been press down. The key value is stored as a TKey keydown = 0, // a key has been press down. The key value is stored as a TKey
keyup, // a key has been released. The key value is stored as a TKey keyup, // a key has been released. The key value is stored as a TKey
keychar, // a key has been stroke. The key is a ucchar keychar, // a key has been stroke. The key is a ucchar
keystring, // a string has been sent. The string is a ucstring keystring, // a string has been sent. The string is a utf-8 string
unknown, // uninitialized event unknown, // uninitialized event
}; };
CEventDescriptorKey() : _KeyEvent(unknown), _CtrlState(false), _ShiftState(false), _AltState(false), _Char(0) CEventDescriptorKey() : _KeyEvent(unknown), _CtrlState(false), _ShiftState(false), _AltState(false), _Char(0)
@ -82,13 +83,13 @@ public:
return _Key; return _Key;
} }
// return the char that has been pressed. The key event type MUST be 'keychar', else => assert // return the char that has been pressed. The key event type MUST be 'keychar', else => assert
ucchar getChar() const u32char getChar() const
{ {
nlassert(_KeyEvent == keychar); nlassert(_KeyEvent == keychar);
return _Char; return _Char;
} }
// return the string that has been sent. The key event type MUST be 'keystring', else => assert // return the string that has been sent. The key event type MUST be 'keystring', else => assert
ucstring getString() const std::string getString() const
{ {
nlassert(_KeyEvent == keystring); nlassert(_KeyEvent == keystring);
return _String; return _String;
@ -141,9 +142,9 @@ private:
union union
{ {
NLMISC::TKey _Key; NLMISC::TKey _Key;
ucchar _Char; u32char _Char;
}; };
ucstring _String; std::string _String;
}; };
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -287,9 +288,11 @@ namespace NLGUI
REFLECT_STRING("title", getTitle, setTitle); REFLECT_STRING("title", getTitle, setTitle);
REFLECT_STRING("title_opened", getTitleOpened, setTitleOpened); REFLECT_STRING("title_opened", getTitleOpened, setTitleOpened);
REFLECT_STRING("title_closed", getTitleClosed, setTitleClosed); REFLECT_STRING("title_closed", getTitleClosed, setTitleClosed);
REFLECT_UCSTRING("uc_title_opened", getUCTitleOpened, setUCTitleOpened);
REFLECT_UCSTRING("uc_title_closed", getUCTitleClosed, setUCTitleClosed); REFLECT_UCSTRING("uc_title_opened", getUCTitleOpened, setUCTitleOpened); // FIXME: Lua UTF-8
REFLECT_UCSTRING("uc_title", getUCTitle, setUCTitle); REFLECT_UCSTRING("uc_title_closed", getUCTitleClosed, setUCTitleClosed); // FIXME: Lua UTF-8
REFLECT_UCSTRING("uc_title", getUCTitle, setUCTitle); // FIXME: Lua UTF-8
REFLECT_STRING("title_color", getTitleColorAsString, setTitleColorAsString); REFLECT_STRING("title_color", getTitleColorAsString, setTitleColorAsString);
REFLECT_SINT32("pop_min_h", getPopupMinH, setPopupMinH); REFLECT_SINT32("pop_min_h", getPopupMinH, setPopupMinH);
REFLECT_SINT32("pop_max_h", getPopupMaxH, setPopupMaxH); REFLECT_SINT32("pop_max_h", getPopupMaxH, setPopupMaxH);
@ -302,6 +305,8 @@ namespace NLGUI
REFLECT_BOOL("lockable", isLockable, setLockable); REFLECT_BOOL("lockable", isLockable, setLockable);
REFLECT_BOOL("locked", isLocked, setLocked); REFLECT_BOOL("locked", isLocked, setLocked);
REFLECT_BOOL("localize", isLocalize, setLocalize);
REFLECT_BOOL("header_active", getHeaderActive, setHeaderActive); REFLECT_BOOL("header_active", getHeaderActive, setHeaderActive);
REFLECT_BOOL("right_button_enabled", getRightButtonEnabled, setRightButtonEnabled); REFLECT_BOOL("right_button_enabled", getRightButtonEnabled, setRightButtonEnabled);
REFLECT_EXPORT_END REFLECT_EXPORT_END
@ -364,7 +369,7 @@ namespace NLGUI
bool isActiveSavable() const { return _ActiveSavable; } bool isActiveSavable() const { return _ActiveSavable; }
bool isLocalize() const { return _Localize; } bool isLocalize() const { return _Localize; }
void setLocalize(bool localize) { _Localize = localize; } void setLocalize(bool localize);
void setPopupX(sint32 x) { _PopupX = x; } void setPopupX(sint32 x) { _PopupX = x; }
void setPopupY(sint32 y) { _PopupY = y; } void setPopupY(sint32 y) { _PopupY = y; }
@ -477,8 +482,8 @@ namespace NLGUI
float _CurrentRolloverAlphaContainer; float _CurrentRolloverAlphaContainer;
float _CurrentRolloverAlphaContent; float _CurrentRolloverAlphaContent;
sint32 _LayerSetup; sint32 _LayerSetup;
ucstring _TitleTextOpened; std::string _TitleTextOpened;
ucstring _TitleTextClosed; std::string _TitleTextClosed;
CViewText *_TitleOpened; CViewText *_TitleOpened;
CViewText *_TitleClosed; CViewText *_TitleClosed;
sint32 _TitleDeltaMaxW; sint32 _TitleDeltaMaxW;
@ -636,6 +641,9 @@ namespace NLGUI
TTileClass convertTitleClass(const char *ptr); TTileClass convertTitleClass(const char *ptr);
void setTitledOpenedViewText();
void setTitledClosedViewText();
static COptionsContainerMove *getMoveOptions(); static COptionsContainerMove *getMoveOptions();
COptionsLayer *getContainerOptions(sint32 ls=-1); // Depends if overload by OptionsName or default used COptionsLayer *getContainerOptions(sint32 ls=-1); // Depends if overload by OptionsName or default used

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -63,26 +64,27 @@ namespace NLGUI
virtual bool handleEvent (const NLGUI::CEventDescriptor& eventDesc); virtual bool handleEvent (const NLGUI::CEventDescriptor& eventDesc);
/// Accessors /// Accessors
ucstring getInputString() const { return _InputString; } std::string getInputString() const;
const ucstring &getInputStringRef() const { return _InputString; } std::string getPrompt() const;
const ucstring &getPrompt() const { return _Prompt; } const ::u32string &getInputStringRef() const { return _InputString; }
const ::u32string &getPromptRef() const { return _Prompt; }
/** Set the prompt /** Set the prompt
* NB : line returns are encoded as '\n', not '\r\n' * NB : line returns are encoded as '\n', not '\r\n'
*/ */
void setPrompt(const ucstring &s) { _Prompt = s; } void setPrompt(const std::string &s);
void setInputString(const ucstring &str); void setInputString(const std::string &str);
void setInputStringRef(const ucstring &str) {_InputString = str; }; void setInputStringRef(const ::u32string &str) {_InputString = str; };
void setInputStringAsInt(sint32 val); void setInputStringAsInt(sint32 val);
sint32 getInputStringAsInt() const; sint32 getInputStringAsInt() const;
void setInputStringAsInt64(sint64 val); void setInputStringAsInt64(sint64 val);
sint64 getInputStringAsInt64() const; sint64 getInputStringAsInt64() const;
void setInputStringAsFloat(float val); void setInputStringAsFloat(float val);
float getInputStringAsFloat() const; float getInputStringAsFloat() const;
void setInputStringAsStdString(const std::string &str); void setInputStringAsUtf16(const ucstring &str);
std::string getInputStringAsStdString() const; ucstring getInputStringAsUtf16() const;
void setInputStringAsUtf8(const std::string &str); void setInputStringAsUtf32(const ::u32string &str);
std::string getInputStringAsUtf8() const; ::u32string getInputStringAsUtf32() const { return _InputString; }
void setColor(NLMISC::CRGBA col); void setColor(NLMISC::CRGBA col);
@ -97,7 +99,7 @@ namespace NLGUI
static CGroupEditBox *getMenuFather() { return _MenuFather; } static CGroupEditBox *getMenuFather() { return _MenuFather; }
void setCommand(const ucstring &command, bool execute); void setCommand(const std::string &command, bool execute);
// Stop parent from blinking // Stop parent from blinking
void stopParentBlink() { if (_Parent) _Parent->disableBlink(); } void stopParentBlink() { if (_Parent) _Parent->disableBlink(); }
@ -121,7 +123,7 @@ namespace NLGUI
sint32 getMaxHistoric() const {return _MaxHistoric;} sint32 getMaxHistoric() const {return _MaxHistoric;}
sint32 getCurrentHistoricIndex () const {return _CurrentHistoricIndex;} sint32 getCurrentHistoricIndex () const {return _CurrentHistoricIndex;}
void setCurrentHistoricIndex (sint32 index) {_CurrentHistoricIndex=index;} void setCurrentHistoricIndex (sint32 index) {_CurrentHistoricIndex=index;}
const ucstring &getHistoric(uint32 index) const {return _Historic[index];} const ::u32string &getHistoric(uint32 index) const {return _Historic[index];}
uint32 getNumHistoric() const {return (uint32)_Historic.size ();} uint32 getNumHistoric() const {return (uint32)_Historic.size ();}
// Get on change action handler // Get on change action handler
@ -139,7 +141,7 @@ namespace NLGUI
// Paste the selection into buffer // Paste the selection into buffer
void paste(); void paste();
// Write the string into buffer // Write the string into buffer
void writeString(const ucstring &str, bool replace = true, bool atEnd = true); void writeString(const std::string &str, bool replace = true, bool atEnd = true);
// Expand the expression (true if there was a '/' at the start of the line) // Expand the expression (true if there was a '/' at the start of the line)
bool expand(); bool expand();
@ -170,7 +172,7 @@ namespace NLGUI
virtual void onKeyboardCaptureLost(); virtual void onKeyboardCaptureLost();
// set the input string as "default". will be reseted at first click (used for user information) // set the input string as "default". will be reseted at first click (used for user information)
void setDefaultInputString(const ucstring &str); void setDefaultInputString(const std::string &str);
// For Interger and PositiveInteger, can specify min and max values // For Interger and PositiveInteger, can specify min and max values
void setIntegerMinValue(sint32 minValue) {_IntegerMinValue=minValue;} void setIntegerMinValue(sint32 minValue) {_IntegerMinValue=minValue;}
@ -189,8 +191,8 @@ namespace NLGUI
REFLECT_LUA_METHOD("setSelectionAll", luaSetSelectionAll); REFLECT_LUA_METHOD("setSelectionAll", luaSetSelectionAll);
REFLECT_LUA_METHOD("setFocusOnText", luaSetFocusOnText); REFLECT_LUA_METHOD("setFocusOnText", luaSetFocusOnText);
REFLECT_LUA_METHOD("cancelFocusOnText", luaCancelFocusOnText); REFLECT_LUA_METHOD("cancelFocusOnText", luaCancelFocusOnText);
REFLECT_STRING("input_string", getInputStringAsStdString, setInputStringAsStdString); REFLECT_STRING("input_string", getInputString, setInputString);
REFLECT_UCSTRING("uc_input_string", getInputString, setInputString); REFLECT_UCSTRING("uc_input_string", getInputStringAsUtf16, setInputStringAsUtf16);
REFLECT_EXPORT_END REFLECT_EXPORT_END
/** Restore the original value of the edit box. /** Restore the original value of the edit box.
@ -228,17 +230,17 @@ namespace NLGUI
NLMISC::CRGBA _BackSelectColor; NLMISC::CRGBA _BackSelectColor;
// Text info // Text info
ucstring _Prompt; ::u32string _Prompt;
ucstring _InputString; ::u32string _InputString;
CViewText *_ViewText; CViewText *_ViewText;
// undo / redo // undo / redo
ucstring _StartInputString; // value of the input string when focus was acuired first ::u32string _StartInputString; // value of the input string when focus was acuired first
ucstring _ModifiedInputString; ::u32string _ModifiedInputString;
// Historic info // Historic info
typedef std::deque<ucstring> THistoric; typedef std::deque<::u32string> THistoric;
THistoric _Historic; THistoric _Historic;
uint32 _MaxHistoric; uint32 _MaxHistoric;
sint32 _CurrentHistoricIndex; sint32 _CurrentHistoricIndex;
@ -275,7 +277,7 @@ namespace NLGUI
bool _CanRedo : 1; bool _CanRedo : 1;
bool _CanUndo : 1; bool _CanUndo : 1;
std::vector<char> _NegativeFilter; std::vector<u32char> _NegativeFilter;
sint _CursorTexID; sint _CursorTexID;
sint32 _CursorWidth; sint32 _CursorWidth;
@ -298,13 +300,13 @@ namespace NLGUI
void handleEventString(const NLGUI::CEventDescriptorKey &event); void handleEventString(const NLGUI::CEventDescriptorKey &event);
void setup(); void setup();
void triggerOnChangeAH(); void triggerOnChangeAH();
void appendStringFromClipboard(const ucstring &str); void appendStringFromClipboard(const std::string &str);
ucstring getSelection(); std::string getSelection();
static CGroupEditBox *_MenuFather; static CGroupEditBox *_MenuFather;
static bool isValidAlphaNumSpace(ucchar c) static bool isValidAlphaNumSpace(u32char c)
{ {
if (c > 255) return false; if (c > 255) return false;
char ac = (char) c; char ac = (char) c;
@ -314,7 +316,7 @@ namespace NLGUI
ac==' '; ac==' ';
} }
static bool isValidAlphaNum(ucchar c) static bool isValidAlphaNum(u32char c)
{ {
if (c > 255) return false; if (c > 255) return false;
char ac = (char) c; char ac = (char) c;
@ -323,7 +325,7 @@ namespace NLGUI
(ac >= 'A' && ac <= 'Z'); (ac >= 'A' && ac <= 'Z');
} }
static bool isValidAlpha(ucchar c) static bool isValidAlpha(u32char c)
{ {
if (c > 255) return false; if (c > 255) return false;
char ac = (char) c; char ac = (char) c;
@ -331,13 +333,13 @@ namespace NLGUI
(ac >= 'A' && ac <= 'Z'); (ac >= 'A' && ac <= 'Z');
} }
static bool isValidPlayerNameChar(ucchar c) static bool isValidPlayerNameChar(u32char c)
{ {
// valid player name (with possible shard prefix / suffix format // valid player name (with possible shard prefix / suffix format
return isValidAlpha(c) || c=='.' || c=='(' || c==')'; return isValidAlpha(c) || c=='.' || c=='(' || c==')';
} }
static bool isValidFilenameChar(ucchar c) static bool isValidFilenameChar(u32char c)
{ {
if (c == '\\' || if (c == '\\' ||
c == '/' || c == '/' ||
@ -351,12 +353,12 @@ namespace NLGUI
return true; return true;
} }
// //
bool isFiltered(ucchar c) bool isFiltered(u32char c)
{ {
uint length = (uint)_NegativeFilter.size(); ptrdiff_t length = _NegativeFilter.size();
for (uint k = 0; k < length; ++k) for (ptrdiff_t k = 0; k < length; ++k)
{ {
if ((ucchar) _NegativeFilter[k] == c) return true; if (_NegativeFilter[k] == c) return true;
} }
return false; return false;
} }

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2019-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -320,16 +321,16 @@ namespace NLGUI
void clearContext(); void clearContext();
// Translate a char // Translate a char
bool translateChar(ucchar &output, ucchar input, ucchar lastChar) const; bool translateChar(u32char &output, u32char input, u32char lastChar) const;
// Add a string in the current paragraph // Add a string in the current paragraph
void addString(const ucstring &str); void addString(const std::string &str);
// Add an image in the current paragraph // Add an image in the current paragraph
void addImage(const std::string &id, const std::string &img, bool reloadImg=false, const CStyleParams &style = CStyleParams()); void addImage(const std::string &id, const std::string &img, bool reloadImg=false, const CStyleParams &style = CStyleParams());
// Add a text area in the current paragraph // Add a text area in the current paragraph
CInterfaceGroup *addTextArea (const std::string &templateName, const char *name, uint rows, uint cols, bool multiLine, const ucstring &content, uint maxlength); CInterfaceGroup *addTextArea (const std::string &templateName, const char *name, uint rows, uint cols, bool multiLine, const std::string &content, uint maxlength);
// Add a combo box in the current paragraph // Add a combo box in the current paragraph
CDBGroupComboBox *addComboBox(const std::string &templateName, const char *name); CDBGroupComboBox *addComboBox(const std::string &templateName, const char *name);
@ -350,9 +351,9 @@ namespace NLGUI
void flushString(); void flushString();
// Set the title // Set the title
void setTitle (const ucstring &title);
void setTitle (const std::string &title); void setTitle (const std::string &title);
std::string getTitle() const; std::string getTitle() const;
void setContainerTitle (const std::string &title);
// Lookup a url in local file system // Lookup a url in local file system
bool lookupLocalFile (std::string &result, const char *url, bool isUrl); bool lookupLocalFile (std::string &result, const char *url, bool isUrl);
@ -392,10 +393,10 @@ namespace NLGUI
bool _TrustedDomain; bool _TrustedDomain;
// Title prefix // Title prefix
ucstring _TitlePrefix; std::string _TitlePrefix;
// Title string // Title string
ucstring _TitleString; std::string _TitleString;
// Need to browse next update coords.. // Need to browse next update coords..
bool _BrowseNextTime; bool _BrowseNextTime;
@ -644,7 +645,7 @@ namespace NLGUI
std::string Name; std::string Name;
// Variable value // Variable value
ucstring Value; std::string Value;
// Text area group // Text area group
CInterfaceGroup *TextArea; CInterfaceGroup *TextArea;
@ -747,7 +748,7 @@ namespace NLGUI
// Current node is a text area // Current node is a text area
bool _TextArea; bool _TextArea;
std::string _TextAreaTemplate; std::string _TextAreaTemplate;
ucstring _TextAreaContent; std::string _TextAreaContent;
std::string _TextAreaName; std::string _TextAreaName;
uint _TextAreaRow; uint _TextAreaRow;
uint _TextAreaCols; uint _TextAreaCols;
@ -755,7 +756,7 @@ namespace NLGUI
// current mode is in select option // current mode is in select option
bool _SelectOption; bool _SelectOption;
ucstring _SelectOptionStr; std::string _SelectOptionStr;
// Current node is a object // Current node is a object
std::string _ObjectType; std::string _ObjectType;
@ -765,7 +766,7 @@ namespace NLGUI
std::string _TextAreaScript; std::string _TextAreaScript;
// Get last char // Get last char
ucchar getLastChar() const; u32char getLastChar() const;
// Current link view // Current link view
class CViewLink *_CurrentViewLink; class CViewLink *_CurrentViewLink;
@ -826,7 +827,7 @@ namespace NLGUI
void spliceFragment(std::list<CHtmlElement>::iterator src); void spliceFragment(std::list<CHtmlElement>::iterator src);
// decode all HTML entities // decode all HTML entities
static ucstring decodeHTMLEntities(const ucstring &str); static std::string decodeHTMLEntities(const std::string &str);
struct CDataImageDownload struct CDataImageDownload
{ {

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -67,13 +68,13 @@ namespace NLGUI
* \param line : text to be added * \param line : text to be added
* \param color : text color * \param color : text color
*/ */
void addTextChild (const ucstring& line,const NLMISC::CRGBA &textColor, bool multiLine = true); void addTextChild (const std::string& line,const NLMISC::CRGBA &textColor, bool multiLine = true);
/** /**
* add a text child element to the group, using the text template * add a text child element to the group, using the text template
* \param line : text to be added * \param line : text to be added
*/ */
void addTextChild (const ucstring& line, bool multiLine = true); void addTextChild (const std::string& line, bool multiLine = true);
/// Same as adding a text child but the text will be taken from the string manager /// Same as adding a text child but the text will be taken from the string manager
void addTextChildID (uint32 id, bool multiLine = true); void addTextChildID (uint32 id, bool multiLine = true);

@ -3,7 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2014-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -122,12 +122,12 @@ namespace NLGUI
// retrieve the index of a line from its id (-1 if not found) // retrieve the index of a line from its id (-1 if not found)
sint getLineFromId(const std::string &id); sint getLineFromId(const std::string &id);
CViewTextMenu* addLine (const ucstring &name, const std::string &ah, CViewTextMenu* addLine (const std::string &name, const std::string &ah,
const std::string &params, const std::string &id="", const std::string &params, const std::string &id="",
const std::string &cond = std::string(), const std::string &texture="", const std::string &cond = std::string(), const std::string &texture="",
bool checkable = false, bool checked = false, bool formatted = false bool checkable = false, bool checked = false, bool formatted = false
); );
CViewTextMenu* addLineAtIndex(uint index, const ucstring &name, const std::string &ah, CViewTextMenu* addLineAtIndex(uint index, const std::string &name, const std::string &ah,
const std::string &params, const std::string &id="", const std::string &params, const std::string &id="",
const std::string &cond = std::string(), const std::string &texture="", const std::string &cond = std::string(), const std::string &texture="",
bool checkable = false, bool checked = false, bool formatted = false bool checkable = false, bool checked = false, bool formatted = false
@ -332,12 +332,7 @@ namespace NLGUI
virtual void setActive (bool state); virtual void setActive (bool state);
virtual bool isWindowUnder (sint32 x, sint32 y); virtual bool isWindowUnder (sint32 x, sint32 y);
// add line with a string, for backward compatibility
void addLine (const std::string &name, const std::string &ah, const std::string &params,
const std::string &id = std::string(),
const std::string &cond = std::string(), const std::string &texture="",
bool checkable = false, bool checked = false);
uint getNumLine() const; uint getNumLine() const;
void deleteLine(uint index); void deleteLine(uint index);
const std::string getActionHandler(uint lineIndex) const; const std::string getActionHandler(uint lineIndex) const;
@ -350,12 +345,12 @@ namespace NLGUI
void setRightClickHandler(uint lineIndex, const std::string &ah = ""); void setRightClickHandler(uint lineIndex, const std::string &ah = "");
void setRightClickHandlerParam(uint lineIndex, const std::string &params = ""); void setRightClickHandlerParam(uint lineIndex, const std::string &params = "");
void addLine (const ucstring &name, const std::string &ah = "", const std::string &params = "", void addLine (const std::string &name, const std::string &ah = "", const std::string &params = "",
const std::string &id = std::string(), const std::string &id = std::string(),
const std::string &cond = std::string(), const std::string &texture="", const std::string &cond = std::string(), const std::string &texture="",
bool checkable = false, bool checked = false bool checkable = false, bool checked = false
); );
void addLineAtIndex (uint index, const ucstring &name, const std::string &ah = "", const std::string &params = "", void addLineAtIndex (uint index, const std::string &name, const std::string &ah = "", const std::string &params = "",
const std::string &id = std::string(), const std::string &id = std::string(),
const std::string &cond = std::string(), const std::string &texture="", const std::string &cond = std::string(), const std::string &texture="",
bool checkable = false, bool checked = false bool checkable = false, bool checked = false

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -84,13 +85,13 @@ namespace NLGUI
* \param line : text to be added * \param line : text to be added
* \param color : text color * \param color : text color
*/ */
void addTextChild (const ucstring& line,const NLMISC::CRGBA &textColor, bool multiLine = true); void addTextChild (const std::string& line,const NLMISC::CRGBA &textColor, bool multiLine = true);
/** /**
* add a text child element to the group, using the text template * add a text child element to the group, using the text template
* \param line : text to be added * \param line : text to be added
*/ */
void addTextChild (const ucstring& line, bool multiLine = true); void addTextChild (const std::string& line, bool multiLine = true);
/// Same as adding a text child but the text will be taken from the string manager /// Same as adding a text child but the text will be taken from the string manager
void addTextChildID (uint32 id, bool multiLine = true); void addTextChildID (uint32 id, bool multiLine = true);

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -60,7 +61,7 @@ namespace NLGUI
bool Show; // If false, the node is not displayed (true default, Root ignored) bool Show; // If false, the node is not displayed (true default, Root ignored)
sint32 YDecal; sint32 YDecal;
// Text // Text
ucstring Text; // Internationalized displayed text std::string Text; // Internationalized displayed text
sint32 FontSize; // If -1 (default), then take the groupTree one sint32 FontSize; // If -1 (default), then take the groupTree one
NLMISC::CRGBA Color; NLMISC::CRGBA Color;
// Template // Template
@ -112,8 +113,10 @@ namespace NLGUI
std::string getBitmap() const { return Bitmap; } std::string getBitmap() const { return Bitmap; }
void setOpened(bool opened) { Opened = opened; } void setOpened(bool opened) { Opened = opened; }
bool getOpened() const { return Opened; } bool getOpened() const { return Opened; }
void setText(const ucstring &text) { Text = text; } void setText(const std::string &text) { Text = text; }
const ucstring& getText() const { return Text; } const std::string& getText() const { return Text; }
void setTextAsUtf16(const ucstring &text) { Text = text.toUtf8(); }
ucstring getTextAsUtf16() const { return ucstring::makeFromUtf8(Text); }
sint32 getFontSize() const { return FontSize; } sint32 getFontSize() const { return FontSize; }
void setFontSize(sint32 value) { FontSize = value; } void setFontSize(sint32 value) { FontSize = value; }
sint32 getYDecal() const { return YDecal; } sint32 getYDecal() const { return YDecal; }
@ -181,7 +184,7 @@ namespace NLGUI
REFLECT_STRING("AHParamsClose", getAHParamsClose, setAHParamsClose); REFLECT_STRING("AHParamsClose", getAHParamsClose, setAHParamsClose);
REFLECT_BOOL("Opened", getOpened, setOpened); REFLECT_BOOL("Opened", getOpened, setOpened);
REFLECT_BOOL("Show", getShow, setShow); REFLECT_BOOL("Show", getShow, setShow);
REFLECT_UCSTRING_REF("Text", getText, setText); REFLECT_UCSTRING("Text", getTextAsUtf16, setTextAsUtf16); // FIXME: Lua UTF-8
// lua // lua
REFLECT_LUA_METHOD("getNumChildren", luaGetNumChildren); REFLECT_LUA_METHOD("getNumChildren", luaGetNumChildren);
REFLECT_LUA_METHOD("getChild", luaGetChild); REFLECT_LUA_METHOD("getChild", luaGetChild);

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2019 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -59,16 +60,15 @@ namespace NLGUI
bool getBool() const; bool getBool() const;
sint64 getInteger() const; sint64 getInteger() const;
double getDouble() const; double getDouble() const;
std::string getString() const; const std::string &getString() const;
NLMISC::CRGBA getRGBA() const; NLMISC::CRGBA getRGBA() const;
const ucstring &getUCString() const;
CInterfaceExprUserType *getUserType() const; CInterfaceExprUserType *getUserType() const;
// set // set
void setBool(bool value) { clean(); _Type = Boolean; _BoolValue = value; } void setBool(bool value) { clean(); _Type = Boolean; _BoolValue = value; }
void setInteger(sint64 value) { clean(); _Type = Integer; _IntegerValue = value; } void setInteger(sint64 value) { clean(); _Type = Integer; _IntegerValue = value; }
void setDouble(double value) { clean(); _Type = Double; _DoubleValue = value; } void setDouble(double value) { clean(); _Type = Double; _DoubleValue = value; }
void setString(const std::string &value) { clean(); _Type = String; _StringValue = value; } void setString(const std::string &value) { clean(); _Type = String; _StringValue = value; }
void setUCString(const ucstring &value) { clean(); _Type = String; _StringValue = value; } void setString(const char *value) { clean(); _Type = String; _StringValue = value; }
void setRGBA(NLMISC::CRGBA value) { clean(); _Type = RGBA; _RGBAValue = (uint32)(value.R+(value.G<<8)+(value.B<<16)+(value.A<<24)); } void setRGBA(NLMISC::CRGBA value) { clean(); _Type = RGBA; _RGBAValue = (uint32)(value.R+(value.G<<8)+(value.B<<16)+(value.A<<24)); }
void setUserType(CInterfaceExprUserType *value); void setUserType(CInterfaceExprUserType *value);
// reset this object to initial state (no type) // reset this object to initial state (no type)
@ -99,7 +99,7 @@ namespace NLGUI
CInterfaceExprUserType *_UserTypeValue; CInterfaceExprUserType *_UserTypeValue;
uint32 _RGBAValue; uint32 _RGBAValue;
}; };
ucstring _StringValue; // well, can't fit in union, unless we do some horrible hack.. std::string _StringValue; // well, can't fit in union, unless we do some horrible hack..
private: private:
const char *evalBoolean(const char *expr); const char *evalBoolean(const char *expr);
const char *evalNumber(const char *expr); const char *evalNumber(const char *expr);

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2019 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

@ -2,8 +2,8 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2013-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -379,6 +379,10 @@ namespace NLGUI
TSmallScriptCache _SmallScriptCache; TSmallScriptCache _SmallScriptCache;
static const char * _NELSmallScriptTableName; static const char * _NELSmallScriptTableName;
#ifdef _WIN32
HMODULE m_LuaSocket;
#endif
private: private:
// this object isn't intended to be copied // this object isn't intended to be copied
CLuaState(const CLuaState &/* other */):NLMISC::CRefCount() { nlassert(0); } CLuaState(const CLuaState &/* other */):NLMISC::CRefCount() { nlassert(0); }

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2013-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -263,8 +263,8 @@ inline lua_Integer CLuaState::toInteger(int index)
if (!isnum) if (!isnum)
{ {
lua_Number d = lua_tonumber(_State, index); lua_Number d = lua_tonumber(_State, index);
nlwarning("Lua: Unable to convert Lua number %lf to integer", d);
res = (lua_Integer)d; res = (lua_Integer)d;
nlwarning("Lua: Converting lua_Number %lf to lua_Integer %i", d, (int)res);
} }
return res; return res;
#else #else

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2019 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -21,11 +22,9 @@
#define STRING_CASE_H #define STRING_CASE_H
#include "nel/misc/types_nl.h" #include "nel/misc/types_nl.h"
#include "nel/misc/ucstring.h"
namespace NLGUI namespace NLGUI
{ {
enum TCaseMode enum TCaseMode
{ {
CaseNormal = 0, // Nothing done CaseNormal = 0, // Nothing done
@ -37,10 +36,7 @@ namespace NLGUI
CaseCount CaseCount
}; };
void setCase( std::string &str, TCaseMode mode );
void setCase( ucstring &str, TCaseMode mode );
} }
#endif #endif

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -55,13 +56,16 @@ namespace NLGUI
bool getStringMode() const {return _StringMode;} bool getStringMode() const {return _StringMode;}
// Set cursor string // Set cursor string
void setString (const ucstring &str); void setString (const std::string &str);
// TEMP PATCH // TEMP PATCH
void setCursor (const std::string &name) void setCursor (const std::string &name)
{ {
_TxDefault = name; if (_TxDefault != name)
_TxIdDefault = -2; {
_TxDefault = name;
_TxIdDefault = -2;
}
} }
// TEMP PATCH // TEMP PATCH
@ -126,14 +130,14 @@ namespace NLGUI
bool _ForceStringMode; bool _ForceStringMode;
CInterfaceGroup *_StringCursor; CInterfaceGroup *_StringCursor;
CInterfaceGroup *_StringCursorHardware; CInterfaceGroup *_StringCursorHardware;
ucstring _ContextString; std::string _ContextString;
// draw current cursor with the given texture, or, if in hardware mode, change the hardware cursor shape // draw current cursor with the given texture, or, if in hardware mode, change the hardware cursor shape
void drawCursor(sint32 texId, NLMISC::CRGBA col, uint8 rot); void drawCursor(sint32 texId, NLMISC::CRGBA col, uint8 rot);
private: private:
// set the string into frame for software or hardware version // set the string into frame for software or hardware version
void setString (const ucstring &str, CInterfaceGroup *target); void setString(const std::string &str, CInterfaceGroup *target);
static bool hwMouse; static bool hwMouse;

@ -3,7 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2014-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -84,7 +84,10 @@ namespace NLGUI
/// Set /// Set
void setText (const ucstring &text); void setText(const std::string &text);
void setTextLocalized(const std::string &text, bool localized);
void setTextAsUtf16 (const ucstring &text);
void setLocalized(bool localized);
void setFontName (const std::string &name); void setFontName (const std::string &name);
void setFontSize (sint nFontSize, bool coef = true); void setFontSize (sint nFontSize, bool coef = true);
void setEmbolden (bool nEmbolden); void setEmbolden (bool nEmbolden);
@ -95,7 +98,8 @@ namespace NLGUI
void setShadowColor (const NLMISC::CRGBA &color); void setShadowColor (const NLMISC::CRGBA &color);
void setShadowOffset (sint x, sint y); void setShadowOffset (sint x, sint y);
void setLineMaxW (sint nMaxW, bool invalidate=true); void setLineMaxW (sint nMaxW, bool invalidate=true);
void setOverflowText(const ucstring &text) { _OverflowText = text; } void setOverflowText(const std::string &text) { _OverflowText = text; }
void setOverflowTextAsUtf16(const ucstring &text) { _OverflowText = text.toUtf8(); }
void setMultiLine (bool bMultiLine); void setMultiLine (bool bMultiLine);
void setMultiLineSpace (sint nMultiLineSpace); void setMultiLineSpace (sint nMultiLineSpace);
void setMultiLineMaxWOnly (bool state); void setMultiLineMaxWOnly (bool state);
@ -112,8 +116,10 @@ namespace NLGUI
void disableStringSelection(); void disableStringSelection();
/// Get /// Get
std::string getText() const { return _HardText.empty() ? _Text : _HardText; }
ucstring getText() const { return _Text; } ucstring getTextAsUtf16() const;
ucstring getHardTextAsUtf16() const;
bool isLocalized() const { return _Localized; }
sint getFontSize() const; sint getFontSize() const;
std::string getFontName() const { return _FontName; } std::string getFontName() const { return _FontName; }
bool getEmbolden() { return _Embolden; } bool getEmbolden() { return _Embolden; }
@ -124,7 +130,7 @@ namespace NLGUI
NLMISC::CRGBA getShadowColor() { return _ShadowColor; } NLMISC::CRGBA getShadowColor() { return _ShadowColor; }
void getShadowOffset(sint &x, sint &y) { x = _ShadowX; y = _ShadowY; } void getShadowOffset(sint &x, sint &y) { x = _ShadowX; y = _ShadowY; }
sint getLineMaxW() const { return _LineMaxW; } sint getLineMaxW() const { return _LineMaxW; }
ucstring getOverflowText() const { return _OverflowText; } ucstring getOverflowTextAsUtf16() const { return _OverflowText; }
bool getMultiLine() const { return _MultiLine; } bool getMultiLine() const { return _MultiLine; }
sint getMultiLineSpace() const { return _MultiLineSpace; } sint getMultiLineSpace() const { return _MultiLineSpace; }
bool getMultiLineMaxWOnly() const { return _MultiLineMaxWOnly; } bool getMultiLineMaxWOnly() const { return _MultiLineMaxWOnly; }
@ -174,8 +180,9 @@ namespace NLGUI
/// From a line number, get the character at which it ends (not including any '\n' ), or -1 if invalid /// From a line number, get the character at which it ends (not including any '\n' ), or -1 if invalid
void getLineEndIndex(uint line, sint &index, bool &endOfPreviousLine) const; void getLineEndIndex(uint line, sint &index, bool &endOfPreviousLine) const;
std::string getHardText() const { std::string result; _Text.toString (result); return result; } std::string getHardText() const { return _HardText.empty() ? _Text : _HardText; }
void setHardText (const std::string &ht); void setHardText (const std::string &ht); //< Localizes strings starting with "ui"
void setHardTextAsUtf16(const ucstring &ht);
std::string getColorAsString() const; std::string getColorAsString() const;
void setColorAsString(const std::string &ht); void setColorAsString(const std::string &ht);
@ -188,9 +195,11 @@ namespace NLGUI
/** Setup a Text with Format Tags. Text is store without color/format tags, and special array is allocated for Format association /** Setup a Text with Format Tags. Text is store without color/format tags, and special array is allocated for Format association
*/ */
void setTextFormatTaged(const ucstring &text); void setTextFormatTaged(const std::string &text);
void setTextFormatTagedAsUtf16(const ucstring &text);
void setSingleLineTextFormatTaged(const ucstring &text); void setSingleLineTextFormatTaged(const std::string &text);
void setSingleLineTextFormatTagedAsUtf16(const ucstring &text);
// Remove end space // Remove end space
void removeEndSpaces(); void removeEndSpaces();
@ -216,10 +225,13 @@ namespace NLGUI
int luaSetLineMaxW(CLuaState &ls); int luaSetLineMaxW(CLuaState &ls);
REFLECT_EXPORT_START(CViewText, CViewBase) REFLECT_EXPORT_START(CViewText, CViewBase)
REFLECT_STRING("text_raw", getText, setText);
REFLECT_STRING("hardtext", getHardText, setHardText); REFLECT_STRING("hardtext", getHardText, setHardText);
REFLECT_UCSTRING("uc_hardtext", getText, setText); REFLECT_BOOL ("localize", isLocalized, setLocalized);
REFLECT_UCSTRING("uc_hardtext_format", getText, setTextFormatTaged); // REFLECT_UCSTRING("uc_text", getTextAsUtf16, setTextAsUtf16); // Deprecate uc_ functions
REFLECT_UCSTRING("uc_hardtext_single_line_format", getText, setSingleLineTextFormatTaged); REFLECT_UCSTRING("uc_hardtext", getHardTextAsUtf16, setHardTextAsUtf16);
REFLECT_UCSTRING("uc_hardtext_format", getTextAsUtf16, setTextFormatTagedAsUtf16); // FIXME: Name doesn't make sense
REFLECT_UCSTRING("uc_hardtext_single_line_format", getTextAsUtf16, setSingleLineTextFormatTagedAsUtf16); // FIXME: Name doesn't make sense
REFLECT_STRING ("color", getColorAsString, setColorAsString); REFLECT_STRING ("color", getColorAsString, setColorAsString);
REFLECT_RGBA ("color_rgba", getColorRGBA, setColorRGBA); REFLECT_RGBA ("color_rgba", getColorRGBA, setColorRGBA);
REFLECT_SINT32 ("alpha", getAlpha, setAlpha); REFLECT_SINT32 ("alpha", getAlpha, setAlpha);
@ -228,7 +240,6 @@ namespace NLGUI
REFLECT_LUA_METHOD("setLineMaxW", luaSetLineMaxW); REFLECT_LUA_METHOD("setLineMaxW", luaSetLineMaxW);
REFLECT_EXPORT_END REFLECT_EXPORT_END
virtual void serial(NLMISC::IStream &f); virtual void serial(NLMISC::IStream &f);
// Sets the parent element // Sets the parent element
@ -236,9 +247,12 @@ namespace NLGUI
void setParentElm( CInterfaceElement *parent ){ _ParentElm = parent; } void setParentElm( CInterfaceElement *parent ){ _ParentElm = parent; }
protected: protected:
std::string _HardtextFormat;
/// Text to display. /// Text to display.
ucstring _Text; std::string _HardTextFormat;
std::string _HardText;
std::string _Text;
mutable sint _TextLength;
bool _Localized;
/// index of the computed String associated to this text control /// index of the computed String associated to this text control
uint _Index; uint _Index;
/// info on the computed String associated to this text control /// info on the computed String associated to this text control
@ -253,8 +267,8 @@ namespace NLGUI
// width of the font in pixel. Just a Hint for tabing format (computed with '_') // width of the font in pixel. Just a Hint for tabing format (computed with '_')
float _FontWidth; float _FontWidth;
// strings to use when computing font size // strings to use when computing font size
ucstring _FontSizingChars; std::string _FontSizingChars;
ucstring _FontSizingFallback; std::string _FontSizingFallback;
// height of the font in pixel. // height of the font in pixel.
// use getFontHeight // use getFontHeight
float _FontHeight; float _FontHeight;
@ -278,7 +292,7 @@ namespace NLGUI
sint32 _LineMaxW; sint32 _LineMaxW;
/// For single line, true if the text is clamped (ie displayed with "...") /// For single line, true if the text is clamped (ie displayed with "...")
bool _SingleLineTextClamped; bool _SingleLineTextClamped;
ucstring _OverflowText; std::string _OverflowText;
/// Multiple lines handling /// Multiple lines handling
bool _MultiLine; bool _MultiLine;
@ -339,7 +353,7 @@ namespace NLGUI
public: public:
// default ctor // default ctor
CWord(uint numSpaces = 0) : Index(0), NumSpaces(numSpaces) {} CWord(uint numSpaces = 0) : Index(0), NumSpaces(numSpaces) {}
ucstring Text; std::string Text;
uint Index; // index of the info for this word uint Index; // index of the info for this word
NL3D::UTextContext::CStringInfo Info; NL3D::UTextContext::CStringInfo Info;
uint NumSpaces; // number of spaces before this word uint NumSpaces; // number of spaces before this word
@ -347,7 +361,7 @@ namespace NLGUI
CFormatInfo Format; CFormatInfo Format;
public: public:
// build from a string, using the current text context // build from a string, using the current text context
void build(const ucstring &text, NL3D::UTextContext &textContext, uint numSpaces= 0); void build(const std::string &text, NL3D::UTextContext &textContext, uint numSpaces= 0);
}; };
typedef std::vector<CWord> TWordVect; typedef std::vector<CWord> TWordVect;
@ -360,7 +374,7 @@ namespace NLGUI
// Clear the line & remove text contexts // Clear the line & remove text contexts
void clear(NL3D::UTextContext &textContext); void clear(NL3D::UTextContext &textContext);
// Add a new word (and its context) in the line + a number of spaces to append at the end of the line // Add a new word (and its context) in the line + a number of spaces to append at the end of the line
void addWord(const ucstring &word, uint numSpaces, const CFormatInfo &wordFormat, float fontWidth, NL3D::UTextContext &textContext); void addWord(const std::string &word, uint numSpaces, const CFormatInfo &wordFormat, float fontWidth, NL3D::UTextContext &textContext);
void addWord(const CWord &word, float fontWidth); void addWord(const CWord &word, float fontWidth);
uint getNumWords() const { return (uint)_Words.size(); } uint getNumWords() const { return (uint)_Words.size(); }
CWord &getWord(uint index) { return _Words[index]; } CWord &getWord(uint index) { return _Words[index]; }
@ -434,7 +448,9 @@ namespace NLGUI
void setup (); void setup ();
void setupDefault (); void setupDefault ();
void setStringSelectionSkipingSpace(uint stringId, const ucstring &text, sint charStart, sint charEnd); void setTextLocalized(const std::string &text);
void setStringSelectionSkipingSpace(uint stringId, const std::string &text, sint charStart, sint charEnd);
// void pushString(const ucstring &str, bool deleteSpaceAtStart = false); // void pushString(const ucstring &str, bool deleteSpaceAtStart = false);
@ -442,7 +458,7 @@ namespace NLGUI
void onInvalidateContent(); void onInvalidateContent();
// may append a new line, and append a word to the last line (no spaces) // may append a new line, and append a word to the last line (no spaces)
void flushWordInLine(ucstring &ucCurrentWord, bool &linePushed, const CFormatInfo &wordFormat); void flushWordInLine(std::string &ucCurrentWord, bool &linePushed, const CFormatInfo &wordFormat);
// Clear all the lines and free their datas // Clear all the lines and free their datas
void clearLines(); void clearLines();
// Update in the case of a multiline text // Update in the case of a multiline text
@ -456,7 +472,7 @@ namespace NLGUI
void addDontClipWordLine(std::vector<CWord> &currLine); void addDontClipWordLine(std::vector<CWord> &currLine);
// FormatTag build. // FormatTag build.
static void buildFormatTagText(const ucstring &text, ucstring &textBuild, std::vector<CFormatTag> &formatTags, std::vector<ucstring> &tooltips); static void buildFormatTagText(const std::string &text, std::string &textBuild, std::vector<CFormatTag> &formatTags, std::vector<std::string> &tooltips);
// FormatTag parsing. // FormatTag parsing.
bool isFormatTagChange(uint textIndex, uint ctIndex) const; bool isFormatTagChange(uint textIndex, uint ctIndex) const;
void getFormatTagChange(uint textIndex, uint &ctIndex, CFormatInfo &wordFormat) const; void getFormatTagChange(uint textIndex, uint &ctIndex, CFormatInfo &wordFormat) const;

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -45,7 +46,7 @@ namespace NLGUI
{ {
public: public:
virtual ~IViewTextFormatter(){} virtual ~IViewTextFormatter(){}
virtual ucstring formatString( const ucstring &inputString, const ucstring &paramString ) = 0; virtual std::string formatString( const std::string &inputString, const std::string &paramString ) = 0;
}; };
CViewTextFormated (const TCtorParam &param) : CViewText(param) CViewTextFormated (const TCtorParam &param) : CViewText(param)
@ -55,15 +56,15 @@ namespace NLGUI
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const; xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
virtual bool parse(xmlNodePtr cur, CInterfaceGroup * parentGroup); virtual bool parse(xmlNodePtr cur, CInterfaceGroup * parentGroup);
virtual void checkCoords(); virtual void checkCoords();
const ucstring &getFormatString() const { return _FormatString; } const std::string &getFormatString() const { return _FormatString; }
void setFormatString(const ucstring &format); void setFormatString(const std::string &format);
static ucstring formatString(const ucstring &inputString, const ucstring &paramString); static std::string formatString(const std::string &inputString, const std::string &paramString);
static void setFormatter( IViewTextFormatter *formatter ){ textFormatter = formatter; } static void setFormatter( IViewTextFormatter *formatter ){ textFormatter = formatter; }
private: private:
ucstring _FormatString; std::string _FormatString;
static IViewTextFormatter *textFormatter; static IViewTextFormatter *textFormatter;
}; };

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -58,8 +59,8 @@ namespace NLGUI
{ {
public: public:
virtual ~IViewTextProvider(){} virtual ~IViewTextProvider(){}
virtual bool getString( uint32 stringId, ucstring &result ) = 0; virtual bool getString(uint32 stringId, std::string &result) = 0;
virtual bool getDynString( uint32 dynStringId, ucstring &result ) = 0; virtual bool getDynString(uint32 dynStringId, std::string &result) = 0;
}; };
CViewTextID(const TCtorParam &param) : CViewText(param) CViewTextID(const TCtorParam &param) : CViewText(param)

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -49,10 +50,10 @@ namespace NLGUI
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const; xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
virtual bool parse(xmlNodePtr cur, CInterfaceGroup * parentGroup); virtual bool parse(xmlNodePtr cur, CInterfaceGroup * parentGroup);
virtual void checkCoords(); virtual void checkCoords();
const ucstring &getFormatString() const { return _FormatString; } const std::string &getFormatString() const { return _FormatString; }
void setFormatString(const ucstring &format); void setFormatString(const std::string &format);
private: private:
ucstring _FormatString; std::string _FormatString;
}; };
} }

@ -2,8 +2,8 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2013-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -333,8 +333,8 @@ namespace NLGUI
void updateTooltipCoords(CCtrlBase *newCtrl); void updateTooltipCoords(CCtrlBase *newCtrl);
/// for ContextHelp action handler only: set the result name /// for ContextHelp action handler only: set the result name
void setContextHelpText( const ucstring &text ){ _ContextHelpText = text; } void setContextHelpText( const std::string &text ){ _ContextHelpText = text; }
ucstring& getContextHelpText(){ return _ContextHelpText; } std::string& getContextHelpText(){ return _ContextHelpText; }
/// force disable the context help /// force disable the context help
void disableContextHelp(); void disableContextHelp();
@ -626,7 +626,7 @@ namespace NLGUI
SInterfaceTimes interfaceTimes; SInterfaceTimes interfaceTimes;
ucstring _ContextHelpText; std::string _ContextHelpText;
bool _ContextHelpActive; bool _ContextHelpActive;
bool inGame; bool inGame;

@ -4,7 +4,7 @@
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2010 Matt RAYKOWSKI (sfb) <matt.raykowski@gmail.com> // Copyright (C) 2010 Matt RAYKOWSKI (sfb) <matt.raykowski@gmail.com>
// Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de> // Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de>
// Copyright (C) 2015-2019 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2015-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -227,17 +227,33 @@ inline double isValidDouble (double v)
* \param str a string to transform to lower case * \param str a string to transform to lower case
*/ */
std::string toLower ( const char *str ); std::string toLower ( const char *str ); // UTF-8
std::string toLower ( const std::string &str ); std::string toLower ( const std::string &str ); // UTF-8
void toLower ( char *str ); void toLower ( char *str ); // Ascii only
char toLower ( const char ch ); // convert only one character char toLower ( const char ch ); // convert only one character
/** Convert a string in upper case. /** Convert a string in upper case.
* \param a string to transform to upper case * \param a string to transform to upper case
*/ */
std::string toUpper ( const std::string &str); std::string toUpper ( const char *str ); // UTF-8
void toUpper ( char *str); std::string toUpper ( const std::string &str); // UTF-8
void toUpper ( char *str); // Ascii only
/** Convert a single character in UTF-8 to upper or lowercase.
* \param res Character is appended in UTF-8 into this string.
* \param src Character is sourced from this UTF-8 string.
* \param i Index in `str`, incremented by the number of bytes read.
*/
void appendToLower(std::string &res, const char *str, ptrdiff_t &i);
void appendToLower(std::string &res, const std::string &str, ptrdiff_t &i);
void appendToUpper(std::string &res, const char *str, ptrdiff_t &i);
void appendToUpper(std::string &res, const std::string &str, ptrdiff_t &i);
/** UTF-8 case insensitive compare */
int compareCaseInsensitive(const char *a, const char *b);
int compareCaseInsensitive(const char *a, size_t lenA, const char *b, size_t lenB);
inline int compareCaseInsensitive(const std::string &a, const std::string &b) { return compareCaseInsensitive(&a[0], a.size(), &b[0], b.size()); }
/** /**

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2015 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2015-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

@ -1,6 +1,9 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the
@ -48,8 +51,8 @@ public:
/// From IEventEmitter. This call submitEvents on all the emitters /// From IEventEmitter. This call submitEvents on all the emitters
virtual void submitEvents(CEventServer &server, bool allWindows); virtual void submitEvents(CEventServer &server, bool allWindows);
virtual bool copyTextToClipboard(const ucstring &text); virtual bool copyTextToClipboard(const std::string &text);
virtual bool pasteTextFromClipboard(ucstring &text); virtual bool pasteTextFromClipboard(std::string &text);
private: private:
typedef std::vector<std::pair<IEventEmitter *, bool> > TEmitterCont; typedef std::vector<std::pair<IEventEmitter *, bool> > TEmitterCont;

@ -1,6 +1,9 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the
@ -320,11 +323,11 @@ public:
class CEventChar : public CEventKey class CEventChar : public CEventKey
{ {
public: public:
CEventChar (ucchar c, TKeyButton button, IEventEmitter* emitter) : CEventKey (button, emitter, EventCharId), _Raw(true) CEventChar (u32char c, TKeyButton button, IEventEmitter* emitter) : CEventKey (button, emitter, EventCharId), _Raw(true)
{ {
Char=c; Char=c;
} }
ucchar Char; u32char Char;
virtual CEvent *clone() const {return new CEventChar(*this);} virtual CEvent *clone() const {return new CEventChar(*this);}
void setRaw( bool raw ) { _Raw = raw; } void setRaw( bool raw ) { _Raw = raw; }
@ -341,11 +344,11 @@ private:
class CEventString : public CEventKey class CEventString : public CEventKey
{ {
public: public:
CEventString (const ucstring &str, IEventEmitter* emitter) : CEventKey (noKeyButton, emitter, EventStringId) CEventString (const std::string &str, IEventEmitter* emitter) : CEventKey (noKeyButton, emitter, EventStringId)
{ {
String = str; String = str;
} }
ucstring String; std::string String;
virtual CEvent *clone() const {return new CEventString(*this);} virtual CEvent *clone() const {return new CEventString(*this);}
}; };

@ -1,6 +1,9 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2012 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2012 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -99,7 +100,7 @@ public:
/// Return a vector with all language available. The vector contains the name of the language. /// Return a vector with all language available. The vector contains the name of the language.
/// The index in the vector is used in \c load() function /// The index in the vector is used in \c load() function
static const std::vector<ucstring> &getLanguageNames(); static const std::vector<std::string> &getLanguageNames();
/** Return a vector with all language code available. /** Return a vector with all language code available.
* Code are ISO 639-2 compliant. * Code are ISO 639-2 compliant.
@ -122,7 +123,7 @@ public:
static void loadFromFilename (const std::string &filename, bool reload); static void loadFromFilename (const std::string &filename, bool reload);
/// Returns the name of the language in the language name (English, Francais, ...) /// Returns the name of the language in the language name (English, Francais, ...)
static ucstring getCurrentLanguageName (); static std::string getCurrentLanguageName ();
/// Returns the code of the language ("fr", "en", ...) /// Returns the code of the language ("fr", "en", ...)
static std::string getCurrentLanguageCode (); static std::string getCurrentLanguageCode ();
@ -134,7 +135,10 @@ public:
static bool setSystemLanguageCode (const std::string &languageCode); static bool setSystemLanguageCode (const std::string &languageCode);
/// Find a string in the selected language and return his association. /// Find a string in the selected language and return his association.
static const ucstring &get (const std::string &label); static const ucstring &getAsUtf16 (const std::string &label);
/// Find a string in the selected language and return his association.
static const std::string &get (const std::string &label);
// Test if a string has a translation in the selected language. // Test if a string has a translation in the selected language.
// NB : The empty string is considered to have a translation // NB : The empty string is considered to have a translation
@ -219,24 +223,28 @@ public:
private: private:
typedef std::map<std::string, ucstring> StrMapContainer; typedef std::map<std::string, std::string> StrMapContainer;
typedef std::map<std::string, ucstring> StrMapContainer16;
static ILoadProxy *_LoadProxy; static ILoadProxy *_LoadProxy;
static StrMapContainer _StrMap; static StrMapContainer _StrMap;
static StrMapContainer16 _StrMap16;
static bool _StrMapLoaded; static bool _StrMapLoaded;
// the alternative language that will be used if the sentence is not found in the original language // the alternative language that will be used if the sentence is not found in the original language
static StrMapContainer _StrMapFallback; static StrMapContainer _StrMapFallback;
static StrMapContainer16 _StrMapFallback16;
static std::vector<std::string> _LanguageCodes; static std::vector<std::string> _LanguageCodes;
static std::vector<ucstring> _LanguageNames; static std::vector<std::string> _LanguageNames;
static std::string _SystemLanguageCode; static std::string _SystemLanguageCode;
static bool _LanguagesNamesLoaded; static bool _LanguagesNamesLoaded;
static std::string _SelectedLanguageCode; static std::string _SelectedLanguageCode;
static const ucstring _NotTranslatedValue; static const ucstring _NotTranslatedValue16;
static const std::string _NotTranslatedValue;
/** Structure to hold contextual info during /** Structure to hold contextual info during
* read of preprocessed file * read of preprocessed file
@ -256,7 +264,7 @@ private:
/// Init _LanguageCodes and _LanguageNames /// Init _LanguageCodes and _LanguageNames
static void initLanguages(); static void initLanguages();
static bool loadFileIntoMap(const std::string &filename, StrMapContainer &dest); static bool loadFileIntoMap(const std::string &filename, StrMapContainer &dest, StrMapContainer16 &dest16);
/// The internal read function, it does the real job of readTextFile /// The internal read function, it does the real job of readTextFile
static void _readTextFile(const std::string &filename, static void _readTextFile(const std::string &filename,

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2019 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2019-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2012 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2012-2019 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

@ -1,6 +1,9 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the

@ -3,7 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2012 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2012 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2016-2019 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2016-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -193,6 +193,10 @@ inline std::string toString(const sint32 &val) { return toString("%d", val); }
inline std::string toString(const uint64 &val) { return toString("%" NL_I64 "u", val); } inline std::string toString(const uint64 &val) { return toString("%" NL_I64 "u", val); }
inline std::string toString(const sint64 &val) { return toString("%" NL_I64 "d", val); } inline std::string toString(const sint64 &val) { return toString("%" NL_I64 "d", val); }
#ifdef NL_OS_WINDOWS
inline std::string toString(const wchar_t &val) { return toString(reinterpret_cast<const uint16 &>(val)); }
#endif
#ifdef NL_COMP_GCC #ifdef NL_COMP_GCC
# if GCC_VERSION == 40102 # if GCC_VERSION == 40102
@ -246,9 +250,14 @@ inline bool fromString(const std::string &str, sint64 &val) { bool ret = sscanf(
inline bool fromString(const std::string &str, float &val) { bool ret = sscanf(str.c_str(), "%f", &val) == 1; if (!ret) val = 0.0f; return ret; } inline bool fromString(const std::string &str, float &val) { bool ret = sscanf(str.c_str(), "%f", &val) == 1; if (!ret) val = 0.0f; return ret; }
inline bool fromString(const std::string &str, double &val) { bool ret = sscanf(str.c_str(), "%lf", &val) == 1; if (!ret) val = 0.0; return ret; } inline bool fromString(const std::string &str, double &val) { bool ret = sscanf(str.c_str(), "%lf", &val) == 1; if (!ret) val = 0.0; return ret; }
// Fast string to bool, reliably defined for strings starting with 0, 1, t, T, f, F, y, Y, n, N, anything else is undefined. #ifdef NL_OS_WINDOWS
// (str[0] == '1' || (str[0] & 0xD2) == 0x50) inline bool fromString(const std::string &str, wchar_t &val) { return fromString(str, reinterpret_cast<uint16 &>(val)); }
// - Kaetemi #endif
/// Fast string to bool, reliably defined for strings starting with 0, 1, t, T, f, F, y, Y, n, N, and empty strings, anything else is undefined.
/// - Kaetemi
inline bool toBool(const char *str) { return str[0] == '1' || (str[0] & 0xD2) == 0x50; }
inline bool toBool(const std::string &str) { return toBool(str.c_str()); } // Safe because first byte may be null
bool fromString(const std::string &str, bool &val); bool fromString(const std::string &str, bool &val);

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2015-2019 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2015-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -49,10 +49,10 @@ public:
static bool updateProgressBar(uint value, uint total); static bool updateProgressBar(uint value, uint total);
/// Copy a string to system clipboard. /// Copy a string to system clipboard.
static bool copyTextToClipboard(const ucstring &text); static bool copyTextToClipboard(const std::string &text);
/// Paste a string from system clipboard. /// Paste a string from system clipboard.
static bool pasteTextFromClipboard(ucstring &text); static bool pasteTextFromClipboard(std::string &text);
/// Check if system supports unicode. /// Check if system supports unicode.
static bool supportUnicode(); static bool supportUnicode();

@ -2,7 +2,7 @@
// Copyright (C) 2010-2011 Winch Gate Property Limited // Copyright (C) 2010-2011 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2014-2019 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2014-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -548,6 +548,14 @@ template<> struct hash<uint64>
*/ */
typedef uint16 ucchar; typedef uint16 ucchar;
#ifdef NL_CPP14
typedef char32_t u32char;
typedef std::u32string u32string;
#else
typedef uint32 u32char;
typedef std::basic_string<uint32> u32string;
#endif
#ifndef NL_OVERRIDE #ifndef NL_OVERRIDE
#define NL_OVERRIDE override #define NL_OVERRIDE override
#endif #endif

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2015 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2015-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -35,113 +35,111 @@ typedef std::basic_string<ucchar> ucstringbase;
class ucstring : public ucstringbase class ucstring : public ucstringbase
{ {
public: public:
ucstring() { }
ucstring () {} ucstring(const ucstringbase &str)
: ucstringbase(str)
{
}
ucstring (const ucstringbase &str) : ucstringbase (str) {} ucstring(const ucchar *begin, const ucchar *end)
: ucstringbase(begin, end)
{
}
ucstring (const std::string &str) : ucstringbase () ucstring(const std::string &str)
: ucstringbase()
{ {
rawCopy(str); fromUtf8(str);
} }
~ucstring () {} ~ucstring() { }
ucstring &operator= (ucchar c) ucstring &operator=(ucchar c)
{ {
resize (1); resize(1);
operator[](0) = c; operator[](0) = c;
return *this; return *this;
} }
ucstring &operator= (const char *str) ucstring &operator=(const char *str)
{ {
resize (strlen (str)); resize(strlen(str));
for (uint i = 0; i < strlen (str); i++) for (uint i = 0; i < strlen(str); i++)
{ {
operator[](i) = uint8(str[i]); operator[](i) = uint8(str[i]);
} }
return *this; return *this;
} }
ucstring &operator= (const std::string &str) ucstring &operator=(const std::string &str)
{ {
resize (str.size ()); resize(str.size());
for (uint i = 0; i < str.size (); i++) for (uint i = 0; i < str.size(); i++)
{ {
operator[](i) = uint8(str[i]); operator[](i) = uint8(str[i]);
} }
return *this; return *this;
} }
ucstring &operator= (const ucstringbase &str) ucstring &operator=(const ucstringbase &str)
{ {
ucstringbase::operator =(str); ucstringbase::operator=(str);
return *this; return *this;
} }
ucstring& operator= (const ucchar *str) ucstring &operator=(const ucchar *str)
{ {
ucstringbase::operator =(str); ucstringbase::operator=(str);
return *this; return *this;
} }
ucstring &operator+= (ucchar c) ucstring &operator+=(ucchar c)
{ {
resize (size() + 1); resize(size() + 1);
operator[](size()-1) = c; operator[](size() - 1) = c;
return *this; return *this;
} }
ucstring &operator+= (const char *str) ucstring &operator+=(const char *str)
{ {
size_t s = size(); size_t s = size();
resize (s + strlen(str)); resize(s + strlen(str));
for (uint i = 0; i < strlen(str); i++) for (uint i = 0; i < strlen(str); i++)
{ {
operator[](s+i) = uint8(str[i]); operator[](s + i) = uint8(str[i]);
} }
return *this; return *this;
} }
ucstring &operator+= (const std::string &str) ucstring &operator+=(const std::string &str)
{ {
size_t s = size(); size_t s = size();
resize (s + str.size()); resize(s + str.size());
for (uint i = 0; i < str.size(); i++) for (uint i = 0; i < str.size(); i++)
{ {
operator[](s+i) = uint8(str[i]); operator[](s + i) = uint8(str[i]);
} }
return *this; return *this;
} }
ucstring &operator+= (const ucstringbase &str) ucstring &operator+=(const ucstringbase &str)
{ {
ucstringbase::operator +=(str); ucstringbase::operator+=(str);
return *this; return *this;
} }
const ucchar *c_str() const const ucchar *c_str() const
{ {
const ucchar *tmp = ucstringbase::c_str(); const ucchar *tmp = ucstringbase::c_str();
const_cast<ucchar*>(tmp)[size()] = 0; const_cast<ucchar *>(tmp)[size()] = 0;
return tmp; return tmp;
} }
/// Converts the controlled ucstring to a string str /// Converts the controlled ucstring to a string str
void toString (std::string &str) const void toString(std::string &str) const;
{
str.resize (size ());
for (uint i = 0; i < str.size (); i++)
{
if (operator[](i) > 255)
str[i] = '?';
else
str[i] = (char) operator[](i);
}
}
/// Converts the controlled ucstring and returns the resulting string /// Converts the controlled ucstring and returns the resulting string
std::string toString () const std::string toString() const
{ {
std::string str; std::string str;
toString(str); toString(str);
@ -149,43 +147,7 @@ public:
} }
/// Convert this ucstring (16bits char) into a utf8 string /// Convert this ucstring (16bits char) into a utf8 string
std::string toUtf8() const std::string toUtf8() const;
{
std::string res;
ucstring::const_iterator first(begin()), last(end());
for (; first != last; ++first)
{
//ucchar c = *first;
uint nbLoop = 0;
if (*first < 0x80)
res += char(*first);
else if (*first < 0x800)
{
ucchar c = *first;
c = c >> 6;
c = c & 0x1F;
res += char(c) | 0xC0;
nbLoop = 1;
}
else /*if (*first < 0x10000)*/
{
ucchar c = *first;
c = c >> 12;
c = c & 0x0F;
res += char(c) | 0xE0;
nbLoop = 2;
}
for (uint i=0; i<nbLoop; ++i)
{
ucchar c = *first;
c = c >> ((nbLoop - i - 1) * 6);
c = c & 0x3F;
res += char(c) | 0x80;
}
}
return res;
}
ucstring substr(size_type pos = 0, size_type n = npos) const ucstring substr(size_type pos = 0, size_type n = npos) const
{ {
@ -199,86 +161,7 @@ public:
} }
/// Convert the utf8 string into this ucstring (16 bits char) /// Convert the utf8 string into this ucstring (16 bits char)
void fromUtf8(const std::string &stringUtf8) void fromUtf8(const std::string &stringUtf8);
{
// clear the string
erase();
uint8 c;
ucchar code;
sint iterations = 0;
std::string::const_iterator first(stringUtf8.begin()), last(stringUtf8.end());
for (; first != last; )
{
c = *first++;
code = c;
if ((code & 0xFE) == 0xFC)
{
code &= 0x01;
iterations = 5;
}
else if ((code & 0xFC) == 0xF8)
{
code &= 0x03;
iterations = 4;
}
else if ((code & 0xF8) == 0xF0)
{
code &= 0x07;
iterations = 3;
}
else if ((code & 0xF0) == 0xE0)
{
code &= 0x0F;
iterations = 2;
}
else if ((code & 0xE0) == 0xC0)
{
code &= 0x1F;
iterations = 1;
}
else if ((code & 0x80) == 0x80)
{
// If it's not a valid UTF8 string, just copy the line without utf8 conversion
rawCopy(stringUtf8);
return;
}
else
{
push_back(code);
iterations = 0;
}
if (iterations)
{
for (sint i = 0; i < iterations; i++)
{
if (first == last)
{
// If it's not a valid UTF8 string, just copy the line without utf8 conversion
rawCopy(stringUtf8);
return;
}
uint8 ch;
ch = *first ++;
if ((ch & 0xC0) != 0x80)
{
// If it's not a valid UTF8 string, just copy the line without utf8 conversion
rawCopy(stringUtf8);
return;
}
code <<= 6;
code |= (ucchar)(ch & 0x3F);
}
push_back(code);
}
}
}
static ucstring makeFromUtf8(const std::string &stringUtf8) static ucstring makeFromUtf8(const std::string &stringUtf8)
{ {
@ -288,83 +171,72 @@ public:
return ret; return ret;
} }
private:
void rawCopy(const std::string &str)
{
// We need to convert the char into 8bits unsigned int before promotion to 16 bits
// otherwise, as char are signed on some compiler (MSCV for ex), the sign bit is extended to 16 bits.
resize(str.size());
std::string::const_iterator first(str.begin()), last(str.end());
iterator dest(begin());
for (;first != last; ++first, ++dest)
{
*dest = uint8(*first);
}
}
}; };
inline ucstring operator+(const ucstringbase &ucstr, ucchar c) inline ucstring operator+(const ucstringbase &ucstr, ucchar c)
{ {
ucstring ret; ucstring ret;
ret= ucstr; ret = ucstr;
ret+= c; ret += c;
return ret; return ret;
} }
inline ucstring operator+(const ucstringbase &ucstr, const char *c) inline ucstring operator+(const ucstringbase &ucstr, const char *c)
{ {
ucstring ret; ucstring ret;
ret= ucstr; ret = ucstr;
ret+= c; ret += c;
return ret; return ret;
} }
inline ucstring operator+(const ucstringbase &ucstr, const std::string &c) inline ucstring operator+(const ucstringbase &ucstr, const std::string &c)
{ {
ucstring ret; ucstring ret;
ret= ucstr; ret = ucstr;
ret+= c; ret += c;
return ret; return ret;
} }
inline ucstring operator+(ucchar c, const ucstringbase &ucstr) inline ucstring operator+(ucchar c, const ucstringbase &ucstr)
{ {
ucstring ret; ucstring ret;
ret= c; ret = c;
ret += ucstr; ret += ucstr;
return ret; return ret;
} }
inline ucstring operator+(const char *c, const ucstringbase &ucstr) inline ucstring operator+(const char *c, const ucstringbase &ucstr)
{ {
ucstring ret; ucstring ret;
ret= c; ret = c;
ret += ucstr; ret += ucstr;
return ret; return ret;
} }
inline ucstring operator+(const std::string &c, const ucstringbase &ucstr) inline ucstring operator+(const std::string &c, const ucstringbase &ucstr)
{ {
ucstring ret; ucstring ret;
ret= c; ret = c;
ret += ucstr; ret += ucstr;
return ret; return ret;
} }
namespace NLMISC namespace NLMISC {
{
// Traits for hash_map using CEntityId // Traits for hash_map using CEntityId
struct CUCStringHashMapTraits struct CUCStringHashMapTraits
{ {
enum { bucket_size = 4, min_buckets = 8 }; enum
{
bucket_size = 4,
min_buckets = 8
};
CUCStringHashMapTraits() { } CUCStringHashMapTraits() { }
size_t operator() (const ucstring &id ) const size_t operator()(const ucstring &id) const
{ {
return id.size(); return id.size();
} }
bool operator() (const ucstring &id1, const ucstring &id2) const bool operator()(const ucstring &id1, const ucstring &id2) const
{ {
return id1 < id2; return id1 < id2;
} }
@ -375,18 +247,18 @@ struct CUCStringHashMapTraits
* \param a string or a char to transform to lower case * \param a string or a char to transform to lower case
*/ */
ucstring toLower (const ucstring &str); ucstring toLower(const ucstring &str);
void toLower (ucchar *str); void toLower(ucchar *str);
ucchar toLower (ucchar c); ucchar toLower(ucchar c);
/** Convert an unicode string in upper case. /** Convert an unicode string in upper case.
* Characters with accent are converted in a uppercase character without accent * Characters with accent are converted in a uppercase character without accent
* \param a string or a char to transform to upper case * \param a string or a char to transform to upper case
*/ */
ucstring toUpper (const ucstring &str); ucstring toUpper(const ucstring &str);
void toUpper (ucchar *str); void toUpper(ucchar *str);
ucchar toUpper (ucchar c); ucchar toUpper(ucchar c);
}; };

@ -0,0 +1,162 @@
// NeL - MMORPG Framework <https://wiki.ryzom.dev/>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero 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 Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef NLMISC_UTF_STRING_VIEW_H
#define NLMISC_UTF_STRING_VIEW_H
#include <nel/misc/types_nl.h>
#include <nel/misc/ucstring.h>
#include <string>
namespace NLMISC {
/// String view for UTF-8 and UTF-32 iteration as 32-bit codepoints.
/// This string view keeps the string as a reference, it does not make a copy.
/// Only use this for iterating a string's codepoints.
/// String must be NUL terminated, but its size may specify a substring.
class CUtfStringView
{
public:
inline CUtfStringView() : m_Str(NULL), m_Size(0), m_Iterator(utf32Iterator) {}
inline CUtfStringView(const std::string &utf8Str) : m_Str(utf8Str.c_str()), m_Size(utf8Str.size()), m_Iterator(utf8Iterator) {}
inline CUtfStringView(const char *utf8Str) : m_Str(utf8Str), m_Size(strlen(utf8Str)), m_Iterator(utf8Iterator) {}
inline CUtfStringView(const char *utf8Str, size_t len): m_Str(utf8Str), m_Size(len), m_Iterator(utf8Iterator)
{
nlassert(len <= strlen(utf8Str));
}
#if defined(NL_OS_WINDOWS)
inline CUtfStringView(const wchar_t *utf16Str) : m_Str(utf16Str), m_Size(wcslen(utf16Str)), m_Iterator(utf16Iterator) {}
inline CUtfStringView(const wchar_t *utf16Str, size_t len): m_Str(utf16Str), m_Size(len), m_Iterator(utf16Iterator)
{
nlassert(len <= wcslen(utf16Str));
}
#else
inline CUtfStringView(const wchar_t *utf32Str) : m_Str(utf32Str), m_Size(wcslen(utf32Str)), m_Iterator(utf32Iterator) {}
inline CUtfStringView(const wchar_t *utf32Str, size_t len): m_Str(utf32Str), m_Size(len), m_Iterator(utf32Iterator)
{
nlassert(len <= wcslen(utf32Str));
}
#endif
inline CUtfStringView(const ucstring &utf16Str) : m_Str(utf16Str.c_str()), m_Size(utf16Str.size() << 1), m_Iterator(utf16Iterator) {}
inline CUtfStringView(const ucchar *utf16Str) : m_Str(utf16Str), m_Size(strlen((const char *)utf16Str) & (ptrdiff_t)(-2)), m_Iterator(utf16Iterator) {}
inline CUtfStringView(const ::u32string &utf32Str) : m_Str(utf32Str.c_str()), m_Size(utf32Str.size() << 2), m_Iterator(utf32Iterator) {}
std::string toUtf8(bool reEncode = false) const; // Makes a copy
ucstring toUtf16(bool reEncode = false) const; // Makes a copy
::u32string toUtf32() const; // Makes a copy
std::wstring toWide() const; // Platform dependent, UTF-16 or UTF-32. Makes a copy.
std::string toAscii() const; // Returns only values 0-127, 7-bit ASCII. Makes a copy.
inline bool isUtf8() const { return m_Iterator == utf8Iterator; }
inline bool isUtf16() const { return m_Iterator == utf16Iterator; }
inline bool isUtf32() const { return m_Iterator == utf32Iterator; }
struct const_iterator
{
public:
inline void operator++()
{
if ((ptrdiff_t)m_Next > ((ptrdiff_t)m_View.m_Str + m_View.m_Size))
m_Next = (void *)((ptrdiff_t)m_View.m_Str + m_View.m_Size);
m_Addr = m_Next;
m_Char = m_View.m_Iterator(&m_Next);
}
inline void operator+=(ptrdiff_t a)
{
while ((ptrdiff_t)m_Addr < ((ptrdiff_t)m_View.m_Str + m_View.m_Size))
{
++(*this);
}
}
inline bool operator!=(const const_iterator &o) const { return m_Addr != o.m_Addr; }
inline bool operator==(const const_iterator &o) const { return m_Addr == o.m_Addr; }
inline const u32char &operator*() const { return m_Char; }
const_iterator() : m_View(*(CUtfStringView *)NULL), m_Addr(NULL), m_Char(0) { }
const_iterator &operator=(const const_iterator &other)
{
if (this == &other) return *this;
this->~const_iterator();
return *new(this) const_iterator(other);
}
const void *ptr() const { return m_Addr; }
private:
friend class CUtfStringView;
inline const_iterator(const CUtfStringView &view, const void *addr) : m_View(view), m_Addr(addr), m_Next(addr), m_Char(view.m_Iterator(&m_Next))
{
if ((ptrdiff_t)m_Next > ((ptrdiff_t)m_View.m_Str + m_View.m_Size))
m_Next = (void *)((ptrdiff_t)m_View.m_Str + m_View.m_Size);
}
inline const_iterator(const CUtfStringView &view) : m_View(view), m_Addr((char *)view.m_Str + view.m_Size), m_Next((char *)view.m_Str + view.m_Size + 1), m_Char(0) { }
const CUtfStringView &m_View;
const void *m_Addr; // Current address
const void *m_Next; // Next address
u32char m_Char;
};
typedef const_iterator iterator;
iterator begin() const { return iterator(*this, m_Str); }
inline iterator end() const { return iterator(*this); }
/// Largest possible number of characters in this string.
/// Number of actual characters may be less or equal.
inline size_t largestSize() const { return m_Size; }
inline bool empty() const { return !m_Size; }
const void *ptr() const { return m_Str; }
size_t count() const; // Slow count of UTF-32 characters
inline CUtfStringView substr(const iterator &begin, const iterator &end) const
{
return CUtfStringView(begin.m_Addr, (ptrdiff_t)end.m_Addr - (ptrdiff_t)begin.m_Addr, m_Iterator);
}
inline bool endsWith(char c) { nlassert(c < 0x80); return *((char *)m_Str + m_Size - 1) == c; }
CUtfStringView &operator=(const CUtfStringView &other)
{
if(this == &other) return *this;
this->~CUtfStringView();
return *new(this) CUtfStringView(other);
}
static void append(std::string &str, u32char c);
private:
typedef u32char (*TIterator)(const void **addr);
static u32char utf8Iterator(const void **addr);
static u32char utf16Iterator(const void **addr);
static u32char utf32Iterator(const void **addr);
inline CUtfStringView(const void *str, size_t len, TIterator it) : m_Str(str), m_Size(len), m_Iterator(it) { }
const void *const m_Str; // String
const size_t m_Size; // Size in bytes
const TIterator m_Iterator;
}; /* class CUtfStringView */
} /* namespace NLMISC */
#endif /* #ifndef NLMISC_STREAMED_PACKAGE_PROVIDER_H */
/* end of file */

@ -1,6 +1,9 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the
@ -662,6 +665,7 @@ private:
std::vector<TCallbackArgItem> _UpUniCallback; std::vector<TCallbackArgItem> _UpUniCallback;
TNameMappedCallback _DownCallbacks; TNameMappedCallback _DownCallbacks;
std::vector<TCallbackArgItem> _DownUniCallback; std::vector<TCallbackArgItem> _DownUniCallback;
std::set<std::pair<std::string, TServiceId>> _NotifiedUpCallbacks;
/// Recording state /// Recording state
CCallbackNetBase::TRecordingState _RecordingState; CCallbackNetBase::TRecordingState _RecordingState;

@ -7,7 +7,7 @@
*/ */
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2008-2012 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2008-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited

@ -7,7 +7,7 @@
*/ */
// NeL - MMORPG Framework <https://wiki.ryzom.dev/> // NeL - MMORPG Framework <https://wiki.ryzom.dev/>
// Copyright (C) 2012 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2012-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2019 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2019-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

@ -1,6 +1,9 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the
@ -44,9 +47,9 @@ int main (int argc, char **argv)
// load the language // load the language
CI18N::load(langName); CI18N::load(langName);
InfoLog->displayRawNL(CI18N::get("Hi").toString().c_str()); InfoLog->displayRawNL(CI18N::get("Hi").c_str());
InfoLog->displayRawNL(CI18N::get("PresentI18N").toString().c_str(), "Nevrax"); InfoLog->displayRawNL(CI18N::get("PresentI18N").c_str(), "Nevrax");
InfoLog->displayRawNL(CI18N::get("ExitStr").toString().c_str()); InfoLog->displayRawNL(CI18N::get("ExitStr").c_str());
getchar(); getchar();
return EXIT_SUCCESS; return EXIT_SUCCESS;

@ -3,7 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de> // Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de>
// Copyright (C) 2013-2019 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2013-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// Copyright (C) 2014 Matthew LAGOE (Botanic) <cyberempires@gmail.com> // Copyright (C) 2014 Matthew LAGOE (Botanic) <cyberempires@gmail.com>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
@ -1173,7 +1173,7 @@ void D3DWndProc(CDriverD3D *driver, HWND hWnd, UINT message, WPARAM wParam, LPAR
} }
} }
if (driver->_EventEmitter.getNumEmitters() > 0) if (driver && driver->_EventEmitter.getNumEmitters() > 0)
{ {
CWinEventEmitter *we = NLMISC::safe_cast<CWinEventEmitter *>(driver->_EventEmitter.getEmitter(0)); CWinEventEmitter *we = NLMISC::safe_cast<CWinEventEmitter *>(driver->_EventEmitter.getEmitter(0));
// Process the message by the emitter // Process the message by the emitter
@ -1225,12 +1225,29 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l
D3DWndProc (pDriver, hWnd, message, wParam, lParam); D3DWndProc (pDriver, hWnd, message, wParam, lParam);
} }
if (message == WM_SYSCOMMAND)
{
switch (wParam)
{
#ifdef NL_DISABLE_MENU #ifdef NL_DISABLE_MENU
// disable menu (F10, ALT and ALT+SPACE key doesn't freeze or open the menu) // disable menu (F10, ALT and ALT+SPACE key doesn't freeze or open the menu)
if(message == WM_SYSCOMMAND && wParam == SC_KEYMENU) case SC_KEYMENU:
return 0;
#endif // NL_DISABLE_MENU #endif // NL_DISABLE_MENU
// Screensaver Trying To Start?
case SC_SCREENSAVE:
// Monitor Trying To Enter Powersave?
case SC_MONITORPOWER:
// Prevent From Happening
return 0;
default:
break;
}
}
// ace: if we receive close, exit now or it'll assert after // ace: if we receive close, exit now or it'll assert after
if(message == WM_CLOSE) if(message == WM_CLOSE)
{ {
@ -1248,6 +1265,12 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l
return 0; return 0;
} }
#ifdef WM_UNICHAR
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-unichar
if (message == WM_UNICHAR)
return (wParam == UNICODE_NOCHAR);
#endif
return DefWindowProcW(hWnd, message, wParam, lParam); return DefWindowProcW(hWnd, message, wParam, lParam);
} }
@ -3995,12 +4018,12 @@ void CDriverD3D::findNearestFullscreenVideoMode()
} }
} }
} }
bool CDriverD3D::copyTextToClipboard(const ucstring &text) bool CDriverD3D::copyTextToClipboard(const std::string &text)
{ {
return _EventEmitter.copyTextToClipboard(text); return _EventEmitter.copyTextToClipboard(text);
} }
bool CDriverD3D::pasteTextFromClipboard(ucstring &text) bool CDriverD3D::pasteTextFromClipboard(std::string &text)
{ {
return _EventEmitter.pasteTextFromClipboard(text); return _EventEmitter.pasteTextFromClipboard(text);
} }

@ -3,7 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de> // Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de>
// Copyright (C) 2013-2019 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2013-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -2748,8 +2748,8 @@ public:
bool convertBitmapToIcon(const NLMISC::CBitmap &bitmap, HICON &icon, uint iconWidth, uint iconHeight, uint iconDepth, const NLMISC::CRGBA &col = NLMISC::CRGBA::White, sint hotSpotX = 0, sint hotSpotY = 0, bool cursor = false); bool convertBitmapToIcon(const NLMISC::CBitmap &bitmap, HICON &icon, uint iconWidth, uint iconHeight, uint iconDepth, const NLMISC::CRGBA &col = NLMISC::CRGBA::White, sint hotSpotX = 0, sint hotSpotY = 0, bool cursor = false);
virtual bool copyTextToClipboard(const ucstring &text); virtual bool copyTextToClipboard(const std::string &text);
virtual bool pasteTextFromClipboard(ucstring &text); virtual bool pasteTextFromClipboard(std::string &text);
public: public:
#ifdef NL_DEBUG #ifdef NL_DEBUG

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013-2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2013-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2012-2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2012-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

@ -4,7 +4,7 @@
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de> // Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de>
// Copyright (C) 2010 Thibaut GIRKA (ThibG) <thib@sitedethib.com> // Copyright (C) 2010 Thibaut GIRKA (ThibG) <thib@sitedethib.com>
// Copyright (C) 2013-2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2013-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -354,8 +354,8 @@ public:
return _win; return _win;
} }
virtual bool copyTextToClipboard(const ucstring &text); virtual bool copyTextToClipboard(const std::string &text);
virtual bool pasteTextFromClipboard(ucstring &text); virtual bool pasteTextFromClipboard(std::string &text);
virtual uint32 getAvailableVertexAGPMemory (); virtual uint32 getAvailableVertexAGPMemory ();
virtual uint32 getAvailableVertexVRAMMemory (); virtual uint32 getAvailableVertexVRAMMemory ();

@ -3,7 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de> // Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de>
// Copyright (C) 2013-2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2013-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2014-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -1373,10 +1373,11 @@ CVertexBufferHardARB::~CVertexBufferHardARB()
} }
} }
#ifdef NL_DEBUG #ifdef NL_DEBUG
if (_VertexPtr) if (_VertexPtr)
{ {
_VertexArrayRange->_MappedVBList.erase(_IteratorInMappedVBList); nlassert(_VertexArrayRange);
} _VertexArrayRange->_MappedVBList.erase(_IteratorInMappedVBList);
}
#endif #endif
#ifdef USE_OPENGLES #ifdef USE_OPENGLES

@ -4,7 +4,7 @@
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de> // Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de>
// Copyright (C) 2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2014-2019 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2014-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -183,6 +183,12 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l
return 0; return 0;
} }
#ifdef WM_UNICHAR
// https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-unichar
if (message == WM_UNICHAR)
return (wParam == UNICODE_NOCHAR);
#endif
return trapMessage ? 0 : DefWindowProcW(hWnd, message, wParam, lParam); return trapMessage ? 0 : DefWindowProcW(hWnd, message, wParam, lParam);
} }
@ -1074,7 +1080,7 @@ bool CDriverGL::setDisplay(nlWindow wnd, const GfxMode &mode, bool show, bool re
// Set context as thread context // Set context as thread context
CGLSetCurrentContext((CGLContextObj)[_ctx CGLContextObj]); CGLSetCurrentContext((CGLContextObj)[_ctx CGLContextObj]);
_EventEmitter.init(this, _glView, _DestroyWindow); _EventEmitter.init(this, _glView, _DestroyWindow);
#elif defined(NL_OS_UNIX) #elif defined(NL_OS_UNIX)
@ -3014,12 +3020,12 @@ void CDriverGL::setupApplicationMenu()
} }
#endif #endif
bool CDriverGL::copyTextToClipboard(const ucstring &text) bool CDriverGL::copyTextToClipboard(const std::string &text)
{ {
return _EventEmitter.copyTextToClipboard(text); return _EventEmitter.copyTextToClipboard(text);
} }
bool CDriverGL::pasteTextFromClipboard(ucstring &text) bool CDriverGL::pasteTextFromClipboard(std::string &text)
{ {
return _EventEmitter.pasteTextFromClipboard(text); return _EventEmitter.pasteTextFromClipboard(text);
} }

@ -3,7 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de> // Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de>
// Copyright (C) 2013-2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2013-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -29,6 +29,7 @@
#include <X11/Xutil.h> #include <X11/Xutil.h>
#include <X11/XKBlib.h> #include <X11/XKBlib.h>
#include "nel/misc/debug.h" #include "nel/misc/debug.h"
#include "nel/misc/utf_string_view.h"
#ifdef DEBUG_NEW #ifdef DEBUG_NEW
#define new DEBUG_NEW #define new DEBUG_NEW
@ -537,8 +538,7 @@ bool CUnixEventEmitter::processMessage (XEvent &event, CEventServer *server)
if (c > 0) if (c > 0)
{ {
#ifdef X_HAVE_UTF8_STRING #ifdef X_HAVE_UTF8_STRING
ucstring ucstr; ::u32string ucstr = NLMISC::CUtfStringView(Text).toUtf32();
ucstr.fromUtf8(Text);
CEventChar *charEvent = new CEventChar (ucstr[0], getKeyButton(event.xbutton.state), this); CEventChar *charEvent = new CEventChar (ucstr[0], getKeyButton(event.xbutton.state), this);
@ -547,9 +547,10 @@ bool CUnixEventEmitter::processMessage (XEvent &event, CEventServer *server)
server->postEvent (charEvent); server->postEvent (charEvent);
#else #else
// FIXME: Convert locale to UTF-32
for (int i = 0; i < c; i++) for (int i = 0; i < c; i++)
{ {
CEventChar *charEvent = new CEventChar ((ucchar)(unsigned char)Text[i], getKeyButton(event.xbutton.state), this); CEventChar *charEvent = new CEventChar ((u32char)(unsigned char)Text[i], getKeyButton(event.xbutton.state), this);
// raw if not processed by IME // raw if not processed by IME
charEvent->setRaw(keyCode != 0); charEvent->setRaw(keyCode != 0);
@ -610,14 +611,13 @@ bool CUnixEventEmitter::processMessage (XEvent &event, CEventServer *server)
else if (req.target == XA_STRING) else if (req.target == XA_STRING)
{ {
respond.xselection.property = req.property; respond.xselection.property = req.property;
std::string str = _CopiedString.toString(); std::string str = _CopiedString; // NLMISC::CUtfStringView(_CopiedString).toAscii(); // FIXME: Convert UTF-8 to local
XChangeProperty(req.display, req.requestor, req.property, XA_STRING, 8, PropModeReplace, (const unsigned char*)str.c_str(), str.length()); XChangeProperty(req.display, req.requestor, req.property, XA_STRING, 8, PropModeReplace, (const unsigned char*)str.c_str(), str.length());
} }
else if (req.target == XA_UTF8_STRING) else if (req.target == XA_UTF8_STRING)
{ {
respond.xselection.property = req.property; respond.xselection.property = req.property;
std::string str = _CopiedString.toUtf8(); XChangeProperty(req.display, req.requestor, respond.xselection.property, XA_UTF8_STRING, 8, PropModeReplace, (const unsigned char*)_CopiedString.c_str(), _CopiedString.length());
XChangeProperty(req.display, req.requestor, respond.xselection.property, XA_UTF8_STRING, 8, PropModeReplace, (const unsigned char*)str.c_str(), str.length());
} }
else else
{ {
@ -699,22 +699,22 @@ bool CUnixEventEmitter::processMessage (XEvent &event, CEventServer *server)
if (XGetWindowProperty(_dpy, _win, XA_NEL_SEL, 0, XMaxRequestSize(_dpy), False, AnyPropertyType, &actualType, &actualFormat, &nitems, &bytesLeft, (unsigned char**)&data) != Success) if (XGetWindowProperty(_dpy, _win, XA_NEL_SEL, 0, XMaxRequestSize(_dpy), False, AnyPropertyType, &actualType, &actualFormat, &nitems, &bytesLeft, (unsigned char**)&data) != Success)
return false; return false;
ucstring text; std::string text = (const char*)data;
std::string tmpData = (const char*)data;
XFree(data); XFree(data);
// convert buffer to ucstring // convert buffer to ucstring
if (target == XA_UTF8_STRING) if (target == XA_UTF8_STRING)
{ {
text = ucstring::makeFromUtf8(tmpData); // OK
} }
else if (target == XA_STRING) else if (target == XA_STRING)
{ {
text = tmpData; // FIXME: Convert local to UTF-8
// text = NLMISC::CUtfStringView(text).toAscii();
} }
else else
{ {
nlwarning("Unknow format %u", (uint)target); nlwarning("Unknown format %u", (uint)target);
} }
// sent string event to event server // sent string event to event server
@ -768,7 +768,7 @@ bool CUnixEventEmitter::processMessage (XEvent &event, CEventServer *server)
return true; return true;
} }
bool CUnixEventEmitter::copyTextToClipboard(const ucstring &text) bool CUnixEventEmitter::copyTextToClipboard(const std::string &text)
{ {
_CopiedString = text; _CopiedString = text;
@ -787,7 +787,7 @@ bool CUnixEventEmitter::copyTextToClipboard(const ucstring &text)
return true; return true;
} }
bool CUnixEventEmitter::pasteTextFromClipboard(ucstring &text) bool CUnixEventEmitter::pasteTextFromClipboard(std::string &text)
{ {
// check if we own the selection // check if we own the selection
if (_SelectionOwned) if (_SelectionOwned)

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de> // Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -66,12 +67,12 @@ public:
/** /**
* Copy a string to system clipboard. * Copy a string to system clipboard.
*/ */
virtual bool copyTextToClipboard(const ucstring &text); virtual bool copyTextToClipboard(const std::string &text);
/* /*
* Paste a string from system clipboard. * Paste a string from system clipboard.
*/ */
virtual bool pasteTextFromClipboard(ucstring &text); virtual bool pasteTextFromClipboard(std::string &text);
void createIM(); void createIM();
void closeIM(); void closeIM();
@ -105,7 +106,7 @@ private:
XIC _ic; XIC _ic;
NL3D::IDriver* _driver; NL3D::IDriver* _driver;
CUnixEventServer _InternalServer; CUnixEventServer _InternalServer;
ucstring _CopiedString; std::string _CopiedString;
bool _SelectionOwned; bool _SelectionOwned;
}; };

@ -4,7 +4,7 @@
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2010 Matt RAYKOWSKI (sfb) <matt.raykowski@gmail.com> // Copyright (C) 2010 Matt RAYKOWSKI (sfb) <matt.raykowski@gmail.com>
// Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de> // Copyright (C) 2010 Robert TIMM (rti) <mail@rtti.de>
// Copyright (C) 2013-2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2013-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// Copyright (C) 2015 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2015 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
@ -1971,12 +1971,12 @@ bool CDriverUser::setRenderTarget(class UTexture & uTex, uint32 x, uint32 y, uin
return result; return result;
} }
bool CDriverUser::copyTextToClipboard(const ucstring &text) bool CDriverUser::copyTextToClipboard(const std::string &text)
{ {
return _Driver->copyTextToClipboard(text); return _Driver->copyTextToClipboard(text);
} }
bool CDriverUser::pasteTextFromClipboard(ucstring &text) bool CDriverUser::pasteTextFromClipboard(std::string &text)
{ {
return _Driver->pasteTextFromClipboard(text); return _Driver->pasteTextFromClipboard(text);
} }

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2015 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2015-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -256,7 +256,7 @@ CFontGenerator::~CFontGenerator ()
} }
} }
void CFontGenerator::getSizes (ucchar c, uint32 size, uint32 &width, uint32 &height) void CFontGenerator::getSizes (u32char c, uint32 size, uint32 &width, uint32 &height)
{ {
FT_Error error; FT_Error error;
@ -272,7 +272,7 @@ void CFontGenerator::getSizes (ucchar c, uint32 size, uint32 &width, uint32 &hei
if (glyph_index == 0) if (glyph_index == 0)
{ {
// no glyph available, replace with a dot // no glyph available, replace with a dot
glyph_index = FT_Get_Char_Index (_Face, ucchar('.')); glyph_index = FT_Get_Char_Index (_Face, u32char('.'));
} }
// load glyph image into the slot (erase previous one) // load glyph image into the slot (erase previous one)
@ -294,7 +294,7 @@ void CFontGenerator::getSizes (ucchar c, uint32 size, uint32 &width, uint32 &hei
height = _Face->glyph->metrics.height >> 6; height = _Face->glyph->metrics.height >> 6;
} }
uint8 *CFontGenerator::getBitmap (ucchar c, uint32 size, bool embolden, bool oblique, uint32 &width, uint32 &height, uint32 &pitch, sint32 &left, sint32 &top, sint32 &advx, uint32 &glyphIndex) uint8 *CFontGenerator::getBitmap (u32char c, uint32 size, bool embolden, bool oblique, uint32 &width, uint32 &height, uint32 &pitch, sint32 &left, sint32 &top, sint32 &advx, uint32 &glyphIndex)
{ {
FT_Error error; FT_Error error;
@ -307,11 +307,13 @@ uint8 *CFontGenerator::getBitmap (ucchar c, uint32 size, bool embolden, bool obl
// retrieve glyph index from character code // retrieve glyph index from character code
FT_UInt glyph_index = FT_Get_Char_Index (_Face, c); FT_UInt glyph_index = FT_Get_Char_Index (_Face, c);
/*
if (glyph_index == 0) if (glyph_index == 0)
{ {
// no glyph available, replace with a dot // no glyph available, replace with a dot
glyph_index = FT_Get_Char_Index (_Face, ucchar('.')); glyph_index = FT_Get_Char_Index (_Face, u32char('.'));
} }
*/
// load glyph image into the slot (erase previous one) // load glyph image into the slot (erase previous one)
error = FT_Load_Glyph (_Face, glyph_index, FT_LOAD_DEFAULT); error = FT_Load_Glyph (_Face, glyph_index, FT_LOAD_DEFAULT);
@ -372,7 +374,7 @@ uint8 *CFontGenerator::getBitmap (ucchar c, uint32 size, bool embolden, bool obl
void CFontGenerator::getKerning (ucchar left, ucchar right, sint32 &kernx) void CFontGenerator::getKerning (u32char left, u32char right, sint32 &kernx)
{ {
if (!FT_HAS_KERNING(_Face)) if (!FT_HAS_KERNING(_Face))
{ {
@ -392,14 +394,14 @@ void CFontGenerator::getKerning (ucchar left, ucchar right, sint32 &kernx)
uint32 CFontGenerator::getCharIndex (ucchar c) uint32 CFontGenerator::getCharIndex (u32char c)
{ {
uint32 ret = FT_Get_Char_Index(_Face, c); uint32 ret = FT_Get_Char_Index(_Face, c);
if (ret == 0) if (ret == 0)
{ {
// no glyph available, replace with a dot // no glyph available, replace with a dot
ret = FT_Get_Char_Index (_Face, ucchar('.')); ret = FT_Get_Char_Index (_Face, u32char('.'));
} }
return ret; return ret;
@ -473,14 +475,14 @@ CFontGenerator::~CFontGenerator ()
DeleteDC (hdcDib); DeleteDC (hdcDib);
} }
void CFontGenerator::getSizes (ucchar c, uint32 size, uint32 &width, uint32 &height) void CFontGenerator::getSizes (u32char c, uint32 size, uint32 &width, uint32 &height)
{ {
} }
HFONT hFont = NULL; HFONT hFont = NULL;
uint32 CurrentFontSize = 0; uint32 CurrentFontSize = 0;
uint8 *CFontGenerator::getBitmap (ucchar c, uint32 size, bool embolden, bool oblique, uint32 &width, uint32 &height, uint32 &pitch, sint32 &left, sint32 &top, sint32 &advx, uint32 &glyphIndex) uint8 *CFontGenerator::getBitmap (u32char c, uint32 size, bool embolden, bool oblique, uint32 &width, uint32 &height, uint32 &pitch, sint32 &left, sint32 &top, sint32 &advx, uint32 &glyphIndex)
{ {
if (size == 0) if (size == 0)
{ {
@ -527,7 +529,7 @@ uint8 *CFontGenerator::getBitmap (ucchar c, uint32 size, bool embolden, bool obl
SelectObject (hdcDib, hFont); SelectObject (hdcDib, hFont);
SelectObject (hdcDib, Dib); SelectObject (hdcDib, Dib);
const ucchar cc = /*(char)*/ c; const u32char cc = /*(char)*/ c;
// prevent outputing white glyph if char is not available in font // prevent outputing white glyph if char is not available in font
DWORD glyphIndex; DWORD glyphIndex;
@ -637,13 +639,13 @@ uint8 *CFontGenerator::getBitmap (ucchar c, uint32 size, bool embolden, bool obl
void CFontGenerator::getKerning (ucchar left, ucchar right, sint32 &kernx) void CFontGenerator::getKerning (u32char left, u32char right, sint32 &kernx)
{ {
} }
uint32 CFontGenerator::getCharIndex (ucchar c) uint32 CFontGenerator::getCharIndex (u32char c)
{ {
return 0; return 0;
} }

@ -1,6 +1,9 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the
@ -63,27 +66,8 @@ CMaterial* CFontManager::getFontMaterial()
return _MatFont; return _MatFont;
} }
// ***************************************************************************
void CFontManager::computeString (const std::string &s,
CFontGenerator *fontGen,
const NLMISC::CRGBA &color,
uint32 fontSize,
bool embolden,
bool oblique,
IDriver *driver,
CComputedString &output,
bool keep800x600Ratio)
{
// static to avoid reallocation
static ucstring ucs;
ucs= s;
computeString(ucs, fontGen, color, fontSize, embolden, oblique, driver, output, keep800x600Ratio);
}
// *************************************************************************** // ***************************************************************************
void CFontManager::computeString (const ucstring &s, void CFontManager::computeString (NLMISC::CUtfStringView sv,
CFontGenerator *fontGen, CFontGenerator *fontGen,
const NLMISC::CRGBA &color, const NLMISC::CRGBA &color,
uint32 fontSize, uint32 fontSize,
@ -109,7 +93,7 @@ void CFontManager::computeString (const ucstring &s,
} }
// Setting vertices format // Setting vertices format
output.Vertices.setNumVertices (4 * (uint32)s.size()); output.Vertices.setNumVertices (4 * (uint32)sv.largestSize());
// 1 character <-> 1 quad // 1 character <-> 1 quad
sint32 penx = 0, dx; sint32 penx = 0, dx;
@ -144,10 +128,12 @@ void CFontManager::computeString (const ucstring &s,
output.StringHeight = 0; output.StringHeight = 0;
// save string info for later rebuild as needed // save string info for later rebuild as needed
output.Text = s; if (sv.ptr() != output.Text.c_str()) // don't resave if rebuilding
output.Text = sv.toUtf8();
output.CacheVersion = getCacheVersion(); output.CacheVersion = getCacheVersion();
uint j = 0; uint j = 0;
size_t idx = 0;
{ {
CVertexBufferReadWrite vba; CVertexBufferReadWrite vba;
output.Vertices.lock (vba); output.Vertices.lock (vba);
@ -156,10 +142,12 @@ void CFontManager::computeString (const ucstring &s,
hlfPixScrH = 0.f; hlfPixScrH = 0.f;
// For all chars // For all chars
for (uint i = 0; i < s.size(); i++) for (NLMISC::CUtfStringView::iterator it(sv.begin()), end(sv.end()); it != end; ++it, ++idx)
{ {
// Creating font // Creating font
k.Char = s[i]; k.Char = *it;
if (k.Char < 0x20)
k.Char += 0x2400;
k.FontGenerator = fontGen; k.FontGenerator = fontGen;
k.Size = fontSize; k.Size = fontSize;
k.Embolden = embolden; k.Embolden = embolden;
@ -228,6 +216,8 @@ void CFontManager::computeString (const ucstring &s,
} }
} }
output.Vertices.setNumVertices (j); output.Vertices.setNumVertices (j);
output.Length = idx;
nlassert(output.Length == NLMISC::CUtfStringView(output.Text).count());
// compile string info // compile string info
output.StringWidth = (float)penx; output.StringWidth = (float)penx;
@ -245,7 +235,23 @@ void CFontManager::computeString (const ucstring &s,
// *************************************************************************** // ***************************************************************************
void CFontManager::computeStringInfo ( const ucstring &s, void CFontManager::computeStringInfo ( NLMISC::CUtfStringView sv,
CFontGenerator *fontGen,
const NLMISC::CRGBA &color,
uint32 fontSize,
bool embolden,
bool oblique,
IDriver *driver,
CComputedString &output,
bool keep800x600Ratio )
{
computeStringInfo(sv, sv.largestSize(), fontGen, color, fontSize, embolden, oblique, driver, output, keep800x600Ratio);
}
// ***************************************************************************
void CFontManager::computeStringInfo ( NLMISC::CUtfStringView sv,
size_t len,
CFontGenerator *fontGen, CFontGenerator *fontGen,
const NLMISC::CRGBA &color, const NLMISC::CRGBA &color,
uint32 fontSize, uint32 fontSize,
@ -258,10 +264,11 @@ void CFontManager::computeStringInfo ( const ucstring &s,
output.Color = color; output.Color = color;
// save string info for later rebuild as needed // save string info for later rebuild as needed
output.Text = s; if (sv.ptr() != output.Text.c_str()) // don't resave if rebuilding
output.Text = sv.toUtf8();
output.CacheVersion = 0; output.CacheVersion = 0;
if (s.empty()) if (sv.empty())
{ {
output.StringWidth = 0.f; output.StringWidth = 0.f;
output.StringHeight = 0; output.StringHeight = 0;
@ -290,10 +297,13 @@ void CFontManager::computeStringInfo ( const ucstring &s,
CTextureFont::SLetterKey k; CTextureFont::SLetterKey k;
CTextureFont::SLetterInfo *pLI; CTextureFont::SLetterInfo *pLI;
for (uint i = 0; i < s.size(); i++) size_t idx = 0;
for (NLMISC::CUtfStringView::iterator it(sv.begin()), end(sv.end()); it != end && idx < len; ++it, ++idx)
{ {
// Creating font // Creating font
k.Char = s[i]; k.Char = *it;
if (k.Char < 0x20)
k.Char += 0x2400;
k.FontGenerator = fontGen; k.FontGenerator = fontGen;
k.Size = fontSize; k.Size = fontSize;
k.Embolden = embolden; k.Embolden = embolden;
@ -313,6 +323,8 @@ void CFontManager::computeStringInfo ( const ucstring &s,
penx += pLI->AdvX; penx += pLI->AdvX;
} }
} }
output.Length = idx;
nlassert(output.Length == std::min(len, NLMISC::CUtfStringView(output.Text).count()));
// compile string info // compile string info
output.StringWidth = (float)penx; output.StringWidth = (float)penx;

@ -7,7 +7,7 @@
*/ */
// NeL - MMORPG Framework <https://wiki.ryzom.dev/> // NeL - MMORPG Framework <https://wiki.ryzom.dev/>
// Copyright (C) 2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2014-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

@ -1,6 +1,9 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the

@ -1,6 +1,9 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2012-2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2012-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -921,7 +921,7 @@ void CRenderTrav::changeVPLightSetupMaterial(const CMaterial &mat, bool exclude
Driver->setUniform4f(IDriver::VertexProgram, program->idxLighted().Diffuse[i], color); Driver->setUniform4f(IDriver::VertexProgram, program->idxLighted().Diffuse[i], color);
} }
nlassert(_VPNumLights < MaxVPLight);
if (i != _VPNumLights) if (i != _VPNumLights)
{ {
color= _VPLightDiffuse[i] * matDiff; color= _VPLightDiffuse[i] * matDiff;

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013-2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2013-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -775,9 +775,9 @@ CTransformShape *CScene::createInstance(const string &shapeName)
// Look if this instance get lightmap information // Look if this instance get lightmap information
#if defined(__GNUC__) && __GNUC__ < 3 #if defined(__GNUC__) && __GNUC__ < 3
CMeshBase *pMB = (CMeshBase*)((IShape*)(pTShp->Shape)); CMeshBase *pMB = pTShp ? (CMeshBase*)((IShape*)(pTShp->Shape)) : NULL;
#else // not GNUC #else // not GNUC
CMeshBase *pMB = dynamic_cast<CMeshBase*>((IShape*)(pTShp->Shape)); CMeshBase *pMB = pTShp ? dynamic_cast<CMeshBase*>((IShape*)(pTShp->Shape)) : NULL;
#endif // not GNUC #endif // not GNUC
CMeshBaseInstance *pMBI = dynamic_cast<CMeshBaseInstance*>( pTShp ); CMeshBaseInstance *pMBI = dynamic_cast<CMeshBaseInstance*>( pTShp );
if( ( pMB != NULL ) && ( pMBI != NULL ) ) if( ( pMB != NULL ) && ( pMBI != NULL ) )

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2013-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -256,14 +256,14 @@ void CShadowMapManager::renderGenerate(CScene *scene)
garbageShadowTextures(scene); garbageShadowTextures(scene);
IDriver *driverForShadowGeneration= scene->getRenderTrav().getAuxDriver(); IDriver *driverForShadowGeneration= scene->getRenderTrav().getAuxDriver();
nlassert(driverForShadowGeneration);
CSmartPtr<NL3D::ITexture> previousRenderTarget = driverForShadowGeneration->getRenderTarget(); CSmartPtr<NL3D::ITexture> previousRenderTarget = driverForShadowGeneration->getRenderTarget();
// Init // Init
// ******** // ********
uint32 wndW= _BlurTextureW, wndH= _BlurTextureH; uint32 wndW= _BlurTextureW, wndH= _BlurTextureH;
// get some text/screen size. // get some text/screen size.
if(driverForShadowGeneration) driverForShadowGeneration->getWindowSize(wndW, wndH);
driverForShadowGeneration->getWindowSize(wndW, wndH);
uint baseTextureSize= scene->getShadowMapTextureSize(); uint baseTextureSize= scene->getShadowMapTextureSize();
// Minimize the Dest Texture size, so the blurTexture don't get too heavy in VRAM. // Minimize the Dest Texture size, so the blurTexture don't get too heavy in VRAM.
uint32 textDestW= min(wndW, (uint32)NL3D_SMM_MAX_TEXTDEST_SIZE); uint32 textDestW= min(wndW, (uint32)NL3D_SMM_MAX_TEXTDEST_SIZE);

@ -1,6 +1,9 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the
@ -683,8 +686,7 @@ void CShapeBank::reset()
while( scmIt != ShapeCacheNameToShapeCache.end() ) while( scmIt != ShapeCacheNameToShapeCache.end() )
{ {
CShapeCache *pShpCache = getShapeCachePtrFromShapeCacheName( scmIt->first ); CShapeCache *pShpCache = getShapeCachePtrFromShapeCacheName( scmIt->first );
if( pShpCache == NULL ) nlassert(pShpCache);
nlstop; // Should never happen
pShpCache->MaxSize = 0; pShpCache->MaxSize = 0;
checkShapeCache( pShpCache ); checkShapeCache( pShpCache );

@ -1,6 +1,9 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the
@ -121,17 +124,20 @@ void CSurfaceLightGrid::getStaticLightSetup(NLMISC::CRGBA sunAmbient, const CVe
CLightInfluenceInterpolator::CCorner &corner= interp.Corners[y*2 + x]; CLightInfluenceInterpolator::CCorner &corner= interp.Corners[y*2 + x];
// For all lights // For all lights
uint lid; uint lid;
for(lid= 0; lid<CSurfaceLightGrid::NumLightPerCorner; lid++) if (igPointLights)
{ {
// get the id of the light in the ig for (lid = 0; lid < CSurfaceLightGrid::NumLightPerCorner; lid++)
uint igLightId= cellCorner.Light[lid];
// If empty id, stop
if(igLightId==0xFF)
break;
else
{ {
// Set pointer of the light in the corner // get the id of the light in the ig
corner.Lights[lid]= igPointLights + igLightId; uint igLightId = cellCorner.Light[lid];
// If empty id, stop
if (igLightId == 0xFF)
break;
else
{
// Set pointer of the light in the corner
corner.Lights[lid] = igPointLights + igLightId;
}
} }
} }
// Reset Empty slots. // Reset Empty slots.
@ -152,7 +158,7 @@ void CSurfaceLightGrid::getStaticLightSetup(NLMISC::CRGBA sunAmbient, const CVe
// BiLinear Ambient Contribution. // BiLinear Ambient Contribution.
//------------- //-------------
// If FF, then take Sun Ambient => leave color and alpha To 0. // If FF, then take Sun Ambient => leave color and alpha To 0.
if(cellCorner.LocalAmbientId!=0xFF) if(igPointLights && cellCorner.LocalAmbientId!=0xFF)
{ {
CPointLight &pl= igPointLights[cellCorner.LocalAmbientId]; CPointLight &pl= igPointLights[cellCorner.LocalAmbientId];
// take current ambient from pointLight // take current ambient from pointLight

@ -1,6 +1,9 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the
@ -2678,6 +2681,8 @@ void CTessFace::updateBindAndSplit()
} }
else else
{ {
nlassert(f0);
nlassert(f1);
// multipatch face case are detected when face->Patch==NULL !!! // multipatch face case are detected when face->Patch==NULL !!!
if(f0->FLeft && f0->FLeft->Patch==NULL) if(f0->FLeft && f0->FLeft->Patch==NULL)
{ {
@ -2710,6 +2715,8 @@ void CTessFace::updateBindAndSplit()
} }
else else
{ {
nlassert(f0);
nlassert(f1);
if(f0->FLeft) if(f0->FLeft)
{ {
while(f0->FLeft->isLeaf()) while(f0->FLeft->isLeaf())
@ -2781,6 +2788,8 @@ void CTessFace::updateBindAndSplit()
{ {
CTessFace *f; CTessFace *f;
sint i; sint i;
nlassert(f0);
nlassert(f1);
// Same reasoning for rectangular patchs, as above. // Same reasoning for rectangular patchs, as above.
for(i=0;i<2;i++) for(i=0;i<2;i++)

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2014-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -77,13 +77,11 @@ uint32 CTextContext::textPush (const char *format, ...)
char *str; char *str;
NLMISC_CONVERT_VARGS (str, format, NLMISC::MaxCStringSize); NLMISC_CONVERT_VARGS (str, format, NLMISC::MaxCStringSize);
ucstring uc; return textPush(NLMISC::CUtfStringView(str));
uc.fromUtf8((const char *)str);
return textPush(uc);
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
uint32 CTextContext::textPush (const ucstring &str) uint32 CTextContext::textPush (NLMISC::CUtfStringView sv)
{ {
nlassert(_FontGen); nlassert(_FontGen);
@ -103,7 +101,7 @@ uint32 CTextContext::textPush (const ucstring &str)
nlassert (index < _CacheStrings.size()); nlassert (index < _CacheStrings.size());
CComputedString &strToFill = _CacheStrings[index]; CComputedString &strToFill = _CacheStrings[index];
_FontManager->computeString (str, _FontGen, _Color, _FontSize, _Embolden, _Oblique, _Driver, strToFill, _Keep800x600Ratio); _FontManager->computeString (sv, _FontGen, _Color, _FontSize, _Embolden, _Oblique, _Driver, strToFill, _Keep800x600Ratio);
// just compute letters, glyphs are rendered on demand before first draw // just compute letters, glyphs are rendered on demand before first draw
//_FontManager->computeStringInfo(str, _FontGen, _Color, _FontSize, _Embolden, _Oblique, _Driver, strToFill, _Keep800x600Ratio); //_FontManager->computeStringInfo(str, _FontGen, _Color, _FontSize, _Embolden, _Oblique, _Driver, strToFill, _Keep800x600Ratio);

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2014-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -231,11 +231,11 @@ uint32 CTextContextUser::textPush(const char *format, ...)
return _TextContext.textPush(ucstring(str)) ; return _TextContext.textPush(ucstring(str)) ;
} }
uint32 CTextContextUser::textPush(const ucstring &str) uint32 CTextContextUser::textPush(NLMISC::CUtfStringView sv)
{ {
H_AUTO2; H_AUTO2;
return _TextContext.textPush(str) ; return _TextContext.textPush(sv) ;
} }
void CTextContextUser::setStringColor(uint32 i, CRGBA newCol) void CTextContextUser::setStringColor(uint32 i, CRGBA newCol)
{ {
@ -275,16 +275,23 @@ UTextContext::CStringInfo CTextContextUser::getStringInfo(uint32 i)
CComputedString *cstr= _TextContext.getComputedString(i); CComputedString *cstr= _TextContext.getComputedString(i);
if(!cstr) if(!cstr)
return CStringInfo(0, 0, 0); return CStringInfo(0, 0, 0, 0);
else else
return CStringInfo(cstr->StringWidth, cstr->StringHeight, cstr->StringLine); return CStringInfo(cstr->StringWidth, cstr->StringHeight, cstr->StringLine, cstr->Length);
} }
UTextContext::CStringInfo CTextContextUser::getStringInfo(const ucstring &str) UTextContext::CStringInfo CTextContextUser::getStringInfo(NLMISC::CUtfStringView sv)
{ {
H_AUTO2; H_AUTO2;
_TextContext.computeStringInfo(str, _CacheString); _TextContext.computeStringInfo(sv, _CacheString);
return CStringInfo (_CacheString.StringWidth, _CacheString.StringHeight, _CacheString.StringLine); return CStringInfo (_CacheString.StringWidth, _CacheString.StringHeight, _CacheString.StringLine, _CacheString.Length);
}
UTextContext::CStringInfo CTextContextUser::getStringInfo(NLMISC::CUtfStringView sv, size_t len)
{
H_AUTO2;
_TextContext.computeStringInfo(sv, _CacheString, len);
return CStringInfo (_CacheString.StringWidth, _CacheString.StringHeight, _CacheString.StringLine, _CacheString.Length);
} }
void CTextContextUser::clear() void CTextContextUser::clear()
{ {
@ -319,11 +326,11 @@ void CTextContextUser::printClipAtOld (float x, float y, uint32 i, float xmin, f
printClipAt(rdrBuffer, x, y ,i, xmin, ymin, xmax, ymax); printClipAt(rdrBuffer, x, y ,i, xmin, ymin, xmax, ymax);
flushRenderBuffer(&rdrBuffer); flushRenderBuffer(&rdrBuffer);
} }
void CTextContextUser::printAt(float x, float y, const ucstring &ucstr) void CTextContextUser::printAt(float x, float y, NLMISC::CUtfStringView sv)
{ {
H_AUTO2; H_AUTO2;
_TextContext.printAt(x, y, ucstr); _TextContext.printAt(x, y, sv);
_DriverUser->restoreMatrixContext(); _DriverUser->restoreMatrixContext();
} }
void CTextContextUser::printfAt(float x, float y, const char * format, ...) void CTextContextUser::printfAt(float x, float y, const char * format, ...)
@ -337,12 +344,12 @@ void CTextContextUser::printfAt(float x, float y, const char * format, ...)
_DriverUser->restoreMatrixContext(); _DriverUser->restoreMatrixContext();
} }
void CTextContextUser::render3D(const CMatrix &mat, const ucstring &ucstr) void CTextContextUser::render3D(const CMatrix &mat, NLMISC::CUtfStringView sv)
{ {
NL3D_HAUTO_RENDER_3D_TEXTCONTEXT; NL3D_HAUTO_RENDER_3D_TEXTCONTEXT;
CComputedString computedStr; CComputedString computedStr;
_TextContext.computeString(ucstr,computedStr); _TextContext.computeString(sv,computedStr);
computedStr.render3D(*_Driver,mat); computedStr.render3D(*_Driver,mat);
@ -355,7 +362,7 @@ void CTextContextUser::render3D(const CMatrix &mat, const char *format, ...)
char *str; char *str;
NLMISC_CONVERT_VARGS (str, format, NLMISC::MaxCStringSize); NLMISC_CONVERT_VARGS (str, format, NLMISC::MaxCStringSize);
render3D(mat, ucstring(str)); render3D(mat, str);
_DriverUser->restoreMatrixContext(); _DriverUser->restoreMatrixContext();
} }

@ -1,6 +1,9 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2014-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

@ -2,7 +2,7 @@
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2014-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

@ -1,8 +1,7 @@
FILE(GLOB SRC *.cpp *.h) FILE(GLOB SRC *.cpp *.h)
FILE(GLOB HEADERS ../../include/nel/gui/*.h) FILE(GLOB HEADERS ../../include/nel/gui/*.h)
SOURCE_GROUP("include" FILES ${HEADERS}) SOURCE_GROUP("" FILES ${HEADERS} ${SRC})
SOURCE_GROUP("src" FILES ${SRC})
NL_TARGET_LIB(nelgui ${SRC} ${HEADERS}) NL_TARGET_LIB(nelgui ${SRC} ${HEADERS})

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -751,9 +752,7 @@ namespace NLGUI
{ {
virtual void execute (CCtrlBase *pCaller, const std::string &params) virtual void execute (CCtrlBase *pCaller, const std::string &params)
{ {
ucstring s; if (!CViewRenderer::getInstance()->getDriver()->copyTextToClipboard(params))
s.fromUtf8(params);
if (!CViewRenderer::getInstance()->getDriver()->copyTextToClipboard(s))
{ {
nlwarning("Copy to clipboard failed: '%s'", params.c_str()); nlwarning("Copy to clipboard failed: '%s'", params.c_str());
} }

@ -1,6 +1,9 @@
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/> // Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This source file has been modified by the following contributors:
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
//
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the
@ -65,7 +68,7 @@ namespace NLGUI
_Rules.clear(); _Rules.clear();
_Style.clear(); _Style.clear();
_Style.fromUtf8(cssString); _Style = cssString;
preprocess(); preprocess();
_Position = 0; _Position = 0;
@ -73,7 +76,7 @@ namespace NLGUI
{ {
skipWhitespace(); skipWhitespace();
if (_Style[_Position] == (ucchar)'@') if (_Style[_Position] == '@')
readAtRule(); readAtRule();
else else
readRule(); readRule();
@ -89,13 +92,13 @@ namespace NLGUI
// style: "color: red; font-size: 10px;" // style: "color: red; font-size: 10px;"
// //
// @internal // @internal
void CCssParser::parseRule(const ucstring &selectorString, const ucstring &styleString) void CCssParser::parseRule(const std::string &selectorString, const std::string &styleString)
{ {
std::vector<ucstring> selectors; std::vector<std::string> selectors;
NLMISC::explode(selectorString, ucstring(","), selectors); NLMISC::explode(selectorString, std::string(","), selectors);
TStyleVec props; TStyleVec props;
props = parseDecls(styleString.toUtf8()); props = parseDecls(styleString);
// duplicate props to each selector in selector list, // duplicate props to each selector in selector list,
// example 'div > p, h1' creates 'div>p' and 'h1' // example 'div > p, h1' creates 'div>p' and 'h1'
@ -129,7 +132,7 @@ namespace NLGUI
skipIdentifier(); skipIdentifier();
// skip at-rule statement // skip at-rule statement
while(!is_eof() && _Style[_Position] != (ucchar)';') while(!is_eof() && _Style[_Position] != ';')
{ {
if (maybe_escape()) if (maybe_escape())
{ {
@ -174,9 +177,9 @@ namespace NLGUI
_Position++; _Position++;
else if (is_quote(_Style[_Position])) else if (is_quote(_Style[_Position]))
skipString(); skipString();
else if (_Style[_Position] == (ucchar)'[') else if (_Style[_Position] == '[')
skipBlock(); skipBlock();
else if (_Style[_Position] == (ucchar)'{') else if (_Style[_Position] == '{')
break; break;
else else
_Position++; _Position++;
@ -184,7 +187,7 @@ namespace NLGUI
if (!is_eof()) if (!is_eof())
{ {
ucstring selector; std::string selector;
selector.append(_Style, start, _Position - start); selector.append(_Style, start, _Position - start);
skipWhitespace(); skipWhitespace();
@ -194,7 +197,7 @@ namespace NLGUI
skipBlock(); skipBlock();
if (_Position <= _Style.size()) if (_Position <= _Style.size())
{ {
ucstring rules; std::string rules;
rules.append(_Style, start + 1, _Position - start - 2); rules.append(_Style, start + 1, _Position - start - 2);
parseRule(selector, rules); parseRule(selector, rules);
@ -215,7 +218,7 @@ namespace NLGUI
for(uint i=0; i<6 && is_hex(_Style[_Position]); i++) for(uint i=0; i<6 && is_hex(_Style[_Position]); i++)
_Position++; _Position++;
if (_Style[_Position] == (ucchar)' ') if (_Style[_Position] == ' ')
_Position++; _Position++;
} }
else if (_Style[_Position] != 0x0A) else if (_Style[_Position] != 0x0A)
@ -246,23 +249,23 @@ namespace NLGUI
// cannot start with digit // cannot start with digit
valid = false; valid = false;
} }
else if ((_Position - start) == 0 && _Style[_Position-1] == (ucchar)'-') else if ((_Position - start) == 0 && _Style[_Position-1] == '-')
{ {
// cannot start with -# // cannot start with -#
valid = false; valid = false;
} }
} }
else if (_Style[_Position] == (ucchar)'_') else if (_Style[_Position] == '_')
{ {
// valid // valid
} }
else if (_Style[_Position] >= 0x0080) else if (_Style[_Position] >= 0x80)
{ {
// valid // valid
} }
else if (_Style[_Position] == (ucchar)'-') else if (_Style[_Position] == '-')
{ {
if ((_Position - start) == 1 && _Style[_Position-1] == (ucchar)'-') if ((_Position - start) == 1 && _Style[_Position-1] == '-')
{ {
// cannot start with -- // cannot start with --
valid = false; valid = false;
@ -285,7 +288,7 @@ namespace NLGUI
// @internal // @internal
void CCssParser::skipBlock() void CCssParser::skipBlock()
{ {
ucchar startChar = _Style[_Position]; char startChar = _Style[_Position];
// block start // block start
_Position++; _Position++;
@ -311,7 +314,7 @@ namespace NLGUI
// @internal // @internal
void CCssParser::skipString() void CCssParser::skipString()
{ {
ucchar endChar = _Style[_Position]; char endChar = _Style[_Position];
// quote start // quote start
_Position++; _Position++;
@ -338,7 +341,7 @@ namespace NLGUI
// *************************************************************************** // ***************************************************************************
// parse selector list // parse selector list
// @internal // @internal
std::vector<CCssSelector> CCssParser::parse_selector(const ucstring &sel, std::string &pseudoElement) const std::vector<CCssSelector> CCssParser::parse_selector(const std::string &sel, std::string &pseudoElement) const
{ {
std::vector<CCssSelector> result; std::vector<CCssSelector> result;
CCssSelector current; CCssSelector current;
@ -346,10 +349,10 @@ namespace NLGUI
pseudoElement.clear(); pseudoElement.clear();
bool failed = false; bool failed = false;
ucstring::size_type start = 0, pos = 0; std::string::size_type start = 0, pos = 0;
while(pos < sel.size()) while(pos < sel.size())
{ {
ucstring uc; std::string uc;
uc = sel[pos]; uc = sel[pos];
if (is_nmchar(sel[pos]) && current.empty()) if (is_nmchar(sel[pos]) && current.empty())
{ {
@ -358,7 +361,7 @@ namespace NLGUI
while(pos < sel.size() && is_nmchar(sel[pos])) while(pos < sel.size() && is_nmchar(sel[pos]))
pos++; pos++;
current.Element = toLower(sel.substr(start, pos - start).toUtf8()); current.Element = toLower(sel.substr(start, pos - start));
start = pos; start = pos;
continue; continue;
} }
@ -371,7 +374,7 @@ namespace NLGUI
while(pos < sel.size() && is_nmchar(sel[pos])) while(pos < sel.size() && is_nmchar(sel[pos]))
pos++; pos++;
current.Id = toLower(sel.substr(start, pos - start).toUtf8()); current.Id = toLower(sel.substr(start, pos - start));
start = pos; start = pos;
} }
else if (sel[pos] == '.') else if (sel[pos] == '.')
@ -383,7 +386,7 @@ namespace NLGUI
while(pos < sel.size() && (is_nmchar(sel[pos]) || sel[pos] == '.')) while(pos < sel.size() && (is_nmchar(sel[pos]) || sel[pos] == '.'))
pos++; pos++;
current.setClass(toLower(sel.substr(start, pos - start).toUtf8())); current.setClass(toLower(sel.substr(start, pos - start)));
start = pos; start = pos;
} }
else if (sel[pos] == '[') else if (sel[pos] == '[')
@ -399,9 +402,9 @@ namespace NLGUI
start = pos; start = pos;
} }
ucstring key; std::string key;
ucstring value; std::string value;
ucchar op = ' '; char op = ' ';
// key // key
while(pos < sel.size() && is_nmchar(sel[pos])) while(pos < sel.size() && is_nmchar(sel[pos]))
@ -420,7 +423,7 @@ namespace NLGUI
if (sel[pos] == ']') if (sel[pos] == ']')
{ {
current.addAttribute(key.toUtf8()); current.addAttribute(key);
} }
else else
{ {
@ -496,14 +499,14 @@ namespace NLGUI
// [value="attr" i] // [value="attr" i]
if (value.size() > 2 && value[value.size()-2] == ' ') if (value.size() > 2 && value[value.size()-2] == ' ')
{ {
ucchar lastChar = value[value.size()-1]; char lastChar = value[value.size()-1];
if (lastChar == 'i' || lastChar == 'I' || lastChar == 's' || lastChar == 'S') if (lastChar == 'i' || lastChar == 'I' || lastChar == 's' || lastChar == 'S')
{ {
value = value.substr(0, value.size()-2); value = value.substr(0, value.size()-2);
cs = !((lastChar == 'i' || lastChar == 'I')); cs = !((lastChar == 'i' || lastChar == 'I'));
} }
} }
current.addAttribute(key.toUtf8(), trimQuotes(value).toUtf8(), (char)op, cs); current.addAttribute(key, trimQuotes(value), (char)op, cs);
} // op error } // op error
} // no value } // no value
@ -549,7 +552,7 @@ namespace NLGUI
} }
} }
std::string key = toLower(sel.substr(start, pos - start).toUtf8()); std::string key = toLower(sel.substr(start, pos - start));
if (key.empty()) if (key.empty())
{ {
failed = true; failed = true;
@ -647,7 +650,7 @@ namespace NLGUI
size_t start; size_t start;
size_t charsLeft; size_t charsLeft;
bool quote = false; bool quote = false;
ucchar quoteChar; char quoteChar;
while(!is_eof()) while(!is_eof())
{ {
charsLeft = _Style.size() - _Position - 1; charsLeft = _Style.size() - _Position - 1;
@ -660,14 +663,15 @@ namespace NLGUI
if (charsLeft >= 1 && _Style[_Position] == 0x0D && _Style[_Position+1] == 0x0A) if (charsLeft >= 1 && _Style[_Position] == 0x0D && _Style[_Position+1] == 0x0A)
len++; len++;
ucstring tmp; std::string tmp;
tmp += 0x000A; tmp += 0x0A;
_Style.replace(_Position, 1, tmp); _Style.replace(_Position, 1, tmp);
} }
else if (_Style[_Position] == 0x00) else if (_Style[_Position] == 0x00)
{ {
// Unicode replacement character // Unicode replacement character
_Style[_Position] = 0xFFFD; // _Style[_Position] = 0xFFFD;
_Style.replace(_Position, 1, "\xEF\xBF\xBD");
} }
else else
{ {
@ -686,12 +690,12 @@ namespace NLGUI
} }
else if (!quote && is_comment_open()) else if (!quote && is_comment_open())
{ {
size_t pos = _Style.find(ucstring("*/"), _Position + 2); size_t pos = _Style.find("*/", _Position + 2);
if (pos == std::string::npos) if (pos == std::string::npos)
pos = _Style.size(); pos = _Style.size();
_Style.erase(_Position, pos - _Position + 2); _Style.erase(_Position, pos - _Position + 2);
ucstring uc; std::string uc;
uc = _Style[_Position]; uc = _Style[_Position];
// _Position is already at correct place // _Position is already at correct place

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -122,30 +123,26 @@ namespace NLGUI
CXMLAutoPtr prop; CXMLAutoPtr prop;
// get static toolTip // get static toolTip
prop = (char*) xmlGetProp( cur, (xmlChar*)"tooltip" ); prop = (char *)xmlGetProp(cur, (xmlChar *)"tooltip_i18n");
if (prop) if ((bool)prop && strlen((const char *)prop) > 0)
{ {
const char *propPtr = prop; // Force I18N tooltip
if (strlen(propPtr) > 2 && propPtr[0] == 'u' && propPtr[1] == ':') if (!editorMode)
_ContextHelp = ucstring::makeFromUtf8(std::string(propPtr).substr(2)); _ContextHelp = CI18N::get((const char *)prop);
else else
_ContextHelp = ucstring(propPtr); _ContextHelp = (const char *)prop;
if( !editorMode && ( strlen(propPtr) > 2 ) )
{
if ((propPtr[0] == 'u') && (propPtr[1] == 'i'))
_ContextHelp = CI18N::get ((const char *) prop);
}
} }
// Force I18N tooltip else
prop = (char*) xmlGetProp( cur, (xmlChar*)"tooltip_i18n" );
if ((bool)prop && strlen((const char*)prop)>0)
{ {
if( !editorMode ) // get static toolTip
_ContextHelp = CI18N::get ((const char *) prop); prop = (char *)xmlGetProp(cur, (xmlChar *)"tooltip");
else if (prop)
_ContextHelp = (const char*)prop; {
if (!editorMode && NLMISC::startsWith((const char *)prop, "ui"))
_ContextHelp = CI18N::get((const char *)prop);
else
_ContextHelp = (const char *)prop;
}
} }
// get dynamic toolTip ActionHandler // get dynamic toolTip ActionHandler
@ -173,7 +170,7 @@ namespace NLGUI
_ToolTipSpecialParent= CStringShared(); _ToolTipSpecialParent= CStringShared();
if(prop) if(prop)
{ {
_ToolTipSpecialParent= std::string((const char*)prop); _ToolTipSpecialParent= (const char*)prop;
} }
// Tooltip posref // Tooltip posref
@ -201,12 +198,12 @@ namespace NLGUI
{ {
if( name == "tooltip" ) if( name == "tooltip" )
{ {
return _ContextHelp.toString(); return _ContextHelp;
} }
else else
if( name == "tooltip_i18n" ) if( name == "tooltip_i18n" )
{ {
return _ContextHelp.toString(); return _ContextHelp;
} }
else else
if( name == "on_tooltip" ) if( name == "on_tooltip" )
@ -262,13 +259,19 @@ namespace NLGUI
{ {
if( name == "tooltip" ) if( name == "tooltip" )
{ {
_ContextHelp = ucstring::makeFromUtf8(value); if (!editorMode && NLMISC::startsWith(value, "ui"))
_ContextHelp = CI18N::get(value);
else
_ContextHelp = value;
return; return;
} }
else else
if( name == "tooltip_i18n" ) if( name == "tooltip_i18n" )
{ {
_ContextHelp = value; if (!editorMode)
_ContextHelp = CI18N::get(value);
else
_ContextHelp = value;
return; return;
} }
else else
@ -380,8 +383,8 @@ namespace NLGUI
if( node == NULL ) if( node == NULL )
return NULL; return NULL;
xmlNewProp( node, BAD_CAST "tooltip", BAD_CAST _ContextHelp.toString().c_str() ); xmlNewProp( node, BAD_CAST "tooltip", BAD_CAST _ContextHelp.c_str() );
xmlNewProp( node, BAD_CAST "tooltip_i18n", BAD_CAST _ContextHelp.toString().c_str() ); xmlNewProp( node, BAD_CAST "tooltip_i18n", BAD_CAST _ContextHelp.c_str() );
xmlNewProp( node, BAD_CAST "on_tooltip", BAD_CAST _OnContextHelp.toString().c_str() ); xmlNewProp( node, BAD_CAST "on_tooltip", BAD_CAST _OnContextHelp.toString().c_str() );
xmlNewProp( node, BAD_CAST "on_tooltip_params", BAD_CAST _OnContextHelpParams.toString().c_str() ); xmlNewProp( node, BAD_CAST "on_tooltip_params", BAD_CAST _OnContextHelpParams.toString().c_str() );
xmlNewProp( node, BAD_CAST "tooltip_parent", BAD_CAST tooltipParentToString( _ToolTipParent ).c_str() ); xmlNewProp( node, BAD_CAST "tooltip_parent", BAD_CAST tooltipParentToString( _ToolTipParent ).c_str() );
@ -474,7 +477,7 @@ namespace NLGUI
// *************************************************************************** // ***************************************************************************
bool CCtrlBase::emptyContextHelp() const bool CCtrlBase::emptyContextHelp() const
{ {
ucstring help; std::string help;
getContextHelp(help); getContextHelp(help);
std::string sTmp = _OnContextHelp; std::string sTmp = _OnContextHelp;
return help.empty() && sTmp.empty(); return help.empty() && sTmp.empty();
@ -492,12 +495,15 @@ namespace NLGUI
void CCtrlBase::serial(NLMISC::IStream &f) void CCtrlBase::serial(NLMISC::IStream &f)
{ {
CViewBase::serial(f); CViewBase::serial(f);
uint version = f.serialVersion(1);
nlassert(version);
f.serial(_ContextHelp); f.serial(_ContextHelp);
f.serial(_OnContextHelp); f.serial(_OnContextHelp);
f.serial(_OnContextHelpParams); f.serial(_OnContextHelpParams);
f.serial(_ToolTipSpecialParent); f.serial(_ToolTipSpecialParent);
f.serialEnum(_ToolTipParent); f.serialEnum(_ToolTipParent);
//
THotSpot tmpToolTipParentPosRef = _ToolTipParentPosRef; THotSpot tmpToolTipParentPosRef = _ToolTipParentPosRef;
THotSpot tmpToolTipPosRef = _ToolTipPosRef; THotSpot tmpToolTipPosRef = _ToolTipPosRef;
@ -513,7 +519,7 @@ namespace NLGUI
_ToolTipPosRef = tmpToolTipPosRef; _ToolTipPosRef = tmpToolTipPosRef;
_ToolTipParentPosRefAlt = tmpToolTipParentPosRefAlt; _ToolTipParentPosRefAlt = tmpToolTipParentPosRefAlt;
_ToolTipPosRefAlt = tmpToolTipPosRefAlt; _ToolTipPosRefAlt = tmpToolTipPosRefAlt;
//
nlSerialBitBool(f, _ToolTipInstant); nlSerialBitBool(f, _ToolTipInstant);
} }
@ -575,7 +581,7 @@ namespace NLGUI
CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING);
std::string tooltip = ls.toString(1); std::string tooltip = ls.toString(1);
setDefaultContextHelp(ucstring::makeFromUtf8(tooltip)); setDefaultContextHelp(tooltip);
return 0; return 0;
} }

@ -3,7 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2015 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2015-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -136,7 +137,7 @@ namespace NLGUI
if( name == "hardtext" ) if( name == "hardtext" )
{ {
if( _ViewText != NULL ) if( _ViewText != NULL )
return _ViewText->getText().toString(); return _ViewText->getText();
else else
return std::string( "" ); return std::string( "" );
} }
@ -316,7 +317,7 @@ namespace NLGUI
if( name == "hardtext" ) if( name == "hardtext" )
{ {
if( _ViewText != NULL ) if( _ViewText != NULL )
_ViewText->setText( value ); _ViewText->setHardText( value );
return; return;
} }
else else
@ -487,7 +488,7 @@ namespace NLGUI
xmlNewProp( node, BAD_CAST "wmargin", BAD_CAST toString( _WMargin ).c_str() ); xmlNewProp( node, BAD_CAST "wmargin", BAD_CAST toString( _WMargin ).c_str() );
xmlNewProp( node, BAD_CAST "wmin", BAD_CAST toString( _WMin ).c_str() ); xmlNewProp( node, BAD_CAST "wmin", BAD_CAST toString( _WMin ).c_str() );
xmlNewProp( node, BAD_CAST "hmin", BAD_CAST toString( _HMin ).c_str() ); xmlNewProp( node, BAD_CAST "hmin", BAD_CAST toString( _HMin ).c_str() );
xmlNewProp( node, BAD_CAST "hardtext", BAD_CAST _ViewText->getText().toString().c_str() ); xmlNewProp( node, BAD_CAST "hardtext", BAD_CAST _ViewText->getText().c_str() );
xmlNewProp( node, BAD_CAST "text_y", BAD_CAST toString( _TextY ).c_str() ); xmlNewProp( node, BAD_CAST "text_y", BAD_CAST toString( _TextY ).c_str() );
xmlNewProp( node, BAD_CAST "text_x", BAD_CAST toString( _TextX ).c_str() ); xmlNewProp( node, BAD_CAST "text_x", BAD_CAST toString( _TextX ).c_str() );
xmlNewProp( node, BAD_CAST "text_underlined", BAD_CAST toString( _ViewText->getUnderlined() ).c_str() ); xmlNewProp( node, BAD_CAST "text_underlined", BAD_CAST toString( _ViewText->getUnderlined() ).c_str() );
@ -596,10 +597,7 @@ namespace NLGUI
if (prop) if (prop)
{ {
const char *propPtr = prop; const char *propPtr = prop;
ucstring text = ucstring(propPtr); _ViewText->setTextLocalized(propPtr, true);
if ((strlen(propPtr)>2) && (propPtr[0] == 'u') && (propPtr[1] == 'i'))
text = CI18N::get (propPtr);
_ViewText->setText(text);
} }
} }
@ -988,7 +986,7 @@ namespace NLGUI
nlassert( v != NULL ); nlassert( v != NULL );
_ViewText = dynamic_cast< CViewText* >( v ); _ViewText = dynamic_cast< CViewText* >( v );
_ViewText->setId( _Id + "_text" ); _ViewText->setId( _Id + "_text" );
_ViewText->setText( ucstring( "text" ) ); _ViewText->setText( "text" );
_ViewText->setSerializable( false ); _ViewText->setSerializable( false );
} }
@ -1039,17 +1037,32 @@ namespace NLGUI
// *************************************************************************** // ***************************************************************************
void CCtrlTextButton::setText (const ucstring &text) void CCtrlTextButton::setText (const std::string &text)
{ {
if (_ViewText && !_IsViewTextId) if (_ViewText && !_IsViewTextId)
_ViewText->setText(text); _ViewText->setText(text);
} }
// *************************************************************************** // ***************************************************************************
ucstring CCtrlTextButton::getText () const std::string CCtrlTextButton::getText () const
{ {
if (_ViewText && !_IsViewTextId) if (_ViewText && !_IsViewTextId)
return _ViewText->getText(); return _ViewText->getText();
return std::string();
}
// ***************************************************************************
void CCtrlTextButton::setTextAsUtf16 (const ucstring &text)
{
if (_ViewText && !_IsViewTextId)
_ViewText->setText(text.toUtf8());
}
// ***************************************************************************
ucstring CCtrlTextButton::getTextAsUtf16 () const
{
if (_ViewText && !_IsViewTextId)
return CUtfStringView(_ViewText->getText()).toUtf16();
return ucstring(""); return ucstring("");
} }

@ -3,7 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2013-2015 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2013-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -43,7 +43,7 @@ namespace NLGUI
void force_link_dbgroup_combo_box_cpp() { } void force_link_dbgroup_combo_box_cpp() { }
// Compare strings // Compare strings
static inline bool lt_text(const std::pair<int,ucstring> &s1, const std::pair<int,ucstring> &s2) static inline bool lt_text(const std::pair<int,std::string> &s1, const std::pair<int,std::string> &s2)
{ {
return toLower(s1.second) < toLower(s2.second); return toLower(s1.second) < toLower(s2.second);
} }
@ -183,10 +183,10 @@ namespace NLGUI
if (name) if (name)
{ {
const char *propPtr = name; const char *propPtr = name;
ucstring Text = ucstring::makeFromUtf8(propPtr); if (NLMISC::startsWith(propPtr, "ui"))
if ((strlen(propPtr)>2) && (propPtr[0] == 'u') && (propPtr[1] == 'i')) addText(CI18N::get(propPtr));
Text = CI18N::get (propPtr); else
addText(Text); addText(propPtr);
} }
} }
child = child->next; child = child->next;
@ -236,7 +236,7 @@ namespace NLGUI
// change selected text // change selected text
if(_CacheSelection<0 || _CacheSelection>=(sint32)_Texts.size() ) if(_CacheSelection<0 || _CacheSelection>=(sint32)_Texts.size() )
{ {
_ViewText->setText(ucstring()); _ViewText->setText(std::string());
} }
else if(_IsExternViewText) else if(_IsExternViewText)
{ {
@ -274,7 +274,7 @@ namespace NLGUI
} }
// *************************************************************************** // ***************************************************************************
void CDBGroupComboBox::addText(const ucstring &text) void CDBGroupComboBox::addText(const std::string &text)
{ {
dirt(); dirt();
_Texts.push_back(make_pair((uint)_Texts.size(), text)); _Texts.push_back(make_pair((uint)_Texts.size(), text));
@ -283,7 +283,7 @@ namespace NLGUI
} }
// *************************************************************************** // ***************************************************************************
void CDBGroupComboBox::setText(uint i, const ucstring &text) void CDBGroupComboBox::setText(uint i, const std::string &text)
{ {
dirt(); dirt();
if(i<_Texts.size()) if(i<_Texts.size())
@ -291,7 +291,7 @@ namespace NLGUI
} }
// *************************************************************************** // ***************************************************************************
void CDBGroupComboBox::insertText(uint i, const ucstring &text) void CDBGroupComboBox::insertText(uint i, const std::string &text)
{ {
dirt(); dirt();
if(i<_Texts.size()) if(i<_Texts.size())
@ -313,7 +313,7 @@ namespace NLGUI
} }
// *************************************************************************** // ***************************************************************************
void CDBGroupComboBox::setTexture(uint i, const ucstring &texture) void CDBGroupComboBox::setTexture(uint i, const std::string &texture)
{ {
dirt(); dirt();
if(i<_Textures.size()) if(i<_Textures.size())
@ -351,13 +351,19 @@ namespace NLGUI
} }
// *************************************************************************** // ***************************************************************************
const ucstring &CDBGroupComboBox::getText(uint i) const const std::string &CDBGroupComboBox::getText(uint i) const
{ {
static ucstring null; static const std::string empty;
if(i<_Texts.size()) if (i < _Texts.size())
return _Texts[i].second; return _Texts[i].second;
else else
return null; return empty;
}
// ***************************************************************************
ucstring CDBGroupComboBox::getTextAsUtf16(uint i) const
{
return ucstring::makeFromUtf8(getText(i));
} }
// *************************************************************************** // ***************************************************************************
@ -385,15 +391,21 @@ namespace NLGUI
{ {
sort(_Texts.begin(), _Texts.end(), lt_text); sort(_Texts.begin(), _Texts.end(), lt_text);
} }
// *************************************************************************** // ***************************************************************************
const ucstring &CDBGroupComboBox::getTexture(uint i) const const std::string &CDBGroupComboBox::getTexture(uint i) const
{ {
static ucstring null; static const std::string empty;
if(i<_Textures.size()) if (i < _Textures.size())
return _Textures[i]; return _Textures[i];
else else
return null; return empty;
}
// ***************************************************************************
ucstring CDBGroupComboBox::getTextureAsUtf16(uint i) const
{
return ucstring::makeFromUtf8(getTexture(i));
} }
// *************************************************************************** // ***************************************************************************
@ -452,8 +464,7 @@ namespace NLGUI
sint32 value; sint32 value;
for(uint i=0; i<getNumTexts(); i++) for(uint i=0; i<getNumTexts(); i++)
{ {
std::string sText; std::string sText = getText(i);
getText(i).toString(sText);
if(sText == val) if(sText == val)
{ {
value = i; value = i;
@ -464,17 +475,23 @@ namespace NLGUI
} }
// *************************************************************************** // ***************************************************************************
void CDBGroupComboBox::setViewText(const ucstring & text) void CDBGroupComboBox::setViewText(const std::string &text)
{ {
_IsExternViewText = true; _IsExternViewText = true;
_ExternViewText = ucstring(text); _ExternViewText = text;
_ViewText->setText(_ExternViewText); _ViewText->setText(_ExternViewText);
} }
// *************************************************************************** // ***************************************************************************
ucstring CDBGroupComboBox::getViewText() const std::string CDBGroupComboBox::getViewText() const
{ {
return _ViewText->getText(); return _ViewText->getText();
}
// ***************************************************************************
ucstring CDBGroupComboBox::getViewTextAsUtf16() const
{
return CUtfStringView(_ViewText->getText()).toUtf16();
} }
// *************************************************************************** // ***************************************************************************
@ -486,18 +503,14 @@ namespace NLGUI
// *************************************************************************** // ***************************************************************************
std::string CDBGroupComboBox::getSelectionText() const std::string CDBGroupComboBox::getSelectionText() const
{ {
ucstring text;
if (_LinkedToDB) if (_LinkedToDB)
{ {
text = getText(_Selection.getSInt32()); return getText(_Selection.getSInt32());
} }
else else
{ {
text = getText(_NotLinkedToDBSelection); return getText(_NotLinkedToDBSelection);
} }
std::string texteS;
text.toString(texteS);
return texteS;
} }
// *************************************************************************** // ***************************************************************************
@ -538,8 +551,7 @@ namespace NLGUI
sint32 value; sint32 value;
for(uint i=0; i<getNumTexts(); i++) for(uint i=0; i<getNumTexts(); i++)
{ {
std::string sText; std::string sText = getText(i);
getText(i).toString(sText);
if(sText == text) if(sText == text)
{ {
value = i; value = i;
@ -566,7 +578,7 @@ namespace NLGUI
CLuaIHM::checkArgTypeUCString(ls, funcName, 1); CLuaIHM::checkArgTypeUCString(ls, funcName, 1);
ucstring text; ucstring text;
nlverify(CLuaIHM::pop(ls, text)); nlverify(CLuaIHM::pop(ls, text));
addText(text); addText(text.toUtf8()); // FIXME: Lua should just do UTF-8!
return 0; return 0;
} }
@ -579,7 +591,7 @@ namespace NLGUI
CLuaIHM::checkArgTypeUCString(ls, funcName, 2); CLuaIHM::checkArgTypeUCString(ls, funcName, 2);
ucstring text; ucstring text;
nlverify(CLuaIHM::pop(ls, text)); nlverify(CLuaIHM::pop(ls, text));
setText((uint) ls.toInteger(1), text); setText((uint) ls.toInteger(1), text.toUtf8()); // FIXME: Lua should just do UTF-8!
return 0; return 0;
} }
@ -592,7 +604,7 @@ namespace NLGUI
CLuaIHM::checkArgTypeUCString(ls, funcName, 2); CLuaIHM::checkArgTypeUCString(ls, funcName, 2);
ucstring text; ucstring text;
nlverify(CLuaIHM::pop(ls, text)); nlverify(CLuaIHM::pop(ls, text));
insertText((uint) ls.toInteger(1), text); insertText((uint) ls.toInteger(1), text.toUtf8()); // FIXME: Lua should just do UTF-8!
return 0; return 0;
} }
@ -605,7 +617,7 @@ namespace NLGUI
CLuaIHM::checkArgTypeUCString(ls, funcName, 2); CLuaIHM::checkArgTypeUCString(ls, funcName, 2);
ucstring texture; ucstring texture;
nlverify(CLuaIHM::pop(ls, texture)); nlverify(CLuaIHM::pop(ls, texture));
setTexture((uint) ls.toInteger(1), texture); setTexture((uint) ls.toInteger(1), texture.toUtf8()); // FIXME: Lua should just do UTF-8!
return 0; return 0;
} }
@ -625,7 +637,7 @@ namespace NLGUI
const char *funcName = "removeText"; const char *funcName = "removeText";
CLuaIHM::checkArgCount(ls, funcName, 1); CLuaIHM::checkArgCount(ls, funcName, 1);
CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER); CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER);
removeText((uint) ls.toInteger(1)); removeText((uint)ls.toInteger(1));
return 0; return 0;
} }
@ -652,12 +664,12 @@ namespace NLGUI
{ {
// set the id as the parameter // set the id as the parameter
bool checkable = false; bool checkable = false;
if(getTexture(i).toString() != std::string()) if (getTexture(i) != std::string())
{ {
checkable = true; checkable = true;
} }
groupMenu->addLine(getText(i), "combo_box_select_end", toString(i), groupMenu->addLine(getText(i), "combo_box_select_end", toString(i),
"", std::string(), getTexture(i).toString(), checkable); "", std::string(), getTexture(i), checkable);
groupMenu->setGrayedLine(i, getGrayed(i)); groupMenu->setGrayedLine(i, getGrayed(i));
} }

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -43,7 +44,7 @@ namespace NLGUI
{ {
_Positive = false; _Positive = false;
_Cache= 0; _Cache= 0;
setText(ucstring("0")); setText(std::string("0"));
_Divisor = 1; _Divisor = 1;
_Modulo = 0; _Modulo = 0;
} }
@ -225,7 +226,7 @@ namespace NLGUI
// init cache. // init cache.
_Cache= 0; _Cache= 0;
setText(ucstring("0")); setText(std::string("0"));
return true; return true;
} }
@ -238,9 +239,9 @@ namespace NLGUI
if (_Cache != val) if (_Cache != val)
{ {
_Cache= val; _Cache= val;
ucstring value = _Format ? NLMISC::formatThousands(toString(val)) : toString(val); std::string value = _Format ? NLMISC::formatThousands(toString(val)) : toString(val);
if (_Positive) setText(val >= 0 ? ( ucstring(_Prefix) + value + ucstring(_Suffix) ) : ucstring("?")); if (_Positive) setText(val >= 0 ? ( _Prefix.toString() + value + _Suffix.toString() ) : "?");
else setText( ucstring(_Prefix) + value + ucstring(_Suffix) ); else setText( _Prefix.toString() + value + _Suffix.toString() );
} }
} }

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -63,7 +64,7 @@ namespace NLGUI
else else
if( name == "emptytext" ) if( name == "emptytext" )
{ {
return _EmptyText.toString(); return _EmptyText;
} }
else else
return CViewText::getProperty( name ); return CViewText::getProperty( name );
@ -112,7 +113,7 @@ namespace NLGUI
else else
xmlSetProp( node, BAD_CAST "valuemax", BAD_CAST "" ); xmlSetProp( node, BAD_CAST "valuemax", BAD_CAST "" );
xmlSetProp( node, BAD_CAST "emptytext", BAD_CAST _EmptyText.toString().c_str() ); xmlSetProp( node, BAD_CAST "emptytext", BAD_CAST _EmptyText.c_str() );
return node; return node;
} }
@ -147,9 +148,10 @@ namespace NLGUI
if(ptr) if(ptr)
{ {
const char *propPtr = ptr; const char *propPtr = ptr;
_EmptyText = ucstring(propPtr); if (NLMISC::startsWith(propPtr, "ui"))
if ((strlen(propPtr)>2) && (propPtr[0] == 'u') && (propPtr[1] == 'i')) _EmptyText = CI18N::get(propPtr);
_EmptyText = CI18N::get (propPtr); else
_EmptyText = propPtr;
} }
// init cache. // init cache.

@ -3,7 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2014 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2014-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -1338,19 +1338,19 @@ namespace NLGUI
if( name == "title" ) if( name == "title" )
{ {
if( _TitleTextOpened == _TitleTextClosed ) if( _TitleTextOpened == _TitleTextClosed )
return _TitleTextOpened.toString(); return _TitleTextOpened;
else else
return ""; return "";
} }
else else
if( name == "title_opened" ) if( name == "title_opened" )
{ {
return _TitleTextOpened.toString(); return _TitleTextOpened;
} }
else else
if( name == "title_closed" ) if( name == "title_closed" )
{ {
return _TitleTextClosed.toString(); return _TitleTextClosed;
} }
else else
if( name == "header_active" ) if( name == "header_active" )
@ -1997,12 +1997,12 @@ namespace NLGUI
xmlSetProp( node, BAD_CAST "content_y_offset", BAD_CAST toString( _ContentYOffset ).c_str() ); xmlSetProp( node, BAD_CAST "content_y_offset", BAD_CAST toString( _ContentYOffset ).c_str() );
if( _TitleTextOpened == _TitleTextClosed ) if( _TitleTextOpened == _TitleTextClosed )
xmlSetProp( node, BAD_CAST "title", BAD_CAST _TitleTextOpened.toString().c_str() ); xmlSetProp( node, BAD_CAST "title", BAD_CAST _TitleTextOpened.c_str() );
else else
xmlSetProp( node, BAD_CAST "title", BAD_CAST "" ); xmlSetProp( node, BAD_CAST "title", BAD_CAST "" );
xmlSetProp( node, BAD_CAST "title_opened", BAD_CAST _TitleTextOpened.toString().c_str() ); xmlSetProp( node, BAD_CAST "title_opened", BAD_CAST _TitleTextOpened.c_str() );
xmlSetProp( node, BAD_CAST "title_closed", BAD_CAST _TitleTextClosed.toString().c_str() ); xmlSetProp( node, BAD_CAST "title_closed", BAD_CAST _TitleTextClosed.c_str() );
xmlSetProp( node, BAD_CAST "header_active", BAD_CAST toString( _HeaderActive ).c_str() ); xmlSetProp( node, BAD_CAST "header_active", BAD_CAST toString( _HeaderActive ).c_str() );
if( _HeaderColor.getNodePtr() != NULL ) if( _HeaderColor.getNodePtr() != NULL )
@ -2144,24 +2144,20 @@ namespace NLGUI
ptr = xmlGetProp (cur, (xmlChar*)"title"); ptr = xmlGetProp (cur, (xmlChar*)"title");
if (ptr) if (ptr)
{ {
if (_Localize) _TitleTextOpened = CI18N::get(string((const char*)ptr)); _TitleTextOpened = (const char *)ptr;
else _TitleTextOpened = string((const char*)ptr); _TitleTextClosed = (const char *)ptr;
if (_Localize) _TitleTextClosed = CI18N::get(string((const char*)ptr));
else _TitleTextClosed = string((const char*)ptr);
} }
ptr = xmlGetProp (cur, (xmlChar*)"title_opened"); ptr = xmlGetProp (cur, (xmlChar*)"title_opened");
if (ptr) if (ptr)
{ {
if (_Localize) _TitleTextOpened = CI18N::get(string((const char*)ptr)); _TitleTextOpened = (const char*)ptr;
else _TitleTextOpened = string((const char*)ptr);
} }
ptr = xmlGetProp (cur, (xmlChar*)"title_closed"); ptr = xmlGetProp (cur, (xmlChar*)"title_closed");
if (ptr) if (ptr)
{ {
if (_Localize) _TitleTextClosed = CI18N::get(string((const char*)ptr)); _TitleTextClosed = (const char *)ptr;
else _TitleTextClosed = string((const char*)ptr);
} }
ptr = xmlGetProp (cur, (xmlChar*)"header_active"); ptr = xmlGetProp (cur, (xmlChar*)"header_active");
@ -3712,7 +3708,7 @@ namespace NLGUI
{ {
CViewTextID *vti= new CViewTextID(CViewBase::TCtorParam()); CViewTextID *vti= new CViewTextID(CViewBase::TCtorParam());
// the title here is actually the DB path // the title here is actually the DB path
vti->setDBTextID(_TitleTextOpened.toString()); vti->setDBTextID(_TitleTextOpened);
vti->setDynamicString(_TitleClass==TitleTextDynString); vti->setDynamicString(_TitleClass==TitleTextDynString);
_TitleOpened = vti; _TitleOpened = vti;
} }
@ -3744,7 +3740,7 @@ namespace NLGUI
_TitleOpened->setY (pLayer->getValSInt32 ("title_offset_y")); _TitleOpened->setY (pLayer->getValSInt32 ("title_offset_y"));
} }
_TitleOpened->setFontSize (pLayer->getValSInt32 ("title_font_size")); _TitleOpened->setFontSize (pLayer->getValSInt32 ("title_font_size"));
if (_TitleClass==TitleText) _TitleOpened->setText (_TitleTextOpened); if (_TitleClass == TitleText) setTitledOpenedViewText();
_TitleOpened->setActive (_Opened); _TitleOpened->setActive (_Opened);
// Title when the container is closed // Title when the container is closed
@ -3764,7 +3760,7 @@ namespace NLGUI
{ {
CViewTextID *vti= new CViewTextID(CViewBase::TCtorParam()); CViewTextID *vti= new CViewTextID(CViewBase::TCtorParam());
// the title here is actually the DB path // the title here is actually the DB path
vti->setDBTextID(_TitleTextClosed.toString()); vti->setDBTextID(_TitleTextClosed);
vti->setDynamicString(_TitleClass==TitleTextDynString); vti->setDynamicString(_TitleClass==TitleTextDynString);
_TitleClosed = vti; _TitleClosed = vti;
} }
@ -3796,7 +3792,7 @@ namespace NLGUI
_TitleClosed->setY (pLayer->getValSInt32 ("title_offset_y")); _TitleClosed->setY (pLayer->getValSInt32 ("title_offset_y"));
} }
_TitleClosed->setFontSize (pLayer->getValSInt32 ("title_font_size")); _TitleClosed->setFontSize (pLayer->getValSInt32 ("title_font_size"));
if (_TitleClass==TitleText) _TitleClosed->setText (_TitleTextClosed); if (_TitleClass == TitleText) setTitledClosedViewText();
_TitleClosed->setActive(!_Opened); _TitleClosed->setActive(!_Opened);
@ -3946,86 +3942,114 @@ namespace NLGUI
} }
} }
// ***************************************************************************
void CGroupContainer::setLocalize(bool localize)
{
_Localize = localize;
if (_TitleOpened)
{
_TitleOpened->setLocalized(localize);
}
if (_TitleClosed)
{
_TitleClosed->setLocalized(localize);
}
invalidateCoords();
}
// *************************************************************************** // ***************************************************************************
std::string CGroupContainer::getTitle () const std::string CGroupContainer::getTitle () const
{ {
return _TitleTextOpened.toString(); return _TitleTextOpened;
} }
// *************************************************************************** // ***************************************************************************
void CGroupContainer::setTitle (const std::string &title) void CGroupContainer::setTitle (const std::string &title)
{ {
if (_Localize) setUCTitle (CI18N::get(title)); setTitleOpened(title);
else setUCTitle (title); setTitleClosed(title);
} }
// *************************************************************************** // ***************************************************************************
std::string CGroupContainer::getTitleOpened () const std::string CGroupContainer::getTitleOpened () const
{ {
return _TitleTextOpened.toString(); return _TitleTextOpened;
} }
// *************************************************************************** // ***************************************************************************
void CGroupContainer::setTitleOpened (const std::string &title) void CGroupContainer::setTitleOpened (const std::string &title)
{ {
if (_Localize) setUCTitleOpened (CI18N::get(title)); _TitleTextOpened = title;
else setUCTitleOpened (title); setTitledOpenedViewText();
invalidateCoords();
} }
// *************************************************************************** // ***************************************************************************
std::string CGroupContainer::getTitleClosed () const std::string CGroupContainer::getTitleClosed () const
{ {
return _TitleTextClosed.toString(); return _TitleTextClosed;
} }
// *************************************************************************** // ***************************************************************************
void CGroupContainer::setTitleClosed (const std::string &title) void CGroupContainer::setTitleClosed (const std::string &title)
{ {
if (_Localize) setUCTitleClosed (CI18N::get(title)); _TitleTextClosed = title;
else setUCTitleClosed (title); setTitledClosedViewText();
invalidateCoords();
} }
// *************************************************************************** // ***************************************************************************
void CGroupContainer::setUCTitleOpened(const ucstring &title) void CGroupContainer::setTitledOpenedViewText()
{ {
_TitleTextOpened = title;
if (_TitleOpened != NULL) if (_TitleOpened != NULL)
_TitleOpened->setText (title); {
invalidateCoords(); _TitleOpened->setTextLocalized(_TitleTextOpened, _Localize);
}
} }
// *************************************************************************** // ***************************************************************************
void CGroupContainer::setUCTitleClosed(const ucstring &title) void CGroupContainer::setTitledClosedViewText()
{ {
_TitleTextClosed = title;
if (_TitleClosed != NULL) if (_TitleClosed != NULL)
_TitleClosed->setText (_TitleTextClosed); {
invalidateCoords(); _TitleClosed->setTextLocalized(_TitleTextClosed, _Localize);
}
}
// ***************************************************************************
void CGroupContainer::setUCTitleOpened(const ucstring &title)
{
setTitleOpened(title.toUtf8());
}
// ***************************************************************************
void CGroupContainer::setUCTitleClosed(const ucstring &title)
{
setTitleClosed(title.toUtf8());
} }
// *************************************************************************** // ***************************************************************************
void CGroupContainer::setUCTitle(const ucstring &title) void CGroupContainer::setUCTitle(const ucstring &title)
{ {
setUCTitleOpened(title); setTitle(title.toUtf8());
setUCTitleClosed(title);
} }
// *************************************************************************** // ***************************************************************************
ucstring CGroupContainer::getUCTitle () const ucstring CGroupContainer::getUCTitle () const
{ {
return getUCTitleOpened(); return ucstring::makeFromUtf8(getTitle());
} }
// *************************************************************************** // ***************************************************************************
ucstring CGroupContainer::getUCTitleOpened () const ucstring CGroupContainer::getUCTitleOpened () const
{ {
return _TitleTextOpened; return ucstring::makeFromUtf8(getTitleOpened());
} }
// *************************************************************************** // ***************************************************************************
ucstring CGroupContainer::getUCTitleClosed () const ucstring CGroupContainer::getUCTitleClosed () const
{ {
return _TitleTextClosed; return ucstring::makeFromUtf8(getTitleClosed());
} }
// *************************************************************************** // ***************************************************************************

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013-2014 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -21,6 +22,7 @@
#include "stdpch.h" #include "stdpch.h"
#include "nel/gui/group_editbox.h" #include "nel/gui/group_editbox.h"
#include "nel/misc/command.h" #include "nel/misc/command.h"
#include "nel/misc/utf_string_view.h"
#include "nel/gui/view_text.h" #include "nel/gui/view_text.h"
#include "nel/misc/xml_auto_ptr.h" #include "nel/misc/xml_auto_ptr.h"
#include "nel/gui/interface_options.h" #include "nel/gui/interface_options.h"
@ -95,7 +97,7 @@ namespace NLGUI
_ViewTextDeltaX(0) _ViewTextDeltaX(0)
{ {
_Prompt = ">"; _Prompt = ::u32string(1, (u32char)'>');
_BackSelectColor= CRGBA::White; _BackSelectColor= CRGBA::White;
_TextSelectColor= CRGBA::Black; _TextSelectColor= CRGBA::Black;
} }
@ -169,7 +171,7 @@ namespace NLGUI
else else
if( name == "prompt" ) if( name == "prompt" )
{ {
return _Prompt.toString(); return CUtfStringView(_Prompt).toUtf8();
} }
else else
if( name == "enter_type" ) if( name == "enter_type" )
@ -263,9 +265,9 @@ namespace NLGUI
std::string s; std::string s;
s.reserve( _NegativeFilter.size() ); s.reserve( _NegativeFilter.size() );
std::vector< char >::const_iterator itr; std::vector< u32char >::const_iterator itr;
for( itr = _NegativeFilter.begin(); itr != _NegativeFilter.end(); ++itr ) for (itr = _NegativeFilter.begin(); itr != _NegativeFilter.end(); ++itr)
s.push_back( *itr ); CUtfStringView::append(s, *itr);
return s; return s;
} }
@ -353,7 +355,7 @@ namespace NLGUI
else else
if( name == "prompt" ) if( name == "prompt" )
{ {
_Prompt = value; _Prompt = CUtfStringView(value).toUtf32();
return; return;
} }
else else
@ -449,10 +451,10 @@ namespace NLGUI
if( name == "negative_filter" ) if( name == "negative_filter" )
{ {
_NegativeFilter.clear(); _NegativeFilter.clear();
::u32string::size_type i;
std::string::size_type i; ::u32string ustr = CUtfStringView(value).toUtf32();
for( i = 0; i < value.size(); i++ ) for( i = 0; i < ustr.size(); i++ )
_NegativeFilter.push_back( value[ i ] ); _NegativeFilter.push_back(ustr[i]);
} }
else else
CInterfaceGroup::setProperty( name, value ); CInterfaceGroup::setProperty( name, value );
@ -476,7 +478,7 @@ namespace NLGUI
xmlSetProp( node, BAD_CAST "max_chars_size", BAD_CAST toString( _MaxCharsSize ).c_str() ); xmlSetProp( node, BAD_CAST "max_chars_size", BAD_CAST toString( _MaxCharsSize ).c_str() );
xmlSetProp( node, BAD_CAST "enter_loose_focus", BAD_CAST toString( _LooseFocusOnEnter ).c_str() ); xmlSetProp( node, BAD_CAST "enter_loose_focus", BAD_CAST toString( _LooseFocusOnEnter ).c_str() );
xmlSetProp( node, BAD_CAST "enter_recover_focus", BAD_CAST toString( _RecoverFocusOnEnter ).c_str() ); xmlSetProp( node, BAD_CAST "enter_recover_focus", BAD_CAST toString( _RecoverFocusOnEnter ).c_str() );
xmlSetProp( node, BAD_CAST "prompt", BAD_CAST _Prompt.toString().c_str() ); xmlSetProp( node, BAD_CAST "prompt", BAD_CAST CUtfStringView(_Prompt).toUtf8().c_str() );
std::string e; std::string e;
switch( _EntryType ) switch( _EntryType )
@ -538,9 +540,9 @@ namespace NLGUI
std::string s; std::string s;
s.reserve( _NegativeFilter.size() ); s.reserve( _NegativeFilter.size() );
std::vector< char >::const_iterator itr; std::vector< u32char >::const_iterator itr;
for( itr = _NegativeFilter.begin(); itr != _NegativeFilter.end(); ++itr ) for( itr = _NegativeFilter.begin(); itr != _NegativeFilter.end(); ++itr )
s.push_back( *itr ); CUtfStringView::append(s, *itr);
xmlSetProp( node, BAD_CAST "negative_filter", BAD_CAST s.c_str() ); xmlSetProp( node, BAD_CAST "negative_filter", BAD_CAST s.c_str() );
@ -605,7 +607,7 @@ namespace NLGUI
if (prop) _ResetFocusOnHide = convertBool(prop); if (prop) _ResetFocusOnHide = convertBool(prop);
prop = (char*) xmlGetProp( cur, (xmlChar*)"prompt" ); prop = (char*) xmlGetProp( cur, (xmlChar*)"prompt" );
if (prop) _Prompt = (const char*)prop; if (prop) _Prompt = CUtfStringView((const char*)prop).toUtf32();
prop = (char*) xmlGetProp( cur, (xmlChar*)"entry_type" ); prop = (char*) xmlGetProp( cur, (xmlChar*)"entry_type" );
_EntryType = Text; _EntryType = Text;
@ -656,9 +658,11 @@ namespace NLGUI
prop = (char*) xmlGetProp( cur, (xmlChar*)"negative_filter" ); prop = (char*) xmlGetProp( cur, (xmlChar*)"negative_filter" );
if (prop) if (prop)
{ {
uint length = (uint)strlen(prop); _NegativeFilter.clear();
_NegativeFilter.resize(length); ::u32string::size_type i;
std::copy((const char *) prop, (const char *) prop + length, _NegativeFilter.begin()); ::u32string ustr = CUtfStringView(prop).toUtf32();
for( i = 0; i < ustr.size(); i++ )
_NegativeFilter.push_back(ustr[i]);
} }
return true; return true;
@ -802,7 +806,7 @@ namespace NLGUI
cutSelection(); cutSelection();
} }
ucstring sString; string sString;
if (CViewRenderer::getInstance()->getDriver()->pasteTextFromClipboard(sString)) if (CViewRenderer::getInstance()->getDriver()->pasteTextFromClipboard(sString))
{ {
@ -812,7 +816,7 @@ namespace NLGUI
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CGroupEditBox::appendStringFromClipboard(const ucstring &str) void CGroupEditBox::appendStringFromClipboard(const std::string &str)
{ {
stopParentBlink(); stopParentBlink();
makeTopWindow(); makeTopWindow();
@ -826,11 +830,12 @@ namespace NLGUI
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CGroupEditBox::writeString(const ucstring &str, bool replace, bool atEnd) void CGroupEditBox::writeString(const std::string &str16, bool replace, bool atEnd)
{ {
::u32string str = CUtfStringView(str16).toUtf32();
sint length = (sint)str.length(); sint length = (sint)str.length();
ucstring toAppend; ::u32string toAppend;
// filter character depending on the entry type // filter character depending on the entry type
switch (_EntryType) switch (_EntryType)
{ {
@ -852,7 +857,7 @@ namespace NLGUI
} }
} }
// remove '\r' characters // remove '\r' characters
toAppend.erase(std::remove(toAppend.begin(), toAppend.end(), (ucchar) '\r'), toAppend.end()); toAppend.erase(std::remove(toAppend.begin(), toAppend.end(), (u32char) '\r'), toAppend.end());
} }
break; break;
@ -963,7 +968,7 @@ namespace NLGUI
{ {
length = _MaxNumChar - (sint)_InputString.length(); length = _MaxNumChar - (sint)_InputString.length();
} }
ucstring toAdd = toAppend.substr(0, length); ::u32string toAdd = toAppend.substr(0, length);
sint32 minPos; sint32 minPos;
sint32 maxPos; sint32 maxPos;
if (_CurrSelection == this) if (_CurrSelection == this)
@ -1013,7 +1018,7 @@ namespace NLGUI
_CursorAtPreviousLineEnd = false; _CursorAtPreviousLineEnd = false;
if (_ClearOnEscape) if (_ClearOnEscape)
{ {
setInputString(ucstring("")); setInputStringAsUtf32(::u32string());
triggerOnChangeAH(); triggerOnChangeAH();
} }
CWidgetManager::getInstance()->setCaptureKeyboard(NULL); CWidgetManager::getInstance()->setCaptureKeyboard(NULL);
@ -1059,8 +1064,9 @@ namespace NLGUI
{ {
if (isKeyRETURN) if (isKeyRETURN)
{ {
ucstring copyStr= _InputString; //ucstring copyStr= _InputString;
if ((uint) std::count(copyStr.begin(), copyStr.end(), '\n') >= _MaxNumReturn) //if ((uint) std::count(copyStr.begin(), copyStr.end(), '\n') >= _MaxNumReturn)
if ((uint)std::count(_InputString.begin(), _InputString.end(), '\n') >= _MaxNumReturn)
break; break;
} }
@ -1074,7 +1080,7 @@ namespace NLGUI
cutSelection(); cutSelection();
} }
ucchar c = isKeyRETURN ? '\n' : rEDK.getChar(); u32char c = isKeyRETURN ? '\n' : rEDK.getChar();
if (isFiltered(c)) return; if (isFiltered(c)) return;
switch(_EntryType) switch(_EntryType)
{ {
@ -1121,11 +1127,11 @@ namespace NLGUI
if(_EntryType==Integer && (_IntegerMinValue!=INT_MIN || _IntegerMaxValue!=INT_MAX)) if(_EntryType==Integer && (_IntegerMinValue!=INT_MIN || _IntegerMaxValue!=INT_MAX))
{ {
// estimate new string // estimate new string
ucstring copyStr= _InputString; ::u32string copyStr= _InputString;
ucstring::iterator it = copyStr.begin() + _CursorPos; ::u32string::iterator it = copyStr.begin() + _CursorPos;
copyStr.insert(it, c); copyStr.insert(it, c);
sint32 value; sint32 value;
fromString(copyStr.toString(), value); fromString(CUtfStringView(copyStr).toUtf8(), value);
// if out of bounds, abort char // if out of bounds, abort char
if(value<_IntegerMinValue || value>_IntegerMaxValue) if(value<_IntegerMinValue || value>_IntegerMaxValue)
return; return;
@ -1134,12 +1140,12 @@ namespace NLGUI
if(_EntryType==PositiveInteger && (_PositiveIntegerMinValue!=0 || _PositiveIntegerMaxValue!=UINT_MAX)) if(_EntryType==PositiveInteger && (_PositiveIntegerMinValue!=0 || _PositiveIntegerMaxValue!=UINT_MAX))
{ {
// estimate new string // estimate new string
ucstring copyStr= _InputString; ::u32string copyStr= _InputString;
ucstring::iterator it = copyStr.begin() + _CursorPos; ::u32string::iterator it = copyStr.begin() + _CursorPos;
copyStr.insert(it, c); copyStr.insert(it, c);
// \todo yoyo: this doesn't really work i think.... // \todo yoyo: this doesn't really work i think....
uint32 value; uint32 value;
fromString(copyStr.toString(), value); fromString(CUtfStringView(copyStr).toUtf8(), value);
// if out of bounds, abort char // if out of bounds, abort char
if(value<_PositiveIntegerMinValue || value>_PositiveIntegerMaxValue) if(value<_PositiveIntegerMinValue || value>_PositiveIntegerMaxValue)
return; return;
@ -1148,7 +1154,7 @@ namespace NLGUI
if ((uint) _InputString.length() < _MaxNumChar) if ((uint) _InputString.length() < _MaxNumChar)
{ {
makeTopWindow(); makeTopWindow();
ucstring::iterator it = _InputString.begin() + _CursorPos; ::u32string::iterator it = _InputString.begin() + _CursorPos;
_InputString.insert(it, c); _InputString.insert(it, c);
++ _CursorPos; ++ _CursorPos;
triggerOnChangeAH(); triggerOnChangeAH();
@ -1176,7 +1182,7 @@ namespace NLGUI
if (CWidgetManager::getInstance()->getCaptureKeyboard() != this) return false; if (CWidgetManager::getInstance()->getCaptureKeyboard() != this) return false;
if (!_CanUndo) return false; if (!_CanUndo) return false;
_ModifiedInputString = _InputString; _ModifiedInputString = _InputString;
setInputString(_StartInputString); setInputStringAsUtf32(_StartInputString);
_CanUndo = false; _CanUndo = false;
_CanRedo = true; _CanRedo = true;
setCursorPos((sint32)_InputString.length()); setCursorPos((sint32)_InputString.length());
@ -1189,7 +1195,7 @@ namespace NLGUI
{ {
if (CWidgetManager::getInstance()->getCaptureKeyboard() != this) return false; if (CWidgetManager::getInstance()->getCaptureKeyboard() != this) return false;
if (!_CanRedo) return false; if (!_CanRedo) return false;
setInputString(_ModifiedInputString); setInputStringAsUtf32(_ModifiedInputString);
_CanUndo = true; _CanUndo = true;
_CanRedo = false; _CanRedo = false;
setCursorPos((sint32)_InputString.length()); setCursorPos((sint32)_InputString.length());
@ -1229,11 +1235,11 @@ namespace NLGUI
{ {
makeTopWindow(); makeTopWindow();
// for french, deutsch and russian, be aware of unicode // for french, deutsch and russian, be aware of unicode
std::string command = ucstring(_InputString.substr(1)).toUtf8(); std::string command = CUtfStringView(_InputString.substr(1)).toUtf8();
ICommand::expand(command); ICommand::expand(command);
// then back to ucstring // then back to u32string
_InputString.fromUtf8(command); _InputString = CUtfStringView('/' + command).toUtf32();
_InputString = '/' + _InputString; _InputString = _InputString;
_CursorPos = (sint32)_InputString.length(); _CursorPos = (sint32)_InputString.length();
_CursorAtPreviousLineEnd = false; _CursorAtPreviousLineEnd = false;
triggerOnChangeAH(); triggerOnChangeAH();
@ -1260,7 +1266,7 @@ namespace NLGUI
// else delete last character // else delete last character
else if(_InputString.size () > 0 && _CursorPos != 0) else if(_InputString.size () > 0 && _CursorPos != 0)
{ {
ucstring::iterator it = _InputString.begin() + (_CursorPos - 1); ::u32string::iterator it = _InputString.begin() + (_CursorPos - 1);
_InputString.erase(it); _InputString.erase(it);
-- _CursorPos; -- _CursorPos;
_CursorAtPreviousLineEnd = false; _CursorAtPreviousLineEnd = false;
@ -1300,7 +1306,7 @@ namespace NLGUI
default: break; default: break;
} }
// update the text // update the text
setInputString(_InputString); setInputStringAsUtf32(_InputString);
// if event of type char or string, consider handle all of them // if event of type char or string, consider handle all of them
if( rEDK.getKeyEventType()==NLGUI::CEventDescriptorKey::keychar || rEDK.getKeyEventType()==NLGUI::CEventDescriptorKey::keystring ) if( rEDK.getKeyEventType()==NLGUI::CEventDescriptorKey::keychar || rEDK.getKeyEventType()==NLGUI::CEventDescriptorKey::keystring )
@ -1430,16 +1436,14 @@ namespace NLGUI
{ {
if (_ViewText) if (_ViewText)
{ {
ucstring usTmp; std::string usTmp;
if (_EntryType == Password) if (_EntryType == Password)
{ {
usTmp = _Prompt; usTmp = CUtfStringView(_Prompt + ::u32string(_InputString.size(), 0x2022)).toUtf8();
for (uint32 i = 0; i < _InputString.size(); ++i)
usTmp += "*";
} }
else else
{ {
usTmp = _Prompt + _InputString; usTmp = CUtfStringView(_Prompt + _InputString).toUtf8();
} }
_ViewText->setText (usTmp); _ViewText->setText (usTmp);
} }
@ -1576,13 +1580,13 @@ namespace NLGUI
_ViewText->setParent( this ); _ViewText->setParent( this );
_ViewText->setIdRecurse( "edit_text" ); _ViewText->setIdRecurse( "edit_text" );
_ViewText->setHardText( "" ); _ViewText->setTextLocalized( "", false );
_ViewText->setPosRef( Hotspot_ML ); _ViewText->setPosRef( Hotspot_ML );
_ViewText->setParentPosRef( Hotspot_ML ); _ViewText->setParentPosRef( Hotspot_ML );
addView( _ViewText ); addView( _ViewText );
sint32 w,h; sint32 w,h;
w = std::max( sint32( _ViewText->getFontWidth() * _ViewText->getText().size() ), getW() ); w = std::max( sint32( _ViewText->getFontWidth() * CUtfStringView(_ViewText->getText()).count() ), getW() );
h = std::max( sint32( _ViewText->getFontHeight() ), getH() ); h = std::max( sint32( _ViewText->getFontHeight() ), getH() );
setH( h ); setH( h );
@ -1622,7 +1626,18 @@ namespace NLGUI
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CGroupEditBox::setInputString(const ucstring &str) void CGroupEditBox::setPrompt(const std::string &s)
{
_Prompt = CUtfStringView(s).toUtf32();
}
// ----------------------------------------------------------------------------
void CGroupEditBox::setInputString(const std::string &str)
{
setInputStringAsUtf32(CUtfStringView(str).toUtf32());
}
void CGroupEditBox::setInputStringAsUtf32(const ::u32string &str)
{ {
_InputString = str; _InputString = str;
if (_CursorPos > (sint32) str.length()) if (_CursorPos > (sint32) str.length())
@ -1638,18 +1653,17 @@ namespace NLGUI
// *************************************************************************** // ***************************************************************************
void CGroupEditBox::setDefaultInputString(const ucstring &str) void CGroupEditBox::setDefaultInputString(const std::string &str)
{ {
_DefaultInputString= true; _DefaultInputString= true;
setInputString(str); setInputString(str);
} }
// *************************************************************************** // ***************************************************************************
sint32 CGroupEditBox::getInputStringAsInt() const sint32 CGroupEditBox::getInputStringAsInt() const
{ {
sint32 value; sint32 value;
fromString(_InputString.toString(), value); fromString(getInputString(), value);
return value; return value;
} }
@ -1663,7 +1677,7 @@ namespace NLGUI
sint64 CGroupEditBox::getInputStringAsInt64() const sint64 CGroupEditBox::getInputStringAsInt64() const
{ {
sint64 value; sint64 value;
fromString(_InputString.toString(), value); fromString(getInputString(), value);
return value; return value;
} }
@ -1677,7 +1691,7 @@ namespace NLGUI
float CGroupEditBox::getInputStringAsFloat() const float CGroupEditBox::getInputStringAsFloat() const
{ {
float value; float value;
fromString(_InputString.toString(), value); fromString(getInputString(), value);
return value; return value;
} }
@ -1691,8 +1705,8 @@ namespace NLGUI
// *************************************************************************** // ***************************************************************************
void CGroupEditBox::cutSelection() void CGroupEditBox::cutSelection()
{ {
sint32 minPos= min(_CursorPos, _SelectCursorPos); ptrdiff_t minPos= min(_CursorPos, _SelectCursorPos);
sint32 maxPos= max(_CursorPos, _SelectCursorPos); ptrdiff_t maxPos= max(_CursorPos, _SelectCursorPos);
// cut the selection // cut the selection
if(!_InputString.empty()) if(!_InputString.empty())
{ {
@ -1704,12 +1718,12 @@ namespace NLGUI
} }
// *************************************************************************** // ***************************************************************************
ucstring CGroupEditBox::getSelection() std::string CGroupEditBox::getSelection()
{ {
sint32 minPos= min(_CursorPos, _SelectCursorPos); ptrdiff_t minPos= min(_CursorPos, _SelectCursorPos);
sint32 maxPos= max(_CursorPos, _SelectCursorPos); ptrdiff_t maxPos= max(_CursorPos, _SelectCursorPos);
// get the selection // get the selection
return _InputString.substr(minPos, maxPos-minPos); return CUtfStringView(_InputString.substr(minPos, maxPos-minPos)).toUtf8();
} }
@ -1736,42 +1750,38 @@ namespace NLGUI
} }
// *************************************************************************** // ***************************************************************************
void CGroupEditBox::setInputStringAsStdString(const std::string &str) std::string CGroupEditBox::getPrompt() const
{ {
setInputString(ucstring(str)); return NLMISC::CUtfStringView(_Prompt).toUtf8();
} }
// *************************************************************************** // ***************************************************************************
std::string CGroupEditBox::getInputStringAsStdString() const std::string CGroupEditBox::getInputString() const
{ {
std::string result; return NLMISC::CUtfStringView(_InputString).toUtf8();
_InputString.toString(result);
return result;
} }
// *************************************************************************** // ***************************************************************************
void CGroupEditBox::setInputStringAsUtf8(const std::string &str) void CGroupEditBox::setInputStringAsUtf16(const ucstring &str)
{ {
ucstring tmp; setInputStringAsUtf32(CUtfStringView(str).toUtf32());
tmp.fromUtf8(str);
setInputString(tmp);
} }
// *************************************************************************** // ***************************************************************************
std::string CGroupEditBox::getInputStringAsUtf8() const ucstring CGroupEditBox::getInputStringAsUtf16() const
{ {
return _InputString.toUtf8(); return CUtfStringView(_InputString).toUtf16();
} }
// *************************************************************************** // ***************************************************************************
void CGroupEditBox::setCommand(const ucstring &command, bool execute) void CGroupEditBox::setCommand(const std::string &command, bool execute)
{ {
// do nothing if frozen // do nothing if frozen
if(_Frozen) if(_Frozen)
return; return;
// set the string and maybe execute // set the string and maybe execute
setInputString((ucchar) '/' + command); setInputString('/' + command);
if (execute) if (execute)
{ {
// stop selection // stop selection
@ -1826,18 +1836,35 @@ namespace NLGUI
// *************************************************************************** // ***************************************************************************
void CGroupEditBox::serialConfig(NLMISC::IStream &f) void CGroupEditBox::serialConfig(NLMISC::IStream &f)
{ {
f.serialVersion(0); uint version = f.serialVersion(1);
if(_DefaultInputString) // Don't want to save the default input if(_DefaultInputString) // Don't want to save the default input
{ {
_DefaultInputString= false; _DefaultInputString= false;
_InputString.clear(); _InputString.clear();
} }
f.serial(_InputString); if (version < 1)
{
ucstring str;
if (!f.isReading())
str = CUtfStringView(_InputString).toUtf16();
f.serial(str);
if (f.isReading())
_InputString = CUtfStringView(str).toUtf32();
}
else
{
std::string str;
if (!f.isReading())
str = CUtfStringView(_InputString).toUtf8();
f.serial(str);
if (f.isReading())
_InputString = CUtfStringView(str).toUtf32();
}
f.serial(_CursorPos); f.serial(_CursorPos);
f.serial(_PrevNumLine); f.serial(_PrevNumLine);
if (f.isReading()) if (f.isReading())
{ {
setInputString(_InputString); setInputStringAsUtf32(_InputString);
} }
// serial selection // serial selection
@ -1854,7 +1881,7 @@ namespace NLGUI
void CGroupEditBox::onQuit() void CGroupEditBox::onQuit()
{ {
// clear the text and restore backup pos before final save // clear the text and restore backup pos before final save
setInputString(ucstring("")); setInputStringAsUtf32(::u32string());
_CurrSelection = NULL; _CurrSelection = NULL;
} }
@ -1862,7 +1889,7 @@ namespace NLGUI
void CGroupEditBox::onLoadConfig() void CGroupEditBox::onLoadConfig()
{ {
// config is not saved when there's an empty string, so restore that default state. // config is not saved when there's an empty string, so restore that default state.
setInputString(ucstring("")); setInputStringAsUtf32(::u32string());
_CurrSelection = NULL; _CurrSelection = NULL;
_PrevNumLine = 1; _PrevNumLine = 1;
} }
@ -1877,7 +1904,7 @@ namespace NLGUI
if (_DefaultInputString) if (_DefaultInputString)
{ {
_DefaultInputString= false; _DefaultInputString= false;
setInputString(ucstring()); setInputStringAsUtf32(::u32string());
} }
_CanRedo = false; _CanRedo = false;
_CanUndo = false; _CanUndo = false;

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -161,8 +162,14 @@ namespace NLGUI
// ... // ...
limitingParent = limitingParent->getParent(); limitingParent = limitingParent->getParent();
} }
if (limitingParent)
getParentContainer()->setW(totalWidth + getParentContainer()->getWReal() - limitingParent->getWReal()); {
getParentContainer()->setW(totalWidth + getParentContainer()->getWReal() - limitingParent->getWReal());
}
else
{
nlwarning("No limiting parent for width");
}
} }
// resize H // resize H
@ -178,9 +185,14 @@ namespace NLGUI
CInterfaceGroup *limitingParent = colEnclosing->getParent(); CInterfaceGroup *limitingParent = colEnclosing->getParent();
while (limitingParent && (limitingParent->getResizeFromChildH() || dynamic_cast<CGroupList *>(limitingParent))) while (limitingParent && (limitingParent->getResizeFromChildH() || dynamic_cast<CGroupList *>(limitingParent)))
limitingParent = limitingParent->getParent(); limitingParent = limitingParent->getParent();
if (limitingParent)
nlassert(limitingParent); {
getParentContainer()->setH(col->getH() + getParentContainer()->getHReal() - limitingParent->getHReal()); getParentContainer()->setH(col->getH() + getParentContainer()->getHReal() - limitingParent->getHReal());
}
else
{
nlwarning("No limiting parent for height");
}
} }
} }
} }

@ -3,7 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2019 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2019-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -27,6 +27,7 @@
#include "nel/misc/types_nl.h" #include "nel/misc/types_nl.h"
#include "nel/misc/rgba.h" #include "nel/misc/rgba.h"
#include "nel/misc/algo.h" #include "nel/misc/algo.h"
#include "nel/misc/utf_string_view.h"
#include "nel/gui/libwww.h" #include "nel/gui/libwww.h"
#include "nel/gui/group_html.h" #include "nel/gui/group_html.h"
#include "nel/gui/group_list.h" #include "nel/gui/group_list.h"
@ -1033,7 +1034,7 @@ namespace NLGUI
// *************************************************************************** // ***************************************************************************
void CGroupHTML::addText (const char * buf, int len) void CGroupHTML::addText (const char *buf, int len)
{ {
if (_Browsing) if (_Browsing)
{ {
@ -1041,44 +1042,43 @@ namespace NLGUI
return; return;
// Build a UTF8 string // Build a UTF8 string
string inputString(buf, buf+len);
if (_ParsingLua && _TrustedDomain) if (_ParsingLua && _TrustedDomain)
{ {
// we are parsing a lua script // we are parsing a lua script
_LuaScript += inputString; _LuaScript += string(buf, buf + len);
// no more to do // no more to do
return; return;
} }
// Build a unicode string // Build a unicode string
ucstring inputUCString; CUtfStringView inputStringView(buf, len);
inputUCString.fromUtf8(inputString);
// Build the final unicode string // Build the final unicode string
ucstring tmp; string tmp;
tmp.reserve(len); tmp.reserve(len);
uint ucLen = (uint)inputUCString.size(); u32char lastChar = 0;
for (uint i=0; i<ucLen; i++) u32char inputStringView0 = *inputStringView.begin();
for (CUtfStringView::iterator it(inputStringView.begin()), end(inputStringView.end()); it != end; ++it)
{ {
ucchar output; u32char output;
bool keep; bool keep;
// special treatment for 'nbsp' (which is returned as a discreet space) // special treatment for 'nbsp' (which is returned as a discreet space)
if (inputString.size() == 1 && inputString[0] == 32) if (len == 1 && inputStringView0 == 32)
{ {
// this is a nbsp entity // this is a nbsp entity
output = inputUCString[i]; output = *it;
keep = true; keep = true;
} }
else else
{ {
// not nbsp, use normal white space removal routine // not nbsp, use normal white space removal routine
keep = translateChar (output, inputUCString[i], (tmp.empty())?0:tmp[tmp.size()-1]); keep = translateChar (output, *it, lastChar);
} }
if (keep) if (keep)
{ {
tmp.push_back(output); CUtfStringView::append(tmp, output);
lastChar = output;
} }
} }
@ -1292,7 +1292,7 @@ namespace NLGUI
pos++; pos++;
} }
token = content.substr(start, pos - start); token = content.substr(start, pos - start);
addString(ucstring::makeFromUtf8(token)); addString(token);
// skip closing quote // skip closing quote
pos++; pos++;
@ -1375,7 +1375,7 @@ namespace NLGUI
if (elm.hasAttribute(token)) if (elm.hasAttribute(token))
{ {
addString(ucstring::makeFromUtf8(elm.getAttribute(token))); addString(elm.getAttribute(token));
} }
} }
else else
@ -1561,7 +1561,7 @@ namespace NLGUI
else else
if( name == "title_prefix" ) if( name == "title_prefix" )
{ {
return _TitlePrefix.toString(); return _TitlePrefix;
} }
else else
if( name == "background_color" ) if( name == "background_color" )
@ -2223,7 +2223,7 @@ namespace NLGUI
xmlSetProp( node, BAD_CAST "type", BAD_CAST "html" ); xmlSetProp( node, BAD_CAST "type", BAD_CAST "html" );
xmlSetProp( node, BAD_CAST "url", BAD_CAST _URL.c_str() ); xmlSetProp( node, BAD_CAST "url", BAD_CAST _URL.c_str() );
xmlSetProp( node, BAD_CAST "title_prefix", BAD_CAST _TitlePrefix.toString().c_str() ); xmlSetProp( node, BAD_CAST "title_prefix", BAD_CAST _TitlePrefix.c_str() );
xmlSetProp( node, BAD_CAST "background_color", BAD_CAST toString( BgColor ).c_str() ); xmlSetProp( node, BAD_CAST "background_color", BAD_CAST toString( BgColor ).c_str() );
xmlSetProp( node, BAD_CAST "error_color", BAD_CAST toString( ErrorColor ).c_str() ); xmlSetProp( node, BAD_CAST "error_color", BAD_CAST toString( ErrorColor ).c_str() );
xmlSetProp( node, BAD_CAST "link_color", BAD_CAST toString( LinkColor ).c_str() ); xmlSetProp( node, BAD_CAST "link_color", BAD_CAST toString( LinkColor ).c_str() );
@ -2668,7 +2668,7 @@ namespace NLGUI
// *************************************************************************** // ***************************************************************************
bool CGroupHTML::translateChar(ucchar &output, ucchar input, ucchar lastCharParam) const bool CGroupHTML::translateChar(u32char &output, u32char input, u32char lastCharParam) const
{ {
// Keep this char ? // Keep this char ?
bool keep = true; bool keep = true;
@ -2690,13 +2690,13 @@ namespace NLGUI
else else
{ {
// Get the last char // Get the last char
ucchar lastChar = lastCharParam; u32char lastChar = lastCharParam;
if (lastChar == 0) if (lastChar == 0)
lastChar = getLastChar(); lastChar = getLastChar();
keep = ((lastChar != (ucchar)' ') && keep = ((lastChar != (u32char)' ') &&
(lastChar != 0)) || getPRE() || (_CurrentViewImage && (lastChar == 0)); (lastChar != 0)) || getPRE() || (_CurrentViewImage && (lastChar == 0));
if(!getPRE()) if(!getPRE())
input = ' '; input = (u32char)' ';
} }
} }
break; break;
@ -2709,11 +2709,11 @@ namespace NLGUI
else else
{ {
// Get the last char // Get the last char
ucchar lastChar = lastCharParam; u32char lastChar = lastCharParam;
if (lastChar == 0) if (lastChar == 0)
lastChar = getLastChar(); lastChar = getLastChar();
keep = ((lastChar != (ucchar)' ') && keep = ((lastChar != (u32char)' ') &&
(lastChar != (ucchar)'\n') && (lastChar != (u32char)'\n') &&
(lastChar != 0)) || getPRE() || (_CurrentViewImage && (lastChar == 0)); (lastChar != 0)) || getPRE() || (_CurrentViewImage && (lastChar == 0));
} }
} }
@ -2752,13 +2752,13 @@ namespace NLGUI
// *************************************************************************** // ***************************************************************************
void CGroupHTML::addString(const ucstring &str) void CGroupHTML::addString(const std::string &str)
{ {
ucstring tmpStr = str; string tmpStr = str;
if (_Localize) if (_Localize)
{ {
string _str = tmpStr.toString(); string _str = tmpStr;
string::size_type p = _str.find('#'); string::size_type p = _str.find('#');
if (p == string::npos) if (p == string::npos)
{ {
@ -2799,7 +2799,7 @@ namespace NLGUI
} }
else if (_Object) else if (_Object)
{ {
_ObjectScript += tmpStr.toString(); _ObjectScript += tmpStr;
} }
else if (_SelectOption) else if (_SelectOption)
{ {
@ -2829,7 +2829,7 @@ namespace NLGUI
// Number of child in this paragraph // Number of child in this paragraph
if (_CurrentViewLink) if (_CurrentViewLink)
{ {
bool skipLine = !_CurrentViewLink->getText().empty() && *(_CurrentViewLink->getText().rbegin()) == (ucchar) '\n'; bool skipLine = !_CurrentViewLink->getText().empty() && *(_CurrentViewLink->getText().rbegin()) == '\n';
bool sameShadow = style.TextShadow.Enabled && _CurrentViewLink->getShadow(); bool sameShadow = style.TextShadow.Enabled && _CurrentViewLink->getShadow();
if (sameShadow && style.TextShadow.Enabled) if (sameShadow && style.TextShadow.Enabled)
{ {
@ -2887,7 +2887,7 @@ namespace NLGUI
ctrlButton->setModulateGlobalColorAll (false); ctrlButton->setModulateGlobalColorAll (false);
// Translate the tooltip // Translate the tooltip
ctrlButton->setDefaultContextHelp(ucstring::makeFromUtf8(getLinkTitle())); ctrlButton->setDefaultContextHelp(getLinkTitle());
ctrlButton->setText(tmpStr); ctrlButton->setText(tmpStr);
// empty url / button disabled // empty url / button disabled
bool disabled = string(getLink()).empty(); bool disabled = string(getLink()).empty();
@ -2967,7 +2967,7 @@ namespace NLGUI
// *************************************************************************** // ***************************************************************************
CInterfaceGroup *CGroupHTML::addTextArea(const std::string &templateName, const char *name, uint rows, uint cols, bool multiLine, const ucstring &content, uint maxlength) CInterfaceGroup *CGroupHTML::addTextArea(const std::string &templateName, const char *name, uint rows, uint cols, bool multiLine, const std::string &content, uint maxlength)
{ {
// In a paragraph ? // In a paragraph ?
if (!_Paragraph) if (!_Paragraph)
@ -3233,7 +3233,7 @@ namespace NLGUI
} }
else else
{ {
ctrlButton->setDefaultContextHelp(ucstring::makeFromUtf8(tooltip)); ctrlButton->setDefaultContextHelp(tooltip);
//ctrlButton->setOnContextHelp(string(tooltip)); //ctrlButton->setOnContextHelp(string(tooltip));
} }
@ -3305,11 +3305,11 @@ namespace NLGUI
// *************************************************************************** // ***************************************************************************
ucchar CGroupHTML::getLastChar() const u32char CGroupHTML::getLastChar() const
{ {
if (_CurrentViewLink) if (_CurrentViewLink)
{ {
const ucstring &str = _CurrentViewLink->getText(); ::u32string str = CUtfStringView(_CurrentViewLink->getText()).toUtf32(); // FIXME: Optimize reverse UTF iteration
if (!str.empty()) if (!str.empty())
return str[str.length()-1]; return str[str.length()-1];
} }
@ -3401,7 +3401,7 @@ namespace NLGUI
// *************************************************************************** // ***************************************************************************
void CGroupHTML::setTitle (const ucstring &title) void CGroupHTML::setContainerTitle (const std::string &title)
{ {
CInterfaceElement *parent = getParent(); CInterfaceElement *parent = getParent();
if (parent) if (parent)
@ -3411,7 +3411,7 @@ namespace NLGUI
CGroupContainer *container = dynamic_cast<CGroupContainer*>(parent); CGroupContainer *container = dynamic_cast<CGroupContainer*>(parent);
if (container) if (container)
{ {
container->setUCTitle (title); container->setTitle(title);
} }
} }
} }
@ -3419,21 +3419,18 @@ namespace NLGUI
void CGroupHTML::setTitle(const std::string &title) void CGroupHTML::setTitle(const std::string &title)
{ {
ucstring uctitle;
uctitle.fromUtf8(title);
_TitleString.clear(); _TitleString.clear();
if(!_TitlePrefix.empty()) if(!_TitlePrefix.empty())
{ {
_TitleString = _TitlePrefix + " - "; _TitleString = _TitlePrefix + " - ";
} }
_TitleString += uctitle; _TitleString += title;
setTitle(_TitleString); setContainerTitle(_TitleString);
} }
std::string CGroupHTML::getTitle() const { std::string CGroupHTML::getTitle() const {
return _TitleString.toUtf8(); return _TitleString;
}; };
// *************************************************************************** // ***************************************************************************
@ -3709,7 +3706,7 @@ namespace NLGUI
CGroupEditBox *editBox = dynamic_cast<CGroupEditBox*>(group); CGroupEditBox *editBox = dynamic_cast<CGroupEditBox*>(group);
if (editBox) if (editBox)
{ {
entryData = editBox->getViewText()->getText(); entryData = CUtfStringView(editBox->getViewText()->getText()).toUtf16();
addEntry = true; addEntry = true;
} }
} }
@ -4180,7 +4177,8 @@ namespace NLGUI
} }
else else
{ {
renderHtmlString(content); // Sanitize downloaded HTML UTF-8 encoding, and render
renderHtmlString(CUtfStringView(content).toUtf8(true));
} }
} }
@ -4684,9 +4682,7 @@ namespace NLGUI
CLuaIHM::checkArgType(ls, funcName, 3, LUA_TBOOLEAN); CLuaIHM::checkArgType(ls, funcName, 3, LUA_TBOOLEAN);
string name = ls.toString(1); string name = ls.toString(1);
string text = ls.toString(2);
ucstring text;
text.fromUtf8(ls.toString(2));
if (!_Forms.empty()) if (!_Forms.empty())
{ {
@ -4716,7 +4712,7 @@ namespace NLGUI
const char *funcName = "addString"; const char *funcName = "addString";
CLuaIHM::checkArgCount(ls, funcName, 1); CLuaIHM::checkArgCount(ls, funcName, 1);
CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING);
addString(ucstring(ls.toString(1))); addString(ls.toString(1));
return 0; return 0;
} }
@ -4944,7 +4940,7 @@ namespace NLGUI
} }
// *************************************************************************** // ***************************************************************************
inline bool isDigit(ucchar c, uint base = 16) inline bool isDigit(char c, uint base = 16)
{ {
if (c>='0' && c<='9') return true; if (c>='0' && c<='9') return true;
if (base != 16) return false; if (base != 16) return false;
@ -4954,7 +4950,7 @@ namespace NLGUI
} }
// *************************************************************************** // ***************************************************************************
inline ucchar convertHexDigit(ucchar c) inline char convertHexDigit(char c)
{ {
if (c>='0' && c<='9') return c-'0'; if (c>='0' && c<='9') return c-'0';
if (c>='A' && c<='F') return c-'A'+10; if (c>='A' && c<='F') return c-'A'+10;
@ -4963,9 +4959,10 @@ namespace NLGUI
} }
// *************************************************************************** // ***************************************************************************
ucstring CGroupHTML::decodeHTMLEntities(const ucstring &str) std::string CGroupHTML::decodeHTMLEntities(const std::string &str)
{ {
ucstring result; std::string result;
result.reserve(str.size() + (str.size() >> 2));
uint last, pos; uint last, pos;
for (uint i=0; i<str.length(); ++i) for (uint i=0; i<str.length(); ++i)
@ -5001,13 +4998,13 @@ namespace NLGUI
continue; continue;
} }
ucchar c = 0; u32char c = 0;
// convert digits to unicode character // convert digits to unicode character
while (pos<last) c = convertHexDigit(str[pos++]) + c*ucchar(base); while (pos < last) c = convertHexDigit(str[pos++]) + (c * u32char(base));
// append our new character to the result string // append our new character to the result string
result += c; CUtfStringView::append(result, c);
// move 'i' forward to point at the ';' .. the for(...) will increment i to point to next char // move 'i' forward to point at the ';' .. the for(...) will increment i to point to next char
i = last; i = last;
@ -5016,10 +5013,10 @@ namespace NLGUI
} }
// special xml characters // special xml characters
if (str.substr(i+1,5)==ucstring("quot;")) { i+=5; result+='\"'; continue; } if (str.substr(i+1,5)=="quot;") { i+=5; result+='\"'; continue; }
if (str.substr(i+1,4)==ucstring("amp;")) { i+=4; result+='&'; continue; } if (str.substr(i+1,4)=="amp;") { i+=4; result+='&'; continue; }
if (str.substr(i+1,3)==ucstring("lt;")) { i+=3; result+='<'; continue; } if (str.substr(i+1,3)=="lt;") { i+=3; result+='<'; continue; }
if (str.substr(i+1,3)==ucstring("gt;")) { i+=3; result+='>'; continue; } if (str.substr(i+1,3)=="gt;") { i+=3; result+='>'; continue; }
} }
// all the special cases are catered for... treat this as a normal character // all the special cases are catered for... treat this as a normal character
@ -5470,11 +5467,11 @@ namespace NLGUI
} }
else else
{ {
ctrlButton->setDefaultContextHelp(ucstring(tooltip)); ctrlButton->setDefaultContextHelp(tooltip);
} }
} }
ctrlButton->setText(ucstring::makeFromUtf8(value)); ctrlButton->setText(value);
setTextButtonStyle(ctrlButton, _Style.Current); setTextButtonStyle(ctrlButton, _Style.Current);
} }
@ -5562,8 +5559,7 @@ namespace NLGUI
{ {
if (!_Paragraph || _Paragraph->getNumChildren() == 0) if (!_Paragraph || _Paragraph->getNumChildren() == 0)
{ {
ucstring tmp("\n"); addString("\n");
addString(tmp);
} }
else else
{ {
@ -6085,8 +6081,7 @@ namespace NLGUI
{ {
// Get the string name // Get the string name
string name = elm.getAttribute("name"); string name = elm.getAttribute("name");
ucstring ucValue; string ucValue = elm.getAttribute("value");
ucValue.fromUtf8(elm.getAttribute("value"));
uint size = 20; uint size = 20;
uint maxlength = 1024; uint maxlength = 1024;
@ -6120,12 +6115,12 @@ namespace NLGUI
string normal = elm.getAttribute("src"); string normal = elm.getAttribute("src");
string pushed; string pushed;
string over; string over;
ucstring ucValue = ucstring("on"); string ucValue = "on";
bool checked = elm.hasAttribute("checked"); bool checked = elm.hasAttribute("checked");
// TODO: unknown if empty attribute should override or not // TODO: unknown if empty attribute should override or not
if (elm.hasNonEmptyAttribute("value")) if (elm.hasNonEmptyAttribute("value"))
ucValue.fromUtf8(elm.getAttribute("value")); ucValue = elm.getAttribute("value");
if (type == "radio") if (type == "radio")
{ {
@ -6190,8 +6185,7 @@ namespace NLGUI
string name = elm.getAttribute("name"); string name = elm.getAttribute("name");
// Get the value // Get the value
ucstring ucValue; string ucValue = elm.getAttribute("value");
ucValue.fromUtf8(elm.getAttribute("value"));
// Add an entry // Add an entry
CGroupHTML::CForm::CEntry entry; CGroupHTML::CForm::CEntry entry;
@ -6223,8 +6217,7 @@ namespace NLGUI
if (elm.hasNonEmptyAttribute("value")) if (elm.hasNonEmptyAttribute("value"))
fromString(elm.getAttribute("value"), _UL.back().Value); fromString(elm.getAttribute("value"), _UL.back().Value);
ucstring str; string str = _UL.back().getListMarkerText();
str.fromUtf8(_UL.back().getListMarkerText());
addString (str); addString (str);
// list-style-type: outside // list-style-type: outside
@ -6428,7 +6421,7 @@ namespace NLGUI
// use option text as value // use option text as value
if (!elm.hasAttribute("value")) if (!elm.hasAttribute("value"))
{ {
_Forms.back().Entries.back().SelectValues.back() = _SelectOptionStr.toUtf8(); _Forms.back().Entries.back().SelectValues.back() = _SelectOptionStr;
} }
// insert the parsed text into the select control // insert the parsed text into the select control

@ -3,6 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -518,11 +519,10 @@ namespace NLGUI
{ {
_HardText = std::string( (const char*)ptr ); _HardText = std::string( (const char*)ptr );
const char *propPtr = ptr; const char *propPtr = ptr;
ucstring Text = ucstring(propPtr); if (NLMISC::startsWith(propPtr, "ui"))
if ((strlen(propPtr)>2) && (propPtr[0] == 'u') && (propPtr[1] == 'i')) addTextChild(CI18N::get(propPtr));
Text = CI18N::get (propPtr); else
addTextChild(propPtr);
addTextChild(Text);
} }
else else
{ {
@ -540,7 +540,7 @@ namespace NLGUI
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CGroupList::addTextChild(const ucstring& line, bool multiLine /*= true*/) void CGroupList::addTextChild(const std::string& line, bool multiLine /*= true*/)
{ {
const string elid = _Id + ":el" + toString(_IdCounter); ++_IdCounter; const string elid = _Id + ":el" + toString(_IdCounter); ++_IdCounter;
CViewText *view= new CViewText (elid, string(""), _Templ.getFontSize(), _Templ.getColor(), _Templ.getShadow()); CViewText *view= new CViewText (elid, string(""), _Templ.getFontSize(), _Templ.getColor(), _Templ.getShadow());
@ -559,7 +559,7 @@ namespace NLGUI
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void CGroupList::addTextChild(const ucstring& line, const CRGBA& textColor, bool multiLine /*= true*/) void CGroupList::addTextChild(const std::string& line, const CRGBA& textColor, bool multiLine /*= true*/)
{ {
const string elid = _Id + ":el" + toString(_IdCounter); ++_IdCounter; const string elid = _Id + ":el" + toString(_IdCounter); ++_IdCounter;
CViewText *view= new CViewText (elid, string(""), _Templ.getFontSize(), _Templ.getColor(), _Templ.getShadow()); CViewText *view= new CViewText (elid, string(""), _Templ.getFontSize(), _Templ.getColor(), _Templ.getShadow());
@ -1290,7 +1290,7 @@ namespace NLGUI
ucstring text; ucstring text;
if(CLuaIHM::pop(ls, text)) if(CLuaIHM::pop(ls, text))
{ {
addTextChild(text); addTextChild(text.toUtf8()); // FIXME: Lua UTF-8
} }
return 0; return 0;
} }
@ -1314,7 +1314,7 @@ namespace NLGUI
uint b = (uint) ls.toInteger(4); uint b = (uint) ls.toInteger(4);
uint a = (uint) ls.toInteger(5); uint a = (uint) ls.toInteger(5);
addTextChild(ucText, CRGBA(r, g, b, a)); addTextChild(ucText.toUtf8(), CRGBA(r, g, b, a)); // FIXME: Lua UTF-8
return 0; return 0;
} }

@ -3,7 +3,7 @@
// //
// This source file has been modified by the following contributors: // This source file has been modified by the following contributors:
// Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com> // Copyright (C) 2013 Laszlo KIS-ADAM (dfighter) <dfighter1985@gmail.com>
// Copyright (C) 2014-2015 Jan BOON (Kaetemi) <jan.boon@kaetemi.be> // Copyright (C) 2014-2020 Jan BOON (Kaetemi) <jan.boon@kaetemi.be>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
@ -275,7 +275,7 @@ namespace NLGUI
if (stricmp((char*)cur->name, "action") == 0) if (stricmp((char*)cur->name, "action") == 0)
{ {
string strId, strAh, strParams, strCond, strTexture; string strId, strAh, strParams, strCond, strTexture;
ucstring ucstrName; string ucstrName;
if (id) strId = (const char*)id; if (id) strId = (const char*)id;
CXMLAutoPtr name((const char*) xmlGetProp (cur, (xmlChar*)"name")); CXMLAutoPtr name((const char*) xmlGetProp (cur, (xmlChar*)"name"));
@ -283,9 +283,10 @@ namespace NLGUI
if (name) if (name)
{ {
const char *ptrName = (const char*)name; const char *ptrName = (const char*)name;
ucstrName = ucstring(ptrName); if (NLMISC::startsWith(ptrName, "ui"))
if ((strlen(ptrName)>2) && (ptrName[0] == 'u') && (ptrName[1] == 'i')) ucstrName = CI18N::get(ptrName);
ucstrName = CI18N::get (ptrName); else
ucstrName = ptrName;
} }
CXMLAutoPtr ah((const char*) xmlGetProp (cur, (xmlChar*)"handler")); CXMLAutoPtr ah((const char*) xmlGetProp (cur, (xmlChar*)"handler"));
@ -1222,7 +1223,7 @@ namespace NLGUI
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
CViewTextMenu* CGroupSubMenu::addLine (const ucstring &name, const std::string &ah, CViewTextMenu* CGroupSubMenu::addLine (const std::string &name, const std::string &ah,
const std::string &params, const std::string &id, const std::string &params, const std::string &id,
const std::string &cond, const std::string &texture, const std::string &cond, const std::string &texture,
bool checkable /*= false*/, bool checked /*= false*/, bool formatted /*= false */ bool checkable /*= false*/, bool checked /*= false*/, bool formatted /*= false */
@ -1303,7 +1304,7 @@ namespace NLGUI
return pV; return pV;
} }
CViewTextMenu* CGroupSubMenu::addLineAtIndex(uint index, const ucstring &name, const std::string &ah, CViewTextMenu* CGroupSubMenu::addLineAtIndex(uint index, const std::string &name, const std::string &ah,
const std::string &params, const std::string &id /*=""*/, const std::string &params, const std::string &id /*=""*/,
const std::string &cond /*=std::string()*/, const std::string &texture, const std::string &cond /*=std::string()*/, const std::string &texture,
bool checkable /*= false*/, bool checked /*= false*/, bool formatted /*= false */ bool checkable /*= false*/, bool checked /*= false*/, bool formatted /*= false */
@ -1865,8 +1866,8 @@ namespace NLGUI
CLuaIHM::checkArgType(ls, funcName, 3, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 3, LUA_TSTRING);
CLuaIHM::checkArgType(ls, funcName, 4, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 4, LUA_TSTRING);
ucstring arg1; ucstring arg1;
nlverify(CLuaIHM::getUCStringOnStack(ls, 1, arg1)); nlverify(CLuaIHM::getUCStringOnStack(ls, 1, arg1)); // FIXME: Lua UTF-8
addLine(arg1, ls.toString(2), ls.toString(3), ls.toString(4)); addLine(arg1.toUtf8(), ls.toString(2), ls.toString(3), ls.toString(4));
return 0; return 0;
} }
@ -1881,8 +1882,8 @@ namespace NLGUI
CLuaIHM::checkArgType(ls, funcName, 4, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 4, LUA_TSTRING);
CLuaIHM::checkArgType(ls, funcName, 5, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 5, LUA_TSTRING);
ucstring arg1; ucstring arg1;
nlverify(CLuaIHM::getUCStringOnStack(ls, 1, arg1)); nlverify(CLuaIHM::getUCStringOnStack(ls, 1, arg1)); // FIXME: Lua UTF-8
addLine(arg1, ls.toString(2), ls.toString(3), ls.toString(4), string(), ls.toString(5)); addLine(arg1.toUtf8(), ls.toString(2), ls.toString(3), ls.toString(4), string(), ls.toString(5));
return 0; return 0;
} }
@ -1897,8 +1898,8 @@ namespace NLGUI
CLuaIHM::checkArgType(ls, funcName, 4, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 4, LUA_TSTRING);
CLuaIHM::checkArgType(ls, funcName, 5, LUA_TSTRING); CLuaIHM::checkArgType(ls, funcName, 5, LUA_TSTRING);
ucstring arg2; ucstring arg2;
nlverify(CLuaIHM::getUCStringOnStack(ls, 2, arg2)); nlverify(CLuaIHM::getUCStringOnStack(ls, 2, arg2)); // FIXME: Lua UTF-8
addLineAtIndex((uint) ls.toInteger(1), arg2, ls.toString(3), ls.toString(4), ls.toString(5)); addLineAtIndex((uint) ls.toInteger(1), arg2.toUtf8(), ls.toString(3), ls.toString(4), ls.toString(5));
return 0; return 0;
} }
@ -2539,25 +2540,7 @@ namespace NLGUI
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
void CGroupMenu::addLine (const string &name, const string &ah, const string &params, void CGroupMenu::addLine(const std::string &name, const std::string &ah, const std::string &params,
const std::string &id/*=std::string()*/,
const std::string &cond /*= std::string()*/, const std::string &texture,
bool checkable /*= false*/, bool checked /*= false*/
)
{
if (_RootMenu == NULL)
{
_RootMenu = new CGroupSubMenu(CViewText::TCtorParam());
_RootMenu->_GroupMenu = this;
_RootMenu->setSerializable( false );
addGroup (_RootMenu);
}
_RootMenu->addLine (name, ah, params, id, cond, texture, checkable, checked, _Formatted);
}
// ------------------------------------------------------------------------------------------------
void CGroupMenu::addLine(const ucstring &name, const std::string &ah, const std::string &params,
const std::string &id /* = std::string()*/, const std::string &id /* = std::string()*/,
const std::string &cond /*= std::string()*/, const std::string &texture, const std::string &cond /*= std::string()*/, const std::string &texture,
bool checkable /*= false*/, bool checked /*= false*/ bool checkable /*= false*/, bool checked /*= false*/
@ -2573,7 +2556,7 @@ namespace NLGUI
_RootMenu->addLine (name, ah, params, id, cond, texture, checkable, checked, _Formatted); _RootMenu->addLine (name, ah, params, id, cond, texture, checkable, checked, _Formatted);
} }
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
void CGroupMenu::addLineAtIndex(uint index, const ucstring &name, const std::string &ah, void CGroupMenu::addLineAtIndex(uint index, const std::string &name, const std::string &ah,
const std::string &params, const std::string &id /*=std::string()*/, const std::string &params, const std::string &id /*=std::string()*/,
const std::string &cond /*=std::string()*/, const std::string &texture, const std::string &cond /*=std::string()*/, const std::string &texture,
bool checkable /*=false*/, bool checked /*=false*/) bool checkable /*=false*/, bool checked /*=false*/)

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save