Merge branch 'hotfix-1.5.6' into feature-listbox

This commit is contained in:
Jinhao 2018-01-07 04:20:52 +08:00
commit 196d0bf351
10 changed files with 75 additions and 25 deletions

View File

@ -35,6 +35,9 @@ matrix:
- libx11-dev - libx11-dev
- libxft-dev - libxft-dev
- libboost-filesystem-dev - libboost-filesystem-dev
- libboost-system-dev
- libboost-thread-dev
- libboost-chrono-dev
sources: sources:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test

View File

@ -5,7 +5,8 @@
# Robert Hauck - Enable support for PNG/Freetype # Robert Hauck - Enable support for PNG/Freetype
# Qiangqiang Wu - Add biicode support # Qiangqiang Wu - Add biicode support
# Ariel Vina-Rodriguez (qPCR4vir) # Ariel Vina-Rodriguez (qPCR4vir)
# Frostbane - Add option for compiling a shared library # Pavel O. - fix compilation with boost::filesystem (#281)
# Frostbane - Add option for compiling a shared library (#263,#265)
# #
# Nana uses some build systems: MS-VS solution, MAKE, bakefile, codeblock, etc. manually optimized. # Nana uses some build systems: MS-VS solution, MAKE, bakefile, codeblock, etc. manually optimized.
# In the future CMake could be the prefered, and maybe will be used to generate the others and the central nana repo # In the future CMake could be the prefered, and maybe will be used to generate the others and the central nana repo
@ -245,7 +246,7 @@ elseif (NANA_CMAKE_STD_FILESYSTEM_FORCE)
add_definitions(-DSTD_FILESYSTEM_FORCE) add_definitions(-DSTD_FILESYSTEM_FORCE)
elseif (NANA_CMAKE_FIND_BOOST_FILESYSTEM OR NANA_CMAKE_BOOST_FILESYSTEM_FORCE) elseif (NANA_CMAKE_FIND_BOOST_FILESYSTEM OR NANA_CMAKE_BOOST_FILESYSTEM_FORCE)
if (NANA_CMAKE_BOOST_FILESYSTEM_FORCE) if (NANA_CMAKE_BOOST_FILESYSTEM_FORCE)
add_definitions(-DNANA_BOOST_FILESYSTEM_FORCE) add_definitions(-DBOOST_FILESYSTEM_FORCE)
endif(NANA_CMAKE_BOOST_FILESYSTEM_FORCE) endif(NANA_CMAKE_BOOST_FILESYSTEM_FORCE)
# https://cmake.org/cmake/help/git-master/module/FindBoost.html # https://cmake.org/cmake/help/git-master/module/FindBoost.html
# Implicit dependencies such as Boost::filesystem requiring Boost::system will be automatically detected and satisfied, # Implicit dependencies such as Boost::filesystem requiring Boost::system will be automatically detected and satisfied,
@ -253,7 +254,7 @@ elseif (NANA_CMAKE_FIND_BOOST_FILESYSTEM OR NANA_CMAKE_BOOST_FILESYSTEM_FORCE)
# If using Boost::thread, then Thread::Thread will also be added automatically. # If using Boost::thread, then Thread::Thread will also be added automatically.
find_package(Boost COMPONENTS filesystem) find_package(Boost COMPONENTS filesystem)
if (Boost_FOUND) if (Boost_FOUND)
add_definitions(-DNANA_BOOST_FILESYSTEM_AVAILABLE) add_definitions(-DBOOST_FILESYSTEM_AVAILABLE)
include_directories(SYSTEM "${Boost_INCLUDE_DIR}") include_directories(SYSTEM "${Boost_INCLUDE_DIR}")
list(APPEND NANA_LINKS ${Boost_LIBRARIES}) ###### FIRST !!!!!!!!!!!!!!!!! add is not first list(APPEND NANA_LINKS ${Boost_LIBRARIES}) ###### FIRST !!!!!!!!!!!!!!!!! add is not first
endif (Boost_FOUND) endif (Boost_FOUND)

View File

