Three new methods in FLineEdit

This commit is contained in:
Markus Gans 2019-02-24 00:25:36 +01:00
parent 54dbbbcf4e
commit 2270f4cde5
14 changed files with 205 additions and 90 deletions

View File

@ -1,3 +1,9 @@
2019-02-24 Markus Gans <guru.mail@muenster.de>
* FLineEdit now has the ability to define a character input filter
via regular expression (regex)
* Now FLineEdit can define a maximum character length for the input
* The cursor position can now be set directly in FLineEdit
2019-02-07 Markus Gans <guru.mail@muenster.de> 2019-02-07 Markus Gans <guru.mail@muenster.de>
* Add a "dynamic layout" Chapter into the first steps document * Add a "dynamic layout" Chapter into the first steps document

View File

@ -702,8 +702,8 @@ class dialogWidget : public FDialog
{ {
setText ("Dialog"); setText ("Dialog");
setResizeable(); setResizeable();
btn.setGeometry (FPoint(1, 1), FSize(12, 1), false); button.setGeometry (FPoint(1, 1), FSize(12, 1), false);
line.setGeometry (FPoint(2, 3), FSize(12, 1), false); input.setGeometry (FPoint(2, 3), FSize(12, 1), false);
// Set dialog geometry and calling adjustSize() // Set dialog geometry and calling adjustSize()
setGeometry (FPoint(25, 5), FSize(40, 12)); setGeometry (FPoint(25, 5), FSize(40, 12));
setMinimumSize (FSize(25, 9)); setMinimumSize (FSize(25, 9));
@ -727,12 +727,12 @@ class dialogWidget : public FDialog
void adjustWidgets() void adjustWidgets()
{ {
auto bx = int(getWidth() - btn.getWidth() - 3); auto bx = int(getWidth() - button.getWidth() - 3);
auto by = int(getHeight() - 4); auto by = int(getHeight() - 4);
btn.setPos (FPoint(bx, by), false); button.setPos (FPoint(bx, by), false);
line.setWidth (getWidth() - 4); input.setWidth (getWidth() - 4);
auto ly = int(getHeight() / 2) - 1; auto ly = int(getHeight() / 2) - 1;
line.setY (ly, false); input.setY (ly, false);
} }
virtual void adjustSize() override virtual void adjustSize() override
@ -764,8 +764,8 @@ class dialogWidget : public FDialog
<< "top"; << "top";
} }
FLineEdit line{"Middle", this}; FLineEdit input{"Middle", this};
FButton btn{"&Bottom", this}; FButton button{"&Bottom", this};
}; };
int main (int argc, char* argv[]) int main (int argc, char* argv[])

View File

@ -3,7 +3,7 @@
* * * *
* This file is part of the Final Cut widget toolkit * * This file is part of the Final Cut widget toolkit *
* * * *
* Copyright 2017-2018 Markus Gans * * Copyright 2017-2019 Markus Gans *
* * * *
* The Final Cut is free software; you can redistribute it and/or * * The Final Cut is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License * * modify it under the terms of the GNU Lesser General Public License *
@ -313,7 +313,7 @@ int main (int argc, char* argv[])
// Pointer to the global virtual terminal object // Pointer to the global virtual terminal object
terminal = static_cast<finalcut::FVTerm*>(&TermApp); terminal = static_cast<finalcut::FVTerm*>(&TermApp);
finalcut::FTermcap::tcap_map* tcap = nullptr; finalcut::FTermcap::tcap_map* tcap;
tcap = finalcut::FTermcap::getTermcapMap(); tcap = finalcut::FTermcap::getTermcapMap();
std::cout << "--------\r\nFTermcap\r\n--------\r\n\n"; std::cout << "--------\r\nFTermcap\r\n--------\r\n\n";

View File

@ -269,7 +269,7 @@ class MyDialog : public finalcut::FDialog
MyDialog& operator = (const MyDialog&) = delete; MyDialog& operator = (const MyDialog&) = delete;
private: private:
// Method // Methods
void initMenu(); void initMenu();
void initMenuCallbacks(); void initMenuCallbacks();
void initFileMenuCallbacks(); void initFileMenuCallbacks();

View File

