use UTF-8 for string representation

This commit is contained in:
Jinhao 2015-12-14 00:30:03 +08:00
parent 009e7e7647
commit 8fc84938bf
10 changed files with 47 additions and 34 deletions

View File

@ -203,7 +203,7 @@ namespace detail
void default_native_font(const font_ptr_t&); void default_native_font(const font_ptr_t&);
unsigned font_size_to_height(unsigned) const; unsigned font_size_to_height(unsigned) const;
unsigned font_height_to_size(unsigned) const; unsigned font_height_to_size(unsigned) const;
font_ptr_t make_native_font(const nana::char_t* name, unsigned height, unsigned weight, bool italic, bool underline, bool strick_out); font_ptr_t make_native_font(const char* name, unsigned height, unsigned weight, bool italic, bool underline, bool strick_out);
Display* open_display(); Display* open_display();
void close_display(); void close_display();

View File

@ -80,7 +80,7 @@ namespace detail
struct font_tag struct font_tag
{ {
nana::string name; native_string_type name;
unsigned height; unsigned height;
unsigned weight; unsigned weight;
bool italic; bool italic;
@ -186,7 +186,7 @@ namespace detail
void default_native_font(const font_ptr_t&); void default_native_font(const font_ptr_t&);
unsigned font_size_to_height(unsigned) const; unsigned font_size_to_height(unsigned) const;
unsigned font_height_to_size(unsigned) const; unsigned font_height_to_size(unsigned) const;
font_ptr_t make_native_font(const nana::char_t* name, unsigned height, unsigned weight, bool italic, bool underline, bool strike_out); font_ptr_t make_native_font(const char* name, unsigned height, unsigned weight, bool italic, bool underline, bool strike_out);
static platform_spec& instance(); static platform_spec& instance();

View File

@ -174,13 +174,25 @@ namespace nana
{ {
} }
categorize(window wd, const nana::string& text, bool visible = true) categorize(window wd, const std::string& text_utf8, bool visible = true)
: categorize(wd, ::nana::rectangle(), visible) : categorize(wd, ::nana::rectangle(), visible)
{ {
this->caption(text); this->caption(text);
} }
categorize(window wd, const nana::char_t* text, bool visible = true) categorize(window wd, const char* text_utf8, bool visible = true)
: categorize(wd, ::nana::rectangle(), visible)
{
this->caption(text);
}
categorize(window wd, const std::wstring& text, bool visible = true)
: categorize(wd, ::nana::rectangle(), visible)
{
this->caption(text);
}
categorize(window wd, const wchar_t* text, bool visible = true)
: categorize(wd, ::nana::rectangle(), visible) : categorize(wd, ::nana::rectangle(), visible)
{ {
this->caption(text); this->caption(text);
@ -206,7 +218,7 @@ namespace nana
} }
/// Erases a child category with a specified name from current category. /// Erases a child category with a specified name from current category.
categorize& childset_erase(const nana::string& name) categorize& childset_erase(const std::string& name)
{ {
if(this->get_drawer_trigger().childset_erase(name)) if(this->get_drawer_trigger().childset_erase(name))
API::update_window(*this); API::update_window(*this);
@ -220,13 +232,13 @@ namespace nana
} }
/// Sets the splitter string /// Sets the splitter string
categorize& splitstr(const nana::string& sstr) categorize& splitstr(const std::string& sstr)
{ {
this->get_drawer_trigger().splitstr(sstr); this->get_drawer_trigger().splitstr(sstr);
return *this; return *this;
} }
nana::string splitstr() const std::string splitstr() const
{ {
return this->get_drawer_trigger().splitstr(); return this->get_drawer_trigger().splitstr();
} }

View File

@ -434,7 +434,7 @@ namespace nana{ namespace widgets{ namespace skeletons
}; };
}; };
::std::wstring font; ::std::string font;
std::size_t font_size; std::size_t font_size;
bool bold; bool bold;
bool bold_empty; //bold should be ignored if bold_empty is true bool bold_empty; //bold should be ignored if bold_empty is true
@ -706,7 +706,7 @@ namespace nana{ namespace widgets{ namespace skeletons
if(token::string != tknizer.read()) if(token::string != tknizer.read())
throw std::runtime_error(""); throw std::runtime_error("");
fp->font = tknizer.idstr(); fp->font = to_utf8(tknizer.idstr());
break; break;
case token::size: case token::size:
if(token::equal != tknizer.read()) if(token::equal != tknizer.read())

View File

@ -36,14 +36,14 @@ namespace nana
font(); font();
font(drawable_type); font(drawable_type);
font(const font&); font(const font&);
font(const char_t* name, unsigned size, bool bold = false, bool italic = false, bool underline = false, bool strike_out = false); font(const ::std::string& name, unsigned size, bool bold = false, bool italic = false, bool underline = false, bool strike_out = false);
~font(); ~font();
bool empty() const; bool empty() const;
void make(const char_t* name, unsigned size, bool bold = false, bool italic = false, bool underline = false, bool strike_out = false); void make(const ::std::string& name, unsigned size, bool bold = false, bool italic = false, bool underline = false, bool strike_out = false);
void make_raw(const char_t*, unsigned height, unsigned weight, bool italic, bool underline, bool strike_out); void make_raw(const ::std::string& name, unsigned height, unsigned weight, bool italic, bool underline, bool strike_out);
void set_default() const; void set_default() const;
::nana::string name() const; ::std::string name() const;
unsigned size() const; unsigned size() const;
bool bold() const; bool bold() const;
unsigned height() const; unsigned height() const;

View File

@ -32,8 +32,6 @@ namespace paint
image(); image();
image(const image&); image(const image&);
image(image&&); image(image&&);
//image(const nana::char_t* file);
//image(const nana::string& filename); //deprecated
image(const ::nana::experimental::filesystem::path& file); image(const ::nana::experimental::filesystem::path& file);
template<typename Source> template<typename Source>
@ -45,7 +43,6 @@ namespace paint
~image(); ~image();
image& operator=(const image& rhs); image& operator=(const image& rhs);
image& operator=(image&&); image& operator=(image&&);
//bool open(const nana::string& filename); //deprecated
bool open(const ::nana::experimental::filesystem::path& file); bool open(const ::nana::experimental::filesystem::path& file);
/// Opens an icon from a specified buffer /// Opens an icon from a specified buffer

View File

@ -515,7 +515,7 @@ namespace detail
atombase_.xdnd_finished = ::XInternAtom(display_, "XdndFinished", False); atombase_.xdnd_finished = ::XInternAtom(display_, "XdndFinished", False);
//Create default font object. //Create default font object.
def_font_ptr_ = make_native_font(0, font_size_to_height(10), 400, false, false, false); def_font_ptr_ = make_native_font(nullptr, font_size_to_height(10), 400, false, false, false);
msg_dispatcher_ = new msg_dispatcher(display_); msg_dispatcher_ = new msg_dispatcher(display_);
} }
@ -550,10 +550,10 @@ namespace detail
return height; return height;
} }
platform_spec::font_ptr_t platform_spec::make_native_font(const nana::char_t* name, unsigned height, unsigned weight, bool italic, bool underline, bool strike_out) platform_spec::font_ptr_t platform_spec::make_native_font(const char* name, unsigned height, unsigned weight, bool italic, bool underline, bool strike_out)
{ {
font_ptr_t ref; font_ptr_t ref;
#if defined(NANA_UNICODE) #if 1 //Xft
if(0 == name || *name == 0) if(0 == name || *name == 0)
name = STR("*"); name = STR("*");

View File

@ -207,7 +207,7 @@ namespace detail
#endif #endif
#endif #endif
::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof metrics, &metrics, 0); ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof metrics, &metrics, 0);
def_font_ptr_ = make_native_font(metrics.lfMessageFont.lfFaceName, font_size_to_height(9), 400, false, false, false); def_font_ptr_ = make_native_font(utf8_cast(metrics.lfMessageFont.lfFaceName).c_str(), font_size_to_height(9), 400, false, false, false);
} }
const platform_spec::font_ptr_t& platform_spec::default_native_font() const const platform_spec::font_ptr_t& platform_spec::default_native_font() const
@ -238,12 +238,15 @@ namespace detail
return height; return height;
} }
platform_spec::font_ptr_t platform_spec::make_native_font(const nana::char_t* name, unsigned height, unsigned weight, bool italic, bool underline, bool strike_out) platform_spec::font_ptr_t platform_spec::make_native_font(const char* name, unsigned height, unsigned weight, bool italic, bool underline, bool strike_out)
{ {
::LOGFONT logfont; ::LOGFONT logfont;
memset(&logfont, 0, sizeof logfont); memset(&logfont, 0, sizeof logfont);
strcpy(logfont.lfFaceName, (name && *name ? name : def_font_ptr_->name.c_str())); if (name && *name)
strcpy(logfont.lfFaceName, utf8_cast(name).c_str());
else
strcpy(logfont.lfFaceName, def_font_ptr_->name.c_str());
logfont.lfCharSet = DEFAULT_CHARSET; logfont.lfCharSet = DEFAULT_CHARSET;
HDC hdc = ::GetDC(0); HDC hdc = ::GetDC(0);

View File

@ -259,7 +259,7 @@ namespace nana
return fp->bold; return fp->bold;
} }
const nana::string& _m_fontname(nana::widgets::skeletons::fblock* fp) const std::string& _m_fontname(nana::widgets::skeletons::fblock* fp)
{ {
while(fp->font.empty()) while(fp->font.empty())
{ {
@ -274,13 +274,13 @@ namespace nana
{ {
if(fp != fblock_) if(fp != fblock_)
{ {
const nana::string& name = _m_fontname(fp); auto& name = _m_fontname(fp);
auto fontsize = static_cast<unsigned>(_m_font_size(fp)); auto fontsize = static_cast<unsigned>(_m_font_size(fp));
bool bold = _m_bold(fp); bool bold = _m_bold(fp);
if((fontsize != font_.size()) || bold != font_.bold() || name != font_.name()) if((fontsize != font_.size()) || bold != font_.bold() || name != font_.name())
{ {
font_.make(name.data(), fontsize, bold); font_.make(name, fontsize, bold);
graph.typeface(font_); graph.typeface(font_);
} }
fblock_ = fp; fblock_ = fp;
@ -606,7 +606,7 @@ namespace nana
::nana::paint::font font_; ::nana::paint::font font_;
struct def_font_tag struct def_font_tag
{ {
::nana::string font_name; ::std::string font_name;
std::size_t font_size; std::size_t font_size;
bool font_bold; bool font_bold;
::nana::color fgcolor; ::nana::color fgcolor;

View File

@ -79,7 +79,7 @@ namespace paint
impl_->font_ptr = rhs.impl_->font_ptr; impl_->font_ptr = rhs.impl_->font_ptr;
} }
font::font(const nana::char_t* name, unsigned size, bool bold, bool italic, bool underline, bool strike_out) font::font(const std::string& name, unsigned size, bool bold, bool italic, bool underline, bool strike_out)
: impl_(new impl_type) : impl_(new impl_type)
{ {
make(name, size, bold, italic, underline, strike_out); make(name, size, bold, italic, underline, strike_out);
@ -95,17 +95,17 @@ namespace paint
return ((nullptr == impl_) || (nullptr == impl_->font_ptr)); return ((nullptr == impl_) || (nullptr == impl_->font_ptr));
} }
void font::make(const nana::char_t* name, unsigned size, bool bold, bool italic, bool underline, bool strike_out) void font::make(const std::string& name, unsigned size, bool bold, bool italic, bool underline, bool strike_out)
{ {
size = nana::detail::platform_spec::instance().font_size_to_height(size); size = nana::detail::platform_spec::instance().font_size_to_height(size);
make_raw(name, size, bold ? 700 : 400, italic, underline, strike_out); make_raw(name, size, bold ? 700 : 400, italic, underline, strike_out);
} }
void font::make_raw(const nana::char_t*name, unsigned height, unsigned weight, bool italic, bool underline, bool strike_out) void font::make_raw(const std::string& name, unsigned height, unsigned weight, bool italic, bool underline, bool strike_out)
{ {
if(impl_) if(impl_)
{ {
auto t = nana::detail::platform_spec::instance().make_native_font(name, height, weight, italic, underline, strike_out); auto t = nana::detail::platform_spec::instance().make_native_font(name.c_str(), height, weight, italic, underline, strike_out);
if(t) if(t)
impl_->font_ptr = t; impl_->font_ptr = t;
} }
@ -119,10 +119,11 @@ namespace paint
nana::detail::platform_spec::instance().default_native_font(impl_->font_ptr); nana::detail::platform_spec::instance().default_native_font(impl_->font_ptr);
} }
nana::string font::name() const std::string font::name() const
{ {
if(empty()) return nana::string(); if(empty()) return std::string();
return impl_->font_ptr->name;
return to_utf8(impl_->font_ptr->name);
} }
unsigned font::size() const unsigned font::size() const