@ -53,6 +53,7 @@
#undef NANA_USING_BOOST_FILESYSTEM #undef NANA_USING_BOOST_FILESYSTEM
#define NANA_USING_BOOST_FILESYSTEM 1 #define NANA_USING_BOOST_FILESYSTEM 1
# include <chrono>
# include <boost/filesystem.hpp> # include <boost/filesystem.hpp>
// add boost::filesystem into std::experimental::filesystem // add boost::filesystem into std::experimental::filesystem
@ -60,6 +61,20 @@ namespace std {
namespace experimental { namespace experimental {
namespace filesystem { namespace filesystem {
using namespace boost::filesystem; using namespace boost::filesystem;
using file_time_type = std::chrono::time_point<std::chrono::system_clock>;
enum class file_type {
none = boost::filesystem::file_type::status_unknown,
not_found = boost::filesystem::file_type::file_not_found,
regular = boost::filesystem::file_type::regular_file,
directory = boost::filesystem::file_type::directory_file,
symlink = boost::filesystem::file_type::symlink_file,
block = boost::filesystem::file_type::block_file,
character = boost::filesystem::file_type::character_file,
fifo = boost::filesystem::file_type::fifo_file,
socket = boost::filesystem::file_type::socket_file,
unknown = boost::filesystem::file_type::type_unknown,
};
} // filesystem } // filesystem
} // experimental } // experimental
} // std } // std

View File

@ -12,6 +12,9 @@
* @brief Implement the lack support of standard library. * @brief Implement the lack support of standard library.
*/ */
#ifndef NANA_STDCXX_INCLUDED
#define NANA_STDCXX_INCLUDED
#include "c++defines.hpp" #include "c++defines.hpp"
//Implement workarounds for GCC/MinGW which version is below 4.8.2 //Implement workarounds for GCC/MinGW which version is below 4.8.2
@ -154,3 +157,5 @@ namespace std
} }
} }
#endif #endif
#endif // NANA_STDCXX_INCLUDED

View File

