Merge branch 'develop'
This commit is contained in:
commit
a653a7a3fa
1
.gitignore
vendored
1
.gitignore
vendored
@ -39,6 +39,7 @@ lib/
|
|||||||
*.ninja*
|
*.ninja*
|
||||||
CMakeCache.txt
|
CMakeCache.txt
|
||||||
CMakeFiles/
|
CMakeFiles/
|
||||||
|
cmake-build-debug/
|
||||||
.idea/
|
.idea/
|
||||||
cmake_install.cmake
|
cmake_install.cmake
|
||||||
*.DS_Store
|
*.DS_Store
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
@ -56,7 +59,7 @@ matrix:
|
|||||||
- llvm-toolchain-precise
|
- llvm-toolchain-precise
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
- git clone --depth=1 --branch=develop https://github.com/qPCR4vir/nana-demo.git ../nana-demo
|
- git clone --depth=1 --branch=hotfix-1.5 https://github.com/qPCR4vir/nana-demo.git ../nana-demo
|
||||||
- export PATH="$HOME/bin:$PATH"
|
- export PATH="$HOME/bin:$PATH"
|
||||||
#- mkdir ~/bin #it seemd that a bin already exists from 20170901
|
#- mkdir ~/bin #it seemd that a bin already exists from 20170901
|
||||||
- wget --no-check-certificate --no-clobber -O /tmp/tools/cmake https://cmake.org/files/v3.4/cmake-3.4.0-rc3-Linux-x86_64.sh || true
|
- wget --no-check-certificate --no-clobber -O /tmp/tools/cmake https://cmake.org/files/v3.4/cmake-3.4.0-rc3-Linux-x86_64.sh || true
|
||||||
@ -84,7 +87,7 @@ script:
|
|||||||
# we are in "... nana/../nana_lib/bin/" we need "../../nana" to get the CMakeList.txt of nana.
|
# we are in "... nana/../nana_lib/bin/" we need "../../nana" to get the CMakeList.txt of nana.
|
||||||
# Thus, make install will put the nana.lib in "... nana/../nana_lib/lib/"
|
# Thus, make install will put the nana.lib in "... nana/../nana_lib/lib/"
|
||||||
# and the includes in "... nana/../nana_lib/include/"
|
# and the includes in "... nana/../nana_lib/include/"
|
||||||
- cmake -G"Unix Makefiles" ../../nana -DCMAKE_INSTALL_PREFIX=.. -DNANA_CMAKE_ENABLE_JPEG=ON -DNANA_CMAKE_ENABLE_PNG=OFF -DNANA_CMAKE_BUILD_DEMOS=ON -DNANA_CMAKE_ENABLE_AUDIO=OFF -DNANA_CMAKE_FIND_BOOST_FILESYSTEM=ON -DNANA_CMAKE_BOOST_FILESYSTEM_FORCE=OFF -DNANA_CMAKE_AUTOMATIC_GUI_TESTING=ON
|
- cmake -G"Unix Makefiles" ../../nana -DCMAKE_INSTALL_PREFIX=.. -DNANA_CMAKE_ENABLE_JPEG=ON -DNANA_CMAKE_ENABLE_PNG=OFF -DNANA_CMAKE_ENABLE_AUDIO=OFF -DNANA_CMAKE_FIND_BOOST_FILESYSTEM=ON -DNANA_CMAKE_BOOST_FILESYSTEM_FORCE=OFF -DNANA_CMAKE_AUTOMATIC_GUI_TESTING=ON
|
||||||
- make install
|
- make install
|
||||||
- ls
|
- ls
|
||||||
- cd ..
|
- cd ..
|
||||||
|
|||||||
119
CMakeLists.txt
119
CMakeLists.txt
@ -5,6 +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)
|
||||||
|
# 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
|
||||||
@ -30,9 +32,11 @@ option(NANA_CMAKE_LIBPNG_FROM_OS "Use libpng from operating system." ON)
|
|||||||
option(NANA_CMAKE_ENABLE_JPEG "Enable the use of JPEG" OFF)
|
option(NANA_CMAKE_ENABLE_JPEG "Enable the use of JPEG" OFF)
|
||||||
option(NANA_CMAKE_LIBJPEG_FROM_OS "Use libjpeg from operating system." ON)
|
option(NANA_CMAKE_LIBJPEG_FROM_OS "Use libjpeg from operating system." ON)
|
||||||
option(NANA_CMAKE_ENABLE_AUDIO "Enable class audio::play for PCM playback." OFF)
|
option(NANA_CMAKE_ENABLE_AUDIO "Enable class audio::play for PCM playback." OFF)
|
||||||
|
option(NANA_CMAKE_SHARED_LIB "Compile nana as a shared library." OFF)
|
||||||
option(NANA_CMAKE_VERBOSE_PREPROCESSOR "Show annoying debug messages during compilation." ON)
|
option(NANA_CMAKE_VERBOSE_PREPROCESSOR "Show annoying debug messages during compilation." ON)
|
||||||
option(NANA_CMAKE_STOP_VERBOSE_PREPROCESSOR "Stop compilation after showing the annoying debug messages." OFF)
|
option(NANA_CMAKE_STOP_VERBOSE_PREPROCESSOR "Stop compilation after showing the annoying debug messages." OFF)
|
||||||
option(NANA_CMAKE_AUTOMATIC_GUI_TESTING "Activate automatic GUI testing?" OFF)
|
option(NANA_CMAKE_AUTOMATIC_GUI_TESTING "Activate automatic GUI testing?" OFF)
|
||||||
|
option(NANA_CLION "Activate some CLion specific workarounds" OFF)
|
||||||
|
|
||||||
# The ISO C++ File System Technical Specification (ISO-TS, or STD) is optional.
|
# The ISO C++ File System Technical Specification (ISO-TS, or STD) is optional.
|
||||||
# http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4100.pdf
|
# http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4100.pdf
|
||||||
@ -62,11 +66,12 @@ if(POLICY CMP0004) # ignore leading space
|
|||||||
cmake_policy(SET CMP0004 OLD)
|
cmake_policy(SET CMP0004 OLD)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
set(CMAKE_DEBUG_POSTFIX "_d")
|
||||||
|
|
||||||
########### OS
|
########### OS
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
add_definitions(-DWIN32)
|
add_definitions(-DWIN32)
|
||||||
set(CMAKE_DEBUG_POSTFIX "_d")
|
|
||||||
#Global MSVC definitions. You may prefer the hand-tuned sln and projects from the nana repository.
|
#Global MSVC definitions. You may prefer the hand-tuned sln and projects from the nana repository.
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
option(MSVC_USE_MP "Set to ON to build nana with the /MP option (Visual Studio 2005 and above)." ON)
|
option(MSVC_USE_MP "Set to ON to build nana with the /MP option (Visual Studio 2005 and above)." ON)
|
||||||
@ -96,8 +101,24 @@ if(WIN32)
|
|||||||
add_definitions(-DNANA_ENABLE_MINGW_STD_THREADS_WITH_MEGANZ)
|
add_definitions(-DNANA_ENABLE_MINGW_STD_THREADS_WITH_MEGANZ)
|
||||||
endif(NANA_CMAKE_ENABLE_MINGW_STD_THREADS_WITH_MEGANZ)
|
endif(NANA_CMAKE_ENABLE_MINGW_STD_THREADS_WITH_MEGANZ)
|
||||||
endif(MINGW)
|
endif(MINGW)
|
||||||
|
|
||||||
|
if (MSVC)
|
||||||
|
set (DLLTOOL OFF)
|
||||||
|
else ()
|
||||||
|
# mingw: If dlltool is found the def and lib file will be created
|
||||||
|
message (STATUS "Detecting dlltool")
|
||||||
|
find_program (DLLTOOL dlltool)
|
||||||
|
if (DLLTOOL)
|
||||||
|
message (STATUS "Found dlltool: ${DLLTOOL}")
|
||||||
|
else ()
|
||||||
|
message (WARNING "dlltool not found. Skipping import library generation.")
|
||||||
|
endif (DLLTOOL)
|
||||||
|
endif (MSVC)
|
||||||
|
|
||||||
endif(WIN32)
|
endif(WIN32)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
add_definitions(-DAPPLE)
|
add_definitions(-DAPPLE)
|
||||||
include_directories(/opt/X11/include/)
|
include_directories(/opt/X11/include/)
|
||||||
@ -121,10 +142,15 @@ endif(UNIX)
|
|||||||
########### Compilers
|
########### Compilers
|
||||||
#
|
#
|
||||||
# Using gcc: gcc 4.8 don't support C++14 and make_unique. You may want to update at least to 4.9.
|
# Using gcc: gcc 4.8 don't support C++14 and make_unique. You may want to update at least to 4.9.
|
||||||
# In Windows, the gcc which come with CLion was 4.8 from MinGW. You may want to install MinGW-w64 from the
|
|
||||||
# TDM-GCC Compiler Suite for Windows which will update you to gcc 5.1.
|
|
||||||
# gcc 5.3 and 5.4 include filesytem, but you need to add the link flag: -lstdc++fs
|
# gcc 5.3 and 5.4 include filesytem, but you need to add the link flag: -lstdc++fs
|
||||||
#
|
#
|
||||||
|
# In Windows, the gcc which come with CLion was 4.8 from MinGW.
|
||||||
|
# CLion was updated to MinGW with gcc 6.3 ? Allways check this in File/Settings.../toolchains
|
||||||
|
# You could install MinGW-w64 from the TDM-GCC Compiler Suite for Windows which will update you to gcc 5.1.
|
||||||
|
# It is posible to follow https://computingabdn.com/softech/mingw-howto-install-gcc-for-windows/
|
||||||
|
# and install MinGW with gcc 7.1 with has STD_THREADS and fs, from: https://sourceforge.net/projects/mingw-w64/files/
|
||||||
|
#
|
||||||
|
#
|
||||||
# see at end of: https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dynamic_or_shared.html
|
# see at end of: https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dynamic_or_shared.html
|
||||||
if(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") # Clang || GNU
|
if(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") # Clang || GNU
|
||||||
|
|
||||||
@ -140,14 +166,21 @@ endif(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
|
|||||||
|
|
||||||
# enable static linkage # GNU || CLang not MinGW
|
# enable static linkage # GNU || CLang not MinGW
|
||||||
if(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") # AND NOT MINGW
|
if(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") # AND NOT MINGW
|
||||||
# set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -pthread")
|
|
||||||
list(APPEND NANA_LINKS -static-libgcc -static-libstdc++ -pthread)
|
if(NANA_CMAKE_SHARED_LIB)
|
||||||
|
list(APPEND NANA_LINKS -lgcc -lstdc++ -pthread)
|
||||||
|
else()
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -pthread")
|
||||||
# message("Setting NANA_LINKS to -static-libgcc -static-libstdc++ -pthread or ${NANA_LINKS}")
|
# message("Setting NANA_LINKS to -static-libgcc -static-libstdc++ -pthread or ${NANA_LINKS}")
|
||||||
|
endif(NANA_CMAKE_SHARED_LIB)
|
||||||
|
|
||||||
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.3)
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.3)
|
||||||
# IS_GNUCXX < 5.3
|
# IS_GNUCXX < 5.3
|
||||||
else(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.3)
|
else(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.3)
|
||||||
|
|
||||||
# set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lstdc++fs") # IS_GNUCXX 5.3 or more
|
# set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lstdc++fs") # IS_GNUCXX 5.3 or more
|
||||||
list(APPEND NANA_LINKS -lstdc++fs)
|
list(APPEND NANA_LINKS -lstdc++fs)
|
||||||
|
|
||||||
endif(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.3)
|
endif(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.3)
|
||||||
|
|
||||||
endif(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") # AND NOT MINGW
|
endif(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") # AND NOT MINGW
|
||||||
@ -163,14 +196,16 @@ endif ()
|
|||||||
|
|
||||||
# Find PNG
|
# Find PNG
|
||||||
if(NANA_CMAKE_ENABLE_PNG)
|
if(NANA_CMAKE_ENABLE_PNG)
|
||||||
add_definitions(-DNANA_ENABLE_PNG)
|
|
||||||
if(NANA_CMAKE_LIBPNG_FROM_OS)
|
if(NANA_CMAKE_LIBPNG_FROM_OS)
|
||||||
find_package(PNG)
|
find_package(PNG)
|
||||||
if (PNG_FOUND)
|
if (PNG_FOUND)
|
||||||
include_directories( ${PNG_INCLUDE_DIRS})
|
include_directories( ${PNG_INCLUDE_DIRS})
|
||||||
list(APPEND NANA_LINKS ${PNG_LIBRARIES})
|
list(APPEND NANA_LINKS ${PNG_LIBRARIES})
|
||||||
add_definitions(-DUSE_LIBPNG_FROM_OS)
|
add_definitions("-DNANA_ENABLE_PNG"
|
||||||
|
"-DUSE_LIBPNG_FROM_OS")
|
||||||
endif(PNG_FOUND)
|
endif(PNG_FOUND)
|
||||||
|
else()
|
||||||
|
add_definitions(-DNANA_ENABLE_PNG)
|
||||||
endif(NANA_CMAKE_LIBPNG_FROM_OS)
|
endif(NANA_CMAKE_LIBPNG_FROM_OS)
|
||||||
endif(NANA_CMAKE_ENABLE_PNG)
|
endif(NANA_CMAKE_ENABLE_PNG)
|
||||||
|
|
||||||
@ -182,8 +217,11 @@ if(NANA_CMAKE_ENABLE_JPEG)
|
|||||||
if (JPEG_FOUND)
|
if (JPEG_FOUND)
|
||||||
include_directories( ${JPEG_INCLUDE_DIR})
|
include_directories( ${JPEG_INCLUDE_DIR})
|
||||||
list(APPEND NANA_LINKS ${JPEG_LIBRARY})
|
list(APPEND NANA_LINKS ${JPEG_LIBRARY})
|
||||||
add_definitions(-DUSE_LIBJPEG_FROM_OS)
|
add_definitions("-DNANA_ENABLE_JPEG"
|
||||||
|
"-DUSE_LIBJPEG_FROM_OS")
|
||||||
endif(JPEG_FOUND)
|
endif(JPEG_FOUND)
|
||||||
|
else()
|
||||||
|
add_definitions(-DNANA_ENABLE_JPEG)
|
||||||
endif(NANA_CMAKE_LIBJPEG_FROM_OS)
|
endif(NANA_CMAKE_LIBJPEG_FROM_OS)
|
||||||
endif(NANA_CMAKE_ENABLE_JPEG)
|
endif(NANA_CMAKE_ENABLE_JPEG)
|
||||||
|
|
||||||
@ -208,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,
|
||||||
@ -216,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)
|
||||||
@ -266,7 +304,16 @@ foreach(subdir ${NANA_SOURCE_SUBDIRS})
|
|||||||
# message("Subir: ${subdir}") # message("Files: ${sources}")
|
# message("Subir: ${subdir}") # message("Files: ${sources}")
|
||||||
endforeach(subdir ${NANA_SOURCE_SUBDIRS})
|
endforeach(subdir ${NANA_SOURCE_SUBDIRS})
|
||||||
|
|
||||||
add_library(${PROJECT_NAME} ${sources} )
|
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
|
||||||
|
add_definitions(-fmax-errors=3)
|
||||||
|
endif ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
|
||||||
|
|
||||||
|
if(NANA_CMAKE_SHARED_LIB)
|
||||||
|
add_library(${PROJECT_NAME} SHARED ${sources} )
|
||||||
|
else()
|
||||||
|
add_library(${PROJECT_NAME} STATIC ${sources} )
|
||||||
|
endif(NANA_CMAKE_SHARED_LIB)
|
||||||
|
|
||||||
target_include_directories(${PROJECT_NAME} PUBLIC ${NANA_INCLUDE_DIR})
|
target_include_directories(${PROJECT_NAME} PUBLIC ${NANA_INCLUDE_DIR})
|
||||||
target_link_libraries(${PROJECT_NAME} ${NANA_LINKS})
|
target_link_libraries(${PROJECT_NAME} ${NANA_LINKS})
|
||||||
|
|
||||||
@ -275,8 +322,50 @@ target_link_libraries(${PROJECT_NAME} ${NANA_LINKS})
|
|||||||
|
|
||||||
# Installing: the static "nana lib" will be in DESTDIR/CMAKE_INSTALL_PREFIX/lib/
|
# Installing: the static "nana lib" will be in DESTDIR/CMAKE_INSTALL_PREFIX/lib/
|
||||||
# and the includes files "include/nana/" in DESTDIR/CMAKE_INSTALL_PREFIX/include/nana/
|
# and the includes files "include/nana/" in DESTDIR/CMAKE_INSTALL_PREFIX/include/nana/
|
||||||
|
# unfortunatelly install() is still ignored by CLion:
|
||||||
|
# https://intellij-support.jetbrains.com/hc/en-us/community/posts/205822949-CMake-install-isn-t-supported-
|
||||||
install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION lib
|
install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION lib
|
||||||
LIBRARY DESTINATION lib)
|
LIBRARY DESTINATION lib
|
||||||
|
RUNTIME DESTINATION bin)
|
||||||
|
|
||||||
|
# http://stackoverflow.com/questions/33788729/how-do-i-get-clion-to-run-an-install-target
|
||||||
|
if(NANA_CLION) # the Clion IDE don't reconize the install target
|
||||||
|
add_custom_target(install_${PROJECT_NAME}
|
||||||
|
$(MAKE) install
|
||||||
|
DEPENDS ${PROJECT_NAME}
|
||||||
|
COMMENT "Installing ${PROJECT_NAME}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set_property( TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14 )
|
||||||
|
|
||||||
|
if (NANA_CMAKE_SHARED_LIB)
|
||||||
|
if (WIN32)
|
||||||
|
set (CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
|
||||||
|
|
||||||
|
if (DLLTOOL)
|
||||||
|
#message(STATUS "CMAKE_CURRENT_BINARY_DIR = ${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
|
|
||||||
|
#generate the lib and def files needed by msvc
|
||||||
|
set_target_properties (${PROJECT_NAME} PROPERTIES OUTPUT_NAME "${PROJECT_NAME}"
|
||||||
|
ARCHIVE_OUTPUT_NAME "${PROJECT_NAME}"
|
||||||
|
LINK_FLAGS "${CMAKE_SHARED_LINKER_FLAGS_INIT} -Wl,--output-def=${CMAKE_CURRENT_BINARY_DIR}/lib${PROJECT_NAME}.def")
|
||||||
|
|
||||||
|
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
|
||||||
|
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
|
COMMAND echo " Generating import library"
|
||||||
|
COMMAND "${DLLTOOL}" --dllname "lib${PROJECT_NAME}.dll"
|
||||||
|
--input-def "lib${PROJECT_NAME}.def"
|
||||||
|
--output-lib "lib${PROJECT_NAME}.lib")
|
||||||
|
|
||||||
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/lib${PROJECT_NAME}.def"
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}/lib${PROJECT_NAME}.lib" DESTINATION lib)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
endif (WIN32)
|
||||||
|
endif (NANA_CMAKE_SHARED_LIB)
|
||||||
|
|
||||||
|
message ("")
|
||||||
|
|
||||||
message("The compiled Nana library will be installed in ${CMAKE_INSTALL_PREFIX}/lib")
|
message("The compiled Nana library will be installed in ${CMAKE_INSTALL_PREFIX}/lib")
|
||||||
# Install the include directories too.
|
# Install the include directories too.
|
||||||
if(NANA_CMAKE_INSTALL_INCLUDES)
|
if(NANA_CMAKE_INSTALL_INCLUDES)
|
||||||
@ -284,9 +373,9 @@ if(NANA_CMAKE_INSTALL_INCLUDES)
|
|||||||
message("The Nana include files will be installed in ${CMAKE_INSTALL_PREFIX}/include")
|
message("The Nana include files will be installed in ${CMAKE_INSTALL_PREFIX}/include")
|
||||||
endif(NANA_CMAKE_INSTALL_INCLUDES)
|
endif(NANA_CMAKE_INSTALL_INCLUDES)
|
||||||
|
|
||||||
set_property( TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14 )
|
|
||||||
|
|
||||||
# Just for information:
|
# Just for information:
|
||||||
|
message ("")
|
||||||
message ( "CMAKE_CXX_COMPILER_ID = " ${CMAKE_CXX_COMPILER_ID})
|
message ( "CMAKE_CXX_COMPILER_ID = " ${CMAKE_CXX_COMPILER_ID})
|
||||||
message ( "COMPILER_IS_CLANG = " ${COMPILER_IS_CLANG})
|
message ( "COMPILER_IS_CLANG = " ${COMPILER_IS_CLANG})
|
||||||
message ( "CMAKE_COMPILER_IS_GNUCXX = " ${CMAKE_COMPILER_IS_GNUCXX})
|
message ( "CMAKE_COMPILER_IS_GNUCXX = " ${CMAKE_COMPILER_IS_GNUCXX})
|
||||||
@ -299,6 +388,10 @@ message ( "CMAKE_INSTALL_PREFIX = " ${CMAKE_INSTALL_PREFIX})
|
|||||||
message ( "NANA_INCLUDE_DIR = " ${NANA_INCLUDE_DIR})
|
message ( "NANA_INCLUDE_DIR = " ${NANA_INCLUDE_DIR})
|
||||||
message ( "CMAKE_CURRENT_SOURCE_DIR = " ${CMAKE_CURRENT_SOURCE_DIR})
|
message ( "CMAKE_CURRENT_SOURCE_DIR = " ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
message ( "NANA_CMAKE_ENABLE_AUDIO = " ${NANA_CMAKE_ENABLE_AUDIO})
|
message ( "NANA_CMAKE_ENABLE_AUDIO = " ${NANA_CMAKE_ENABLE_AUDIO})
|
||||||
|
message ( "NANA_CMAKE_SHARED_LIB = " ${NANA_CMAKE_SHARED_LIB})
|
||||||
|
message ( "NANA_CLION = " ${NANA_CLION})
|
||||||
|
message ( "CMAKE_MAKE_PROGRAM = " ${CMAKE_MAKE_PROGRAM})
|
||||||
|
|
||||||
message ( "NANA_CMAKE_FIND_BOOST_FILESYSTEM = " ${NANA_CMAKE_FIND_BOOST_FILESYSTEM})
|
message ( "NANA_CMAKE_FIND_BOOST_FILESYSTEM = " ${NANA_CMAKE_FIND_BOOST_FILESYSTEM})
|
||||||
message ( "NANA_CMAKE_BOOST_FILESYSTEM_FORCE = " ${NANA_CMAKE_BOOST_FILESYSTEM_FORCE})
|
message ( "NANA_CMAKE_BOOST_FILESYSTEM_FORCE = " ${NANA_CMAKE_BOOST_FILESYSTEM_FORCE})
|
||||||
message ( "NANA_CMAKE_BOOST_FILESYSTEM_INCLUDE_ROOT = " ${NANA_CMAKE_BOOST_FILESYSTEM_INCLUDE_ROOT})
|
message ( "NANA_CMAKE_BOOST_FILESYSTEM_INCLUDE_ROOT = " ${NANA_CMAKE_BOOST_FILESYSTEM_INCLUDE_ROOT})
|
||||||
|
|||||||
@ -50,6 +50,7 @@
|
|||||||
<Unit filename="../../source/datetime.cpp" />
|
<Unit filename="../../source/datetime.cpp" />
|
||||||
<Unit filename="../../source/deploy.cpp" />
|
<Unit filename="../../source/deploy.cpp" />
|
||||||
<Unit filename="../../source/detail/platform_abstraction.cpp" />
|
<Unit filename="../../source/detail/platform_abstraction.cpp" />
|
||||||
|
<Unit filename="../../source/detail/platform_spec_posix.cpp" />
|
||||||
<Unit filename="../../source/detail/platform_spec_windows.cpp" />
|
<Unit filename="../../source/detail/platform_spec_windows.cpp" />
|
||||||
<Unit filename="../../source/filesystem/filesystem.cpp" />
|
<Unit filename="../../source/filesystem/filesystem.cpp" />
|
||||||
<Unit filename="../../source/gui/animation.cpp" />
|
<Unit filename="../../source/gui/animation.cpp" />
|
||||||
|
|||||||
@ -252,6 +252,32 @@
|
|||||||
<ClCompile Include="..\..\source\threads\pool.cpp" />
|
<ClCompile Include="..\..\source\threads\pool.cpp" />
|
||||||
<ClCompile Include="..\..\source\unicode_bidi.cpp" />
|
<ClCompile Include="..\..\source\unicode_bidi.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\include\nana\any.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\basic_types.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\c++defines.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\charset.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\concepts.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\config.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\datetime.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\deploy.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\fwd.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\internationalization.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\key_type.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\optional.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\stdc++.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\std_condition_variable.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\std_mutex.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\std_thread.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\traits.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\unicode_bidi.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\verbose_preprocessor.hpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\..\include\nana\pop_ignore_diagnostic" />
|
||||||
|
<None Include="..\..\include\nana\push_ignore_diagnostic" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
|||||||
@ -292,4 +292,74 @@
|
|||||||
<Filter>Source Files\detail</Filter>
|
<Filter>Source Files\detail</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\include\nana\any.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\basic_types.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\c++defines.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\charset.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\concepts.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\config.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\datetime.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\deploy.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\fwd.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\internationalization.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\key_type.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\optional.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\std_condition_variable.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\std_mutex.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\std_thread.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\stdc++.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\traits.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\unicode_bidi.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\verbose_preprocessor.hpp">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\..\include\nana\pop_ignore_diagnostic">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</None>
|
||||||
|
<None Include="..\..\include\nana\push_ignore_diagnostic">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@ -101,6 +101,7 @@
|
|||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
@ -113,6 +114,7 @@
|
|||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
@ -127,6 +129,7 @@
|
|||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
@ -143,6 +146,7 @@
|
|||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
@ -232,6 +236,73 @@
|
|||||||
<ClCompile Include="..\..\source\threads\pool.cpp" />
|
<ClCompile Include="..\..\source\threads\pool.cpp" />
|
||||||
<ClCompile Include="..\..\source\unicode_bidi.cpp" />
|
<ClCompile Include="..\..\source\unicode_bidi.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\include\nana\any.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\basic_types.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\c++defines.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\charset.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\concepts.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\config.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\datetime.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\deploy.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\fwd.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\animation.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\basis.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\dragger.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\drawing.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\effects.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\element.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\filebox.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\layout_utility.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\msgbox.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\notifier.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\place.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\programming_interface.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\screen.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\state_cursor.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\timer.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\tooltip.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\button.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\categorize.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\checkbox.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\combox.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\date_chooser.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\float_listbox.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\form.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\frame.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\group.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\label.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\listbox.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\menu.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\menubar.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\panel.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\picture.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\progress.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\scroll.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\slider.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\spinbox.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\tabbar.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\textbox.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\toolbar.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\treebox.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\widget.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\wvl.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\internationalization.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\key_type.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\optional.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\stdc++.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\std_condition_variable.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\std_mutex.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\std_thread.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\traits.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\unicode_bidi.hpp" />
|
||||||
|
<ClInclude Include="..\..\include\nana\verbose_preprocessor.hpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\..\include\nana\pop_ignore_diagnostic" />
|
||||||
|
<None Include="..\..\include\nana\push_ignore_diagnostic" />
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
<ImportGroup Label="ExtensionTargets">
|
<ImportGroup Label="ExtensionTargets">
|
||||||
</ImportGroup>
|
</ImportGroup>
|
||||||
|
|||||||
@ -41,6 +41,15 @@
|
|||||||
<Filter Include="Sources\threads">
|
<Filter Include="Sources\threads">
|
||||||
<UniqueIdentifier>{c1cdf46a-519f-422a-947f-39e173045414}</UniqueIdentifier>
|
<UniqueIdentifier>{c1cdf46a-519f-422a-947f-39e173045414}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter Include="Include">
|
||||||
|
<UniqueIdentifier>{d68bd89c-170f-445f-b79f-aa03c881ab6b}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Include\gui">
|
||||||
|
<UniqueIdentifier>{a5d87649-2cd1-4a8f-a1f9-7151eaf6c772}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Include\gui\widgets">
|
||||||
|
<UniqueIdentifier>{0e6a58ab-652c-45d7-b9aa-8d9f2fa80ea1}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="..\..\source\any.cpp">
|
<ClCompile Include="..\..\source\any.cpp">
|
||||||
@ -284,4 +293,197 @@
|
|||||||
<Filter>Sources\gui</Filter>
|
<Filter>Sources\gui</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\spinbox.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\group.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\treebox.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\listbox.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\menu.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\menubar.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\progress.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\widget.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\textbox.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\toolbar.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\button.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\combox.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\label.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\panel.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\picture.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\tabbar.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\categorize.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\scroll.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\slider.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\checkbox.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\date_chooser.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\float_listbox.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\form.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\widgets\frame.hpp">
|
||||||
|
<Filter>Include\gui\widgets</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\animation.hpp">
|
||||||
|
<Filter>Include\gui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\basis.hpp">
|
||||||
|
<Filter>Include\gui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\dragger.hpp">
|
||||||
|
<Filter>Include\gui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\drawing.hpp">
|
||||||
|
<Filter>Include\gui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\effects.hpp">
|
||||||
|
<Filter>Include\gui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\element.hpp">
|
||||||
|
<Filter>Include\gui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\filebox.hpp">
|
||||||
|
<Filter>Include\gui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\layout_utility.hpp">
|
||||||
|
<Filter>Include\gui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\msgbox.hpp">
|
||||||
|
<Filter>Include\gui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\notifier.hpp">
|
||||||
|
<Filter>Include\gui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\place.hpp">
|
||||||
|
<Filter>Include\gui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\programming_interface.hpp">
|
||||||
|
<Filter>Include\gui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\screen.hpp">
|
||||||
|
<Filter>Include\gui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\state_cursor.hpp">
|
||||||
|
<Filter>Include\gui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\timer.hpp">
|
||||||
|
<Filter>Include\gui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\tooltip.hpp">
|
||||||
|
<Filter>Include\gui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui\wvl.hpp">
|
||||||
|
<Filter>Include\gui</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\any.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\basic_types.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\c++defines.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\charset.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\concepts.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\config.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\datetime.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\deploy.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\fwd.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\gui.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\internationalization.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\key_type.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\optional.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\std_condition_variable.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\std_mutex.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\std_thread.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\stdc++.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\traits.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\unicode_bidi.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\include\nana\verbose_preprocessor.hpp">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\..\include\nana\pop_ignore_diagnostic">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</None>
|
||||||
|
<None Include="..\..\include\nana\push_ignore_diagnostic">
|
||||||
|
<Filter>Include</Filter>
|
||||||
|
</None>
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@ -312,7 +312,14 @@ namespace nana
|
|||||||
/// @param lightness in range of [0, 1]
|
/// @param lightness in range of [0, 1]
|
||||||
color& from_hsl(double hue, double saturation, double lightness); ///< immutable alpha channel
|
color& from_hsl(double hue, double saturation, double lightness); ///< immutable alpha channel
|
||||||
|
|
||||||
color blend(const color& blending_color, double alpha) const;
|
/// Blends color
|
||||||
|
/**
|
||||||
|
* Returns a color which is blended as this * (1 - fade_rate) + blending_color * fade_rate
|
||||||
|
* @param blending_color Color to blend
|
||||||
|
* @param fade_rate Blending rate for blending_color
|
||||||
|
* @return a blended color
|
||||||
|
*/
|
||||||
|
color blend(const color& blending_color, double fade_rate) const;
|
||||||
|
|
||||||
/// Determines whether the color is completely transparent.
|
/// Determines whether the color is completely transparent.
|
||||||
bool invisible() const;
|
bool invisible() const;
|
||||||
|
|||||||
@ -173,6 +173,7 @@
|
|||||||
|
|
||||||
//Assume the std::thread is not implement on MinGW
|
//Assume the std::thread is not implement on MinGW
|
||||||
//But some toolchains may implement std::thread.
|
//But some toolchains may implement std::thread.
|
||||||
|
// it seems that MinGW 6.3 and 7.1 have std::thread
|
||||||
#ifdef NANA_MINGW
|
#ifdef NANA_MINGW
|
||||||
# ifndef STD_THREAD_NOT_SUPPORTED
|
# ifndef STD_THREAD_NOT_SUPPORTED
|
||||||
# define STD_THREAD_NOT_SUPPORTED
|
# define STD_THREAD_NOT_SUPPORTED
|
||||||
@ -220,6 +221,9 @@
|
|||||||
# if __has_include(<filesystem>)
|
# if __has_include(<filesystem>)
|
||||||
# undef STD_FILESYSTEM_NOT_SUPPORTED
|
# undef STD_FILESYSTEM_NOT_SUPPORTED
|
||||||
# endif
|
# endif
|
||||||
|
# if __has_include(<mutex>)
|
||||||
|
# undef STD_THREAD_NOT_SUPPORTED
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // NANA_CXX_DEFINES_INCLUDED
|
#endif // NANA_CXX_DEFINES_INCLUDED
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -91,6 +91,8 @@ namespace nana
|
|||||||
substitute = 0x1A, //Ctrl+Z
|
substitute = 0x1A, //Ctrl+Z
|
||||||
escape = 0x1B,
|
escape = 0x1B,
|
||||||
space = 0x20, //Space
|
space = 0x20, //Space
|
||||||
|
del = 0x7F, //Delete
|
||||||
|
os_del = del, //Deprecated
|
||||||
|
|
||||||
//The following names are intuitive name of ASCII control codes
|
//The following names are intuitive name of ASCII control codes
|
||||||
select_all = start_of_headline,
|
select_all = start_of_headline,
|
||||||
@ -106,7 +108,7 @@ namespace nana
|
|||||||
os_ctrl = 0x11,
|
os_ctrl = 0x11,
|
||||||
os_pageup = 0x21, os_pagedown,
|
os_pageup = 0x21, os_pagedown,
|
||||||
os_arrow_left = 0x25, os_arrow_up, os_arrow_right, os_arrow_down,
|
os_arrow_left = 0x25, os_arrow_up, os_arrow_right, os_arrow_down,
|
||||||
os_insert = 0x2D, os_del ,
|
os_insert = 0x2D,
|
||||||
os_end = 0x23, os_home //Pos 1
|
os_end = 0x23, os_home //Pos 1
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -271,6 +273,7 @@ that return a corresponding nana::appearance with predefined values.
|
|||||||
public:
|
public:
|
||||||
virtual ~caret_interface() = default;
|
virtual ~caret_interface() = default;
|
||||||
|
|
||||||
|
virtual bool activated() const = 0;
|
||||||
virtual void disable_throw() noexcept = 0;
|
virtual void disable_throw() noexcept = 0;
|
||||||
|
|
||||||
virtual void effective_range(const rectangle& range) = 0;
|
virtual void effective_range(const rectangle& range) = 0;
|
||||||
|
|||||||
@ -55,6 +55,7 @@ namespace detail
|
|||||||
void dimension(const size& s) override;
|
void dimension(const size& s) override;
|
||||||
void visible(bool visibility) override;
|
void visible(bool visibility) override;
|
||||||
bool visible() const override;
|
bool visible() const override;
|
||||||
|
bool activated() const override;
|
||||||
private:
|
private:
|
||||||
basic_window * owner_;
|
basic_window * owner_;
|
||||||
point position_;
|
point position_;
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Platform Implementation
|
* Platform Implementation
|
||||||
* Nana C++ Library(http://www.nanapro.org)
|
* Nana C++ Library(http://www.nanapro.org)
|
||||||
* Copyright(C) 2003-2016 Jinhao(cnjinhao@hotmail.com)
|
* Copyright(C) 2003-2017 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
|
||||||
@ -66,11 +66,11 @@ namespace detail
|
|||||||
|
|
||||||
static nana::point window_position(native_window_type);
|
static nana::point window_position(native_window_type);
|
||||||
static void move_window(native_window_type, int x, int y);
|
static void move_window(native_window_type, int x, int y);
|
||||||
static void move_window(native_window_type, const rectangle&);
|
static bool move_window(native_window_type, const rectangle&);
|
||||||
static void bring_top(native_window_type, bool activated);
|
static void bring_top(native_window_type, bool activated);
|
||||||
static void set_window_z_order(native_window_type, native_window_type wd_after, z_order_action action_if_no_wd_after);
|
static void set_window_z_order(native_window_type, native_window_type wd_after, z_order_action action_if_no_wd_after);
|
||||||
|
|
||||||
static void window_size(native_window_type, const size&);
|
static bool window_size(native_window_type, const size&);
|
||||||
static void get_window_rect(native_window_type, rectangle&);
|
static void get_window_rect(native_window_type, rectangle&);
|
||||||
static void window_caption(native_window_type, const native_string_type&);
|
static void window_caption(native_window_type, const native_string_type&);
|
||||||
static native_string_type window_caption(native_window_type);
|
static native_string_type window_caption(native_window_type);
|
||||||
|
|||||||
@ -40,7 +40,7 @@ namespace nana
|
|||||||
|
|
||||||
std::size_t max_items{ 10 }; // the number of items display.
|
std::size_t max_items{ 10 }; // the number of items display.
|
||||||
mutable std::size_t index{ ::nana::npos }; // the result of the selection.
|
mutable std::size_t index{ ::nana::npos }; // the result of the selection.
|
||||||
mutable bool have_selected;
|
mutable bool have_selected{ false };
|
||||||
};
|
};
|
||||||
|
|
||||||
class item_renderer
|
class item_renderer
|
||||||
|
|||||||
@ -36,7 +36,6 @@ namespace nana
|
|||||||
void attached(widget_reference, graph_reference) override;
|
void attached(widget_reference, graph_reference) override;
|
||||||
private:
|
private:
|
||||||
void refresh(graph_reference) override;
|
void refresh(graph_reference) override;
|
||||||
void _m_draw_background(unsigned,unsigned);
|
|
||||||
private:
|
private:
|
||||||
implement * const impl_;
|
implement * const impl_;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -61,6 +61,7 @@ namespace nana
|
|||||||
|
|
||||||
void focus(graph_reference, const arg_focus&) override;
|
void focus(graph_reference, const arg_focus&) override;
|
||||||
void mouse_wheel(graph_reference, const arg_wheel&) override;
|
void mouse_wheel(graph_reference, const arg_wheel&) override;
|
||||||
|
void dbl_click(graph_reference, const arg_mouse&) override;
|
||||||
void mouse_down(graph_reference, const arg_mouse&) override;
|
void mouse_down(graph_reference, const arg_mouse&) override;
|
||||||
void mouse_move(graph_reference, const arg_mouse&) override;
|
void mouse_move(graph_reference, const arg_mouse&) override;
|
||||||
void mouse_up(graph_reference, const arg_mouse& arg) override;
|
void mouse_up(graph_reference, const arg_mouse& arg) override;
|
||||||
|
|||||||
@ -185,7 +185,7 @@ namespace nana
|
|||||||
|
|
||||||
/// Appends an string. If `at_caret` is `true`, the string is inserted at the position of caret, otherwise, it is appended at end of the textbox.
|
/// Appends an string. If `at_caret` is `true`, the string is inserted at the position of caret, otherwise, it is appended at end of the textbox.
|
||||||
textbox& append(const std::string& text, bool at_caret);
|
textbox& append(const std::string& text, bool at_caret);
|
||||||
|
textbox& append(const std::wstring& text, bool at_caret);
|
||||||
/// Determines whether the text is line wrapped.
|
/// Determines whether the text is line wrapped.
|
||||||
bool line_wrapped() const;
|
bool line_wrapped() const;
|
||||||
textbox& line_wrapped(bool);
|
textbox& line_wrapped(bool);
|
||||||
|
|||||||
@ -4,10 +4,10 @@
|
|||||||
* Copyright(C) 2003-2017 Jinhao(cnjinhao@hotmail.com)
|
* Copyright(C) 2003-2017 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 or copy at
|
||||||
* http://www.boost.org/LICENSE_1_0.txt)
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
*
|
*
|
||||||
* @file: nana/gui/widgets/treebox.hpp
|
* @file nana/gui/widgets/treebox.hpp
|
||||||
* @brief
|
* @brief
|
||||||
* The treebox organizes the nodes by a key string.
|
* The treebox organizes the nodes by a key string.
|
||||||
* The treebox would have a vertical scrollbar if there are too many nodes
|
* The treebox would have a vertical scrollbar if there are too many nodes
|
||||||
@ -344,7 +344,7 @@ namespace nana
|
|||||||
}//end namespace drawerbase
|
}//end namespace drawerbase
|
||||||
|
|
||||||
/// \brief Displays a hierarchical list of items, such as the files and directories on a disk.
|
/// \brief Displays a hierarchical list of items, such as the files and directories on a disk.
|
||||||
/// See also in [documentation](http://nanapro.org/en-us/help/widgets/treebox.htm)
|
/// See also in [documentation](http://nanapro.org/en-us/documentation/widgets/treebox.htm)
|
||||||
class treebox
|
class treebox
|
||||||
:public widget_object < category::widget_tag, drawerbase::treebox::trigger, drawerbase::treebox::treebox_events>
|
:public widget_object < category::widget_tag, drawerbase::treebox::trigger, drawerbase::treebox::treebox_events>
|
||||||
{
|
{
|
||||||
@ -372,7 +372,7 @@ namespace nana
|
|||||||
/// \brief The construct that creates a widget.
|
/// \brief The construct that creates a widget.
|
||||||
/// @param wd A handle to the parent window of the widget being created.
|
/// @param wd A handle to the parent window of the widget being created.
|
||||||
/// @param r the size and position of the widget in its parent window coordinate.
|
/// @param r the size and position of the widget in its parent window coordinate.
|
||||||
/// @param visible specifying the visible after creating.
|
/// @param visible specifying if visible after creating.
|
||||||
treebox(window, const nana::rectangle& = rectangle(), bool visible = true);
|
treebox(window, const nana::rectangle& = rectangle(), bool visible = true);
|
||||||
|
|
||||||
template<typename ItemRenderer>
|
template<typename ItemRenderer>
|
||||||
@ -397,18 +397,18 @@ namespace nana
|
|||||||
///
|
///
|
||||||
/// The treebox automatically redraws after certain operations, but,
|
/// The treebox automatically redraws after certain operations, but,
|
||||||
/// under some circumstances, it is good to disable the automatic drawing mode,
|
/// under some circumstances, it is good to disable the automatic drawing mode,
|
||||||
/// for example, before adding nodes in a loop, disable the mode to avoiding
|
/// for example, before adding nodes in a loop, disable the mode avoiding
|
||||||
/// frequent and useless refresh for better performance, and then, after
|
/// frequent and useless refresh for better performance, and then, after
|
||||||
/// the operations, enable the automatic redraw mode again.
|
/// the operations, enable the automatic redraw mode again.
|
||||||
/// @param bool whether to enable.
|
/// @param enable bool whether to enable.
|
||||||
void auto_draw(bool);
|
void auto_draw(bool enable);
|
||||||
|
|
||||||
/// \brief Enable the checkboxs for each item of the widget.
|
/// \brief Enable the checkboxs for each item of the widget.
|
||||||
/// @param bool indicates whether to show or hide the checkboxs.
|
/// @param enable bool indicates whether to show or hide the checkboxs.
|
||||||
treebox & checkable(bool enable);
|
treebox & checkable(bool enable);
|
||||||
|
|
||||||
|
|
||||||
bool checkable() const; ///< Determinte whether the checkboxs are enabled.
|
bool checkable() const; ///< Are the checkboxs are enabled?
|
||||||
|
|
||||||
/// Clears the contents
|
/// Clears the contents
|
||||||
void clear();
|
void clear();
|
||||||
@ -424,26 +424,30 @@ namespace nana
|
|||||||
|
|
||||||
void icon_erase(const ::std::string& id);
|
void icon_erase(const ::std::string& id);
|
||||||
|
|
||||||
item_proxy find(const ::std::string& keypath); ///< Find an item though a specified keypath.
|
item_proxy find(const ::std::string& keypath); ///< Find an item through a specified keypath.
|
||||||
|
|
||||||
/// Inserts a new node to treebox, but if the keypath exists returns the existing node.
|
/// Inserts a new node to treebox, but if the keypath exists change and returns the existing node.
|
||||||
item_proxy insert(const ::std::string& path_key, ///< specifies the node hierarchy
|
item_proxy insert(const ::std::string& path_key, ///< specifies the node hierarchy
|
||||||
::std::string title ///< used for displaying
|
::std::string title ///< used for displaying
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Inserts a new node to treebox, but if the keypath exists returns the existing node.
|
/// Inserts a new node to treebox, but if the keypath exists change and returns the existing node.
|
||||||
item_proxy insert( item_proxy pos, ///< the parent item node
|
item_proxy insert( item_proxy pos, ///< the parent item node
|
||||||
const ::std::string& key, ///< specifies the new node
|
const ::std::string& key, ///< specifies the new node
|
||||||
::std::string title ///< title used for displaying in the new node.
|
::std::string title ///< title used for displaying in the new node.
|
||||||
);
|
);
|
||||||
item_proxy erase(item_proxy i); ///< Removes the node at pos and return the Item proxy following the removed node
|
|
||||||
|
item_proxy erase(item_proxy i); ///< Removes the node at i and return the Item proxy following the removed node
|
||||||
|
|
||||||
void erase(const ::std::string& keypath); ///< Removes the node by the key path.
|
void erase(const ::std::string& keypath); ///< Removes the node by the key path.
|
||||||
|
|
||||||
::std::string make_key_path(item_proxy i, const ::std::string& splitter) const;///<returns the key path
|
::std::string make_key_path(item_proxy i, const ::std::string& splitter) const;///<returns the key path
|
||||||
|
|
||||||
item_proxy selected() const; ///< returns the selected node
|
item_proxy selected() const; ///< returns the selected node
|
||||||
|
|
||||||
};//end class treebox
|
};//end class treebox
|
||||||
}//end namespace nana
|
}//end namespace nana
|
||||||
|
|
||||||
#include <nana/pop_ignore_diagnostic>
|
#include <nana/pop_ignore_diagnostic>
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -85,12 +85,14 @@ namespace nana
|
|||||||
|
|
||||||
bool changed() const; ///< Returns true if the graphics object is operated
|
bool changed() const; ///< Returns true if the graphics object is operated
|
||||||
bool empty() const; ///< Returns true if the graphics object does not refer to any resource.
|
bool empty() const; ///< Returns true if the graphics object does not refer to any resource.
|
||||||
operator const void*() const;
|
explicit operator bool() const noexcept;
|
||||||
|
|
||||||
drawable_type handle() const;
|
drawable_type handle() const;
|
||||||
const void* pixmap() const;
|
const void* pixmap() const;
|
||||||
const void* context() const;
|
const void* context() const;
|
||||||
|
|
||||||
|
void swap(graphics& other) noexcept;
|
||||||
|
|
||||||
/// Creates a graphics/drawable resource
|
/// Creates a graphics/drawable resource
|
||||||
/**
|
/**
|
||||||
* @param sz The dimension of the graphics to be requested. If sz is empty, it performs as release().
|
* @param sz The dimension of the graphics to be requested. If sz is empty, it performs as release().
|
||||||
|
|||||||
@ -14,8 +14,12 @@
|
|||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
// http://lxr.free-electrons.com/source/include/uapi/asm-generic/errno.h#L53
|
// http://lxr.free-electrons.com/source/include/uapi/asm-generic/errno.h#L53
|
||||||
//#define EPROTO 71 /* Protocol error */
|
//#define EPROTO 71 /* Protocol error */
|
||||||
|
#ifdef _GLIBCXX_HAS_GTHREADS
|
||||||
|
# include <thread>
|
||||||
|
#else
|
||||||
#include <mingw.thread.h>
|
#include <mingw.thread.h>
|
||||||
#include <mingw.mutex.h>
|
#include <mingw.mutex.h>
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
#include <boost/thread/mutex.hpp>
|
#include <boost/thread/mutex.hpp>
|
||||||
#include <boost/thread/recursive_mutex.hpp>
|
#include <boost/thread/recursive_mutex.hpp>
|
||||||
|
|||||||
@ -6,7 +6,11 @@
|
|||||||
|
|
||||||
#if defined(NANA_ENABLE_MINGW_STD_THREADS_WITH_MEGANZ)
|
#if defined(NANA_ENABLE_MINGW_STD_THREADS_WITH_MEGANZ)
|
||||||
|
|
||||||
|
#ifdef _GLIBCXX_HAS_GTHREADS
|
||||||
|
# include <thread>
|
||||||
|
#else
|
||||||
# include <mingw.thread.h>
|
# include <mingw.thread.h>
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
#include <boost/thread.hpp>
|
#include <boost/thread.hpp>
|
||||||
namespace std
|
namespace std
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -47,16 +47,6 @@ namespace detail
|
|||||||
bool visible;
|
bool visible;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct move_window
|
|
||||||
{
|
|
||||||
enum { Pos = 1, Size = 2};
|
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
unsigned width;
|
|
||||||
unsigned height;
|
|
||||||
unsigned ignore; //determinate that pos or size would be ignored.
|
|
||||||
};
|
|
||||||
|
|
||||||
struct map_thread
|
struct map_thread
|
||||||
{
|
{
|
||||||
rectangle update_area;
|
rectangle update_area;
|
||||||
@ -77,7 +67,6 @@ namespace detail
|
|||||||
async_set_focus,
|
async_set_focus,
|
||||||
remote_flush_surface,
|
remote_flush_surface,
|
||||||
remote_thread_destroy_window,
|
remote_thread_destroy_window,
|
||||||
remote_thread_move_window,
|
|
||||||
operate_caret, //wParam: 1=Destroy, 2=SetPos
|
operate_caret, //wParam: 1=Destroy, 2=SetPos
|
||||||
remote_thread_set_window_pos,
|
remote_thread_set_window_pos,
|
||||||
remote_thread_set_window_text,
|
remote_thread_set_window_text,
|
||||||
|
|||||||
@ -835,6 +835,19 @@ namespace detail
|
|||||||
i->second->reinstate();
|
i->second->reinstate();
|
||||||
i->second->pos = pos;
|
i->second->pos = pos;
|
||||||
}
|
}
|
||||||
|
auto addr = i->second;
|
||||||
|
if(addr && addr->input_context) {
|
||||||
|
XPoint spot;
|
||||||
|
XVaNestedList list;
|
||||||
|
spot.x = pos.x;
|
||||||
|
spot.y = pos.y + addr->size.height;
|
||||||
|
list = ::XVaCreateNestedList(0, XNSpotLocation, &spot,
|
||||||
|
XNForeground, 0,
|
||||||
|
XNBackground, 0,
|
||||||
|
(void *)0);
|
||||||
|
::XSetICValues(addr->input_context, XNPreeditAttributes, list, NULL);
|
||||||
|
::XFree(list);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void platform_spec::caret_visible(native_window_type wd, bool vis)
|
void platform_spec::caret_visible(native_window_type wd, bool vis)
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -204,6 +204,11 @@ namespace nana
|
|||||||
{
|
{
|
||||||
return (visible_state::invisible != visibility_);
|
return (visible_state::invisible != visibility_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool caret::activated() const
|
||||||
|
{
|
||||||
|
return (visible_state::displayed == visibility_);
|
||||||
|
}
|
||||||
//end class caret
|
//end class caret
|
||||||
|
|
||||||
//struct basic_window
|
//struct basic_window
|
||||||
@ -329,24 +334,18 @@ namespace nana
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const basic_window* get_child_caret(const basic_window* wd, bool this_is_a_child)
|
|
||||||
{
|
|
||||||
if (this_is_a_child && wd->annex.caret_ptr)
|
|
||||||
return wd;
|
|
||||||
|
|
||||||
for (auto child : wd->children)
|
|
||||||
{
|
|
||||||
auto caret_wd = get_child_caret(child, true);
|
|
||||||
if (caret_wd)
|
|
||||||
return caret_wd;
|
|
||||||
}
|
|
||||||
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
const basic_window * basic_window::child_caret() const
|
const basic_window * basic_window::child_caret() const
|
||||||
{
|
{
|
||||||
return get_child_caret(this, false);
|
for (auto child : children) {
|
||||||
|
//Only return the child who has activated caret.
|
||||||
|
if (child->annex.caret_ptr && child->annex.caret_ptr->activated())
|
||||||
|
return child;
|
||||||
|
|
||||||
|
auto caret = child->child_caret();
|
||||||
|
if (caret)
|
||||||
|
return caret;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool basic_window::is_draw_through() const
|
bool basic_window::is_draw_through() const
|
||||||
|
|||||||
@ -151,7 +151,8 @@ namespace nana
|
|||||||
arg.window_handle = reinterpret_cast<window>(wd);
|
arg.window_handle = reinterpret_cast<window>(wd);
|
||||||
if (emit(event_code::expose, wd, arg, false, get_thread_context()))
|
if (emit(event_code::expose, wd, arg, false, get_thread_context()))
|
||||||
{
|
{
|
||||||
const core_window_t * caret_wd = (wd->annex.caret_ptr ? wd : wd->child_caret());
|
//Get the window who has the activated caret
|
||||||
|
const core_window_t * caret_wd = ((wd->annex.caret_ptr && wd->annex.caret_ptr->activated()) ? wd : wd->child_caret());
|
||||||
if (caret_wd)
|
if (caret_wd)
|
||||||
{
|
{
|
||||||
if (exposed)
|
if (exposed)
|
||||||
|
|||||||
@ -245,22 +245,31 @@ namespace detail
|
|||||||
_m_event_filter(evt_code, wd, thrd);
|
_m_event_filter(evt_code, wd, thrd);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(wd->other.upd_state == core_window_t::update_state::none)
|
using update_state = basic_window::update_state;
|
||||||
wd->other.upd_state = core_window_t::update_state::lazy;
|
|
||||||
|
if(wd->other.upd_state == update_state::none)
|
||||||
|
wd->other.upd_state = update_state::lazy;
|
||||||
|
|
||||||
_m_emit_core(evt_code, wd, false, arg, bForce__EmitInternal);
|
_m_emit_core(evt_code, wd, false, arg, bForce__EmitInternal);
|
||||||
|
|
||||||
|
bool good_wd = false;
|
||||||
|
if(wd_manager().available(wd))
|
||||||
|
{
|
||||||
//A child of wd may not be drawn if it was out of wd's range before wd resized,
|
//A child of wd may not be drawn if it was out of wd's range before wd resized,
|
||||||
//so refresh all children of wd when a resized occurs.
|
//so refresh all children of wd when a resized occurs.
|
||||||
if(ask_update || (event_code::resized == evt_code))
|
if(ask_update || (event_code::resized == evt_code) || (update_state::refreshed == wd->other.upd_state))
|
||||||
{
|
{
|
||||||
wd_manager().do_lazy_refresh(wd, false, (event_code::resized == evt_code));
|
wd_manager().do_lazy_refresh(wd, false, (event_code::resized == evt_code));
|
||||||
}
|
}
|
||||||
else if(wd_manager().available(wd))
|
else
|
||||||
wd->other.upd_state = core_window_t::update_state::none;
|
wd->other.upd_state = update_state::none;
|
||||||
|
|
||||||
|
good_wd = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if(thrd) thrd->event_window = prev_wd;
|
if(thrd) thrd->event_window = prev_wd;
|
||||||
return true;
|
return good_wd;
|
||||||
}
|
}
|
||||||
|
|
||||||
void assign_arg(arg_mouse& arg, basic_window* wd, unsigned msg, const XEvent& evt)
|
void assign_arg(arg_mouse& arg, basic_window* wd, unsigned msg, const XEvent& evt)
|
||||||
@ -438,8 +447,8 @@ namespace detail
|
|||||||
keysym = keyboard::os_arrow_left + (keysym - XK_Left); break;
|
keysym = keyboard::os_arrow_left + (keysym - XK_Left); break;
|
||||||
case XK_Insert:
|
case XK_Insert:
|
||||||
keysym = keyboard::os_insert; break;
|
keysym = keyboard::os_insert; break;
|
||||||
case XK_Delete:
|
case XK_Delete: case XK_KP_Delete:
|
||||||
keysym = keyboard::os_del; break;
|
keysym = keyboard::del; break;
|
||||||
case XK_Shift_L: case XK_Shift_R: //shift
|
case XK_Shift_L: case XK_Shift_R: //shift
|
||||||
keysym = keyboard::os_shift; break;
|
keysym = keyboard::os_shift; break;
|
||||||
case XK_Control_L: case XK_Control_R: //ctrl
|
case XK_Control_L: case XK_Control_R: //ctrl
|
||||||
|
|||||||
@ -601,40 +601,6 @@ namespace detail
|
|||||||
::HeapFree(::GetProcessHeap(), 0, stru);
|
::HeapFree(::GetProcessHeap(), 0, stru);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
case nana::detail::messages::remote_thread_move_window:
|
|
||||||
{
|
|
||||||
auto * mw = reinterpret_cast<nana::detail::messages::move_window*>(wParam);
|
|
||||||
|
|
||||||
::RECT r;
|
|
||||||
::GetWindowRect(wd, &r);
|
|
||||||
if(mw->ignore & mw->Pos)
|
|
||||||
{
|
|
||||||
mw->x = r.left;
|
|
||||||
mw->y = r.top;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
HWND owner = ::GetWindow(wd, GW_OWNER);
|
|
||||||
if(owner)
|
|
||||||
{
|
|
||||||
::RECT owr;
|
|
||||||
::GetWindowRect(owner, &owr);
|
|
||||||
::POINT pos = {owr.left, owr.top};
|
|
||||||
::ScreenToClient(owner, &pos);
|
|
||||||
mw->x += (owr.left - pos.x);
|
|
||||||
mw->y += (owr.top - pos.y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(mw->ignore & mw->Size)
|
|
||||||
{
|
|
||||||
mw->width = r.right - r.left;
|
|
||||||
mw->height = r.bottom - r.top;
|
|
||||||
}
|
|
||||||
::MoveWindow(wd, mw->x, mw->y, mw->width, mw->height, true);
|
|
||||||
delete mw;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
case nana::detail::messages::remote_thread_set_window_pos:
|
case nana::detail::messages::remote_thread_set_window_pos:
|
||||||
::SetWindowPos(wd, reinterpret_cast<HWND>(wParam), 0, 0, 0, 0, static_cast<UINT>(lParam));
|
::SetWindowPos(wd, reinterpret_cast<HWND>(wParam), 0, 0, 0, 0, static_cast<UINT>(lParam));
|
||||||
return true;
|
return true;
|
||||||
@ -775,6 +741,19 @@ namespace detail
|
|||||||
if (thrd) thrd->event_window = prev_event_wd;
|
if (thrd) thrd->event_window = prev_event_wd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Translate OS Virtual-Key into ASCII code
|
||||||
|
wchar_t translate_virtual_key(WPARAM vkey)
|
||||||
|
{
|
||||||
|
switch (vkey)
|
||||||
|
{
|
||||||
|
case VK_DELETE:
|
||||||
|
return 127;
|
||||||
|
case VK_DECIMAL:
|
||||||
|
return 46;
|
||||||
|
}
|
||||||
|
return static_cast<wchar_t>(vkey);
|
||||||
|
}
|
||||||
|
|
||||||
LRESULT CALLBACK Bedrock_WIN32_WindowProc(HWND root_window, UINT message, WPARAM wParam, LPARAM lParam)
|
LRESULT CALLBACK Bedrock_WIN32_WindowProc(HWND root_window, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
LRESULT window_proc_value = 0;
|
LRESULT window_proc_value = 0;
|
||||||
@ -1436,7 +1415,7 @@ namespace detail
|
|||||||
arg.evt_code = event_code::key_press;
|
arg.evt_code = event_code::key_press;
|
||||||
arg.window_handle = reinterpret_cast<window>(msgwnd);
|
arg.window_handle = reinterpret_cast<window>(msgwnd);
|
||||||
arg.ignore = false;
|
arg.ignore = false;
|
||||||
arg.key = static_cast<wchar_t>(wParam);
|
arg.key = translate_virtual_key(wParam);
|
||||||
brock.get_key_state(arg);
|
brock.get_key_state(arg);
|
||||||
brock.emit(event_code::key_press, msgwnd, arg, true, &context);
|
brock.emit(event_code::key_press, msgwnd, arg, true, &context);
|
||||||
|
|
||||||
@ -1522,7 +1501,7 @@ namespace detail
|
|||||||
arg_keyboard arg;
|
arg_keyboard arg;
|
||||||
arg.evt_code = event_code::key_release;
|
arg.evt_code = event_code::key_release;
|
||||||
arg.window_handle = reinterpret_cast<window>(msgwnd);
|
arg.window_handle = reinterpret_cast<window>(msgwnd);
|
||||||
arg.key = static_cast<wchar_t>(wParam);
|
arg.key = translate_virtual_key(wParam);
|
||||||
brock.get_key_state(arg);
|
brock.get_key_state(arg);
|
||||||
arg.ignore = false;
|
arg.ignore = false;
|
||||||
brock.emit(event_code::key_release, msgwnd, arg, true, &context);
|
brock.emit(event_code::key_release, msgwnd, arg, true, &context);
|
||||||
@ -1639,18 +1618,21 @@ namespace detail
|
|||||||
_m_event_filter(evt_code, wd, thrd);
|
_m_event_filter(evt_code, wd, thrd);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wd->other.upd_state == core_window_t::update_state::none)
|
using update_state = basic_window::update_state;
|
||||||
wd->other.upd_state = core_window_t::update_state::lazy;
|
|
||||||
|
if (update_state::none == wd->other.upd_state)
|
||||||
|
wd->other.upd_state = update_state::lazy;
|
||||||
|
|
||||||
_m_emit_core(evt_code, wd, false, arg, bForce__EmitInternal);
|
_m_emit_core(evt_code, wd, false, arg, bForce__EmitInternal);
|
||||||
|
|
||||||
bool good_wd = false;
|
bool good_wd = false;
|
||||||
if (wd_manager().available(wd))
|
if (wd_manager().available(wd))
|
||||||
{
|
{
|
||||||
if (ask_update)
|
//Ignore ask_update if update state is refreshed.
|
||||||
|
if (ask_update || (update_state::refreshed == wd->other.upd_state))
|
||||||
wd_manager().do_lazy_refresh(wd, false);
|
wd_manager().do_lazy_refresh(wd, false);
|
||||||
else
|
else
|
||||||
wd->other.upd_state = basic_window::update_state::none;
|
wd->other.upd_state = update_state::none;
|
||||||
|
|
||||||
good_wd = true;
|
good_wd = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -863,16 +863,6 @@ namespace nana{
|
|||||||
void native_interface::move_window(native_window_type wd, int x, int y)
|
void native_interface::move_window(native_window_type wd, int x, int y)
|
||||||
{
|
{
|
||||||
#if defined(NANA_WINDOWS)
|
#if defined(NANA_WINDOWS)
|
||||||
if(::GetWindowThreadProcessId(reinterpret_cast<HWND>(wd), 0) != ::GetCurrentThreadId())
|
|
||||||
{
|
|
||||||
nana::detail::messages::move_window * mw = new nana::detail::messages::move_window;
|
|
||||||
mw->x = x;
|
|
||||||
mw->y = y;
|
|
||||||
mw->ignore = mw->Size;
|
|
||||||
::PostMessage(reinterpret_cast<HWND>(wd), nana::detail::messages::remote_thread_move_window, reinterpret_cast<WPARAM>(mw), 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
::RECT r;
|
::RECT r;
|
||||||
::GetWindowRect(reinterpret_cast<HWND>(wd), &r);
|
::GetWindowRect(reinterpret_cast<HWND>(wd), &r);
|
||||||
HWND owner = ::GetWindow(reinterpret_cast<HWND>(wd), GW_OWNER);
|
HWND owner = ::GetWindow(reinterpret_cast<HWND>(wd), GW_OWNER);
|
||||||
@ -885,8 +875,15 @@ namespace nana{
|
|||||||
x += (owner_rect.left - pos.x);
|
x += (owner_rect.left - pos.x);
|
||||||
y += (owner_rect.top - pos.y);
|
y += (owner_rect.top - pos.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (::GetWindowThreadProcessId(reinterpret_cast<HWND>(wd), 0) != ::GetCurrentThreadId())
|
||||||
|
{
|
||||||
|
nana::internal_revert_guard irg;
|
||||||
::MoveWindow(reinterpret_cast<HWND>(wd), x, y, r.right - r.left, r.bottom - r.top, true);
|
::MoveWindow(reinterpret_cast<HWND>(wd), x, y, r.right - r.left, r.bottom - r.top, true);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
::MoveWindow(reinterpret_cast<HWND>(wd), x, y, r.right - r.left, r.bottom - r.top, true);
|
||||||
#elif defined(NANA_X11)
|
#elif defined(NANA_X11)
|
||||||
Display * disp = restrict::spec.open_display();
|
Display * disp = restrict::spec.open_display();
|
||||||
|
|
||||||
@ -908,21 +905,10 @@ namespace nana{
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void native_interface::move_window(native_window_type wd, const rectangle& r)
|
bool native_interface::move_window(native_window_type wd, const rectangle& r)
|
||||||
{
|
{
|
||||||
#if defined(NANA_WINDOWS)
|
#if defined(NANA_WINDOWS)
|
||||||
if(::GetWindowThreadProcessId(reinterpret_cast<HWND>(wd), 0) != ::GetCurrentThreadId())
|
|
||||||
{
|
|
||||||
auto * mw = new nana::detail::messages::move_window;
|
|
||||||
mw->x = r.x;
|
|
||||||
mw->y = r.y;
|
|
||||||
mw->width = r.width;
|
|
||||||
mw->height = r.height;
|
|
||||||
mw->ignore = 0;
|
|
||||||
::PostMessage(reinterpret_cast<HWND>(wd), nana::detail::messages::remote_thread_move_window, reinterpret_cast<WPARAM>(mw), 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int x = r.x;
|
int x = r.x;
|
||||||
int y = r.y;
|
int y = r.y;
|
||||||
HWND owner = ::GetWindow(reinterpret_cast<HWND>(wd), GW_OWNER);
|
HWND owner = ::GetWindow(reinterpret_cast<HWND>(wd), GW_OWNER);
|
||||||
@ -941,8 +927,14 @@ namespace nana{
|
|||||||
::GetWindowRect(reinterpret_cast<HWND>(wd), &wd_area);
|
::GetWindowRect(reinterpret_cast<HWND>(wd), &wd_area);
|
||||||
unsigned ext_w = (wd_area.right - wd_area.left) - client.right;
|
unsigned ext_w = (wd_area.right - wd_area.left) - client.right;
|
||||||
unsigned ext_h = (wd_area.bottom - wd_area.top) - client.bottom;
|
unsigned ext_h = (wd_area.bottom - wd_area.top) - client.bottom;
|
||||||
::MoveWindow(reinterpret_cast<HWND>(wd), x, y, r.width + ext_w, r.height + ext_h, true);
|
|
||||||
|
if (::GetWindowThreadProcessId(reinterpret_cast<HWND>(wd), 0) != ::GetCurrentThreadId())
|
||||||
|
{
|
||||||
|
nana::internal_revert_guard irg;
|
||||||
|
return (FALSE != ::MoveWindow(reinterpret_cast<HWND>(wd), x, y, r.width + ext_w, r.height + ext_h, true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return (FALSE != ::MoveWindow(reinterpret_cast<HWND>(wd), x, y, r.width + ext_w, r.height + ext_h, true));
|
||||||
#elif defined(NANA_X11)
|
#elif defined(NANA_X11)
|
||||||
Display * disp = restrict::spec.open_display();
|
Display * disp = restrict::spec.open_display();
|
||||||
long supplied;
|
long supplied;
|
||||||
@ -984,6 +976,7 @@ namespace nana{
|
|||||||
::XSetWMNormalHints(disp, reinterpret_cast<Window>(wd), &hints);
|
::XSetWMNormalHints(disp, reinterpret_cast<Window>(wd), &hints);
|
||||||
|
|
||||||
::XMoveResizeWindow(disp, reinterpret_cast<Window>(wd), x, y, r.width, r.height);
|
::XMoveResizeWindow(disp, reinterpret_cast<Window>(wd), x, y, r.width, r.height);
|
||||||
|
return true;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1062,19 +1055,9 @@ namespace nana{
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void native_interface::window_size(native_window_type wd, const size& sz)
|
bool native_interface::window_size(native_window_type wd, const size& sz)
|
||||||
{
|
{
|
||||||
#if defined(NANA_WINDOWS)
|
#if defined(NANA_WINDOWS)
|
||||||
if(::GetWindowThreadProcessId(reinterpret_cast<HWND>(wd), 0) != ::GetCurrentThreadId())
|
|
||||||
{
|
|
||||||
auto * mw = new nana::detail::messages::move_window;
|
|
||||||
mw->width = sz.width;
|
|
||||||
mw->height = sz.height;
|
|
||||||
mw->ignore = mw->Pos;
|
|
||||||
::PostMessage(reinterpret_cast<HWND>(wd), nana::detail::messages::remote_thread_move_window, reinterpret_cast<WPARAM>(mw), 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
::RECT r;
|
::RECT r;
|
||||||
::GetWindowRect(reinterpret_cast<HWND>(wd), &r);
|
::GetWindowRect(reinterpret_cast<HWND>(wd), &r);
|
||||||
HWND owner = ::GetWindow(reinterpret_cast<HWND>(wd), GW_OWNER);
|
HWND owner = ::GetWindow(reinterpret_cast<HWND>(wd), GW_OWNER);
|
||||||
@ -1086,8 +1069,14 @@ namespace nana{
|
|||||||
r.left = pos.x;
|
r.left = pos.x;
|
||||||
r.top = pos.y;
|
r.top = pos.y;
|
||||||
}
|
}
|
||||||
::MoveWindow(reinterpret_cast<HWND>(wd), r.left, r.top, static_cast<int>(sz.width), static_cast<int>(sz.height), true);
|
|
||||||
|
if (::GetWindowThreadProcessId(reinterpret_cast<HWND>(wd), 0) != ::GetCurrentThreadId())
|
||||||
|
{
|
||||||
|
nana::internal_revert_guard irg;
|
||||||
|
return (FALSE != ::MoveWindow(reinterpret_cast<HWND>(wd), r.left, r.top, static_cast<int>(sz.width), static_cast<int>(sz.height), true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return (FALSE != ::MoveWindow(reinterpret_cast<HWND>(wd), r.left, r.top, static_cast<int>(sz.width), static_cast<int>(sz.height), true));
|
||||||
#elif defined(NANA_X11)
|
#elif defined(NANA_X11)
|
||||||
auto disp = restrict::spec.open_display();
|
auto disp = restrict::spec.open_display();
|
||||||
nana::detail::platform_scope_guard psg;
|
nana::detail::platform_scope_guard psg;
|
||||||
@ -1104,6 +1093,7 @@ namespace nana{
|
|||||||
::XSetWMNormalHints(disp, reinterpret_cast<Window>(wd), &hints);
|
::XSetWMNormalHints(disp, reinterpret_cast<Window>(wd), &hints);
|
||||||
}
|
}
|
||||||
::XResizeWindow(disp, reinterpret_cast<Window>(wd), sz.width, sz.height);
|
::XResizeWindow(disp, reinterpret_cast<Window>(wd), sz.width, sz.height);
|
||||||
|
return true;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -149,23 +149,24 @@ namespace nana
|
|||||||
// reads the overlaps that are overlapped a rectangular block
|
// reads the overlaps that are overlapped a rectangular block
|
||||||
bool window_layout::read_overlaps(core_window_t* wd, const nana::rectangle& vis_rect, std::vector<wd_rectangle>& blocks)
|
bool window_layout::read_overlaps(core_window_t* wd, const nana::rectangle& vis_rect, std::vector<wd_rectangle>& blocks)
|
||||||
{
|
{
|
||||||
|
auto const is_wd_root = (category::flags::root == wd->other.category);
|
||||||
wd_rectangle block;
|
wd_rectangle block;
|
||||||
while (wd->parent)
|
while (wd->parent)
|
||||||
{
|
{
|
||||||
auto & siblings = wd->parent->children;
|
auto i = std::find(wd->parent->children.cbegin(), wd->parent->children.cend(), wd);
|
||||||
//It should be checked that whether the window is still a chlid of its parent.
|
if (i != wd->parent->children.cend())
|
||||||
if (siblings.size())
|
|
||||||
{
|
{
|
||||||
auto i = &(siblings[0]);
|
for (++i; i != wd->parent->children.cend(); ++i)
|
||||||
auto *end = i + siblings.size();
|
|
||||||
i = std::find(i, end, wd);
|
|
||||||
if (i != end)
|
|
||||||
{
|
|
||||||
//find the widget that next to wd.
|
|
||||||
for (++i; i < end; ++i)
|
|
||||||
{
|
{
|
||||||
core_window_t* cover = *i;
|
core_window_t* cover = *i;
|
||||||
if ((category::flags::root != cover->other.category) && cover->visible && (nullptr == cover->effect.bground))
|
|
||||||
|
if (!cover->visible)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (is_wd_root ?
|
||||||
|
(category::flags::root == cover->other.category)
|
||||||
|
:
|
||||||
|
((category::flags::root != cover->other.category) && (nullptr == cover->effect.bground)))
|
||||||
{
|
{
|
||||||
if (overlap(vis_rect, rectangle{ cover->pos_root, cover->dimension }, block.r))
|
if (overlap(vis_rect, rectangle{ cover->pos_root, cover->dimension }, block.r))
|
||||||
{
|
{
|
||||||
@ -175,7 +176,7 @@ namespace nana
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
wd = wd->parent;
|
wd = wd->parent;
|
||||||
}
|
}
|
||||||
return (!blocks.empty());
|
return (!blocks.empty());
|
||||||
|
|||||||
@ -219,8 +219,6 @@ namespace detail
|
|||||||
Key first;
|
Key first;
|
||||||
Value second;
|
Value second;
|
||||||
|
|
||||||
key_value_rep() = default;
|
|
||||||
|
|
||||||
key_value_rep(const Key& k)
|
key_value_rep(const Key& k)
|
||||||
: first(k), second{}
|
: first(k), second{}
|
||||||
{
|
{
|
||||||
@ -259,14 +257,6 @@ namespace detail
|
|||||||
};
|
};
|
||||||
|
|
||||||
//class window_manager
|
//class window_manager
|
||||||
struct window_handle_deleter
|
|
||||||
{
|
|
||||||
void operator()(basic_window* wd) const
|
|
||||||
{
|
|
||||||
delete wd;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//struct wdm_private_impl
|
//struct wdm_private_impl
|
||||||
struct window_manager::wdm_private_impl
|
struct window_manager::wdm_private_impl
|
||||||
{
|
{
|
||||||
@ -506,7 +496,7 @@ namespace detail
|
|||||||
if (impl_->wd_register.available(owner))
|
if (impl_->wd_register.available(owner))
|
||||||
{
|
{
|
||||||
if (owner->flags.destroying)
|
if (owner->flags.destroying)
|
||||||
throw std::runtime_error("the specified owner is destory");
|
throw std::runtime_error("the specified owner is destoryed");
|
||||||
|
|
||||||
#ifndef WIDGET_FRAME_DEPRECATED
|
#ifndef WIDGET_FRAME_DEPRECATED
|
||||||
native = (category::flags::frame == owner->other.category ?
|
native = (category::flags::frame == owner->other.category ?
|
||||||
@ -953,24 +943,46 @@ namespace detail
|
|||||||
if (wd->dimension == sz)
|
if (wd->dimension == sz)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
//Before resiz the window, creates the new graphics
|
||||||
|
paint::graphics graph;
|
||||||
|
paint::graphics root_graph;
|
||||||
|
if (category::flags::lite_widget != wd->other.category)
|
||||||
|
{
|
||||||
|
//If allocation fails, here throws std::bad_alloc.
|
||||||
|
graph.make(sz);
|
||||||
|
graph.typeface(wd->drawer.graphics.typeface());
|
||||||
|
if (category::flags::root == wd->other.category)
|
||||||
|
root_graph.make(sz);
|
||||||
|
}
|
||||||
|
|
||||||
|
auto pre_sz = wd->dimension;
|
||||||
|
|
||||||
wd->dimension = sz;
|
wd->dimension = sz;
|
||||||
|
|
||||||
if(category::flags::lite_widget != wd->other.category)
|
if(category::flags::lite_widget != wd->other.category)
|
||||||
{
|
{
|
||||||
bool graph_state = wd->drawer.graphics.empty();
|
bool graph_state = wd->drawer.graphics.empty();
|
||||||
wd->drawer.graphics.make(sz);
|
wd->drawer.graphics.swap(graph);
|
||||||
|
|
||||||
//It shall make a typeface_changed() call when the graphics state is changing.
|
//It shall make a typeface_changed() call when the graphics state is changing.
|
||||||
//Because when a widget is created with zero-size, it may get some wrong result in typeface_changed() call
|
//Because when a widget is created with zero-size, it may get some wrong results in typeface_changed() call
|
||||||
//due to the invaliable graphics object.
|
//due to the invaliable graphics object.
|
||||||
if(graph_state != wd->drawer.graphics.empty())
|
if(graph_state != wd->drawer.graphics.empty())
|
||||||
wd->drawer.typeface_changed();
|
wd->drawer.typeface_changed();
|
||||||
|
|
||||||
if(category::flags::root == wd->other.category)
|
if(category::flags::root == wd->other.category)
|
||||||
{
|
{
|
||||||
wd->root_graph->make(sz);
|
//wd->root_graph->make(sz);
|
||||||
|
wd->root_graph->swap(root_graph);
|
||||||
if(false == passive)
|
if(false == passive)
|
||||||
native_interface::window_size(wd->root, sz + nana::size(wd->extra_width, wd->extra_height));
|
if (!native_interface::window_size(wd->root, sz + nana::size(wd->extra_width, wd->extra_height)))
|
||||||
|
{
|
||||||
|
wd->dimension = pre_sz;
|
||||||
|
wd->drawer.graphics.swap(graph);
|
||||||
|
wd->root_graph->swap(root_graph);
|
||||||
|
wd->drawer.typeface_changed();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#ifndef WIDGET_FRAME_DEPRECATED
|
#ifndef WIDGET_FRAME_DEPRECATED
|
||||||
else if(category::flags::frame == wd->other.category)
|
else if(category::flags::frame == wd->other.category)
|
||||||
|
|||||||
@ -435,20 +435,20 @@ namespace nana
|
|||||||
nodes_.filesystem = tree_.insert("FS.ROOT", "Filesystem");
|
nodes_.filesystem = tree_.insert("FS.ROOT", "Filesystem");
|
||||||
nodes_.filesystem.value(kind::filesystem);
|
nodes_.filesystem.value(kind::filesystem);
|
||||||
|
|
||||||
std::vector<std::string> paths;
|
std::vector<std::pair<std::string, treebox::item_proxy>> paths;
|
||||||
paths.emplace_back(fs_ext::path_user().native());
|
paths.emplace_back(fs_ext::path_user().native(), nodes_.home);
|
||||||
paths.emplace_back("/");
|
paths.emplace_back("/", nodes_.filesystem);
|
||||||
|
|
||||||
fs::directory_iterator end;
|
fs::directory_iterator end;
|
||||||
for (auto & p : paths)
|
for (auto & p : paths)
|
||||||
{
|
{
|
||||||
for (fs::directory_iterator i(p); i != end; ++i)
|
for (fs::directory_iterator i{p.first}; i != end; ++i)
|
||||||
{
|
{
|
||||||
auto name = i->path().filename().native();
|
auto name = i->path().filename().native();
|
||||||
if (!is_directory(i->status()) || (name.size() && name[0] == '.'))
|
if (!is_directory(i->status()) || (name.size() && name[0] == '.'))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
item_proxy node = tree_.insert(nodes_.filesystem, name, name);
|
item_proxy node = tree_.insert(p.second, name, name);
|
||||||
if (false == node.empty())
|
if (false == node.empty())
|
||||||
{
|
{
|
||||||
node.value(kind::filesystem);
|
node.value(kind::filesystem);
|
||||||
@ -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);
|
||||||
|
|
||||||
@ -569,29 +566,64 @@ namespace nana
|
|||||||
if(cat_path.size() && cat_path[cat_path.size() - 1] != '/')
|
if(cat_path.size() && cat_path[cat_path.size() - 1] != '/')
|
||||||
cat_path += '/';
|
cat_path += '/';
|
||||||
|
|
||||||
|
|
||||||
auto beg = head.size();
|
auto beg = head.size();
|
||||||
while(true)
|
while(true)
|
||||||
{
|
{
|
||||||
auto pos = path.find('/', beg);
|
auto pos = path.find('/', beg);
|
||||||
auto folder = path.substr(beg, pos != path.npos ? pos - beg: path.npos);
|
auto folder = path.substr(beg, pos != path.npos ? pos - beg: path.npos);
|
||||||
if(folder.size() == 0) break;
|
|
||||||
|
if(folder.empty())
|
||||||
|
break;
|
||||||
|
|
||||||
(cat_path += folder) += '/';
|
(cat_path += folder) += '/';
|
||||||
(head += folder) += '/';
|
(head += folder) += '/';
|
||||||
path_.caption(cat_path);
|
path_.caption(cat_path);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
for(fs::directory_iterator i(head); i != end; ++i)
|
for(fs::directory_iterator i(head); i != end; ++i)
|
||||||
{
|
{
|
||||||
if (is_directory(*i))
|
if (is_directory(*i))
|
||||||
path_.childset(i->path().filename().native(), 0);
|
path_.childset(i->path().filename().native(), 0);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
catch(fs::filesystem_error&)
|
||||||
|
{
|
||||||
|
//The directory iterator may throw filesystem_error when
|
||||||
|
//the user doesn't have permission to access the directory.
|
||||||
|
|
||||||
|
//It just loads the sub-directories
|
||||||
|
//to the category path.
|
||||||
|
}
|
||||||
|
|
||||||
if(pos == path.npos)
|
if(pos == path.npos)
|
||||||
break;
|
break;
|
||||||
beg = pos + 1;
|
beg = pos + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
_m_load_path(path);
|
_m_load_path(path);
|
||||||
_m_list_fs();
|
_m_list_fs();
|
||||||
}
|
}
|
||||||
|
catch(fs::filesystem_error&)
|
||||||
|
{
|
||||||
|
file_container_.clear();
|
||||||
|
|
||||||
|
drawing dw{ls_file_};
|
||||||
|
dw.clear();
|
||||||
|
dw.draw([](paint::graphics& graph){
|
||||||
|
std::string text = "Permission denied to access the directory";
|
||||||
|
auto txt_sz = graph.text_extent_size(text);
|
||||||
|
auto sz = graph.size();
|
||||||
|
|
||||||
|
graph.string({static_cast<int>(sz.width - txt_sz.width) / 2, static_cast<int>(sz.height - txt_sz.height) / 2}, text, colors::dark_gray);
|
||||||
|
});
|
||||||
|
|
||||||
|
ls_file_.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool _m_filter_allowed(const std::string& name, bool is_dir, const std::string& filter, const std::vector<std::string>* extension) const
|
bool _m_filter_allowed(const std::string& name, bool is_dir, const std::string& filter, const std::vector<std::string>* extension) const
|
||||||
{
|
{
|
||||||
@ -611,6 +643,8 @@ namespace nana
|
|||||||
|
|
||||||
void _m_list_fs()
|
void _m_list_fs()
|
||||||
{
|
{
|
||||||
|
drawing{ls_file_}.clear();
|
||||||
|
|
||||||
auto filter = filter_.caption();
|
auto filter = filter_.caption();
|
||||||
ls_file_.auto_draw(false);
|
ls_file_.auto_draw(false);
|
||||||
|
|
||||||
@ -655,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();
|
||||||
@ -763,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);
|
||||||
@ -771,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -783,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);
|
||||||
@ -795,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);
|
||||||
@ -828,17 +863,31 @@ namespace nana
|
|||||||
|
|
||||||
auto child = node.append(name, name, kind::filesystem);
|
auto child = node.append(name, name, kind::filesystem);
|
||||||
if(!child.empty())
|
if(!child.empty())
|
||||||
|
{
|
||||||
|
//The try-catch can be eleminated by using
|
||||||
|
//directory_iterator( const std::filesystem::path& p, std::error_code& ec ) noexcept;
|
||||||
|
//in C++17
|
||||||
|
try
|
||||||
{
|
{
|
||||||
for(fs::directory_iterator u(i->path()); u != end; ++u)
|
for(fs::directory_iterator u(i->path()); u != end; ++u)
|
||||||
{
|
{
|
||||||
auto uname = i->path().filename().native();
|
auto uname = u->path().filename().native();
|
||||||
if ((!is_directory(*i)) || (uname.size() && uname[0] == '.'))
|
if ((!is_directory(*u)) || (uname.size() && uname[0] == '.'))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
child.append(uname, uname, kind::filesystem);
|
child.append(uname, uname, kind::filesystem);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch(fs::filesystem_error&)
|
||||||
|
{
|
||||||
|
//The directory iterator may throw filesystem_error when
|
||||||
|
//the user doesn't have permission to access the directory.
|
||||||
|
|
||||||
|
//Catch the error without any process, because the loop is just
|
||||||
|
//to peak whether the directory(i->path) has a sub-directory.
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -58,7 +58,7 @@ namespace nana
|
|||||||
{
|
{
|
||||||
div_start, div_end, splitter,
|
div_start, div_end, splitter,
|
||||||
identifier, dock, fit, hfit, vfit, vert, grid, number, array, reparray,
|
identifier, dock, fit, hfit, vfit, vert, grid, number, array, reparray,
|
||||||
weight, gap, margin, arrange, variable, repeated, min_px, max_px, left, right, top, bottom, undisplayed, invisible,
|
weight, width, height, gap, margin, arrange, variable, repeated, min_px, max_px, left, right, top, bottom, undisplayed, invisible,
|
||||||
collapse, parameters,
|
collapse, parameters,
|
||||||
equal,
|
equal,
|
||||||
eof, error
|
eof, error
|
||||||
@ -235,15 +235,21 @@ namespace nana
|
|||||||
|
|
||||||
idstr_.assign(idstart, sp_);
|
idstr_.assign(idstart, sp_);
|
||||||
|
|
||||||
if ("weight" == idstr_ || "min" == idstr_ || "max" == idstr_)
|
if ( "weight" == idstr_
|
||||||
|
|| "min" == idstr_
|
||||||
|
|| "max" == idstr_
|
||||||
|
|| "width" == idstr_
|
||||||
|
|| "height" == idstr_
|
||||||
|
)
|
||||||
{
|
{
|
||||||
auto ch = idstr_[1];
|
auto c3 = idstr_[2], c1 =idstr_[0];
|
||||||
_m_attr_number_value();
|
_m_attr_number_value();
|
||||||
switch (ch)
|
switch (c3)
|
||||||
{
|
{
|
||||||
case 'e': return token::weight;
|
case 'i': return c1=='w'? token::weight : token::height;
|
||||||
case 'i': return token::min_px;
|
case 'n': return token::min_px;
|
||||||
case 'a': return token::max_px;
|
case 'x': return token::max_px;
|
||||||
|
case 'd': return token::width;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ("dock" == idstr_)
|
else if ("dock" == idstr_)
|
||||||
@ -742,6 +748,7 @@ namespace nana
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum class kind{ arrange, vertical_arrange, grid, splitter, dock, dockpane};
|
enum class kind{ arrange, vertical_arrange, grid, splitter, dock, dockpane};
|
||||||
|
using token = place_parts::tokenizer::token;
|
||||||
|
|
||||||
division(kind k, std::string&& n) noexcept
|
division(kind k, std::string&& n) noexcept
|
||||||
: kind_of_division(k),
|
: kind_of_division(k),
|
||||||
@ -1082,6 +1089,7 @@ namespace nana
|
|||||||
|
|
||||||
::nana::rectangle field_area;
|
::nana::rectangle field_area;
|
||||||
number_t weight;
|
number_t weight;
|
||||||
|
token weigth_type=token::weight;
|
||||||
number_t min_px, max_px;
|
number_t min_px, max_px;
|
||||||
|
|
||||||
place_parts::margin margin;
|
place_parts::margin margin;
|
||||||
@ -2616,10 +2624,10 @@ namespace nana
|
|||||||
|
|
||||||
auto place::implement::scan_div(place_parts::tokenizer& tknizer) -> std::unique_ptr<division>
|
auto place::implement::scan_div(place_parts::tokenizer& tknizer) -> std::unique_ptr<division>
|
||||||
{
|
{
|
||||||
typedef place_parts::tokenizer::token token;
|
using token = place_parts::tokenizer::token ;
|
||||||
|
|
||||||
std::unique_ptr<division> div;
|
std::unique_ptr<division> div;
|
||||||
token div_type = token::eof;
|
token div_type = token::eof , weight_type=token::weight;
|
||||||
auto fit = fit_policy::none;
|
auto fit = fit_policy::none;
|
||||||
place_parts::repeated_array fit_parameters;
|
place_parts::repeated_array fit_parameters;
|
||||||
|
|
||||||
@ -2726,7 +2734,7 @@ namespace nana
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case token::weight: case token::min_px: case token::max_px:
|
case token::weight: case token::min_px: case token::max_px: case token::width: case token::height:
|
||||||
{
|
{
|
||||||
auto n = tknizer.number();
|
auto n = tknizer.number();
|
||||||
//If n is the type of real, convert it to integer.
|
//If n is the type of real, convert it to integer.
|
||||||
@ -2736,7 +2744,9 @@ namespace nana
|
|||||||
|
|
||||||
switch (tk)
|
switch (tk)
|
||||||
{
|
{
|
||||||
case token::weight: weight = n; break;
|
case token::weight: weight = n; weight_type = token::weight; break; // we could detect errors here (redefinitions and duplicates)
|
||||||
|
case token::width : weight = n; weight_type = token::width ; break;
|
||||||
|
case token::height: weight = n; weight_type = token::height; break;
|
||||||
case token::min_px: min_px = n; break;
|
case token::min_px: min_px = n; break;
|
||||||
case token::max_px: max_px = n; break;
|
case token::max_px: max_px = n; break;
|
||||||
default: break; //Useless
|
default: break; //Useless
|
||||||
@ -2805,10 +2815,16 @@ namespace nana
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
token unmatch = token::width;
|
||||||
switch (div_type)
|
switch (div_type)
|
||||||
{
|
{
|
||||||
case token::eof:
|
case token::eof: unmatch = token::height; // "horitontal" div
|
||||||
case token::vert:
|
case token::vert: // "vertical" div
|
||||||
|
for (auto& ch : children)
|
||||||
|
if (ch->weigth_type == unmatch)
|
||||||
|
throw std::invalid_argument("nana.place: unmatch vertical-heigth/horizontal-width betwen division '"
|
||||||
|
+name+"' and children division '" + ch->name);
|
||||||
|
|
||||||
div.reset(new div_arrange(token::vert == div_type, std::move(name), std::move(arrange)));
|
div.reset(new div_arrange(token::vert == div_type, std::move(name), std::move(arrange)));
|
||||||
break;
|
break;
|
||||||
case token::grid:
|
case token::grid:
|
||||||
@ -2837,6 +2853,7 @@ namespace nana
|
|||||||
default:
|
default:
|
||||||
throw std::invalid_argument("nana.place: invalid division type.");
|
throw std::invalid_argument("nana.place: invalid division type.");
|
||||||
}
|
}
|
||||||
|
div->weigth_type = weight_type;
|
||||||
|
|
||||||
//Requirements for min/max
|
//Requirements for min/max
|
||||||
//1, min and max != negative
|
//1, min and max != negative
|
||||||
|
|||||||
@ -1183,6 +1183,13 @@ namespace API
|
|||||||
auto caret = _m_caret();
|
auto caret = _m_caret();
|
||||||
return (caret && caret->visible());
|
return (caret && caret->visible());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool activated() const override
|
||||||
|
{
|
||||||
|
internal_scope_guard lock;
|
||||||
|
auto caret = _m_caret();
|
||||||
|
return (caret && caret->activated());
|
||||||
|
}
|
||||||
private:
|
private:
|
||||||
caret_interface* _m_caret() const
|
caret_interface* _m_caret() const
|
||||||
{
|
{
|
||||||
|
|||||||
@ -14,6 +14,7 @@
|
|||||||
#include <nana/gui/widgets/scroll.hpp>
|
#include <nana/gui/widgets/scroll.hpp>
|
||||||
|
|
||||||
#include <nana/gui/layout_utility.hpp>
|
#include <nana/gui/layout_utility.hpp>
|
||||||
|
#include <nana/gui/screen.hpp>
|
||||||
|
|
||||||
namespace nana
|
namespace nana
|
||||||
{
|
{
|
||||||
@ -198,16 +199,14 @@ namespace nana
|
|||||||
return widget_;
|
return widget_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void attach(widget* wd, nana::paint::graphics* graph)
|
void attach(widget& wd, nana::paint::graphics& graph)
|
||||||
{
|
{
|
||||||
if(wd)
|
widget_ = &wd;
|
||||||
{
|
wd.events().mouse_wheel.connect_unignorable([this](const arg_wheel& arg){
|
||||||
widget_ = wd;
|
|
||||||
wd->events().mouse_wheel.connect_unignorable([this](const arg_wheel& arg){
|
|
||||||
scroll_items(arg.upwards);
|
scroll_items(arg.upwards);
|
||||||
});
|
});
|
||||||
}
|
|
||||||
if(graph) graph_ = graph;
|
graph_ = &graph;
|
||||||
}
|
}
|
||||||
|
|
||||||
void detach()
|
void detach()
|
||||||
@ -219,9 +218,46 @@ namespace nana
|
|||||||
{
|
{
|
||||||
if(module_)
|
if(module_)
|
||||||
{
|
{
|
||||||
std::size_t items = (module_->max_items <= module_->items.size() ? module_->max_items : module_->items.size());
|
|
||||||
std::size_t h = items * state_.renderer->item_pixels(*graph_);
|
auto const items = (module_->max_items <= module_->items.size() ? module_->max_items : module_->items.size());
|
||||||
widget_->size(size{ widget_->size().width, static_cast<unsigned>(h + 4) });
|
|
||||||
|
rectangle list_r{
|
||||||
|
0, 0,
|
||||||
|
widget_->size().width,
|
||||||
|
static_cast<unsigned>(items * state_.renderer->item_pixels(*graph_)) + 4
|
||||||
|
};
|
||||||
|
|
||||||
|
//Test if the listbox excesses the screen
|
||||||
|
|
||||||
|
screen scr;
|
||||||
|
auto & disp = scr.from_window(*widget_);
|
||||||
|
|
||||||
|
auto disp_r = disp.area();
|
||||||
|
|
||||||
|
point pos;
|
||||||
|
API::calc_screen_point(*widget_, pos);
|
||||||
|
list_r.position(pos);
|
||||||
|
|
||||||
|
if (widget_->size().width >= disp_r.width)
|
||||||
|
{
|
||||||
|
pos.x = 0;
|
||||||
|
list_r.width = disp_r.width;
|
||||||
|
}
|
||||||
|
else if (list_r.right() > disp_r.right())
|
||||||
|
pos.x = disp_r.right() - static_cast<int>(list_r.width);
|
||||||
|
|
||||||
|
if (list_r.height >= disp_r.height)
|
||||||
|
{
|
||||||
|
pos.y = 0;
|
||||||
|
list_r.height = disp_r.height;
|
||||||
|
}
|
||||||
|
else if (list_r.bottom() > disp_r.bottom())
|
||||||
|
pos.y = disp_r.bottom() - static_cast<int>(list_r.height);
|
||||||
|
|
||||||
|
API::calc_window_point(API::get_owner_window(*widget_), pos);
|
||||||
|
list_r.position(pos);
|
||||||
|
|
||||||
|
widget_->move(list_r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -312,8 +348,12 @@ namespace nana
|
|||||||
|
|
||||||
void _m_open_scrollbar(widget_reference wd, bool v)
|
void _m_open_scrollbar(widget_reference wd, bool v)
|
||||||
{
|
{
|
||||||
if(v)
|
if (!v)
|
||||||
{
|
{
|
||||||
|
scrollbar_.close();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(scrollbar_.empty() && module_)
|
if(scrollbar_.empty() && module_)
|
||||||
{
|
{
|
||||||
scrollbar_.create(wd, rectangle(static_cast<int>(wd.size().width - 18), 2, 16, wd.size().height - 4));
|
scrollbar_.create(wd, rectangle(static_cast<int>(wd.size().width - 18), 2, 16, wd.size().height - 4));
|
||||||
@ -340,9 +380,6 @@ namespace nana
|
|||||||
events.mouse_up.connect(fn);
|
events.mouse_up.connect(fn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
scrollbar_.close();
|
|
||||||
}
|
|
||||||
private:
|
private:
|
||||||
widget * widget_{nullptr};
|
widget * widget_{nullptr};
|
||||||
nana::paint::graphics * graph_{nullptr};
|
nana::paint::graphics * graph_{nullptr};
|
||||||
@ -393,7 +430,7 @@ namespace nana
|
|||||||
|
|
||||||
void trigger::attached(widget_reference widget, graph_reference graph)
|
void trigger::attached(widget_reference widget, graph_reference graph)
|
||||||
{
|
{
|
||||||
drawer_->attach(&widget, &graph);
|
drawer_->attach(widget, graph);
|
||||||
}
|
}
|
||||||
|
|
||||||
void trigger::detached()
|
void trigger::detached()
|
||||||
|
|||||||
@ -3931,6 +3931,11 @@ namespace nana
|
|||||||
essence_->content_view.reset(new widgets::skeletons::content_view{ widget.handle() });
|
essence_->content_view.reset(new widgets::skeletons::content_view{ widget.handle() });
|
||||||
essence_->resize_disp_area();
|
essence_->resize_disp_area();
|
||||||
|
|
||||||
|
//Set the content_view wheel speed with the listbox scheme.
|
||||||
|
essence_->content_view->set_wheel_speed([this] {
|
||||||
|
return essence_->scheme_ptr->mouse_wheel.lines;
|
||||||
|
});
|
||||||
|
|
||||||
essence_->content_view->events().hover_outside = [this](const point& cur_pos) {
|
essence_->content_view->events().hover_outside = [this](const point& cur_pos) {
|
||||||
essence_->update_mouse_selection(cur_pos);
|
essence_->update_mouse_selection(cur_pos);
|
||||||
};
|
};
|
||||||
@ -4166,16 +4171,17 @@ namespace nana
|
|||||||
{
|
{
|
||||||
if (item_ptr->flags.selected != sel)
|
if (item_ptr->flags.selected != sel)
|
||||||
{
|
{
|
||||||
item_ptr->flags.selected = sel;
|
if (sel)
|
||||||
lister.emit_cs(abs_item_pos, true);
|
|
||||||
|
|
||||||
if (item_ptr->flags.selected)
|
|
||||||
{
|
{
|
||||||
|
//Deselects the previously selected item.
|
||||||
lister.cancel_others_if_single_enabled(true, abs_item_pos);
|
lister.cancel_others_if_single_enabled(true, abs_item_pos);
|
||||||
essence_->lister.latest_selected_abs = abs_item_pos;
|
essence_->lister.latest_selected_abs = abs_item_pos;
|
||||||
}
|
}
|
||||||
else if (essence_->lister.latest_selected_abs == abs_item_pos)
|
else if (essence_->lister.latest_selected_abs == abs_item_pos)
|
||||||
essence_->lister.latest_selected_abs.set_both(npos);
|
essence_->lister.latest_selected_abs.set_both(npos);
|
||||||
|
|
||||||
|
item_ptr->flags.selected = sel;
|
||||||
|
lister.emit_cs(abs_item_pos, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@ -403,8 +403,15 @@ namespace nana
|
|||||||
ess_->state.nullify_mouse = true;
|
ess_->state.nullify_mouse = true;
|
||||||
|
|
||||||
auto & menu_ptr = ess_->state.menu;
|
auto & menu_ptr = ess_->state.menu;
|
||||||
|
|
||||||
|
//menu_wd will be assigned with the handle of a menu window,
|
||||||
|
//It is used for checking whether the menu is closed. A menu handler
|
||||||
|
//may close the form, checking with the data member of this trigger
|
||||||
|
//is invalid, because the form is closed, the object of menubar may not exist.
|
||||||
|
window menu_wd = nullptr;
|
||||||
if(ess_->state.menu)
|
if(ess_->state.menu)
|
||||||
{
|
{
|
||||||
|
menu_wd = menu_ptr->handle();
|
||||||
switch(arg.key)
|
switch(arg.key)
|
||||||
{
|
{
|
||||||
case keyboard::os_arrow_down:
|
case keyboard::os_arrow_down:
|
||||||
@ -467,7 +474,10 @@ namespace nana
|
|||||||
case keyboard::os_arrow_down:
|
case keyboard::os_arrow_down:
|
||||||
case keyboard::enter:
|
case keyboard::enter:
|
||||||
if (ess_->open_menu(true))
|
if (ess_->open_menu(true))
|
||||||
|
{
|
||||||
|
menu_wd = menu_ptr->handle();
|
||||||
menu_ptr->goto_next(true);
|
menu_ptr->goto_next(true);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case keyboard::escape:
|
case keyboard::escape:
|
||||||
if(essence::behavior::focus == ess_->state.behave)
|
if(essence::behavior::focus == ess_->state.behave)
|
||||||
@ -482,15 +492,21 @@ namespace nana
|
|||||||
{
|
{
|
||||||
ess_->state.active = index;
|
ess_->state.active = index;
|
||||||
if (ess_->open_menu(true))
|
if (ess_->open_menu(true))
|
||||||
|
{
|
||||||
|
menu_wd = menu_ptr->handle();
|
||||||
menu_ptr->goto_next(true);
|
menu_ptr->goto_next(true);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (API::is_window(menu_wd))
|
||||||
|
{
|
||||||
refresh(graph);
|
refresh(graph);
|
||||||
API::dev::lazy_refresh();
|
API::dev::lazy_refresh();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void trigger::key_release(graph_reference graph, const arg_keyboard& arg)
|
void trigger::key_release(graph_reference graph, const arg_keyboard& arg)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -29,7 +29,6 @@ namespace nana
|
|||||||
struct implement
|
struct implement
|
||||||
{
|
{
|
||||||
widget* wdg_ptr{nullptr};
|
widget* wdg_ptr{nullptr};
|
||||||
paint::graphics* graph_ptr{nullptr};
|
|
||||||
std::unique_ptr<content_measurer> measurer;
|
std::unique_ptr<content_measurer> measurer;
|
||||||
|
|
||||||
struct gradual_bground_tag
|
struct gradual_bground_tag
|
||||||
@ -48,6 +47,23 @@ namespace nana
|
|||||||
std::unique_ptr<element::bground> bground; //If it is not a null ptr, the widget is stretchable mode
|
std::unique_ptr<element::bground> bground; //If it is not a null ptr, the widget is stretchable mode
|
||||||
bool stretchable{ false }; //If it is true, the widget is stretchable mode without changing aspect ratio.
|
bool stretchable{ false }; //If it is true, the widget is stretchable mode without changing aspect ratio.
|
||||||
}backimg;
|
}backimg;
|
||||||
|
|
||||||
|
void draw_background(paint::graphics& graph, const size& dimension)
|
||||||
|
{
|
||||||
|
if (!API::dev::copy_transparent_background(*wdg_ptr, graph))
|
||||||
|
{
|
||||||
|
auto const graph_size = graph.size();
|
||||||
|
if (dimension.width < graph_size.width || dimension.height < graph_size.height || backimg.image.alpha())
|
||||||
|
{
|
||||||
|
if (gradual_bground.gradual_from.invisible() || gradual_bground.gradual_to.invisible())
|
||||||
|
graph.rectangle(true, wdg_ptr->bgcolor());
|
||||||
|
else if (gradual_bground.gradual_from == gradual_bground.gradual_to)
|
||||||
|
graph.rectangle(true, gradual_bground.gradual_from);
|
||||||
|
else
|
||||||
|
graph.gradual_rectangle(::nana::rectangle{graph_size }, gradual_bground.gradual_from, gradual_bground.gradual_to, !gradual_bground.horizontal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class content_measurer
|
class content_measurer
|
||||||
@ -88,32 +104,36 @@ namespace nana
|
|||||||
delete impl_;
|
delete impl_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawer::attached(widget_reference& wdg, graph_reference graph)
|
void drawer::attached(widget_reference& wdg, graph_reference)
|
||||||
{
|
{
|
||||||
impl_->wdg_ptr = &wdg;
|
impl_->wdg_ptr = &wdg;
|
||||||
impl_->graph_ptr = &graph;
|
|
||||||
API::dev::set_measurer(wdg, impl_->measurer.get());
|
API::dev::set_measurer(wdg, impl_->measurer.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawer::refresh(graph_reference graph)
|
void drawer::refresh(graph_reference graph)
|
||||||
{
|
{
|
||||||
if (!graph.changed())
|
auto const graphsize = graph.size();
|
||||||
return;
|
|
||||||
|
|
||||||
auto graphsize = graph.size();
|
|
||||||
|
|
||||||
auto & backimg = impl_->backimg;
|
auto & backimg = impl_->backimg;
|
||||||
|
|
||||||
if (!backimg.bground)
|
if (!backimg.bground)
|
||||||
{
|
{
|
||||||
|
if (backimg.image.empty())
|
||||||
|
{
|
||||||
|
impl_->draw_background(graph, {});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
auto valid_area = backimg.valid_area;
|
auto valid_area = backimg.valid_area;
|
||||||
if (valid_area.empty())
|
if (valid_area.empty())
|
||||||
valid_area.dimension(backimg.image.size());
|
valid_area.dimension(backimg.image.size());
|
||||||
|
|
||||||
|
//The position where the image to be drawn.
|
||||||
|
::nana::point pos;
|
||||||
|
|
||||||
if (backimg.stretchable)
|
if (backimg.stretchable)
|
||||||
{
|
{
|
||||||
auto fit_size = fit_zoom({ valid_area.width, valid_area.height }, graphsize);
|
auto fit_size = fit_zoom(valid_area.dimension(), graphsize);
|
||||||
::nana::point pos;
|
|
||||||
|
|
||||||
if (fit_size.width != graphsize.width)
|
if (fit_size.width != graphsize.width)
|
||||||
{
|
{
|
||||||
@ -142,15 +162,12 @@ namespace nana
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_m_draw_background(fit_size.width, fit_size.height);
|
impl_->draw_background(graph, fit_size);
|
||||||
|
|
||||||
backimg.image.stretch(valid_area, graph, ::nana::rectangle{ pos, fit_size });
|
backimg.image.stretch(valid_area, graph, ::nana::rectangle{ pos, fit_size });
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//The point in which position the image to be drawn.
|
|
||||||
::nana::point pos;
|
|
||||||
|
|
||||||
switch (backimg.align_horz)
|
switch (backimg.align_horz)
|
||||||
{
|
{
|
||||||
case ::nana::align::left: break;
|
case ::nana::align::left: break;
|
||||||
@ -173,15 +190,14 @@ namespace nana
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
_m_draw_background(valid_area.width, valid_area.height);
|
impl_->draw_background(graph, valid_area.dimension());
|
||||||
|
|
||||||
if ( ! backimg.image.empty())
|
|
||||||
backimg.image.paste(valid_area, graph, pos);
|
backimg.image.paste(valid_area, graph, pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_m_draw_background(graphsize.width, graphsize.height);
|
impl_->draw_background(graph, graphsize);
|
||||||
|
|
||||||
color invalid_clr_for_call;
|
color invalid_clr_for_call;
|
||||||
backimg.bground->draw(graph, invalid_clr_for_call, invalid_clr_for_call, rectangle{ graphsize }, element_state::normal);
|
backimg.bground->draw(graph, invalid_clr_for_call, invalid_clr_for_call, rectangle{ graphsize }, element_state::normal);
|
||||||
@ -189,25 +205,6 @@ namespace nana
|
|||||||
|
|
||||||
graph.setsta();
|
graph.setsta();
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawer::_m_draw_background(unsigned w, unsigned h)
|
|
||||||
{
|
|
||||||
auto graph = impl_->graph_ptr;
|
|
||||||
|
|
||||||
if (graph && (!API::dev::copy_transparent_background(*impl_->wdg_ptr, *graph)))
|
|
||||||
{
|
|
||||||
if (w < graph->size().width || h < graph->size().height || impl_->backimg.image.alpha())
|
|
||||||
{
|
|
||||||
auto & bground = impl_->gradual_bground;
|
|
||||||
if (bground.gradual_from.invisible() || bground.gradual_to.invisible())
|
|
||||||
graph->rectangle(true, impl_->wdg_ptr->bgcolor());
|
|
||||||
else if (bground.gradual_from == bground.gradual_to)
|
|
||||||
graph->rectangle(true, bground.gradual_from);
|
|
||||||
else
|
|
||||||
graph->gradual_rectangle(::nana::rectangle{ graph->size() }, bground.gradual_from, bground.gradual_to, !bground.horizontal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//end class drawer
|
//end class drawer
|
||||||
}//end namespace picture
|
}//end namespace picture
|
||||||
}//end namespace drawerbase
|
}//end namespace drawerbase
|
||||||
@ -233,12 +230,8 @@ namespace nana
|
|||||||
if (backimg.bground)
|
if (backimg.bground)
|
||||||
backimg.bground->image(backimg.image, true, valid_area);
|
backimg.bground->image(backimg.image, true, valid_area);
|
||||||
|
|
||||||
if (handle())
|
|
||||||
{
|
|
||||||
get_drawer_trigger().impl_->graph_ptr->set_changed();
|
|
||||||
API::refresh_window(*this);
|
API::refresh_window(*this);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void picture::align(::nana::align horz, align_v vert)
|
void picture::align(::nana::align horz, align_v vert)
|
||||||
{
|
{
|
||||||
@ -252,18 +245,11 @@ namespace nana
|
|||||||
backimg.align_horz = horz;
|
backimg.align_horz = horz;
|
||||||
backimg.align_vert = vert;
|
backimg.align_vert = vert;
|
||||||
|
|
||||||
if (handle())
|
|
||||||
{
|
|
||||||
get_drawer_trigger().impl_->graph_ptr->set_changed();
|
|
||||||
API::refresh_window(*this);
|
API::refresh_window(*this);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void picture::stretchable(unsigned left, unsigned top, unsigned right, unsigned bottom)
|
void picture::stretchable(unsigned left, unsigned top, unsigned right, unsigned bottom)
|
||||||
{
|
{
|
||||||
if (!handle())
|
|
||||||
return;
|
|
||||||
|
|
||||||
internal_scope_guard lock;
|
internal_scope_guard lock;
|
||||||
auto & backimg = get_drawer_trigger().impl_->backimg;
|
auto & backimg = get_drawer_trigger().impl_->backimg;
|
||||||
if (!backimg.bground)
|
if (!backimg.bground)
|
||||||
@ -275,12 +261,9 @@ namespace nana
|
|||||||
|
|
||||||
backimg.bground->stretch_parts(left, top, right, bottom);
|
backimg.bground->stretch_parts(left, top, right, bottom);
|
||||||
backimg.stretchable = false;
|
backimg.stretchable = false;
|
||||||
if (handle())
|
|
||||||
{
|
|
||||||
get_drawer_trigger().impl_->graph_ptr->set_changed();
|
|
||||||
API::refresh_window(*this);
|
API::refresh_window(*this);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void picture::stretchable(bool enables)
|
void picture::stretchable(bool enables)
|
||||||
{
|
{
|
||||||
@ -290,12 +273,8 @@ namespace nana
|
|||||||
backimg.bground.reset();
|
backimg.bground.reset();
|
||||||
|
|
||||||
backimg.stretchable = enables;
|
backimg.stretchable = enables;
|
||||||
if (handle())
|
|
||||||
{
|
|
||||||
get_drawer_trigger().impl_->graph_ptr->set_changed();
|
|
||||||
API::refresh_window(*this);
|
API::refresh_window(*this);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void picture::set_gradual_background(const ::nana::color& from, const ::nana::color& to, bool horizontal)
|
void picture::set_gradual_background(const ::nana::color& from, const ::nana::color& to, bool horizontal)
|
||||||
{
|
{
|
||||||
@ -303,12 +282,9 @@ namespace nana
|
|||||||
bground.gradual_from = from;
|
bground.gradual_from = from;
|
||||||
bground.gradual_to = to;
|
bground.gradual_to = to;
|
||||||
bground.horizontal = horizontal;
|
bground.horizontal = horizontal;
|
||||||
if (handle())
|
|
||||||
{
|
|
||||||
get_drawer_trigger().impl_->graph_ptr->set_changed();
|
|
||||||
API::refresh_window(*this);
|
API::refresh_window(*this);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void picture::transparent(bool enabled)
|
void picture::transparent(bool enabled)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -91,20 +91,27 @@ namespace nana
|
|||||||
{
|
{
|
||||||
return value_px_;
|
return value_px_;
|
||||||
}
|
}
|
||||||
private:
|
|
||||||
void _m_try_refresh()
|
|
||||||
{
|
|
||||||
if (nullptr == widget_)
|
|
||||||
return;
|
|
||||||
|
|
||||||
|
bool value_px_sync()
|
||||||
|
{
|
||||||
|
if (widget_)
|
||||||
|
{
|
||||||
auto value_px = (widget_->size().width - border_px * 2) * value_ / max_;
|
auto value_px = (widget_->size().width - border_px * 2) * value_ / max_;
|
||||||
|
|
||||||
if (value_px != value_px_)
|
if (value_px != value_px_)
|
||||||
{
|
{
|
||||||
value_px_ = value_px;
|
value_px_ = value_px;
|
||||||
API::refresh_window(*widget_);
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
void _m_try_refresh()
|
||||||
|
{
|
||||||
|
if (value_px_sync())
|
||||||
|
API::refresh_window(*widget_);
|
||||||
|
}
|
||||||
private:
|
private:
|
||||||
nana::progress * widget_{ nullptr };
|
nana::progress * widget_{ nullptr };
|
||||||
unsigned max_{ 100 };
|
unsigned max_{ 100 };
|
||||||
@ -144,6 +151,9 @@ namespace nana
|
|||||||
auto rt_bground = rt_val;
|
auto rt_bground = rt_val;
|
||||||
if (false == progress_->unknown(nullptr))
|
if (false == progress_->unknown(nullptr))
|
||||||
{
|
{
|
||||||
|
//Sync the value_px otherwise the progress is incorrect when it is resized.
|
||||||
|
progress_->value_px_sync();
|
||||||
|
|
||||||
rt_bground.x = static_cast<int>(progress_->value_px()) + static_cast<int>(border_px);
|
rt_bground.x = static_cast<int>(progress_->value_px()) + static_cast<int>(border_px);
|
||||||
rt_bground.width -= progress_->value_px();
|
rt_bground.width -= progress_->value_px();
|
||||||
|
|
||||||
|
|||||||
@ -556,6 +556,7 @@ namespace nana{ namespace widgets
|
|||||||
virtual void merge_lines(std::size_t first, std::size_t second) = 0;
|
virtual void merge_lines(std::size_t first, std::size_t second) = 0;
|
||||||
//Calculates how many lines the specified line of text takes with a specified pixels of width.
|
//Calculates how many lines the specified line of text takes with a specified pixels of width.
|
||||||
virtual void add_lines(std::size_t pos, std::size_t lines) = 0;
|
virtual void add_lines(std::size_t pos, std::size_t lines) = 0;
|
||||||
|
virtual void prepare() = 0;
|
||||||
virtual void pre_calc_line(std::size_t line, unsigned pixels) = 0;
|
virtual void pre_calc_line(std::size_t line, unsigned pixels) = 0;
|
||||||
virtual void pre_calc_lines(unsigned pixels) = 0;
|
virtual void pre_calc_lines(unsigned pixels) = 0;
|
||||||
virtual std::size_t take_lines() const = 0;
|
virtual std::size_t take_lines() const = 0;
|
||||||
@ -668,6 +669,12 @@ namespace nana{ namespace widgets
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void prepare() override
|
||||||
|
{
|
||||||
|
auto const line_count = editor_.textbase().lines();
|
||||||
|
this->sections_.resize(line_count);
|
||||||
|
}
|
||||||
|
|
||||||
void pre_calc_line(std::size_t pos, unsigned) override
|
void pre_calc_line(std::size_t pos, unsigned) override
|
||||||
{
|
{
|
||||||
auto const & text = editor_.textbase().getline(pos);
|
auto const & text = editor_.textbase().getline(pos);
|
||||||
@ -781,6 +788,12 @@ namespace nana{ namespace widgets
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void prepare() override
|
||||||
|
{
|
||||||
|
auto const lines = editor_.textbase().lines();
|
||||||
|
linemtr_.resize(lines);
|
||||||
|
}
|
||||||
|
|
||||||
void pre_calc_line(std::size_t line, unsigned pixels) override
|
void pre_calc_line(std::size_t line, unsigned pixels) override
|
||||||
{
|
{
|
||||||
const string_type& lnstr = editor_.textbase().getline(line);
|
const string_type& lnstr = editor_.textbase().getline(line);
|
||||||
@ -1220,7 +1233,7 @@ namespace nana{ namespace widgets
|
|||||||
case keyboard::os_pagedown:
|
case keyboard::os_pagedown:
|
||||||
_m_handle_move_key(arg);
|
_m_handle_move_key(arg);
|
||||||
break;
|
break;
|
||||||
case keyboard::os_del:
|
case keyboard::del:
|
||||||
// send delete to set_accept function
|
// send delete to set_accept function
|
||||||
if (this->attr().editable && (!impl_->capacities.pred_acceptive || impl_->capacities.pred_acceptive(key)))
|
if (this->attr().editable && (!impl_->capacities.pred_acceptive || impl_->capacities.pred_acceptive(key)))
|
||||||
del();
|
del();
|
||||||
@ -1234,7 +1247,7 @@ namespace nana{ namespace widgets
|
|||||||
|
|
||||||
void text_editor::typeface_changed()
|
void text_editor::typeface_changed()
|
||||||
{
|
{
|
||||||
impl_->capacities.behavior->pre_calc_lines(width_pixels());
|
_m_reset_content_size(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void text_editor::indent(bool enb, std::function<std::string()> generator)
|
void text_editor::indent(bool enb, std::function<std::string()> generator)
|
||||||
@ -1676,7 +1689,7 @@ namespace nana{ namespace widgets
|
|||||||
impl_->try_refresh = sync_graph::refresh;
|
impl_->try_refresh = sync_graph::refresh;
|
||||||
|
|
||||||
//_m_put calcs the lines
|
//_m_put calcs the lines
|
||||||
_m_reset_content_size(false);
|
_m_reset_content_size(true);
|
||||||
impl_->cview->sync(false);
|
impl_->cview->sync(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2886,10 +2899,14 @@ namespace nana{ namespace widgets
|
|||||||
auto text_lines = textbase().lines();
|
auto text_lines = textbase().lines();
|
||||||
if (text_lines <= max_lines)
|
if (text_lines <= max_lines)
|
||||||
{
|
{
|
||||||
|
impl_->capacities.behavior->prepare();
|
||||||
|
|
||||||
|
auto const width_px = _m_width_px(true);
|
||||||
|
|
||||||
std::size_t lines = 0;
|
std::size_t lines = 0;
|
||||||
for (std::size_t i = 0; i < text_lines; ++i)
|
for (std::size_t i = 0; i < text_lines; ++i)
|
||||||
{
|
{
|
||||||
impl_->capacities.behavior->pre_calc_line(i, csize.width);
|
impl_->capacities.behavior->pre_calc_line(i, width_px);
|
||||||
lines += impl_->capacities.behavior->take_lines(i);
|
lines += impl_->capacities.behavior->take_lines(i);
|
||||||
|
|
||||||
if (lines > max_lines)
|
if (lines > max_lines)
|
||||||
|
|||||||
@ -561,6 +561,12 @@ namespace nana
|
|||||||
API::dev::lazy_refresh();
|
API::dev::lazy_refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void drawer::dbl_click(graph_reference, const arg_mouse& arg)
|
||||||
|
{
|
||||||
|
if (impl_->mouse_button(arg, true))
|
||||||
|
API::dev::lazy_refresh();
|
||||||
|
}
|
||||||
|
|
||||||
void drawer::mouse_down(graph_reference, const arg_mouse& arg)
|
void drawer::mouse_down(graph_reference, const arg_mouse& arg)
|
||||||
{
|
{
|
||||||
if (impl_->mouse_button(arg, true))
|
if (impl_->mouse_button(arg, true))
|
||||||
@ -599,8 +605,11 @@ namespace nana
|
|||||||
{
|
{
|
||||||
impl_->editor()->respond_char(arg);
|
impl_->editor()->respond_char(arg);
|
||||||
if (impl_->editor()->try_refresh())
|
if (impl_->editor()->try_refresh())
|
||||||
|
{
|
||||||
|
impl_->draw_spins();
|
||||||
API::dev::lazy_refresh();
|
API::dev::lazy_refresh();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void drawer::resized(graph_reference, const arg_resized&)
|
void drawer::resized(graph_reference, const arg_resized&)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -435,7 +435,23 @@ namespace drawerbase {
|
|||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
//a native wstring version textbox::append
|
||||||
|
textbox& textbox::append(const std::wstring& text, bool at_caret)
|
||||||
|
{
|
||||||
|
internal_scope_guard lock;
|
||||||
|
auto editor = get_drawer_trigger().editor();
|
||||||
|
if(editor)
|
||||||
|
{
|
||||||
|
if(at_caret == false)
|
||||||
|
editor->move_caret_end(false);
|
||||||
|
|
||||||
|
editor->put(text);
|
||||||
|
|
||||||
|
editor->try_refresh();
|
||||||
|
API::update_window(this->handle());
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
/// Determine wheter the text is auto-line changed.
|
/// Determine wheter the text is auto-line changed.
|
||||||
bool textbox::line_wrapped() const
|
bool textbox::line_wrapped() const
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1825,7 +1825,6 @@ namespace nana
|
|||||||
item_locator nl(impl_, xpos, arg.pos.x, arg.pos.y);
|
item_locator nl(impl_, xpos, arg.pos.x, arg.pos.y);
|
||||||
impl_->attr.tree_cont.for_each<item_locator&>(shape.first, nl);
|
impl_->attr.tree_cont.for_each<item_locator&>(shape.first, nl);
|
||||||
|
|
||||||
bool has_redraw = false;
|
|
||||||
|
|
||||||
auto & node_state = impl_->node_state;
|
auto & node_state = impl_->node_state;
|
||||||
node_state.pressed_node = nl.node();
|
node_state.pressed_node = nl.node();
|
||||||
@ -1834,22 +1833,18 @@ namespace nana
|
|||||||
{
|
{
|
||||||
if(impl_->set_expanded(node_state.pressed_node, !node_state.pressed_node->value.second.expanded))
|
if(impl_->set_expanded(node_state.pressed_node, !node_state.pressed_node->value.second.expanded))
|
||||||
impl_->make_adjust(node_state.pressed_node, 0);
|
impl_->make_adjust(node_state.pressed_node, 0);
|
||||||
|
|
||||||
has_redraw = true; //btw, don't select the node
|
|
||||||
}
|
}
|
||||||
|
else if (node_state.selected != node_state.pressed_node)
|
||||||
if ((!has_redraw) && (node_state.selected != node_state.pressed_node))
|
|
||||||
{
|
{
|
||||||
impl_->set_selected(node_state.pressed_node);
|
impl_->set_selected(node_state.pressed_node);
|
||||||
has_redraw = true;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
if(has_redraw)
|
|
||||||
{
|
|
||||||
impl_->draw(true);
|
impl_->draw(true);
|
||||||
API::dev::lazy_refresh();
|
API::dev::lazy_refresh();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void trigger::mouse_up(graph_reference, const arg_mouse& arg)
|
void trigger::mouse_up(graph_reference, const arg_mouse& arg)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -240,12 +240,16 @@ namespace paint
|
|||||||
graphics::graphics(graphics&& other)
|
graphics::graphics(graphics&& other)
|
||||||
: impl_(std::move(other.impl_))
|
: impl_(std::move(other.impl_))
|
||||||
{
|
{
|
||||||
|
other.impl_.reset(new implementation);
|
||||||
}
|
}
|
||||||
|
|
||||||
graphics& graphics::operator=(graphics&& other)
|
graphics& graphics::operator=(graphics&& other)
|
||||||
{
|
{
|
||||||
if (this != &other)
|
if (this != &other)
|
||||||
|
{
|
||||||
impl_ = std::move(other.impl_);
|
impl_ = std::move(other.impl_);
|
||||||
|
other.impl_.reset(new implementation);
|
||||||
|
}
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@ -265,9 +269,9 @@ namespace paint
|
|||||||
return (!impl_->handle);
|
return (!impl_->handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
graphics::operator const void *() const
|
graphics::operator bool() const noexcept
|
||||||
{
|
{
|
||||||
return impl_->handle;
|
return (impl_->handle != nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
drawable_type graphics::handle() const
|
drawable_type graphics::handle() const
|
||||||
@ -287,6 +291,12 @@ namespace paint
|
|||||||
return (impl_->handle ? impl_->handle->context : nullptr);
|
return (impl_->handle ? impl_->handle->context : nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void graphics::swap(graphics& other) noexcept
|
||||||
|
{
|
||||||
|
if (context() != other.context())
|
||||||
|
impl_.swap(other.impl_);
|
||||||
|
}
|
||||||
|
|
||||||
void graphics::make(const ::nana::size& sz)
|
void graphics::make(const ::nana::size& sz)
|
||||||
{
|
{
|
||||||
if (impl_->handle == nullptr || impl_->size != sz)
|
if (impl_->handle == nullptr || impl_->size != sz)
|
||||||
@ -298,7 +308,8 @@ namespace paint
|
|||||||
}
|
}
|
||||||
|
|
||||||
//The object will be delete while dwptr_ is performing a release.
|
//The object will be delete while dwptr_ is performing a release.
|
||||||
drawable_type dw = new nana::detail::drawable_impl_type;
|
std::shared_ptr<nana::detail::drawable_impl_type> dw{ new nana::detail::drawable_impl_type, detail::drawable_deleter{} };
|
||||||
|
|
||||||
//Reuse the old font
|
//Reuse the old font
|
||||||
if (impl_->platform_drawable)
|
if (impl_->platform_drawable)
|
||||||
{
|
{
|
||||||
@ -310,8 +321,13 @@ namespace paint
|
|||||||
dw->font = impl_->font_shadow.impl_->real_font;
|
dw->font = impl_->font_shadow.impl_->real_font;
|
||||||
|
|
||||||
#if defined(NANA_WINDOWS)
|
#if defined(NANA_WINDOWS)
|
||||||
HDC hdc = ::GetDC(0);
|
HDC hdc = ::GetDC(nullptr);
|
||||||
HDC cdc = ::CreateCompatibleDC(hdc);
|
HDC cdc = ::CreateCompatibleDC(hdc);
|
||||||
|
if (nullptr == cdc)
|
||||||
|
{
|
||||||
|
::ReleaseDC(nullptr, hdc);
|
||||||
|
throw std::bad_alloc{};
|
||||||
|
}
|
||||||
|
|
||||||
BITMAPINFO bmi;
|
BITMAPINFO bmi;
|
||||||
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
||||||
@ -324,34 +340,60 @@ namespace paint
|
|||||||
|
|
||||||
HBITMAP bmp = ::CreateDIBSection(cdc, &bmi, DIB_RGB_COLORS, reinterpret_cast<void**>(&(dw->pixbuf_ptr)), 0, 0);
|
HBITMAP bmp = ::CreateDIBSection(cdc, &bmi, DIB_RGB_COLORS, reinterpret_cast<void**>(&(dw->pixbuf_ptr)), 0, 0);
|
||||||
|
|
||||||
if(bmp)
|
if (nullptr == bmp)
|
||||||
{
|
{
|
||||||
|
::DeleteDC(cdc);
|
||||||
|
::ReleaseDC(nullptr, hdc);
|
||||||
|
throw std::bad_alloc{};
|
||||||
|
}
|
||||||
|
|
||||||
::DeleteObject((HBITMAP)::SelectObject(cdc, bmp));
|
::DeleteObject((HBITMAP)::SelectObject(cdc, bmp));
|
||||||
::DeleteObject(::SelectObject(cdc, dw->font->native_handle()));
|
::DeleteObject(::SelectObject(cdc, dw->font->native_handle()));
|
||||||
|
|
||||||
dw->context = cdc;
|
dw->context = cdc;
|
||||||
dw->pixmap = bmp;
|
dw->pixmap = bmp;
|
||||||
::SetBkMode(cdc, TRANSPARENT);
|
::SetBkMode(cdc, TRANSPARENT);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
::DeleteDC(cdc);
|
|
||||||
delete dw;
|
|
||||||
dw = nullptr;
|
|
||||||
release();
|
|
||||||
}
|
|
||||||
|
|
||||||
::ReleaseDC(0, hdc);
|
::ReleaseDC(0, hdc);
|
||||||
#elif defined(NANA_X11)
|
#elif defined(NANA_X11)
|
||||||
auto & spec = nana::detail::platform_spec::instance();
|
auto & spec = nana::detail::platform_spec::instance();
|
||||||
|
{
|
||||||
|
nana::detail::platform_scope_guard psg;
|
||||||
|
|
||||||
|
spec.set_error_handler();
|
||||||
|
|
||||||
Display* disp = spec.open_display();
|
Display* disp = spec.open_display();
|
||||||
int screen = DefaultScreen(disp);
|
int screen = DefaultScreen(disp);
|
||||||
Window root = ::XRootWindow(disp, screen);
|
Window root = ::XRootWindow(disp, screen);
|
||||||
dw->pixmap = ::XCreatePixmap(disp, root, sz.width, sz.height, DefaultDepth(disp, screen));
|
auto pixmap = ::XCreatePixmap(disp, root, sz.width, sz.height, DefaultDepth(disp, screen));
|
||||||
dw->context = ::XCreateGC(disp, dw->pixmap, 0, 0);
|
if(spec.error_code)
|
||||||
|
{
|
||||||
|
spec.rev_error_handler();
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
|
auto context = ::XCreateGC(disp, pixmap, 0, 0);
|
||||||
|
if (spec.error_code)
|
||||||
|
{
|
||||||
|
::XFreePixmap(disp, pixmap);
|
||||||
|
spec.rev_error_handler();
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
# if defined(NANA_USE_XFT)
|
# if defined(NANA_USE_XFT)
|
||||||
dw->xftdraw = ::XftDrawCreate(disp, dw->pixmap, spec.screen_visual(), spec.colormap());
|
auto xftdraw = ::XftDrawCreate(disp, pixmap, spec.screen_visual(), spec.colormap());
|
||||||
|
if (spec.error_code)
|
||||||
|
{
|
||||||
|
::XFreeGC(disp, context);
|
||||||
|
::XFreePixmap(disp, pixmap);
|
||||||
|
|
||||||
|
spec.rev_error_handler();
|
||||||
|
throw std::bad_alloc();
|
||||||
|
}
|
||||||
|
|
||||||
|
dw->xftdraw = xftdraw;
|
||||||
# endif
|
# endif
|
||||||
|
dw->pixmap = pixmap;
|
||||||
|
dw->context = context;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
if(dw)
|
if(dw)
|
||||||
{
|
{
|
||||||
@ -362,8 +404,8 @@ namespace paint
|
|||||||
#else
|
#else
|
||||||
dw->update_text_color();
|
dw->update_text_color();
|
||||||
#endif
|
#endif
|
||||||
impl_->platform_drawable.reset(dw, detail::drawable_deleter{});
|
impl_->platform_drawable = dw;
|
||||||
impl_->handle = dw;
|
impl_->handle = dw.get();
|
||||||
impl_->size = sz;
|
impl_->size = sz;
|
||||||
|
|
||||||
impl_->handle->string.tab_pixels = detail::raw_text_extent_size(impl_->handle, L"\t", 1).width;
|
impl_->handle->string.tab_pixels = detail::raw_text_extent_size(impl_->handle, L"\t", 1).width;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user