@ -20,6 +20,8 @@
* <http://www.gnu.org/licenses/>. * * <http://www.gnu.org/licenses/>. *
***********************************************************************/ ***********************************************************************/
#include <regex>
#include "final/fapplication.h" #include "final/fapplication.h"
#include "final/flineedit.h" #include "final/flineedit.h"
#include "final/fstatusbar.h" #include "final/fstatusbar.h"
@ -244,13 +246,41 @@ bool FLineEdit::setShadow (bool enable)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FLineEdit::setText (const FString& txt) void FLineEdit::setText (const FString& txt)
{ {
text_offset = 0;
cursor_pos = 0;
if ( txt ) if ( txt )
text = txt; {
if ( txt.getLength() > max_length )
text = txt.left(max_length);
else
text = txt;
}
else else
text = ""; text = "";
keyEnd();
}
//----------------------------------------------------------------------
void FLineEdit::setMaxLength (std::size_t max)
{
max_length = max;
if ( text.getLength() > max_length )
text = text.left(max_length);
keyEnd();
}
//----------------------------------------------------------------------
void FLineEdit::setCursorPosition (std::size_t pos)
{
cursor_pos = pos;
if ( cursor_pos > text.getLength() )
keyEnd();
else if ( cursor_pos >= getWidth() - 1 )
text_offset = text.getLength() - getWidth() + 2;
else
text_offset = 0;
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
@ -766,6 +796,8 @@ inline void FLineEdit::keyEnd()
if ( cursor_pos >= getWidth() - 1 ) if ( cursor_pos >= getWidth() - 1 )
text_offset = len - getWidth() + 2; text_offset = len - getWidth() + 2;
else
text_offset = 0;
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
@ -792,11 +824,12 @@ inline void FLineEdit::keyBackspace()
if ( text.getLength() > 0 && cursor_pos > 0 ) if ( text.getLength() > 0 && cursor_pos > 0 )
{ {
text.remove(cursor_pos - 1, 1); text.remove(cursor_pos - 1, 1);
processChanged();
cursor_pos--; cursor_pos--;
if ( text_offset > 0 ) if ( text_offset > 0 )
text_offset--; text_offset--;
processChanged();
} }
} }
@ -820,41 +853,57 @@ inline void FLineEdit::keyEnter()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FLineEdit::keyInput (FKey key) inline bool FLineEdit::keyInput (FKey key)
{ {
if ( text.getLength() >= max_length )
{
beep();
return true;
}
if ( key >= 0x20 && key <= 0x10fff ) if ( key >= 0x20 && key <= 0x10fff )
{ {
std::size_t len = text.getLength(); std::size_t len = text.getLength();
wchar_t c = characterFilter(wchar_t(key));
if ( cursor_pos == len ) if ( c == L'\0' )
{ return false;
text += wchar_t(key); else if ( cursor_pos == len )
processChanged(); text += c;
}
else if ( len > 0 ) else if ( len > 0 )
{ {
if ( insert_mode ) if ( insert_mode )
text.insert(wchar_t(key), cursor_pos); text.insert(c, cursor_pos);
else else
text.overwrite(wchar_t(key), cursor_pos); text.overwrite(c, cursor_pos);
processChanged();
} }
else else
{ text = c;
text = wchar_t(key);
processChanged();
}
cursor_pos++; cursor_pos++;
if ( cursor_pos >= getWidth() - 1 ) if ( cursor_pos >= getWidth() - 1 )
text_offset++; text_offset++;
processChanged();
return true; return true;
} }
else else
return false; return false;
} }
//----------------------------------------------------------------------
inline wchar_t FLineEdit::characterFilter (const wchar_t c)
{
if ( input_filter.empty() )
return c;
wchar_t character[2]{c, L'\0'};
if ( regex_match(character, std::wregex(input_filter)) )
return c;
else
return L'\0';
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FLineEdit::processActivate() void FLineEdit::processActivate()
{ {

View File

@ -1611,10 +1611,7 @@ void FListView::drawListLine ( const FListViewItem* item
{ {
for (std::size_t col = 0; col < item->column_list.size(); ) for (std::size_t col = 0; col < item->column_list.size(); )
{ {
static constexpr std::size_t leading_space = 1;
static constexpr std::size_t checkbox_space = 4;
static constexpr std::size_t ellipsis_length = 2; static constexpr std::size_t ellipsis_length = 2;
const auto& text = item->column_list[col]; const auto& text = item->column_list[col];
std::size_t width = std::size_t(header[col].width); std::size_t width = std::size_t(header[col].width);
std::size_t txt_length = text.getLength(); std::size_t txt_length = text.getLength();
@ -1626,6 +1623,7 @@ void FListView::drawListLine ( const FListViewItem* item
if ( tree_view && col == 1 ) if ( tree_view && col == 1 )
{ {
static constexpr std::size_t checkbox_space = 4;
width -= (indent + 1); width -= (indent + 1);
if ( item->isCheckable() ) if ( item->isCheckable() )
@ -1639,6 +1637,7 @@ void FListView::drawListLine ( const FListViewItem* item
if ( align_offset + txt_length <= width ) if ( align_offset + txt_length <= width )
{ {
// Insert text and trailing space // Insert text and trailing space
static constexpr std::size_t leading_space = 1;
line += text.left(width); line += text.left(width);
line += FString ( leading_space + width line += FString ( leading_space + width
- align_offset - txt_length, L' '); - align_offset - txt_length, L' ');

View File

@ -44,7 +44,7 @@ FSize& FSize::operator = (const FSize& s)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
FSize& FSize::operator += (const FSize& s) FSize& FSize::operator += (const FSize& s)
{ {
std::size_t max = std::numeric_limits<std::size_t>::max(); constexpr std::size_t max = std::numeric_limits<std::size_t>::max();
width = ( width < max - s.width) ? width + s.width : max; width = ( width < max - s.width) ? width + s.width : max;
height = ( height < max - s.height) ? height + s.height : max; height = ( height < max - s.height) ? height + s.height : max;
return *this; return *this;

View File

@ -96,18 +96,14 @@ int FTermBuffer::write (wchar_t c)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void FTermBuffer::write (const FColorPair& pair) void FTermBuffer::write (const FColorPair& pair)
{ {
charData nc; // next character FVTerm::setColor(pair.fg_color, pair.bg_color);
nc = FVTerm::getAttribute();
nc.fg_color = pair.fg_color;
nc.bg_color = pair.bg_color;
} }
// FTermBuffer non-member operators // FTermBuffer non-member operators
//---------------------------------------------------------------------- //----------------------------------------------------------------------
std::vector<FTermBuffer::charData>& operator << \ FTermBuffer::charDataVector& operator << ( FTermBuffer::charDataVector& termString
( std::vector<FTermBuffer::charData>& termString , const FTermBuffer& buf )
, const FTermBuffer& buf )
{ {
if ( ! buf.data.empty() ) if ( ! buf.data.empty() )
termString.assign(buf.data.begin(), buf.data.end()); termString.assign(buf.data.begin(), buf.data.end());

View File

@ -504,7 +504,6 @@ int FTermLinux::getFramebuffer_bpp()
//---------------------------------------------------------------------- //----------------------------------------------------------------------
bool FTermLinux::getScreenFont() bool FTermLinux::getScreenFont()
{ {
static constexpr std::size_t data_size = 4 * 32 * 512;
struct console_font_op font; struct console_font_op font;
int fd_tty = FTerm::getTTYFileDescriptor(); int fd_tty = FTerm::getTTYFileDescriptor();
@ -525,6 +524,7 @@ bool FTermLinux::getScreenFont()
// initialize with 0 // initialize with 0
try try
{ {
static constexpr std::size_t data_size = 4 * 32 * 512;
font.data = new uChar[data_size](); font.data = new uChar[data_size]();
} }
catch (const std::bad_alloc& ex) catch (const std::bad_alloc& ex)

View File

@ -26,6 +26,7 @@
#include "final/fapplication.h" #include "final/fapplication.h"
#include "final/fterm.h" #include "final/fterm.h"
#include "final/ftermbuffer.h"
#include "final/fvterm.h" #include "final/fvterm.h"
#include "final/fwidget.h" #include "final/fwidget.h"
#include "final/fwindow.h" #include "final/fwindow.h"
@ -79,12 +80,18 @@ FVTerm::FVTerm (bool initialize, bool disable_alt_screen)
FVTerm::~FVTerm() // destructor FVTerm::~FVTerm() // destructor
{ {
if ( init_object == this ) if ( init_object == this )
{
finish(); finish();
}
} }
// Overloaded operators
//----------------------------------------------------------------------
FVTerm& FVTerm::operator << (const FTermBuffer& term_buffer)
{
print (term_buffer);
return *this;
}
// public methods of FVTerm // public methods of FVTerm
//---------------------------------------------------------------------- //----------------------------------------------------------------------
FPoint FVTerm::getPrintCursor() FPoint FVTerm::getPrintCursor()
@ -317,12 +324,7 @@ int FVTerm::print (const FString& s)
auto area = getPrintArea(); auto area = getPrintArea();
if ( ! area ) if ( ! area )
{ return -1;
if ( vdesktop )
area = vdesktop;
else
return -1;
}
return print (area, s); return print (area, s);
} }
@ -357,6 +359,27 @@ int FVTerm::print (term_area* area, const FString& s)
return 0; return 0;
} }
//----------------------------------------------------------------------
int FVTerm::print (const FTermBuffer& term_buffer)
{
if ( term_buffer.isEmpty() )
return -1;
auto area = getPrintArea();
if ( ! area )
return -1;
return print (area, term_buffer);
}
//----------------------------------------------------------------------
int FVTerm::print (term_area* area, const FTermBuffer& term_buffer)
{
const auto& term_string = term_buffer.getBuffer();
return print (area, term_string);
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
int FVTerm::print (const std::vector<charData>& term_string) int FVTerm::print (const std::vector<charData>& term_string)
{ {
@ -366,12 +389,7 @@ int FVTerm::print (const std::vector<charData>& term_string)
auto area = getPrintArea(); auto area = getPrintArea();
if ( ! area ) if ( ! area )
{ return -1;
if ( vdesktop )
area = vdesktop;
else
return -1;
}
return print (area, term_string); return print (area, term_string);
} }
@ -440,12 +458,7 @@ int FVTerm::print (wchar_t c)
auto area = getPrintArea(); auto area = getPrintArea();
if ( ! area ) if ( ! area )
{ return -1;
if ( vdesktop )
area = vdesktop;
else
return -1;
}
return print (area, c); return print (area, c);
} }
@ -474,12 +487,7 @@ int FVTerm::print (charData& term_char)
auto area = getPrintArea(); auto area = getPrintArea();
if ( ! area ) if ( ! area )
{ return -1;
if ( vdesktop )
area = vdesktop;
else
return -1;
}
return print (area, term_char); return print (area, term_char);
} }

View File

@ -3,7 +3,7 @@
* * * *
* This file is part of the Final Cut widget toolkit * * This file is part of the Final Cut widget toolkit *
* * * *
* Copyright 2012-2018 Markus Gans * * Copyright 2012-2019 Markus Gans *
* * * *
* The Final Cut is free software; you can redistribute it and/or * * The Final Cut is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License * * modify it under the terms of the GNU Lesser General Public License *
@ -105,10 +105,16 @@ class FLineEdit : public FWidget
// Accessors // Accessors
virtual const char* getClassName() const override; virtual const char* getClassName() const override;
FString getText() const; FString getText() const;
std::size_t getMaxLength() const;
std::size_t getCursorPosition() const;
int getLabelOrientation(); int getLabelOrientation();
// Mutators // Mutators
void setText (const FString&); void setText (const FString&);
void setInputFilter (const FString&);
void clearInputFilter();
void setMaxLength (std::size_t);
void setCursorPosition (std::size_t);
void setLabelText (const FString&); void setLabelText (const FString&);
void setLabelOrientation(const label_o); void setLabelOrientation(const label_o);
virtual bool setEnable(bool) override; virtual bool setEnable(bool) override;
@ -167,6 +173,7 @@ class FLineEdit : public FWidget
void keyInsert(); void keyInsert();
void keyEnter(); void keyEnter();
bool keyInput (FKey); bool keyInput (FKey);
wchar_t characterFilter (const wchar_t);
void processActivate(); void processActivate();
void processChanged(); void processChanged();
@ -175,12 +182,14 @@ class FLineEdit : public FWidget
FString label_text{""}; FString label_text{""};
FLabel* label{}; FLabel* label{};
label_o label_orientation{FLineEdit::label_left}; label_o label_orientation{FLineEdit::label_left};
std::wstring input_filter{};
dragScroll drag_scroll{FLineEdit::noScroll}; dragScroll drag_scroll{FLineEdit::noScroll};
bool scroll_timer{false}; bool scroll_timer{false};
int scroll_repeat{100}; int scroll_repeat{100};
bool insert_mode{true}; bool insert_mode{true};
std::size_t cursor_pos{0}; std::size_t cursor_pos{0};
std::size_t text_offset{0}; std::size_t text_offset{0};
std::size_t max_length{std::numeric_limits<std::size_t>::max()};
}; };
#pragma pack(pop) #pragma pack(pop)
@ -194,10 +203,26 @@ inline const char* FLineEdit::getClassName() const
inline FString FLineEdit::getText() const inline FString FLineEdit::getText() const
{ return text; } { return text; }
//----------------------------------------------------------------------
inline std::size_t FLineEdit::getMaxLength() const
{ return max_length; }
//----------------------------------------------------------------------
inline std::size_t FLineEdit::getCursorPosition() const
{ return cursor_pos; }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline int FLineEdit::getLabelOrientation() inline int FLineEdit::getLabelOrientation()
{ return int(label_orientation); } { return int(label_orientation); }
//----------------------------------------------------------------------
inline void FLineEdit::setInputFilter (const FString& regex_string)
{ input_filter = regex_string.wc_str(); }
//----------------------------------------------------------------------
inline void FLineEdit::clearInputFilter()
{ input_filter.clear(); }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FLineEdit::setEnable() inline bool FLineEdit::setEnable()
{ return setEnable(true); } { return setEnable(true); }

View File

@ -3,7 +3,7 @@
* * * *
* This file is part of the Final Cut widget toolkit * * This file is part of the Final Cut widget toolkit *
* * * *
* Copyright 2014-2018 Markus Gans * * Copyright 2014-2019 Markus Gans *
* * * *
* The Final Cut is free software; you can redistribute it and/or * * The Final Cut is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Lesser General Public License * * modify it under the terms of the GNU Lesser General Public License *
@ -141,7 +141,7 @@ inline bool operator > (const FSize& s1, const FSize& s2)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline FSize operator + (const FSize& s1, const FSize& s2) inline FSize operator + (const FSize& s1, const FSize& s2)
{ {
std::size_t max = std::numeric_limits<std::size_t>::max(); constexpr std::size_t max = std::numeric_limits<std::size_t>::max();
std::size_t w = ( s1.width < max - s2.width) ? s1.width + s2.width : max; std::size_t w = ( s1.width < max - s2.width) ? s1.width + s2.width : max;
std::size_t h = ( s1.height < max - s2.height) ? s1.height + s2.height : max; std::size_t h = ( s1.height < max - s2.height) ? s1.height + s2.height : max;
return FSize(w, h); return FSize(w, h);

View File

@ -57,6 +57,7 @@ class FTermBuffer
public: public:
// Typedef // Typedef
typedef FOptiAttr::charData charData; typedef FOptiAttr::charData charData;
typedef std::vector<charData> charDataVector;
// Constructor // Constructor
FTermBuffer() = default; FTermBuffer() = default;
@ -65,17 +66,20 @@ class FTermBuffer
virtual ~FTermBuffer(); virtual ~FTermBuffer();
// Overloaded operators // Overloaded operators
template <typename type> template <typename typeT>
FTermBuffer& operator << (const type&); FTermBuffer& operator << (const typeT&);
FTermBuffer& operator << (const std::string&);
FTermBuffer& operator << (const std::wstring&);
FTermBuffer& operator << (const FColorPair&); FTermBuffer& operator << (const FColorPair&);
// Non-member operators // Non-member operators
friend std::vector<charData>& operator << ( std::vector<charData>& friend charDataVector& operator << ( charDataVector&
, const FTermBuffer& ); , const FTermBuffer& );
// Accessors // Accessors
virtual const char* getClassName() const; virtual const char* getClassName() const;
std::size_t getLength() const; std::size_t getLength() const;
const charDataVector& getBuffer() const;
// Inquiry // Inquiry
bool isEmpty() const; bool isEmpty() const;
@ -87,23 +91,38 @@ class FTermBuffer
int write (wchar_t); int write (wchar_t);
void write (const FColorPair&); void write (const FColorPair&);
FTermBuffer& write (); FTermBuffer& write ();
std::vector<charData> getBuffer();
private: private:
std::vector<charData> data{}; charDataVector data{};
}; };
#pragma pack(pop) #pragma pack(pop)
// FTermBuffer inline functions // FTermBuffer inline functions
//---------------------------------------------------------------------- //----------------------------------------------------------------------
template <typename type> template <typename typeT>
inline FTermBuffer& FTermBuffer::operator << (const type& s) inline FTermBuffer& FTermBuffer::operator << (const typeT& s)
{ {
FString str(s);
std::wostringstream outstream; std::wostringstream outstream;
outstream << str; outstream << s;
write (outstream.str());
if ( ! outstream.str().empty() )
write (outstream.str());
return *this;
}
//----------------------------------------------------------------------
inline FTermBuffer& FTermBuffer::operator << (const std::string& string)
{
write (string);
return *this;
}
//----------------------------------------------------------------------
inline FTermBuffer& FTermBuffer::operator << (const std::wstring& wstring)
{
write (wstring);
return *this; return *this;
} }
@ -122,6 +141,10 @@ inline const char* FTermBuffer::getClassName() const
inline std::size_t FTermBuffer::getLength() const inline std::size_t FTermBuffer::getLength() const
{ return data.size(); } { return data.size(); }
//----------------------------------------------------------------------
inline const FTermBuffer::charDataVector& FTermBuffer::getBuffer() const
{ return data; }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline bool FTermBuffer::isEmpty() const inline bool FTermBuffer::isEmpty() const
{ return data.empty(); } { return data.empty(); }
@ -134,10 +157,6 @@ inline void FTermBuffer::clear()
inline FTermBuffer& FTermBuffer::write() inline FTermBuffer& FTermBuffer::write()
{ return *this; } { return *this; }
//----------------------------------------------------------------------
inline std::vector<FTermBuffer::charData> FTermBuffer::getBuffer()
{ return data; }
} // namespace finalcut } // namespace finalcut
#endif // FTERMBUFFER_H #endif // FTERMBUFFER_H

View File

@ -70,8 +70,10 @@ namespace finalcut
{ {
// class forward declaration // class forward declaration
class FTermBuffer;
class FWidget; class FWidget;
//---------------------------------------------------------------------- //----------------------------------------------------------------------
// class FVTerm // class FVTerm
//---------------------------------------------------------------------- //----------------------------------------------------------------------
@ -130,8 +132,10 @@ class FVTerm
FVTerm& operator = (const FVTerm&) = delete; FVTerm& operator = (const FVTerm&) = delete;
// Overloaded operators // Overloaded operators
template <typename type> template <typename typeT>
FVTerm& operator << (const type&); FVTerm& operator << (const typeT&);
FVTerm& operator << (const std::string&);
FVTerm& operator << (const FTermBuffer&);
FVTerm& operator << (const std::vector<charData>&); FVTerm& operator << (const std::vector<charData>&);
FVTerm& operator << (const FPoint&); FVTerm& operator << (const FPoint&);
FVTerm& operator << (const FColorPair&); FVTerm& operator << (const FColorPair&);
@ -162,7 +166,7 @@ class FVTerm
void showCursor(); void showCursor();
void setPrintCursor (const FPoint&); void setPrintCursor (const FPoint&);
FColor rgb2ColorIndex (uInt8, uInt8, uInt8); FColor rgb2ColorIndex (uInt8, uInt8, uInt8);
void setColor (FColor, FColor); static void setColor (FColor, FColor);
static void setNormal(); static void setNormal();
static bool setBold (bool); static bool setBold (bool);
@ -291,6 +295,8 @@ class FVTerm
int printf (const FString, ...); int printf (const FString, ...);
int print (const FString&); int print (const FString&);
int print (term_area*, const FString&); int print (term_area*, const FString&);
int print (const FTermBuffer&);
int print (term_area*, const FTermBuffer&);
int print (const std::vector<charData>&); int print (const std::vector<charData>&);
int print (term_area*, const std::vector<charData>&); int print (term_area*, const std::vector<charData>&);
int print (wchar_t); int print (wchar_t);
@ -535,8 +541,8 @@ struct FVTerm::term_area // define virtual terminal character properties
// FVTerm inline functions // FVTerm inline functions
//---------------------------------------------------------------------- //----------------------------------------------------------------------
template <typename type> template <typename typeT>
inline FVTerm& FVTerm::operator << (const type& s) inline FVTerm& FVTerm::operator << (const typeT& s)
{ {
std::wostringstream outstream; std::wostringstream outstream;
outstream << s; outstream << s;
@ -547,6 +553,13 @@ inline FVTerm& FVTerm::operator << (const type& s)
return *this; return *this;
} }
//----------------------------------------------------------------------
inline FVTerm& FVTerm::operator << (const std::string& string)
{
print (string);
return *this;
}
//---------------------------------------------------------------------- //----------------------------------------------------------------------
inline FVTerm& FVTerm::operator << \ inline FVTerm& FVTerm::operator << \
(const std::vector<FVTerm::charData>& termString) (const std::vector<FVTerm::charData>& termString)