@ -14,7 +14,13 @@
#include <nana/filesystem/filesystem_ext.hpp> #include <nana/filesystem/filesystem_ext.hpp>
#include <vector> #include <vector>
#include <sstream> #include <sstream>
#include <iomanip> //put_time
#include <nana/config.hpp>
#ifdef _enable_std_put_time
#include <nana/stdc++.hpp>
#else
#include <iomanip>
#endif
#if defined(NANA_WINDOWS) #if defined(NANA_WINDOWS)
#include <windows.h> #include <windows.h>
@ -97,7 +103,13 @@ namespace nana
std::string pretty_file_date(const fs::path& path) // todo: move to .cpp std::string pretty_file_date(const fs::path& path) // todo: move to .cpp
{ {
try { try {
#if NANA_USING_BOOST_FILESYSTEM
// The return type of boost::filesystem::last_write_time isn't
// the same as in nana and std implementations of this function
auto ftime = std::chrono::system_clock::from_time_t(fs::last_write_time(path));
#else
auto ftime = fs::last_write_time(path); auto ftime = fs::last_write_time(path);
#endif
// crash: VS2015 will not read the time for some files (for example: C:/hiberfil.sys) // crash: VS2015 will not read the time for some files (for example: C:/hiberfil.sys)
// and will return file_time_type(-1) without throwing // and will return file_time_type(-1) without throwing

View File

@ -1,7 +1,7 @@
/* /*
* Window Layout Implementation * Window Layout Implementation
* Nana C++ Library(http://www.nanapro.org) * Nana C++ Library(http://www.nanapro.org)
* Copyright(C) 2003-2017 Jinhao(cnjinhao@hotmail.com) * Copyright(C) 2003-2018 Jinhao(cnjinhao@hotmail.com)
* *
* Distributed under the Boost Software License, Version 1.0. * Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at * (See accompanying file LICENSE_1_0.txt or copy at
@ -386,6 +386,13 @@ namespace nana
nana::rectangle r_of_sigwd(sigwd->pos_root, sigwd->dimension); nana::rectangle r_of_sigwd(sigwd->pos_root, sigwd->dimension);
for (auto wd : data_sect.effects_bground_windows) for (auto wd : data_sect.effects_bground_windows)
{ {
//Don't notify the window if both native root windows are not same(e.g. wd and sigwd have
//a some parent). Otherwise, _m_paint_glass_window() recursively paints sigwd to make stack overflow.
//On the other hand, a nested root window is always floating on its parent's child widgets, it's unnecessary to
//notify the wd if they haven't a same native root window.
if (sigwd->root != wd->root)
continue;
if (wd == sigwd || !wd->displayed() || if (wd == sigwd || !wd->displayed() ||
(false == overlapped(nana::rectangle{ wd->pos_root, wd->dimension }, r_of_sigwd))) (false == overlapped(nana::rectangle{ wd->pos_root, wd->dimension }, r_of_sigwd)))
continue; continue;

View File

@ -505,21 +505,18 @@ namespace nana
auto fpath = i->path().native(); auto fpath = i->path().native();
auto fattr = fs::status(fpath); auto fattr = fs::status(fpath);
auto ftype = static_cast<fs::file_type>(fattr.type());
item_fs m; item_fs m;
m.name = name; m.name = name;
m.directory = fs::is_directory(fattr); m.directory = fs::is_directory(fattr);
switch(fattr.type()) if (ftype == fs::file_type::not_found ||
{ ftype == fs::file_type::unknown ||
case fs::file_type::not_found: ftype == fs::file_type::directory)
case fs::file_type::unknown:
case fs::file_type::directory:
m.bytes = 0; m.bytes = 0;
break; else
default:
m.bytes = fs::file_size(fpath); m.bytes = fs::file_size(fpath);
}
fs_ext::modified_file_time(fpath, m.modified_time); fs_ext::modified_file_time(fpath, m.modified_time);
@ -692,13 +689,12 @@ namespace nana
return; return;
} }
using file_type = fs::file_type;
fs::path fspath(fb_.addr_.filesystem + path); fs::path fspath(fb_.addr_.filesystem + path);
auto fst = fs::status(fspath); auto fattr = fs::status(fspath);
auto ftype = static_cast<fs::file_type>(fattr.type());
if(fst.type() != file_type::not_found && fst.type() != file_type::none) if(ftype != fs::file_type::not_found && ftype != fs::file_type::none)
{ {
mb<<i18n("NANA_FILEBOX_ERROR_RENAME_FOLDER_BECAUSE_OF_EXISTING"); mb<<i18n("NANA_FILEBOX_ERROR_RENAME_FOLDER_BECAUSE_OF_EXISTING");
mb(); mb();
@ -800,6 +796,7 @@ namespace nana
tar = addr_.filesystem + file; tar = addr_.filesystem + file;
auto fattr = fs::status(tar); auto fattr = fs::status(tar);
auto ftype = static_cast<fs::file_type>(fattr.type());
//Check if the selected name is a directory //Check if the selected name is a directory
auto is_dir = fs::is_directory(fattr); auto is_dir = fs::is_directory(fattr);
@ -808,6 +805,7 @@ namespace nana
{ {
//Add the extension, then check if it is a directory again. //Add the extension, then check if it is a directory again.
fattr = fs::status(tar); fattr = fs::status(tar);
ftype = static_cast<fs::file_type>(fattr.type());
is_dir = fs::is_directory(fattr); is_dir = fs::is_directory(fattr);
} }
@ -820,7 +818,7 @@ namespace nana
if(io_read_) if(io_read_)
{ {
if(fs::file_type::not_found == fattr.type()) if(fs::file_type::not_found == ftype)
{ {
msgbox mb(*this, caption()); msgbox mb(*this, caption());
mb.icon(msgbox::icon_information); mb.icon(msgbox::icon_information);
@ -832,7 +830,7 @@ namespace nana
} }
else else
{ {
if(fs::file_type::not_found != fattr.type()) if(fs::file_type::not_found != ftype)
{ {
msgbox mb(*this, caption(), msgbox::yes_no); msgbox mb(*this, caption(), msgbox::yes_no);
mb.icon(msgbox::icon_question); mb.icon(msgbox::icon_question);

View File

@ -4735,12 +4735,12 @@ namespace nana
bool item_proxy::operator==(const std::string& s) const bool item_proxy::operator==(const std::string& s) const
{ {
return (text(pos_.item) == s); return (text(0) == s);
} }
bool item_proxy::operator==(const std::wstring& s) const bool item_proxy::operator==(const std::wstring& s) const
{ {
return (text(pos_.item) == to_utf8(s)); return (text(0) == to_utf8(s));
} }
item_proxy & item_proxy::operator=(const item_proxy& rhs) item_proxy & item_proxy::operator=(const item_proxy& rhs)

View File

@ -1,6 +1,6 @@
/* /*
* A Progress Indicator Implementation * A Progress Indicator Implementation
* Copyright(C) 2003-2017 Jinhao(cnjinhao@hotmail.com) * Copyright(C) 2003-2018 Jinhao(cnjinhao@hotmail.com)
* *
* Distributed under the Boost Software License, Version 1.0. * Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at * (See accompanying file LICENSE_1_0.txt or copy at
@ -96,7 +96,11 @@ namespace nana
{ {
if (widget_) if (widget_)
{ {
auto value_px = (widget_->size().width - border_px * 2) * value_ / max_; auto value_px = (widget_->size().width - border_px * 2);
//avoid overflow
if (value_ < max_)
value_px = static_cast<unsigned>(value_px * (double(value_) / double(max_)));
if (value_px != value_px_) if (value_px != value_px_)
{ {

View File

@ -15,7 +15,12 @@
#include <nana/gui/detail/bedrock.hpp> #include <nana/gui/detail/bedrock.hpp>
#include <nana/std_thread.hpp> #include <nana/std_thread.hpp>
#include <iostream> #include <iostream>
#ifdef STD_THREAD_NOT_SUPPORTED
# include <boost/chrono.hpp>
#else
# include <chrono> # include <chrono>
#endif
//#define NANA_AUTOMATIC_GUI_TESTING //#define NANA_AUTOMATIC_GUI_TESTING
namespace nana namespace nana