Merge branch 'develop'
This commit is contained in:
commit
9d49877a74
4
.gitignore
vendored
4
.gitignore
vendored
@ -33,3 +33,7 @@ _ReSharper*/
|
||||
*.suo
|
||||
*.sdf
|
||||
lib/
|
||||
*.ninja*
|
||||
CMakeCache.txt
|
||||
CMakeFiles/
|
||||
cmake_install.cmake
|
||||
|
@ -27,15 +27,20 @@ if(BIICODE)
|
||||
endif()
|
||||
|
||||
# set compile flags
|
||||
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||
if(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")
|
||||
endif(CMAKE_COMPILER_IS_GNUCXX)
|
||||
endif(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
|
||||
|
||||
# we'll use the default config file so we can iliminate the following macro definitions
|
||||
if(MSVC)
|
||||
# More MSVC specific compilation flags
|
||||
add_definitions(-D_SCL_SECURE_NO_WARNINGS)
|
||||
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
|
||||
add_definitions(-D_SCL_SECURE_NO_WARNINGS)
|
||||
add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
|
||||
if(MSVC14)
|
||||
add_definitions(-DSTD_CODECVT_NOT_SUPPORTED)
|
||||
else()
|
||||
add_definitions(-DNOT_IMPLEMENTED_KEYWORD_noexcept)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
add_biicode_targets()
|
||||
@ -50,12 +55,21 @@ cmake_minimum_required(VERSION 2.8)
|
||||
if(WIN32)
|
||||
add_definitions(-DNANA_WINDOWS)
|
||||
add_definitions(-DPLATFORM_SPEC_HPP=<nana/detail/win32/platform_spec.hpp>)
|
||||
|
||||
if(MSVC14)
|
||||
add_definitions(-DSTD_CODECVT_NOT_SUPPORTED)
|
||||
else()
|
||||
add_definitions(-DNOT_IMPLEMENTED_KEYWORD_noexcept)
|
||||
endif()
|
||||
|
||||
#Test if it is MINGW
|
||||
if(MINGW)
|
||||
add_definitions(-DNANA_MINGW)
|
||||
add_definitions(-DSTD_CODECVT_NOT_SUPPORTED)
|
||||
option(NANA_THREAD_NOT_SUPPORTED "Use this flag if MinGW version is older than 4.8.1" ON)
|
||||
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.8.1")
|
||||
option(NANA_THREAD_NOT_SUPPORTED "Use this flag if MinGW version is older than 4.8.1" ON)
|
||||
endif()
|
||||
endif()
|
||||
if(NANA_THREAD_NOT_SUPPORTED)
|
||||
add_definitions(-DSTD_THREAD_NOT_SUPPORTED)
|
||||
endif()
|
||||
@ -123,7 +137,7 @@ execute_process(COMMAND ${CMAKE_COMMAND}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include/nana/)
|
||||
|
||||
if(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")
|
||||
endif(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
|
||||
|
||||
set(NANA_SOURCE_DIR ${CMAKE_SOURCE_DIR}/source)
|
||||
|
@ -14,8 +14,11 @@
|
||||
<Option compiler="gcc" />
|
||||
<Option createDefFile="1" />
|
||||
<Compiler>
|
||||
<Add option="-std=c++11" />
|
||||
<Add option="-Wall" />
|
||||
<Add option="-g" />
|
||||
<Add directory="../../include" />
|
||||
<Add directory="../../extrlib/mingw" />
|
||||
</Compiler>
|
||||
</Target>
|
||||
<Target title="Release">
|
||||
@ -26,8 +29,11 @@
|
||||
<Option compiler="gcc" />
|
||||
<Option createDefFile="1" />
|
||||
<Compiler>
|
||||
<Add option="-Wall" />
|
||||
<Add option="-O2" />
|
||||
<Add option="-std=c++11" />
|
||||
<Add option="-Wall" />
|
||||
<Add directory="../../include" />
|
||||
<Add directory="../../extrlib/mingw" />
|
||||
</Compiler>
|
||||
<Linker>
|
||||
<Add option="-s" />
|
||||
@ -44,7 +50,6 @@
|
||||
<Unit filename="../../source/datetime.cpp" />
|
||||
<Unit filename="../../source/deploy.cpp" />
|
||||
<Unit filename="../../source/detail/platform_spec_selector.cpp" />
|
||||
<Unit filename="../../source/exceptions.cpp" />
|
||||
<Unit filename="../../source/filesystem/file_iterator.cpp" />
|
||||
<Unit filename="../../source/filesystem/fs_utility.cpp" />
|
||||
<Unit filename="../../source/gui/animation.cpp" />
|
||||
@ -102,7 +107,6 @@
|
||||
<Unit filename="../../source/internationalization.cpp" />
|
||||
<Unit filename="../../source/paint/detail/image_process_provider.cpp" />
|
||||
<Unit filename="../../source/paint/detail/native_paint_interface.cpp" />
|
||||
<Unit filename="../../source/paint/gadget.cpp" />
|
||||
<Unit filename="../../source/paint/graphics.cpp" />
|
||||
<Unit filename="../../source/paint/image.cpp" />
|
||||
<Unit filename="../../source/paint/image_process_selector.cpp" />
|
||||
|
@ -537,3 +537,664 @@
|
||||
1399002439 source:d:\privates\nana\release\nana.cpp11\source\gui\detail\element_store.cpp
|
||||
<nana/gui/detail/element_store.hpp>
|
||||
|
||||
1363362719 source:d:\git.repo\nana\source\any.cpp
|
||||
<nana/any.hpp>
|
||||
|
||||
1362509572 source:d:\git.repo\nana\source\audio\detail\audio_device.cpp
|
||||
<nana/audio/detail/audio_device.hpp>
|
||||
<nana/system/platform.hpp>
|
||||
<pthread.h>
|
||||
<unistd.h>
|
||||
<sys/time.h>
|
||||
<errno.h>
|
||||
|
||||
1439496157 source:d:\git.repo\nana\source\audio\detail\audio_stream.cpp
|
||||
<nana/audio/detail/audio_stream.hpp>
|
||||
<nana/charset.hpp>
|
||||
|
||||
1362509721 source:d:\git.repo\nana\source\audio\detail\buffer_preparation.cpp
|
||||
<nana/audio/detail/buffer_preparation.hpp>
|
||||
<cstring>
|
||||
|
||||
1353253406 source:d:\git.repo\nana\source\audio\player.cpp
|
||||
<nana/audio/player.hpp>
|
||||
<nana/audio/detail/audio_stream.hpp>
|
||||
<nana/audio/detail/audio_device.hpp>
|
||||
<nana/audio/detail/buffer_preparation.hpp>
|
||||
<nana/system/platform.hpp>
|
||||
|
||||
1439496157 source:d:\git.repo\nana\source\basic_types.cpp
|
||||
<nana/basic_types.hpp>
|
||||
<regex>
|
||||
<vector>
|
||||
<algorithm>
|
||||
<stdexcept>
|
||||
|
||||
1439496157 source:d:\git.repo\nana\source\charset.cpp
|
||||
<nana/charset.hpp>
|
||||
<utility>
|
||||
<nana/deploy.hpp>
|
||||
<cwchar>
|
||||
<clocale>
|
||||
<codecvt>
|
||||
<windows.h>
|
||||
|
||||
1439496157 source:d:\git.repo\nana\source\datetime.cpp
|
||||
<nana/config.hpp>
|
||||
<nana/datetime.hpp>
|
||||
<windows.h>
|
||||
<cassert>
|
||||
|
||||
1439496157 source:d:\git.repo\nana\source\deploy.cpp
|
||||
<nana/deploy.hpp>
|
||||
<cstdlib>
|
||||
<stdexcept>
|
||||
<windows.h>
|
||||
<string.h>
|
||||
<sstream>
|
||||
|
||||
1439496157 source:d:\git.repo\nana\source\detail\platform_spec_selector.cpp
|
||||
<nana/config.hpp>
|
||||
"win32/platform_spec.cpp"
|
||||
"linux_X11/platform_spec.cpp"
|
||||
|
||||
1443581342 d:\git.repo\nana\source\detail\win32\platform_spec.cpp
|
||||
<nana/config.hpp>
|
||||
<shellapi.h>
|
||||
<stdexcept>
|
||||
<VersionHelpers.h>
|
||||
|
||||
1443581342 d:\git.repo\nana\source\detail\linux_x11\platform_spec.cpp
|
||||
<nana/config.hpp>
|
||||
<X11/Xlocale.h>
|
||||
<locale>
|
||||
<map>
|
||||
<set>
|
||||
<algorithm>
|
||||
<nana/paint/graphics.hpp>
|
||||
<nana/gui/detail/bedrock.hpp>
|
||||
<nana/gui/detail/basic_window.hpp>
|
||||
<nana/system/platform.hpp>
|
||||
<errno.h>
|
||||
<sstream>
|
||||
"msg_dispatcher.hpp"
|
||||
|
||||
1439496157 d:\git.repo\nana\source\detail\linux_x11\msg_dispatcher.hpp
|
||||
<nana/detail/linux_X11/msg_packet.hpp>
|
||||
<nana/system/platform.hpp>
|
||||
<list>
|
||||
<set>
|
||||
<map>
|
||||
<mutex>
|
||||
<condition_variable>
|
||||
<memory>
|
||||
<thread>
|
||||
|
||||
1365203880 source:d:\git.repo\nana\source\exceptions.cpp
|
||||
<nana/exceptions.hpp>
|
||||
|
||||
1365203878 source:d:\git.repo\nana\source\filesystem\file_iterator.cpp
|
||||
<nana/filesystem/file_iterator.hpp>
|
||||
|
||||
1365203878 source:d:\git.repo\nana\source\filesystem\fs_utility.cpp
|
||||
<nana/filesystem/fs_utility.hpp>
|
||||
<nana/filesystem/file_iterator.hpp>
|
||||
<vector>
|
||||
<windows.h>
|
||||
<shlobj.h>
|
||||
<nana/datetime.hpp>
|
||||
<nana/charset.hpp>
|
||||
<sys/stat.h>
|
||||
<sys/types.h>
|
||||
<dirent.h>
|
||||
<cstdio>
|
||||
<cstring>
|
||||
<errno.h>
|
||||
<unistd.h>
|
||||
<stdlib.h>
|
||||
|
||||
1444647306 source:d:\git.repo\nana\source\gui\animation.cpp
|
||||
<nana/gui/animation.hpp>
|
||||
<nana/gui/drawing.hpp>
|
||||
<nana/system/timepiece.hpp>
|
||||
<nana/system/platform.hpp>
|
||||
<vector>
|
||||
<list>
|
||||
<map>
|
||||
<algorithm>
|
||||
<nana/std_thread.hpp>
|
||||
<nana/std_mutex.hpp>
|
||||
<nana/std_condition_variable.hpp>
|
||||
<mutex>
|
||||
<condition_variable>
|
||||
<thread>
|
||||
|
||||
1423350892 source:d:\git.repo\nana\source\gui\basis.cpp
|
||||
<nana/gui/basis.hpp>
|
||||
|
||||
1439496157 source:d:\git.repo\nana\source\gui\detail\basic_window.cpp
|
||||
<nana/gui/detail/basic_window.hpp>
|
||||
<nana/gui/detail/native_window_interface.hpp>
|
||||
|
||||
1444585389 source:d:\git.repo\nana\source\gui\detail\bedrock_pi.cpp
|
||||
<nana/config.hpp>
|
||||
<nana/gui/detail/bedrock_pi_data.hpp>
|
||||
<nana/gui/detail/event_code.hpp>
|
||||
<nana/system/platform.hpp>
|
||||
<sstream>
|
||||
<nana/system/timepiece.hpp>
|
||||
<nana/gui/wvl.hpp>
|
||||
<nana/gui/detail/inner_fwd_implement.hpp>
|
||||
<nana/gui/detail/native_window_interface.hpp>
|
||||
<nana/gui/layout_utility.hpp>
|
||||
<nana/gui/detail/element_store.hpp>
|
||||
<algorithm>
|
||||
|
||||
1439496157 source:d:\git.repo\nana\source\gui\detail\bedrock_selector.cpp
|
||||
<nana/config.hpp>
|
||||
"win32/bedrock.cpp"
|
||||
"linux_X11/bedrock.cpp"
|
||||
|
||||
1444657608 d:\git.repo\nana\source\gui\detail\win32\bedrock.cpp
|
||||
<nana/config.hpp>
|
||||
<nana/gui/detail/bedrock.hpp>
|
||||
<nana/gui/detail/bedrock_pi_data.hpp>
|
||||
<nana/gui/detail/event_code.hpp>
|
||||
<nana/system/platform.hpp>
|
||||
<sstream>
|
||||
<nana/system/timepiece.hpp>
|
||||
<nana/gui.hpp>
|
||||
<nana/gui/detail/inner_fwd_implement.hpp>
|
||||
<nana/gui/detail/native_window_interface.hpp>
|
||||
<nana/gui/layout_utility.hpp>
|
||||
<nana/gui/detail/element_store.hpp>
|
||||
<nana/gui/detail/color_schemes.hpp>
|
||||
|
||||
1444647171 d:\git.repo\nana\source\gui\detail\linux_x11\bedrock.cpp
|
||||
<nana/config.hpp>
|
||||
<nana/gui/detail/bedrock_pi_data.hpp>
|
||||
<nana/gui/detail/event_code.hpp>
|
||||
<nana/system/platform.hpp>
|
||||
<nana/gui/detail/inner_fwd_implement.hpp>
|
||||
<nana/gui/detail/native_window_interface.hpp>
|
||||
<nana/gui/layout_utility.hpp>
|
||||
<nana/gui/detail/element_store.hpp>
|
||||
<errno.h>
|
||||
|
||||
1444567878 source:d:\git.repo\nana\source\gui\detail\color_schemes.cpp
|
||||
<nana/gui/detail/color_schemes.hpp>
|
||||
<map>
|
||||
|
||||
1439496157 source:d:\git.repo\nana\source\gui\detail\drawer.cpp
|
||||
<nana/config.hpp>
|
||||
<nana/gui/detail/bedrock.hpp>
|
||||
<nana/gui/detail/drawer.hpp>
|
||||
<nana/gui/detail/dynamic_drawing_object.hpp>
|
||||
<nana/gui/detail/effects_renderer.hpp>
|
||||
<nana/gui/detail/basic_window.hpp>
|
||||
<nana/detail/linux_X11/platform_spec.hpp>
|
||||
|
||||
1408986718 source:d:\git.repo\nana\source\gui\detail\element_store.cpp
|
||||
<nana/gui/detail/element_store.hpp>
|
||||
|
||||
1444470665 source:d:\git.repo\nana\source\gui\detail\events_operation.cpp
|
||||
<nana/gui/detail/events_operation.hpp>
|
||||
|
||||
1444647213 source:d:\git.repo\nana\source\gui\detail\native_window_interface.cpp
|
||||
<nana/config.hpp>
|
||||
<nana/gui/detail/native_window_interface.hpp>
|
||||
<nana/gui/screen.hpp>
|
||||
<nana/std_mutex.hpp>
|
||||
<mutex>
|
||||
<map>
|
||||
"../../paint/detail/image_ico.hpp"
|
||||
<nana/system/platform.hpp>
|
||||
<nana/gui/detail/bedrock.hpp>
|
||||
|
||||
1439496158 d:\git.repo\nana\source\paint\detail\image_ico.hpp
|
||||
<nana/paint/detail/image_impl_interface.hpp>
|
||||
|
||||
1439496157 source:d:\git.repo\nana\source\gui\detail\window_layout.cpp
|
||||
<nana/gui/detail/window_layout.hpp>
|
||||
<nana/gui/detail/basic_window.hpp>
|
||||
<nana/gui/detail/native_window_interface.hpp>
|
||||
<nana/gui/layout_utility.hpp>
|
||||
<algorithm>
|
||||
|
||||
1444657627 source:d:\git.repo\nana\source\gui\detail\window_manager.cpp
|
||||
<nana/config.hpp>
|
||||
<nana/gui/detail/bedrock.hpp>
|
||||
<nana/gui/detail/events_operation.hpp>
|
||||
<nana/gui/detail/handle_manager.hpp>
|
||||
<nana/gui/detail/window_manager.hpp>
|
||||
<nana/gui/detail/native_window_interface.hpp>
|
||||
<nana/gui/detail/inner_fwd_implement.hpp>
|
||||
<nana/gui/layout_utility.hpp>
|
||||
<nana/gui/detail/effects_renderer.hpp>
|
||||
<stdexcept>
|
||||
<algorithm>
|
||||
|
||||
1444585885 source:d:\git.repo\nana\source\gui\dragger.cpp
|
||||
<nana/gui/dragger.hpp>
|
||||
|
||||
1444647322 source:d:\git.repo\nana\source\gui\drawing.cpp
|
||||
<nana/gui/drawing.hpp>
|
||||
<nana/gui/programming_interface.hpp>
|
||||
<nana/gui/detail/basic_window.hpp>
|
||||
|
||||
1439496157 source:d:\git.repo\nana\source\gui\effects.cpp
|
||||
<nana/gui/effects.hpp>
|
||||
<nana/gui/programming_interface.hpp>
|
||||
|
||||
1444585885 source:d:\git.repo\nana\source\gui\element.cpp
|
||||
<nana/gui/element.hpp>
|
||||
<nana/gui/detail/bedrock.hpp>
|
||||
<nana/gui/detail/element_store.hpp>
|
||||
<nana/paint/image.hpp>
|
||||
<map>
|
||||
<string>
|
||||
<nana/std_mutex.hpp>
|
||||
<mutex>
|
||||
|
||||
1439496157 source:d:\git.repo\nana\source\gui\filebox.cpp
|
||||
<nana/gui.hpp>
|
||||
<nana/gui/filebox.hpp>
|
||||
<nana/filesystem/fs_utility.hpp>
|
||||
<windows.h>
|
||||
<nana/gui/widgets/label.hpp>
|
||||
<nana/gui/widgets/button.hpp>
|
||||
<nana/gui/widgets/listbox.hpp>
|
||||
<nana/gui/widgets/categorize.hpp>
|
||||
<nana/gui/widgets/textbox.hpp>
|
||||
<nana/gui/widgets/treebox.hpp>
|
||||
<nana/gui/widgets/combox.hpp>
|
||||
<nana/filesystem/file_iterator.hpp>
|
||||
<nana/gui/place.hpp>
|
||||
<stdexcept>
|
||||
<algorithm>
|
||||
|
||||
1439496157 source:d:\git.repo\nana\source\gui\layout_utility.cpp
|
||||
<nana/gui/layout_utility.hpp>
|
||||
|
||||
1444585885 source:d:\git.repo\nana\source\gui\msgbox.cpp
|
||||
<nana/gui.hpp>
|
||||
<nana/gui/widgets/label.hpp>
|
||||
<nana/gui/widgets/button.hpp>
|
||||
<nana/gui/widgets/spinbox.hpp>
|
||||
<nana/gui/widgets/combox.hpp>
|
||||
<nana/gui/widgets/textbox.hpp>
|
||||
<nana/gui/widgets/panel.hpp>
|
||||
<nana/gui/widgets/picture.hpp>
|
||||
<nana/gui/place.hpp>
|
||||
<nana/datetime.hpp>
|
||||
<nana/internationalization.hpp>
|
||||
<nana/gui/filebox.hpp>
|
||||
<functional>
|
||||
<cstdlib>
|
||||
<windows.h>
|
||||
<nana/gui/widgets/picture.hpp>
|
||||
<nana/paint/pixel_buffer.hpp>
|
||||
|
||||
1444647352 source:d:\git.repo\nana\source\gui\notifier.cpp
|
||||
<nana/deploy.hpp>
|
||||
<nana/gui/programming_interface.hpp>
|
||||
<nana/gui/notifier.hpp>
|
||||
<nana/gui/timer.hpp>
|
||||
<unordered_map>
|
||||
<unordered_set>
|
||||
<nana/std_mutex.hpp>
|
||||
<mutex>
|
||||
<nana/detail/win32/platform_spec.hpp>
|
||||
<nana/system/platform.hpp>
|
||||
<iostream>
|
||||
|
||||
1444657299 source:d:\git.repo\nana\source\gui\programming_interface.cpp
|
||||
<nana/gui/programming_interface.hpp>
|
||||
<nana/gui/detail/bedrock.hpp>
|
||||
<nana/gui/detail/basic_window.hpp>
|
||||
<nana/gui/detail/window_manager.hpp>
|
||||
<nana/system/platform.hpp>
|
||||
<nana/gui/detail/native_window_interface.hpp>
|
||||
<nana/gui/widgets/widget.hpp>
|
||||
<nana/gui/detail/events_operation.hpp>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\screen.cpp
|
||||
<nana/gui/screen.hpp>
|
||||
<vector>
|
||||
<memory>
|
||||
<nana/gui/detail/native_window_interface.hpp>
|
||||
<nana/gui/programming_interface.hpp>
|
||||
<windows.h>
|
||||
|
||||
1444647437 source:d:\git.repo\nana\source\gui\state_cursor.cpp
|
||||
<nana/gui/state_cursor.hpp>
|
||||
<nana/gui/detail/bedrock.hpp>
|
||||
<nana/gui/detail/basic_window.hpp>
|
||||
<nana/gui/detail/window_manager.hpp>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\timer.cpp
|
||||
<nana/deploy.hpp>
|
||||
<nana/gui/timer.hpp>
|
||||
<map>
|
||||
<memory>
|
||||
<nana/std_mutex.hpp>
|
||||
<mutex>
|
||||
<windows.h>
|
||||
<nana/system/platform.hpp>
|
||||
|
||||
1444585886 source:d:\git.repo\nana\source\gui\tooltip.cpp
|
||||
<nana/gui/tooltip.hpp>
|
||||
<nana/gui/widgets/label.hpp>
|
||||
<nana/gui/timer.hpp>
|
||||
<nana/gui/screen.hpp>
|
||||
<memory>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\widgets\button.cpp
|
||||
<nana/gui/widgets/button.hpp>
|
||||
<nana/paint/text_renderer.hpp>
|
||||
|
||||
1439829040 source:d:\git.repo\nana\source\gui\widgets\categorize.cpp
|
||||
<nana/gui/wvl.hpp>
|
||||
<nana/gui/widgets/categorize.hpp>
|
||||
<nana/gui/widgets/float_listbox.hpp>
|
||||
<nana/gui/element.hpp>
|
||||
<nana/gui/widgets/detail/tree_cont.hpp>
|
||||
<stdexcept>
|
||||
|
||||
1439829040 source:d:\git.repo\nana\source\gui\widgets\checkbox.cpp
|
||||
<nana/gui/widgets/checkbox.hpp>
|
||||
<nana/paint/text_renderer.hpp>
|
||||
<nana/gui/element.hpp>
|
||||
<algorithm>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\widgets\combox.cpp
|
||||
<nana/gui.hpp>
|
||||
<nana/gui/widgets/combox.hpp>
|
||||
<nana/gui/element.hpp>
|
||||
<nana/system/dataexch.hpp>
|
||||
<nana/gui/widgets/float_listbox.hpp>
|
||||
<nana/gui/widgets/skeletons/text_editor.hpp>
|
||||
<nana/gui/widgets/skeletons/textbase_export_interface.hpp>
|
||||
<iterator>
|
||||
|
||||
1439829040 source:d:\git.repo\nana\source\gui\widgets\date_chooser.cpp
|
||||
<nana/gui/widgets/date_chooser.hpp>
|
||||
<nana/gui/element.hpp>
|
||||
<nana/system/platform.hpp>
|
||||
<sstream>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\widgets\float_listbox.cpp
|
||||
<nana/gui/widgets/float_listbox.hpp>
|
||||
<nana/gui/widgets/scroll.hpp>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\widgets\form.cpp
|
||||
<nana/gui/widgets/form.hpp>
|
||||
|
||||
1408985395 source:d:\git.repo\nana\source\gui\widgets\frame.cpp
|
||||
<nana/gui/widgets/frame.hpp>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\widgets\group.cpp
|
||||
<nana/gui/widgets/group.hpp>
|
||||
<nana/gui/widgets/label.hpp>
|
||||
<nana/gui/drawing.hpp>
|
||||
<nana/gui/widgets/checkbox.hpp>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\widgets\label.cpp
|
||||
<nana/gui/widgets/label.hpp>
|
||||
<nana/unicode_bidi.hpp>
|
||||
<nana/gui/widgets/skeletons/text_token_stream.hpp>
|
||||
<nana/system/platform.hpp>
|
||||
<stdexcept>
|
||||
<sstream>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\widgets\listbox.cpp
|
||||
<nana/gui/widgets/listbox.hpp>
|
||||
<nana/gui/widgets/scroll.hpp>
|
||||
<nana/gui/widgets/panel.hpp>
|
||||
<nana/gui/layout_utility.hpp>
|
||||
<nana/gui/element.hpp>
|
||||
<list>
|
||||
<deque>
|
||||
<stdexcept>
|
||||
<algorithm>
|
||||
<nana/system/dataexch.hpp>
|
||||
<cassert>
|
||||
|
||||
1439828820 source:d:\git.repo\nana\source\gui\widgets\menu.cpp
|
||||
<nana/gui/widgets/menu.hpp>
|
||||
<nana/system/platform.hpp>
|
||||
<nana/gui/element.hpp>
|
||||
<nana/gui/wvl.hpp>
|
||||
<nana/paint/text_renderer.hpp>
|
||||
<cctype>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\widgets\menubar.cpp
|
||||
<nana/gui/widgets/menubar.hpp>
|
||||
<stdexcept>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\widgets\panel.cpp
|
||||
<nana/gui/widgets/panel.hpp>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\widgets\picture.cpp
|
||||
<nana/gui/widgets/picture.hpp>
|
||||
<nana/gui/layout_utility.hpp>
|
||||
<nana/paint/image.hpp>
|
||||
<nana/gui/element.hpp>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\widgets\progress.cpp
|
||||
<nana/gui/widgets/progress.hpp>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\widgets\scroll.cpp
|
||||
<nana/gui/widgets/scroll.hpp>
|
||||
<nana/gui/element.hpp>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\widgets\skeletons\text_editor.cpp
|
||||
<nana/gui/widgets/skeletons/text_editor.hpp>
|
||||
<nana/gui/widgets/skeletons/textbase_export_interface.hpp>
|
||||
<nana/gui/element.hpp>
|
||||
<nana/system/dataexch.hpp>
|
||||
<nana/unicode_bidi.hpp>
|
||||
<numeric>
|
||||
<cwctype>
|
||||
<cstring>
|
||||
<set>
|
||||
<algorithm>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\widgets\slider.cpp
|
||||
<nana/gui/widgets/slider.hpp>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\widgets\spinbox.cpp
|
||||
<nana/gui/widgets/spinbox.hpp>
|
||||
<nana/gui/widgets/skeletons/text_editor.hpp>
|
||||
<nana/gui/element.hpp>
|
||||
<nana/gui/timer.hpp>
|
||||
<algorithm>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\widgets\textbox.cpp
|
||||
<nana/gui/widgets/textbox.hpp>
|
||||
<nana/gui/widgets/skeletons/text_editor.hpp>
|
||||
<stdexcept>
|
||||
<sstream>
|
||||
<nana/gui/detail/bedrock.hpp>
|
||||
<nana/gui/detail/inner_fwd_implement.hpp>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\widgets\toolbar.cpp
|
||||
<nana/gui/widgets/toolbar.hpp>
|
||||
<nana/gui/tooltip.hpp>
|
||||
<vector>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\gui\widgets\treebox.cpp
|
||||
<nana/gui/widgets/treebox.hpp>
|
||||
<nana/gui/widgets/scroll.hpp>
|
||||
<nana/gui/element.hpp>
|
||||
<nana/gui/layout_utility.hpp>
|
||||
<nana/system/platform.hpp>
|
||||
<stdexcept>
|
||||
|
||||
1439746410 source:d:\git.repo\nana\source\gui\widgets\widget.cpp
|
||||
<nana/gui/widgets/widget.hpp>
|
||||
<nana/gui/tooltip.hpp>
|
||||
<nana/gui/detail/widget_notifier_interface.hpp>
|
||||
|
||||
1408984042 source:d:\git.repo\nana\source\gui\wvl.cpp
|
||||
<nana/gui/wvl.hpp>
|
||||
|
||||
1425221155 source:d:\git.repo\nana\source\internationalization.cpp
|
||||
<nana/internationalization.hpp>
|
||||
<nana/gui/widgets/widget.hpp>
|
||||
<unordered_map>
|
||||
<fstream>
|
||||
<sstream>
|
||||
<memory>
|
||||
|
||||
1423350893 source:d:\git.repo\nana\source\paint\detail\image_process_provider.cpp
|
||||
<nana/paint/detail/image_process_provider.hpp>
|
||||
<nana/paint/detail/image_processor.hpp>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\paint\detail\native_paint_interface.cpp
|
||||
<nana/config.hpp>
|
||||
<nana/paint/detail/native_paint_interface.hpp>
|
||||
<nana/paint/pixel_buffer.hpp>
|
||||
<nana/gui/layout_utility.hpp>
|
||||
<windows.h>
|
||||
<X11/Xlib.h>
|
||||
|
||||
1439746289 source:d:\git.repo\nana\source\paint\graphics.cpp
|
||||
<nana/config.hpp>
|
||||
<nana/gui/detail/bedrock.hpp>
|
||||
<nana/paint/graphics.hpp>
|
||||
<nana/paint/detail/native_paint_interface.hpp>
|
||||
<nana/paint/pixel_buffer.hpp>
|
||||
<nana/gui/layout_utility.hpp>
|
||||
<nana/unicode_bidi.hpp>
|
||||
<algorithm>
|
||||
<windows.h>
|
||||
<X11/Xlib.h>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\paint\image.cpp
|
||||
<nana/config.hpp>
|
||||
<nana/paint/image.hpp>
|
||||
<algorithm>
|
||||
<fstream>
|
||||
<iterator>
|
||||
<stdexcept>
|
||||
<nana/paint/detail/image_impl_interface.hpp>
|
||||
<nana/paint/pixel_buffer.hpp>
|
||||
"detail/image_png.hpp"
|
||||
"detail/image_bmp.hpp"
|
||||
"detail/image_ico.hpp"
|
||||
|
||||
1439687843 d:\git.repo\nana\source\paint\detail\image_png.hpp
|
||||
<nana/paint/detail/image_impl_interface.hpp>
|
||||
<nana/extrlib/png.h>
|
||||
<png.h>
|
||||
<stdio.h>
|
||||
<nana/paint/pixel_buffer.hpp>
|
||||
|
||||
1439496158 d:\git.repo\nana\source\paint\detail\image_bmp.hpp
|
||||
<nana/paint/detail/image_impl_interface.hpp>
|
||||
<memory>
|
||||
|
||||
1376313789 source:d:\git.repo\nana\source\paint\image_process_selector.cpp
|
||||
<nana/paint/image_process_selector.hpp>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\paint\pixel_buffer.cpp
|
||||
<nana/config.hpp>
|
||||
<nana/paint/pixel_buffer.hpp>
|
||||
<nana/gui/layout_utility.hpp>
|
||||
<nana/paint/detail/native_paint_interface.hpp>
|
||||
<nana/paint/detail/image_process_provider.hpp>
|
||||
<stdexcept>
|
||||
|
||||
1423350893 source:d:\git.repo\nana\source\paint\text_renderer.cpp
|
||||
<nana/config.hpp>
|
||||
<nana/paint/text_renderer.hpp>
|
||||
<nana/unicode_bidi.hpp>
|
||||
<nana/paint/detail/native_paint_interface.hpp>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\system\dataexch.cpp
|
||||
<nana/system/dataexch.hpp>
|
||||
<nana/traits.hpp>
|
||||
<nana/paint/graphics.hpp>
|
||||
<vector>
|
||||
<cassert>
|
||||
<windows.h>
|
||||
<nana/gui/detail/bedrock.hpp>
|
||||
<nana/gui/detail/basic_window.hpp>
|
||||
|
||||
1387007333 source:d:\git.repo\nana\source\system\platform.cpp
|
||||
<nana/deploy.hpp>
|
||||
<windows.h>
|
||||
<time.h>
|
||||
<errno.h>
|
||||
<unistd.h>
|
||||
<sys/time.h>
|
||||
<sys/syscall.h>
|
||||
|
||||
1365203879 source:d:\git.repo\nana\source\system\shared_wrapper.cpp
|
||||
<nana/system/shared_wrapper.hpp>
|
||||
<algorithm>
|
||||
<iterator>
|
||||
<dlfcn.h>
|
||||
<windows.h>
|
||||
|
||||
1342280997 source:d:\git.repo\nana\source\system\timepiece.cpp
|
||||
<nana/system/timepiece.hpp>
|
||||
<nana/config.hpp>
|
||||
<windows.h>
|
||||
<sys/time.h>
|
||||
|
||||
1386165989 source:d:\git.repo\nana\source\threads\pool.cpp
|
||||
<nana/threads/pool.hpp>
|
||||
<nana/system/platform.hpp>
|
||||
<time.h>
|
||||
<deque>
|
||||
<vector>
|
||||
<nana/std_condition_variable.hpp>
|
||||
<nana/std_mutex.hpp>
|
||||
<condition_variable>
|
||||
<mutex>
|
||||
<windows.h>
|
||||
<process.h>
|
||||
<pthread.h>
|
||||
|
||||
1365203748 source:d:\git.repo\nana\source\traits.cpp
|
||||
<nana/traits.hpp>
|
||||
|
||||
1439496158 source:d:\git.repo\nana\source\unicode_bidi.cpp
|
||||
<nana/unicode_bidi.hpp>
|
||||
|
||||
1439830958 source:d:\git.repo\nana\source\gui\widgets\tabbar.cpp
|
||||
<nana/gui/widgets/tabbar.hpp>
|
||||
<nana/gui/widgets/menu.hpp>
|
||||
<nana/paint/text_renderer.hpp>
|
||||
<nana/gui/element.hpp>
|
||||
<stdexcept>
|
||||
<list>
|
||||
<forward_list>
|
||||
|
||||
1444658359 source:d:\git.repo\nana\source\gui\place.cpp
|
||||
<cfloat>
|
||||
<cmath>
|
||||
<map>
|
||||
<deque>
|
||||
<nana/gui/place.hpp>
|
||||
<nana/gui/programming_interface.hpp>
|
||||
<nana/gui/widgets/label.hpp>
|
||||
<nana/gui/widgets/panel.hpp>
|
||||
<nana/gui/dragger.hpp>
|
||||
<nana/gui/drawing.hpp>
|
||||
<memory>
|
||||
<limits>
|
||||
<cstdlib>
|
||||
<cstring>
|
||||
"place_parts.hpp"
|
||||
|
||||
1444585885 d:\git.repo\nana\source\gui\place_parts.hpp
|
||||
<nana/gui/widgets/form.hpp>
|
||||
<nana/gui/widgets/tabbar.hpp>
|
||||
<nana/gui/element.hpp>
|
||||
<nana/paint/text_renderer.hpp>
|
||||
<stdexcept>
|
||||
<deque>
|
||||
|
||||
|
@ -1,154 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||
<CodeBlocks_layout_file>
|
||||
<ActiveTarget name="Debug" />
|
||||
<File name="..\..\source\paint\text_renderer.cpp" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="5894" topLine="205" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\detail\native_window_interface.cpp" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="4901" topLine="171" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\detail\window_layout.cpp" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="5198" topLine="161" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\detail\window_manager.cpp" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="30124" topLine="1046" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\widgets\listbox.cpp" open="0" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="12428" topLine="532" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\dragger.cpp" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1316" topLine="59" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\widgets\menu.cpp" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="27717" topLine="1044" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\threads\pool.cpp" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="5569" topLine="249" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\element.cpp" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="20890" topLine="542" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\filebox.cpp" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="22934" topLine="871" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\msgbox.cpp" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="48249" topLine="407" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\charset.cpp" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="412" topLine="15" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\programming_interface.cpp" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="5022" topLine="159" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\widgets\tabbar.cpp" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="18615" topLine="760" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\widgets\textbox.cpp" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="11188" topLine="459" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\widgets\toolbar.cpp" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="2244" topLine="84" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\detail\platform_spec_selector.cpp" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="587" topLine="2" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\widgets\treebox.cpp" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="15535" topLine="539" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\audio\detail\buffer_preparation.cpp" open="0" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1924" topLine="62" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\tooltip.cpp" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="4739" topLine="194" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\widgets\button.cpp" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="7080" topLine="291" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\filesystem\fs_utility.cpp" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1562" topLine="57" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\widgets\categorize.cpp" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="6160" topLine="196" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\animation.cpp" open="0" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1164" topLine="43" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\widgets\checkbox.cpp" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="6998" topLine="275" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\audio\detail\audio_device.cpp" open="0" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="6256" topLine="215" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\widgets\combox.cpp" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="16572" topLine="610" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\gui\widgets\date_chooser.cpp" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="457" topLine="3" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\paint\graphics.cpp" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="30961" topLine="1020" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\source\paint\image.cpp" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="3714" topLine="168" />
|
||||
</Cursor>
|
||||
</File>
|
||||
</CodeBlocks_layout_file>
|
@ -5,9 +5,10 @@
|
||||
GCC = g++
|
||||
INCROOT = ../../include
|
||||
SRCROOT = ../../source
|
||||
EXTRLIB = ../../extrlib
|
||||
NANA_INC= $(INCROOT)/nana
|
||||
|
||||
INCS = -I$(INCROOT) -I/usr/include/freetype2
|
||||
INCS = -I$(INCROOT) -I/usr/include/freetype2 -I$(EXTRLIB)
|
||||
|
||||
BIN = libnana.a
|
||||
|
||||
@ -34,7 +35,7 @@ $(BIN): $(LINKOBJ)
|
||||
ranlib ../bin/$(BIN)
|
||||
|
||||
.cpp.o:
|
||||
$(GCC) -g -c $< -o $@ $(INCS) -std=c++0x -Wall
|
||||
$(GCC) -g -c $< -o $@ $(INCS) -std=c++11 -Wall
|
||||
|
||||
clean:
|
||||
rm -f $(LINKOBJ)
|
||||
|
@ -68,31 +68,35 @@
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<OutDir>../bin/</OutDir>
|
||||
<IncludePath>..\..\include;$(IncludePath)</IncludePath>
|
||||
<IncludePath>..\..\include;..\..\extrlib\vc2013;$(IncludePath)</IncludePath>
|
||||
<SourcePath>..\..\source;$(VC_SourcePath);</SourcePath>
|
||||
<TargetName>$(ProjectName)_$(PlatformToolset)_$(Configuration)_$(PlatformShortName)</TargetName>
|
||||
<IntDir>..\..\..\temp\$(ProjectName)\$(PlatformToolset)_$(Configuration)_$(PlatformShortName)\</IntDir>
|
||||
<LibraryPath>..\..\extrlib\vc2013;$(LibraryPath)</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<IncludePath>..\..\include;$(IncludePath)</IncludePath>
|
||||
<IncludePath>..\..\include;..\..\extrlib\vc2013;$(IncludePath)</IncludePath>
|
||||
<SourcePath>..\..\source;$(VC_SourcePath);</SourcePath>
|
||||
<OutDir>../bin/</OutDir>
|
||||
<TargetName>$(ProjectName)_$(PlatformToolset)_$(Configuration)_$(PlatformShortName)</TargetName>
|
||||
<IntDir>..\..\..\temp\$(ProjectName)\$(PlatformToolset)_$(Configuration)_$(PlatformShortName)\</IntDir>
|
||||
<LibraryPath>..\..\extrlib\vc2013;$(LibraryPath)</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<OutDir>../bin/</OutDir>
|
||||
<IncludePath>..\..\include;$(IncludePath)</IncludePath>
|
||||
<SourcePath>..\..\source;$(VC_SourcePath);</SourcePath>
|
||||
<IncludePath>..\..\include;..\..\extrlib\vc2013;$(IncludePath)</IncludePath>
|
||||
<SourcePath>..\..\source;$(VC_SourcePath)</SourcePath>
|
||||
<TargetName>$(ProjectName)_$(PlatformToolset)_$(Configuration)_$(PlatformShortName)</TargetName>
|
||||
<IntDir>..\..\..\temp\$(ProjectName)\$(PlatformToolset)_$(Configuration)_$(PlatformShortName)\</IntDir>
|
||||
<LibraryPath>..\..\extrlib\vc2013;$(LibraryPath)</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<IncludePath>..\..\include;$(IncludePath)</IncludePath>
|
||||
<IncludePath>..\..\include;..\..\extrlib\vc2013;$(IncludePath)</IncludePath>
|
||||
<SourcePath>..\..\source;$(VC_SourcePath);</SourcePath>
|
||||
<OutDir>../bin/</OutDir>
|
||||
<TargetName>$(ProjectName)_$(PlatformToolset)_$(Configuration)_$(PlatformShortName)</TargetName>
|
||||
<IntDir>..\..\..\temp\$(ProjectName)\$(PlatformToolset)_$(Configuration)_$(PlatformShortName)\</IntDir>
|
||||
<LibraryPath>..\..\extrlib\vc2013;$(LibraryPath)</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
@ -184,7 +188,6 @@
|
||||
<ClCompile Include="..\..\source\datetime.cpp" />
|
||||
<ClCompile Include="..\..\source\deploy.cpp" />
|
||||
<ClCompile Include="..\..\source\detail\win32\platform_spec.cpp" />
|
||||
<ClCompile Include="..\..\source\exceptions.cpp" />
|
||||
<ClCompile Include="..\..\source\filesystem\filesystem.cpp" />
|
||||
<ClCompile Include="..\..\source\filesystem\file_iterator.cpp" />
|
||||
<ClCompile Include="..\..\source\filesystem\fs_utility.cpp" />
|
||||
@ -243,7 +246,6 @@
|
||||
<ClCompile Include="..\..\source\internationalization.cpp" />
|
||||
<ClCompile Include="..\..\source\paint\detail\image_process_provider.cpp" />
|
||||
<ClCompile Include="..\..\source\paint\detail\native_paint_interface.cpp" />
|
||||
<ClCompile Include="..\..\source\paint\gadget.cpp" />
|
||||
<ClCompile Include="..\..\source\paint\graphics.cpp" />
|
||||
<ClCompile Include="..\..\source\paint\image.cpp" />
|
||||
<ClCompile Include="..\..\source\paint\image_process_selector.cpp" />
|
||||
@ -273,12 +275,7 @@
|
||||
<ClInclude Include="..\..\include\nana\detail\linux_X11\msg_packet.hpp" />
|
||||
<ClInclude Include="..\..\include\nana\detail\linux_X11\platform_spec.hpp" />
|
||||
<ClInclude Include="..\..\include\nana\detail\win32\platform_spec.hpp" />
|
||||
<ClInclude Include="..\..\include\nana\exceptions.hpp" />
|
||||
<ClInclude Include="..\..\include\nana\extrlib\png.h" />
|
||||
<ClInclude Include="..\..\include\nana\extrlib\pngconf.h" />
|
||||
<ClInclude Include="..\..\include\nana\extrlib\pnglibconf.h" />
|
||||
<ClInclude Include="..\..\include\nana\extrlib\zlib.h" />
|
||||
<ClInclude Include="..\..\include\nana\filesystem\filesystem.hpp" />
|
||||
<ClInclude Include="..\..\include\nana\filesystem\filesystem.hpp" />
|
||||
<ClInclude Include="..\..\include\nana\filesystem\file_iterator.hpp" />
|
||||
<ClInclude Include="..\..\include\nana\filesystem\fs_utility.hpp" />
|
||||
<ClInclude Include="..\..\include\nana\fwd.hpp" />
|
||||
@ -383,4 +380,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
@ -82,9 +82,6 @@
|
||||
<Filter Include="Header Files\detail\linux_X11">
|
||||
<UniqueIdentifier>{61385c08-f06b-4cf3-8e05-9b47d546164b}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files\extrlib">
|
||||
<UniqueIdentifier>{e9eadc97-4a14-4a4e-bb52-52d3a20e2693}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Header Files\filesystem">
|
||||
<UniqueIdentifier>{5667eac1-0887-4936-9502-eac4dd8c1c1d}</UniqueIdentifier>
|
||||
</Filter>
|
||||
@ -119,7 +116,7 @@
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\detail\win32\platform_spec.cpp">
|
||||
<Filter>Source Files\nana\detail\win32</Filter>
|
||||
</ClCompile>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\filesystem\filesystem.cpp">
|
||||
<Filter>Source Files\nana\filesystem</Filter>
|
||||
</ClCompile>
|
||||
@ -261,9 +258,6 @@
|
||||
<ClCompile Include="..\..\source\paint\detail\native_paint_interface.cpp">
|
||||
<Filter>Source Files\nana\paint\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\paint\gadget.cpp">
|
||||
<Filter>Source Files\nana\paint</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\paint\graphics.cpp">
|
||||
<Filter>Source Files\nana\paint</Filter>
|
||||
</ClCompile>
|
||||
@ -309,9 +303,6 @@
|
||||
<ClCompile Include="..\..\source\deploy.cpp">
|
||||
<Filter>Source Files\nana</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\exceptions.cpp">
|
||||
<Filter>Source Files\nana</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\traits.cpp">
|
||||
<Filter>Source Files\nana</Filter>
|
||||
</ClCompile>
|
||||
@ -580,9 +571,6 @@
|
||||
<ClInclude Include="..\..\include\nana\deploy.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\nana\exceptions.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\nana\fwd.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
@ -634,18 +622,6 @@
|
||||
<ClInclude Include="..\..\include\nana\detail\win32\platform_spec.hpp">
|
||||
<Filter>Header Files\detail\win32</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\nana\extrlib\png.h">
|
||||
<Filter>Header Files\extrlib</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\nana\extrlib\pngconf.h">
|
||||
<Filter>Header Files\extrlib</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\nana\extrlib\pnglibconf.h">
|
||||
<Filter>Header Files\extrlib</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\nana\extrlib\zlib.h">
|
||||
<Filter>Header Files\extrlib</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\include\nana\filesystem\filesystem.hpp">
|
||||
<Filter>Header Files\filesystem</Filter>
|
||||
</ClInclude>
|
||||
@ -719,4 +695,4 @@
|
||||
<Filter>Header Files\gui\widgets</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
</Project>
|
@ -1,9 +1,9 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 14
|
||||
VisualStudioVersion = 14.0.22823.1
|
||||
VisualStudioVersion = 14.0.23107.0
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nana", "nana.vcxproj", "{25B21068-491B-4A9F-B99F-6C27BF31BAAD}"
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nana", "nana.vcxproj", "{98091380-2EC4-44B4-82A2-F0A6393BA908}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
@ -13,14 +13,14 @@ Global
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{25B21068-491B-4A9F-B99F-6C27BF31BAAD}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{25B21068-491B-4A9F-B99F-6C27BF31BAAD}.Debug|x64.Build.0 = Debug|x64
|
||||
{25B21068-491B-4A9F-B99F-6C27BF31BAAD}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{25B21068-491B-4A9F-B99F-6C27BF31BAAD}.Debug|x86.Build.0 = Debug|Win32
|
||||
{25B21068-491B-4A9F-B99F-6C27BF31BAAD}.Release|x64.ActiveCfg = Release|x64
|
||||
{25B21068-491B-4A9F-B99F-6C27BF31BAAD}.Release|x64.Build.0 = Release|x64
|
||||
{25B21068-491B-4A9F-B99F-6C27BF31BAAD}.Release|x86.ActiveCfg = Release|Win32
|
||||
{25B21068-491B-4A9F-B99F-6C27BF31BAAD}.Release|x86.Build.0 = Release|Win32
|
||||
{98091380-2EC4-44B4-82A2-F0A6393BA908}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{98091380-2EC4-44B4-82A2-F0A6393BA908}.Debug|x64.Build.0 = Debug|x64
|
||||
{98091380-2EC4-44B4-82A2-F0A6393BA908}.Debug|x86.ActiveCfg = Debug|Win32
|
||||
{98091380-2EC4-44B4-82A2-F0A6393BA908}.Debug|x86.Build.0 = Debug|Win32
|
||||
{98091380-2EC4-44B4-82A2-F0A6393BA908}.Release|x64.ActiveCfg = Release|x64
|
||||
{98091380-2EC4-44B4-82A2-F0A6393BA908}.Release|x64.Build.0 = Release|x64
|
||||
{98091380-2EC4-44B4-82A2-F0A6393BA908}.Release|x86.ActiveCfg = Release|Win32
|
||||
{98091380-2EC4-44B4-82A2-F0A6393BA908}.Release|x86.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
@ -5,14 +5,14 @@
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
@ -22,7 +22,7 @@
|
||||
<ProjectGuid>{25B21068-491B-4A9F-B99F-6C27BF31BAAD}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>nana</RootNamespace>
|
||||
<TargetPlatformVersion>8.1</TargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
@ -31,12 +31,6 @@
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
@ -44,6 +38,12 @@
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<PlatformToolset>v140</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
@ -54,46 +54,52 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<ImportGroup Label="Shared">
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<IncludePath>../../include;../../extrlib/vc2015;$(IncludePath)</IncludePath>
|
||||
<OutDir>../bin/</OutDir>
|
||||
<IncludePath>..\..\include;$(IncludePath)</IncludePath>
|
||||
<SourcePath>..\..\source;$(VC_SourcePath);</SourcePath>
|
||||
<TargetName>$(ProjectName)_$(PlatformToolset)_$(Configuration)_$(PlatformShortName)</TargetName>
|
||||
<LibraryPath>../../extrlib/vc2015;$(LibraryPath)</LibraryPath>
|
||||
<IntDir>..\..\..\temp\$(ProjectName)\$(PlatformToolset)_$(Configuration)_$(PlatformShortName)\</IntDir>
|
||||
<SourcePath>..\..\source;$(SourcePath)</SourcePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<IncludePath>..\..\include;$(IncludePath)</IncludePath>
|
||||
<SourcePath>..\..\source;$(VC_SourcePath);</SourcePath>
|
||||
<IncludePath>../../include;../../extrlib/vc2015;$(IncludePath)</IncludePath>
|
||||
<OutDir>../bin/</OutDir>
|
||||
<TargetName>$(ProjectName)_$(PlatformToolset)_$(Configuration)_$(PlatformShortName)</TargetName>
|
||||
<LibraryPath>../../extrlib/vc2015;$(LibraryPath)</LibraryPath>
|
||||
<IntDir>..\..\..\temp\$(ProjectName)\$(PlatformToolset)_$(Configuration)_$(PlatformShortName)\</IntDir>
|
||||
<SourcePath>..\..\source;$(SourcePath)</SourcePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<IncludePath>../../include;../../extrlib/vc2015;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>../../extrlib/vc2015;$(LibraryPath)</LibraryPath>
|
||||
<OutDir>../bin/</OutDir>
|
||||
<IntDir>..\..\..\temp\$(ProjectName)\$(PlatformToolset)_$(Configuration)_$(PlatformShortName)\</IntDir>
|
||||
<TargetName>$(ProjectName)_$(PlatformToolset)_$(Configuration)_$(PlatformShortName)</TargetName>
|
||||
<SourcePath>..\..\source;$(SourcePath)</SourcePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<IncludePath>../../include;../../extrlib/vc2015;$(IncludePath)</IncludePath>
|
||||
<LibraryPath>../../extrlib/vc2015;$(LibraryPath)</LibraryPath>
|
||||
<OutDir>../bin/</OutDir>
|
||||
<IncludePath>..\..\include;$(IncludePath)</IncludePath>
|
||||
<SourcePath>..\..\source;$(VC_SourcePath);</SourcePath>
|
||||
<TargetName>$(ProjectName)_$(PlatformToolset)_$(Configuration)_$(PlatformShortName)</TargetName>
|
||||
<IntDir>..\..\..\temp\$(ProjectName)\$(PlatformToolset)_$(Configuration)_$(PlatformShortName)\</IntDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<IncludePath>..\..\include;$(IncludePath)</IncludePath>
|
||||
<SourcePath>..\..\source;$(VC_SourcePath);</SourcePath>
|
||||
<OutDir>../bin/</OutDir>
|
||||
<TargetName>$(ProjectName)_$(PlatformToolset)_$(Configuration)_$(PlatformShortName)</TargetName>
|
||||
<IntDir>..\..\..\temp\$(ProjectName)\$(PlatformToolset)_$(Configuration)_$(PlatformShortName)\</IntDir>
|
||||
<SourcePath>..\..\source;$(SourcePath)</SourcePath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
@ -103,16 +109,11 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
<MinimalRebuild>false</MinimalRebuild>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
<Lib>
|
||||
<OutputFile>$(TargetPath)</OutputFile>
|
||||
</Lib>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<ClCompile>
|
||||
@ -120,7 +121,7 @@
|
||||
</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
@ -128,7 +129,7 @@
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
<Lib>
|
||||
<OutputFile>$(TargetPath)</OutputFile>
|
||||
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
|
||||
</Lib>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
@ -141,7 +142,6 @@
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
@ -149,9 +149,6 @@
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
<Lib>
|
||||
<OutputFile>$(TargetPath)</OutputFile>
|
||||
</Lib>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<ClCompile>
|
||||
@ -161,7 +158,7 @@
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
@ -171,7 +168,7 @@
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
<Lib>
|
||||
<OutputFile>$(TargetPath)</OutputFile>
|
||||
<OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
|
||||
</Lib>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
@ -185,7 +182,6 @@
|
||||
<ClCompile Include="..\..\source\datetime.cpp" />
|
||||
<ClCompile Include="..\..\source\deploy.cpp" />
|
||||
<ClCompile Include="..\..\source\detail\win32\platform_spec.cpp" />
|
||||
<ClCompile Include="..\..\source\exceptions.cpp" />
|
||||
<ClCompile Include="..\..\source\filesystem\filesystem.cpp" />
|
||||
<ClCompile Include="..\..\source\filesystem\file_iterator.cpp" />
|
||||
<ClCompile Include="..\..\source\filesystem\fs_utility.cpp" />
|
||||
@ -244,7 +240,6 @@
|
||||
<ClCompile Include="..\..\source\internationalization.cpp" />
|
||||
<ClCompile Include="..\..\source\paint\detail\image_process_provider.cpp" />
|
||||
<ClCompile Include="..\..\source\paint\detail\native_paint_interface.cpp" />
|
||||
<ClCompile Include="..\..\source\paint\gadget.cpp" />
|
||||
<ClCompile Include="..\..\source\paint\graphics.cpp" />
|
||||
<ClCompile Include="..\..\source\paint\image.cpp" />
|
||||
<ClCompile Include="..\..\source\paint\image_process_selector.cpp" />
|
||||
@ -252,7 +247,6 @@
|
||||
<ClCompile Include="..\..\source\paint\text_renderer.cpp" />
|
||||
<ClCompile Include="..\..\source\system\dataexch.cpp" />
|
||||
<ClCompile Include="..\..\source\system\platform.cpp" />
|
||||
<ClCompile Include="..\..\source\system\shared_wrapper.cpp" />
|
||||
<ClCompile Include="..\..\source\system\timepiece.cpp" />
|
||||
<ClCompile Include="..\..\source\threads\pool.cpp" />
|
||||
<ClCompile Include="..\..\source\traits.cpp" />
|
||||
|
@ -13,298 +13,286 @@
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\nana">
|
||||
<UniqueIdentifier>{b0bd11b1-bcbb-4e05-885e-44295bc1a7bb}</UniqueIdentifier>
|
||||
<Filter Include="Source Files\audio">
|
||||
<UniqueIdentifier>{9630500a-5aca-4625-a11b-1ba83a93895c}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\nana\audio">
|
||||
<UniqueIdentifier>{aab16aa3-c8d4-4495-8606-1b21ae739ee5}</UniqueIdentifier>
|
||||
<Filter Include="Source Files\detail">
|
||||
<UniqueIdentifier>{d43db913-0472-45f6-889e-b147a7b3eb7e}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\nana\audio\detail">
|
||||
<UniqueIdentifier>{c395f107-7102-415b-a019-54e7cf3575af}</UniqueIdentifier>
|
||||
<Filter Include="Source Files\filesystem">
|
||||
<UniqueIdentifier>{4e91af62-8e45-41d5-8bb9-1deb850de937}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\nana\detail">
|
||||
<UniqueIdentifier>{e2569be2-9e68-477d-8b59-e248595de6c7}</UniqueIdentifier>
|
||||
<Filter Include="Source Files\gui">
|
||||
<UniqueIdentifier>{c575e702-d7d3-48d2-a465-30e51ca72f8d}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\nana\detail\win32">
|
||||
<UniqueIdentifier>{52ed7f8e-fa48-495e-af1f-4df013205a35}</UniqueIdentifier>
|
||||
<Filter Include="Source Files\paint">
|
||||
<UniqueIdentifier>{e1fbd69a-2a82-419e-854a-0b5dbd0e0237}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\nana\filesystem">
|
||||
<UniqueIdentifier>{87d14798-9015-4162-b9ab-72c741cff063}</UniqueIdentifier>
|
||||
<Filter Include="Source Files\system">
|
||||
<UniqueIdentifier>{295ba47e-9dc7-4375-82bc-443b767eb87d}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\nana\gui">
|
||||
<UniqueIdentifier>{4f8e7d23-9fe1-4409-bb03-2bd0809e606b}</UniqueIdentifier>
|
||||
<Filter Include="Source Files\threads">
|
||||
<UniqueIdentifier>{b0854b25-60fc-47e2-a9df-5e4f2d28065c}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\nana\gui\detail">
|
||||
<UniqueIdentifier>{85c9c1bb-d87b-4481-bf3c-7425f680a12d}</UniqueIdentifier>
|
||||
<Filter Include="Source Files\audio\detail">
|
||||
<UniqueIdentifier>{b3023f5e-2759-409d-b6e8-5ef2fe6601ae}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\nana\gui\detail\win32">
|
||||
<UniqueIdentifier>{8058b530-86ec-4d72-890d-345aa30db056}</UniqueIdentifier>
|
||||
<Filter Include="Source Files\detail\win32">
|
||||
<UniqueIdentifier>{2ce139f3-ef8e-48b7-a82a-68003eac75da}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\nana\gui\widgets">
|
||||
<UniqueIdentifier>{87b124cb-408d-460b-a81b-8a788bbae0d9}</UniqueIdentifier>
|
||||
<Filter Include="Source Files\gui\detail">
|
||||
<UniqueIdentifier>{b9f9a5a8-fd1a-4b99-b530-d8a4c45e62ec}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\nana\gui\widgets\skeletons">
|
||||
<UniqueIdentifier>{b10db2f1-0542-421a-9e1d-4357e3be5f68}</UniqueIdentifier>
|
||||
<Filter Include="Source Files\gui\widgets">
|
||||
<UniqueIdentifier>{4b04c197-4a1e-41f9-bfa3-d82c18bcad51}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\nana\paint">
|
||||
<UniqueIdentifier>{59f186c8-f5f8-4499-8e19-f278d4754220}</UniqueIdentifier>
|
||||
<Filter Include="Source Files\gui\detail\win32">
|
||||
<UniqueIdentifier>{cd6e7f3f-fe5b-44c6-ae8d-15554f926055}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\nana\paint\detail">
|
||||
<UniqueIdentifier>{5acf1733-47b2-4872-a105-66c7ad15cd39}</UniqueIdentifier>
|
||||
<Filter Include="Source Files\gui\widgets\skeletons">
|
||||
<UniqueIdentifier>{60f588f2-bdb9-4b1d-9e23-40a73f327283}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\nana\system">
|
||||
<UniqueIdentifier>{a81fa10e-1274-44e0-92a0-434fa28f89ae}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\nana\threads">
|
||||
<UniqueIdentifier>{e95b4a72-643f-4416-af95-b0bbaf7f0c57}</UniqueIdentifier>
|
||||
<Filter Include="Source Files\paint\detail">
|
||||
<UniqueIdentifier>{53feb93f-2b86-4bf5-b2f3-f60ef1bbbf76}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\source\audio\detail\audio_device.cpp">
|
||||
<Filter>Source Files\nana\audio\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\audio\detail\audio_stream.cpp">
|
||||
<Filter>Source Files\nana\audio\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\audio\detail\buffer_preparation.cpp">
|
||||
<Filter>Source Files\nana\audio\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\audio\player.cpp">
|
||||
<Filter>Source Files\nana\audio</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\detail\win32\platform_spec.cpp">
|
||||
<Filter>Source Files\nana\detail\win32</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\filesystem\file_iterator.cpp">
|
||||
<Filter>Source Files\nana\filesystem</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\filesystem\fs_utility.cpp">
|
||||
<Filter>Source Files\nana\filesystem</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\win32\bedrock.cpp">
|
||||
<Filter>Source Files\nana\gui\detail\win32</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\basic_window.cpp">
|
||||
<Filter>Source Files\nana\gui\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\drawer.cpp">
|
||||
<Filter>Source Files\nana\gui\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\native_window_interface.cpp">
|
||||
<Filter>Source Files\nana\gui\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\window_manager.cpp">
|
||||
<Filter>Source Files\nana\gui\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\skeletons\text_editor.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets\skeletons</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\button.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\categorize.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\checkbox.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\combox.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\date_chooser.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\float_listbox.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\form.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\frame.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\label.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\listbox.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\menu.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\menubar.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\panel.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\picture.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\progress.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\scroll.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\slider.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\tabbar.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\textbox.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\toolbar.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\treebox.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\widget.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\animation.cpp">
|
||||
<Filter>Source Files\nana\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\basis.cpp">
|
||||
<Filter>Source Files\nana\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\dragger.cpp">
|
||||
<Filter>Source Files\nana\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\drawing.cpp">
|
||||
<Filter>Source Files\nana\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\effects.cpp">
|
||||
<Filter>Source Files\nana\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\element.cpp">
|
||||
<Filter>Source Files\nana\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\filebox.cpp">
|
||||
<Filter>Source Files\nana\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\layout_utility.cpp">
|
||||
<Filter>Source Files\nana\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\msgbox.cpp">
|
||||
<Filter>Source Files\nana\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\place.cpp">
|
||||
<Filter>Source Files\nana\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\programming_interface.cpp">
|
||||
<Filter>Source Files\nana\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\timer.cpp">
|
||||
<Filter>Source Files\nana\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\tooltip.cpp">
|
||||
<Filter>Source Files\nana\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\wvl.cpp">
|
||||
<Filter>Source Files\nana\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\paint\detail\image_process_provider.cpp">
|
||||
<Filter>Source Files\nana\paint\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\paint\detail\native_paint_interface.cpp">
|
||||
<Filter>Source Files\nana\paint\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\paint\gadget.cpp">
|
||||
<Filter>Source Files\nana\paint</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\paint\graphics.cpp">
|
||||
<Filter>Source Files\nana\paint</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\paint\image.cpp">
|
||||
<Filter>Source Files\nana\paint</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\paint\image_process_selector.cpp">
|
||||
<Filter>Source Files\nana\paint</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\paint\pixel_buffer.cpp">
|
||||
<Filter>Source Files\nana\paint</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\paint\text_renderer.cpp">
|
||||
<Filter>Source Files\nana\paint</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\system\dataexch.cpp">
|
||||
<Filter>Source Files\nana\system</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\system\platform.cpp">
|
||||
<Filter>Source Files\nana\system</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\system\shared_wrapper.cpp">
|
||||
<Filter>Source Files\nana\system</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\system\timepiece.cpp">
|
||||
<Filter>Source Files\nana\system</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\threads\pool.cpp">
|
||||
<Filter>Source Files\nana\threads</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\any.cpp">
|
||||
<Filter>Source Files\nana</Filter>
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\basic_types.cpp">
|
||||
<Filter>Source Files\nana</Filter>
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\charset.cpp">
|
||||
<Filter>Source Files\nana</Filter>
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\datetime.cpp">
|
||||
<Filter>Source Files\nana</Filter>
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\deploy.cpp">
|
||||
<Filter>Source Files\nana</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\exceptions.cpp">
|
||||
<Filter>Source Files\nana</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\traits.cpp">
|
||||
<Filter>Source Files\nana</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\unicode_bidi.cpp">
|
||||
<Filter>Source Files\nana</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\window_layout.cpp">
|
||||
<Filter>Source Files\nana\gui\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\element_store.cpp">
|
||||
<Filter>Source Files\nana\gui\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\bedrock_pi.cpp">
|
||||
<Filter>Source Files\nana\gui\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\events_operation.cpp">
|
||||
<Filter>Source Files\nana\gui\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\notifier.cpp">
|
||||
<Filter>Source Files\nana\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\state_cursor.cpp">
|
||||
<Filter>Source Files\nana\gui</Filter>
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\internationalization.cpp">
|
||||
<Filter>Source Files\nana</Filter>
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\color_schemes.cpp">
|
||||
<Filter>Source Files\nana\gui\detail</Filter>
|
||||
<ClCompile Include="..\..\source\traits.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\screen.cpp">
|
||||
<Filter>Source Files\nana\gui</Filter>
|
||||
<ClCompile Include="..\..\source\unicode_bidi.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\spinbox.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
<ClCompile Include="..\..\source\audio\detail\audio_device.cpp">
|
||||
<Filter>Source Files\audio\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\audio\detail\audio_stream.cpp">
|
||||
<Filter>Source Files\audio\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\audio\detail\buffer_preparation.cpp">
|
||||
<Filter>Source Files\audio\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\audio\player.cpp">
|
||||
<Filter>Source Files\audio</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\detail\win32\platform_spec.cpp">
|
||||
<Filter>Source Files\detail\win32</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\filesystem\file_iterator.cpp">
|
||||
<Filter>Source Files\filesystem</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\filesystem\filesystem.cpp">
|
||||
<Filter>Source Files\nana\filesystem</Filter>
|
||||
<Filter>Source Files\filesystem</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\filesystem\fs_utility.cpp">
|
||||
<Filter>Source Files\filesystem</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\basic_window.cpp">
|
||||
<Filter>Source Files\gui\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\bedrock_pi.cpp">
|
||||
<Filter>Source Files\gui\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\color_schemes.cpp">
|
||||
<Filter>Source Files\gui\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\drawer.cpp">
|
||||
<Filter>Source Files\gui\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\element_store.cpp">
|
||||
<Filter>Source Files\gui\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\events_operation.cpp">
|
||||
<Filter>Source Files\gui\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\native_window_interface.cpp">
|
||||
<Filter>Source Files\gui\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\window_layout.cpp">
|
||||
<Filter>Source Files\gui\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\window_manager.cpp">
|
||||
<Filter>Source Files\gui\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\detail\win32\bedrock.cpp">
|
||||
<Filter>Source Files\gui\detail\win32</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\skeletons\text_editor.cpp">
|
||||
<Filter>Source Files\gui\widgets\skeletons</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\button.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\categorize.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\checkbox.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\combox.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\date_chooser.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\float_listbox.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\form.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\frame.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\group.cpp">
|
||||
<Filter>Source Files\nana\gui\widgets</Filter>
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\label.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\listbox.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\menu.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\menubar.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\panel.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\picture.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\progress.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\scroll.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\slider.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\spinbox.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\tabbar.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\textbox.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\toolbar.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\treebox.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\widgets\widget.cpp">
|
||||
<Filter>Source Files\gui\widgets</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\animation.cpp">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\basis.cpp">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\dragger.cpp">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\drawing.cpp">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\effects.cpp">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\element.cpp">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\filebox.cpp">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\layout_utility.cpp">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\msgbox.cpp">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\notifier.cpp">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\place.cpp">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\programming_interface.cpp">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\screen.cpp">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\state_cursor.cpp">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\timer.cpp">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\tooltip.cpp">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\gui\wvl.cpp">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\threads\pool.cpp">
|
||||
<Filter>Source Files\threads</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\system\dataexch.cpp">
|
||||
<Filter>Source Files\system</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\system\platform.cpp">
|
||||
<Filter>Source Files\system</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\system\timepiece.cpp">
|
||||
<Filter>Source Files\system</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\paint\detail\image_process_provider.cpp">
|
||||
<Filter>Source Files\paint\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\paint\detail\native_paint_interface.cpp">
|
||||
<Filter>Source Files\paint\detail</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\paint\graphics.cpp">
|
||||
<Filter>Source Files\paint</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\paint\image.cpp">
|
||||
<Filter>Source Files\paint</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\paint\image_process_selector.cpp">
|
||||
<Filter>Source Files\paint</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\paint\pixel_buffer.cpp">
|
||||
<Filter>Source Files\paint</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\source\paint\text_renderer.cpp">
|
||||
<Filter>Source Files\paint</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -1 +0,0 @@
|
||||
The libpng.a is for MinGW(Not linux), and other .lib files are for VS2013
|
@ -1 +1,5 @@
|
||||
You can download the precompiled external libraries at http://sourceforge.net/projects/nanapro/files/extrlib/
|
||||
You can download the precompiled external libraries at http://sourceforge.net/projects/nanapro/files/extrlib/
|
||||
Extract the ZIP file to the directory nana/extrlib. Then modify the marco switch defined in nana/include/config.hpp header file and rebuild the nana library.
|
||||
|
||||
您可以下载预先编译的外部程序库,下载地址http://sourceforge.net/projects/nanapro/files/extrlib/
|
||||
将ZIP文件释放到nana/extrlib目录。然后修改nana/include/config.hpp文件中对应的标志,重新编译Nana库即可。
|
@ -37,7 +37,6 @@
|
||||
#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)
|
||||
//Windows:
|
||||
#define NANA_WINDOWS 1
|
||||
#define PLATFORM_SPEC_HPP <nana/detail/win32/platform_spec.hpp>
|
||||
|
||||
//Test if it is MINGW
|
||||
#if defined(__MINGW32__) || defined(__MINGW64__)
|
||||
@ -52,7 +51,6 @@
|
||||
//Linux:
|
||||
#define NANA_LINUX 1
|
||||
#define NANA_X11 1
|
||||
#define PLATFORM_SPEC_HPP <nana/detail/linux_X11/platform_spec.hpp>
|
||||
#define STD_CODECVT_NOT_SUPPORTED
|
||||
#else
|
||||
# static_assert(false, "Only Windows and Unix are supported now");
|
||||
@ -78,12 +76,22 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
///////////////////
|
||||
//Support for PNG
|
||||
// Comment it to disable the feature of support for PNG.
|
||||
//#define NANA_ENABLE_PNG
|
||||
// Define the NANA_ENABLE_PNG to enable the support of PNG.
|
||||
//
|
||||
//#define NANA_ENABLE_PNG //!
|
||||
#if defined(NANA_ENABLE_PNG)
|
||||
//Comment it to use libpng from operating system.
|
||||
#define NANA_LIBPNG
|
||||
#define NANA_LIBPNG //Comment it to use libpng from operating system.
|
||||
#endif
|
||||
|
||||
///////////////////
|
||||
//Support for JPEG
|
||||
// Define the NANA_ENABLE_JPEG to enable the support of JPEG.
|
||||
//
|
||||
//#define NANA_ENABLE_JPEG //!
|
||||
#if defined(NANA_ENABLE_JPEG)
|
||||
#define NANA_LIBJPEG //Comment this whole line to use libjpeg from operating system.
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -106,6 +106,8 @@ namespace detail
|
||||
~drawable_impl_type();
|
||||
|
||||
void fgcolor(const ::nana::color&); //deprecated
|
||||
unsigned get_color() const;
|
||||
unsigned get_text_color() const;
|
||||
void set_color(const ::nana::color&);
|
||||
void set_text_color(const ::nana::color&);
|
||||
|
||||
|
21
include/nana/detail/platform_spec_selector.hpp
Normal file
21
include/nana/detail/platform_spec_selector.hpp
Normal file
@ -0,0 +1,21 @@
|
||||
/*
|
||||
* Selector of Platform Specification
|
||||
* Nana C++ Library(http://www.nanapro.org)
|
||||
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
|
||||
*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* @file: nana/detail/platform_spec_selector.hpp
|
||||
*
|
||||
* Selects the proper platform_spec header file for the current platform
|
||||
*/
|
||||
|
||||
#include <nana/config.hpp>
|
||||
|
||||
#if defined(NANA_WINDOWS)
|
||||
#include <nana/detail/win32/platform_spec.hpp>
|
||||
#else
|
||||
#include <nana/detail/linux_X11/platform_spec.hpp>
|
||||
#endif
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Platform Specification Implementation
|
||||
* Nana C++ Library(http://www.nanapro.org)
|
||||
* Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com)
|
||||
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
|
||||
*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
@ -146,6 +146,7 @@ namespace detail
|
||||
|
||||
void fgcolor(const ::nana::color&); //deprecated
|
||||
unsigned get_color() const;
|
||||
unsigned get_text_color() const;
|
||||
void set_color(const ::nana::color&);
|
||||
void set_text_color(const ::nana::color&);
|
||||
|
||||
|
@ -1,95 +0,0 @@
|
||||
/*
|
||||
* Exception Definition
|
||||
* Copyright(C) 2003-2013 Jinhao(cnjinhao@hotmail.com)
|
||||
*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* @file: nana/exceptions.hpp
|
||||
*/
|
||||
|
||||
#ifndef NANA_EXCEPTIONS_H
|
||||
#define NANA_EXCEPTIONS_H
|
||||
#include <exception>
|
||||
#include <string>
|
||||
|
||||
namespace nana
|
||||
{
|
||||
|
||||
/**
|
||||
* nana::threads::thread::exit throws this exception to exit thread
|
||||
* this exception is not allowed to be catch by programmer,
|
||||
* otherwise the thread may not exit
|
||||
*/
|
||||
class thrd_exit: public std::exception
|
||||
{
|
||||
public:
|
||||
thrd_exit(unsigned retval);
|
||||
~thrd_exit() throw();
|
||||
const char* what() const throw();
|
||||
unsigned retval() const;
|
||||
private:
|
||||
unsigned retval_;
|
||||
};
|
||||
|
||||
/**
|
||||
* nana::text::settings_t throws this exception if it dose not found a given member
|
||||
* in a scope
|
||||
*/
|
||||
class bad_member: public std::exception
|
||||
{
|
||||
public:
|
||||
bad_member(const std::string& what);
|
||||
~bad_member() throw();
|
||||
const char* what() const throw();
|
||||
private:
|
||||
std::string what_;
|
||||
};
|
||||
|
||||
/**
|
||||
* nana::text::settings_t throws this exception if there is a syntax error
|
||||
*/
|
||||
class bad_syntax: public std::exception
|
||||
{
|
||||
public:
|
||||
bad_syntax(const std::string& what);
|
||||
~bad_syntax() throw();
|
||||
const char* what() const throw();
|
||||
private:
|
||||
std::string what_;
|
||||
};
|
||||
|
||||
class bad_error: public std::exception
|
||||
{
|
||||
public:
|
||||
bad_error(const std::string& what);
|
||||
~bad_error() throw();
|
||||
const char* what() const throw();
|
||||
private:
|
||||
std::string what_;
|
||||
};
|
||||
|
||||
class bad_handle: public std::exception
|
||||
{
|
||||
public:
|
||||
bad_handle(const std::string& what);
|
||||
~bad_handle() throw();
|
||||
const char* what() const throw();
|
||||
private:
|
||||
std::string what_;
|
||||
};
|
||||
|
||||
class bad_window
|
||||
:public std::exception
|
||||
{
|
||||
public:
|
||||
bad_window(const char* what);
|
||||
~bad_window() throw();
|
||||
const char* what() const throw();
|
||||
private:
|
||||
std::string what_;
|
||||
};
|
||||
}// end namespace nana
|
||||
|
||||
#endif
|
File diff suppressed because it is too large
Load Diff
@ -1,596 +0,0 @@
|
||||
|
||||
/* pngconf.h - machine configurable file for libpng
|
||||
*
|
||||
* libpng version 1.5.8 - February 1, 2012
|
||||
*
|
||||
* Copyright (c) 1998-2012 Glenn Randers-Pehrson
|
||||
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
|
||||
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
|
||||
*
|
||||
* This code is released under the libpng license.
|
||||
* For conditions of distribution and use, see the disclaimer
|
||||
* and license in png.h
|
||||
*
|
||||
*/
|
||||
|
||||
/* Any machine specific code is near the front of this file, so if you
|
||||
* are configuring libpng for a machine, you may want to read the section
|
||||
* starting here down to where it starts to typedef png_color, png_text,
|
||||
* and png_info.
|
||||
*/
|
||||
|
||||
#ifndef PNGCONF_H
|
||||
#define PNGCONF_H
|
||||
|
||||
#ifndef PNG_BUILDING_SYMBOL_TABLE
|
||||
/* PNG_NO_LIMITS_H may be used to turn off the use of the standard C
|
||||
* definition file for machine specific limits, this may impact the
|
||||
* correctness of the definitons below (see uses of INT_MAX).
|
||||
*/
|
||||
# ifndef PNG_NO_LIMITS_H
|
||||
# include <limits.h>
|
||||
# endif
|
||||
|
||||
/* For the memory copy APIs (i.e. the standard definitions of these),
|
||||
* because this file defines png_memcpy and so on the base APIs must
|
||||
* be defined here.
|
||||
*/
|
||||
# ifdef BSD
|
||||
# include <strings.h>
|
||||
# else
|
||||
# include <string.h>
|
||||
# endif
|
||||
|
||||
/* For png_FILE_p - this provides the standard definition of a
|
||||
* FILE
|
||||
*/
|
||||
# ifdef PNG_STDIO_SUPPORTED
|
||||
# include <stdio.h>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* This controls optimization of the reading of 16 and 32 bit values
|
||||
* from PNG files. It can be set on a per-app-file basis - it
|
||||
* just changes whether a macro is used to the function is called.
|
||||
* The library builder sets the default, if read functions are not
|
||||
* built into the library the macro implementation is forced on.
|
||||
*/
|
||||
#ifndef PNG_READ_INT_FUNCTIONS_SUPPORTED
|
||||
# define PNG_USE_READ_MACROS
|
||||
#endif
|
||||
#if !defined(PNG_NO_USE_READ_MACROS) && !defined(PNG_USE_READ_MACROS)
|
||||
# if PNG_DEFAULT_READ_MACROS
|
||||
# define PNG_USE_READ_MACROS
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* COMPILER SPECIFIC OPTIONS.
|
||||
*
|
||||
* These options are provided so that a variety of difficult compilers
|
||||
* can be used. Some are fixed at build time (e.g. PNG_API_RULE
|
||||
* below) but still have compiler specific implementations, others
|
||||
* may be changed on a per-file basis when compiling against libpng.
|
||||
*/
|
||||
|
||||
/* The PNGARG macro protects us against machines that don't have function
|
||||
* prototypes (ie K&R style headers). If your compiler does not handle
|
||||
* function prototypes, define this macro and use the included ansi2knr.
|
||||
* I've always been able to use _NO_PROTO as the indicator, but you may
|
||||
* need to drag the empty declaration out in front of here, or change the
|
||||
* ifdef to suit your own needs.
|
||||
*/
|
||||
#ifndef PNGARG
|
||||
|
||||
# ifdef OF /* zlib prototype munger */
|
||||
# define PNGARG(arglist) OF(arglist)
|
||||
# else
|
||||
|
||||
# ifdef _NO_PROTO
|
||||
# define PNGARG(arglist) ()
|
||||
# else
|
||||
# define PNGARG(arglist) arglist
|
||||
# endif /* _NO_PROTO */
|
||||
|
||||
# endif /* OF */
|
||||
|
||||
#endif /* PNGARG */
|
||||
|
||||
/* Function calling conventions.
|
||||
* =============================
|
||||
* Normally it is not necessary to specify to the compiler how to call
|
||||
* a function - it just does it - however on x86 systems derived from
|
||||
* Microsoft and Borland C compilers ('IBM PC', 'DOS', 'Windows' systems
|
||||
* and some others) there are multiple ways to call a function and the
|
||||
* default can be changed on the compiler command line. For this reason
|
||||
* libpng specifies the calling convention of every exported function and
|
||||
* every function called via a user supplied function pointer. This is
|
||||
* done in this file by defining the following macros:
|
||||
*
|
||||
* PNGAPI Calling convention for exported functions.
|
||||
* PNGCBAPI Calling convention for user provided (callback) functions.
|
||||
* PNGCAPI Calling convention used by the ANSI-C library (required
|
||||
* for longjmp callbacks and sometimes used internally to
|
||||
* specify the calling convention for zlib).
|
||||
*
|
||||
* These macros should never be overridden. If it is necessary to
|
||||
* change calling convention in a private build this can be done
|
||||
* by setting PNG_API_RULE (which defaults to 0) to one of the values
|
||||
* below to select the correct 'API' variants.
|
||||
*
|
||||
* PNG_API_RULE=0 Use PNGCAPI - the 'C' calling convention - throughout.
|
||||
* This is correct in every known environment.
|
||||
* PNG_API_RULE=1 Use the operating system convention for PNGAPI and
|
||||
* the 'C' calling convention (from PNGCAPI) for
|
||||
* callbacks (PNGCBAPI). This is no longer required
|
||||
* in any known environment - if it has to be used
|
||||
* please post an explanation of the problem to the
|
||||
* libpng mailing list.
|
||||
*
|
||||
* These cases only differ if the operating system does not use the C
|
||||
* calling convention, at present this just means the above cases
|
||||
* (x86 DOS/Windows sytems) and, even then, this does not apply to
|
||||
* Cygwin running on those systems.
|
||||
*
|
||||
* Note that the value must be defined in pnglibconf.h so that what
|
||||
* the application uses to call the library matches the conventions
|
||||
* set when building the library.
|
||||
*/
|
||||
|
||||
/* Symbol export
|
||||
* =============
|
||||
* When building a shared library it is almost always necessary to tell
|
||||
* the compiler which symbols to export. The png.h macro 'PNG_EXPORT'
|
||||
* is used to mark the symbols. On some systems these symbols can be
|
||||
* extracted at link time and need no special processing by the compiler,
|
||||
* on other systems the symbols are flagged by the compiler and just
|
||||
* the declaration requires a special tag applied (unfortunately) in a
|
||||
* compiler dependent way. Some systems can do either.
|
||||
*
|
||||
* A small number of older systems also require a symbol from a DLL to
|
||||
* be flagged to the program that calls it. This is a problem because
|
||||
* we do not know in the header file included by application code that
|
||||
* the symbol will come from a shared library, as opposed to a statically
|
||||
* linked one. For this reason the application must tell us by setting
|
||||
* the magic flag PNG_USE_DLL to turn on the special processing before
|
||||
* it includes png.h.
|
||||
*
|
||||
* Four additional macros are used to make this happen:
|
||||
*
|
||||
* PNG_IMPEXP The magic (if any) to cause a symbol to be exported from
|
||||
* the build or imported if PNG_USE_DLL is set - compiler
|
||||
* and system specific.
|
||||
*
|
||||
* PNG_EXPORT_TYPE(type) A macro that pre or appends PNG_IMPEXP to
|
||||
* 'type', compiler specific.
|
||||
*
|
||||
* PNG_DLL_EXPORT Set to the magic to use during a libpng build to
|
||||
* make a symbol exported from the DLL. Not used in the
|
||||
* public header files; see pngpriv.h for how it is used
|
||||
* in the libpng build.
|
||||
*
|
||||
* PNG_DLL_IMPORT Set to the magic to force the libpng symbols to come
|
||||
* from a DLL - used to define PNG_IMPEXP when
|
||||
* PNG_USE_DLL is set.
|
||||
*/
|
||||
|
||||
/* System specific discovery.
|
||||
* ==========================
|
||||
* This code is used at build time to find PNG_IMPEXP, the API settings
|
||||
* and PNG_EXPORT_TYPE(), it may also set a macro to indicate the DLL
|
||||
* import processing is possible. On Windows/x86 systems it also sets
|
||||
* compiler-specific macros to the values required to change the calling
|
||||
* conventions of the various functions.
|
||||
*/
|
||||
#if ( defined(_Windows) || defined(_WINDOWS) || defined(WIN32) ||\
|
||||
defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) ) &&\
|
||||
( defined(_X86_) || defined(_X64_) || defined(_M_IX86) ||\
|
||||
defined(_M_X64) || defined(_M_IA64) )
|
||||
/* Windows system (DOS doesn't support DLLs) running on x86/x64. Includes
|
||||
* builds under Cygwin or MinGW. Also includes Watcom builds but these need
|
||||
* special treatment because they are not compatible with GCC or Visual C
|
||||
* because of different calling conventions.
|
||||
*/
|
||||
# if PNG_API_RULE == 2
|
||||
/* If this line results in an error, either because __watcall is not
|
||||
* understood or because of a redefine just below you cannot use *this*
|
||||
* build of the library with the compiler you are using. *This* build was
|
||||
* build using Watcom and applications must also be built using Watcom!
|
||||
*/
|
||||
# define PNGCAPI __watcall
|
||||
# endif
|
||||
|
||||
# if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800))
|
||||
# define PNGCAPI __cdecl
|
||||
# if PNG_API_RULE == 1
|
||||
# define PNGAPI __stdcall
|
||||
# endif
|
||||
# else
|
||||
/* An older compiler, or one not detected (erroneously) above,
|
||||
* if necessary override on the command line to get the correct
|
||||
* variants for the compiler.
|
||||
*/
|
||||
# ifndef PNGCAPI
|
||||
# define PNGCAPI _cdecl
|
||||
# endif
|
||||
# if PNG_API_RULE == 1 && !defined(PNGAPI)
|
||||
# define PNGAPI _stdcall
|
||||
# endif
|
||||
# endif /* compiler/api */
|
||||
/* NOTE: PNGCBAPI always defaults to PNGCAPI. */
|
||||
|
||||
# if defined(PNGAPI) && !defined(PNG_USER_PRIVATEBUILD)
|
||||
ERROR: PNG_USER_PRIVATEBUILD must be defined if PNGAPI is changed
|
||||
# endif
|
||||
|
||||
# if (defined(_MSC_VER) && _MSC_VER < 800) ||\
|
||||
(defined(__BORLANDC__) && __BORLANDC__ < 0x500)
|
||||
/* older Borland and MSC
|
||||
* compilers used '__export' and required this to be after
|
||||
* the type.
|
||||
*/
|
||||
# ifndef PNG_EXPORT_TYPE
|
||||
# define PNG_EXPORT_TYPE(type) type PNG_IMPEXP
|
||||
# endif
|
||||
# define PNG_DLL_EXPORT __export
|
||||
# else /* newer compiler */
|
||||
# define PNG_DLL_EXPORT __declspec(dllexport)
|
||||
# ifndef PNG_DLL_IMPORT
|
||||
# define PNG_DLL_IMPORT __declspec(dllimport)
|
||||
# endif
|
||||
# endif /* compiler */
|
||||
|
||||
#else /* !Windows/x86 */
|
||||
# if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__)
|
||||
# define PNGAPI _System
|
||||
# else /* !Windows/x86 && !OS/2 */
|
||||
/* Use the defaults, or define PNG*API on the command line (but
|
||||
* this will have to be done for every compile!)
|
||||
*/
|
||||
# endif /* other system, !OS/2 */
|
||||
#endif /* !Windows/x86 */
|
||||
|
||||
/* Now do all the defaulting . */
|
||||
#ifndef PNGCAPI
|
||||
# define PNGCAPI
|
||||
#endif
|
||||
#ifndef PNGCBAPI
|
||||
# define PNGCBAPI PNGCAPI
|
||||
#endif
|
||||
#ifndef PNGAPI
|
||||
# define PNGAPI PNGCAPI
|
||||
#endif
|
||||
|
||||
/* PNG_IMPEXP may be set on the compilation system command line or (if not set)
|
||||
* then in an internal header file when building the library, otherwise (when
|
||||
* using the library) it is set here.
|
||||
*/
|
||||
#ifndef PNG_IMPEXP
|
||||
# if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT)
|
||||
/* This forces use of a DLL, disallowing static linking */
|
||||
# define PNG_IMPEXP PNG_DLL_IMPORT
|
||||
# endif
|
||||
|
||||
# ifndef PNG_IMPEXP
|
||||
# define PNG_IMPEXP
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* In 1.5.2 the definition of PNG_FUNCTION has been changed to always treat
|
||||
* 'attributes' as a storage class - the attributes go at the start of the
|
||||
* function definition, and attributes are always appended regardless of the
|
||||
* compiler. This considerably simplifies these macros but may cause problems
|
||||
* if any compilers both need function attributes and fail to handle them as
|
||||
* a storage class (this is unlikely.)
|
||||
*/
|
||||
#ifndef PNG_FUNCTION
|
||||
# define PNG_FUNCTION(type, name, args, attributes) attributes type name args
|
||||
#endif
|
||||
|
||||
#ifndef PNG_EXPORT_TYPE
|
||||
# define PNG_EXPORT_TYPE(type) PNG_IMPEXP type
|
||||
#endif
|
||||
|
||||
/* The ordinal value is only relevant when preprocessing png.h for symbol
|
||||
* table entries, so we discard it here. See the .dfn files in the
|
||||
* scripts directory.
|
||||
*/
|
||||
#ifndef PNG_EXPORTA
|
||||
|
||||
# define PNG_EXPORTA(ordinal, type, name, args, attributes)\
|
||||
PNG_FUNCTION(PNG_EXPORT_TYPE(type),(PNGAPI name),PNGARG(args), \
|
||||
extern attributes)
|
||||
#endif
|
||||
|
||||
/* ANSI-C (C90) does not permit a macro to be invoked with an empty argument,
|
||||
* so make something non-empty to satisfy the requirement:
|
||||
*/
|
||||
#define PNG_EMPTY /*empty list*/
|
||||
|
||||
#define PNG_EXPORT(ordinal, type, name, args)\
|
||||
PNG_EXPORTA(ordinal, type, name, args, PNG_EMPTY)
|
||||
|
||||
/* Use PNG_REMOVED to comment out a removed interface. */
|
||||
#ifndef PNG_REMOVED
|
||||
# define PNG_REMOVED(ordinal, type, name, args, attributes)
|
||||
#endif
|
||||
|
||||
#ifndef PNG_CALLBACK
|
||||
# define PNG_CALLBACK(type, name, args) type (PNGCBAPI name) PNGARG(args)
|
||||
#endif
|
||||
|
||||
/* Support for compiler specific function attributes. These are used
|
||||
* so that where compiler support is available incorrect use of API
|
||||
* functions in png.h will generate compiler warnings.
|
||||
*
|
||||
* Added at libpng-1.2.41.
|
||||
*/
|
||||
|
||||
#ifndef PNG_NO_PEDANTIC_WARNINGS
|
||||
# ifndef PNG_PEDANTIC_WARNINGS_SUPPORTED
|
||||
# define PNG_PEDANTIC_WARNINGS_SUPPORTED
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef PNG_PEDANTIC_WARNINGS_SUPPORTED
|
||||
/* Support for compiler specific function attributes. These are used
|
||||
* so that where compiler support is available incorrect use of API
|
||||
* functions in png.h will generate compiler warnings. Added at libpng
|
||||
* version 1.2.41.
|
||||
*/
|
||||
# if defined(__GNUC__)
|
||||
# ifndef PNG_USE_RESULT
|
||||
# define PNG_USE_RESULT __attribute__((__warn_unused_result__))
|
||||
# endif
|
||||
# ifndef PNG_NORETURN
|
||||
# define PNG_NORETURN __attribute__((__noreturn__))
|
||||
# endif
|
||||
# ifndef PNG_ALLOCATED
|
||||
# define PNG_ALLOCATED __attribute__((__malloc__))
|
||||
# endif
|
||||
# ifndef PNG_DEPRECATED
|
||||
# define PNG_DEPRECATED __attribute__((__deprecated__))
|
||||
# endif
|
||||
# ifndef PNG_PRIVATE
|
||||
# if 0 /* Doesn't work so we use deprecated instead*/
|
||||
# define PNG_PRIVATE \
|
||||
__attribute__((warning("This function is not exported by libpng.")))
|
||||
# else
|
||||
# define PNG_PRIVATE \
|
||||
__attribute__((__deprecated__))
|
||||
# endif
|
||||
# endif
|
||||
# endif /* __GNUC__ */
|
||||
|
||||
# if defined(_MSC_VER) && (_MSC_VER >= 1300)
|
||||
# ifndef PNG_USE_RESULT
|
||||
# define PNG_USE_RESULT /* not supported */
|
||||
# endif
|
||||
# ifndef PNG_NORETURN
|
||||
# define PNG_NORETURN __declspec(noreturn)
|
||||
# endif
|
||||
# ifndef PNG_ALLOCATED
|
||||
# if (_MSC_VER >= 1400)
|
||||
# define PNG_ALLOCATED __declspec(restrict)
|
||||
# endif
|
||||
# endif
|
||||
# ifndef PNG_DEPRECATED
|
||||
# define PNG_DEPRECATED __declspec(deprecated)
|
||||
# endif
|
||||
# ifndef PNG_PRIVATE
|
||||
# define PNG_PRIVATE __declspec(deprecated)
|
||||
# endif
|
||||
# endif /* _MSC_VER */
|
||||
#endif /* PNG_PEDANTIC_WARNINGS */
|
||||
|
||||
#ifndef PNG_DEPRECATED
|
||||
# define PNG_DEPRECATED /* Use of this function is deprecated */
|
||||
#endif
|
||||
#ifndef PNG_USE_RESULT
|
||||
# define PNG_USE_RESULT /* The result of this function must be checked */
|
||||
#endif
|
||||
#ifndef PNG_NORETURN
|
||||
# define PNG_NORETURN /* This function does not return */
|
||||
#endif
|
||||
#ifndef PNG_ALLOCATED
|
||||
# define PNG_ALLOCATED /* The result of the function is new memory */
|
||||
#endif
|
||||
#ifndef PNG_PRIVATE
|
||||
# define PNG_PRIVATE /* This is a private libpng function */
|
||||
#endif
|
||||
#ifndef PNG_FP_EXPORT /* A floating point API. */
|
||||
# ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||
# define PNG_FP_EXPORT(ordinal, type, name, args)\
|
||||
PNG_EXPORT(ordinal, type, name, args)
|
||||
# else /* No floating point APIs */
|
||||
# define PNG_FP_EXPORT(ordinal, type, name, args)
|
||||
# endif
|
||||
#endif
|
||||
#ifndef PNG_FIXED_EXPORT /* A fixed point API. */
|
||||
# ifdef PNG_FIXED_POINT_SUPPORTED
|
||||
# define PNG_FIXED_EXPORT(ordinal, type, name, args)\
|
||||
PNG_EXPORT(ordinal, type, name, args)
|
||||
# else /* No fixed point APIs */
|
||||
# define PNG_FIXED_EXPORT(ordinal, type, name, args)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* The following uses const char * instead of char * for error
|
||||
* and warning message functions, so some compilers won't complain.
|
||||
* If you do not want to use const, define PNG_NO_CONST here.
|
||||
*
|
||||
* This should not change how the APIs are called, so it can be done
|
||||
* on a per-file basis in the application.
|
||||
*/
|
||||
#ifndef PNG_CONST
|
||||
# ifndef PNG_NO_CONST
|
||||
# define PNG_CONST const
|
||||
# else
|
||||
# define PNG_CONST
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Some typedefs to get us started. These should be safe on most of the
|
||||
* common platforms. The typedefs should be at least as large as the
|
||||
* numbers suggest (a png_uint_32 must be at least 32 bits long), but they
|
||||
* don't have to be exactly that size. Some compilers dislike passing
|
||||
* unsigned shorts as function parameters, so you may be better off using
|
||||
* unsigned int for png_uint_16.
|
||||
*/
|
||||
|
||||
#if defined(INT_MAX) && (INT_MAX > 0x7ffffffeL)
|
||||
typedef unsigned int png_uint_32;
|
||||
typedef int png_int_32;
|
||||
#else
|
||||
typedef unsigned long png_uint_32;
|
||||
typedef long png_int_32;
|
||||
#endif
|
||||
typedef unsigned short png_uint_16;
|
||||
typedef short png_int_16;
|
||||
typedef unsigned char png_byte;
|
||||
|
||||
#ifdef PNG_NO_SIZE_T
|
||||
typedef unsigned int png_size_t;
|
||||
#else
|
||||
typedef size_t png_size_t;
|
||||
#endif
|
||||
#define png_sizeof(x) (sizeof (x))
|
||||
|
||||
/* The following is needed for medium model support. It cannot be in the
|
||||
* pngpriv.h header. Needs modification for other compilers besides
|
||||
* MSC. Model independent support declares all arrays and pointers to be
|
||||
* large using the far keyword. The zlib version used must also support
|
||||
* model independent data. As of version zlib 1.0.4, the necessary changes
|
||||
* have been made in zlib. The USE_FAR_KEYWORD define triggers other
|
||||
* changes that are needed. (Tim Wegner)
|
||||
*/
|
||||
|
||||
/* Separate compiler dependencies (problem here is that zlib.h always
|
||||
* defines FAR. (SJT)
|
||||
*/
|
||||
#ifdef __BORLANDC__
|
||||
# if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__)
|
||||
# define LDATA 1
|
||||
# else
|
||||
# define LDATA 0
|
||||
# endif
|
||||
/* GRR: why is Cygwin in here? Cygwin is not Borland C... */
|
||||
# if !defined(__WIN32__) && !defined(__FLAT__) && !defined(__CYGWIN__)
|
||||
# define PNG_MAX_MALLOC_64K /* only used in build */
|
||||
# if (LDATA != 1)
|
||||
# ifndef FAR
|
||||
# define FAR __far
|
||||
# endif
|
||||
# define USE_FAR_KEYWORD
|
||||
# endif /* LDATA != 1 */
|
||||
/* Possibly useful for moving data out of default segment.
|
||||
* Uncomment it if you want. Could also define FARDATA as
|
||||
* const if your compiler supports it. (SJT)
|
||||
# define FARDATA FAR
|
||||
*/
|
||||
# endif /* __WIN32__, __FLAT__, __CYGWIN__ */
|
||||
#endif /* __BORLANDC__ */
|
||||
|
||||
|
||||
/* Suggest testing for specific compiler first before testing for
|
||||
* FAR. The Watcom compiler defines both __MEDIUM__ and M_I86MM,
|
||||
* making reliance oncertain keywords suspect. (SJT)
|
||||
*/
|
||||
|
||||
/* MSC Medium model */
|
||||
#ifdef FAR
|
||||
# ifdef M_I86MM
|
||||
# define USE_FAR_KEYWORD
|
||||
# define FARDATA FAR
|
||||
# include <dos.h>
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* SJT: default case */
|
||||
#ifndef FAR
|
||||
# define FAR
|
||||
#endif
|
||||
|
||||
/* At this point FAR is always defined */
|
||||
#ifndef FARDATA
|
||||
# define FARDATA
|
||||
#endif
|
||||
|
||||
/* Typedef for floating-point numbers that are converted
|
||||
* to fixed-point with a multiple of 100,000, e.g., gamma
|
||||
*/
|
||||
typedef png_int_32 png_fixed_point;
|
||||
|
||||
/* Add typedefs for pointers */
|
||||
typedef void FAR * png_voidp;
|
||||
typedef PNG_CONST void FAR * png_const_voidp;
|
||||
typedef png_byte FAR * png_bytep;
|
||||
typedef PNG_CONST png_byte FAR * png_const_bytep;
|
||||
typedef png_uint_32 FAR * png_uint_32p;
|
||||
typedef PNG_CONST png_uint_32 FAR * png_const_uint_32p;
|
||||
typedef png_int_32 FAR * png_int_32p;
|
||||
typedef PNG_CONST png_int_32 FAR * png_const_int_32p;
|
||||
typedef png_uint_16 FAR * png_uint_16p;
|
||||
typedef PNG_CONST png_uint_16 FAR * png_const_uint_16p;
|
||||
typedef png_int_16 FAR * png_int_16p;
|
||||
typedef PNG_CONST png_int_16 FAR * png_const_int_16p;
|
||||
typedef char FAR * png_charp;
|
||||
typedef PNG_CONST char FAR * png_const_charp;
|
||||
typedef png_fixed_point FAR * png_fixed_point_p;
|
||||
typedef PNG_CONST png_fixed_point FAR * png_const_fixed_point_p;
|
||||
typedef png_size_t FAR * png_size_tp;
|
||||
typedef PNG_CONST png_size_t FAR * png_const_size_tp;
|
||||
|
||||
#ifdef PNG_STDIO_SUPPORTED
|
||||
typedef FILE * png_FILE_p;
|
||||
#endif
|
||||
|
||||
#ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||
typedef double FAR * png_doublep;
|
||||
typedef PNG_CONST double FAR * png_const_doublep;
|
||||
#endif
|
||||
|
||||
/* Pointers to pointers; i.e. arrays */
|
||||
typedef png_byte FAR * FAR * png_bytepp;
|
||||
typedef png_uint_32 FAR * FAR * png_uint_32pp;
|
||||
typedef png_int_32 FAR * FAR * png_int_32pp;
|
||||
typedef png_uint_16 FAR * FAR * png_uint_16pp;
|
||||
typedef png_int_16 FAR * FAR * png_int_16pp;
|
||||
typedef PNG_CONST char FAR * FAR * png_const_charpp;
|
||||
typedef char FAR * FAR * png_charpp;
|
||||
typedef png_fixed_point FAR * FAR * png_fixed_point_pp;
|
||||
#ifdef PNG_FLOATING_POINT_SUPPORTED
|
||||
typedef double FAR * FAR * png_doublepp;
|
||||
#endif
|
||||
|
||||
/* Pointers to pointers to pointers; i.e., pointer to array */
|
||||
typedef char FAR * FAR * FAR * png_charppp;
|
||||
|
||||
/* png_alloc_size_t is guaranteed to be no smaller than png_size_t,
|
||||
* and no smaller than png_uint_32. Casts from png_size_t or png_uint_32
|
||||
* to png_alloc_size_t are not necessary; in fact, it is recommended
|
||||
* not to use them at all so that the compiler can complain when something
|
||||
* turns out to be problematic.
|
||||
* Casts in the other direction (from png_alloc_size_t to png_size_t or
|
||||
* png_uint_32) should be explicitly applied; however, we do not expect
|
||||
* to encounter practical situations that require such conversions.
|
||||
*/
|
||||
#if defined(__TURBOC__) && !defined(__FLAT__)
|
||||
typedef unsigned long png_alloc_size_t;
|
||||
#else
|
||||
# if defined(_MSC_VER) && defined(MAXSEG_64K)
|
||||
typedef unsigned long png_alloc_size_t;
|
||||
# else
|
||||
/* This is an attempt to detect an old Windows system where (int) is
|
||||
* actually 16 bits, in that case png_malloc must have an argument with a
|
||||
* bigger size to accomodate the requirements of the library.
|
||||
*/
|
||||
# if (defined(_Windows) || defined(_WINDOWS) || defined(_WINDOWS_)) && \
|
||||
(!defined(INT_MAX) || INT_MAX <= 0x7ffffffeL)
|
||||
typedef DWORD png_alloc_size_t;
|
||||
# else
|
||||
typedef png_size_t png_alloc_size_t;
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#endif /* PNGCONF_H */
|
@ -1,189 +0,0 @@
|
||||
|
||||
/* libpng STANDARD API DEFINITION */
|
||||
|
||||
/* pnglibconf.h - library build configuration */
|
||||
|
||||
/* Libpng 1.5.8 - February 1, 2012 */
|
||||
|
||||
/* Copyright (c) 1998-2011 Glenn Randers-Pehrson */
|
||||
|
||||
/* This code is released under the libpng license. */
|
||||
/* For conditions of distribution and use, see the disclaimer */
|
||||
/* and license in png.h */
|
||||
|
||||
/* pnglibconf.h */
|
||||
/* Derived from: scripts/pnglibconf.dfa */
|
||||
/* If you edit this file by hand you must obey the rules expressed in */
|
||||
/* pnglibconf.dfa with respect to the dependencies between the following */
|
||||
/* symbols. It is much better to generate a new file using */
|
||||
/* scripts/libpngconf.mak */
|
||||
|
||||
#ifndef PNGLCONF_H
|
||||
#define PNGLCONF_H
|
||||
/* settings */
|
||||
#define PNG_API_RULE 0
|
||||
#define PNG_CALLOC_SUPPORTED
|
||||
#define PNG_COST_SHIFT 3
|
||||
#define PNG_DEFAULT_READ_MACROS 1
|
||||
#define PNG_GAMMA_THRESHOLD_FIXED 5000
|
||||
#define PNG_MAX_GAMMA_8 11
|
||||
#define PNG_QUANTIZE_BLUE_BITS 5
|
||||
#define PNG_QUANTIZE_GREEN_BITS 5
|
||||
#define PNG_QUANTIZE_RED_BITS 5
|
||||
#define PNG_sCAL_PRECISION 5
|
||||
#define PNG_USER_CHUNK_CACHE_MAX 0
|
||||
#define PNG_USER_CHUNK_MALLOC_MAX 0
|
||||
#define PNG_USER_HEIGHT_MAX 1000000
|
||||
#define PNG_USER_WIDTH_MAX 1000000
|
||||
#define PNG_WEIGHT_SHIFT 8
|
||||
#define PNG_ZBUF_SIZE 8192
|
||||
/* end of settings */
|
||||
/* options */
|
||||
#define PNG_16BIT_SUPPORTED
|
||||
#define PNG_ALIGN_MEMORY_SUPPORTED
|
||||
#define PNG_BENIGN_ERRORS_SUPPORTED
|
||||
#define PNG_bKGD_SUPPORTED
|
||||
#define PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED
|
||||
#define PNG_CHECK_cHRM_SUPPORTED
|
||||
#define PNG_cHRM_SUPPORTED
|
||||
#define PNG_CONSOLE_IO_SUPPORTED
|
||||
#define PNG_CONVERT_tIME_SUPPORTED
|
||||
#define PNG_EASY_ACCESS_SUPPORTED
|
||||
/*#undef PNG_ERROR_NUMBERS_SUPPORTED*/
|
||||
#define PNG_ERROR_TEXT_SUPPORTED
|
||||
#define PNG_FIXED_POINT_SUPPORTED
|
||||
#define PNG_FLOATING_ARITHMETIC_SUPPORTED
|
||||
#define PNG_FLOATING_POINT_SUPPORTED
|
||||
#define PNG_FORMAT_AFIRST_SUPPORTED
|
||||
#define PNG_FORMAT_BGR_SUPPORTED
|
||||
#define PNG_gAMA_SUPPORTED
|
||||
#define PNG_HANDLE_AS_UNKNOWN_SUPPORTED
|
||||
#define PNG_hIST_SUPPORTED
|
||||
#define PNG_iCCP_SUPPORTED
|
||||
#define PNG_INCH_CONVERSIONS_SUPPORTED
|
||||
#define PNG_INFO_IMAGE_SUPPORTED
|
||||
#define PNG_IO_STATE_SUPPORTED
|
||||
#define PNG_iTXt_SUPPORTED
|
||||
#define PNG_MNG_FEATURES_SUPPORTED
|
||||
#define PNG_oFFs_SUPPORTED
|
||||
#define PNG_pCAL_SUPPORTED
|
||||
#define PNG_pHYs_SUPPORTED
|
||||
#define PNG_POINTER_INDEXING_SUPPORTED
|
||||
#define PNG_PROGRESSIVE_READ_SUPPORTED
|
||||
#define PNG_READ_16BIT_SUPPORTED
|
||||
#define PNG_READ_ALPHA_MODE_SUPPORTED
|
||||
#define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED
|
||||
#define PNG_READ_BACKGROUND_SUPPORTED
|
||||
#define PNG_READ_BGR_SUPPORTED
|
||||
#define PNG_READ_bKGD_SUPPORTED
|
||||
#define PNG_READ_cHRM_SUPPORTED
|
||||
#define PNG_READ_COMPOSITE_NODIV_SUPPORTED
|
||||
#define PNG_READ_COMPRESSED_TEXT_SUPPORTED
|
||||
#define PNG_READ_EXPAND_16_SUPPORTED
|
||||
#define PNG_READ_EXPAND_SUPPORTED
|
||||
#define PNG_READ_FILLER_SUPPORTED
|
||||
#define PNG_READ_gAMA_SUPPORTED
|
||||
#define PNG_READ_GAMMA_SUPPORTED
|
||||
#define PNG_READ_GRAY_TO_RGB_SUPPORTED
|
||||
#define PNG_READ_hIST_SUPPORTED
|
||||
#define PNG_READ_iCCP_SUPPORTED
|
||||
#define PNG_READ_INTERLACING_SUPPORTED
|
||||
#define PNG_READ_INT_FUNCTIONS_SUPPORTED
|
||||
#define PNG_READ_INVERT_ALPHA_SUPPORTED
|
||||
#define PNG_READ_INVERT_SUPPORTED
|
||||
#define PNG_READ_iTXt_SUPPORTED
|
||||
#define PNG_READ_oFFs_SUPPORTED
|
||||
#define PNG_READ_OPT_PLTE_SUPPORTED
|
||||
#define PNG_READ_PACK_SUPPORTED
|
||||
#define PNG_READ_PACKSWAP_SUPPORTED
|
||||
#define PNG_READ_pCAL_SUPPORTED
|
||||
#define PNG_READ_pHYs_SUPPORTED
|
||||
#define PNG_READ_QUANTIZE_SUPPORTED
|
||||
#define PNG_READ_RGB_TO_GRAY_SUPPORTED
|
||||
#define PNG_READ_sBIT_SUPPORTED
|
||||
#define PNG_READ_SCALE_16_TO_8_SUPPORTED
|
||||
#define PNG_READ_sCAL_SUPPORTED
|
||||
#define PNG_READ_SHIFT_SUPPORTED
|
||||
#define PNG_READ_sPLT_SUPPORTED
|
||||
#define PNG_READ_sRGB_SUPPORTED
|
||||
#define PNG_READ_STRIP_16_TO_8_SUPPORTED
|
||||
#define PNG_READ_STRIP_ALPHA_SUPPORTED
|
||||
#define PNG_READ_SUPPORTED
|
||||
#define PNG_READ_SWAP_ALPHA_SUPPORTED
|
||||
#define PNG_READ_SWAP_SUPPORTED
|
||||
#define PNG_READ_tEXt_SUPPORTED
|
||||
#define PNG_READ_TEXT_SUPPORTED
|
||||
#define PNG_READ_tIME_SUPPORTED
|
||||
#define PNG_READ_TRANSFORMS_SUPPORTED
|
||||
#define PNG_READ_tRNS_SUPPORTED
|
||||
#define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
|
||||
#define PNG_READ_USER_CHUNKS_SUPPORTED
|
||||
#define PNG_READ_USER_TRANSFORM_SUPPORTED
|
||||
#define PNG_READ_zTXt_SUPPORTED
|
||||
#define PNG_SAVE_INT_32_SUPPORTED
|
||||
#define PNG_sBIT_SUPPORTED
|
||||
#define PNG_sCAL_SUPPORTED
|
||||
#define PNG_SEQUENTIAL_READ_SUPPORTED
|
||||
#define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED
|
||||
#define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED
|
||||
#define PNG_SETJMP_SUPPORTED
|
||||
#define PNG_SET_USER_LIMITS_SUPPORTED
|
||||
#define PNG_sPLT_SUPPORTED
|
||||
#define PNG_sRGB_SUPPORTED
|
||||
#define PNG_STDIO_SUPPORTED
|
||||
#define PNG_tEXt_SUPPORTED
|
||||
#define PNG_TEXT_SUPPORTED
|
||||
#define PNG_TIME_RFC1123_SUPPORTED
|
||||
#define PNG_tIME_SUPPORTED
|
||||
#define PNG_tRNS_SUPPORTED
|
||||
#define PNG_UNKNOWN_CHUNKS_SUPPORTED
|
||||
#define PNG_USER_CHUNKS_SUPPORTED
|
||||
#define PNG_USER_LIMITS_SUPPORTED
|
||||
#define PNG_USER_MEM_SUPPORTED
|
||||
#define PNG_USER_TRANSFORM_INFO_SUPPORTED
|
||||
#define PNG_USER_TRANSFORM_PTR_SUPPORTED
|
||||
#define PNG_WARNINGS_SUPPORTED
|
||||
#define PNG_WRITE_16BIT_SUPPORTED
|
||||
#define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED
|
||||
#define PNG_WRITE_BGR_SUPPORTED
|
||||
#define PNG_WRITE_bKGD_SUPPORTED
|
||||
#define PNG_WRITE_cHRM_SUPPORTED
|
||||
#define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED
|
||||
#define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED
|
||||
#define PNG_WRITE_FILLER_SUPPORTED
|
||||
#define PNG_WRITE_FILTER_SUPPORTED
|
||||
#define PNG_WRITE_FLUSH_SUPPORTED
|
||||
#define PNG_WRITE_gAMA_SUPPORTED
|
||||
#define PNG_WRITE_hIST_SUPPORTED
|
||||
#define PNG_WRITE_iCCP_SUPPORTED
|
||||
#define PNG_WRITE_INTERLACING_SUPPORTED
|
||||
#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED
|
||||
#define PNG_WRITE_INVERT_ALPHA_SUPPORTED
|
||||
#define PNG_WRITE_INVERT_SUPPORTED
|
||||
#define PNG_WRITE_iTXt_SUPPORTED
|
||||
#define PNG_WRITE_oFFs_SUPPORTED
|
||||
#define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED
|
||||
#define PNG_WRITE_PACK_SUPPORTED
|
||||
#define PNG_WRITE_PACKSWAP_SUPPORTED
|
||||
#define PNG_WRITE_pCAL_SUPPORTED
|
||||
#define PNG_WRITE_pHYs_SUPPORTED
|
||||
#define PNG_WRITE_sBIT_SUPPORTED
|
||||
#define PNG_WRITE_sCAL_SUPPORTED
|
||||
#define PNG_WRITE_SHIFT_SUPPORTED
|
||||
#define PNG_WRITE_sPLT_SUPPORTED
|
||||
#define PNG_WRITE_sRGB_SUPPORTED
|
||||
#define PNG_WRITE_SUPPORTED
|
||||
#define PNG_WRITE_SWAP_ALPHA_SUPPORTED
|
||||
#define PNG_WRITE_SWAP_SUPPORTED
|
||||
#define PNG_WRITE_tEXt_SUPPORTED
|
||||
#define PNG_WRITE_TEXT_SUPPORTED
|
||||
#define PNG_WRITE_tIME_SUPPORTED
|
||||
#define PNG_WRITE_TRANSFORMS_SUPPORTED
|
||||
#define PNG_WRITE_tRNS_SUPPORTED
|
||||
#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
|
||||
#define PNG_WRITE_USER_TRANSFORM_SUPPORTED
|
||||
#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
|
||||
#define PNG_WRITE_zTXt_SUPPORTED
|
||||
#define PNG_zTXt_SUPPORTED
|
||||
/* end of options */
|
||||
#endif /* PNGLCONF_H */
|
File diff suppressed because it is too large
Load Diff
@ -51,6 +51,7 @@ namespace nana
|
||||
class performance_manager;
|
||||
public:
|
||||
animation(std::size_t fps = 23);
|
||||
~animation();
|
||||
|
||||
void push_back(frameset frms);
|
||||
/*
|
||||
|
@ -12,9 +12,6 @@
|
||||
|
||||
#ifndef NANA_GUI_DETAIL_BEDROCK_HPP
|
||||
#define NANA_GUI_DETAIL_BEDROCK_HPP
|
||||
#include "window_manager.hpp"
|
||||
#include "events_operation.hpp"
|
||||
#include "runtime_manager.hpp"
|
||||
#include "general_events.hpp"
|
||||
#include "color_schemes.hpp"
|
||||
#include "internal_scope_guard.hpp"
|
||||
@ -23,9 +20,11 @@ namespace nana
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
struct native_interface;
|
||||
class element_store;
|
||||
|
||||
class element_store;
|
||||
class events_operation;
|
||||
struct basic_window;
|
||||
class window_manager;
|
||||
|
||||
//class bedrock
|
||||
//@brief: bedrock is a fundamental core component, it provides a abstract to the OS platform
|
||||
@ -34,9 +33,7 @@ namespace detail
|
||||
{
|
||||
bedrock();
|
||||
public:
|
||||
typedef native_interface interface_type;
|
||||
typedef window_manager window_manager_t;
|
||||
typedef window_manager_t::core_window_t core_window_t;
|
||||
using core_window_t = basic_window;
|
||||
|
||||
struct thread_context;
|
||||
|
||||
@ -53,7 +50,6 @@ namespace detail
|
||||
|
||||
::nana::category::flags category(core_window_t*);
|
||||
core_window_t* focus();
|
||||
native_window_type root(core_window_t*);
|
||||
|
||||
void set_menubar_taken(core_window_t*);
|
||||
|
||||
@ -83,14 +79,13 @@ namespace detail
|
||||
void undefine_state_cursor(core_window_t*, thread_context*);
|
||||
|
||||
widget_colors& get_scheme_template(scheme_factory_base&&);
|
||||
std::unique_ptr<widget_colors> make_scheme(scheme_factory_base&&);
|
||||
widget_colors* make_scheme(scheme_factory_base&&);
|
||||
|
||||
events_operation& evt_operation();
|
||||
window_manager& wd_manager();
|
||||
|
||||
void manage_form_loader(core_window_t*, bool insert_or_remove);
|
||||
public:
|
||||
events_operation evt_operation;
|
||||
window_manager_t wd_manager;
|
||||
|
||||
runtime_manager<core_window_t*, bedrock> rt_manager;
|
||||
|
||||
bool emit(event_code, core_window_t*, const arg_mouse&, bool ask_update, thread_context*);
|
||||
bool emit(event_code, core_window_t*, const event_arg&, bool ask_update, thread_context*);
|
||||
bool emit_drawer(event_code, core_window_t*, const event_arg&, thread_context*);
|
||||
private:
|
||||
|
@ -3,6 +3,9 @@
|
||||
|
||||
#include <nana/gui/detail/bedrock.hpp>
|
||||
#include "color_schemes.hpp"
|
||||
#include "events_operation.hpp"
|
||||
#include "window_manager.hpp"
|
||||
#include <set>
|
||||
|
||||
namespace nana
|
||||
{
|
||||
@ -10,8 +13,10 @@ namespace nana
|
||||
{
|
||||
struct bedrock::pi_data
|
||||
{
|
||||
color_schemes scheme;
|
||||
|
||||
color_schemes scheme;
|
||||
events_operation evt_operation;
|
||||
window_manager wd_manager;
|
||||
std::set<core_window_t*> auto_form_set;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -14,7 +14,6 @@
|
||||
#define NANA_DETAIL_COLOR_SCHEMES_HPP
|
||||
|
||||
#include "widget_colors.hpp"
|
||||
#include <nana/pat/cloneable.hpp>
|
||||
|
||||
namespace nana
|
||||
{
|
||||
@ -27,8 +26,8 @@ namespace nana
|
||||
virtual ~scheme_factory_base() = default;
|
||||
|
||||
virtual factory_identifier* get_id() const = 0;
|
||||
virtual std::unique_ptr<widget_colors> create() = 0;
|
||||
virtual std::unique_ptr<widget_colors> create(widget_colors&) = 0;
|
||||
virtual widget_colors* create() = 0;
|
||||
virtual widget_colors* create(widget_colors&) = 0;
|
||||
};
|
||||
|
||||
template<typename Scheme>
|
||||
@ -41,14 +40,14 @@ namespace nana
|
||||
return &fid_;
|
||||
}
|
||||
|
||||
std::unique_ptr<widget_colors> create() override
|
||||
widget_colors* create() override
|
||||
{
|
||||
return std::unique_ptr<widget_colors>(new Scheme);
|
||||
return (new Scheme);
|
||||
}
|
||||
|
||||
std::unique_ptr<widget_colors> create(widget_colors& other) override
|
||||
widget_colors* create(widget_colors& other) override
|
||||
{
|
||||
return std::unique_ptr<widget_colors>{new Scheme(static_cast<Scheme&>(other))};
|
||||
return (new Scheme(static_cast<Scheme&>(other)));
|
||||
}
|
||||
private:
|
||||
static factory_identifier fid_;
|
||||
@ -71,7 +70,7 @@ namespace nana
|
||||
~color_schemes();
|
||||
|
||||
scheme& scheme_template(scheme_factory_base&&);
|
||||
std::unique_ptr<scheme> create(scheme_factory_base&&);
|
||||
scheme* create(scheme_factory_base&&);
|
||||
private:
|
||||
implement * impl_;
|
||||
};
|
||||
|
@ -16,7 +16,6 @@
|
||||
#include <vector>
|
||||
#include "general_events.hpp"
|
||||
#include <nana/paint/graphics.hpp>
|
||||
//#include <nana/paint/image.hpp> //deprecated
|
||||
#include <functional>
|
||||
|
||||
namespace nana
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include <nana/paint/graphics.hpp>
|
||||
#include <nana/paint/pixel_buffer.hpp>
|
||||
#include <nana/gui/layout_utility.hpp>
|
||||
#include <nana/gui/detail/window_layout.hpp>
|
||||
|
||||
namespace nana{
|
||||
namespace detail
|
||||
@ -14,7 +15,7 @@ namespace nana{
|
||||
edge_nimbus_renderer() = default;
|
||||
public:
|
||||
using core_window_t = CoreWindow;
|
||||
using window_layer = window_layout;
|
||||
using window_layer = ::nana::detail::window_layout;
|
||||
using graph_reference = ::nana::paint::graphics&;
|
||||
|
||||
static edge_nimbus_renderer& instance()
|
||||
|
@ -6,9 +6,9 @@
|
||||
#include <unordered_map>
|
||||
|
||||
#if defined(NANA_MINGW) && defined(STD_THREAD_NOT_SUPPORTED)
|
||||
#include <nana/std_mutex.hpp>
|
||||
#include <nana/std_mutex.hpp>
|
||||
#else
|
||||
#include <mutex>
|
||||
#include <mutex>
|
||||
#endif
|
||||
|
||||
namespace nana
|
||||
@ -24,8 +24,8 @@ namespace nana
|
||||
void cancel(event_handle);
|
||||
void erase(event_handle);
|
||||
private:
|
||||
mutable std::recursive_mutex mutex_;
|
||||
std::unordered_set<event_handle> register_;
|
||||
std::recursive_mutex mutex_;
|
||||
std::unordered_set<event_handle> handles_;
|
||||
std::unordered_map<window, std::shared_ptr<general_events>> evt_table_;
|
||||
};
|
||||
}//end namespace detail
|
||||
|
@ -1,100 +0,0 @@
|
||||
/*
|
||||
* A Runtime Manager Implementation
|
||||
* Copyright(C) 2003-2013 Jinhao(cnjinhao@hotmail.com)
|
||||
*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* @file: nana/gui/detail/runtime_manager.hpp
|
||||
*
|
||||
*/
|
||||
#ifndef NANA_GUI_DETAIL_RUNTIME_MANAGER_HPP
|
||||
#define NANA_GUI_DETAIL_RUNTIME_MANAGER_HPP
|
||||
|
||||
#include <map>
|
||||
|
||||
namespace nana
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
template<typename Window, typename Bedrock>
|
||||
class runtime_manager
|
||||
{
|
||||
public:
|
||||
typedef Window window_handle;
|
||||
|
||||
template<typename Form, typename... Args>
|
||||
Form* create_form(Args&&... args)
|
||||
{
|
||||
widget_placer<Form> * holder = new widget_placer<Form>;
|
||||
if (holder->create(std::forward<Args>(args)...))
|
||||
{
|
||||
holder_[holder->get_handle()] = holder;
|
||||
return holder->get();
|
||||
}
|
||||
|
||||
delete holder;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void remove_if_exists(window_handle wd)
|
||||
{
|
||||
auto i = holder_.find(wd);
|
||||
if(i != holder_.cend())
|
||||
{
|
||||
delete i->second;
|
||||
holder_.erase(i);
|
||||
}
|
||||
}
|
||||
private:
|
||||
class widget_holder
|
||||
{
|
||||
public:
|
||||
virtual ~widget_holder(){}
|
||||
virtual window_handle get_handle() const = 0;
|
||||
};
|
||||
|
||||
template<typename Form>
|
||||
class widget_placer : public widget_holder
|
||||
{
|
||||
public:
|
||||
widget_placer()
|
||||
: form_(nullptr)
|
||||
{}
|
||||
|
||||
~widget_placer()
|
||||
{
|
||||
delete form_;
|
||||
}
|
||||
|
||||
template<typename... Args>
|
||||
bool create(Args&&... args)
|
||||
{
|
||||
if (nullptr == form_)
|
||||
form_ = new Form(std::forward<Args>(args)...);
|
||||
|
||||
return (form_ && !form_->empty());
|
||||
}
|
||||
|
||||
Form* get() const
|
||||
{
|
||||
return form_;
|
||||
}
|
||||
|
||||
window_handle get_handle() const override
|
||||
{
|
||||
return reinterpret_cast<window_handle>(form_ ? form_->handle() : nullptr);
|
||||
}
|
||||
private:
|
||||
Form * form_;
|
||||
};
|
||||
private:
|
||||
std::map<window_handle, widget_holder*> holder_;
|
||||
}; //end class runtime_manager
|
||||
|
||||
}//end namespace detail
|
||||
}//end namespace nana
|
||||
|
||||
|
||||
#endif
|
@ -134,7 +134,6 @@ namespace detail
|
||||
bool get_graphics(core_window_t*, nana::paint::graphics&);
|
||||
bool get_visual_rectangle(core_window_t*, nana::rectangle&);
|
||||
|
||||
::nana::widget* get_widget(core_window_t*) const;
|
||||
std::vector<core_window_t*> get_children(core_window_t*) const;
|
||||
bool set_parent(core_window_t* wd, core_window_t* new_parent);
|
||||
core_window_t* set_focus(core_window_t*, bool root_has_been_focused);
|
||||
@ -161,6 +160,9 @@ namespace detail
|
||||
std::vector<std::pair<core_window_t*, unsigned long>> shortkeys(core_window_t*, bool with_children);
|
||||
|
||||
core_window_t* find_shortkey(native_window_type, unsigned long key);
|
||||
|
||||
void set_safe_place(core_window_t* wd, std::function<void()>&& fn);
|
||||
void call_safe_place(unsigned thread_id);
|
||||
private:
|
||||
void _m_disengage(core_window_t*, core_window_t* for_new);
|
||||
void _m_destroy(core_window_t*);
|
||||
|
@ -47,7 +47,7 @@ namespace nana
|
||||
public:
|
||||
bground_transparent(std::size_t percent);
|
||||
private:
|
||||
virtual bground_interface* create() const;
|
||||
bground_interface* create() const override;
|
||||
private:
|
||||
std::size_t percent_;
|
||||
};
|
||||
@ -58,7 +58,7 @@ namespace nana
|
||||
public:
|
||||
bground_blur(std::size_t radius);
|
||||
private:
|
||||
virtual bground_interface * create() const;
|
||||
bground_interface * create() const override;
|
||||
private:
|
||||
std::size_t radius_;
|
||||
};
|
||||
|
@ -27,19 +27,35 @@ namespace nana
|
||||
|
||||
namespace element
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
class element_abstract
|
||||
{
|
||||
public:
|
||||
using graph_reference = ::nana::paint::graphics&;
|
||||
virtual ~element_abstract() = default;
|
||||
};
|
||||
|
||||
class factory_abstract
|
||||
{
|
||||
public:
|
||||
virtual ~factory_abstract() = default;
|
||||
|
||||
virtual void destroy(element_abstract *);
|
||||
};
|
||||
}
|
||||
|
||||
class element_interface
|
||||
: public detail::element_abstract
|
||||
{
|
||||
public:
|
||||
using graph_reference = paint::graphics&;
|
||||
|
||||
virtual ~element_interface() = default;
|
||||
virtual bool draw(graph_reference, const nana::color& bgcolor, const nana::color& fgcolor, const nana::rectangle&, element_state) = 0;
|
||||
};
|
||||
|
||||
class crook_interface
|
||||
: public detail::element_abstract
|
||||
{
|
||||
public:
|
||||
using graph_reference = paint::graphics&;
|
||||
using state = checkstate;
|
||||
|
||||
struct data
|
||||
@ -47,25 +63,21 @@ namespace nana
|
||||
state check_state;
|
||||
bool radio;
|
||||
};
|
||||
|
||||
virtual ~crook_interface() = default;
|
||||
|
||||
virtual bool draw(graph_reference, const nana::color& bgcolor, const nana::color& fgcolor, const nana::rectangle&, element_state, const data&) = 0;
|
||||
};
|
||||
|
||||
class border_interface
|
||||
: public detail::element_abstract
|
||||
{
|
||||
public:
|
||||
using graph_reference = paint::graphics&;
|
||||
|
||||
virtual ~border_interface() = default;
|
||||
virtual bool draw(graph_reference, const ::nana::color& bgcolor, const ::nana::color& fgcolor, const ::nana::rectangle&, element_state, unsigned weight) = 0;
|
||||
};
|
||||
|
||||
class arrow_interface
|
||||
: public detail::element_abstract
|
||||
{
|
||||
public:
|
||||
using graph_reference = paint::graphics&;
|
||||
virtual ~arrow_interface() = default;
|
||||
virtual bool draw(graph_reference, const ::nana::color& bgcolor, const ::nana::color& fgcolor, const ::nana::rectangle&, element_state, direction) = 0;
|
||||
};
|
||||
|
||||
@ -74,10 +86,10 @@ namespace nana
|
||||
public:
|
||||
template<typename ElementInterface>
|
||||
struct factory_interface
|
||||
: public detail::factory_abstract
|
||||
{
|
||||
virtual ~factory_interface(){}
|
||||
virtual ElementInterface* create() const = 0;
|
||||
virtual void destroy(ElementInterface*) const = 0;
|
||||
};
|
||||
|
||||
template<typename Element, typename ElementInterface>
|
||||
@ -85,38 +97,39 @@ namespace nana
|
||||
: public factory_interface<ElementInterface>
|
||||
{
|
||||
public:
|
||||
typedef factory_interface<ElementInterface> interface_type;
|
||||
using interface_type = factory_interface<ElementInterface>;
|
||||
|
||||
ElementInterface * create() const override
|
||||
{
|
||||
return (new Element);
|
||||
}
|
||||
|
||||
void destroy(ElementInterface * p) const override
|
||||
{
|
||||
delete p;
|
||||
}
|
||||
};
|
||||
|
||||
void add_crook(const std::string& name, const pat::cloneable<factory_interface<crook_interface>>&);
|
||||
crook_interface* const * keeper_crook(const std::string& name);
|
||||
void add_arrow(const std::string&, const pat::cloneable<factory_interface<arrow_interface>>&);
|
||||
arrow_interface* const * cite_arrow(const std::string&);
|
||||
|
||||
void add_border(const std::string&, const pat::cloneable<factory_interface<border_interface>>&);
|
||||
border_interface* const * keeper_border(const std::string&);
|
||||
|
||||
void add_arrow(const std::string&, const pat::cloneable<factory_interface<arrow_interface>>&);
|
||||
arrow_interface* const * keeper_arrow(const std::string&);
|
||||
border_interface* const * cite_border(const std::string&);
|
||||
|
||||
void add_button(const std::string&, const pat::cloneable<factory_interface<element_interface>>&);
|
||||
element_interface* const* keeper_button(const std::string&);
|
||||
element_interface* const* cite_button(const std::string&);
|
||||
|
||||
void add_x_icon(const std::string& name, const pat::cloneable<factory_interface<element_interface>>&);
|
||||
element_interface* const* cite_x_icon(const std::string&);
|
||||
|
||||
void add_crook(const std::string& name, const pat::cloneable<factory_interface<crook_interface>>&);
|
||||
crook_interface* const * cite_crook(const std::string& name);
|
||||
|
||||
void add_cross(const std::string& name, const pat::cloneable<factory_interface<element_interface>>&);
|
||||
element_interface* const* cite_cross(const std::string&);
|
||||
};
|
||||
|
||||
class crook;
|
||||
template<typename UserElement>
|
||||
void add_crook(const std::string& name)
|
||||
class arrow;
|
||||
template<typename ArrowElement>
|
||||
void add_arrow(const std::string& name)
|
||||
{
|
||||
using factory_t = provider::factory<UserElement, crook_interface>;
|
||||
provider().add_crook(name, pat::cloneable<typename factory_t::interface_type>(factory_t()));
|
||||
using factory_t = provider::factory<ArrowElement, arrow_interface>;
|
||||
provider().add_arrow(name, pat::cloneable<typename factory_t::interface_type>(factory_t()));
|
||||
}
|
||||
|
||||
class border;
|
||||
@ -127,14 +140,6 @@ namespace nana
|
||||
provider().add_border(name, pat::cloneable<typename factory_t::interface_type>(factory_t()));
|
||||
}
|
||||
|
||||
class arrow;
|
||||
template<typename ArrowElement>
|
||||
void add_arrow(const std::string& name)
|
||||
{
|
||||
using factory_t = provider::factory<ArrowElement, arrow_interface>;
|
||||
provider().add_arrow(name, pat::cloneable<typename factory_t::interface_type>(factory_t()));
|
||||
}
|
||||
|
||||
class button;
|
||||
template<typename ButtonElement>
|
||||
void add_button(const std::string& name)
|
||||
@ -142,6 +147,30 @@ namespace nana
|
||||
using factory_t = provider::factory<ButtonElement, element_interface>;
|
||||
provider().add_button(name, pat::cloneable<typename factory_t::interface_type>(factory_t()));
|
||||
}
|
||||
|
||||
class x_icon;
|
||||
template<typename UserElement>
|
||||
void add_x_icon(const std::string& name)
|
||||
{
|
||||
using factory_t = provider::factory<UserElement, element_interface>;
|
||||
provider().add_x_icon(name, pat::cloneable<typename factory_t::interface_type>(factory_t()));
|
||||
}
|
||||
|
||||
class crook;
|
||||
template<typename UserElement>
|
||||
void add_crook(const std::string& name)
|
||||
{
|
||||
using factory_t = provider::factory<UserElement, crook_interface>;
|
||||
provider().add_crook(name, pat::cloneable<typename factory_t::interface_type>(factory_t()));
|
||||
}
|
||||
|
||||
class cross;
|
||||
template<typename UserElement>
|
||||
void add_cross(const std::string& name)
|
||||
{
|
||||
using factory_t = provider::factory<UserElement, element_interface>;
|
||||
provider().add_cross(name, pat::cloneable<typename factory_t::interface_type>(factory_t()));
|
||||
}
|
||||
}//end namespace element
|
||||
|
||||
template<typename Element> class facade;
|
||||
@ -169,9 +198,27 @@ namespace nana
|
||||
bool draw(graph_reference, const nana::color& bgcolor, const nana::color& fgcolor, const nana::rectangle& r, element_state) override;
|
||||
private:
|
||||
element::crook_interface::data data_;
|
||||
element::crook_interface* const * keeper_;
|
||||
element::crook_interface* const * cite_;
|
||||
}; //end class facade<element::crook>
|
||||
|
||||
template<> class facade<element::cross>
|
||||
: public element::element_interface
|
||||
{
|
||||
public:
|
||||
facade(const char* name = nullptr);
|
||||
void switch_to(const char*);
|
||||
|
||||
void thickness(unsigned thk);
|
||||
void size(unsigned size_pixels);
|
||||
public:
|
||||
//Implement element_interface
|
||||
bool draw(graph_reference, const ::nana::color& bgcolor, const ::nana::color& fgcolor, const ::nana::rectangle&, element_state) override;
|
||||
private:
|
||||
unsigned thickness_{6};
|
||||
unsigned size_{ 14 };
|
||||
element::element_interface* const * cite_;
|
||||
};
|
||||
|
||||
template<>
|
||||
class facade<element::border>
|
||||
: public element::element_interface
|
||||
@ -185,7 +232,7 @@ namespace nana
|
||||
//Implement element_interface
|
||||
bool draw(graph_reference, const nana::color& bgcolor, const nana::color& fgcolor, const nana::rectangle&, element_state) override;
|
||||
private:
|
||||
element::border_interface* const * keeper_;
|
||||
element::border_interface* const * cite_;
|
||||
};//end class facade<element::border>
|
||||
|
||||
template<>
|
||||
@ -207,7 +254,7 @@ namespace nana
|
||||
//Implement element_interface
|
||||
bool draw(graph_reference, const nana::color& bgcolor, const nana::color& fgcolor, const nana::rectangle&, element_state) override;
|
||||
private:
|
||||
element::arrow_interface* const * keeper_;
|
||||
element::arrow_interface* const * cite_;
|
||||
::nana::direction dir_{::nana::direction::north};
|
||||
};//end class facade<element::arrow>
|
||||
|
||||
@ -222,9 +269,22 @@ namespace nana
|
||||
//Implement element_interface
|
||||
bool draw(graph_reference, const ::nana::color& bgcolor, const ::nana::color& fgcolor, const ::nana::rectangle&, element_state) override;
|
||||
private:
|
||||
element::element_interface* const * keeper_;
|
||||
element::element_interface* const * cite_;
|
||||
};//end class facade<element::button>
|
||||
|
||||
template<>
|
||||
class facade<element::x_icon>
|
||||
: public element::element_interface
|
||||
{
|
||||
public:
|
||||
facade(const char* name = nullptr);
|
||||
void switch_to(const char*);
|
||||
public:
|
||||
//Implement element_interface
|
||||
bool draw(graph_reference, const ::nana::color& bgcolor, const ::nana::color& fgcolor, const ::nana::rectangle&, element_state) override;
|
||||
private:
|
||||
element::element_interface* const * cite_;
|
||||
};//end class facade<element::button>
|
||||
|
||||
namespace element
|
||||
{
|
||||
|
@ -109,9 +109,11 @@ namespace nana
|
||||
window window_handle() const;
|
||||
|
||||
void div(const char* s); ///< Divides the attached widget into fields.
|
||||
void modify(const char* field_name, const char* div_text); ///< Modifies a specified field.
|
||||
|
||||
field_reference field(const char* name);///< Returns a field with the specified name.
|
||||
|
||||
void field_visible(const char* filed_name, bool visible); ///<<Shows/Hides an existing field.
|
||||
void field_visible(const char* field_name, bool visible); ///<<Shows/Hides an existing field.
|
||||
bool field_visible(const char* field_name) const; ///<Determines whether the specified field is visible.
|
||||
|
||||
void field_display(const char* field_name, bool display); ///<Displays/Discards an existing field.
|
||||
@ -122,6 +124,19 @@ namespace nana
|
||||
void erase(window handle); ///< Erases a window from field.
|
||||
|
||||
field_reference operator[](const char* name); ///< Returns a field with the specified name. Equal to field();
|
||||
|
||||
/// Add a panel factory
|
||||
template<typename Panel, typename ...Args>
|
||||
place& dock(const std::string& dockname, const std::string& factory_name, Args&& ... args)
|
||||
{
|
||||
return dock(dockname, factory_name, std::bind([](window parent, Args & ... args)
|
||||
{
|
||||
return std::unique_ptr<widget>(new Panel(parent, std::forward<Args>(args)...));
|
||||
}, std::placeholders::_1, args...));
|
||||
}
|
||||
|
||||
place& dock(const std::string& dockname, std::string factory_name, std::function<std::unique_ptr<widget>(window)> factory);
|
||||
place& dock_create(const std::string& factory);
|
||||
private:
|
||||
implement * impl_;
|
||||
};
|
||||
|
@ -13,9 +13,9 @@
|
||||
#ifndef NANA_GUI_PROGRAMMING_INTERFACE_HPP
|
||||
#define NANA_GUI_PROGRAMMING_INTERFACE_HPP
|
||||
#include <nana/config.hpp>
|
||||
#include "detail/bedrock.hpp"
|
||||
#include "effects.hpp"
|
||||
#include "detail/general_events.hpp"
|
||||
#include "detail/color_schemes.hpp"
|
||||
#include <nana/paint/image.hpp>
|
||||
#include <memory>
|
||||
|
||||
@ -29,6 +29,13 @@ namespace nana
|
||||
/// Traits for widget classes
|
||||
template<typename Widget>
|
||||
struct widget_traits
|
||||
{
|
||||
using event_type = typename Widget::event_type;
|
||||
using scheme_type = typename Widget::scheme_type;
|
||||
};
|
||||
|
||||
template<>
|
||||
struct widget_traits<widget>
|
||||
{
|
||||
using event_type = ::nana::general_events;
|
||||
using scheme_type = ::nana::widget_colors;
|
||||
@ -37,6 +44,11 @@ namespace nana
|
||||
|
||||
namespace API
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
::nana::widget_colors* make_scheme(::nana::detail::scheme_factory_base&&);
|
||||
}
|
||||
|
||||
void effects_edge_nimbus(window, effects::edge_nimbus);
|
||||
effects::edge_nimbus effects_edge_nimbus(window);
|
||||
|
||||
@ -53,8 +65,7 @@ namespace API
|
||||
template<typename Scheme>
|
||||
std::unique_ptr<Scheme> make_scheme()
|
||||
{
|
||||
return std::unique_ptr<Scheme>(
|
||||
static_cast<Scheme*>(::nana::detail::bedrock::instance().make_scheme(::nana::detail::scheme_factory<Scheme>()).release()));
|
||||
return std::unique_ptr<Scheme>{static_cast<Scheme*>(API::detail::make_scheme(::nana::detail::scheme_factory<Scheme>()))};
|
||||
}
|
||||
|
||||
void set_scheme(window, widget_colors*);
|
||||
@ -75,9 +86,56 @@ namespace API
|
||||
}//end namespace dev
|
||||
|
||||
|
||||
widget* get_widget(window);
|
||||
|
||||
namespace detail
|
||||
{
|
||||
general_events* get_general_events(window);
|
||||
bool emit_event(event_code, window, const ::nana::event_arg&);
|
||||
|
||||
class enum_widgets_function_base
|
||||
{
|
||||
public:
|
||||
virtual ~enum_widgets_function_base() = default;
|
||||
void enum_widgets(window, bool recursive);
|
||||
private:
|
||||
virtual bool _m_enum_fn(::nana::widget*) = 0;
|
||||
};
|
||||
|
||||
template<typename Widget, typename EnumFunction>
|
||||
class enum_widgets_function
|
||||
: public enum_widgets_function_base
|
||||
{
|
||||
public:
|
||||
enum_widgets_function(EnumFunction && enum_fn)
|
||||
: enum_fn_(static_cast<EnumFunction&&>(enum_fn))
|
||||
{}
|
||||
private:
|
||||
bool _m_enum_fn(::nana::widget* wd) override
|
||||
{
|
||||
return _m_enum_call<Widget>(wd, nullptr);
|
||||
}
|
||||
|
||||
template<typename T, typename std::enable_if<std::is_same<::nana::widget, T>::value>::type* = nullptr>
|
||||
bool _m_enum_call(::nana::widget* wd)
|
||||
{
|
||||
enum_fn_(*wd);
|
||||
return true;
|
||||
}
|
||||
|
||||
template<typename T, typename std::enable_if<!std::is_same<::nana::widget, T>::value>::type* = nullptr>
|
||||
bool _m_enum_call(::nana::widget* wd)
|
||||
{
|
||||
auto ptr = dynamic_cast<Widget*>(wd);
|
||||
if (nullptr == ptr)
|
||||
return false;
|
||||
|
||||
enum_fn_(*ptr);
|
||||
return true;
|
||||
}
|
||||
private:
|
||||
EnumFunction && enum_fn_;
|
||||
};
|
||||
}//end namespace detail
|
||||
|
||||
void exit();
|
||||
@ -91,25 +149,12 @@ namespace API
|
||||
rectangle make_center(window, unsigned width, unsigned height); ///< Retrieves a rectangle which is in the center of the window
|
||||
|
||||
template<typename Widget=::nana::widget, typename EnumFunction>
|
||||
void enum_widgets(window wd, bool recursive, EnumFunction && ef)
|
||||
void enum_widgets(window wd, bool recursive, EnumFunction && fn)
|
||||
{
|
||||
static_assert(std::is_convertible<Widget, ::nana::widget>::value, "enum_widgets<Widget>: The specified Widget is not a widget type.");
|
||||
|
||||
typedef ::nana::detail::basic_window core_window_t;
|
||||
auto & brock = ::nana::detail::bedrock::instance();
|
||||
internal_scope_guard lock;
|
||||
|
||||
auto children = brock.wd_manager.get_children(reinterpret_cast<core_window_t*>(wd));
|
||||
for (auto child : children)
|
||||
{
|
||||
auto wgt = dynamic_cast<Widget*>(brock.wd_manager.get_widget(child));
|
||||
if (nullptr == wgt)
|
||||
continue;
|
||||
|
||||
ef(*wgt);
|
||||
if (recursive)
|
||||
enum_widgets<Widget>(wd, recursive, std::forward<EnumFunction>(ef));
|
||||
}
|
||||
detail::enum_widgets_function<Widget, EnumFunction> enum_fn(static_cast<EnumFunction&&>(fn));
|
||||
enum_fn.enum_widgets(wd, recursive);
|
||||
}
|
||||
|
||||
void window_icon_default(const paint::image& small_icon, const paint::image& big_icon = {});
|
||||
@ -165,8 +210,7 @@ namespace API
|
||||
template<typename EventArg, typename std::enable_if<std::is_base_of< ::nana::event_arg, EventArg>::value>::type* = nullptr>
|
||||
bool emit_event(event_code evt_code, window wd, const EventArg& arg)
|
||||
{
|
||||
auto & brock = ::nana::detail::bedrock::instance();
|
||||
return brock.emit(evt_code, reinterpret_cast< ::nana::detail::bedrock::core_window_t*>(wd), arg, true, brock.get_thread_context());
|
||||
return detail::emit_event(evt_code, wd, arg);
|
||||
}
|
||||
|
||||
void umake_event(event_handle);
|
||||
@ -191,7 +235,7 @@ namespace API
|
||||
}
|
||||
|
||||
point window_position(window);
|
||||
void move_window(window, int x, int y);
|
||||
void move_window(window, const point&);
|
||||
void move_window(window wd, const rectangle&);
|
||||
|
||||
void bring_top(window, bool activated);
|
||||
@ -298,6 +342,8 @@ namespace API
|
||||
|
||||
bool ignore_mouse_focus(window, bool ignore); ///< Enables/disables the mouse focus, it returns the previous state
|
||||
bool ignore_mouse_focus(window); ///< Determines whether the mouse focus is enabled
|
||||
|
||||
void at_safe_place(window, std::function<void()>);
|
||||
}//end namespace API
|
||||
}//end namespace nana
|
||||
|
||||
|
@ -87,9 +87,6 @@ namespace drawerbase
|
||||
void add(checkbox&);
|
||||
std::size_t checked() const; ///< Retrieves the index of the checkbox which is checked.
|
||||
std::size_t size() const;
|
||||
private:
|
||||
void _m_checked(const arg_click&);
|
||||
void _m_destroy(const arg_destroy&);
|
||||
private:
|
||||
std::vector<element_tag> ui_container_;
|
||||
};
|
||||
|
@ -14,7 +14,7 @@
|
||||
#define NANA_GUI_WIDGETS_COMBOX_HPP
|
||||
#include "widget.hpp"
|
||||
#include "float_listbox.hpp"
|
||||
#include "skeletons/text_editor_scheme.hpp"
|
||||
#include "skeletons/text_editor_part.hpp"
|
||||
#include <nana/key_type.hpp>
|
||||
#include <nana/concepts.hpp>
|
||||
#include <functional>
|
||||
@ -228,15 +228,5 @@ namespace nana
|
||||
void _m_caption(nana::string&&) override;
|
||||
nana::any * _m_anyobj(std::size_t pos, bool alloc_if_empty) const override;
|
||||
};
|
||||
|
||||
namespace dev
|
||||
{
|
||||
template<>
|
||||
struct widget_traits<combox>
|
||||
{
|
||||
using event_type = drawerbase::combox::combox_events;
|
||||
using scheme_type = ::nana::widgets::skeletons::text_editor_scheme;
|
||||
};
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -166,9 +166,7 @@ namespace nana
|
||||
std::size_t pos_{0};
|
||||
};
|
||||
|
||||
|
||||
|
||||
typedef std::vector<index_pair> selection;
|
||||
using selection = std::vector<index_pair>;
|
||||
|
||||
/// struct essence_t
|
||||
///@brief: this struct gives many data for listbox,
|
||||
@ -180,14 +178,12 @@ namespace nana
|
||||
class drawer_lister_impl;
|
||||
|
||||
/// mostly works on display positions
|
||||
class trigger: public drawer_trigger
|
||||
class trigger: public drawer_trigger
|
||||
{
|
||||
public:
|
||||
trigger();
|
||||
~trigger();
|
||||
//essence_t& essence(); //deprecated
|
||||
essence_t& essence() const;
|
||||
void draw();
|
||||
private:
|
||||
void _m_draw_border();
|
||||
private:
|
||||
@ -210,9 +206,9 @@ namespace nana
|
||||
drawer_lister_impl *drawer_lister_;
|
||||
};//end class trigger
|
||||
|
||||
/// operate with absolute positions and contain only the position but montain pointers to parts of the real items
|
||||
/// operate with absolute positions and contain only the position but montain pointers to parts of the real items
|
||||
/// item_proxy self, it references and iterators are not invalidated by sort()
|
||||
class item_proxy
|
||||
class item_proxy
|
||||
: public std::iterator<std::input_iterator_tag, item_proxy>
|
||||
{
|
||||
public:
|
||||
@ -372,6 +368,9 @@ namespace nana
|
||||
item_proxy iter{ ess_, index_pair(pos_, size() - 1) };
|
||||
if (set_value)
|
||||
iter.value(std::forward<T>(t));
|
||||
|
||||
_m_update();
|
||||
|
||||
return iter;
|
||||
}
|
||||
|
||||
@ -441,24 +440,25 @@ namespace nana
|
||||
private:
|
||||
void _m_append(std::vector<cell> && cells);
|
||||
void _m_cat_by_pos();
|
||||
void _m_update();
|
||||
private:
|
||||
essence_t* ess_{nullptr};
|
||||
category_t* cat_{nullptr};
|
||||
size_type pos_{0}; ///< Absolute position, not relative to display, and dont change during sort()
|
||||
};
|
||||
|
||||
struct export_options
|
||||
{
|
||||
nana::string sep = nana::string {STR("\t" )},
|
||||
endl= nana::string {STR("\n")} ;
|
||||
bool only_selected_items{true},
|
||||
only_checked_items {false},
|
||||
only_visible_columns{true};
|
||||
struct export_options
|
||||
{
|
||||
nana::string sep = nana::string {STR("\t" )},
|
||||
endl= nana::string {STR("\n")};
|
||||
bool only_selected_items{true},
|
||||
only_checked_items {false},
|
||||
only_visible_columns{true};
|
||||
|
||||
using columns_indexs = std::vector<size_type>;
|
||||
columns_indexs columns_order;
|
||||
};
|
||||
}
|
||||
using columns_indexs = std::vector<size_type>;
|
||||
columns_indexs columns_order;
|
||||
};
|
||||
}
|
||||
}//end namespace drawerbase
|
||||
|
||||
struct arg_listbox
|
||||
@ -558,7 +558,11 @@ By \a clicking on one header the list get \a reordered, first up, and then down
|
||||
listbox(window, bool visible);
|
||||
listbox(window, const rectangle& = {}, bool visible = true);
|
||||
|
||||
void auto_draw(bool); ///< Set state: Redraw automatically after an operation?
|
||||
void auto_draw(bool); ///< Set state: Redraw automatically after an operation
|
||||
|
||||
/// Scrolls the view to the first or last item of a specified category
|
||||
void scroll(bool to_bottom, size_type cat_pos = ::nana::npos);
|
||||
void scroll(bool to_bottom, const index_pair& pos);
|
||||
|
||||
/// Appends a new column with a header text and the specified width at the end, and return it position
|
||||
size_type append_header(nana::string header_text, unsigned width = 120);
|
||||
@ -663,15 +667,5 @@ By \a clicking on one header the list get \a reordered, first up, and then down
|
||||
drawerbase::listbox::category_t* _m_at_key(std::shared_ptr<nana::detail::key_interface>);
|
||||
void _m_erase_key(nana::detail::key_interface*);
|
||||
};
|
||||
|
||||
namespace dev
|
||||
{
|
||||
template<>
|
||||
struct widget_traits<listbox>
|
||||
{
|
||||
using event_type = drawerbase::listbox::listbox_events;
|
||||
using scheme_type = drawerbase::listbox::scheme;
|
||||
};
|
||||
}
|
||||
}//end namespace nana
|
||||
#endif
|
||||
|
@ -14,7 +14,6 @@
|
||||
#define NANA_GUI_WIDGET_SCROLL_HPP
|
||||
|
||||
#include "widget.hpp"
|
||||
#include <nana/paint/gadget.hpp>
|
||||
#include <nana/gui/timer.hpp>
|
||||
|
||||
namespace nana
|
||||
@ -150,36 +149,35 @@ namespace nana
|
||||
|
||||
bool make_step(bool forward, unsigned multiple)
|
||||
{
|
||||
if (graph_)
|
||||
{
|
||||
size_type step = (multiple > 1 ? metrics_.step * multiple : metrics_.step);
|
||||
size_type value = metrics_.value;
|
||||
if (forward)
|
||||
{
|
||||
size_type maxv = metrics_.peak - metrics_.range;
|
||||
if (metrics_.peak > metrics_.range && value < maxv)
|
||||
{
|
||||
if (maxv - value >= step)
|
||||
value += step;
|
||||
else
|
||||
value = maxv;
|
||||
}
|
||||
}
|
||||
else if (value)
|
||||
{
|
||||
if (value > step)
|
||||
value -= step;
|
||||
else
|
||||
value = 0;
|
||||
}
|
||||
size_type cmpvalue = metrics_.value;
|
||||
metrics_.value = value;
|
||||
if (value != cmpvalue)
|
||||
{
|
||||
_m_emit_value_changed();
|
||||
return true;
|
||||
}
|
||||
if (!graph_)
|
||||
return false;
|
||||
|
||||
size_type step = (multiple > 1 ? metrics_.step * multiple : metrics_.step);
|
||||
size_type value = metrics_.value;
|
||||
if (forward)
|
||||
{
|
||||
size_type maxv = metrics_.peak - metrics_.range;
|
||||
if (metrics_.peak > metrics_.range && value < maxv)
|
||||
{
|
||||
if (maxv - value >= step)
|
||||
value += step;
|
||||
else
|
||||
value = maxv;
|
||||
}
|
||||
}
|
||||
else if (value)
|
||||
{
|
||||
if (value > step)
|
||||
value -= step;
|
||||
else
|
||||
value = 0;
|
||||
}
|
||||
size_type cmpvalue = metrics_.value;
|
||||
metrics_.value = value;
|
||||
if (value != cmpvalue)
|
||||
{
|
||||
_m_emit_value_changed();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@ -244,6 +242,11 @@ namespace nana
|
||||
}
|
||||
}
|
||||
|
||||
void dbl_click(graph_reference graph, const arg_mouse& arg) override
|
||||
{
|
||||
mouse_down(graph, arg);
|
||||
}
|
||||
|
||||
void mouse_down(graph_reference graph, const arg_mouse& arg) override
|
||||
{
|
||||
if (arg.left_button)
|
||||
@ -330,14 +333,61 @@ namespace nana
|
||||
}//end namespace scroll
|
||||
}//end namespace drawerbase
|
||||
|
||||
class scroll_interface
|
||||
{
|
||||
public:
|
||||
using size_type = std::size_t;
|
||||
|
||||
virtual ~scroll_interface() = default;
|
||||
|
||||
/// \brief Determines whether it is scrollable.
|
||||
/// @param for_less whether it can be scrolled for a less value (backward or "up" if true, forward or "down" if false).
|
||||
virtual bool scrollable(bool for_less) const = 0;
|
||||
|
||||
/// the whole total (peak)
|
||||
virtual size_type amount() const = 0;
|
||||
|
||||
virtual void amount(size_type peak) = 0;
|
||||
|
||||
/// Get the range of the widget (how many is shonw on a page, that is, How many to scroll after click on first or second)
|
||||
virtual size_type range() const = 0;
|
||||
|
||||
/// Set the range of the widget.
|
||||
virtual void range(size_type r) = 0;
|
||||
|
||||
/// \brief Get the value (current offset calculated from the very beginnig)
|
||||
/// @return the value.
|
||||
virtual size_type value() const = 0;
|
||||
|
||||
/// \brief Set the value.
|
||||
/// @param s a new value.
|
||||
virtual void value(size_type s) = 0;
|
||||
|
||||
|
||||
/// \brief Get the step of the sroll widget. The step indicates a variation of the value.
|
||||
/// @return the step.
|
||||
virtual size_type step() const = 0;
|
||||
|
||||
/// \brief Set the step.
|
||||
/// @param s a value for step.
|
||||
virtual void step(size_type s) = 0;
|
||||
|
||||
/// \brief Increase/decrease values by a step (alternativelly by some number of steps).
|
||||
/// @param forward it determines whether increase or decrease.
|
||||
/// @return true if the value is changed.
|
||||
virtual bool make_step(bool forward, unsigned steps = 1) = 0;
|
||||
|
||||
virtual window window_handle() const = 0;
|
||||
};
|
||||
|
||||
/// Provides a way to display an object which is larger than the window's client area.
|
||||
template<bool Vertical>
|
||||
class scroll // add a widget scheme?
|
||||
: public widget_object<category::widget_tag, drawerbase::scroll::trigger<Vertical>, drawerbase::scroll::scroll_events>
|
||||
: public widget_object<category::widget_tag, drawerbase::scroll::trigger<Vertical>, drawerbase::scroll::scroll_events>,
|
||||
public scroll_interface
|
||||
{
|
||||
typedef widget_object<category::widget_tag, drawerbase::scroll::trigger<Vertical> > base_type;
|
||||
public:
|
||||
typedef std::size_t size_type;
|
||||
|
||||
/// \brief The default constructor without creating the widget.
|
||||
scroll(){}
|
||||
@ -361,59 +411,58 @@ namespace nana
|
||||
|
||||
/// \brief Determines whether it is scrollable.
|
||||
/// @param for_less whether it can be scrolled for a less value (backward or "up" if true, forward or "down" if false).
|
||||
bool scrollable(bool for_less) const
|
||||
bool scrollable(bool for_less) const override
|
||||
{
|
||||
auto & m = this->get_drawer_trigger().metrics();
|
||||
return (for_less ? (0 != m.value) : (m.value < m.peak - m.range));
|
||||
}
|
||||
/// the whole total (peak)
|
||||
size_type amount() const
|
||||
size_type amount() const override
|
||||
{
|
||||
return this->get_drawer_trigger().metrics().peak;
|
||||
}
|
||||
|
||||
void amount(size_type Max)
|
||||
void amount(size_type peak) override
|
||||
{
|
||||
return this->get_drawer_trigger().peak(Max);
|
||||
return this->get_drawer_trigger().peak(peak);
|
||||
}
|
||||
|
||||
/// Get the range of the widget (how many is shonw on a page, that is, How many to scroll after click on first or second)
|
||||
size_type range() const
|
||||
size_type range() const override
|
||||
{
|
||||
return this->get_drawer_trigger().metrics().range;
|
||||
}
|
||||
|
||||
/// Set the range of the widget.
|
||||
void range(size_type r)
|
||||
void range(size_type r) override
|
||||
{
|
||||
return this->get_drawer_trigger().range(r);
|
||||
}
|
||||
|
||||
/// \brief Get the value (current offset calculated from the very beginnig)
|
||||
/// @return the value.
|
||||
size_type value() const
|
||||
size_type value() const override
|
||||
{
|
||||
return this->get_drawer_trigger().metrics().value;
|
||||
}
|
||||
|
||||
/// \brief Set the value.
|
||||
/// @param s a new value.
|
||||
void value(size_type s)
|
||||
void value(size_type s) override
|
||||
{
|
||||
return this->get_drawer_trigger().value(s);
|
||||
}
|
||||
|
||||
|
||||
/// \brief Get the step of the sroll widget. The step indicates a variation of the value.
|
||||
/// @return the step.
|
||||
size_type step() const
|
||||
size_type step() const override
|
||||
{
|
||||
return this->get_drawer_trigger().metrics().step;
|
||||
}
|
||||
|
||||
/// \brief Set the step.
|
||||
/// @param s a value for step.
|
||||
void step(size_type s)
|
||||
void step(size_type s) override
|
||||
{
|
||||
return this->get_drawer_trigger().step(s);
|
||||
}
|
||||
@ -421,7 +470,7 @@ namespace nana
|
||||
/// \brief Increase/decrease values by a step (alternativelly by some number of steps).
|
||||
/// @param forward it determines whether increase or decrease.
|
||||
/// @return true if the value is changed.
|
||||
bool make_step(bool forward, unsigned steps = 1)
|
||||
bool make_step(bool forward, unsigned steps = 1) override
|
||||
{
|
||||
if (this->get_drawer_trigger().make_step(forward, steps))
|
||||
{
|
||||
@ -431,6 +480,11 @@ namespace nana
|
||||
return false;
|
||||
}
|
||||
|
||||
window window_handle() const override
|
||||
{
|
||||
return this->handle();
|
||||
}
|
||||
|
||||
/// \brief Increase/decrease values by steps as if it is scrolled through mouse wheel.
|
||||
/// @param forward it determines whether increase or decrease.
|
||||
/// @return true if the vlaue is changed.
|
||||
@ -444,7 +498,7 @@ namespace nana
|
||||
/// @return true if the vlaue is changed.
|
||||
bool make_page_scroll(bool forward)
|
||||
{
|
||||
return this->make_step(forward, range() - 1);
|
||||
return this->make_step(forward, static_cast<unsigned>(range() - 1));
|
||||
}
|
||||
};//end class scroll
|
||||
}//end namespace nana
|
||||
|
@ -14,7 +14,7 @@
|
||||
#ifndef NANA_GUI_SKELETONS_TEXT_EDITOR_HPP
|
||||
#define NANA_GUI_SKELETONS_TEXT_EDITOR_HPP
|
||||
#include "textbase.hpp"
|
||||
#include "text_editor_scheme.hpp"
|
||||
#include "text_editor_part.hpp"
|
||||
#include <nana/gui/widgets/scroll.hpp>
|
||||
#include <nana/unicode_bidi.hpp>
|
||||
|
||||
@ -135,6 +135,8 @@ namespace nana{ namespace widgets
|
||||
using size_type = textbase<char_type>::size_type;
|
||||
using string_type = textbase<char_type>::string_type;
|
||||
|
||||
using event_interface = text_editor_event_interface;
|
||||
|
||||
using graph_reference = ::nana::paint::graphics&;
|
||||
|
||||
struct ext_renderer_tag
|
||||
@ -162,6 +164,9 @@ namespace nana{ namespace widgets
|
||||
|
||||
void typeface_changed();
|
||||
|
||||
void indent(bool, std::function<nana::string()> generator);
|
||||
void set_event(event_interface*);
|
||||
|
||||
/// Determine whether the text_editor is line wrapped.
|
||||
bool line_wrapped() const;
|
||||
/// Set the text_editor whether it is line wrapped, it returns false if the state is not changed.
|
||||
@ -174,6 +179,10 @@ namespace nana{ namespace widgets
|
||||
/// Sets the text area.
|
||||
/// @return true if the area is changed with the new value.
|
||||
bool text_area(const nana::rectangle&);
|
||||
|
||||
/// Returns the text area
|
||||
rectangle text_area(bool including_scroll) const;
|
||||
|
||||
bool tip_string(nana::string&&);
|
||||
|
||||
const attributes & attr() const;
|
||||
@ -199,7 +208,7 @@ namespace nana{ namespace widgets
|
||||
/// Sets caret position through text coordinate.
|
||||
void move_caret(const upoint&);
|
||||
void move_caret_end();
|
||||
void reset_caret_height() const;
|
||||
void reset_caret_pixels() const;
|
||||
void reset_caret();
|
||||
void show_caret(bool isshow);
|
||||
|
||||
@ -207,16 +216,21 @@ namespace nana{ namespace widgets
|
||||
bool select(bool);
|
||||
/// Sets the end position of a selected string.
|
||||
void set_end_caret();
|
||||
|
||||
bool hit_text_area(const point&) const;
|
||||
bool hit_select_area(nana::upoint pos) const;
|
||||
|
||||
bool move_select();
|
||||
bool mask(char_t);
|
||||
|
||||
/// Returns width of text area excluding the vscroll size.
|
||||
unsigned width_pixels() const;
|
||||
window window_handle() const;
|
||||
|
||||
/// Returns text position of each line that currently displays on screen
|
||||
const std::vector<upoint>& text_position() const;
|
||||
public:
|
||||
void draw_scroll_rectangle();
|
||||
void draw_corner();
|
||||
void render(bool focused);
|
||||
public:
|
||||
void put(nana::string);
|
||||
@ -231,14 +245,13 @@ namespace nana{ namespace widgets
|
||||
void move_ns(bool to_north); //Moves up and down
|
||||
void move_left();
|
||||
void move_right();
|
||||
upoint mouse_caret(const point& screen_pos);
|
||||
upoint caret() const;
|
||||
const upoint& mouse_caret(const point& screen_pos);
|
||||
const upoint& caret() const;
|
||||
point caret_screen_pos() const;
|
||||
bool scroll(bool upwards, bool vertical);
|
||||
bool mouse_enter(bool);
|
||||
bool mouse_down(::nana::mouse, const point& screen_pos);
|
||||
bool mouse_move(bool left_button, const point& screen_pos);
|
||||
bool mouse_up(::nana::mouse, const point& screen_pos);
|
||||
bool mouse_pressed(const arg_mouse& arg);
|
||||
|
||||
skeletons::textbase<nana::char_t>& textbase();
|
||||
const skeletons::textbase<nana::char_t>& textbase() const;
|
||||
@ -267,10 +280,8 @@ namespace nana{ namespace widgets
|
||||
|
||||
int _m_text_top_base() const;
|
||||
|
||||
/// Returns the right point of text area.
|
||||
int _m_endx() const;
|
||||
/// Returns the bottom point of text area.
|
||||
int _m_endy() const;
|
||||
/// Returns the right/bottom point of text area.
|
||||
int _m_end_pos(bool right) const;
|
||||
|
||||
void _m_draw_parse_string(const keyword_parser&, bool rtl, ::nana::point pos, const ::nana::color& fgcolor, const ::nana::char_t*, std::size_t len) const;
|
||||
//_m_draw_string
|
||||
@ -286,7 +297,6 @@ namespace nana{ namespace widgets
|
||||
|
||||
unsigned _m_char_by_pixels(const nana::char_t*, std::size_t len, unsigned* pxbuf, int str_px, int pixels, bool is_rtl);
|
||||
unsigned _m_pixels_by_char(const nana::string&, std::size_t pos) const;
|
||||
static bool _m_is_right_text(const unicode_bidi::entity&);
|
||||
void _handle_move_key(const arg_keyboard& arg);
|
||||
|
||||
private:
|
||||
@ -294,7 +304,8 @@ namespace nana{ namespace widgets
|
||||
undoable<command> undo_;
|
||||
nana::window window_;
|
||||
graph_reference graph_;
|
||||
const text_editor_scheme* scheme_;
|
||||
const text_editor_scheme* scheme_;
|
||||
event_interface * event_handler_{ nullptr };
|
||||
std::unique_ptr<keywords> keywords_;
|
||||
|
||||
skeletons::textbase<nana::char_t> textbase_;
|
||||
@ -302,6 +313,14 @@ namespace nana{ namespace widgets
|
||||
|
||||
mutable ext_renderer_tag ext_renderer_;
|
||||
|
||||
std::vector<upoint> text_position_; //position of text from last rendering.
|
||||
|
||||
struct indent_rep
|
||||
{
|
||||
bool enabled{ false };
|
||||
std::function<nana::string()> generator;
|
||||
}indent_;
|
||||
|
||||
struct attributes
|
||||
{
|
||||
accepts acceptive{ accepts::no_restrict };
|
||||
@ -345,6 +364,7 @@ namespace nana{ namespace widgets
|
||||
{
|
||||
nana::point offset; //x stands for pixels, y for lines
|
||||
nana::upoint caret; //position of caret by text, it specifies the position of a new character
|
||||
nana::upoint shift_begin_caret;
|
||||
unsigned xpos{0}; //This data is used for move up/down
|
||||
}points_;
|
||||
};
|
||||
|
@ -3,6 +3,7 @@
|
||||
#define NANA_WIDGETS_SKELETONS_TEXT_EDITOR_SCHEME_HPP
|
||||
|
||||
#include "../../detail/widget_colors.hpp"
|
||||
#include <vector>
|
||||
|
||||
namespace nana
|
||||
{
|
||||
@ -10,12 +11,23 @@ namespace nana
|
||||
{
|
||||
namespace skeletons
|
||||
{
|
||||
//forward declaration
|
||||
class text_editor;
|
||||
|
||||
struct text_editor_scheme
|
||||
: public ::nana::widget_colors
|
||||
{
|
||||
color_proxy selection{static_cast<color_rgb>(0x3399FF)};
|
||||
color_proxy selection_text{colors::white};
|
||||
};
|
||||
|
||||
class text_editor_event_interface
|
||||
{
|
||||
public:
|
||||
virtual ~text_editor_event_interface() = default;
|
||||
|
||||
virtual void text_exposed(const std::vector<upoint>&) = 0;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
@ -249,60 +249,58 @@ namespace skeletons
|
||||
return true;
|
||||
}
|
||||
|
||||
void store(nana::string fs) const
|
||||
void store(nana::string fs, bool is_unicode, ::nana::unicode encoding) const
|
||||
{
|
||||
std::string fs_mbs = nana::charset(fs);
|
||||
std::ofstream ofs(fs_mbs.data(), std::ios::binary);
|
||||
if(ofs && text_cont_.size())
|
||||
{
|
||||
if(text_cont_.size() > 1)
|
||||
std::string last_mbs;
|
||||
|
||||
if (is_unicode)
|
||||
{
|
||||
for(auto i = text_cont_.cbegin(), end = text_cont_.cend() - 1; i != end; ++i)
|
||||
const char * le_boms[] = { "\xEF\xBB\xBF", "\xFF\xFE", "\xFF\xFE\x0\x0" }; //BOM for little-endian
|
||||
int bytes = 0;
|
||||
switch (encoding)
|
||||
{
|
||||
std::string mbs = nana::charset(*i);
|
||||
ofs.write(mbs.c_str(), mbs.size());
|
||||
ofs.write("\r\n", 2);
|
||||
case nana::unicode::utf8:
|
||||
bytes = 3; break;
|
||||
case nana::unicode::utf16:
|
||||
bytes = 2; break;
|
||||
case nana::unicode::utf32:
|
||||
bytes = 4; break;
|
||||
}
|
||||
}
|
||||
std::string mbs = nana::charset(text_cont_.back());
|
||||
ofs.write(mbs.c_str(), mbs.size());
|
||||
_m_saved(std::move(fs));
|
||||
}
|
||||
}
|
||||
|
||||
void store(nana::string fs, nana::unicode encoding) const
|
||||
{
|
||||
std::string fs_mbs = nana::charset(fs);
|
||||
std::ofstream ofs(fs_mbs.data(), std::ios::binary);
|
||||
if(ofs && text_cont_.size())
|
||||
{
|
||||
const char * le_boms[] = {"\xEF\xBB\xBF", "\xFF\xFE", "\xFF\xFE\x0\x0"}; //BOM for little-endian
|
||||
int bytes = 0;
|
||||
switch(encoding)
|
||||
{
|
||||
case nana::unicode::utf8:
|
||||
bytes = 3; break;
|
||||
case nana::unicode::utf16:
|
||||
bytes = 2; break;
|
||||
case nana::unicode::utf32:
|
||||
bytes = 4; break;
|
||||
}
|
||||
if (bytes)
|
||||
ofs.write(le_boms[static_cast<int>(encoding)], bytes);
|
||||
|
||||
if(bytes)
|
||||
ofs.write(le_boms[static_cast<int>(encoding)], bytes);
|
||||
|
||||
if(text_cont_.size() > 1)
|
||||
{
|
||||
std::string mbs;
|
||||
for(auto i = text_cont_.cbegin(), end = text_cont_.cend() - 1; i != end; ++i)
|
||||
if (text_cont_.size() > 1)
|
||||
{
|
||||
mbs = nana::charset(*i).to_bytes(encoding);
|
||||
mbs += "\r\n";
|
||||
ofs.write(mbs.c_str(), static_cast<std::streamsize>(mbs.size()));
|
||||
std::string mbs;
|
||||
for (auto i = text_cont_.cbegin(), end = text_cont_.cend() - 1; i != end; ++i)
|
||||
{
|
||||
std::string(nana::charset(*i).to_bytes(encoding)).swap(mbs);
|
||||
mbs += "\r\n";
|
||||
ofs.write(mbs.c_str(), static_cast<std::streamsize>(mbs.size()));
|
||||
}
|
||||
}
|
||||
|
||||
last_mbs = nana::charset(text_cont_.back()).to_bytes(encoding);
|
||||
}
|
||||
std::string mbs = nana::charset(text_cont_.back()).to_bytes(encoding);
|
||||
ofs.write(mbs.c_str(), static_cast<std::streamsize>(mbs.size()));
|
||||
else
|
||||
{
|
||||
if (text_cont_.size() > 1)
|
||||
{
|
||||
for (auto i = text_cont_.cbegin(), end = text_cont_.cend() - 1; i != end; ++i)
|
||||
{
|
||||
std::string mbs = nana::charset(*i);
|
||||
ofs.write(mbs.c_str(), mbs.size());
|
||||
ofs.write("\r\n", 2);
|
||||
}
|
||||
}
|
||||
last_mbs = nana::charset(text_cont_.back());
|
||||
}
|
||||
ofs.write(last_mbs.c_str(), static_cast<std::streamsize>(last_mbs.size()));
|
||||
_m_saved(std::move(fs));
|
||||
}
|
||||
}
|
||||
|
@ -13,7 +13,7 @@
|
||||
#ifndef NANA_GUI_WIDGET_SPINBOX_HPP
|
||||
#define NANA_GUI_WIDGET_SPINBOX_HPP
|
||||
#include "widget.hpp"
|
||||
#include "skeletons/text_editor_scheme.hpp"
|
||||
#include "skeletons/text_editor_part.hpp"
|
||||
|
||||
namespace nana
|
||||
{
|
||||
@ -109,16 +109,6 @@ namespace nana
|
||||
::nana::string _m_caption() const throw();
|
||||
void _m_caption(::nana::string&&);
|
||||
}; //end class spinbox
|
||||
|
||||
namespace dev
|
||||
{
|
||||
template<>
|
||||
struct widget_traits<spinbox>
|
||||
{
|
||||
using event_type = drawerbase::spinbox::spinbox_events;
|
||||
using scheme_type = ::nana::widgets::skeletons::text_editor_scheme;
|
||||
};
|
||||
}
|
||||
}//end namespace nana
|
||||
|
||||
#endif //NANA_GUI_WIDGET_SPINBOX_HPP
|
||||
|
@ -14,7 +14,6 @@
|
||||
#ifndef NANA_GUI_WIDGET_TABBAR_HPP
|
||||
#define NANA_GUI_WIDGET_TABBAR_HPP
|
||||
#include "widget.hpp"
|
||||
#include "../../paint/gadget.hpp"
|
||||
#include <nana/pat/cloneable.hpp>
|
||||
#include <nana/any.hpp>
|
||||
|
||||
@ -30,7 +29,7 @@ namespace nana
|
||||
T & value;
|
||||
|
||||
arg_tabbar(tabbar<T>& wdg, T& v)
|
||||
: widget{ wdg }, value{ v }
|
||||
: widget(wdg), value{ v }
|
||||
{}
|
||||
};
|
||||
|
||||
@ -141,7 +140,16 @@ namespace nana
|
||||
: public drawer_trigger
|
||||
{
|
||||
public:
|
||||
enum toolbox_button_t{ButtonAdd, ButtonScroll, ButtonList, ButtonClose};
|
||||
//enum toolbox_button_t{ButtonAdd, ButtonScroll, ButtonList, ButtonClose}; //deprecated
|
||||
|
||||
enum class kits
|
||||
{
|
||||
add,
|
||||
scroll,
|
||||
list,
|
||||
close
|
||||
};
|
||||
|
||||
trigger();
|
||||
~trigger();
|
||||
void activate(std::size_t);
|
||||
@ -159,7 +167,7 @@ namespace nana
|
||||
void tab_image(size_t, const nana::paint::image&);
|
||||
void text(std::size_t, const nana::string&);
|
||||
nana::string text(std::size_t) const;
|
||||
bool toolbox_button(toolbox_button_t, bool);
|
||||
bool toolbox(kits, bool);
|
||||
private:
|
||||
void attached(widget_reference, graph_reference) override;
|
||||
void detached() override;
|
||||
@ -183,18 +191,28 @@ namespace nana
|
||||
typedef Type value_type; ///< The type of element data which is stored in the tabbar.
|
||||
typedef drawerbase::tabbar::item_renderer item_renderer; ///< A user-defined item renderer should be derived from this interface.
|
||||
|
||||
//These member types is deprecated, they will be removed in Nana 1.3
|
||||
struct button_add{}; ///< The type identifies the add button of the tabbar's toolbox.
|
||||
struct button_scroll{}; ///< The type identifies the scroll button of the tabbar's toolbox.
|
||||
struct button_list{}; ///< The type identifies the list button of the tabbar's toolbox.
|
||||
struct button_close{}; ///< The type identifies the close button of the tabbar's toolbox.
|
||||
|
||||
/// A template class identifies the buttons of the tabbar’s toolbox. Refer to notes for more details.
|
||||
//This template class is deprecated, it will be removed in 1.3
|
||||
/// A template class identifies the buttons of the tabbar's toolbox. Refer to notes for more details.
|
||||
template<typename ButtonAdd = nana::null_type, typename ButtonScroll = nana::null_type, typename ButtonList = nana::null_type, typename ButtonClose = nana::null_type>
|
||||
struct button_container
|
||||
{
|
||||
typedef meta::fixed_type_set<ButtonAdd, ButtonScroll, ButtonList, ButtonClose> type_set;
|
||||
};
|
||||
|
||||
enum class kits
|
||||
{
|
||||
add, ///< The type identifies the add button of the tabbar's toolbox.
|
||||
scroll, ///< The type identifies the scroll button of the tabbar's toolbox
|
||||
list, ///< The type identifies the list button of the tabbar's toolbox
|
||||
close ///< The type identifies the close button of the tabbar's toolbox
|
||||
};
|
||||
|
||||
tabbar()
|
||||
{
|
||||
evt_agent_.reset(new drawerbase::tabbar::event_agent<value_type, drawer_trigger_t>(*this, this->get_drawer_trigger()));
|
||||
@ -305,22 +323,30 @@ namespace nana
|
||||
auto & tg = this->get_drawer_trigger();
|
||||
bool redraw = false;
|
||||
|
||||
using inner_kits = drawerbase::tabbar::trigger::kits;
|
||||
|
||||
if(type_set::template count<button_add>::value)
|
||||
redraw |= tg.toolbox_button(tg.ButtonAdd, enable);
|
||||
redraw |= tg.toolbox(inner_kits::add, enable);
|
||||
|
||||
if(type_set::template count<button_scroll>::value)
|
||||
redraw |= tg.toolbox_button(tg.ButtonScroll, enable);
|
||||
redraw |= tg.toolbox(inner_kits::scroll, enable);
|
||||
|
||||
if(type_set::template count<button_list>::value)
|
||||
redraw |= tg.toolbox_button(tg.ButtonList, enable);
|
||||
redraw |= tg.toolbox(inner_kits::add, enable);
|
||||
|
||||
if(type_set::template count<button_close>::value)
|
||||
redraw |= tg.toolbox_button(tg.ButtonClose, enable);
|
||||
redraw |= tg.toolbox(inner_kits::close, enable);
|
||||
|
||||
if(redraw)
|
||||
API::refresh_window(this->handle());
|
||||
}
|
||||
|
||||
void toolbox(kits kit, bool enable)
|
||||
{
|
||||
if (this->get_drawer_trigger().toolbox(kit, enable))
|
||||
API::refresh_window(this->handle());
|
||||
}
|
||||
|
||||
void text(std::size_t pos, const nana::string& str) /// Sets the title of the specified item, If pos is invalid, the method throws an std::out_of_range object.
|
||||
{
|
||||
this->get_drawer_trigger().text(pos, str);
|
||||
@ -337,15 +363,19 @@ namespace nana
|
||||
|
||||
|
||||
namespace nana
|
||||
{
|
||||
namespace ng
|
||||
{
|
||||
{
|
||||
namespace drawerbase
|
||||
{
|
||||
namespace tabbar_lite
|
||||
{
|
||||
class model;
|
||||
|
||||
struct events
|
||||
: public general_events
|
||||
{
|
||||
basic_event<event_arg> selected;
|
||||
};
|
||||
|
||||
class driver
|
||||
: public drawer_trigger
|
||||
{
|
||||
@ -353,7 +383,7 @@ namespace nana
|
||||
driver();
|
||||
~driver();
|
||||
|
||||
model* get_model();
|
||||
model* get_model() const throw();
|
||||
private:
|
||||
//Overrides drawer_trigger's method
|
||||
void attached(widget_reference, graph_reference) override;
|
||||
@ -367,18 +397,26 @@ namespace nana
|
||||
}
|
||||
}//end namespace drawerbase
|
||||
|
||||
class tabbar_lite
|
||||
: public widget_object<category::widget_tag, drawerbase::tabbar_lite::driver>
|
||||
{
|
||||
public:
|
||||
tabbar_lite() = default;
|
||||
tabbar_lite(window, bool visible = true, const::nana::rectangle& = {});
|
||||
class tabbar_lite
|
||||
: public widget_object<category::widget_tag, drawerbase::tabbar_lite::driver, drawerbase::tabbar_lite::events>
|
||||
{
|
||||
public:
|
||||
tabbar_lite() = default;
|
||||
tabbar_lite(window, bool visible = true, const::nana::rectangle& = {});
|
||||
|
||||
public: //capacity
|
||||
std::size_t length() const;
|
||||
|
||||
void push_back(std::string text, ::nana::any par = {});
|
||||
void push_front(std::string text, ::nana::any par = {});
|
||||
};
|
||||
}
|
||||
public: //modifiers
|
||||
void attach(std::size_t pos, window);
|
||||
window attach(std::size_t pos) const;
|
||||
|
||||
void push_back(std::string text, ::nana::any par = {});
|
||||
void push_front(std::string text, ::nana::any par = {});
|
||||
|
||||
std::size_t selected() const;
|
||||
void erase(std::size_t pos, bool close_attached = true);
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -13,7 +13,7 @@
|
||||
#define NANA_GUI_WIDGET_TEXTBOX_HPP
|
||||
#include <nana/gui/widgets/widget.hpp>
|
||||
#include "skeletons/textbase_export_interface.hpp"
|
||||
#include "skeletons/text_editor_scheme.hpp"
|
||||
#include "skeletons/text_editor_part.hpp"
|
||||
|
||||
namespace nana
|
||||
{
|
||||
@ -23,18 +23,11 @@ namespace nana
|
||||
: public event_arg
|
||||
{
|
||||
textbox& widget;
|
||||
const std::vector<upoint>& text_position; ///< position of characters that the first character of line which are displayed
|
||||
|
||||
arg_textbox(textbox&);
|
||||
arg_textbox(textbox&, const std::vector<upoint>&);
|
||||
};
|
||||
|
||||
namespace widgets
|
||||
{
|
||||
namespace skeletons
|
||||
{
|
||||
class text_editor;
|
||||
}
|
||||
}
|
||||
|
||||
namespace drawerbase
|
||||
{
|
||||
namespace textbox
|
||||
@ -44,17 +37,25 @@ namespace nana
|
||||
{
|
||||
basic_event<arg_textbox> first_change;
|
||||
basic_event<arg_textbox> text_changed;
|
||||
basic_event<arg_textbox> text_exposed;
|
||||
};
|
||||
|
||||
class event_agent
|
||||
: public widgets::skeletons::textbase_event_agent_interface
|
||||
: public widgets::skeletons::textbase_event_agent_interface,
|
||||
public widgets::skeletons::text_editor_event_interface
|
||||
{
|
||||
public:
|
||||
event_agent(::nana::textbox&);
|
||||
event_agent(::nana::textbox&, const std::vector<upoint>&);
|
||||
private:
|
||||
//Overrides textbase_event_agent_interface
|
||||
void first_change() override;
|
||||
void text_changed() override;
|
||||
private:
|
||||
//Overrides text_editor_event_interface
|
||||
void text_exposed(const std::vector<upoint>&) override;
|
||||
private:
|
||||
::nana::textbox & widget_;
|
||||
const std::vector<upoint>& text_position_;
|
||||
};
|
||||
|
||||
//class drawer
|
||||
@ -97,6 +98,7 @@ namespace nana
|
||||
:public widget_object<category::widget_tag, drawerbase::textbox::drawer, drawerbase::textbox::textbox_events, ::nana::widgets::skeletons::text_editor_scheme>
|
||||
{
|
||||
public:
|
||||
using text_positions = std::vector<upoint>;
|
||||
/// The default constructor without creating the widget.
|
||||
textbox();
|
||||
|
||||
@ -128,8 +130,12 @@ namespace nana
|
||||
void store(nana::string file);
|
||||
void store(nana::string file, nana::unicode encoding);
|
||||
|
||||
/// Enables/disables the textbox to indent a line. Idents a new line when it is created by pressing enter.
|
||||
/// @param generator generates text for identing a line. If it is empty, textbox indents the line according to last line.
|
||||
textbox& indention(bool, std::function<nana::string()> generator = {});
|
||||
|
||||
//A workaround for reset, explicit default constructor syntax, because VC2013 incorrectly treats {} as {0}.
|
||||
textbox& reset(nana::string = nana::string()); ///< discard the old text and set a newtext
|
||||
textbox& reset(nana::string = nana::string()); ///< discard the old text and set a new text
|
||||
|
||||
/// The file of last store operation.
|
||||
nana::string filename() const;
|
||||
@ -147,8 +153,12 @@ namespace nana
|
||||
bool getline(std::size_t pos, nana::string&) const;
|
||||
|
||||
/// Gets the caret position
|
||||
/// Returns true if the caret is in the area of display, false otherwise.
|
||||
bool caret_pos(point& pos, bool text_coordinate) const;
|
||||
|
||||
/// Sets the caret position with a text position
|
||||
textbox& caret_pos(const upoint&);
|
||||
|
||||
/// 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 nana::string& text, bool at_caret);
|
||||
|
||||
@ -188,22 +198,21 @@ namespace nana
|
||||
void set_keywords(const std::string& name, bool case_sensitive, bool whole_word_match, std::initializer_list<nana::string> kw_list);
|
||||
void set_keywords(const std::string& name, bool case_sensitive, bool whole_word_match, std::initializer_list<std::string> kw_list_utf8);
|
||||
void erase_keyword(const nana::string& kw);
|
||||
|
||||
|
||||
/// Returns the text position of each line that currently displays on screen.
|
||||
text_positions text_position() const;
|
||||
|
||||
/// Returns the rectangle of text area
|
||||
rectangle text_area() const;
|
||||
|
||||
/// Returns the height of line in pixels
|
||||
unsigned line_pixels() const;
|
||||
protected:
|
||||
//Overrides widget's virtual functions
|
||||
::nana::string _m_caption() const throw() override;
|
||||
void _m_caption(::nana::string&&) override;
|
||||
void _m_typeface(const paint::font&) override;
|
||||
};
|
||||
|
||||
namespace dev
|
||||
{
|
||||
/// Traits for widget classes
|
||||
template<>
|
||||
struct widget_traits<textbox>
|
||||
{
|
||||
using event_type = drawerbase::textbox::textbox_events;
|
||||
using scheme_type = ::nana::widgets::skeletons::text_editor_scheme;
|
||||
};
|
||||
}
|
||||
}//end namespace nana
|
||||
#endif
|
||||
|
@ -19,7 +19,6 @@
|
||||
#define NANA_GUI_WIDGETS_TREEBOX_HPP
|
||||
#include "widget.hpp"
|
||||
#include "detail/compset.hpp"
|
||||
#include <nana/paint/gadget.hpp>
|
||||
#include "detail/tree_cont.hpp"
|
||||
#include <nana/gui/timer.hpp>
|
||||
#include <nana/any.hpp>
|
||||
@ -167,8 +166,6 @@ namespace nana
|
||||
void resized(graph_reference, const arg_resized&) override;
|
||||
void key_press(graph_reference, const arg_keyboard&) override;
|
||||
void key_char(graph_reference, const arg_keyboard&) override;
|
||||
private:
|
||||
void _m_deal_adjust();
|
||||
private:
|
||||
implement * const impl_;
|
||||
}; //end class trigger
|
||||
|
@ -134,7 +134,8 @@ namespace nana
|
||||
protected:
|
||||
typedef DrawerTrigger drawer_trigger_t;
|
||||
public:
|
||||
using scheme_type = Scheme;
|
||||
using scheme_type = Scheme;
|
||||
using event_type = Events;
|
||||
|
||||
widget_object()
|
||||
: events_{ std::make_shared<Events>() },
|
||||
@ -147,7 +148,7 @@ namespace nana
|
||||
API::close_window(handle_);
|
||||
}
|
||||
|
||||
Events& events() const
|
||||
event_type& events() const
|
||||
{
|
||||
return *events_;
|
||||
}
|
||||
@ -228,6 +229,7 @@ namespace nana
|
||||
typedef DrawerTrigger drawer_trigger_t;
|
||||
public:
|
||||
using scheme_type = Scheme;
|
||||
using event_type = Events;
|
||||
|
||||
widget_object()
|
||||
: events_{ std::make_shared<Events>() }, scheme_{ API::dev::make_scheme<scheme_type>() }
|
||||
@ -239,7 +241,7 @@ namespace nana
|
||||
API::close_window(handle_);
|
||||
}
|
||||
|
||||
Events& events() const
|
||||
event_type& events() const
|
||||
{
|
||||
return *events_;
|
||||
}
|
||||
@ -297,6 +299,7 @@ namespace nana
|
||||
typedef DrawerTrigger drawer_trigger_t;
|
||||
public:
|
||||
using scheme_type = Scheme;
|
||||
using event_type = Events;
|
||||
|
||||
widget_object()
|
||||
{
|
||||
@ -322,7 +325,7 @@ namespace nana
|
||||
API::close_window(handle_);
|
||||
}
|
||||
|
||||
Events& events() const
|
||||
event_type& events() const
|
||||
{
|
||||
return *events_;
|
||||
}
|
||||
@ -451,6 +454,7 @@ namespace nana
|
||||
typedef int drawer_trigger_t;
|
||||
public:
|
||||
using scheme_type = Scheme;
|
||||
using event_type = Events;
|
||||
|
||||
widget_object()
|
||||
: events_{ std::make_shared<Events>() }, scheme_{ API::dev::make_scheme<scheme_type>() }
|
||||
@ -462,7 +466,7 @@ namespace nana
|
||||
API::close_window(handle_);
|
||||
}
|
||||
|
||||
Events& events() const
|
||||
event_type& events() const
|
||||
{
|
||||
return *events_;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Nana GUI Library Definition
|
||||
* Nana C++ Library(http://www.nanapro.org)
|
||||
* Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com)
|
||||
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
|
||||
*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
@ -20,27 +20,43 @@
|
||||
#include "widgets/form.hpp"
|
||||
#include "drawing.hpp"
|
||||
#include "msgbox.hpp"
|
||||
#include "../exceptions.hpp"
|
||||
#include "place.hpp"
|
||||
|
||||
namespace nana
|
||||
{
|
||||
template<typename Form, bool IsMakeVisible = true>
|
||||
class form_loader
|
||||
namespace detail
|
||||
{
|
||||
public:
|
||||
template<typename... Args>
|
||||
Form & operator()(Args &&... args) const
|
||||
struct form_loader_private
|
||||
{
|
||||
Form* res = detail::bedrock::instance().rt_manager.create_form<Form>(std::forward<Args>(args)...);
|
||||
if (nullptr == res)
|
||||
throw nana::bad_window("form_loader.operator(): failed to create a window");
|
||||
template<typename, bool> friend class form_loader;
|
||||
private:
|
||||
static void insert_form(::nana::widget*);
|
||||
};
|
||||
|
||||
if (IsMakeVisible) res->show();
|
||||
template<typename Form, bool IsVisible>
|
||||
class form_loader
|
||||
{
|
||||
public:
|
||||
template<typename... Args>
|
||||
Form & operator()(Args &&... args) const
|
||||
{
|
||||
auto p = new Form(std::forward<Args>(args)...);
|
||||
|
||||
return *res;
|
||||
}
|
||||
if (p->empty())
|
||||
throw std::logic_error("form_loader failed to create the form");
|
||||
|
||||
};
|
||||
detail::form_loader_private::insert_form(p);
|
||||
if (IsVisible)
|
||||
p->show();
|
||||
|
||||
return *p;
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
template<typename Form, bool IsVisible = true>
|
||||
using form_loader = detail::form_loader<Form, IsVisible>;
|
||||
|
||||
void exec();
|
||||
}//end namespace nana
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Image Processor Algorithm Implementation
|
||||
* Nana C++ Library(http://www.nanapro.org)
|
||||
* Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com)
|
||||
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
|
||||
*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
@ -28,6 +28,18 @@ namespace detail
|
||||
{
|
||||
namespace algorithms
|
||||
{
|
||||
///@brief Seek a pixel address by using offset bytes
|
||||
///@return the specified pixel address
|
||||
inline pixel_color_t * pixel_at(pixel_color_t * p, std::size_t bytes)
|
||||
{
|
||||
return reinterpret_cast<pixel_color_t*>(reinterpret_cast<char*>(p) + bytes);
|
||||
}
|
||||
|
||||
inline const pixel_color_t * pixel_at(const pixel_color_t * p, std::size_t bytes)
|
||||
{
|
||||
return reinterpret_cast<const pixel_color_t*>(reinterpret_cast<const char*>(p) + bytes);
|
||||
}
|
||||
|
||||
class proximal_interoplation
|
||||
: public image_process::stretch_interface
|
||||
{
|
||||
@ -233,9 +245,9 @@ namespace detail
|
||||
std::size_t coef2 = el.iu * iv_minus_coef;
|
||||
std::size_t coef3 = el.iu * iv;
|
||||
|
||||
i->element.red = static_cast<unsigned>((coef0 * col0.element.red + coef1 * col1.element.red + (coef2 * col2.element.red + coef3 * col3.element.red)) >> double_shift_size);
|
||||
i->element.green = static_cast<unsigned>((coef0 * col0.element.green + coef1 * col1.element.green + (coef2 * col2.element.green + coef3 * col3.element.green)) >> double_shift_size);
|
||||
i->element.blue = static_cast<unsigned>((coef0 * col0.element.blue + coef1 * col1.element.blue + (coef2 * col2.element.blue + coef3 * col3.element.blue)) >> double_shift_size);
|
||||
i->element.red = static_cast<unsigned char>((coef0 * col0.element.red + coef1 * col1.element.red + (coef2 * col2.element.red + coef3 * col3.element.red)) >> double_shift_size);
|
||||
i->element.green = static_cast<unsigned char>((coef0 * col0.element.green + coef1 * col1.element.green + (coef2 * col2.element.green + coef3 * col3.element.green)) >> double_shift_size);
|
||||
i->element.blue = static_cast<unsigned char>((coef0 * col0.element.blue + coef1 * col1.element.blue + (coef2 * col2.element.blue + coef3 * col3.element.blue)) >> double_shift_size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,33 +0,0 @@
|
||||
/*
|
||||
* Graphics Gadget Implementation
|
||||
* Nana C++ Library(http://www.nanapro.org)
|
||||
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
|
||||
*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* @file: nana/paint/gadget.hpp
|
||||
*/
|
||||
|
||||
#ifndef NANA_PAINT_GADGET_HPP
|
||||
#define NANA_PAINT_GADGET_HPP
|
||||
#include "graphics.hpp"
|
||||
#include "image.hpp"
|
||||
#include <nana/basic_types.hpp>
|
||||
|
||||
namespace nana
|
||||
{
|
||||
namespace paint
|
||||
{
|
||||
namespace gadget
|
||||
{
|
||||
void close_16_pixels(::nana::paint::graphics&, int x, int y, unsigned style, const color&);
|
||||
void cross(::nana::paint::graphics&, int x, int y, unsigned size, unsigned thickness, const nana::color&);
|
||||
|
||||
}//end namespace gadget
|
||||
|
||||
}//end namespace paint
|
||||
}//end namespace nana
|
||||
|
||||
#endif
|
@ -136,8 +136,11 @@ namespace nana
|
||||
/// @param file_utf8 A UTF-8 string to a filename
|
||||
void save_as_file(const char* file_utf8) const throw();
|
||||
|
||||
void set_color(const ::nana::color&);
|
||||
void set_text_color(const ::nana::color&);
|
||||
void set_color(const ::nana::color&); //deprecated, graphics::palette() instead
|
||||
void set_text_color(const ::nana::color&); //deprecated, graphics::palette() instead
|
||||
|
||||
::nana::color palette(bool for_text) const;
|
||||
graphics& palette(bool for_text, const ::nana::color&);
|
||||
|
||||
unsigned bidi_string(const nana::point&, const char_t *, std::size_t len);
|
||||
unsigned bidi_string(const point& pos, const char*, std::size_t len);
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Pixel Buffer Implementation
|
||||
* Nana C++ Library(http://www.nanapro.org)
|
||||
* Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com)
|
||||
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
|
||||
*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
@ -18,18 +18,6 @@
|
||||
|
||||
namespace nana{ namespace paint
|
||||
{
|
||||
///@brief Seek a pixel address by using offset bytes
|
||||
///@return the specified pixel address
|
||||
inline pixel_color_t * pixel_at(pixel_color_t * p, std::size_t bytes)
|
||||
{
|
||||
return reinterpret_cast<pixel_color_t*>(reinterpret_cast<char*>(p)+bytes);
|
||||
}
|
||||
|
||||
inline const pixel_color_t * pixel_at(const pixel_color_t * p, std::size_t bytes)
|
||||
{
|
||||
return reinterpret_cast<const pixel_color_t*>(reinterpret_cast<const char*>(p)+bytes);
|
||||
}
|
||||
|
||||
class pixel_buffer
|
||||
{
|
||||
struct pixel_buffer_storage;
|
||||
@ -65,6 +53,8 @@ namespace nana{ namespace paint
|
||||
pixel_color_t * raw_ptr(std::size_t row) const;
|
||||
pixel_color_t * operator[](std::size_t row) const;
|
||||
|
||||
void fill_row(std::size_t row, const unsigned char* buffer, std::size_t bytes, unsigned bits_per_pixel);
|
||||
|
||||
void put(const unsigned char* rawbits, std::size_t width, std::size_t height, std::size_t bits_per_pixel, std::size_t bytes_per_line, bool is_negative);
|
||||
|
||||
void line(const std::string& name);
|
||||
|
@ -13,6 +13,7 @@
|
||||
|
||||
#ifndef NANA_PAT_ABSFACTORY_HPP
|
||||
#define NANA_PAT_ABSFACTORY_HPP
|
||||
#include "cloneable.hpp"
|
||||
#include <memory>
|
||||
|
||||
namespace nana
|
||||
|
@ -21,62 +21,50 @@ namespace nana{ namespace pat{
|
||||
|
||||
namespace detail
|
||||
{
|
||||
template<typename T>
|
||||
class cloneable_interface
|
||||
{
|
||||
public:
|
||||
typedef T interface_t;
|
||||
typedef cloneable_interface cloneable_t;
|
||||
virtual ~cloneable_interface() = default;
|
||||
virtual interface_t& refer() = 0;
|
||||
virtual const interface_t& refer() const = 0;
|
||||
virtual cloneable_t* clone() const = 0;
|
||||
virtual void * get() = 0;
|
||||
virtual cloneable_interface* clone() const = 0;
|
||||
virtual void self_delete() const = 0;
|
||||
};
|
||||
|
||||
struct cloneable_interface_deleter
|
||||
{
|
||||
void operator()(cloneable_interface * p)
|
||||
{
|
||||
if (p)
|
||||
p->self_delete();
|
||||
}
|
||||
};
|
||||
|
||||
template<typename T, typename SuperOfT>
|
||||
template<typename T>
|
||||
class cloneable_wrapper
|
||||
: public cloneable_interface<SuperOfT>
|
||||
: public cloneable_interface
|
||||
{
|
||||
public:
|
||||
typedef T value_t;
|
||||
typedef typename cloneable_interface<SuperOfT>::interface_t interface_t;
|
||||
using value_type = T;
|
||||
|
||||
cloneable_wrapper()
|
||||
cloneable_wrapper() = default;
|
||||
|
||||
cloneable_wrapper(const value_type& obj)
|
||||
:value_obj_(obj)
|
||||
{}
|
||||
|
||||
cloneable_wrapper(const value_t& obj)
|
||||
:object_(obj)
|
||||
cloneable_wrapper(value_type&& rv)
|
||||
:value_obj_(std::move(rv))
|
||||
{}
|
||||
|
||||
cloneable_wrapper(value_t&& rv)
|
||||
:object_(std::move(rv))
|
||||
{}
|
||||
|
||||
template<typename U>
|
||||
cloneable_wrapper(const U& u)
|
||||
: object_(u)
|
||||
{}
|
||||
|
||||
template<typename U>
|
||||
cloneable_wrapper(U& u)
|
||||
:object_(u)
|
||||
{}
|
||||
|
||||
virtual interface_t& refer() override
|
||||
private:
|
||||
//Implement cloneable_interface
|
||||
virtual void* get() override
|
||||
{
|
||||
return object_;
|
||||
return &value_obj_;
|
||||
}
|
||||
|
||||
virtual const interface_t& refer() const override
|
||||
virtual cloneable_interface* clone() const override
|
||||
{
|
||||
return object_;
|
||||
}
|
||||
|
||||
virtual cloneable_interface<interface_t>* clone() const override
|
||||
{
|
||||
return (new cloneable_wrapper(object_));
|
||||
return (new cloneable_wrapper{ value_obj_ });
|
||||
}
|
||||
|
||||
virtual void self_delete() const override
|
||||
@ -84,28 +72,20 @@ namespace nana{ namespace pat{
|
||||
(delete this);
|
||||
}
|
||||
private:
|
||||
value_t object_;
|
||||
value_type value_obj_;
|
||||
};
|
||||
|
||||
}//end namespace detail
|
||||
|
||||
template<typename Base, bool Mutable = false>
|
||||
class cloneable
|
||||
{
|
||||
using base_t = Base;
|
||||
using interface_t = detail::cloneable_interface < base_t > ;
|
||||
using cloneable_interface = detail::cloneable_interface;
|
||||
|
||||
using const_base_ptr = typename std::conditional<Mutable, base_t*, const base_t*>::type;
|
||||
using const_base_ref = typename std::conditional<Mutable, base_t&, const base_t&>::type;
|
||||
|
||||
struct deleter
|
||||
{
|
||||
void operator()(interface_t * p)
|
||||
{
|
||||
if(p)
|
||||
p->self_delete();
|
||||
}
|
||||
};
|
||||
template<typename OtherBase, bool OtherMutable> friend class cloneable;
|
||||
|
||||
struct inner_bool
|
||||
{
|
||||
@ -125,16 +105,16 @@ namespace nana{ namespace pat{
|
||||
|
||||
template<typename T, typename member_enabled<T>::type* = nullptr>
|
||||
cloneable(T&& t)
|
||||
: cwrapper_(new detail::cloneable_wrapper<typename std::remove_cv<typename std::remove_reference<T>::type>::type, base_t>(std::forward<T>(t)), deleter()),
|
||||
fast_ptr_(&(cwrapper_->refer()))
|
||||
: cwrapper_(new detail::cloneable_wrapper<typename std::remove_cv<typename std::remove_reference<T>::type>::type>(std::forward<T>(t)), detail::cloneable_interface_deleter()),
|
||||
fast_ptr_(reinterpret_cast<typename std::remove_cv<typename std::remove_reference<T>::type>::type*>(cwrapper_->get()))
|
||||
{}
|
||||
|
||||
cloneable(const cloneable& r)
|
||||
{
|
||||
if(r.cwrapper_)
|
||||
{
|
||||
cwrapper_ = std::shared_ptr<interface_t>(r.cwrapper_->clone(), deleter());
|
||||
fast_ptr_ = &(cwrapper_->refer());
|
||||
cwrapper_ = std::move(std::shared_ptr<cloneable_interface>(r.cwrapper_->clone(), detail::cloneable_interface_deleter{}));
|
||||
fast_ptr_ = reinterpret_cast<base_t*>(cwrapper_->get());
|
||||
}
|
||||
}
|
||||
|
||||
@ -145,12 +125,27 @@ namespace nana{ namespace pat{
|
||||
r.fast_ptr_ = nullptr;
|
||||
}
|
||||
|
||||
template<typename OtherBase, typename std::enable_if<std::is_base_of<base_t, OtherBase>::value>::type* = nullptr>
|
||||
cloneable(const cloneable<OtherBase, Mutable>& other)
|
||||
{
|
||||
if (other)
|
||||
{
|
||||
char* value_ptr = reinterpret_cast<char*>(other.cwrapper_->get());
|
||||
char* base_ptr = reinterpret_cast<char*>(other.fast_ptr_);
|
||||
|
||||
auto ptr_diff = std::distance(base_ptr, value_ptr);
|
||||
|
||||
cwrapper_.reset(other.cwrapper_->clone(), detail::cloneable_interface_deleter{});
|
||||
fast_ptr_ = reinterpret_cast<OtherBase*>(reinterpret_cast<char*>(cwrapper_->get()) - ptr_diff);
|
||||
}
|
||||
}
|
||||
|
||||
cloneable & operator=(const cloneable& r)
|
||||
{
|
||||
if((this != &r) && r.cwrapper_)
|
||||
{
|
||||
cwrapper_ = std::shared_ptr<interface_t>(r.cwrapper_->clone(), deleter());
|
||||
fast_ptr_ = &(cwrapper_->refer());
|
||||
cwrapper_ = std::shared_ptr<cloneable_interface>(r.cwrapper_->clone(), detail::cloneable_interface_deleter());
|
||||
fast_ptr_ = reinterpret_cast<base_t*>(cwrapper_->get());
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
@ -159,10 +154,8 @@ namespace nana{ namespace pat{
|
||||
{
|
||||
if(this != &r)
|
||||
{
|
||||
cwrapper_ = r.cwrapper_;
|
||||
cwrapper_ = std::move(r.cwrapper_);
|
||||
fast_ptr_ = r.fast_ptr_;
|
||||
|
||||
r.cwrapper_.reset();
|
||||
r.fast_ptr_ = nullptr;
|
||||
}
|
||||
return *this;
|
||||
@ -204,12 +197,12 @@ namespace nana{ namespace pat{
|
||||
return (fast_ptr_ ? &inner_bool::true_stand : nullptr);
|
||||
}
|
||||
private:
|
||||
std::shared_ptr<interface_t> cwrapper_;
|
||||
std::shared_ptr<cloneable_interface> cwrapper_;
|
||||
base_t * fast_ptr_{nullptr};
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
using mutable_cloneable = cloneable < T, true > ;
|
||||
using mutable_cloneable = cloneable<T, true>;
|
||||
}//end namespace pat
|
||||
}//end namespace nana
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
|
||||
#include <nana/deploy.hpp>
|
||||
#include <nana/traits.hpp>
|
||||
#include <nana/exceptions.hpp>
|
||||
#include <stdexcept>
|
||||
|
||||
|
||||
namespace nana
|
||||
@ -70,19 +70,19 @@ namespace system
|
||||
typedef typename function_ptr<Function>::type fptr_type;
|
||||
|
||||
if(nana::traits::is_function_pointer<fptr_type>::value == false)
|
||||
throw nana::bad_error("shared_wrapper::symbols, template<_Function> is not a function type or a function pointer type");
|
||||
throw std::invalid_argument("shared_wrapper::symbols, template<_Function> is not a function type or a function pointer type");
|
||||
|
||||
if(symbol == 0)
|
||||
throw nana::bad_handle("shared_wrapper::symbols, symbol is null string");
|
||||
throw std::invalid_argument("shared_wrapper::symbols, symbol is null string");
|
||||
|
||||
if(impl_.handle == 0)
|
||||
throw nana::bad_handle("shared_wrapper::symbols, empty handle");
|
||||
throw std::logic_error("shared_wrapper::symbols, empty handle");
|
||||
|
||||
if(impl_.symbol != symbol)
|
||||
{
|
||||
void *result = detail::shared_helper::symbols(impl_.handle, symbol);
|
||||
if(result == 0)
|
||||
throw nana::bad_handle("shared_wrapper::symbols, empty proc address");
|
||||
throw std::logic_error("shared_wrapper::symbols, empty proc address");
|
||||
|
||||
impl_.proc_address = result;
|
||||
impl_.symbol = symbol;
|
||||
|
@ -20,7 +20,7 @@
|
||||
#include <windows.h>
|
||||
#elif defined(NANA_LINUX)
|
||||
#include <string.h>
|
||||
#include PLATFORM_SPEC_HPP
|
||||
#include <nana/detail/platform_spec_selector.hpp>
|
||||
#endif
|
||||
|
||||
//Implement workarounds for GCC/MinGW which version is below 4.8.2
|
||||
|
@ -13,9 +13,7 @@
|
||||
*
|
||||
* http://standards.freedesktop.org/clipboards-spec/clipboards-0.1.txt
|
||||
*/
|
||||
#include <nana/config.hpp>
|
||||
|
||||
#include PLATFORM_SPEC_HPP
|
||||
#include <nana/detail/platform_spec_selector.hpp>
|
||||
#include <X11/Xlocale.h>
|
||||
#include <locale>
|
||||
#include <map>
|
||||
@ -24,6 +22,7 @@
|
||||
#include <nana/paint/graphics.hpp>
|
||||
#include <nana/gui/detail/bedrock.hpp>
|
||||
#include <nana/gui/detail/basic_window.hpp>
|
||||
#include <nana/gui/detail/window_manager.hpp>
|
||||
#include <nana/system/platform.hpp>
|
||||
#include <errno.h>
|
||||
#include <sstream>
|
||||
@ -302,14 +301,24 @@ namespace detail
|
||||
#endif
|
||||
}
|
||||
|
||||
unsigned drawable_impl_type::get_color() const
|
||||
{
|
||||
return color_;
|
||||
}
|
||||
|
||||
unsigned drawable_impl_type::get_text_color() const
|
||||
{
|
||||
return text_color_;
|
||||
}
|
||||
|
||||
void drawable_impl_type::set_color(const ::nana::color& clr)
|
||||
{
|
||||
color_ = clr.px_color().value;
|
||||
color_ = (clr.px_color().value & 0xFFFFFF);
|
||||
}
|
||||
|
||||
void drawable_impl_type::set_text_color(const ::nana::color& clr)
|
||||
{
|
||||
text_color_ = clr.px_color().value;
|
||||
text_color_ = (clr.px_color().value & 0xFFFFFF);
|
||||
update_text_color();
|
||||
}
|
||||
|
||||
@ -686,7 +695,7 @@ namespace detail
|
||||
if(vec)
|
||||
{
|
||||
set_error_handler();
|
||||
auto & wd_manager = detail::bedrock::instance().wd_manager;
|
||||
auto & wd_manager = detail::bedrock::instance().wd_manager();
|
||||
for(auto u = vec->rbegin(); u != vec->rend(); ++u)
|
||||
wd_manager.close(wd_manager.root(*u));
|
||||
|
||||
@ -1352,7 +1361,7 @@ namespace detail
|
||||
::XTranslateCoordinates(self.display_, self.root_window(), evt.xclient.window, x, y, &self.xdnd_.pos.x, &self.xdnd_.pos.y, &child);
|
||||
typedef detail::bedrock bedrock;
|
||||
|
||||
auto wd = bedrock::instance().wd_manager.find_window(reinterpret_cast<native_window_type>(evt.xclient.window), self.xdnd_.pos.x, self.xdnd_.pos.y);
|
||||
auto wd = bedrock::instance().wd_manager().find_window(reinterpret_cast<native_window_type>(evt.xclient.window), self.xdnd_.pos.x, self.xdnd_.pos.y);
|
||||
if(wd && wd->flags.dropable)
|
||||
{
|
||||
accepted = true;
|
||||
|
@ -11,9 +11,7 @@
|
||||
*
|
||||
* This file provides basis class and data structrue that required by nana
|
||||
*/
|
||||
#include <nana/config.hpp>
|
||||
|
||||
#include PLATFORM_SPEC_HPP
|
||||
#include <nana/detail/platform_spec_selector.hpp>
|
||||
#include <shellapi.h>
|
||||
#include <stdexcept>
|
||||
|
||||
@ -63,14 +61,19 @@ namespace detail
|
||||
return color_;
|
||||
}
|
||||
|
||||
unsigned drawable_impl_type::get_text_color() const
|
||||
{
|
||||
return text_color_;
|
||||
}
|
||||
|
||||
void drawable_impl_type::set_color(const ::nana::color& clr)
|
||||
{
|
||||
color_ = clr.px_color().value;
|
||||
color_ = (clr.px_color().value & 0xFFFFFF);
|
||||
}
|
||||
|
||||
void drawable_impl_type::set_text_color(const ::nana::color& clr)
|
||||
{
|
||||
auto rgb = clr.px_color().value;
|
||||
auto rgb = (clr.px_color().value & 0xFFFFFF);
|
||||
if (text_color_ != rgb)
|
||||
{
|
||||
::SetTextColor(context, NANA_RGB(rgb));
|
||||
|
@ -1,71 +0,0 @@
|
||||
/*
|
||||
* Exception Definition
|
||||
* Copyright(C) 2003-2013 Jinhao(cnjinhao@hotmail.com)
|
||||
*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* @file: nana/exceptions.cpp
|
||||
*/
|
||||
#include <nana/exceptions.hpp>
|
||||
|
||||
namespace nana
|
||||
{
|
||||
|
||||
//class thrd_exit
|
||||
thrd_exit::thrd_exit(unsigned retval):retval_(retval){}
|
||||
thrd_exit::~thrd_exit() throw(){}
|
||||
const char* thrd_exit::what() const throw(){ return "Exit-Threading Exception"; }
|
||||
unsigned thrd_exit::retval() const { return retval_; }
|
||||
//end class thrd_exit
|
||||
|
||||
//class bad_member
|
||||
bad_member::bad_member(const std::string& what):what_(what){}
|
||||
bad_member::~bad_member() throw(){}
|
||||
const char* bad_member::what() const throw()
|
||||
{
|
||||
return what_.c_str();
|
||||
}
|
||||
//end class bad_member
|
||||
|
||||
//class bad_syntax
|
||||
bad_syntax::bad_syntax(const std::string& what):what_(what){}
|
||||
bad_syntax::~bad_syntax() throw(){}
|
||||
const char* bad_syntax::what() const throw()
|
||||
{
|
||||
return what_.c_str();
|
||||
}
|
||||
//end class bad_syntax
|
||||
|
||||
//class bad_error
|
||||
bad_error::bad_error(const std::string& what):what_(what){}
|
||||
bad_error::~bad_error() throw(){}
|
||||
const char* bad_error::what() const throw()
|
||||
{
|
||||
return what_.c_str();
|
||||
}
|
||||
//end class bad_error
|
||||
|
||||
//class bad_handle: public std::exception
|
||||
bad_handle::bad_handle(const std::string& what):what_(what){}
|
||||
bad_handle::~bad_handle() throw(){}
|
||||
const char* bad_handle::what() const throw()
|
||||
{
|
||||
return what_.c_str();
|
||||
}
|
||||
//end class bad_handle
|
||||
|
||||
//class bad_window
|
||||
bad_window::bad_window(const char* what)
|
||||
:what_(what)
|
||||
{}
|
||||
|
||||
bad_window::~bad_window() throw(){}
|
||||
|
||||
const char* bad_window::what() const throw()
|
||||
{
|
||||
return what_.c_str();
|
||||
}
|
||||
//end class bad_window
|
||||
} //end namespace nana
|
@ -430,7 +430,7 @@ namespace nana {
|
||||
delete[] p;
|
||||
return s;
|
||||
}
|
||||
return buf;
|
||||
return nana::string(buf);
|
||||
}
|
||||
#elif defined(NANA_LINUX)
|
||||
const char * s = ::getenv("PWD");
|
||||
|
@ -18,6 +18,7 @@
|
||||
|
||||
#include <vector>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <algorithm>
|
||||
|
||||
#if defined(NANA_MINGW) && defined(STD_THREAD_NOT_SUPPORTED)
|
||||
@ -181,12 +182,11 @@ namespace nana
|
||||
//Only list whos iterator would not invalided after a insertion.
|
||||
std::list<frame> frames;
|
||||
std::list<frame>::iterator this_frame;
|
||||
std::size_t pos_in_this_frame;
|
||||
mutable bool good_frame_by_frmbuilder; //It indicates the state of frame whether is valid.
|
||||
std::size_t pos_in_this_frame{ 0 };
|
||||
mutable bool good_frame_by_frmbuilder{ false }; //It indicates the state of frame whether is valid.
|
||||
|
||||
impl()
|
||||
: this_frame(frames.end()), pos_in_this_frame(0),
|
||||
good_frame_by_frmbuilder(false)
|
||||
: this_frame(frames.end())
|
||||
{}
|
||||
|
||||
//Render A frame on the set of windows.
|
||||
@ -342,8 +342,6 @@ namespace nana
|
||||
void set_fps(impl*, std::size_t new_fps);
|
||||
void close(impl* p);
|
||||
bool empty() const;
|
||||
private:
|
||||
void _m_perf_thread(thread_variable* thrvar);
|
||||
private:
|
||||
mutable std::recursive_mutex mutex_;
|
||||
std::vector<thread_variable*> threads_;
|
||||
@ -457,7 +455,48 @@ namespace nana
|
||||
thr->interval = 1000.0 / double(p->fps);
|
||||
thr->thread = std::make_shared<std::thread>([this, thr]()
|
||||
{
|
||||
_m_perf_thread(thr);
|
||||
nana::system::timepiece tmpiece;
|
||||
while (true)
|
||||
{
|
||||
thr->active = 0;
|
||||
tmpiece.start();
|
||||
|
||||
{
|
||||
std::lock_guard<decltype(thr->mutex)> lock(thr->mutex);
|
||||
for (auto ani : thr->animations)
|
||||
{
|
||||
if (ani->paused)
|
||||
continue;
|
||||
|
||||
ani->render_this_frame();
|
||||
if (false == ani->move_to_next())
|
||||
{
|
||||
if (ani->looped)
|
||||
{
|
||||
ani->reset();
|
||||
++thr->active;
|
||||
}
|
||||
}
|
||||
else
|
||||
++thr->active;
|
||||
}
|
||||
}
|
||||
|
||||
if (thr->active)
|
||||
{
|
||||
thr->performance_parameter = tmpiece.calc();
|
||||
if (thr->performance_parameter < thr->interval)
|
||||
nana::system::sleep(static_cast<unsigned>(thr->interval - thr->performance_parameter));
|
||||
}
|
||||
else
|
||||
{
|
||||
//There isn't an active frame, then let the thread
|
||||
//wait for a signal for an active animation
|
||||
std::unique_lock<std::mutex> lock(thr->mutex);
|
||||
if (0 == thr->active)
|
||||
thr->condvar.wait(lock);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
threads_.push_back(thr);
|
||||
@ -519,58 +558,16 @@ namespace nana
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void animation::performance_manager::_m_perf_thread(thread_variable* thrvar)
|
||||
{
|
||||
nana::system::timepiece tmpiece;
|
||||
while(true)
|
||||
{
|
||||
thrvar->active = 0;
|
||||
tmpiece.start();
|
||||
|
||||
{
|
||||
std::lock_guard<decltype(thrvar->mutex)> lock(thrvar->mutex);
|
||||
for(auto ani : thrvar->animations)
|
||||
{
|
||||
if(ani->paused)
|
||||
continue;
|
||||
|
||||
ani->render_this_frame();
|
||||
if(false == ani->move_to_next())
|
||||
{
|
||||
if(ani->looped)
|
||||
{
|
||||
ani->reset();
|
||||
++thrvar->active;
|
||||
}
|
||||
}
|
||||
else
|
||||
++thrvar->active;
|
||||
}
|
||||
}
|
||||
|
||||
if(thrvar->active)
|
||||
{
|
||||
thrvar->performance_parameter = tmpiece.calc();
|
||||
if(thrvar->performance_parameter < thrvar->interval)
|
||||
nana::system::sleep(static_cast<unsigned>(thrvar->interval - thrvar->performance_parameter));
|
||||
}
|
||||
else
|
||||
{
|
||||
//There isn't an active frame, then let the thread
|
||||
//wait for a signal for an active animation
|
||||
std::unique_lock<std::mutex> lock(thrvar->mutex);
|
||||
if(0 == thrvar->active)
|
||||
thrvar->condvar.wait(lock);
|
||||
}
|
||||
}
|
||||
}
|
||||
//end class animation::performance_manager
|
||||
|
||||
animation::animation(std::size_t fps)
|
||||
: impl_(new impl(fps))
|
||||
{
|
||||
}
|
||||
|
||||
animation::~animation()
|
||||
{
|
||||
delete impl_;
|
||||
}
|
||||
|
||||
void animation::push_back(frameset frms)
|
||||
|
@ -10,8 +10,7 @@
|
||||
* @file: nana/gui/detail/bedrock_pi.cpp
|
||||
*/
|
||||
|
||||
#include <nana/config.hpp>
|
||||
#include PLATFORM_SPEC_HPP
|
||||
#include <nana/detail/platform_spec_selector.hpp>
|
||||
#include <nana/gui/detail/bedrock_pi_data.hpp>
|
||||
#include <nana/gui/detail/event_code.hpp>
|
||||
#include <nana/system/platform.hpp>
|
||||
@ -29,12 +28,12 @@ namespace nana
|
||||
//class internal_scope_guard
|
||||
internal_scope_guard::internal_scope_guard()
|
||||
{
|
||||
detail::bedrock::instance().wd_manager.internal_lock().lock();
|
||||
detail::bedrock::instance().wd_manager().internal_lock().lock();
|
||||
}
|
||||
|
||||
internal_scope_guard::~internal_scope_guard()
|
||||
{
|
||||
detail::bedrock::instance().wd_manager.internal_lock().unlock();
|
||||
detail::bedrock::instance().wd_manager().internal_lock().unlock();
|
||||
}
|
||||
//end class internal_scope_guard
|
||||
|
||||
@ -54,12 +53,12 @@ namespace nana
|
||||
{
|
||||
void events_operation_register(event_handle evt)
|
||||
{
|
||||
bedrock::instance().evt_operation.register_evt(evt);
|
||||
bedrock::instance().evt_operation().register_evt(evt);
|
||||
}
|
||||
|
||||
void events_operation_cancel(event_handle evt)
|
||||
{
|
||||
bedrock::instance().evt_operation.cancel(evt);
|
||||
bedrock::instance().evt_operation().cancel(evt);
|
||||
}
|
||||
|
||||
class bedrock::flag_guard
|
||||
@ -73,7 +72,7 @@ namespace nana
|
||||
|
||||
~flag_guard()
|
||||
{
|
||||
if (brock_->wd_manager.available((wd_)))
|
||||
if (brock_->wd_manager().available((wd_)))
|
||||
wd_->flags.refreshing = false;
|
||||
}
|
||||
private:
|
||||
@ -82,6 +81,31 @@ namespace nana
|
||||
|
||||
};
|
||||
|
||||
events_operation& bedrock::evt_operation()
|
||||
{
|
||||
return pi_data_->evt_operation;
|
||||
}
|
||||
|
||||
window_manager& bedrock::wd_manager()
|
||||
{
|
||||
return pi_data_->wd_manager;
|
||||
}
|
||||
|
||||
void bedrock::manage_form_loader(core_window_t* wd, bool insert_or_remove)
|
||||
{
|
||||
if (insert_or_remove)
|
||||
{
|
||||
pi_data_->auto_form_set.insert(wd);
|
||||
return;
|
||||
}
|
||||
|
||||
if (pi_data_->auto_form_set.erase(wd))
|
||||
{
|
||||
auto p = wd->widget_notifier->widget_ptr();
|
||||
delete p;
|
||||
}
|
||||
}
|
||||
|
||||
void bedrock::event_expose(core_window_t * wd, bool exposed)
|
||||
{
|
||||
if (nullptr == wd) return;
|
||||
@ -113,11 +137,11 @@ namespace nana
|
||||
wd = wd->seek_non_lite_widget_ancestor();
|
||||
}
|
||||
else if (category::flags::frame == wd->other.category)
|
||||
wd = wd_manager.find_window(wd->root, wd->pos_root.x, wd->pos_root.y);
|
||||
wd = wd_manager().find_window(wd->root, wd->pos_root.x, wd->pos_root.y);
|
||||
}
|
||||
|
||||
wd_manager.refresh_tree(wd);
|
||||
wd_manager.map(wd, false);
|
||||
wd_manager().refresh_tree(wd);
|
||||
wd_manager().map(wd, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -130,13 +154,13 @@ namespace nana
|
||||
arg.x = x;
|
||||
arg.y = y;
|
||||
if (emit(event_code::move, wd, arg, false, get_thread_context()))
|
||||
wd_manager.update(wd, false, true);
|
||||
wd_manager().update(wd, false, true);
|
||||
}
|
||||
}
|
||||
|
||||
bool bedrock::event_msleave(core_window_t* hovered)
|
||||
{
|
||||
if (wd_manager.available(hovered) && hovered->flags.enabled)
|
||||
if (wd_manager().available(hovered) && hovered->flags.enabled)
|
||||
{
|
||||
hovered->flags.action = mouse_action::normal;
|
||||
|
||||
@ -155,7 +179,7 @@ namespace nana
|
||||
void bedrock::update_cursor(core_window_t * wd)
|
||||
{
|
||||
internal_scope_guard isg;
|
||||
if (wd_manager.available(wd))
|
||||
if (wd_manager().available(wd))
|
||||
{
|
||||
auto * thrd = get_thread_context(wd->thread_id);
|
||||
if (nullptr == thrd)
|
||||
@ -167,7 +191,7 @@ namespace nana
|
||||
return;
|
||||
|
||||
native_interface::calc_window_point(native_handle, pos);
|
||||
if (wd != wd_manager.find_window(native_handle, pos.x, pos.y))
|
||||
if (wd != wd_manager().find_window(native_handle, pos.x, pos.y))
|
||||
return;
|
||||
|
||||
set_cursor(wd, wd->predef_cursor, thrd);
|
||||
@ -179,7 +203,7 @@ namespace nana
|
||||
return pi_data_->scheme.scheme_template(std::move(factory));
|
||||
}
|
||||
|
||||
std::unique_ptr<widget_colors> bedrock::make_scheme(scheme_factory_base&& factory)
|
||||
widget_colors* bedrock::make_scheme(scheme_factory_base&& factory)
|
||||
{
|
||||
return pi_data_->scheme.create(std::move(factory));
|
||||
}
|
||||
@ -415,7 +439,7 @@ namespace nana
|
||||
void bedrock::_m_except_handler()
|
||||
{
|
||||
std::vector<core_window_t*> v;
|
||||
wd_manager.all_handles(v);
|
||||
wd_manager().all_handles(v);
|
||||
if (v.size())
|
||||
{
|
||||
std::vector<native_window_type> roots;
|
||||
@ -432,7 +456,7 @@ namespace nana
|
||||
}
|
||||
|
||||
for (auto i : roots)
|
||||
interface_type::close_window(i);
|
||||
native_interface::close_window(i);
|
||||
}
|
||||
}
|
||||
}//end namespace detail
|
||||
|
@ -76,12 +76,12 @@ namespace nana
|
||||
|
||||
//Creates a scheme template if no template
|
||||
if (!tmpl_scheme)
|
||||
factory.create().swap(tmpl_scheme);
|
||||
tmpl_scheme.reset(factory.create());
|
||||
|
||||
return *tmpl_scheme.get();
|
||||
}
|
||||
|
||||
std::unique_ptr<widget_colors> color_schemes::create(scheme_factory_base&& factory)
|
||||
widget_colors* color_schemes::create(scheme_factory_base&& factory)
|
||||
{
|
||||
return factory.create(scheme_template(std::move(factory)));
|
||||
}
|
||||
|
@ -5,7 +5,7 @@ namespace nana
|
||||
namespace detail
|
||||
{
|
||||
//class events_operation
|
||||
typedef std::lock_guard<std::recursive_mutex> lock_guard;
|
||||
using lock_guard = std::lock_guard<std::recursive_mutex>;
|
||||
|
||||
void events_operation::make(window wd, const std::shared_ptr<general_events>& sp)
|
||||
{
|
||||
@ -22,21 +22,21 @@ namespace nana
|
||||
void events_operation::register_evt(event_handle evt)
|
||||
{
|
||||
lock_guard lock(mutex_);
|
||||
register_.insert(evt);
|
||||
handles_.insert(evt);
|
||||
}
|
||||
|
||||
void events_operation::cancel(event_handle evt)
|
||||
{
|
||||
lock_guard lock(mutex_);
|
||||
register_.erase(evt);
|
||||
handles_.erase(evt);
|
||||
}
|
||||
|
||||
void events_operation::erase(event_handle evt)
|
||||
{
|
||||
lock_guard lock(mutex_);
|
||||
|
||||
auto i = register_.find(evt);
|
||||
if (i != register_.end())
|
||||
auto i = handles_.find(evt);
|
||||
if (i != handles_.end())
|
||||
{
|
||||
reinterpret_cast<detail::docker_interface*>(evt)->get_event()->remove(evt);
|
||||
}
|
||||
|
@ -10,8 +10,7 @@
|
||||
* @file: nana/gui/detail/linux_X11/bedrock.cpp
|
||||
*/
|
||||
|
||||
#include <nana/config.hpp>
|
||||
#include PLATFORM_SPEC_HPP
|
||||
#include <nana/detail/platform_spec_selector.hpp>
|
||||
#include <nana/gui/detail/bedrock_pi_data.hpp>
|
||||
#include <nana/gui/detail/event_code.hpp>
|
||||
#include <nana/system/platform.hpp>
|
||||
@ -233,7 +232,7 @@ namespace detail
|
||||
if(wd)
|
||||
{
|
||||
internal_scope_guard isg;
|
||||
if(wd_manager.available(wd))
|
||||
if(wd_manager().available(wd))
|
||||
return wd->other.category;
|
||||
}
|
||||
return category::flags::super;
|
||||
@ -241,21 +240,10 @@ namespace detail
|
||||
|
||||
bedrock::core_window_t* bedrock::focus()
|
||||
{
|
||||
core_window_t* wd = wd_manager.root(native_interface::get_focus_window());
|
||||
core_window_t* wd = wd_manager().root(native_interface::get_focus_window());
|
||||
return (wd ? wd->other.attribute.root->focus : 0);
|
||||
}
|
||||
|
||||
native_window_type bedrock::root(core_window_t* wd)
|
||||
{
|
||||
if(wd)
|
||||
{
|
||||
internal_scope_guard isg;
|
||||
if(wd_manager.available(wd))
|
||||
return wd->root;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void bedrock::set_menubar_taken(core_window_t* wd)
|
||||
{
|
||||
auto pre = impl_->menu.taken_window;
|
||||
@ -265,8 +253,8 @@ namespace detail
|
||||
if ((!wd) && pre)
|
||||
{
|
||||
internal_scope_guard lock;
|
||||
wd_manager.set_focus(pre, false);
|
||||
wd_manager.update(pre, true, false);
|
||||
wd_manager().set_focus(pre, false);
|
||||
wd_manager().update(pre, true, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -381,17 +369,9 @@ namespace detail
|
||||
//No implementation for Linux
|
||||
}
|
||||
|
||||
|
||||
bool bedrock::emit(event_code evt_code, core_window_t* wd, const arg_mouse& arg, bool ask_update, thread_context* thrd)
|
||||
{
|
||||
if(evt_code != arg.evt_code)
|
||||
throw std::runtime_error("Nana.bedrock: Invalid event arg.");
|
||||
return emit(evt_code, wd, static_cast<const ::nana::event_arg&>(arg), ask_update, thrd);
|
||||
}
|
||||
|
||||
bool bedrock::emit(event_code evt_code, core_window_t* wd, const ::nana::event_arg& arg, bool ask_update, thread_context* thrd)
|
||||
{
|
||||
if(wd_manager.available(wd) == false)
|
||||
if(wd_manager().available(wd) == false)
|
||||
return false;
|
||||
|
||||
core_window_t * prev_wd;
|
||||
@ -408,7 +388,7 @@ namespace detail
|
||||
_m_emit_core(evt_code, wd, false, arg);
|
||||
|
||||
if(ask_update)
|
||||
wd_manager.do_lazy_refresh(wd, false);
|
||||
wd_manager().do_lazy_refresh(wd, false);
|
||||
else
|
||||
wd->other.upd_state = core_window_t::update_state::none;
|
||||
|
||||
@ -418,7 +398,7 @@ namespace detail
|
||||
|
||||
bool bedrock::emit_drawer(event_code evt_code, core_window_t* wd, const ::nana::event_arg& arg, thread_context* thrd)
|
||||
{
|
||||
if(wd_manager.available(wd) == false)
|
||||
if(wd_manager().available(wd) == false)
|
||||
return false;
|
||||
|
||||
core_window_t * prev_wd;
|
||||
@ -541,7 +521,7 @@ namespace detail
|
||||
static auto& brock = detail::bedrock::instance();
|
||||
|
||||
auto native_window = reinterpret_cast<native_window_type>(msg.u.packet_window);
|
||||
auto root_runtime = brock.wd_manager.root_runtime(native_window);
|
||||
auto root_runtime = brock.wd_manager().root_runtime(native_window);
|
||||
|
||||
if(root_runtime)
|
||||
{
|
||||
@ -550,7 +530,7 @@ namespace detail
|
||||
switch(msg.kind)
|
||||
{
|
||||
case nana::detail::msg_packet_tag::kind_mouse_drop:
|
||||
msgwd = brock.wd_manager.find_window(native_window, msg.u.mouse_drop.x, msg.u.mouse_drop.y);
|
||||
msgwd = brock.wd_manager().find_window(native_window, msg.u.mouse_drop.x, msg.u.mouse_drop.y);
|
||||
if(msgwd)
|
||||
{
|
||||
arg_dropfiles arg;
|
||||
@ -560,7 +540,7 @@ namespace detail
|
||||
arg.pos.x = msg.u.mouse_drop.x - msgwd->pos_root.x;
|
||||
arg.pos.y = msg.u.mouse_drop.y - msgwd->pos_root.y;
|
||||
msgwd->together.events_ptr->mouse_dropfiles.emit(arg);
|
||||
brock.wd_manager.do_lazy_refresh(msgwd, false);
|
||||
brock.wd_manager().do_lazy_refresh(msgwd, false);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -572,7 +552,7 @@ namespace detail
|
||||
template<typename Arg>
|
||||
void emit_drawer(void(::nana::detail::drawer::*event_ptr)(const Arg&), basic_window* wd, const Arg& arg, bedrock::thread_context* thrd)
|
||||
{
|
||||
if(bedrock::instance().wd_manager.available(wd) == false)
|
||||
if(bedrock::instance().wd_manager().available(wd) == false)
|
||||
return;
|
||||
basic_window * pre_wd;
|
||||
if(thrd)
|
||||
@ -597,7 +577,7 @@ namespace detail
|
||||
static core_window_t* last_mouse_down_window;
|
||||
|
||||
auto native_window = reinterpret_cast<native_window_type>(event_window(xevent));
|
||||
auto root_runtime = brock.wd_manager.root_runtime(native_window);
|
||||
auto root_runtime = brock.wd_manager().root_runtime(native_window);
|
||||
|
||||
if(root_runtime)
|
||||
{
|
||||
@ -612,7 +592,7 @@ namespace detail
|
||||
switch(xevent.type)
|
||||
{
|
||||
case EnterNotify:
|
||||
msgwnd = brock.wd_manager.find_window(native_window, xevent.xcrossing.x, xevent.xcrossing.y);
|
||||
msgwnd = brock.wd_manager().find_window(native_window, xevent.xcrossing.x, xevent.xcrossing.y);
|
||||
if(msgwnd)
|
||||
{
|
||||
if (mouse_action::pressed != msgwnd->flags.action)
|
||||
@ -626,7 +606,7 @@ namespace detail
|
||||
arg.evt_code = event_code::mouse_move;
|
||||
brock.emit(event_code::mouse_move, msgwnd, arg, true, &context);
|
||||
|
||||
if (!brock.wd_manager.available(hovered_wd))
|
||||
if (!brock.wd_manager().available(hovered_wd))
|
||||
hovered_wd = nullptr;
|
||||
}
|
||||
break;
|
||||
@ -646,7 +626,7 @@ namespace detail
|
||||
arg.receiver = native_window;
|
||||
arg.getting = true;
|
||||
if(!brock.emit(event_code::focus, focus, arg, true, &context))
|
||||
brock.wd_manager.set_focus(msgwnd, true);
|
||||
brock.wd_manager().set_focus(msgwnd, true);
|
||||
}
|
||||
break;
|
||||
case FocusOut:
|
||||
@ -672,7 +652,7 @@ namespace detail
|
||||
if(msgwnd->dimension.width != static_cast<unsigned>(xevent.xconfigure.width) || msgwnd->dimension.height != static_cast<unsigned>(xevent.xconfigure.height))
|
||||
{
|
||||
auto & cf = xevent.xconfigure;
|
||||
brock.wd_manager.size(msgwnd, nana::size{static_cast<unsigned>(cf.width), static_cast<unsigned>(cf.height)}, true, true);
|
||||
brock.wd_manager().size(msgwnd, nana::size{static_cast<unsigned>(cf.width), static_cast<unsigned>(cf.height)}, true, true);
|
||||
}
|
||||
|
||||
if(msgwnd->pos_native.x != xevent.xconfigure.x || msgwnd->pos_native.y != xevent.xconfigure.y)
|
||||
@ -686,7 +666,7 @@ namespace detail
|
||||
if(xevent.xbutton.button == Button4 || xevent.xbutton.button == Button5)
|
||||
break;
|
||||
|
||||
msgwnd = brock.wd_manager.find_window(native_window, xevent.xbutton.x, xevent.xbutton.y);
|
||||
msgwnd = brock.wd_manager().find_window(native_window, xevent.xbutton.x, xevent.xbutton.y);
|
||||
if(nullptr == msgwnd) break;
|
||||
|
||||
if ((msgwnd == msgwnd->root_widget->other.attribute.root->menubar) && brock.get_menu(msgwnd->root, true))
|
||||
@ -706,9 +686,9 @@ namespace detail
|
||||
if (new_focus && !new_focus->flags.ignore_mouse_focus)
|
||||
{
|
||||
context.event_window = new_focus;
|
||||
auto kill_focus = brock.wd_manager.set_focus(new_focus, false);
|
||||
auto kill_focus = brock.wd_manager().set_focus(new_focus, false);
|
||||
if (kill_focus != new_focus)
|
||||
brock.wd_manager.do_lazy_refresh(kill_focus, false);
|
||||
brock.wd_manager().do_lazy_refresh(kill_focus, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -722,7 +702,7 @@ namespace detail
|
||||
arg.evt_code = dbl_click ? event_code::dbl_click : event_code::mouse_down;
|
||||
if(brock.emit(arg.evt_code, msgwnd, arg, true, &context))
|
||||
{
|
||||
if (brock.wd_manager.available(msgwnd))
|
||||
if (brock.wd_manager().available(msgwnd))
|
||||
{
|
||||
pressed_wd = msgwnd;
|
||||
//If a root window is created during the mouse_down event, Nana.GUI will ignore the mouse_up event.
|
||||
@ -731,7 +711,7 @@ namespace detail
|
||||
//call the drawer mouse up event for restoring the surface graphics
|
||||
msgwnd->flags.action = mouse_action::normal;
|
||||
emit_drawer(&drawer::mouse_up, msgwnd, arg, &context);
|
||||
brock.wd_manager.do_lazy_refresh(msgwnd, false);
|
||||
brock.wd_manager().do_lazy_refresh(msgwnd, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -758,7 +738,7 @@ namespace detail
|
||||
}
|
||||
else
|
||||
{
|
||||
msgwnd = brock.wd_manager.find_window(native_window, xevent.xbutton.x, xevent.xbutton.y);
|
||||
msgwnd = brock.wd_manager().find_window(native_window, xevent.xbutton.x, xevent.xbutton.y);
|
||||
if(nullptr == msgwnd)
|
||||
break;
|
||||
|
||||
@ -786,7 +766,7 @@ namespace detail
|
||||
}
|
||||
|
||||
//Do mouse_up, this handle may be closed by click handler.
|
||||
if(brock.wd_manager.available(msgwnd) && msgwnd->flags.enabled)
|
||||
if(brock.wd_manager().available(msgwnd) && msgwnd->flags.enabled)
|
||||
{
|
||||
if(hit)
|
||||
msgwnd->flags.action = mouse_action::over;
|
||||
@ -805,7 +785,7 @@ namespace detail
|
||||
evt_ptr->click.emit(arg);
|
||||
}
|
||||
|
||||
if (brock.wd_manager.available(msgwnd))
|
||||
if (brock.wd_manager().available(msgwnd))
|
||||
{
|
||||
arg.evt_code = event_code::mouse_up;
|
||||
evt_ptr->mouse_up.emit(arg);
|
||||
@ -818,7 +798,7 @@ namespace detail
|
||||
arg.by_mouse = true;
|
||||
msgwnd->together.events_ptr->click.emit(arg);
|
||||
}
|
||||
brock.wd_manager.do_lazy_refresh(msgwnd, false);
|
||||
brock.wd_manager().do_lazy_refresh(msgwnd, false);
|
||||
}
|
||||
pressed_wd = nullptr;
|
||||
}
|
||||
@ -826,7 +806,7 @@ namespace detail
|
||||
case DestroyNotify:
|
||||
{
|
||||
auto & spec = nana::detail::platform_spec::instance();
|
||||
if(brock.wd_manager.available(msgwnd))
|
||||
if(brock.wd_manager().available(msgwnd))
|
||||
{
|
||||
//The msgwnd may be destroyed if the window is destroyed by calling native interface of close_window().
|
||||
if (msgwnd->root == brock.get_menu())
|
||||
@ -836,10 +816,10 @@ namespace detail
|
||||
}
|
||||
|
||||
spec.remove(native_window);
|
||||
brock.wd_manager.destroy(msgwnd);
|
||||
brock.wd_manager().destroy(msgwnd);
|
||||
|
||||
brock.rt_manager.remove_if_exists(msgwnd);
|
||||
brock.wd_manager.destroy_handle(msgwnd);
|
||||
brock.manage_form_loader(msgwnd, false);
|
||||
brock.wd_manager().destroy_handle(msgwnd);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -854,8 +834,8 @@ namespace detail
|
||||
else
|
||||
break;
|
||||
|
||||
msgwnd = brock.wd_manager.find_window(native_window, xevent.xmotion.x, xevent.xmotion.y);
|
||||
if (brock.wd_manager.available(hovered_wd) && (msgwnd != hovered_wd))
|
||||
msgwnd = brock.wd_manager().find_window(native_window, xevent.xmotion.x, xevent.xmotion.y);
|
||||
if (brock.wd_manager().available(hovered_wd) && (msgwnd != hovered_wd))
|
||||
{
|
||||
brock.event_msleave(hovered_wd);
|
||||
hovered_wd->flags.action = mouse_action::normal;
|
||||
@ -863,14 +843,14 @@ namespace detail
|
||||
|
||||
//if msgwnd is neither a captured window nor a child of captured window,
|
||||
//redirect the msgwnd to the captured window.
|
||||
auto cap_wd = brock.wd_manager.capture_redirect(msgwnd);
|
||||
auto cap_wd = brock.wd_manager().capture_redirect(msgwnd);
|
||||
if(cap_wd)
|
||||
msgwnd = cap_wd;
|
||||
}
|
||||
else if(msgwnd)
|
||||
{
|
||||
bool prev_captured_inside;
|
||||
if(brock.wd_manager.capture_window_entered(xevent.xmotion.x, xevent.xmotion.y, prev_captured_inside))
|
||||
if(brock.wd_manager().capture_window_entered(xevent.xmotion.x, xevent.xmotion.y, prev_captured_inside))
|
||||
{
|
||||
event_code evt_code;
|
||||
if(prev_captured_inside)
|
||||
@ -909,7 +889,7 @@ namespace detail
|
||||
arg.evt_code = event_code::mouse_move;
|
||||
brock.emit(event_code::mouse_move, msgwnd, arg, true, &context);
|
||||
}
|
||||
if (!brock.wd_manager.available(hovered_wd))
|
||||
if (!brock.wd_manager().available(hovered_wd))
|
||||
hovered_wd = nullptr;
|
||||
break;
|
||||
case MapNotify:
|
||||
@ -1010,11 +990,11 @@ namespace detail
|
||||
{
|
||||
arg_keyboard argkey;
|
||||
brock.get_key_state(argkey);
|
||||
auto tstop_wd = brock.wd_manager.tabstop(msgwnd, !argkey.shift);
|
||||
auto tstop_wd = brock.wd_manager().tabstop(msgwnd, !argkey.shift);
|
||||
if (tstop_wd)
|
||||
{
|
||||
brock.wd_manager.set_focus(tstop_wd, false);
|
||||
brock.wd_manager.do_lazy_refresh(tstop_wd, true);
|
||||
brock.wd_manager().set_focus(tstop_wd, false);
|
||||
brock.wd_manager().do_lazy_refresh(tstop_wd, true);
|
||||
}
|
||||
}
|
||||
else if(keyboard::alt == keychar)
|
||||
@ -1050,7 +1030,7 @@ namespace detail
|
||||
arg.window_handle = reinterpret_cast<window>(msgwnd);
|
||||
brock.emit(event_code::key_press, msgwnd, arg, true, &context);
|
||||
|
||||
if((XLookupKeySym == status) && (brock.wd_manager.available(msgwnd)))
|
||||
if((XLookupKeySym == status) && (brock.wd_manager().available(msgwnd)))
|
||||
{
|
||||
//call key_char event if status is XLookupKeySym to avaid calling key_char
|
||||
//twice, because the status would be equal to XLookupChars if the input method is
|
||||
@ -1069,7 +1049,7 @@ namespace detail
|
||||
|
||||
if(XLookupKeySym == status)
|
||||
{
|
||||
brock.wd_manager.do_lazy_refresh(msgwnd, false);
|
||||
brock.wd_manager().do_lazy_refresh(msgwnd, false);
|
||||
break;
|
||||
}
|
||||
case XLookupChars:
|
||||
@ -1099,7 +1079,7 @@ namespace detail
|
||||
arg.ctrl = arg.shift = false;
|
||||
arg.evt_code = event_code::shortkey;
|
||||
brock.set_keyboard_shortkey(true);
|
||||
auto shr_wd = brock.wd_manager.find_shortkey(native_window, arg.key);
|
||||
auto shr_wd = brock.wd_manager().find_shortkey(native_window, arg.key);
|
||||
if(shr_wd)
|
||||
{
|
||||
arg.window_handle = reinterpret_cast<window>(shr_wd);
|
||||
@ -1112,7 +1092,7 @@ namespace detail
|
||||
brock.get_key_state(arg);
|
||||
|
||||
msgwnd->together.events_ptr->key_char.emit(arg);
|
||||
if(arg.ignore == false && brock.wd_manager.available(msgwnd))
|
||||
if(arg.ignore == false && brock.wd_manager().available(msgwnd))
|
||||
brock.emit_drawer(event_code::key_char, msgwnd, arg, &context);
|
||||
}
|
||||
|
||||
@ -1121,7 +1101,7 @@ namespace detail
|
||||
}
|
||||
break;
|
||||
}
|
||||
brock.wd_manager.do_lazy_refresh(msgwnd, false);
|
||||
brock.wd_manager().do_lazy_refresh(msgwnd, false);
|
||||
if(keybuf != fixbuf)
|
||||
delete [] keybuf;
|
||||
}
|
||||
@ -1156,7 +1136,7 @@ namespace detail
|
||||
{
|
||||
bool set_focus = (brock.focus() != msgwnd) && (!msgwnd->root_widget->flags.ignore_menubar_focus);
|
||||
if (set_focus)
|
||||
brock.wd_manager.set_focus(msgwnd, false);
|
||||
brock.wd_manager().set_focus(msgwnd, false);
|
||||
|
||||
arg_keyboard arg;
|
||||
arg.evt_code = event_code::key_release;
|
||||
@ -1194,7 +1174,7 @@ namespace detail
|
||||
}
|
||||
}
|
||||
|
||||
root_runtime = brock.wd_manager.root_runtime(native_window);
|
||||
root_runtime = brock.wd_manager().root_runtime(native_window);
|
||||
if(root_runtime)
|
||||
{
|
||||
context.event_window = pre_event_window;
|
||||
@ -1207,8 +1187,11 @@ namespace detail
|
||||
if(context) context->event_window = pre_event_window;
|
||||
}
|
||||
|
||||
auto thread_id = ::nana::system::this_thread_id();
|
||||
brock.wd_manager().call_safe_place(thread_id);
|
||||
|
||||
if(msgwnd)
|
||||
brock.wd_manager.remove_trash_handle(::nana::system::this_thread_id());
|
||||
brock.wd_manager().remove_trash_handle(thread_id);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1223,18 +1206,18 @@ namespace detail
|
||||
}
|
||||
|
||||
++(context->event_pump_ref_count);
|
||||
wd_manager.internal_lock().revert();
|
||||
wd_manager().internal_lock().revert();
|
||||
|
||||
native_window_type owner_native = 0;
|
||||
core_window_t * owner = 0;
|
||||
if(modal_window)
|
||||
{
|
||||
native_window_type modal = root(reinterpret_cast<core_window_t*>(modal_window));
|
||||
native_window_type modal = reinterpret_cast<core_window_t*>(modal_window)->root;
|
||||
owner_native = native_interface::get_owner_window(modal);
|
||||
if(owner_native)
|
||||
{
|
||||
native_interface::enable_window(owner_native, false);
|
||||
owner = wd_manager.root(owner_native);
|
||||
owner = wd_manager().root(owner_native);
|
||||
if(owner)
|
||||
owner->flags.enabled = false;
|
||||
}
|
||||
@ -1249,7 +1232,7 @@ namespace detail
|
||||
native_interface::enable_window(owner_native, true);
|
||||
}
|
||||
|
||||
wd_manager.internal_lock().forward();
|
||||
wd_manager().internal_lock().forward();
|
||||
if(0 == --(context->event_pump_ref_count))
|
||||
{
|
||||
if(0 == modal_window || 0 == context->window_count)
|
||||
@ -1335,7 +1318,7 @@ namespace detail
|
||||
|
||||
void bedrock::undefine_state_cursor(core_window_t * wd, thread_context* thrd)
|
||||
{
|
||||
if (!wd_manager.available(wd))
|
||||
if (!wd_manager().available(wd))
|
||||
return;
|
||||
|
||||
wd->root_widget->other.attribute.root->state_cursor = nana::cursor::arrow;
|
||||
@ -1347,7 +1330,7 @@ namespace detail
|
||||
return;
|
||||
|
||||
native_interface::calc_window_point(native_handle, pos);
|
||||
auto rev_wd = wd_manager.find_window(native_handle, pos.x, pos.y);
|
||||
auto rev_wd = wd_manager().find_window(native_handle, pos.x, pos.y);
|
||||
if (rev_wd)
|
||||
set_cursor(rev_wd, rev_wd->predef_cursor, thrd);
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Platform Implementation
|
||||
* Nana C++ Library(http://www.nanapro.org)
|
||||
* Copyright(C) 2003-2014 Jinhao(cnjinhao@hotmail.com)
|
||||
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
|
||||
*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
@ -10,8 +10,7 @@
|
||||
* @file: nana/gui/detail/native_window_interface.cpp
|
||||
*/
|
||||
|
||||
#include <nana/config.hpp>
|
||||
#include PLATFORM_SPEC_HPP
|
||||
#include <nana/detail/platform_spec_selector.hpp>
|
||||
#include <nana/gui/detail/native_window_interface.hpp>
|
||||
#include <nana/gui/screen.hpp>
|
||||
#if defined(NANA_WINDOWS)
|
||||
@ -25,6 +24,7 @@
|
||||
#elif defined(NANA_X11)
|
||||
#include <nana/system/platform.hpp>
|
||||
#include <nana/gui/detail/bedrock.hpp>
|
||||
#include <nana/gui/detail/window_manager.hpp>
|
||||
#endif
|
||||
|
||||
namespace nana{
|
||||
@ -542,32 +542,6 @@ namespace nana{
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
bool native_interface::window_icon(native_window_type wd, const paint::image& big_icon, const paint::image& small_icon) //deprecated
|
||||
{
|
||||
#if defined(NANA_WINDOWS)
|
||||
HICON h_big_icon = paint::image_accessor::icon(big_icon);
|
||||
HICON h_small_icon = paint::image_accessor::icon(small_icon);
|
||||
if (h_big_icon || h_small_icon)
|
||||
{
|
||||
nana::detail::platform_spec::instance().keep_window_icon(wd, (!big_icon.empty() ? big_icon : small_icon));
|
||||
if (h_big_icon) {
|
||||
::SendMessage(reinterpret_cast<HWND>(wd), WM_SETICON, ICON_BIG, reinterpret_cast<LPARAM>(h_big_icon));
|
||||
}
|
||||
if (h_small_icon) {
|
||||
::SendMessage(reinterpret_cast<HWND>(wd), WM_SETICON, ICON_SMALL, reinterpret_cast<WPARAM>(h_small_icon));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#elif defined(NANA_X11)
|
||||
return window_icon(wd, big_icon);
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
void native_interface::activate_owner(native_window_type wd)
|
||||
{
|
||||
#if defined(NANA_WINDOWS)
|
||||
@ -621,7 +595,7 @@ namespace nana{
|
||||
|
||||
Display* disp = restrict::spec.open_display();
|
||||
restrict::spec.remove(wd);
|
||||
auto iwd = brock.wd_manager.root(wd);
|
||||
auto iwd = brock.wd_manager().root(wd);
|
||||
if(iwd)
|
||||
{
|
||||
{
|
||||
@ -633,9 +607,9 @@ namespace nana{
|
||||
::XFlush(disp);
|
||||
restrict::spec.rev_error_handler();
|
||||
}
|
||||
brock.wd_manager.destroy(iwd);
|
||||
brock.rt_manager.remove_if_exists(iwd);
|
||||
brock.wd_manager.destroy_handle(iwd);
|
||||
brock.wd_manager().destroy(iwd);
|
||||
brock.manage_form_loader(iwd, false);
|
||||
brock.wd_manager().destroy_handle(iwd);
|
||||
}
|
||||
|
||||
nana::detail::platform_scope_guard psg;
|
||||
|
@ -11,9 +11,7 @@
|
||||
* @contributors: Ariel Vina-Rodriguez
|
||||
*/
|
||||
|
||||
#include <nana/config.hpp>
|
||||
|
||||
#include PLATFORM_SPEC_HPP
|
||||
#include <nana/detail/platform_spec_selector.hpp>
|
||||
#include <nana/gui/detail/bedrock.hpp>
|
||||
#include <nana/gui/detail/bedrock_pi_data.hpp>
|
||||
#include <nana/gui/detail/event_code.hpp>
|
||||
@ -251,10 +249,10 @@ namespace detail
|
||||
|
||||
bedrock::~bedrock()
|
||||
{
|
||||
if(wd_manager.number_of_core_window())
|
||||
if(wd_manager().number_of_core_window())
|
||||
{
|
||||
std::stringstream ss;
|
||||
ss<<"Nana.GUI detects a memory leaks in window_manager, "<<static_cast<unsigned>(wd_manager.number_of_core_window())<<" window(s) are not uninstalled.";
|
||||
ss<<"Nana.GUI detects a memory leaks in window_manager, "<<static_cast<unsigned>(wd_manager().number_of_core_window())<<" window(s) are not uninstalled.";
|
||||
::MessageBoxA(0, ss.str().c_str(), ("Nana C++ Library"), MB_OK);
|
||||
}
|
||||
|
||||
@ -364,7 +362,7 @@ namespace detail
|
||||
|
||||
++(context->event_pump_ref_count);
|
||||
|
||||
auto & intr_locker = wd_manager.internal_lock();
|
||||
auto & intr_locker = wd_manager().internal_lock();
|
||||
intr_locker.revert();
|
||||
|
||||
try
|
||||
@ -372,8 +370,7 @@ namespace detail
|
||||
MSG msg;
|
||||
if(modal_window)
|
||||
{
|
||||
HWND native_handle = reinterpret_cast<HWND>(
|
||||
root(reinterpret_cast<core_window_t*>(modal_window)));
|
||||
HWND native_handle = reinterpret_cast<HWND>(reinterpret_cast<core_window_t*>(modal_window)->root);
|
||||
if (is_modal)
|
||||
{
|
||||
HWND owner = ::GetWindow(native_handle, GW_OWNER);
|
||||
@ -395,7 +392,7 @@ namespace detail
|
||||
::TranslateMessage(&msg);
|
||||
::DispatchMessage(&msg);
|
||||
|
||||
wd_manager.remove_trash_handle(tid);
|
||||
wd_manager().remove_trash_handle(tid);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -413,7 +410,8 @@ namespace detail
|
||||
::DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
wd_manager.remove_trash_handle(tid);
|
||||
wd_manager().call_safe_place(tid);
|
||||
wd_manager().remove_trash_handle(tid);
|
||||
if (msg.message == WM_DESTROY && msg.hwnd == native_handle)
|
||||
break;
|
||||
}//end while
|
||||
@ -432,7 +430,8 @@ namespace detail
|
||||
::DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
wd_manager.remove_trash_handle(tid);
|
||||
wd_manager().call_safe_place(tid);
|
||||
wd_manager().remove_trash_handle(tid);
|
||||
}//end while
|
||||
|
||||
//Empty these rest messages, there is not a window to process these messages.
|
||||
@ -605,7 +604,7 @@ namespace detail
|
||||
case nana::detail::messages::map_thread_root_buffer:
|
||||
{
|
||||
auto stru = reinterpret_cast<detail::messages::map_thread*>(lParam);
|
||||
bedrock.wd_manager.map(reinterpret_cast<bedrock::core_window_t*>(wParam), stru->forced, (stru->ignore_update_area ? nullptr : &stru->update_area));
|
||||
bedrock.wd_manager().map(reinterpret_cast<bedrock::core_window_t*>(wParam), stru->forced, (stru->ignore_update_area ? nullptr : &stru->update_area));
|
||||
::UpdateWindow(wd);
|
||||
::HeapFree(::GetProcessHeap(), 0, stru);
|
||||
}
|
||||
@ -758,7 +757,7 @@ namespace detail
|
||||
template<typename Arg>
|
||||
void emit_drawer(void (::nana::detail::drawer::*event_ptr)(const Arg&), basic_window* wd, const Arg& arg, bedrock::thread_context* thrd)
|
||||
{
|
||||
if (bedrock::instance().wd_manager.available(wd) == false)
|
||||
if (bedrock::instance().wd_manager().available(wd) == false)
|
||||
return;
|
||||
|
||||
basic_window* prev_event_wd;
|
||||
@ -786,7 +785,7 @@ namespace detail
|
||||
static restrict::TRACKMOUSEEVENT track = {sizeof track, 0x00000002};
|
||||
|
||||
auto native_window = reinterpret_cast<native_window_type>(root_window);
|
||||
auto* root_runtime = brock.wd_manager.root_runtime(native_window);
|
||||
auto* root_runtime = brock.wd_manager().root_runtime(native_window);
|
||||
|
||||
if(root_runtime)
|
||||
{
|
||||
@ -882,7 +881,7 @@ namespace detail
|
||||
arg_focus arg;
|
||||
assign_arg(arg, focus, native_window, true);
|
||||
if (!brock.emit(event_code::focus, focus, arg, true, &context))
|
||||
brock.wd_manager.set_focus(msgwnd, true);
|
||||
brock.wd_manager().set_focus(msgwnd, true);
|
||||
}
|
||||
def_window_proc = true;
|
||||
break;
|
||||
@ -913,21 +912,21 @@ namespace detail
|
||||
break;
|
||||
case WM_LBUTTONDBLCLK: case WM_MBUTTONDBLCLK: case WM_RBUTTONDBLCLK:
|
||||
pressed_wd = nullptr;
|
||||
msgwnd = brock.wd_manager.find_window(native_window, pmdec.mouse.x, pmdec.mouse.y);
|
||||
msgwnd = brock.wd_manager().find_window(native_window, pmdec.mouse.x, pmdec.mouse.y);
|
||||
if(msgwnd && msgwnd->flags.enabled)
|
||||
{
|
||||
if (msgwnd->flags.take_active && !msgwnd->flags.ignore_mouse_focus)
|
||||
{
|
||||
auto killed = brock.wd_manager.set_focus(msgwnd, false);
|
||||
auto killed = brock.wd_manager().set_focus(msgwnd, false);
|
||||
if (killed != msgwnd)
|
||||
brock.wd_manager.do_lazy_refresh(killed, false);
|
||||
brock.wd_manager().do_lazy_refresh(killed, false);
|
||||
}
|
||||
|
||||
arg_mouse arg;
|
||||
assign_arg(arg, msgwnd, message, pmdec);
|
||||
if (brock.emit(arg.evt_code, msgwnd, arg, true, &context))
|
||||
{
|
||||
if (brock.wd_manager.available(msgwnd))
|
||||
if (brock.wd_manager().available(msgwnd))
|
||||
pressed_wd = msgwnd;
|
||||
}
|
||||
}
|
||||
@ -937,7 +936,7 @@ namespace detail
|
||||
def_window_proc = true;
|
||||
break;
|
||||
case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN:
|
||||
msgwnd = brock.wd_manager.find_window(native_window, pmdec.mouse.x, pmdec.mouse.y);
|
||||
msgwnd = brock.wd_manager().find_window(native_window, pmdec.mouse.x, pmdec.mouse.y);
|
||||
if(nullptr == msgwnd) break;
|
||||
|
||||
//if event on the menubar, just remove the menu if it is not associating with the menubar
|
||||
@ -955,9 +954,9 @@ namespace detail
|
||||
auto new_focus = (msgwnd->flags.take_active ? msgwnd : msgwnd->other.active_window);
|
||||
if (new_focus && (!new_focus->flags.ignore_mouse_focus))
|
||||
{
|
||||
auto kill_focus = brock.wd_manager.set_focus(new_focus, false);
|
||||
auto kill_focus = brock.wd_manager().set_focus(new_focus, false);
|
||||
if (kill_focus != new_focus)
|
||||
brock.wd_manager.do_lazy_refresh(kill_focus, false);
|
||||
brock.wd_manager().do_lazy_refresh(kill_focus, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -974,14 +973,14 @@ namespace detail
|
||||
auto pos = native_interface::cursor_position();
|
||||
auto rootwd = native_interface::find_window(pos.x, pos.y);
|
||||
native_interface::calc_window_point(rootwd, pos);
|
||||
if(msgwnd != brock.wd_manager.find_window(rootwd, pos.x, pos.y))
|
||||
if(msgwnd != brock.wd_manager().find_window(rootwd, pos.x, pos.y))
|
||||
{
|
||||
//call the drawer mouse up event for restoring the surface graphics
|
||||
msgwnd->flags.action = mouse_action::normal;
|
||||
|
||||
arg.evt_code = event_code::mouse_up;
|
||||
emit_drawer(&drawer::mouse_up, msgwnd, arg, &context);
|
||||
brock.wd_manager.do_lazy_refresh(msgwnd, false);
|
||||
brock.wd_manager().do_lazy_refresh(msgwnd, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -993,7 +992,7 @@ namespace detail
|
||||
case WM_LBUTTONUP:
|
||||
case WM_MBUTTONUP:
|
||||
case WM_RBUTTONUP:
|
||||
msgwnd = brock.wd_manager.find_window(native_window, pmdec.mouse.x, pmdec.mouse.y);
|
||||
msgwnd = brock.wd_manager().find_window(native_window, pmdec.mouse.x, pmdec.mouse.y);
|
||||
if(nullptr == msgwnd)
|
||||
break;
|
||||
|
||||
@ -1020,7 +1019,7 @@ namespace detail
|
||||
}
|
||||
|
||||
//Do mouse_up, this handle may be closed by click handler.
|
||||
if(brock.wd_manager.available(msgwnd) && msgwnd->flags.enabled)
|
||||
if(brock.wd_manager().available(msgwnd) && msgwnd->flags.enabled)
|
||||
{
|
||||
arg.evt_code = event_code::mouse_up;
|
||||
emit_drawer(&drawer::mouse_up, msgwnd, arg, &context);
|
||||
@ -1033,7 +1032,7 @@ namespace detail
|
||||
retain->click.emit(arg);
|
||||
}
|
||||
|
||||
if (brock.wd_manager.available(msgwnd))
|
||||
if (brock.wd_manager().available(msgwnd))
|
||||
{
|
||||
arg.evt_code = event_code::mouse_up;
|
||||
retain->mouse_up.emit(arg);
|
||||
@ -1046,13 +1045,13 @@ namespace detail
|
||||
arg.by_mouse = true;
|
||||
retain->click.emit(arg);
|
||||
}
|
||||
brock.wd_manager.do_lazy_refresh(msgwnd, false);
|
||||
brock.wd_manager().do_lazy_refresh(msgwnd, false);
|
||||
}
|
||||
pressed_wd = nullptr;
|
||||
break;
|
||||
case WM_MOUSEMOVE:
|
||||
msgwnd = brock.wd_manager.find_window(native_window, pmdec.mouse.x, pmdec.mouse.y);
|
||||
if (brock.wd_manager.available(hovered_wd) && (msgwnd != hovered_wd))
|
||||
msgwnd = brock.wd_manager().find_window(native_window, pmdec.mouse.x, pmdec.mouse.y);
|
||||
if (brock.wd_manager().available(hovered_wd) && (msgwnd != hovered_wd))
|
||||
{
|
||||
brock.event_msleave(hovered_wd);
|
||||
hovered_wd->flags.action = mouse_action::normal;
|
||||
@ -1060,7 +1059,7 @@ namespace detail
|
||||
|
||||
//if msgwnd is neither captured window nor the child of captured window,
|
||||
//redirect the msgwnd to the captured window.
|
||||
auto wd = brock.wd_manager.capture_redirect(msgwnd);
|
||||
auto wd = brock.wd_manager().capture_redirect(msgwnd);
|
||||
if(wd)
|
||||
msgwnd = wd;
|
||||
}
|
||||
@ -1068,7 +1067,7 @@ namespace detail
|
||||
else if(msgwnd)
|
||||
{
|
||||
bool prev_captured_inside;
|
||||
if(brock.wd_manager.capture_window_entered(pmdec.mouse.x, pmdec.mouse.y, prev_captured_inside))
|
||||
if(brock.wd_manager().capture_window_entered(pmdec.mouse.x, pmdec.mouse.y, prev_captured_inside))
|
||||
{
|
||||
event_code evt_code;
|
||||
if(prev_captured_inside)
|
||||
@ -1113,7 +1112,7 @@ namespace detail
|
||||
track.hwndTrack = native_window;
|
||||
restrict::track_mouse_event(&track);
|
||||
}
|
||||
if (!brock.wd_manager.available(hovered_wd))
|
||||
if (!brock.wd_manager().available(hovered_wd))
|
||||
hovered_wd = nullptr;
|
||||
break;
|
||||
case WM_MOUSELEAVE:
|
||||
@ -1129,7 +1128,7 @@ namespace detail
|
||||
if (pointer_wd == root_window)
|
||||
{
|
||||
::ScreenToClient(pointer_wd, &scr_pos);
|
||||
auto scrolled_wd = brock.wd_manager.find_window(reinterpret_cast<native_window_type>(pointer_wd), scr_pos.x, scr_pos.y);
|
||||
auto scrolled_wd = brock.wd_manager().find_window(reinterpret_cast<native_window_type>(pointer_wd), scr_pos.x, scr_pos.y);
|
||||
|
||||
def_window_proc = true;
|
||||
auto evt_wd = scrolled_wd;
|
||||
@ -1139,7 +1138,7 @@ namespace detail
|
||||
{
|
||||
def_window_proc = false;
|
||||
nana::point mspos{ scr_pos.x, scr_pos.y };
|
||||
brock.wd_manager.calc_window_point(evt_wd, mspos);
|
||||
brock.wd_manager().calc_window_point(evt_wd, mspos);
|
||||
|
||||
arg_wheel arg;
|
||||
arg.which = (WM_MOUSEHWHEEL == message ? arg_wheel::wheel::horizontal : arg_wheel::wheel::vertical);
|
||||
@ -1153,13 +1152,13 @@ namespace detail
|
||||
if (scrolled_wd && (nullptr == evt_wd))
|
||||
{
|
||||
nana::point mspos{ scr_pos.x, scr_pos.y };
|
||||
brock.wd_manager.calc_window_point(scrolled_wd, mspos);
|
||||
brock.wd_manager().calc_window_point(scrolled_wd, mspos);
|
||||
|
||||
arg_wheel arg;
|
||||
arg.which = (WM_MOUSEHWHEEL == message ? arg_wheel::wheel::horizontal : arg_wheel::wheel::vertical);
|
||||
assign_arg(arg, scrolled_wd, pmdec);
|
||||
brock.emit_drawer(event_code::mouse_wheel, scrolled_wd, arg, &context);
|
||||
brock.wd_manager.do_lazy_refresh(scrolled_wd, false);
|
||||
brock.wd_manager().do_lazy_refresh(scrolled_wd, false);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -1177,7 +1176,7 @@ namespace detail
|
||||
POINT pos;
|
||||
::DragQueryPoint(drop, &pos);
|
||||
|
||||
msgwnd = brock.wd_manager.find_window(native_window, pos.x, pos.y);
|
||||
msgwnd = brock.wd_manager().find_window(native_window, pos.x, pos.y);
|
||||
if(msgwnd)
|
||||
{
|
||||
arg_dropfiles dropfiles;
|
||||
@ -1207,11 +1206,11 @@ namespace detail
|
||||
dropfiles.pos.x = pos.x;
|
||||
dropfiles.pos.y = pos.y;
|
||||
|
||||
brock.wd_manager.calc_window_point(msgwnd, dropfiles.pos);
|
||||
brock.wd_manager().calc_window_point(msgwnd, dropfiles.pos);
|
||||
dropfiles.window_handle = reinterpret_cast<window>(msgwnd);
|
||||
|
||||
msgwnd->together.events_ptr->mouse_dropfiles.emit(dropfiles);
|
||||
brock.wd_manager.do_lazy_refresh(msgwnd, false);
|
||||
brock.wd_manager().do_lazy_refresh(msgwnd, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1299,7 +1298,7 @@ namespace detail
|
||||
break;
|
||||
case WM_SIZE:
|
||||
if(wParam != SIZE_MINIMIZED)
|
||||
brock.wd_manager.size(msgwnd, size(pmdec.size.width, pmdec.size.height), true, true);
|
||||
brock.wd_manager().size(msgwnd, size(pmdec.size.width, pmdec.size.height), true, true);
|
||||
break;
|
||||
case WM_MOVE:
|
||||
brock.event_move(msgwnd, (int)(short) LOWORD(lParam), (int)(short) HIWORD(lParam));
|
||||
@ -1325,7 +1324,7 @@ namespace detail
|
||||
case WM_SYSCHAR:
|
||||
def_window_proc = true;
|
||||
brock.set_keyboard_shortkey(true);
|
||||
msgwnd = brock.wd_manager.find_shortkey(native_window, static_cast<unsigned long>(wParam));
|
||||
msgwnd = brock.wd_manager().find_shortkey(native_window, static_cast<unsigned long>(wParam));
|
||||
if(msgwnd)
|
||||
{
|
||||
arg_keyboard arg;
|
||||
@ -1372,7 +1371,7 @@ namespace detail
|
||||
|
||||
bool set_focus = (brock.focus() != msgwnd) && (!msgwnd->root_widget->flags.ignore_menubar_focus);
|
||||
if (set_focus)
|
||||
brock.wd_manager.set_focus(msgwnd, false);
|
||||
brock.wd_manager().set_focus(msgwnd, false);
|
||||
|
||||
arg_keyboard arg;
|
||||
arg.evt_code = event_code::key_release;
|
||||
@ -1406,12 +1405,12 @@ namespace detail
|
||||
{
|
||||
bool is_forward = (::GetKeyState(VK_SHIFT) >= 0);
|
||||
|
||||
auto tstop_wd = brock.wd_manager.tabstop(msgwnd, is_forward);
|
||||
auto tstop_wd = brock.wd_manager().tabstop(msgwnd, is_forward);
|
||||
if (tstop_wd)
|
||||
{
|
||||
brock.wd_manager.set_focus(tstop_wd, false);
|
||||
brock.wd_manager.do_lazy_refresh(msgwnd, false);
|
||||
brock.wd_manager.do_lazy_refresh(tstop_wd, true);
|
||||
brock.wd_manager().set_focus(tstop_wd, false);
|
||||
brock.wd_manager().do_lazy_refresh(msgwnd, false);
|
||||
brock.wd_manager().do_lazy_refresh(tstop_wd, true);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -1453,10 +1452,10 @@ namespace detail
|
||||
arg.ignore = false;
|
||||
|
||||
msgwnd->together.events_ptr->key_char.emit(arg);
|
||||
if ((false == arg.ignore) && brock.wd_manager.available(msgwnd))
|
||||
if ((false == arg.ignore) && brock.wd_manager().available(msgwnd))
|
||||
brock.emit_drawer(event_code::key_char, msgwnd, arg, &context);
|
||||
|
||||
brock.wd_manager.do_lazy_refresh(msgwnd, false);
|
||||
brock.wd_manager().do_lazy_refresh(msgwnd, false);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@ -1504,12 +1503,12 @@ namespace detail
|
||||
brock.erase_menu(false);
|
||||
brock.delay_restore(3); //Restores if delay_restore not decleared
|
||||
}
|
||||
brock.wd_manager.destroy(msgwnd);
|
||||
brock.wd_manager().destroy(msgwnd);
|
||||
nana::detail::platform_spec::instance().release_window_icon(msgwnd->root);
|
||||
break;
|
||||
case WM_NCDESTROY:
|
||||
brock.rt_manager.remove_if_exists(msgwnd);
|
||||
brock.wd_manager.destroy_handle(msgwnd);
|
||||
brock.manage_form_loader(msgwnd, false);
|
||||
brock.wd_manager().destroy_handle(msgwnd);
|
||||
|
||||
if(--context.window_count <= 0)
|
||||
{
|
||||
@ -1521,7 +1520,7 @@ namespace detail
|
||||
def_window_proc = true;
|
||||
}
|
||||
|
||||
root_runtime = brock.wd_manager.root_runtime(native_window);
|
||||
root_runtime = brock.wd_manager().root_runtime(native_window);
|
||||
if(root_runtime)
|
||||
{
|
||||
root_runtime->condition.pressed = pressed_wd;
|
||||
@ -1538,21 +1537,15 @@ namespace detail
|
||||
::nana::category::flags bedrock::category(core_window_t* wd)
|
||||
{
|
||||
internal_scope_guard lock;
|
||||
return (wd_manager.available(wd) ? wd->other.category : ::nana::category::flags::super);
|
||||
return (wd_manager().available(wd) ? wd->other.category : ::nana::category::flags::super);
|
||||
}
|
||||
|
||||
auto bedrock::focus() ->core_window_t*
|
||||
{
|
||||
core_window_t* wd = wd_manager.root(native_interface::get_focus_window());
|
||||
core_window_t* wd = wd_manager().root(native_interface::get_focus_window());
|
||||
return (wd ? wd->other.attribute.root->focus : nullptr);
|
||||
}
|
||||
|
||||
native_window_type bedrock::root(core_window_t* wd)
|
||||
{
|
||||
internal_scope_guard lock;
|
||||
return (wd_manager.available(wd) ? wd->root : nullptr);
|
||||
}
|
||||
|
||||
void bedrock::set_menubar_taken(core_window_t* wd)
|
||||
{
|
||||
auto pre = impl_->menu.taken_window;
|
||||
@ -1563,8 +1556,8 @@ namespace detail
|
||||
if ((!wd) && pre && (pre->root != get_menu()))
|
||||
{
|
||||
internal_scope_guard lock;
|
||||
wd_manager.set_focus(pre, false);
|
||||
wd_manager.update(pre, true, false);
|
||||
wd_manager().set_focus(pre, false);
|
||||
wd_manager().update(pre, true, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1692,17 +1685,9 @@ namespace detail
|
||||
#endif
|
||||
}
|
||||
|
||||
bool bedrock::emit(event_code evt_code, core_window_t* wd, const arg_mouse& arg, bool ask_update, thread_context* thrd)
|
||||
{
|
||||
if (evt_code != arg.evt_code)
|
||||
throw std::runtime_error("Nana.bedrock: invalid event arg.");
|
||||
|
||||
return emit(evt_code, wd, static_cast<const ::nana::event_arg&>(arg), ask_update, thrd);
|
||||
}
|
||||
|
||||
bool bedrock::emit(event_code evt_code, core_window_t* wd, const ::nana::event_arg& arg, bool ask_update, thread_context* thrd)
|
||||
{
|
||||
if (wd_manager.available(wd) == false)
|
||||
if (wd_manager().available(wd) == false)
|
||||
return false;
|
||||
|
||||
basic_window* prev_event_wd;
|
||||
@ -1719,8 +1704,8 @@ namespace detail
|
||||
_m_emit_core(evt_code, wd, false, arg);
|
||||
|
||||
if (ask_update)
|
||||
wd_manager.do_lazy_refresh(wd, false);
|
||||
else if (wd_manager.available(wd))
|
||||
wd_manager().do_lazy_refresh(wd, false);
|
||||
else if (wd_manager().available(wd))
|
||||
wd->other.upd_state = basic_window::update_state::none;
|
||||
|
||||
if (thrd) thrd->event_window = prev_event_wd;
|
||||
@ -1729,7 +1714,7 @@ namespace detail
|
||||
|
||||
bool bedrock::emit_drawer(event_code evt_code, core_window_t* wd, const ::nana::event_arg& arg, thread_context* thrd)
|
||||
{
|
||||
if (bedrock_object.wd_manager.available(wd) == false)
|
||||
if (bedrock_object.wd_manager().available(wd) == false)
|
||||
return false;
|
||||
|
||||
core_window_t* prev_event_wd;
|
||||
@ -1854,7 +1839,7 @@ namespace detail
|
||||
thrd = get_thread_context(wd->thread_id);
|
||||
|
||||
HCURSOR rev_handle = ::LoadCursor(nullptr, IDC_ARROW);
|
||||
if (!wd_manager.available(wd))
|
||||
if (!wd_manager().available(wd))
|
||||
{
|
||||
::ShowCursor(FALSE);
|
||||
::SetCursor(rev_handle);
|
||||
@ -1875,7 +1860,7 @@ namespace detail
|
||||
}
|
||||
|
||||
native_interface::calc_window_point(native_handle, pos);
|
||||
auto rev_wd = wd_manager.find_window(native_handle, pos.x, pos.y);
|
||||
auto rev_wd = wd_manager().find_window(native_handle, pos.x, pos.y);
|
||||
if (rev_wd)
|
||||
{
|
||||
set_cursor(rev_wd, rev_wd->predef_cursor, thrd);
|
||||
|
@ -8,12 +8,12 @@
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* @file: nana/gui/detail/window_manager.cpp
|
||||
* @author: Jinhao
|
||||
* @contributors: Katsuhisa Yuasa
|
||||
*/
|
||||
|
||||
#include <nana/config.hpp>
|
||||
#include <nana/gui/detail/bedrock.hpp>
|
||||
#include <nana/gui/detail/events_operation.hpp>
|
||||
#include <nana/gui/detail/handle_manager.hpp>
|
||||
#include <nana/gui/detail/window_manager.hpp>
|
||||
#include <nana/gui/detail/native_window_interface.hpp>
|
||||
@ -28,15 +28,75 @@ namespace nana
|
||||
|
||||
namespace detail
|
||||
{
|
||||
template<typename Key, typename Value>
|
||||
class lite_map
|
||||
{
|
||||
struct key_value_rep
|
||||
{
|
||||
Key first;
|
||||
Value second;
|
||||
|
||||
key_value_rep()
|
||||
: first{}, second{}
|
||||
{}
|
||||
|
||||
key_value_rep(const Key& k)
|
||||
: first(k), second{}
|
||||
{
|
||||
}
|
||||
};
|
||||
public:
|
||||
using iterator = typename std::vector<key_value_rep>::iterator;
|
||||
|
||||
Value& operator[](const Key& key)
|
||||
{
|
||||
for (auto& kv : table_)
|
||||
{
|
||||
if (kv.first == key)
|
||||
return kv.second;
|
||||
}
|
||||
|
||||
table_.emplace_back(key);
|
||||
return table_.back().second;
|
||||
}
|
||||
|
||||
iterator find(const Key& key)
|
||||
{
|
||||
for (auto i = table_.begin(); i != table_.end(); ++i)
|
||||
if (i->first == key)
|
||||
return i;
|
||||
|
||||
return table_.end();
|
||||
}
|
||||
|
||||
iterator erase(iterator pos)
|
||||
{
|
||||
return table_.erase(pos);
|
||||
}
|
||||
|
||||
iterator begin()
|
||||
{
|
||||
return table_.begin();
|
||||
}
|
||||
|
||||
iterator end()
|
||||
{
|
||||
return table_.end();
|
||||
}
|
||||
private:
|
||||
std::vector<key_value_rep> table_;
|
||||
};
|
||||
//class window_manager
|
||||
|
||||
struct window_handle_deleter
|
||||
{
|
||||
void operator()(basic_window* wd) const
|
||||
{
|
||||
bedrock::instance().evt_operation.umake(reinterpret_cast<window>(wd));
|
||||
bedrock::instance().evt_operation().umake(reinterpret_cast<window>(wd));
|
||||
delete wd;
|
||||
}
|
||||
};
|
||||
|
||||
//struct wdm_private_impl
|
||||
struct window_manager::wdm_private_impl
|
||||
{
|
||||
@ -44,6 +104,8 @@ namespace detail
|
||||
handle_manager<core_window_t*, window_manager, window_handle_deleter> wd_register;
|
||||
paint::image default_icon_big;
|
||||
paint::image default_icon_small;
|
||||
|
||||
lite_map<core_window_t*, std::vector<std::function<void()>>> safe_place;
|
||||
};
|
||||
//end struct wdm_private_impl
|
||||
|
||||
@ -153,7 +215,7 @@ namespace detail
|
||||
|
||||
bool window_manager::is_queue(core_window_t* wd)
|
||||
{
|
||||
return (wd && (wd->other.category == category::root_tag::value));
|
||||
return (wd && (category::flags::root == wd->other.category));
|
||||
}
|
||||
|
||||
std::size_t window_manager::number_of_core_window() const
|
||||
@ -216,7 +278,7 @@ namespace detail
|
||||
if (owner->flags.destroying)
|
||||
throw std::logic_error("the specified owner is destory");
|
||||
|
||||
native = (owner->other.category == category::frame_tag::value ?
|
||||
native = (category::flags::frame == owner->other.category ?
|
||||
owner->other.attribute.frame->container : owner->root_widget->root);
|
||||
r.x += owner->pos_root.x;
|
||||
r.y += owner->pos_root.y;
|
||||
@ -674,6 +736,14 @@ namespace detail
|
||||
std::lock_guard<decltype(mutex_)> lock(mutex_);
|
||||
if (impl_->wd_register.available(wd) && !wd->is_draw_through())
|
||||
{
|
||||
auto parent = wd->parent;
|
||||
while (parent)
|
||||
{
|
||||
if (parent->flags.refreshing)
|
||||
return;
|
||||
parent = parent->parent;
|
||||
}
|
||||
|
||||
//Copy the root buffer that wd specified into DeviceContext
|
||||
#if defined(NANA_LINUX)
|
||||
wd->drawer.map(reinterpret_cast<window>(wd), forced, update_area);
|
||||
@ -786,12 +856,6 @@ namespace detail
|
||||
false);
|
||||
}
|
||||
|
||||
::nana::widget* window_manager::get_widget(core_window_t* wd) const
|
||||
{
|
||||
std::lock_guard<decltype(mutex_)> lock(mutex_);
|
||||
return (impl_->wd_register.available(wd) ? wd->widget_notifier->widget_ptr() : nullptr);
|
||||
}
|
||||
|
||||
std::vector<window_manager::core_window_t*> window_manager::get_children(core_window_t* wd) const
|
||||
{
|
||||
std::lock_guard<decltype(mutex_)> lock(mutex_);
|
||||
@ -1192,6 +1256,37 @@ namespace detail
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void window_manager::set_safe_place(core_window_t* wd, std::function<void()>&& fn)
|
||||
{
|
||||
if (fn)
|
||||
{
|
||||
std::lock_guard<decltype(mutex_)> lock(mutex_);
|
||||
if (!available(wd))
|
||||
return;
|
||||
|
||||
impl_->safe_place[wd].emplace_back(std::move(fn));
|
||||
}
|
||||
}
|
||||
|
||||
void window_manager::call_safe_place(unsigned thread_id)
|
||||
{
|
||||
std::lock_guard<decltype(mutex_)> lock(mutex_);
|
||||
|
||||
for (auto i = impl_->safe_place.begin(); i != impl_->safe_place.end();)
|
||||
{
|
||||
if (i->first->thread_id == thread_id)
|
||||
{
|
||||
for (auto & fn : i->second)
|
||||
fn();
|
||||
|
||||
i = impl_->safe_place.erase(i);
|
||||
}
|
||||
else
|
||||
++i;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool check_tree(basic_window* wd, basic_window* const cond)
|
||||
{
|
||||
if (wd == cond) return true;
|
||||
|
@ -26,13 +26,17 @@ namespace nana
|
||||
event_handle destroy;
|
||||
};
|
||||
public:
|
||||
dragger_impl_t()
|
||||
: dragging_(false)
|
||||
{}
|
||||
|
||||
~dragger_impl_t()
|
||||
{
|
||||
_m_clear_triggers();
|
||||
//Clear triggers
|
||||
for (auto & t : triggers_)
|
||||
{
|
||||
API::umake_event(t.press);
|
||||
API::umake_event(t.over);
|
||||
API::umake_event(t.release);
|
||||
API::umake_event(t.destroy);
|
||||
API::capture_window(t.wd, false);
|
||||
}
|
||||
}
|
||||
|
||||
void drag_target(window wd, const rectangle& restrict_area, arrange arg)
|
||||
@ -65,45 +69,86 @@ namespace nana
|
||||
{
|
||||
trigger_t tg;
|
||||
tg.wd = wd;
|
||||
auto fn = std::bind(&dragger_impl_t::_m_trace, this, std::placeholders::_1);
|
||||
auto fn = [this](const arg_mouse& arg)
|
||||
{
|
||||
switch (arg.evt_code)
|
||||
{
|
||||
case event_code::mouse_down:
|
||||
dragging_ = true;
|
||||
API::capture_window(arg.window_handle, true);
|
||||
origin_ = API::cursor_position();
|
||||
for (auto & t : targets_)
|
||||
{
|
||||
t.origin = API::window_position(t.wd);
|
||||
window owner = API::get_owner_window(t.wd);
|
||||
if (owner)
|
||||
API::calc_screen_point(owner, t.origin);
|
||||
}
|
||||
break;
|
||||
case event_code::mouse_move:
|
||||
if (dragging_ && arg.left_button)
|
||||
{
|
||||
auto pos = API::cursor_position();
|
||||
pos -= origin_;
|
||||
|
||||
for (auto & t : targets_)
|
||||
{
|
||||
if (API::is_window_zoomed(t.wd, true) == false)
|
||||
{
|
||||
auto owner = API::get_owner_window(t.wd);
|
||||
auto wdps = t.origin;
|
||||
if (owner)
|
||||
API::calc_window_point(owner, wdps);
|
||||
|
||||
switch (t.move_direction)
|
||||
{
|
||||
case nana::arrange::horizontal:
|
||||
wdps.x += pos.x;
|
||||
break;
|
||||
case nana::arrange::vertical:
|
||||
wdps.y += pos.y;
|
||||
break;
|
||||
default:
|
||||
wdps += pos;
|
||||
}
|
||||
|
||||
if (!t.restrict_area.empty())
|
||||
_m_check_restrict_area(wdps, API::window_size(t.wd), t.restrict_area);
|
||||
|
||||
API::move_window(t.wd, wdps);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case event_code::mouse_up:
|
||||
API::capture_window(arg.window_handle, false);
|
||||
dragging_ = false;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
};
|
||||
auto & events = API::events(wd);
|
||||
tg.press = events.mouse_down.connect(fn);
|
||||
tg.over = events.mouse_move.connect(fn);
|
||||
tg.release = events.mouse_up.connect(fn);
|
||||
tg.destroy = events.destroy.connect([this](const arg_destroy& arg){
|
||||
_m_destroy(arg.window_handle);
|
||||
tg.destroy = events.destroy.connect([this](const arg_destroy& arg)
|
||||
{
|
||||
for (auto i = triggers_.begin(), end = triggers_.end(); i != end; ++i)
|
||||
{
|
||||
if (i->wd == arg.window_handle)
|
||||
{
|
||||
triggers_.erase(i);
|
||||
API::capture_window(arg.window_handle, false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
triggers_.push_back(tg);
|
||||
}
|
||||
private:
|
||||
void _m_clear_triggers()
|
||||
{
|
||||
for(auto & t : triggers_)
|
||||
{
|
||||
API::umake_event(t.press);
|
||||
API::umake_event(t.over);
|
||||
API::umake_event(t.release);
|
||||
API::umake_event(t.destroy);
|
||||
API::capture_window(t.wd, false);
|
||||
}
|
||||
triggers_.clear();
|
||||
}
|
||||
|
||||
void _m_destroy(::nana::window wd)
|
||||
{
|
||||
for(auto i = triggers_.begin(), end = triggers_.end(); i != end; ++i)
|
||||
{
|
||||
if(i->wd == wd)
|
||||
{
|
||||
triggers_.erase(i);
|
||||
API::capture_window(wd, false);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _m_check_restrict_area(nana::point & pos, const nana::size & size, const nana::rectangle& restr_area)
|
||||
static void _m_check_restrict_area(nana::point & pos, const nana::size & size, const nana::rectangle& restr_area)
|
||||
{
|
||||
if ((pos.x > 0) && (static_cast<int>(size.width) + pos.x > restr_area.right()))
|
||||
pos.x = restr_area.right() - static_cast<int>(size.width);
|
||||
@ -117,69 +162,8 @@ namespace nana
|
||||
if (pos.y < restr_area.y)
|
||||
pos.y = restr_area.y;
|
||||
}
|
||||
|
||||
void _m_trace(const arg_mouse& arg)
|
||||
{
|
||||
switch(arg.evt_code)
|
||||
{
|
||||
case event_code::mouse_down:
|
||||
dragging_ = true;
|
||||
API::capture_window(arg.window_handle, true);
|
||||
origin_ = API::cursor_position();
|
||||
for(auto & t : targets_)
|
||||
{
|
||||
t.origin = API::window_position(t.wd);
|
||||
window owner = API::get_owner_window(t.wd);
|
||||
if(owner)
|
||||
API::calc_screen_point(owner, t.origin);
|
||||
}
|
||||
break;
|
||||
case event_code::mouse_move:
|
||||
if(dragging_ && arg.left_button)
|
||||
{
|
||||
auto pos = API::cursor_position();
|
||||
pos -= origin_;
|
||||
|
||||
for(auto & t : targets_)
|
||||
{
|
||||
if(API::is_window_zoomed(t.wd, true) == false)
|
||||
{
|
||||
auto owner = API::get_owner_window(t.wd);
|
||||
auto wdps = t.origin;
|
||||
if (owner)
|
||||
API::calc_window_point(owner, wdps);
|
||||
|
||||
switch (t.move_direction)
|
||||
{
|
||||
case nana::arrange::horizontal:
|
||||
wdps.x += pos.x;
|
||||
break;
|
||||
case nana::arrange::vertical:
|
||||
wdps.y += pos.y;
|
||||
break;
|
||||
default:
|
||||
wdps += pos;
|
||||
}
|
||||
|
||||
if (!t.restrict_area.empty())
|
||||
_m_check_restrict_area(wdps, API::window_size(t.wd), t.restrict_area);
|
||||
|
||||
API::move_window(t.wd, wdps.x, wdps.y);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case event_code::mouse_up:
|
||||
API::capture_window(arg.window_handle, false);
|
||||
dragging_ = false;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
bool dragging_;
|
||||
bool dragging_{ false };
|
||||
nana::point origin_;
|
||||
std::vector<drag_target_t> targets_;
|
||||
std::vector<trigger_t> triggers_;
|
||||
|
@ -22,7 +22,7 @@ namespace nana
|
||||
{
|
||||
namespace
|
||||
{
|
||||
using core_window_t = detail::bedrock::core_window_t;
|
||||
using core_window_t = detail::basic_window;
|
||||
|
||||
inline detail::drawer& get_drawer(window wd)
|
||||
{
|
||||
|
@ -28,6 +28,14 @@ namespace nana
|
||||
//Element definitions
|
||||
namespace element
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
void factory_abstract::destroy(element_abstract* ptr)
|
||||
{
|
||||
delete ptr;
|
||||
}
|
||||
}
|
||||
|
||||
class crook
|
||||
: public crook_interface
|
||||
{
|
||||
@ -141,7 +149,7 @@ namespace nana
|
||||
}
|
||||
else
|
||||
{
|
||||
::nana::color highlighted(static_cast<color_rgb>(0x5eb6f7));
|
||||
::nana::color highlighted(0x5e, 0xb6, 0xf7);
|
||||
auto bld_bgcolor = bgcolor;
|
||||
auto bld_fgcolor = fgcolor;
|
||||
switch(es)
|
||||
@ -156,7 +164,7 @@ namespace nana
|
||||
bld_fgcolor = fgcolor.blend(highlighted, 0.4);
|
||||
break;
|
||||
case element_state::disabled:
|
||||
bld_bgcolor = bld_fgcolor.from_rgb(0xb2, 0xb7, 0xbc);
|
||||
bld_bgcolor = bld_fgcolor = nana::color(0xb2, 0xb7, 0xbc);
|
||||
break;
|
||||
default:
|
||||
//Leave things as they are
|
||||
@ -529,14 +537,71 @@ namespace nana
|
||||
return true;
|
||||
}
|
||||
};//end class annex_button
|
||||
|
||||
class x_icon
|
||||
: public element_interface
|
||||
{
|
||||
bool draw(graph_reference graph, const ::nana::color&, const ::nana::color& fgcolor, const rectangle& r, element_state estate) override
|
||||
{
|
||||
auto clr = fgcolor;
|
||||
|
||||
switch (estate)
|
||||
{
|
||||
case element_state::hovered:
|
||||
case element_state::pressed:
|
||||
clr = clr.blend(colors::black, 0.8);
|
||||
break;
|
||||
case element_state::disabled:
|
||||
clr = colors::dark_gray;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
graph.set_color(clr);
|
||||
|
||||
const int x = r.x + 4;
|
||||
const int y = r.y + 4;
|
||||
|
||||
point p1{ x, y }, p2{ x + 7, y + 7 };
|
||||
|
||||
graph.line(p1, p2);
|
||||
|
||||
++p1.x;
|
||||
--p2.y;
|
||||
graph.line(p1, p2);
|
||||
|
||||
p1.x = x;
|
||||
++p1.y;
|
||||
p2.x = x + 6;
|
||||
p2.y = y + 7;
|
||||
graph.line(p1, p2);
|
||||
|
||||
p1.x += 7;
|
||||
p1.y = y;
|
||||
p2.x = x;
|
||||
graph.line(p1, p2);
|
||||
|
||||
p1.x = x + 6;
|
||||
p2.y = y + 6;
|
||||
graph.line(p1, p2);
|
||||
|
||||
++p1.x;
|
||||
++p1.y;
|
||||
++p2.x;
|
||||
++p2.y;
|
||||
graph.line(p1, p2);
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
}//end namespace element
|
||||
|
||||
template<typename ElementInterface>
|
||||
class element_object
|
||||
: nana::noncopyable, nana::nonmovable
|
||||
{
|
||||
typedef ElementInterface element_t;
|
||||
typedef pat::cloneable<element::provider::factory_interface<element_t>> factory_interface;
|
||||
using element_type = ElementInterface;
|
||||
using factory_interface = pat::cloneable<element::detail::factory_abstract>;
|
||||
|
||||
public:
|
||||
~element_object()
|
||||
@ -551,7 +616,7 @@ namespace nana
|
||||
auto keep_e = element_ptr_;
|
||||
|
||||
factory_ = rhs;
|
||||
element_ptr_ = factory_->create();
|
||||
element_ptr_ = static_cast<element_type*>(static_cast<element::provider::factory_interface<element_type>&>(*factory_).create());
|
||||
|
||||
if(nullptr == factory_ || nullptr == element_ptr_)
|
||||
{
|
||||
@ -567,14 +632,14 @@ namespace nana
|
||||
spare_.emplace_back(keep_e, keep_f);
|
||||
}
|
||||
|
||||
element_t * const * keeper() const
|
||||
element_type * const * cite() const
|
||||
{
|
||||
return &element_ptr_;
|
||||
}
|
||||
private:
|
||||
factory_interface factory_; //Keep the factory for destroying the element
|
||||
element_t * element_ptr_{nullptr};
|
||||
std::vector<std::pair<element_t*, factory_interface>> spare_;
|
||||
element_type * element_ptr_{nullptr};
|
||||
std::vector<std::pair<element_type*, factory_interface>> spare_;
|
||||
};
|
||||
|
||||
class element_manager
|
||||
@ -613,6 +678,8 @@ namespace nana
|
||||
element::add_arrow<element::arrow_hollow_triangle>("hollow_triangle");
|
||||
|
||||
element::add_button<element::annex_button>(""); //"annex" in default
|
||||
|
||||
element::add_x_icon<element::x_icon>("");
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
@ -624,7 +691,17 @@ namespace nana
|
||||
|
||||
element::crook_interface * const * crook(const std::string& name) const
|
||||
{
|
||||
return _m_get(name, crook_).keeper();
|
||||
return _m_get(name, crook_).cite();
|
||||
}
|
||||
|
||||
void cross(const std::string& name, const pat::cloneable<element::provider::factory_interface<element::element_interface>>& factory)
|
||||
{
|
||||
_m_add(name, cross_, factory);
|
||||
}
|
||||
|
||||
element::element_interface* const * cross(const std::string& name) const
|
||||
{
|
||||
return _m_get(name, cross_).cite();
|
||||
}
|
||||
|
||||
void border(const std::string& name, const pat::cloneable<element::provider::factory_interface<element::border_interface>>& factory)
|
||||
@ -634,7 +711,7 @@ namespace nana
|
||||
|
||||
element::border_interface * const * border(const std::string& name) const
|
||||
{
|
||||
return _m_get(name, border_).keeper();
|
||||
return _m_get(name, border_).cite();
|
||||
}
|
||||
|
||||
void arrow(const std::string& name, const pat::cloneable<element::provider::factory_interface<element::arrow_interface>>& factory)
|
||||
@ -644,7 +721,7 @@ namespace nana
|
||||
|
||||
element::arrow_interface * const * arrow(const std::string& name) const
|
||||
{
|
||||
return _m_get((name.empty() ? "arrowhead" : name), arrow_).keeper();
|
||||
return _m_get((name.empty() ? "arrowhead" : name), arrow_).cite();
|
||||
}
|
||||
|
||||
void button(const std::string& name, const pat::cloneable<element::provider::factory_interface<element::element_interface>>& factory)
|
||||
@ -654,7 +731,17 @@ namespace nana
|
||||
|
||||
element::element_interface * const * button(const std::string& name) const
|
||||
{
|
||||
return _m_get((name.empty() ? "annex" : name), button_).keeper();
|
||||
return _m_get((name.empty() ? "annex" : name), button_).cite();
|
||||
}
|
||||
|
||||
void x_icon(const std::string& name, const pat::cloneable<element::provider::factory_interface<element::element_interface>>& factory)
|
||||
{
|
||||
_m_add(name, x_icon_, factory);
|
||||
}
|
||||
|
||||
element::element_interface * const * x_icon(const std::string& name) const
|
||||
{
|
||||
return _m_get(name, x_icon_).cite();
|
||||
}
|
||||
private:
|
||||
using lock_guard = std::lock_guard<std::recursive_mutex>;
|
||||
@ -689,9 +776,11 @@ namespace nana
|
||||
private:
|
||||
mutable std::recursive_mutex mutex_;
|
||||
item<element::crook_interface> crook_;
|
||||
item<element::element_interface> cross_;
|
||||
item<element::border_interface> border_;
|
||||
item<element::arrow_interface> arrow_;
|
||||
item<element::element_interface> button_;
|
||||
item<element::element_interface> x_icon_;
|
||||
};
|
||||
|
||||
namespace element
|
||||
@ -702,17 +791,27 @@ namespace nana
|
||||
element_manager::instance().crook(name, factory);
|
||||
}
|
||||
|
||||
crook_interface* const * provider::keeper_crook(const std::string& name)
|
||||
crook_interface* const * provider::cite_crook(const std::string& name)
|
||||
{
|
||||
return element_manager::instance().crook(name);
|
||||
}
|
||||
|
||||
void provider::add_cross(const std::string& name, const pat::cloneable<factory_interface<element_interface>>& factory)
|
||||
{
|
||||
element_manager::instance().cross(name, factory);
|
||||
}
|
||||
|
||||
element_interface* const* provider::cite_cross(const std::string& name)
|
||||
{
|
||||
return element_manager::instance().cross(name);
|
||||
}
|
||||
|
||||
void provider::add_border(const std::string& name, const pat::cloneable<factory_interface<border_interface>>& factory)
|
||||
{
|
||||
element_manager::instance().border(name, factory);
|
||||
}
|
||||
|
||||
border_interface* const * provider::keeper_border(const std::string& name)
|
||||
border_interface* const * provider::cite_border(const std::string& name)
|
||||
{
|
||||
return element_manager::instance().border(name);
|
||||
}
|
||||
@ -722,7 +821,7 @@ namespace nana
|
||||
element_manager::instance().arrow(name, factory);
|
||||
}
|
||||
|
||||
arrow_interface* const * provider::keeper_arrow(const std::string& name)
|
||||
arrow_interface* const * provider::cite_arrow(const std::string& name)
|
||||
{
|
||||
return element_manager::instance().arrow(name);
|
||||
}
|
||||
@ -732,16 +831,26 @@ namespace nana
|
||||
element_manager::instance().button(name, factory);
|
||||
}
|
||||
|
||||
element_interface* const* provider::keeper_button(const std::string& name)
|
||||
element_interface* const* provider::cite_button(const std::string& name)
|
||||
{
|
||||
return element_manager::instance().button(name);
|
||||
}
|
||||
|
||||
void provider::add_x_icon(const std::string& name, const pat::cloneable<factory_interface<element_interface>>& factory)
|
||||
{
|
||||
element_manager::instance().x_icon(name, factory);
|
||||
}
|
||||
|
||||
element_interface* const* provider::cite_x_icon(const std::string& name)
|
||||
{
|
||||
return element_manager::instance().x_icon(name);
|
||||
}
|
||||
}//end namespace element
|
||||
|
||||
//facades
|
||||
//template<> class facade<element::crook>
|
||||
facade<element::crook>::facade(const char* name)
|
||||
: keeper_(element::provider().keeper_crook(name ? name : ""))
|
||||
: cite_(element::provider().cite_crook(name ? name : ""))
|
||||
{
|
||||
data_.check_state = state::unchecked;
|
||||
data_.radio = false;
|
||||
@ -777,40 +886,120 @@ namespace nana
|
||||
|
||||
void facade<element::crook>::switch_to(const char* name)
|
||||
{
|
||||
keeper_ = element::provider().keeper_crook(name ? name : "");
|
||||
cite_ = element::provider().cite_crook(name ? name : "");
|
||||
}
|
||||
|
||||
bool facade<element::crook>::draw(graph_reference graph, const ::nana::color& bgcol, const ::nana::color& fgcol, const nana::rectangle& r, element_state es)
|
||||
{
|
||||
return (*keeper_)->draw(graph, bgcol, fgcol, r, es, data_);
|
||||
return (*cite_)->draw(graph, bgcol, fgcol, r, es, data_);
|
||||
}
|
||||
//end class facade<element::crook>
|
||||
|
||||
//class facade<element::cross>
|
||||
facade<element::cross>::facade(const char* name)
|
||||
: cite_(element::provider().cite_cross(name ? name : ""))
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void facade<element::cross>::switch_to(const char* name)
|
||||
{
|
||||
cite_ = element::provider().cite_cross(name ? name : "");
|
||||
}
|
||||
|
||||
void facade<element::cross>::thickness(unsigned thk)
|
||||
{
|
||||
thickness_ = thk;
|
||||
}
|
||||
|
||||
void facade<element::cross>::size(unsigned size_px)
|
||||
{
|
||||
size_ = size_px;
|
||||
}
|
||||
|
||||
//Implement element_interface
|
||||
bool facade<element::cross>::draw(graph_reference graph, const ::nana::color&, const ::nana::color& fgcolor, const ::nana::rectangle& r, element_state)
|
||||
{
|
||||
if (thickness_ + 2 <= size_)
|
||||
{
|
||||
int gap = (static_cast<int>(size_) - static_cast<int>(thickness_)) / 2;
|
||||
|
||||
nana::point ps[12];
|
||||
ps[0].x = r.x + gap;
|
||||
ps[1].x = ps[0].x + static_cast<int>(thickness_) - 1;
|
||||
ps[1].y = ps[0].y = r.y;
|
||||
|
||||
ps[2].x = ps[1].x;
|
||||
ps[2].y = r.y + gap;
|
||||
|
||||
ps[3].x = ps[2].x + gap;
|
||||
ps[3].y = ps[2].y;
|
||||
|
||||
ps[4].x = ps[3].x;
|
||||
ps[4].y = ps[3].y + static_cast<int>(thickness_)-1;
|
||||
|
||||
ps[5].x = ps[1].x;
|
||||
ps[5].y = ps[4].y;
|
||||
|
||||
ps[6].x = ps[5].x;
|
||||
ps[6].y = ps[5].y + gap;
|
||||
|
||||
ps[7].x = r.x + gap;
|
||||
ps[7].y = ps[6].y;
|
||||
|
||||
ps[8].x = ps[7].x;
|
||||
ps[8].y = ps[4].y;
|
||||
|
||||
ps[9].x = r.x;
|
||||
ps[9].y = ps[4].y;
|
||||
|
||||
ps[10].x = r.x;
|
||||
ps[10].y = r.y + gap;
|
||||
|
||||
ps[11].x = r.x + gap;
|
||||
ps[11].y = r.y + gap;
|
||||
|
||||
graph.set_color(fgcolor.blend(colors::black, true));
|
||||
|
||||
for (int i = 0; i < 11; ++i)
|
||||
graph.line(ps[i], ps[i + 1]);
|
||||
graph.line(ps[11], ps[0]);
|
||||
|
||||
graph.set_color(fgcolor);
|
||||
|
||||
unsigned thk_minus_2 = thickness_ - 2;
|
||||
graph.rectangle(rectangle{ ps[10].x + 1, ps[10].y + 1, (gap << 1) + thk_minus_2, thk_minus_2 }, true);
|
||||
graph.rectangle(rectangle{ ps[0].x + 1, ps[0].y + 1, thk_minus_2, (gap << 1) + thk_minus_2 }, true);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
//end class facade<element::cross>
|
||||
|
||||
//class facade<element::border>
|
||||
facade<element::border>::facade(const char* name)
|
||||
: keeper_(element::provider().keeper_border(name ? name : ""))
|
||||
: cite_(element::provider().cite_border(name ? name : ""))
|
||||
{}
|
||||
|
||||
void facade<element::border>::switch_to(const char* name)
|
||||
{
|
||||
keeper_ = element::provider().keeper_border(name ? name : "");
|
||||
cite_ = element::provider().cite_border(name ? name : "");
|
||||
}
|
||||
|
||||
bool facade<element::border>::draw(graph_reference graph, const nana::color& bgcolor, const nana::color& fgcolor, const nana::rectangle& r, element_state es)
|
||||
{
|
||||
return (*keeper_)->draw(graph, bgcolor, fgcolor, r, es, 2);
|
||||
return (*cite_)->draw(graph, bgcolor, fgcolor, r, es, 2);
|
||||
}
|
||||
//end class facade<element::border>
|
||||
|
||||
//class facade<element::arrow>
|
||||
facade<element::arrow>::facade(const char* name)
|
||||
: keeper_(element::provider().keeper_arrow(name ? name : ""))
|
||||
: cite_(element::provider().cite_arrow(name ? name : ""))
|
||||
{
|
||||
}
|
||||
|
||||
void facade<element::arrow>::switch_to(const char* name)
|
||||
{
|
||||
keeper_ = element::provider().keeper_arrow(name ? name : "");
|
||||
cite_ = element::provider().cite_arrow(name ? name : "");
|
||||
}
|
||||
|
||||
void facade<element::arrow>::direction(::nana::direction dir)
|
||||
@ -822,42 +1011,62 @@ namespace nana
|
||||
bool facade<element::arrow>::draw(graph_reference graph, const nana::color& bgcolor, const nana::color& fgcolor, const nana::rectangle& r, element_state estate)
|
||||
{
|
||||
graph.set_color(fgcolor);
|
||||
return (*keeper_)->draw(graph, bgcolor, fgcolor, r, estate, dir_);
|
||||
return (*cite_)->draw(graph, bgcolor, fgcolor, r, estate, dir_);
|
||||
}
|
||||
//end class facade<element::arrow>
|
||||
|
||||
//class facade<element::button>::
|
||||
facade<element::button>::facade(const char* name)
|
||||
: keeper_(element::provider().keeper_button(name ? name : ""))
|
||||
: cite_(element::provider().cite_button(name ? name : ""))
|
||||
{}
|
||||
|
||||
void facade<element::button>::switch_to(const char* name)
|
||||
{
|
||||
keeper_ = element::provider().keeper_button(name ? name : "");
|
||||
cite_ = element::provider().cite_button(name ? name : "");
|
||||
}
|
||||
|
||||
//Implement element_interface
|
||||
bool facade<element::button>::draw(graph_reference graph, const ::nana::color& bgcolor, const ::nana::color& fgcolor, const ::nana::rectangle& r, element_state estate)
|
||||
{
|
||||
return (*keeper_)->draw(graph, bgcolor, fgcolor, r, estate);
|
||||
return (*cite_)->draw(graph, bgcolor, fgcolor, r, estate);
|
||||
}
|
||||
//end class facade<element::button>
|
||||
|
||||
|
||||
//class facade<element::x_icon>
|
||||
facade<element::x_icon>::facade(const char* name)
|
||||
: cite_(element::provider().cite_x_icon(name ? name : ""))
|
||||
{}
|
||||
|
||||
void facade<element::x_icon>::switch_to(const char* name)
|
||||
{
|
||||
cite_ = element::provider().cite_x_icon(name ? name : "");
|
||||
}
|
||||
|
||||
//Implement element_interface
|
||||
bool facade<element::x_icon>::draw(graph_reference graph, const ::nana::color& bgcolor, const ::nana::color& fgcolor, const ::nana::rectangle& r, element_state estate)
|
||||
{
|
||||
return (*cite_)->draw(graph, bgcolor, fgcolor, r, estate);
|
||||
}
|
||||
//end class facade<element::x_icon>
|
||||
|
||||
namespace element
|
||||
{
|
||||
using brock = ::nana::detail::bedrock;
|
||||
|
||||
void set_bground(const char* name, const pat::cloneable<element_interface>& obj)
|
||||
{
|
||||
detail::bedrock::instance().get_element_store().bground(name, obj);
|
||||
brock::instance().get_element_store().bground(name, obj);
|
||||
}
|
||||
|
||||
void set_bground(const char* name, pat::cloneable<element_interface> && obj)
|
||||
{
|
||||
detail::bedrock::instance().get_element_store().bground(name, std::move(obj));
|
||||
brock::instance().get_element_store().bground(name, std::move(obj));
|
||||
}
|
||||
|
||||
//class cite
|
||||
cite_bground::cite_bground(const char* name)
|
||||
: ref_ptr_(detail::bedrock::instance().get_element_store().bground(name))
|
||||
: ref_ptr_(brock::instance().get_element_store().bground(name))
|
||||
{
|
||||
}
|
||||
|
||||
@ -871,7 +1080,7 @@ namespace nana
|
||||
void cite_bground::set(const char* name)
|
||||
{
|
||||
holder_.reset();
|
||||
ref_ptr_ = detail::bedrock::instance().get_element_store().bground(name);
|
||||
ref_ptr_ = brock::instance().get_element_store().bground(name);
|
||||
}
|
||||
|
||||
bool cite_bground::draw(graph_reference dst, const ::nana::color& bgcolor, const ::nana::color& fgcolor, const nana::rectangle& r, element_state state)
|
||||
|
@ -959,7 +959,7 @@ namespace nana
|
||||
int inputbox::date::month() const
|
||||
{
|
||||
if (!impl_->wdg_month.empty())
|
||||
return impl_->wdg_month.option() + 1;
|
||||
return static_cast<int>(impl_->wdg_month.option()) + 1;
|
||||
return impl_->month;
|
||||
}
|
||||
|
||||
@ -1028,7 +1028,7 @@ namespace nana
|
||||
impl->wdg_day.events().destroy.connect_unignorable([impl]
|
||||
{
|
||||
impl->day = impl->wdg_day.to_int();
|
||||
impl->month = impl->wdg_month.option() + 1;
|
||||
impl->month = static_cast<int>(impl->wdg_month.option()) + 1;
|
||||
});
|
||||
|
||||
impl->wdg_year.events().destroy.connect_unignorable([impl]
|
||||
@ -1040,7 +1040,7 @@ namespace nana
|
||||
{
|
||||
auto month = impl->wdg_month.option() + 1;
|
||||
auto year = impl->wdg_year.to_int();
|
||||
int days = ::nana::date::month_days(year, month);
|
||||
int days = ::nana::date::month_days(year, static_cast<unsigned>(month));
|
||||
|
||||
auto day = impl->wdg_day.to_int();
|
||||
impl->wdg_day.range(1, days, 1); //It resets the current value of wdg_day
|
||||
|
@ -24,10 +24,9 @@
|
||||
#include <mutex>
|
||||
#endif
|
||||
|
||||
#if defined(NANA_WINDOWS)
|
||||
#include <nana/detail/win32/platform_spec.hpp>
|
||||
#elif defined(NANA_LINUX)
|
||||
#include PLATFORM_SPEC_HPP
|
||||
#include <nana/detail/platform_spec_selector.hpp>
|
||||
|
||||
#if defined(NANA_LINUX)
|
||||
#include <nana/system/platform.hpp>
|
||||
#include <iostream>
|
||||
#endif
|
||||
@ -241,11 +240,15 @@ namespace nana
|
||||
}
|
||||
#endif
|
||||
|
||||
typedef ::nana::detail::bedrock bedrock;
|
||||
//class notifier
|
||||
notifier::notifier(window wd)
|
||||
: impl_(new implement)
|
||||
{
|
||||
impl_->handle = wd;
|
||||
impl_->native_handle = API::root(wd);
|
||||
if (!impl_->native_handle)
|
||||
throw std::invalid_argument("Invalid window handle");
|
||||
|
||||
impl_->ani_timer.elapse([this]
|
||||
{
|
||||
#if defined(NANA_WINDOWS)
|
||||
@ -257,9 +260,6 @@ namespace nana
|
||||
#endif
|
||||
});
|
||||
|
||||
auto & brock = bedrock::instance();
|
||||
impl_->handle = wd;
|
||||
impl_->native_handle = brock.root(reinterpret_cast<bedrock::core_window_t*>(wd));
|
||||
impl_->evt_destroy = API::events(wd).destroy([this]
|
||||
{
|
||||
close();
|
||||
|
1603
source/gui/place.cpp
1603
source/gui/place.cpp
File diff suppressed because it is too large
Load Diff
692
source/gui/place_parts.hpp
Normal file
692
source/gui/place_parts.hpp
Normal file
@ -0,0 +1,692 @@
|
||||
/*
|
||||
* Parts of Class Place
|
||||
* Nana C++ Library(http://www.nanapro.org)
|
||||
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
|
||||
*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* @file: nana/gui/place_parts.hpp
|
||||
*/
|
||||
#ifndef NANA_GUI_PLACE_PARTS_HPP
|
||||
#define NANA_GUI_PLACE_PARTS_HPP
|
||||
|
||||
#include <nana/gui/widgets/form.hpp>
|
||||
#include <nana/gui/widgets/tabbar.hpp>
|
||||
#include <nana/gui/element.hpp>
|
||||
#include <nana/paint/text_renderer.hpp>
|
||||
#include <stdexcept>
|
||||
#include <deque>
|
||||
|
||||
namespace nana
|
||||
{
|
||||
namespace place_parts
|
||||
{
|
||||
class splitter_interface
|
||||
{
|
||||
public:
|
||||
virtual ~splitter_interface(){}
|
||||
};
|
||||
|
||||
class splitter_dtrigger
|
||||
: public drawer_trigger
|
||||
{
|
||||
};
|
||||
|
||||
template<bool IsLite>
|
||||
class splitter
|
||||
: public widget_object <typename std::conditional<IsLite, category::lite_widget_tag, category::widget_tag>::type, splitter_dtrigger>,
|
||||
public splitter_interface
|
||||
{
|
||||
private:
|
||||
void _m_complete_creation() override
|
||||
{
|
||||
this->caption("place-splitter");
|
||||
widget_object <typename std::conditional<IsLite, category::lite_widget_tag, category::widget_tag>::type, splitter_dtrigger>::_m_complete_creation();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class dock_notifier_interface
|
||||
{
|
||||
public:
|
||||
virtual ~dock_notifier_interface() = default;
|
||||
|
||||
virtual void notify_float() = 0;
|
||||
virtual void notify_dock() = 0;
|
||||
virtual void notify_move() = 0;
|
||||
virtual void notify_move_stopped() = 0;
|
||||
|
||||
//a dockarea requests to close the dockpane
|
||||
virtual void request_close() = 0;
|
||||
};
|
||||
|
||||
class dockcaption_dtrigger
|
||||
: public drawer_trigger
|
||||
{
|
||||
public:
|
||||
void on_close(std::function<void()>&& fn)
|
||||
{
|
||||
close_fn_ = std::move(fn);
|
||||
}
|
||||
private:
|
||||
virtual void attached(widget_reference wdg, graph_reference graph) override
|
||||
{
|
||||
window_handle_ = wdg;
|
||||
text_rd_.reset(new paint::text_renderer(graph));
|
||||
}
|
||||
|
||||
void refresh(graph_reference& graph) override
|
||||
{
|
||||
graph.set_color(static_cast<color_rgb>(0x83EB));
|
||||
graph.set_text_color(colors::white);
|
||||
graph.rectangle(true);
|
||||
|
||||
//draw caption
|
||||
auto text = API::window_caption(window_handle_);
|
||||
text_rd_->render({ 3, 1 }, text.data(), text.size(), graph.size().width - 20, true);
|
||||
|
||||
//draw x button
|
||||
auto r = _m_button_area();
|
||||
if (x_pointed_)
|
||||
{
|
||||
color xclr = colors::red;
|
||||
|
||||
if(x_state_ == ::nana::mouse_action::pressed)
|
||||
xclr = xclr.blend(colors::white, 0.8);
|
||||
|
||||
graph.rectangle(r, true, xclr);
|
||||
}
|
||||
|
||||
r.x += (r.width - 16) / 2;
|
||||
r.y = (r.height - 16) / 2;
|
||||
|
||||
x_icon_.draw(graph, colors::red, colors::white, r, element_state::normal);
|
||||
}
|
||||
|
||||
void mouse_move(graph_reference graph, const arg_mouse& arg) override
|
||||
{
|
||||
x_pointed_ = _m_button_area().is_hit(arg.pos);
|
||||
|
||||
refresh(graph);
|
||||
API::lazy_refresh();
|
||||
}
|
||||
|
||||
void mouse_leave(graph_reference graph, const arg_mouse&) override
|
||||
{
|
||||
x_pointed_ = false;
|
||||
refresh(graph);
|
||||
API::lazy_refresh();
|
||||
}
|
||||
|
||||
void mouse_down(graph_reference graph, const arg_mouse&) override
|
||||
{
|
||||
if (!x_pointed_)
|
||||
return;
|
||||
|
||||
x_state_ = ::nana::mouse_action::pressed;
|
||||
|
||||
refresh(graph);
|
||||
API::lazy_refresh();
|
||||
}
|
||||
|
||||
void mouse_up(graph_reference graph, const arg_mouse&) override
|
||||
{
|
||||
if (!x_pointed_)
|
||||
return;
|
||||
|
||||
x_state_ = ::nana::mouse_action::over;
|
||||
refresh(graph);
|
||||
API::lazy_refresh();
|
||||
|
||||
close_fn_();
|
||||
}
|
||||
private:
|
||||
::nana::rectangle _m_button_area() const
|
||||
{
|
||||
::nana::rectangle r{API::window_size(window_handle_)};
|
||||
|
||||
r.x = r.right() - 20;
|
||||
r.width = 20;
|
||||
return r;
|
||||
}
|
||||
public:
|
||||
window window_handle_;
|
||||
std::unique_ptr<paint::text_renderer> text_rd_;
|
||||
bool x_pointed_{ false };
|
||||
::nana::mouse_action x_state_{ ::nana::mouse_action::normal };
|
||||
facade<element::x_icon> x_icon_;
|
||||
|
||||
std::function<void()> close_fn_;
|
||||
};
|
||||
|
||||
class dockarea_caption
|
||||
: public widget_object < category::widget_tag, dockcaption_dtrigger >
|
||||
{
|
||||
public:
|
||||
void on_close(std::function<void()> fn)
|
||||
{
|
||||
get_drawer_trigger().on_close(std::move(fn));
|
||||
}
|
||||
};
|
||||
|
||||
class dock_page
|
||||
: public form
|
||||
{
|
||||
public:
|
||||
dock_page(window host, const rectangle& r, const rectangle & tab_r)
|
||||
: form(host, r, form::appear::bald<>())
|
||||
{
|
||||
tab_form_.reset(new form(handle(), tab_r, form::appear::bald<>()));
|
||||
|
||||
}
|
||||
private:
|
||||
std::unique_ptr<form> tab_form_;
|
||||
};
|
||||
|
||||
class dockarea
|
||||
: public widget_object <category::lite_widget_tag, drawer_trigger>
|
||||
{
|
||||
using base_type = widget_object<category::lite_widget_tag, drawer_trigger>;
|
||||
|
||||
using factory = std::function<std::unique_ptr<widget>(window)>;
|
||||
|
||||
struct panel
|
||||
{
|
||||
std::unique_ptr<widget> widget_ptr;
|
||||
};
|
||||
public:
|
||||
void set_notifier(place_parts::dock_notifier_interface* notifier)
|
||||
{
|
||||
notifier_ = notifier;
|
||||
}
|
||||
void create(window parent)
|
||||
{
|
||||
host_window_ = parent;
|
||||
base_type::create(parent, true);
|
||||
this->caption("dockarea");
|
||||
caption_.create(*this, true);
|
||||
caption_.on_close([this]
|
||||
{
|
||||
bool destroy_dockarea = true;
|
||||
|
||||
if (tabbar_)
|
||||
{
|
||||
tabbar_->erase(tabbar_->selected());
|
||||
|
||||
destroy_dockarea = (0 == tabbar_->length());
|
||||
}
|
||||
|
||||
|
||||
if (destroy_dockarea)
|
||||
notifier_->request_close();
|
||||
});
|
||||
|
||||
this->events().resized([this](const arg_resized& arg)
|
||||
{
|
||||
rectangle r{ 0, 0, arg.width, 20 };
|
||||
caption_.move(r);
|
||||
|
||||
if (arg.height > 20)
|
||||
{
|
||||
r.y = 20;
|
||||
if (tabbar_)
|
||||
{
|
||||
tabbar_->move({ 0, int(arg.height) - 20, arg.width, 20 });
|
||||
r.height = arg.height - 40;
|
||||
}
|
||||
else
|
||||
r.height = arg.height - 20;
|
||||
}
|
||||
|
||||
|
||||
for (auto & pn : panels_)
|
||||
{
|
||||
if (pn.widget_ptr)
|
||||
pn.widget_ptr->move(r);
|
||||
}
|
||||
});
|
||||
|
||||
caption_.events().mouse_down([this](const arg_mouse& arg)
|
||||
{
|
||||
if (::nana::mouse::left_button == arg.button)
|
||||
{
|
||||
moves_.started = true;
|
||||
moves_.start_pos = API::cursor_position();
|
||||
moves_.start_container_pos = (floating() ? container_->pos() : this->pos());
|
||||
API::capture_window(caption_, true);
|
||||
}
|
||||
});
|
||||
|
||||
caption_.events().mouse_move([this](const arg_mouse& arg)
|
||||
{
|
||||
if (arg.left_button && moves_.started)
|
||||
{
|
||||
auto move_pos = API::cursor_position() - moves_.start_pos;
|
||||
if (!floating())
|
||||
{
|
||||
if (std::abs(move_pos.x) > 4 || std::abs(move_pos.y) > 4)
|
||||
float_away(move_pos);
|
||||
}
|
||||
else
|
||||
{
|
||||
move_pos += moves_.start_container_pos;
|
||||
API::move_window(container_->handle(), move_pos);
|
||||
notifier_->notify_move();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
caption_.events().mouse_up([this](const arg_mouse& arg)
|
||||
{
|
||||
if ((::nana::mouse::left_button == arg.button) && moves_.started)
|
||||
{
|
||||
moves_.started = false;
|
||||
API::capture_window(caption_, false);
|
||||
notifier_->notify_move_stopped();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
void add_pane(factory & fn)
|
||||
{
|
||||
rectangle r{ point(), this->size()};
|
||||
|
||||
//get a rectangle excluding caption
|
||||
r.y = 20;
|
||||
if (r.height > 20)
|
||||
r.height -= 20;
|
||||
else
|
||||
r.height = 0;
|
||||
|
||||
if (!tabbar_)
|
||||
{
|
||||
if (panels_.size() > 0)
|
||||
{
|
||||
tabbar_.reset(new tabbar_lite(*this));
|
||||
|
||||
tabbar_->events().selected.clear();
|
||||
tabbar_->events().selected([this]
|
||||
{
|
||||
auto handle = tabbar_->attach(tabbar_->selected());
|
||||
if (handle)
|
||||
caption_.caption(API::window_caption(handle));
|
||||
else
|
||||
caption_.caption(::nana::string());
|
||||
});
|
||||
|
||||
tabbar_->move({ 0, r.bottom() - 20, r.width, 20 });
|
||||
r.height -= 20;
|
||||
|
||||
std::size_t pos = 0;
|
||||
for (auto & pn : panels_)
|
||||
{
|
||||
tabbar_->push_back(::nana::charset(pn.widget_ptr->caption()));
|
||||
tabbar_->attach(pos++, *pn.widget_ptr);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
r.height -= 20;
|
||||
|
||||
auto wdg = fn(*this);
|
||||
|
||||
if (tabbar_)
|
||||
{
|
||||
tabbar_->push_back(::nana::charset(wdg->caption()));
|
||||
tabbar_->attach(panels_.size(), wdg->handle());
|
||||
}
|
||||
|
||||
if (panels_.empty())
|
||||
{
|
||||
caption_.caption(wdg->caption());
|
||||
}
|
||||
|
||||
panels_.emplace_back();
|
||||
panels_.back().widget_ptr.swap(wdg);
|
||||
|
||||
for (auto & pn : panels_)
|
||||
{
|
||||
if (pn.widget_ptr)
|
||||
pn.widget_ptr->move(r);
|
||||
}
|
||||
}
|
||||
|
||||
void float_away(const ::nana::point& move_pos)
|
||||
{
|
||||
if (container_)
|
||||
return;
|
||||
|
||||
API::capture_window(caption_, false);
|
||||
|
||||
rectangle r{ pos() + move_pos, size() };
|
||||
container_.reset(new form(host_window_, r.pare_off(-1), form::appear::bald<>()));
|
||||
drawing dw(container_->handle());
|
||||
dw.draw([](paint::graphics& graph)
|
||||
{
|
||||
graph.rectangle(false, colors::coral);
|
||||
});
|
||||
|
||||
API::set_parent_window(handle(), container_->handle());
|
||||
this->move({ 1, 1 });
|
||||
|
||||
container_->show();
|
||||
API::capture_window(caption_, true);
|
||||
|
||||
notifier_->notify_float();
|
||||
}
|
||||
|
||||
void dock()
|
||||
{
|
||||
API::capture_window(caption_, false);
|
||||
API::set_parent_window(handle(), host_window_);
|
||||
container_.reset();
|
||||
notifier_->notify_dock();
|
||||
}
|
||||
|
||||
bool floating() const
|
||||
{
|
||||
return (nullptr != container_);
|
||||
}
|
||||
private:
|
||||
window host_window_{nullptr};
|
||||
place_parts::dock_notifier_interface* notifier_{ nullptr };
|
||||
std::unique_ptr<form> container_;
|
||||
dockarea_caption caption_;
|
||||
std::deque<panel> panels_;
|
||||
std::unique_ptr<tabbar_lite> tabbar_;
|
||||
|
||||
struct moves
|
||||
{
|
||||
bool started{ false };
|
||||
::nana::point start_pos;
|
||||
::nana::point start_container_pos;
|
||||
}moves_;
|
||||
};//class dockarea
|
||||
|
||||
|
||||
//number_t is used for storing a number type variable
|
||||
//such as integer, real and percent. Essentially, percent is a typo of real.
|
||||
class number_t
|
||||
{
|
||||
public:
|
||||
enum class kind{ none, integer, real, percent };
|
||||
|
||||
number_t()
|
||||
: kind_(kind::none)
|
||||
{
|
||||
value_.integer = 0;
|
||||
}
|
||||
|
||||
void reset()
|
||||
{
|
||||
kind_ = kind::none;
|
||||
value_.integer = 0;
|
||||
}
|
||||
|
||||
bool is_negative() const
|
||||
{
|
||||
switch (kind_)
|
||||
{
|
||||
case kind::integer:
|
||||
return (value_.integer < 0);
|
||||
case kind::real:
|
||||
case kind::percent:
|
||||
return (value_.real < 0);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool empty() const throw()
|
||||
{
|
||||
return (kind::none == kind_);
|
||||
}
|
||||
|
||||
kind kind_of() const
|
||||
{
|
||||
return kind_;
|
||||
}
|
||||
|
||||
double get_value(int ref_percent) const
|
||||
{
|
||||
switch (kind_)
|
||||
{
|
||||
case kind::integer:
|
||||
return value_.integer;
|
||||
case kind::real:
|
||||
return value_.real;
|
||||
case kind::percent:
|
||||
return value_.real * ref_percent;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int integer() const
|
||||
{
|
||||
if (kind::integer == kind_)
|
||||
return value_.integer;
|
||||
return static_cast<int>(value_.real);
|
||||
}
|
||||
|
||||
double real() const
|
||||
{
|
||||
if (kind::integer == kind_)
|
||||
return value_.integer;
|
||||
return value_.real;
|
||||
}
|
||||
|
||||
void assign(int i)
|
||||
{
|
||||
kind_ = kind::integer;
|
||||
value_.integer = i;
|
||||
}
|
||||
|
||||
void assign(double d)
|
||||
{
|
||||
kind_ = kind::real;
|
||||
value_.real = d;
|
||||
}
|
||||
|
||||
void assign_percent(double d)
|
||||
{
|
||||
kind_ = kind::percent;
|
||||
value_.real = d / 100;
|
||||
}
|
||||
private:
|
||||
kind kind_;
|
||||
union valueset
|
||||
{
|
||||
int integer;
|
||||
double real;
|
||||
}value_;
|
||||
};//end class number_t
|
||||
|
||||
|
||||
class margin
|
||||
{
|
||||
public:
|
||||
margin& operator=(margin&& rhs)
|
||||
{
|
||||
if (this != &rhs)
|
||||
{
|
||||
all_edges_ = rhs.all_edges_;
|
||||
margins_ = std::move(rhs.margins_);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
void clear()
|
||||
{
|
||||
all_edges_ = true;
|
||||
margins_.clear();
|
||||
}
|
||||
|
||||
void push(const number_t& v)
|
||||
{
|
||||
margins_.emplace_back(v);
|
||||
}
|
||||
|
||||
void set_value(const number_t& v)
|
||||
{
|
||||
clear();
|
||||
margins_.emplace_back(v);
|
||||
}
|
||||
|
||||
void set_array(const std::vector<number_t>& v)
|
||||
{
|
||||
all_edges_ = false;
|
||||
margins_ = v;
|
||||
}
|
||||
|
||||
nana::rectangle area(const ::nana::rectangle& field_area) const
|
||||
{
|
||||
if (margins_.empty())
|
||||
return field_area;
|
||||
|
||||
auto r = field_area;
|
||||
if (all_edges_)
|
||||
{
|
||||
auto px = static_cast<int>(margins_.back().get_value(static_cast<int>(r.width)));
|
||||
const auto dbl_px = static_cast<unsigned>(px << 1);
|
||||
r.x += px;
|
||||
r.width = (r.width < dbl_px ? 0 : r.width - dbl_px);
|
||||
|
||||
r.y += px;
|
||||
r.height = (r.height < dbl_px ? 0 : r.height - dbl_px);
|
||||
}
|
||||
else
|
||||
{
|
||||
int il{ -1 }, ir{ -1 }, it{ -1 }, ib{ -1 }; //index of four corners in margin
|
||||
switch (margins_.size())
|
||||
{
|
||||
case 0: break;
|
||||
case 1: //top
|
||||
it = 0;
|
||||
break;
|
||||
case 2://top,bottom and left,right
|
||||
it = ib = 0;
|
||||
il = ir = 1;
|
||||
break;
|
||||
default:
|
||||
il = 3; //left
|
||||
case 3: //top, right, bottom
|
||||
it = 0;
|
||||
ir = 1;
|
||||
ib = 2;
|
||||
}
|
||||
|
||||
typedef decltype(r.height) px_type;
|
||||
auto calc = [](px_type a, px_type b)
|
||||
{
|
||||
return (a > b ? a - b : 0);
|
||||
};
|
||||
|
||||
if (0 == it) //top
|
||||
{
|
||||
auto px = static_cast<int>(margins_[it].get_value(static_cast<int>(field_area.height)));
|
||||
r.y += px;
|
||||
r.height = calc(r.height, static_cast<px_type>(px));
|
||||
}
|
||||
|
||||
if (-1 != ib) //bottom
|
||||
{
|
||||
auto px = static_cast<int>(margins_[ib].get_value(static_cast<int>(field_area.height)));
|
||||
r.height = calc(r.height, static_cast<px_type>(px));
|
||||
}
|
||||
|
||||
if (-1 != il) //left
|
||||
{
|
||||
auto px = static_cast<px_type>(margins_[il].get_value(static_cast<int>(field_area.width)));
|
||||
r.x += px;
|
||||
r.width = calc(r.width, static_cast<px_type>(px));
|
||||
}
|
||||
|
||||
if (-1 != ir) //right
|
||||
{
|
||||
auto px = static_cast<int>(margins_[ir].get_value(static_cast<int>(field_area.width)));
|
||||
r.width = calc(r.width, static_cast<px_type>(px));
|
||||
}
|
||||
}
|
||||
return r;
|
||||
}
|
||||
private:
|
||||
bool all_edges_ = true;
|
||||
std::vector<number_t> margins_;
|
||||
};//end class margin
|
||||
|
||||
class repeated_array
|
||||
{
|
||||
public:
|
||||
|
||||
//A workaround for VC2013, becuase it does not generated an implicit declared move-constructor as defaulted.
|
||||
repeated_array() = default;
|
||||
|
||||
repeated_array(repeated_array && other)
|
||||
: repeated_{ other.repeated_ },
|
||||
values_(std::move(other.values_))
|
||||
{
|
||||
}
|
||||
|
||||
repeated_array& operator=(repeated_array&& other)
|
||||
{
|
||||
if (this != &other)
|
||||
{
|
||||
repeated_ = other.repeated_;
|
||||
other.repeated_ = false;
|
||||
values_ = std::move(other.values_);
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
void assign(std::vector<number_t>&& c)
|
||||
{
|
||||
values_ = std::move(c);
|
||||
}
|
||||
|
||||
bool empty() const
|
||||
{
|
||||
return values_.empty();
|
||||
}
|
||||
|
||||
void reset()
|
||||
{
|
||||
repeated_ = false;
|
||||
values_.clear();
|
||||
}
|
||||
|
||||
void repeated()
|
||||
{
|
||||
repeated_ = true;
|
||||
}
|
||||
|
||||
void push(const number_t& n)
|
||||
{
|
||||
values_.emplace_back(n);
|
||||
}
|
||||
|
||||
number_t at(std::size_t pos) const
|
||||
{
|
||||
if (values_.empty())
|
||||
return{};
|
||||
|
||||
if (repeated_)
|
||||
pos %= values_.size();
|
||||
else if (pos >= values_.size())
|
||||
return{};
|
||||
|
||||
return values_[pos];
|
||||
}
|
||||
private:
|
||||
bool repeated_ = false;
|
||||
std::vector<number_t> values_;
|
||||
};
|
||||
}//end namespace place_parts
|
||||
}//end namespace nana
|
||||
|
||||
#endif //NANA_GUI_PLACE_PARTS_HPP
|
File diff suppressed because it is too large
Load Diff
@ -12,6 +12,7 @@
|
||||
#include <nana/gui/state_cursor.hpp>
|
||||
#include <nana/gui/detail/bedrock.hpp>
|
||||
#include <nana/gui/detail/basic_window.hpp>
|
||||
#include <nana/gui/detail/window_manager.hpp>
|
||||
|
||||
namespace nana
|
||||
{
|
||||
@ -20,7 +21,7 @@ namespace nana
|
||||
{
|
||||
auto & brock = detail::bedrock::instance();
|
||||
auto wd = reinterpret_cast<detail::basic_window*>(handle);
|
||||
if (brock.wd_manager.available(wd))
|
||||
if (brock.wd_manager().available(wd))
|
||||
brock.define_state_cursor(wd, cur, nullptr);
|
||||
else
|
||||
handle_ = nullptr;
|
||||
@ -40,7 +41,7 @@ namespace nana
|
||||
{
|
||||
auto & brock = detail::bedrock::instance();
|
||||
auto wd = reinterpret_cast<detail::basic_window*>(handle_);
|
||||
if (brock.wd_manager.available(wd))
|
||||
if (brock.wd_manager().available(wd))
|
||||
brock.undefine_state_cursor(wd, nullptr);
|
||||
}
|
||||
handle_ = rhs.handle_;
|
||||
@ -55,7 +56,7 @@ namespace nana
|
||||
{
|
||||
auto & brock = detail::bedrock::instance();
|
||||
auto wd = reinterpret_cast<detail::basic_window*>(handle_);
|
||||
if (brock.wd_manager.available(wd))
|
||||
if (brock.wd_manager().available(wd))
|
||||
brock.undefine_state_cursor(wd, nullptr);
|
||||
}
|
||||
}
|
||||
|
@ -27,7 +27,7 @@
|
||||
#if defined(NANA_WINDOWS)
|
||||
#include <windows.h>
|
||||
#elif defined(NANA_LINUX)
|
||||
#include PLATFORM_SPEC_HPP
|
||||
#include <nana/detail/platform_spec_selector.hpp>
|
||||
#include <nana/system/platform.hpp>
|
||||
#endif
|
||||
|
||||
|
@ -147,7 +147,6 @@ namespace nana
|
||||
timer_.reset();
|
||||
this->close();
|
||||
}
|
||||
|
||||
private:
|
||||
timer timer_;
|
||||
nana::label label_;
|
||||
@ -256,25 +255,6 @@ namespace nana
|
||||
instance(true);
|
||||
}
|
||||
private:
|
||||
void _m_enter(const arg_mouse& arg)
|
||||
{
|
||||
pair_t & pr = _m_get(arg.window_handle);
|
||||
if(pr.second.size())
|
||||
{
|
||||
this->show(pr.second);
|
||||
}
|
||||
}
|
||||
|
||||
void _m_leave(const arg_mouse&)
|
||||
{
|
||||
close();
|
||||
}
|
||||
|
||||
void _m_destroy(const arg_destroy& arg)
|
||||
{
|
||||
_m_untip(arg.window_handle);
|
||||
}
|
||||
|
||||
void _m_untip(window wd)
|
||||
{
|
||||
for (auto i = cont_.begin(); i != cont_.end(); ++i)
|
||||
@ -303,15 +283,19 @@ namespace nana
|
||||
|
||||
auto & events = API::events(wd);
|
||||
events.mouse_enter.connect([this](const arg_mouse& arg){
|
||||
_m_enter(arg);
|
||||
auto & pr = _m_get(arg.window_handle);
|
||||
if (pr.second.size())
|
||||
this->show(pr.second);
|
||||
});
|
||||
|
||||
auto leave_fn = std::bind(&controller::_m_leave, this, std::placeholders::_1);
|
||||
auto leave_fn = [this]{
|
||||
this->close();
|
||||
};
|
||||
events.mouse_leave.connect(leave_fn);
|
||||
events.mouse_down.connect(leave_fn);
|
||||
|
||||
events.destroy.connect([this](const arg_destroy& arg){
|
||||
_m_destroy(arg);
|
||||
_m_untip(arg.window_handle);
|
||||
});
|
||||
|
||||
cont_.emplace_back(wd, nana::string());
|
||||
|
@ -14,7 +14,6 @@
|
||||
#include <nana/gui/widgets/categorize.hpp>
|
||||
#include <nana/gui/widgets/float_listbox.hpp>
|
||||
#include <nana/gui/element.hpp>
|
||||
#include <nana/paint/gadget.hpp>
|
||||
#include <nana/gui/widgets/detail/tree_cont.hpp>
|
||||
#include <stdexcept>
|
||||
|
||||
|
@ -11,7 +11,6 @@
|
||||
*/
|
||||
|
||||
#include <nana/gui/widgets/checkbox.hpp>
|
||||
#include <nana/paint/gadget.hpp>
|
||||
#include <nana/paint/text_renderer.hpp>
|
||||
#include <nana/gui/element.hpp>
|
||||
#include <algorithm>
|
||||
@ -214,39 +213,41 @@ namespace checkbox
|
||||
element_tag el;
|
||||
|
||||
el.uiobj = &uiobj;
|
||||
el.eh_checked = uiobj.events().click.connect_unignorable(std::bind(&radio_group::_m_checked, this, std::placeholders::_1), true);
|
||||
el.eh_destroy = uiobj.events().destroy.connect_unignorable(std::bind(&radio_group::_m_destroy, this, std::placeholders::_1));
|
||||
el.eh_checked = uiobj.events().click.connect_unignorable([this](const arg_click& arg)
|
||||
{
|
||||
for (auto & i : ui_container_)
|
||||
i.uiobj->check(arg.window_handle == i.uiobj->handle());
|
||||
}, true);
|
||||
|
||||
el.eh_destroy = uiobj.events().destroy.connect_unignorable([this](const arg_destroy& arg)
|
||||
{
|
||||
for (auto i = ui_container_.begin(); i != ui_container_.end(); ++i)
|
||||
{
|
||||
if (arg.window_handle == i->uiobj->handle())
|
||||
{
|
||||
ui_container_.erase(i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
ui_container_.push_back(el);
|
||||
}
|
||||
|
||||
std::size_t radio_group::checked() const
|
||||
{
|
||||
auto i = std::find_if(ui_container_.cbegin(), ui_container_.cend(), [](decltype(*ui_container_.cbegin())& x)
|
||||
{
|
||||
return (x.uiobj->checked());
|
||||
});
|
||||
return static_cast<std::size_t>(i - ui_container_.cbegin());
|
||||
for (auto i = ui_container_.cbegin(); i != ui_container_.cend(); ++i)
|
||||
{
|
||||
if (i->uiobj->checked())
|
||||
return static_cast<std::size_t>(i - ui_container_.cbegin());
|
||||
}
|
||||
|
||||
return ui_container_.size();
|
||||
}
|
||||
|
||||
std::size_t radio_group::size() const
|
||||
{
|
||||
return ui_container_.size();
|
||||
}
|
||||
|
||||
void radio_group::_m_checked(const arg_click& arg)
|
||||
{
|
||||
for (auto & i : ui_container_)
|
||||
i.uiobj->check(arg.window_handle == i.uiobj->handle());
|
||||
}
|
||||
|
||||
void radio_group::_m_destroy(const arg_destroy& arg)
|
||||
{
|
||||
auto i = std::find_if(ui_container_.begin(), ui_container_.end(), [&arg](decltype(*ui_container_.begin()) & x)
|
||||
{
|
||||
return (arg.window_handle == x.uiobj->handle());
|
||||
});
|
||||
if(i != ui_container_.end())
|
||||
ui_container_.erase(i);
|
||||
}
|
||||
//end class radio_group
|
||||
}//end namespace nana
|
||||
|
@ -172,10 +172,25 @@ namespace nana
|
||||
{
|
||||
editor_->editable(enb);
|
||||
|
||||
if(enb)
|
||||
editor_->ext_renderer().background = nullptr;
|
||||
if (!enb)
|
||||
{
|
||||
editor_->ext_renderer().background = [this](graph_reference graph, const ::nana::rectangle&, const ::nana::color&)
|
||||
{
|
||||
auto clr_from = colors::button_face_shadow_start;
|
||||
auto clr_to = colors::button_face_shadow_end;
|
||||
|
||||
int pare_off_px = 1;
|
||||
if (element_state::pressed == state_.button_state)
|
||||
{
|
||||
pare_off_px = 2;
|
||||
std::swap(clr_from, clr_to);
|
||||
}
|
||||
|
||||
graph.gradual_rectangle(::nana::rectangle(graph.size()).pare_off(pare_off_px), clr_from, clr_to, true);
|
||||
};
|
||||
}
|
||||
else
|
||||
editor_->ext_renderer().background = std::bind(&drawer_impl::_m_draw_background, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
|
||||
editor_->ext_renderer().background = nullptr;
|
||||
|
||||
editor_->enable_background(enb);
|
||||
editor_->enable_background_counterpart(!enb);
|
||||
@ -434,21 +449,6 @@ namespace nana
|
||||
}
|
||||
}
|
||||
|
||||
void _m_draw_background(graph_reference graph, const rectangle&, const ::nana::color&)
|
||||
{
|
||||
auto clr_from = colors::button_face_shadow_start;
|
||||
auto clr_to = colors::button_face_shadow_end;
|
||||
|
||||
int pare_off_px = 1;
|
||||
if (element_state::pressed == state_.button_state)
|
||||
{
|
||||
pare_off_px = 2;
|
||||
std::swap(clr_from, clr_to);
|
||||
}
|
||||
|
||||
graph.gradual_rectangle(::nana::rectangle(graph.size()).pare_off(pare_off_px), clr_from, clr_to, true);
|
||||
}
|
||||
|
||||
void _m_draw_push_button(bool enabled)
|
||||
{
|
||||
::nana::rectangle r{graph_->size()};
|
||||
@ -622,7 +622,7 @@ namespace nana
|
||||
if(drawer_->widget_ptr()->enabled())
|
||||
{
|
||||
auto * editor = drawer_->editor();
|
||||
if(false == editor->mouse_down(arg.button, arg.pos))
|
||||
if (!editor->mouse_pressed(arg))
|
||||
drawer_->open_lister_if_push_button_positioned();
|
||||
|
||||
drawer_->draw();
|
||||
@ -637,7 +637,7 @@ namespace nana
|
||||
{
|
||||
if (drawer_->widget_ptr()->enabled() && !drawer_->has_lister())
|
||||
{
|
||||
drawer_->editor()->mouse_up(arg.button, arg.pos);
|
||||
drawer_->editor()->mouse_pressed(arg);
|
||||
drawer_->set_button_state(element_state::hovered, false);
|
||||
drawer_->draw();
|
||||
API::lazy_refresh();
|
||||
|
@ -12,7 +12,6 @@
|
||||
|
||||
#include <nana/gui/widgets/date_chooser.hpp>
|
||||
#include <nana/gui/element.hpp>
|
||||
#include <nana/paint/gadget.hpp>
|
||||
#include <nana/system/platform.hpp>
|
||||
#include <sstream>
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -12,7 +12,6 @@
|
||||
|
||||
#include <nana/gui/widgets/menu.hpp>
|
||||
#include <nana/system/platform.hpp>
|
||||
#include <nana/paint/gadget.hpp>
|
||||
#include <nana/gui/element.hpp>
|
||||
#include <nana/gui/wvl.hpp>
|
||||
#include <nana/paint/text_renderer.hpp>
|
||||
|
@ -578,66 +578,6 @@ namespace nana
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
void trigger::_m_draw()
|
||||
{
|
||||
auto bgcolor = API::bgcolor(*widget_);
|
||||
graph_->rectangle(true, bgcolor);
|
||||
|
||||
item_renderer ird(*widget_, *graph_);
|
||||
|
||||
nana::point item_pos(2, 2);
|
||||
nana::size item_s(0, 23);
|
||||
|
||||
unsigned long index = 0;
|
||||
for(auto i : items_->cont())
|
||||
{
|
||||
//Transform the text if it contains the hotkey character
|
||||
::nana::char_t hotkey;
|
||||
::nana::string::size_type hotkey_pos;
|
||||
auto text = API::transform_shortkey_text(i->text, hotkey, &hotkey_pos);
|
||||
|
||||
nana::size text_s = graph_->text_extent_size(text);
|
||||
|
||||
item_s.width = text_s.width + 16;
|
||||
|
||||
i->pos = item_pos;
|
||||
i->size = item_s;
|
||||
|
||||
using state = item_renderer::state;
|
||||
state item_state = (index != state_.active ? state::normal : (state_.menu_active ? state::selected : state::highlighted));
|
||||
ird.background(item_pos, item_s, item_state);
|
||||
|
||||
if (state::selected == item_state)
|
||||
{
|
||||
int x = item_pos.x + item_s.width;
|
||||
int y1 = item_pos.y + 2, y2 = item_pos.y + item_s.height - 1;
|
||||
graph_->line({ x, y1 }, { x, y2 }, bgcolor.blend(colors::gray_border, 0.4));
|
||||
graph_->line({ x + 1, y1 }, { x + 1, y2 }, bgcolor.blend(colors::button_face_shadow_end, 0.5));
|
||||
}
|
||||
|
||||
//Draw text, the text is transformed from orignal for hotkey character
|
||||
int text_top_off = (item_s.height - text_s.height) / 2;
|
||||
ird.caption({ item_pos.x + 8, item_pos.y + text_top_off }, text);
|
||||
|
||||
if(hotkey)
|
||||
{
|
||||
unsigned off_w = (hotkey_pos ? graph_->text_extent_size(text, static_cast<unsigned>(hotkey_pos)).width : 0);
|
||||
nana::size hotkey_size = graph_->text_extent_size(text.c_str() + hotkey_pos, 1);
|
||||
|
||||
unsigned ascent, descent, inleading;
|
||||
graph_->text_metrics(ascent, descent, inleading);
|
||||
int x = item_pos.x + 8 + off_w;
|
||||
int y = item_pos.y + text_top_off + ascent + 1;
|
||||
graph_->line({ x, y }, { x + static_cast<int>(hotkey_size.width) - 1, y }, ::nana::colors::black);
|
||||
}
|
||||
|
||||
item_pos.x += i->size.width;
|
||||
++index;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
//struct state_type
|
||||
trigger::state_type::state_type()
|
||||
: active(npos),
|
||||
|
@ -90,7 +90,11 @@ namespace nana
|
||||
|
||||
metrics_.scroll_pos = pos;
|
||||
auto value_max = metrics_.peak - metrics_.range;
|
||||
metrics_.value = pos * value_max / scroll_area;
|
||||
|
||||
//Check scroll_area to avoiding division by zero.
|
||||
if (scroll_area)
|
||||
metrics_.value = pos * value_max / scroll_area;
|
||||
|
||||
if(metrics_.value < value_max)
|
||||
{
|
||||
int selfpos = static_cast<int>(metrics_.value * scroll_area / value_max);
|
||||
|
@ -217,13 +217,13 @@ namespace nana{ namespace widgets
|
||||
editor_.select_.a = sel_a_;
|
||||
editor_.select_.b = sel_b_;
|
||||
editor_.points_.caret = pos_;
|
||||
editor_._m_move_select(false);
|
||||
return;
|
||||
}
|
||||
|
||||
editor_.select_.a = dest_a_;
|
||||
editor_.select_.b = dest_b_;
|
||||
editor_.points_.caret = sel_a_;
|
||||
else
|
||||
{
|
||||
editor_.select_.a = dest_a_;
|
||||
editor_.select_.b = dest_b_;
|
||||
editor_.points_.caret = sel_a_;
|
||||
}
|
||||
editor_._m_move_select(false);
|
||||
}
|
||||
|
||||
@ -252,13 +252,18 @@ namespace nana{ namespace widgets
|
||||
virtual std::size_t take_lines(std::size_t pos) const = 0;
|
||||
|
||||
virtual void update_line(std::size_t textline, std::size_t secondary_before) = 0;
|
||||
virtual void render(const ::nana::color& fgcolor) = 0;
|
||||
virtual std::vector<::nana::upoint> render(const ::nana::color& fgcolor) = 0;
|
||||
virtual nana::point caret_to_screen(upoint) = 0;
|
||||
virtual nana::upoint screen_to_caret(point scrpos) = 0;
|
||||
virtual bool move_caret_ns(bool to_north) = 0;
|
||||
virtual bool adjust_caret_into_screen() = 0;
|
||||
};
|
||||
|
||||
inline bool is_right_text(const unicode_bidi::entity& e)
|
||||
{
|
||||
return ((e.bidi_char_type != unicode_bidi::bidi_char::L) && (e.level & 1));
|
||||
}
|
||||
|
||||
|
||||
class text_editor::behavior_normal
|
||||
: public editor_behavior_interface
|
||||
@ -290,8 +295,10 @@ namespace nana{ namespace widgets
|
||||
editor_._m_draw_string(top, API::fgcolor(editor_.window_), nana::upoint(0, editor_.points_.caret.y), editor_.textbase_.getline(textline), true);
|
||||
}
|
||||
|
||||
void render(const ::nana::color& fgcolor) override
|
||||
std::vector<upoint> render(const ::nana::color& fgcolor) override
|
||||
{
|
||||
std::vector<upoint> line_index;
|
||||
|
||||
::nana::upoint str_pos(0, static_cast<unsigned>(editor_.points_.offset.y));
|
||||
|
||||
std::size_t scrlines = editor_.screen_lines() + str_pos.y;
|
||||
@ -304,9 +311,12 @@ namespace nana{ namespace widgets
|
||||
while( str_pos.y < scrlines)
|
||||
{
|
||||
editor_._m_draw_string(top, fgcolor, str_pos, editor_.textbase_.getline(str_pos.y), true);
|
||||
line_index.push_back(str_pos);
|
||||
++str_pos.y;
|
||||
top += pixels;
|
||||
}
|
||||
|
||||
return line_index;
|
||||
}
|
||||
|
||||
nana::point caret_to_screen(nana::upoint pos) override
|
||||
@ -357,7 +367,7 @@ namespace nana{ namespace widgets
|
||||
{
|
||||
std::unique_ptr<unsigned[]> pxbuf(new unsigned[len]);
|
||||
|
||||
res.x = editor_._m_char_by_pixels(ent.begin, len, pxbuf.get(), str_px, scrpos.x, _m_is_right_text(ent));
|
||||
res.x = editor_._m_char_by_pixels(ent.begin, len, pxbuf.get(), str_px, scrpos.x, is_right_text(ent));
|
||||
res.x += static_cast<unsigned>(ent.begin - lnstr.data());
|
||||
return res;
|
||||
}
|
||||
@ -420,19 +430,21 @@ namespace nana{ namespace widgets
|
||||
|
||||
editor_._m_get_scrollbar_size();
|
||||
|
||||
const auto delta_pixels = editor_._m_text_extent_size(STR(" "), 4).width;
|
||||
auto x = points.caret.x;
|
||||
const string_type& lnstr = textbase.getline(points.caret.y);
|
||||
auto x = points.caret.x;
|
||||
auto& lnstr = textbase.getline(points.caret.y);
|
||||
|
||||
if (x > lnstr.size()) x = static_cast<unsigned>(lnstr.size());
|
||||
|
||||
unsigned text_w = editor_._m_pixels_by_char(lnstr, x);
|
||||
auto const text_w = editor_._m_pixels_by_char(lnstr, x);
|
||||
|
||||
unsigned area_w = editor_._m_text_area().width;
|
||||
|
||||
bool adjusted_cond = true;
|
||||
if (static_cast<int>(text_w) < points.offset.x)
|
||||
{
|
||||
auto delta_pixels = editor_._m_text_extent_size(STR(" "), 4).width;
|
||||
points.offset.x = (text_w > delta_pixels ? text_w - delta_pixels : 0);
|
||||
}
|
||||
else if (area_w && (text_w >= points.offset.x + area_w))
|
||||
points.offset.x = text_w - area_w + 2;
|
||||
else
|
||||
@ -692,12 +704,14 @@ namespace nana{ namespace widgets
|
||||
editor_.render(API::is_focus_ready(editor_.window_));
|
||||
}
|
||||
|
||||
void render(const ::nana::color& fgcolor) override
|
||||
std::vector<upoint> render(const ::nana::color& fgcolor) override
|
||||
{
|
||||
std::vector<upoint> line_index;
|
||||
|
||||
std::size_t secondary;
|
||||
auto primary = _m_textline_from_screen(0, secondary);
|
||||
if (primary >= linemtr_.size() || secondary >= linemtr_[primary].line_sections.size())
|
||||
return;
|
||||
return line_index;
|
||||
|
||||
nana::upoint str_pos(0, static_cast<unsigned>(primary));
|
||||
str_pos.x = static_cast<unsigned>(linemtr_[primary].line_sections[secondary].begin - editor_.textbase_.getline(primary).data());
|
||||
@ -715,6 +729,7 @@ namespace nana{ namespace widgets
|
||||
|
||||
nana::string text(section.begin, section.end);
|
||||
editor_._m_draw_string(top, fgcolor, str_pos, text, true);
|
||||
line_index.push_back(str_pos);
|
||||
++secondary;
|
||||
if (secondary >= mtr.line_sections.size())
|
||||
{
|
||||
@ -729,6 +744,8 @@ namespace nana{ namespace widgets
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
return line_index;
|
||||
}
|
||||
|
||||
nana::point caret_to_screen(upoint pos) override
|
||||
@ -818,7 +835,7 @@ namespace nana{ namespace widgets
|
||||
{
|
||||
std::unique_ptr<unsigned[]> pxbuf(new unsigned[len]);
|
||||
|
||||
res.x += editor_._m_char_by_pixels(ent.begin, len, pxbuf.get(), str_px, scrpos.x, _m_is_right_text(ent));
|
||||
res.x += editor_._m_char_by_pixels(ent.begin, len, pxbuf.get(), str_px, scrpos.x, is_right_text(ent));
|
||||
res.x += static_cast<unsigned>(ent.begin - str);
|
||||
return res;
|
||||
}
|
||||
@ -1222,12 +1239,11 @@ namespace nana{ namespace widgets
|
||||
auto ki = kwptr->schemes.find(ds.scheme);
|
||||
if (ki != kwptr->schemes.end() && ki->second)
|
||||
{
|
||||
schemes_.emplace(ds.scheme, ki->second);
|
||||
entities.emplace_back();
|
||||
auto & last = entities.back();
|
||||
last.begin = text.data() + pos;
|
||||
last.end = last.begin + ds.text.size();
|
||||
last.scheme = ki->second.get();
|
||||
entities.emplace_back();
|
||||
auto & last = entities.back();
|
||||
last.begin = text.data() + pos;
|
||||
last.end = last.begin + ds.text.size();
|
||||
last.scheme = ki->second.get();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1259,7 +1275,6 @@ namespace nana{ namespace widgets
|
||||
}
|
||||
private:
|
||||
std::vector<entity> entities_;
|
||||
std::map<std::string, std::shared_ptr<keyword_scheme>> schemes_;
|
||||
};
|
||||
|
||||
//class text_editor
|
||||
@ -1331,12 +1346,12 @@ namespace nana{ namespace widgets
|
||||
|
||||
void text_editor::erase_keyword(const ::nana::string& kw)
|
||||
{
|
||||
auto i = std::find_if(keywords_->kwbase.begin(), keywords_->kwbase.end(), [&kw](keyword_desc& kd){
|
||||
return (kd.text == kw);
|
||||
});
|
||||
|
||||
if (i != keywords_->kwbase.end())
|
||||
keywords_->kwbase.erase(i);
|
||||
for (auto i = keywords_->kwbase.begin(); i != keywords_->kwbase.end(); ++i)
|
||||
if (i->text == kw)
|
||||
{
|
||||
keywords_->kwbase.erase(i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void text_editor::set_accept(std::function<bool(char_type)> pred)
|
||||
@ -1438,6 +1453,17 @@ namespace nana{ namespace widgets
|
||||
behavior_->pre_calc_lines(width_pixels());
|
||||
}
|
||||
|
||||
void text_editor::indent(bool enb, std::function<nana::string()> generator)
|
||||
{
|
||||
indent_.enabled = enb;
|
||||
indent_.generator.swap(generator);
|
||||
}
|
||||
|
||||
void text_editor::set_event(event_interface* ptr)
|
||||
{
|
||||
event_handler_ = ptr;
|
||||
}
|
||||
|
||||
bool text_editor::line_wrapped() const
|
||||
{
|
||||
return attributes_.line_wrapped;
|
||||
@ -1502,6 +1528,18 @@ namespace nana{ namespace widgets
|
||||
return true;
|
||||
}
|
||||
|
||||
rectangle text_editor::text_area(bool including_scroll) const
|
||||
{
|
||||
if (including_scroll)
|
||||
return text_area_.area;
|
||||
|
||||
auto r = text_area_.area;
|
||||
|
||||
r.width = text_area_.area.width > text_area_.vscroll ? text_area_.area.width - text_area_.vscroll : 0;
|
||||
r.height = text_area_.area.height > text_area_.hscroll ? text_area_.area.height - text_area_.hscroll : 0;
|
||||
return r;
|
||||
}
|
||||
|
||||
bool text_editor::tip_string(nana::string&& str)
|
||||
{
|
||||
if(attributes_.tip_string == str)
|
||||
@ -1608,30 +1646,6 @@ namespace nana{ namespace widgets
|
||||
return true;
|
||||
}
|
||||
|
||||
bool text_editor::mouse_down(::nana::mouse button, const point& scrpos)
|
||||
{
|
||||
if (!hit_text_area(scrpos))
|
||||
return false;
|
||||
|
||||
if(::nana::mouse::left_button == button)
|
||||
{
|
||||
API::capture_window(window_, true);
|
||||
text_area_.captured = true;
|
||||
|
||||
//Set caret pos by screen point and get the caret pos.
|
||||
mouse_caret(scrpos);
|
||||
if(!select(false))
|
||||
{
|
||||
select_.a = points_.caret; //Set begin caret
|
||||
set_end_caret();
|
||||
}
|
||||
select_.mode_selection = selection::mode_mouse_selected;
|
||||
}
|
||||
|
||||
text_area_.border_renderer(graph_, _m_bgcolor());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool text_editor::mouse_move(bool left_button, const point& scrpos)
|
||||
{
|
||||
cursor cur = cursor::iterm;
|
||||
@ -1656,31 +1670,70 @@ namespace nana{ namespace widgets
|
||||
return false;
|
||||
}
|
||||
|
||||
bool text_editor::mouse_up(::nana::mouse button, const point& scrpos)
|
||||
bool text_editor::mouse_pressed(const arg_mouse& arg)
|
||||
{
|
||||
auto is_prev_no_selected = (select_.mode_selection == selection::mode_no_selected);
|
||||
|
||||
if(select_.mode_selection == selection::mode_mouse_selected)
|
||||
if (event_code::mouse_down == arg.evt_code)
|
||||
{
|
||||
select_.mode_selection = selection::mode_no_selected;
|
||||
set_end_caret();
|
||||
if (!hit_text_area(arg.pos))
|
||||
return false;
|
||||
|
||||
if (::nana::mouse::left_button == arg.button)
|
||||
{
|
||||
API::capture_window(window_, true);
|
||||
text_area_.captured = true;
|
||||
|
||||
//Set caret pos by screen point and get the caret pos.
|
||||
mouse_caret(arg.pos);
|
||||
if (arg.shift)
|
||||
{
|
||||
if (points_.shift_begin_caret != points_.caret)
|
||||
{
|
||||
select_.a = points_.shift_begin_caret;
|
||||
select_.b = points_.caret;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!select(false))
|
||||
{
|
||||
select_.a = points_.caret; //Set begin caret
|
||||
set_end_caret();
|
||||
}
|
||||
points_.shift_begin_caret = points_.caret;
|
||||
}
|
||||
select_.mode_selection = selection::mode_mouse_selected;
|
||||
}
|
||||
|
||||
text_area_.border_renderer(graph_, _m_bgcolor());
|
||||
return true;
|
||||
}
|
||||
else if (is_prev_no_selected)
|
||||
else if (event_code::mouse_up == arg.evt_code)
|
||||
{
|
||||
if((!select_.dragged) || (!move_select()))
|
||||
select(false);
|
||||
auto is_prev_no_selected = (select_.mode_selection == selection::mode_no_selected);
|
||||
|
||||
if (select_.mode_selection == selection::mode_mouse_selected)
|
||||
{
|
||||
select_.mode_selection = selection::mode_no_selected;
|
||||
set_end_caret();
|
||||
}
|
||||
else if (is_prev_no_selected)
|
||||
{
|
||||
if ((!select_.dragged) || (!move_select()))
|
||||
select(false);
|
||||
}
|
||||
select_.dragged = false;
|
||||
|
||||
API::capture_window(window_, false);
|
||||
text_area_.captured = false;
|
||||
if (hit_text_area(arg.pos) == false)
|
||||
API::window_cursor(window_, nana::cursor::arrow);
|
||||
|
||||
text_area_.border_renderer(graph_, _m_bgcolor());
|
||||
|
||||
//Redraw if is_prev_no_selected is true
|
||||
return is_prev_no_selected;
|
||||
}
|
||||
select_.dragged = false;
|
||||
|
||||
API::capture_window(window_, false);
|
||||
text_area_.captured = false;
|
||||
if (hit_text_area(scrpos) == false)
|
||||
API::window_cursor(window_, nana::cursor::arrow);
|
||||
|
||||
text_area_.border_renderer(graph_, _m_bgcolor());
|
||||
|
||||
//Redraw if is_prev_no_selected is true
|
||||
return is_prev_no_selected;
|
||||
return false;
|
||||
}
|
||||
|
||||
textbase<nana::char_t> & text_editor::textbase()
|
||||
@ -1734,16 +1787,16 @@ namespace nana{ namespace widgets
|
||||
|
||||
const unsigned line_pixels = line_height();
|
||||
auto pos = this->behavior_->caret_to_screen(crtpos);
|
||||
const int end_y = pos.y + static_cast<int>(line_pixels);
|
||||
const int line_bottom = pos.y + static_cast<int>(line_pixels);
|
||||
|
||||
bool visible = false;
|
||||
if (hit_text_area(pos) && (end_y > text_area_.area.y))
|
||||
if (hit_text_area(pos) && (line_bottom > text_area_.area.y))
|
||||
{
|
||||
visible = true;
|
||||
if (end_y > _m_endy())
|
||||
API::caret_size(window_, nana::size(1, line_pixels - (end_y - _m_endy())));
|
||||
if (line_bottom > _m_end_pos(false))
|
||||
API::caret_size(window_, nana::size(1, line_pixels - (line_bottom - _m_end_pos(false))));
|
||||
else if (API::caret_size(window_).height != line_pixels)
|
||||
reset_caret_height();
|
||||
reset_caret_pixels();
|
||||
}
|
||||
|
||||
API::caret_visible(window_, visible);
|
||||
@ -1759,7 +1812,7 @@ namespace nana{ namespace widgets
|
||||
points_.caret.x = static_cast<unsigned>(textbase_.getline(points_.caret.y).size());
|
||||
}
|
||||
|
||||
void text_editor::reset_caret_height() const
|
||||
void text_editor::reset_caret_pixels() const
|
||||
{
|
||||
API::caret_size(window_, nana::size(1, line_height()));
|
||||
}
|
||||
@ -1814,7 +1867,7 @@ namespace nana{ namespace widgets
|
||||
|
||||
bool text_editor::hit_text_area(const point& pos) const
|
||||
{
|
||||
return ((text_area_.area.x <= pos.x && pos.x < _m_endx()) && (text_area_.area.y <= pos.y && pos.y < _m_endy()));
|
||||
return ((text_area_.area.x <= pos.x && pos.x < _m_end_pos(true)) && (text_area_.area.y <= pos.y && pos.y < _m_end_pos(false)));
|
||||
}
|
||||
|
||||
bool text_editor::hit_select_area(nana::upoint pos) const
|
||||
@ -1875,7 +1928,12 @@ namespace nana{ namespace widgets
|
||||
return window_;
|
||||
}
|
||||
|
||||
void text_editor::draw_scroll_rectangle()
|
||||
const std::vector<upoint>& text_editor::text_position() const
|
||||
{
|
||||
return text_position_;
|
||||
}
|
||||
|
||||
void text_editor::draw_corner()
|
||||
{
|
||||
if(text_area_.vscroll && text_area_.hscroll)
|
||||
{
|
||||
@ -1908,11 +1966,27 @@ namespace nana{ namespace widgets
|
||||
//Render the content when the text isn't empty or the window has got focus,
|
||||
//otherwise draw the tip string.
|
||||
if ((false == textbase_.empty()) || has_focus)
|
||||
behavior_->render(fgcolor);
|
||||
else //Draw tip string
|
||||
graph_.string({ text_area_.area.x - points_.offset.x, text_area_.area.y }, attributes_.tip_string, { 0x78, 0x78, 0x78 });
|
||||
{
|
||||
auto && text_pos = behavior_->render(fgcolor);
|
||||
|
||||
|
||||
draw_scroll_rectangle();
|
||||
if (text_pos.empty())
|
||||
text_pos.push_back({ 0, 0 });
|
||||
|
||||
if (text_pos != text_position_)
|
||||
{
|
||||
text_position_.swap(text_pos);
|
||||
if (event_handler_)
|
||||
event_handler_->text_exposed(text_position_);
|
||||
}
|
||||
}
|
||||
else //Draw tip string
|
||||
graph_.string({ text_area_.area.x - points_.offset.x, text_area_.area.y }, attributes_.tip_string, static_cast<color_rgb>(0x787878));
|
||||
|
||||
if (text_position_.empty())
|
||||
text_position_.push_back({ 0, 0 });
|
||||
|
||||
draw_corner();
|
||||
|
||||
text_area_.border_renderer(graph_, bgcolor);
|
||||
}
|
||||
@ -1963,7 +2037,7 @@ namespace nana{ namespace widgets
|
||||
if (refresh || _m_update_caret_line(secondary_before))
|
||||
render(true);
|
||||
else
|
||||
draw_scroll_rectangle();
|
||||
draw_corner();
|
||||
|
||||
_m_scrollbar();
|
||||
|
||||
@ -2051,6 +2125,29 @@ namespace nana{ namespace widgets
|
||||
need_refresh = true;
|
||||
}
|
||||
|
||||
if (indent_.enabled)
|
||||
{
|
||||
nana::string indent_text;
|
||||
if (indent_.generator)
|
||||
{
|
||||
indent_text = indent_.generator();
|
||||
}
|
||||
else
|
||||
{
|
||||
auto & text = textbase_.getline(points_.caret.y - 1);
|
||||
auto indent_pos = text.find_first_not_of(L"\t ");
|
||||
if (indent_pos != std::wstring::npos)
|
||||
indent_text = text.substr(0, indent_pos);
|
||||
else
|
||||
indent_text = text;
|
||||
}
|
||||
|
||||
if (indent_text.size())
|
||||
put(indent_text);
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (behavior_->adjust_caret_into_screen() || need_refresh)
|
||||
render(true);
|
||||
|
||||
@ -2110,7 +2207,7 @@ namespace nana{ namespace widgets
|
||||
if(_m_move_offset_x_while_over_border(-2) == false)
|
||||
{
|
||||
behavior_->update_line(points_.caret.y, secondary);
|
||||
draw_scroll_rectangle();
|
||||
draw_corner();
|
||||
has_to_redraw = false;
|
||||
}
|
||||
}
|
||||
@ -2250,7 +2347,7 @@ namespace nana{ namespace widgets
|
||||
break;
|
||||
case keyboard::os_end:
|
||||
if (caret.y != nlines - 1) {
|
||||
caret.y = nlines - 1;
|
||||
caret.y = static_cast<decltype(caret.y)>(nlines - 1);
|
||||
changed = true;
|
||||
}
|
||||
break;
|
||||
@ -2265,7 +2362,7 @@ namespace nana{ namespace widgets
|
||||
}else {
|
||||
if (caret.y != 0) {
|
||||
--caret.y;
|
||||
caret.x = textbase_.getline(caret.y).size();
|
||||
caret.x = static_cast<decltype(caret.x)>(textbase_.getline(caret.y).size());
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
@ -2309,7 +2406,7 @@ namespace nana{ namespace widgets
|
||||
break;
|
||||
case keyboard::os_end:
|
||||
if (caret.x < lnsz) {
|
||||
caret.x = lnsz;
|
||||
caret.x = static_cast<decltype(caret.x)>(lnsz);
|
||||
changed = true;
|
||||
}
|
||||
break;
|
||||
@ -2359,7 +2456,7 @@ namespace nana{ namespace widgets
|
||||
}
|
||||
}
|
||||
|
||||
upoint text_editor::mouse_caret(const point& scrpos) //From screen position
|
||||
const upoint& text_editor::mouse_caret(const point& scrpos) //From screen position
|
||||
{
|
||||
points_.caret = behavior_->screen_to_caret(scrpos);
|
||||
|
||||
@ -2370,7 +2467,7 @@ namespace nana{ namespace widgets
|
||||
return points_.caret;
|
||||
}
|
||||
|
||||
upoint text_editor::caret() const
|
||||
const upoint& text_editor::caret() const
|
||||
{
|
||||
return points_.caret;
|
||||
}
|
||||
@ -2413,7 +2510,7 @@ namespace nana{ namespace widgets
|
||||
|
||||
::nana::color text_editor::_m_bgcolor() const
|
||||
{
|
||||
return (!API::window_enabled(window_) ? color{ 0xE0, 0xE0, 0xE0 } : API::bgcolor(window_));
|
||||
return (!API::window_enabled(window_) ? static_cast<color_rgb>(0xE0E0E0) : API::bgcolor(window_));
|
||||
}
|
||||
|
||||
bool text_editor::_m_scroll_text(bool vert)
|
||||
@ -2459,8 +2556,12 @@ namespace nana{ namespace widgets
|
||||
void text_editor::_m_scrollbar()
|
||||
{
|
||||
_m_get_scrollbar_size();
|
||||
|
||||
nana::size tx_area = _m_text_area();
|
||||
|
||||
auto scroll_fn = [this](const arg_mouse& arg) {
|
||||
_m_on_scroll(arg);
|
||||
};
|
||||
|
||||
if (text_area_.vscroll)
|
||||
{
|
||||
const int x = text_area_.area.x + static_cast<int>(tx_area.width);
|
||||
@ -2472,15 +2573,10 @@ namespace nana{ namespace widgets
|
||||
wdptr->create(window_, nana::rectangle(x, text_area_.area.y, text_area_.vscroll, tx_area.height));
|
||||
|
||||
auto & evts = wdptr->events();
|
||||
auto fn = [this](const arg_mouse& arg){
|
||||
_m_on_scroll(arg);
|
||||
};
|
||||
evts.mouse_down(fn);
|
||||
evts.mouse_move(fn);
|
||||
evts.mouse_wheel([this](const arg_wheel& arg)
|
||||
{
|
||||
_m_on_scroll(arg);
|
||||
});
|
||||
evts.mouse_down(scroll_fn);
|
||||
evts.mouse_move(scroll_fn);
|
||||
evts.mouse_wheel(scroll_fn);
|
||||
|
||||
API::take_active(wdptr->handle(), false, window_);
|
||||
}
|
||||
|
||||
@ -2510,13 +2606,10 @@ namespace nana{ namespace widgets
|
||||
wdptr->create(window_, nana::rectangle(text_area_.area.x, y, tx_area.width, text_area_.hscroll));
|
||||
|
||||
auto & evts = wdptr->events();
|
||||
auto fn = [this](const arg_mouse& arg)
|
||||
{
|
||||
_m_on_scroll(arg);
|
||||
};
|
||||
evts.mouse_down(fn);
|
||||
evts.mouse_move(fn);
|
||||
evts.mouse_wheel(fn);
|
||||
evts.mouse_down(scroll_fn);
|
||||
evts.mouse_move(scroll_fn);
|
||||
evts.mouse_wheel(scroll_fn);
|
||||
|
||||
wdptr->step(20);
|
||||
API::take_active(wdptr->handle(), false, window_);
|
||||
}
|
||||
@ -2553,24 +2646,25 @@ namespace nana{ namespace widgets
|
||||
return;
|
||||
}
|
||||
|
||||
//Only the textbox is multi_lines, it enables the scrollbars
|
||||
if(attributes_.multi_lines)
|
||||
//No scrollbar if it is not multi-line
|
||||
if (!attributes_.multi_lines)
|
||||
{
|
||||
text_area_.vscroll = (textbase_.lines() > screen_lines() ? text_area_.scroll_pixels : 0);
|
||||
text_area_.vscroll = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
std::pair<size_t, size_t> max_line = textbase_.max_line();
|
||||
if(max_line.second)
|
||||
text_area_.vscroll = (textbase_.lines() > screen_lines() ? text_area_.scroll_pixels : 0);
|
||||
|
||||
auto max_line = textbase_.max_line();
|
||||
if(max_line.second)
|
||||
{
|
||||
if(points_.offset.x || _m_text_extent_size(textbase_.getline(max_line.first).c_str(), max_line.second).width > _m_text_area().width)
|
||||
{
|
||||
if(points_.offset.x || _m_text_extent_size(textbase_.getline(max_line.first).c_str(), max_line.second).width > _m_text_area().width)
|
||||
{
|
||||
text_area_.hscroll = text_area_.scroll_pixels;
|
||||
if((text_area_.vscroll == 0) && (textbase_.lines() > screen_lines()))
|
||||
text_area_.vscroll = text_area_.scroll_pixels;
|
||||
}
|
||||
text_area_.hscroll = text_area_.scroll_pixels;
|
||||
if((text_area_.vscroll == 0) && (textbase_.lines() > screen_lines()))
|
||||
text_area_.vscroll = text_area_.scroll_pixels;
|
||||
}
|
||||
}
|
||||
else
|
||||
text_area_.vscroll = 0;
|
||||
}
|
||||
|
||||
void text_editor::_m_reset()
|
||||
@ -2818,9 +2912,9 @@ namespace nana{ namespace widgets
|
||||
else
|
||||
{
|
||||
width += text_area_.area.x;
|
||||
if(static_cast<int>(width) - points_.offset.x >= _m_endx())
|
||||
if(static_cast<int>(width) - points_.offset.x >= _m_end_pos(true))
|
||||
{ //Out of screen text area
|
||||
points_.offset.x = static_cast<int>(width) -_m_endx() + 1;
|
||||
points_.offset.x = static_cast<int>(width) -_m_end_pos(false) + 1;
|
||||
auto rest_size = lnstr.size() - points_.caret.x;
|
||||
points_.offset.x += static_cast<int>(_m_text_extent_size(lnstr.c_str() + points_.caret.x, (rest_size >= static_cast<unsigned>(many) ? static_cast<unsigned>(many) : rest_size)).width);
|
||||
return true;
|
||||
@ -2886,17 +2980,11 @@ namespace nana{ namespace widgets
|
||||
return text_area_.area.y;
|
||||
}
|
||||
|
||||
//_m_endx
|
||||
//@brief: Get the right point of text area
|
||||
int text_editor::_m_endx() const
|
||||
int text_editor::_m_end_pos(bool right) const
|
||||
{
|
||||
return static_cast<int>(text_area_.area.x + text_area_.area.width - text_area_.vscroll);
|
||||
}
|
||||
if(right)
|
||||
return static_cast<int>(text_area_.area.x + text_area_.area.width - text_area_.vscroll);
|
||||
|
||||
//_m_endy
|
||||
//@brief: Get the bottom point of text area
|
||||
int text_editor::_m_endy() const
|
||||
{
|
||||
return static_cast<int>(text_area_.area.y + text_area_.area.height - text_area_.hscroll);
|
||||
}
|
||||
|
||||
@ -2965,7 +3053,7 @@ namespace nana{ namespace widgets
|
||||
void text_editor::_m_draw_string(int top, const ::nana::color& clr, const nana::upoint& str_pos, const nana::string& str, bool if_mask) const
|
||||
{
|
||||
::nana::point text_pos{ text_area_.area.x - points_.offset.x, top };
|
||||
const int xend = text_area_.area.x + static_cast<int>(text_area_.area.width);
|
||||
const int text_right = text_area_.area.right();
|
||||
|
||||
std::unique_ptr<nana::string> mask_str;
|
||||
if (if_mask && mask_char_)
|
||||
@ -3002,7 +3090,7 @@ namespace nana{ namespace widgets
|
||||
std::size_t len = ent.end - ent.begin;
|
||||
unsigned str_w = graph_.text_extent_size(ent.begin, len).width;
|
||||
|
||||
if ((text_pos.x + static_cast<int>(str_w) > text_area_.area.x) && (text_pos.x < xend))
|
||||
if ((text_pos.x + static_cast<int>(str_w) > text_area_.area.x) && (text_pos.x < text_right))
|
||||
{
|
||||
if (selected && focused)
|
||||
{
|
||||
@ -3011,7 +3099,7 @@ namespace nana{ namespace widgets
|
||||
graph_.string(text_pos, ent.begin, len);
|
||||
}
|
||||
else
|
||||
_m_draw_parse_string(parser, _m_is_right_text(ent), text_pos, clr, ent.begin, len);
|
||||
_m_draw_parse_string(parser, is_right_text(ent), text_pos, clr, ent.begin, len);
|
||||
}
|
||||
text_pos.x += static_cast<int>(str_w);
|
||||
}
|
||||
@ -3042,7 +3130,7 @@ namespace nana{ namespace widgets
|
||||
{
|
||||
std::size_t len = ent.end - ent.begin;
|
||||
unsigned str_w = graph_.text_extent_size(ent.begin, len).width;
|
||||
if ((text_pos.x + static_cast<int>(str_w) > text_area_.area.x) && (text_pos.x < xend))
|
||||
if ((text_pos.x + static_cast<int>(str_w) > text_area_.area.x) && (text_pos.x < text_right))
|
||||
{
|
||||
std::size_t pos = ent.begin - strbeg + str_pos.x;
|
||||
const auto str_end = pos + len;
|
||||
@ -3071,7 +3159,7 @@ namespace nana{ namespace widgets
|
||||
auto sel_w = std::accumulate(pxbuf + (a.x - pos), pxbuf + (endpos - pos), unsigned());
|
||||
|
||||
graph_.set_text_color(clr);
|
||||
if (_m_is_right_text(ent))
|
||||
if (is_right_text(ent))
|
||||
{ //RTL
|
||||
rtl_string(text_pos, ent.begin, len, str_w, head_w, sel_w);
|
||||
}
|
||||
@ -3100,7 +3188,7 @@ namespace nana{ namespace widgets
|
||||
int endpos = b.x;
|
||||
unsigned sel_w = graph_.glyph_extent_size(ent.begin, len, 0, endpos - pos).width;
|
||||
|
||||
if (_m_is_right_text(ent))
|
||||
if (is_right_text(ent))
|
||||
{ //RTL
|
||||
graph_.set_text_color(clr);
|
||||
rtl_string(text_pos, ent.begin, len, str_w, 0, sel_w);
|
||||
@ -3125,7 +3213,7 @@ namespace nana{ namespace widgets
|
||||
{
|
||||
std::size_t len = ent.end - ent.begin;
|
||||
unsigned str_w = graph_.text_extent_size(ent.begin, len).width;
|
||||
if ((text_pos.x + static_cast<int>(str_w) > text_area_.area.x) && (text_pos.x < xend))
|
||||
if ((text_pos.x + static_cast<int>(str_w) > text_area_.area.x) && (text_pos.x < text_right))
|
||||
{
|
||||
graph_.set_text_color(clr);
|
||||
std::size_t pos = ent.begin - strbeg + str_pos.x;
|
||||
@ -3144,7 +3232,7 @@ namespace nana{ namespace widgets
|
||||
else
|
||||
{
|
||||
unsigned head_w = graph_.glyph_extent_size(ent.begin, len, 0, a.x - pos).width;
|
||||
if (_m_is_right_text(ent))
|
||||
if (is_right_text(ent))
|
||||
{ //RTL
|
||||
rtl_string(text_pos, ent.begin, len, str_w, head_w, str_w - head_w);
|
||||
}
|
||||
@ -3177,7 +3265,7 @@ namespace nana{ namespace widgets
|
||||
{
|
||||
std::size_t len = ent.end - ent.begin;
|
||||
unsigned str_w = graph_.text_extent_size(ent.begin, len).width;
|
||||
if ((text_pos.x + static_cast<int>(str_w) > text_area_.area.x) && (text_pos.x < xend))
|
||||
if ((text_pos.x + static_cast<int>(str_w) > text_area_.area.x) && (text_pos.x < text_right))
|
||||
{
|
||||
std::size_t pos = ent.begin - strbeg + str_pos.x;
|
||||
graph_.set_text_color(clr);
|
||||
@ -3191,7 +3279,7 @@ namespace nana{ namespace widgets
|
||||
else if (pos <= b.x && b.x < pos + len)
|
||||
{
|
||||
unsigned sel_w = graph_.glyph_extent_size(ent.begin, len, 0, b.x - pos).width;
|
||||
if (_m_is_right_text(ent))
|
||||
if (is_right_text(ent))
|
||||
{ //RTL
|
||||
rtl_string(text_pos, ent.begin, len, str_w, 0, sel_w);
|
||||
}
|
||||
@ -3218,7 +3306,7 @@ namespace nana{ namespace widgets
|
||||
{
|
||||
if (false == behavior_->adjust_caret_into_screen())
|
||||
{
|
||||
if (behavior_->caret_to_screen(points_.caret).x < _m_endx())
|
||||
if (behavior_->caret_to_screen(points_.caret).x < _m_end_pos(true))
|
||||
{
|
||||
behavior_->update_line(points_.caret.y, secondary_before);
|
||||
return false;
|
||||
@ -3306,7 +3394,7 @@ namespace nana{ namespace widgets
|
||||
std::size_t len = ent.end - ent.begin;
|
||||
if (ent.begin <= ch && ch <= ent.end)
|
||||
{
|
||||
if (_m_is_right_text(ent))
|
||||
if (is_right_text(ent))
|
||||
{
|
||||
//Characters of some bidi languages may transform in a word.
|
||||
//RTL
|
||||
@ -3323,11 +3411,6 @@ namespace nana{ namespace widgets
|
||||
return text_w;
|
||||
}
|
||||
|
||||
bool text_editor::_m_is_right_text(const unicode_bidi::entity& e)
|
||||
{
|
||||
return ((e.bidi_char_type != unicode_bidi::bidi_char::L) && (e.level & 1));
|
||||
}
|
||||
|
||||
//end class text_editor
|
||||
}//end namespace skeletons
|
||||
}//end namespace widgets
|
||||
|
@ -151,6 +151,7 @@ namespace nana
|
||||
if(dir != attr_.dir)
|
||||
{
|
||||
attr_.dir = dir;
|
||||
_m_mk_slider_pos_by_value();
|
||||
this->draw();
|
||||
}
|
||||
}
|
||||
@ -425,7 +426,7 @@ namespace nana
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return pos;
|
||||
return (pos < 0 ? 0 : pos);
|
||||
}
|
||||
|
||||
int _m_slider_refpos() const
|
||||
@ -443,7 +444,13 @@ namespace nana
|
||||
if(_m_scale())
|
||||
{
|
||||
auto cmpvalue = static_cast<int>(attr_.vcur);
|
||||
attr_.vcur = (attr_.pos * attr_.vmax / _m_scale());
|
||||
if (style::vertical == attr_.dir)
|
||||
{
|
||||
double scl = _m_scale();
|
||||
attr_.vcur = (scl - attr_.pos) * attr_.vmax / scl;
|
||||
}
|
||||
else
|
||||
attr_.vcur = (attr_.pos * attr_.vmax / _m_scale());
|
||||
if (cmpvalue != static_cast<int>(attr_.vcur))
|
||||
_m_emit_value_changed();
|
||||
}
|
||||
@ -453,6 +460,9 @@ namespace nana
|
||||
{
|
||||
attr_.pos = double(_m_scale()) * attr_.vcur / attr_.vmax;
|
||||
|
||||
if (style::vertical == attr_.dir)
|
||||
attr_.pos = _m_scale() - attr_.pos;
|
||||
|
||||
if(slider_state_.trace == slider_state_.TraceNone)
|
||||
attr_.adorn_pos = attr_.pos;
|
||||
}
|
||||
@ -480,8 +490,16 @@ namespace nana
|
||||
//adorn
|
||||
renderer::adorn_t adorn;
|
||||
adorn.horizontal = bar.horizontal;
|
||||
adorn.bound.x = (bar.horizontal ? bar.r.x : bar.r.y) + attr_.border;
|
||||
adorn.bound.y = adorn.bound.x + static_cast<int>(attr_.adorn_pos);
|
||||
if (adorn.horizontal)
|
||||
{
|
||||
adorn.bound.x = bar.r.x + attr_.border;
|
||||
adorn.bound.y = adorn.bound.x + static_cast<int>(attr_.adorn_pos);
|
||||
}
|
||||
else
|
||||
{
|
||||
adorn.bound.y = static_cast<int>(other_.graph->height()) - static_cast<int>(attr_.border + bar.r.y);
|
||||
adorn.bound.x = static_cast<int>(attr_.adorn_pos + attr_.border + bar.r.y);
|
||||
}
|
||||
adorn.vcur_scale = static_cast<unsigned>(attr_.pos);
|
||||
adorn.block = (bar.horizontal ? bar.r.height : bar.r.width) - attr_.border * 2;
|
||||
adorn.fixedpos = static_cast<int>((bar.horizontal ? bar.r.y : bar.r.x) + attr_.border);
|
||||
|
@ -193,12 +193,11 @@ namespace nana
|
||||
if (str.empty())
|
||||
return true;
|
||||
|
||||
auto i = std::find_if(texts_.cbegin(), texts_.cend(), [&str](const std::wstring& value)
|
||||
{
|
||||
return (value.find(str) != value.npos);
|
||||
});
|
||||
for (auto i = texts_.cbegin(); i != texts_.cend(); ++i)
|
||||
if (i->find(str) != str.npos)
|
||||
return false;
|
||||
|
||||
return (i != texts_.cend());
|
||||
return true;
|
||||
}
|
||||
|
||||
void spin(bool increase) override
|
||||
@ -368,17 +367,13 @@ namespace nana
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool refreshed = false;
|
||||
if (pressed)
|
||||
refreshed = editor_->mouse_down(arg.button, arg.pos);
|
||||
else
|
||||
refreshed = editor_->mouse_up(arg.button, arg.pos);
|
||||
|
||||
if (refreshed)
|
||||
if (editor_->mouse_pressed(arg))
|
||||
{
|
||||
_m_draw_spins(buttons::none);
|
||||
return true;
|
||||
}
|
||||
|
||||
return refreshed;
|
||||
return false;
|
||||
}
|
||||
|
||||
bool mouse_move(bool left_button, const ::nana::point& pos)
|
||||
@ -411,7 +406,7 @@ namespace nana
|
||||
{
|
||||
auto spins_r = _m_spins_area();
|
||||
if (spins_r.x == 0)
|
||||
editor_->text_area({});
|
||||
editor_->text_area(rectangle{});
|
||||
else
|
||||
editor_->text_area({ 2, 2, graph_->width() - spins_r.width - 2, spins_r.height - 2 });
|
||||
}
|
||||
|
@ -97,29 +97,31 @@ namespace nana
|
||||
{
|
||||
int x = r.x + (static_cast<int>(r.width) - 14) / 2;
|
||||
int y = r.y + (static_cast<int>(r.height) - 14) / 2;
|
||||
|
||||
|
||||
::nana::color clr;
|
||||
|
||||
switch(sta)
|
||||
{
|
||||
case item_renderer::highlight:
|
||||
clr = { colors::white }; break;
|
||||
clr = colors::white; break;
|
||||
case item_renderer::press:
|
||||
clr = { 0xA0, 0xA0, 0xA0 }; break;
|
||||
clr = static_cast<color_rgb>(0xA0A0A0); break;
|
||||
case item_renderer::disable:
|
||||
clr = { 0x80, 0x80, 0x80 }; break;
|
||||
clr = static_cast<color_rgb>(0x808080); break;
|
||||
default:
|
||||
clr = { 0xF0, 0xF0, 0xF0 };
|
||||
clr = static_cast<color_rgb>(0xF0F0F0);
|
||||
}
|
||||
graph.rectangle(r, true, bgcolor_);
|
||||
nana::paint::gadget::cross(graph, x, y, 14, 6, clr);
|
||||
facade<element::cross> cross;
|
||||
cross.draw(graph, {}, clr, { x, y, 14, 6 }, element_state::normal);
|
||||
}
|
||||
|
||||
virtual void close(graph_reference graph, const nana::rectangle& r, state_t sta)
|
||||
{
|
||||
nana::paint::gadget::close_16_pixels(graph, r.x + (r.width - 16) / 2, r.y + (r.height - 16) / 2, 1, colors::black);
|
||||
facade<element::x_icon> x_icon;
|
||||
x_icon.draw(graph, {}, colors::black, { r.x + static_cast<int>(r.width - 16) / 2, r.y + static_cast<int>(r.height - 16) / 2, 16, 16 }, element_state::normal);
|
||||
if(item_renderer::highlight == sta)
|
||||
graph.rectangle(r, false, {0xa0, 0xa0, 0xa0});
|
||||
graph.rectangle(r, false, static_cast<color_rgb>(0xa0a0a0));
|
||||
}
|
||||
|
||||
virtual void close_fly(graph_reference graph, const nana::rectangle& r, bool active, state_t sta)
|
||||
@ -129,8 +131,8 @@ namespace nana
|
||||
|
||||
if (sta == item_renderer::highlight)
|
||||
{
|
||||
::nana::color bgcolor{ 0xCC, 0xD2, 0xDD };
|
||||
::nana::color rect_clr{0x9d, 0xa3, 0xab};
|
||||
::nana::color bgcolor{ static_cast<color_rgb>(0xCCD2DD) };
|
||||
::nana::color rect_clr{ static_cast<color_rgb>(0x9da3ab) };
|
||||
graph.round_rectangle(r, 1, 1, rect_clr, false, {});
|
||||
nana::rectangle draw_r(r);
|
||||
graph.rectangle(draw_r.pare_off(1), false, rect_clr.blend(bgcolor, 0.8));
|
||||
@ -138,26 +140,25 @@ namespace nana
|
||||
graph.rectangle(draw_r.pare_off(1), false, rect_clr.blend(bgcolor, 0.2));
|
||||
}
|
||||
else if (!active)
|
||||
clr = ::nana::color{ 0x92, 0x99, 0xA4 };
|
||||
clr = static_cast<color_rgb>(0x9299a4);
|
||||
|
||||
facade<element::x_icon> x_icon;
|
||||
x_icon.draw(graph, {}, colors::black, { r.x + static_cast<int>(r.width - 16) / 2, r.y + static_cast<int>(r.height - 16) / 2, 16, 16 }, element_state::normal);
|
||||
|
||||
gadget::close_16_pixels(graph, r.x - (16 - r.width) / 2, r.y - (16 - r.height) / 2, 1, clr);
|
||||
}
|
||||
|
||||
virtual void back(graph_reference graph, const nana::rectangle& r, state_t sta)
|
||||
{
|
||||
using namespace nana::paint::gadget;
|
||||
_m_draw_arrow(graph, r, sta, direction::west);
|
||||
}
|
||||
|
||||
virtual void next(graph_reference graph, const nana::rectangle& r, state_t sta)
|
||||
{
|
||||
using namespace nana::paint::gadget;
|
||||
_m_draw_arrow(graph, r, sta, direction::east);
|
||||
}
|
||||
|
||||
virtual void list(graph_reference graph, const nana::rectangle& r, state_t sta)
|
||||
{
|
||||
using namespace nana::paint::gadget;
|
||||
_m_draw_arrow(graph, r, sta, direction::south);
|
||||
}
|
||||
private:
|
||||
@ -343,7 +344,7 @@ namespace nana
|
||||
{
|
||||
if(i < list_.size())
|
||||
return at_no_bound_check(i);
|
||||
throw std::out_of_range("Nana.GUI.tabbar::at() is out of range");
|
||||
throw std::out_of_range("invalid position of tabbar");
|
||||
}
|
||||
|
||||
iterator iterator_at(std::size_t pos)
|
||||
@ -369,7 +370,7 @@ namespace nana
|
||||
{
|
||||
if(pos < list_.size())
|
||||
return at_no_bound_check(pos);
|
||||
throw std::out_of_range("Nana.GUI.tabbar::at() const is out of range");
|
||||
throw std::out_of_range("invalid position of tabbar");
|
||||
}
|
||||
|
||||
const nana::any& at_no_bound_check(std::size_t pos) const
|
||||
@ -434,6 +435,7 @@ namespace nana
|
||||
{
|
||||
if ((nullptr == evt_agent_) || evt_agent_->removed(pos))
|
||||
{
|
||||
API::show_window(iterator_at(pos)->relative, false);
|
||||
list_.erase(iterator_at(pos));
|
||||
_m_adjust();
|
||||
|
||||
@ -458,6 +460,8 @@ namespace nana
|
||||
basis_.scroll_pixels = 0;
|
||||
}
|
||||
|
||||
if (basis_.active != ::nana::npos)
|
||||
API::show_window(iterator_at(basis_.active)->relative, true);
|
||||
if(evt_agent_)
|
||||
evt_agent_->activated(basis_.active);
|
||||
return true;
|
||||
@ -765,22 +769,20 @@ namespace nana
|
||||
void _m_open_menulister()
|
||||
{
|
||||
menulister_.clear();
|
||||
auto fn = [this](::nana::menu::item_proxy& ipx)
|
||||
{
|
||||
if (this->activate(ipx.index()))
|
||||
API::refresh_window(basis_.wd);
|
||||
};
|
||||
|
||||
auto f = std::bind(&layouter::_m_click_menulister, this, std::placeholders::_1);
|
||||
for(auto & m : list_)
|
||||
menulister_.append(m.text, f);
|
||||
menulister_.append(m.text, fn);
|
||||
|
||||
auto r = toolbox_.area(toolbox_.ButtonList, basis_.graph->height());
|
||||
r.x += _m_toolbox_pos();
|
||||
menulister_.popup(basis_.wd, r.x, r.bottom());
|
||||
}
|
||||
|
||||
void _m_click_menulister(nana::menu::item_proxy& ip)
|
||||
{
|
||||
if(this->activate(ip.index()))
|
||||
API::refresh_window(basis_.wd);
|
||||
}
|
||||
|
||||
//the begin pos of toolbox
|
||||
int _m_toolbox_pos() const
|
||||
{
|
||||
@ -1009,12 +1011,12 @@ namespace nana
|
||||
int x = _m_itembar_right();
|
||||
if (x > 0)
|
||||
{
|
||||
basis_.graph->line({ x - 2, 0 }, { x - 2, bottom }, { 0x80, 0x80, 0x80 });
|
||||
basis_.graph->line({ x - 1, 0 }, { x - 1, bottom }, {0xf0, 0xf0, 0xf0});
|
||||
basis_.graph->line({ x - 2, 0 }, { x - 2, bottom }, static_cast<color_rgb>(0x808080));
|
||||
basis_.graph->line({ x - 1, 0 }, { x - 1, bottom }, static_cast<color_rgb>(0xf0f0f0));
|
||||
}
|
||||
}
|
||||
|
||||
basis_.graph->set_color({ 0x80, 0x80, 0x80 });
|
||||
basis_.graph->set_color(static_cast<color_rgb>(0x808080));
|
||||
|
||||
int right = static_cast<int>(basis_.graph->width());
|
||||
int end = active_m.r.x + static_cast<int>(active_m.r.width);
|
||||
@ -1193,23 +1195,23 @@ namespace nana
|
||||
return layouter_->text(i);
|
||||
}
|
||||
|
||||
bool trigger::toolbox_button(toolbox_button_t btn, bool enable)
|
||||
bool trigger::toolbox(kits btn, bool enable)
|
||||
{
|
||||
toolbox::button_t tb = toolbox::ButtonSize;
|
||||
toolbox & tbobj = layouter_->toolbox_object();
|
||||
auto tb = toolbox::ButtonSize;
|
||||
auto& tbox = layouter_->toolbox_object();
|
||||
switch(btn)
|
||||
{
|
||||
case trigger::ButtonAdd:
|
||||
case kits::add:
|
||||
tb = toolbox::ButtonAdd; break;
|
||||
case trigger::ButtonList:
|
||||
case kits::list:
|
||||
tb = toolbox::ButtonList; break;
|
||||
case trigger::ButtonClose:
|
||||
case kits::close:
|
||||
tb = toolbox::ButtonClose; break;
|
||||
case trigger::ButtonScroll:
|
||||
tbobj.enable(toolbox::ButtonScrollBack, enable);
|
||||
return tbobj.enable(tbobj.ButtonScrollNext, enable);
|
||||
case kits::scroll:
|
||||
tbox.enable(toolbox::ButtonScrollBack, enable);
|
||||
return tbox.enable(tbox.ButtonScrollNext, enable);
|
||||
}
|
||||
return (tb != toolbox::ButtonSize ? tbobj.enable(tb, enable) : false);
|
||||
return (tb != toolbox::ButtonSize ? tbox.enable(tb, enable) : false);
|
||||
}
|
||||
|
||||
void trigger::attached(widget_reference widget, graph_reference graph)
|
||||
@ -1274,8 +1276,6 @@ namespace nana
|
||||
#include <forward_list>
|
||||
namespace nana
|
||||
{
|
||||
namespace ng
|
||||
{
|
||||
namespace drawerbase
|
||||
{
|
||||
namespace tabbar_lite
|
||||
@ -1285,6 +1285,7 @@ namespace nana
|
||||
::std::string text;
|
||||
::nana::any value;
|
||||
::std::pair<int, int> pos_ends;
|
||||
::nana::window attached_window{ nullptr };
|
||||
|
||||
item(std::string t, ::nana::any v)
|
||||
: text(std::move(t)), value(std::move(v))
|
||||
@ -1345,14 +1346,14 @@ namespace nana
|
||||
using graph_reference = ::nana::paint::graphics&;
|
||||
static const std::size_t npos = static_cast<std::size_t>(-1);
|
||||
|
||||
void set_widget(widget& wdg)
|
||||
void set_widget(::nana::tabbar_lite& wdg)
|
||||
{
|
||||
widget_ = &wdg;
|
||||
}
|
||||
|
||||
::nana::dev::widget_traits<widget>::scheme_type & scheme()
|
||||
::nana::tabbar_lite* widget_ptr() const
|
||||
{
|
||||
return API::scheme(*widget_);
|
||||
return widget_;
|
||||
}
|
||||
|
||||
std::forward_list<item>& items()
|
||||
@ -1360,6 +1361,23 @@ namespace nana
|
||||
return items_;
|
||||
}
|
||||
|
||||
void show_attached_window()
|
||||
{
|
||||
if (indexes_.active_pos != npos)
|
||||
{
|
||||
auto i = items_.cbegin();
|
||||
std::advance(i, indexes_.active_pos);
|
||||
API::show_window(i->attached_window, true);
|
||||
|
||||
std::size_t pos = 0;
|
||||
for (auto & m : items_)
|
||||
{
|
||||
if (pos++ != indexes_.active_pos)
|
||||
API::show_window(m.attached_window, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool track_pointer(const point& pos)
|
||||
{
|
||||
std::size_t item_pos = 0;
|
||||
@ -1390,7 +1408,7 @@ namespace nana
|
||||
return indexes_;
|
||||
}
|
||||
private:
|
||||
widget * widget_{ nullptr };
|
||||
::nana::tabbar_lite * widget_{ nullptr };
|
||||
std::forward_list<item> items_;
|
||||
indexes indexes_;
|
||||
};
|
||||
@ -1404,7 +1422,7 @@ namespace nana
|
||||
{
|
||||
_m_calc_metrics(graph, model.items());
|
||||
|
||||
auto & scheme = model.scheme();
|
||||
auto & scheme = model.widget_ptr()->scheme();
|
||||
|
||||
//draw background
|
||||
graph.rectangle(true, scheme.background);
|
||||
@ -1475,14 +1493,14 @@ namespace nana
|
||||
delete model_;
|
||||
}
|
||||
|
||||
model* driver::get_model()
|
||||
model* driver::get_model() const throw()
|
||||
{
|
||||
return model_;
|
||||
}
|
||||
|
||||
void driver::attached(widget_reference wdg, graph_reference)
|
||||
{
|
||||
model_->set_widget(wdg);
|
||||
model_->set_widget(dynamic_cast<nana::tabbar_lite&>(wdg));
|
||||
}
|
||||
|
||||
//Overrides drawer_trigger's method
|
||||
@ -1513,12 +1531,20 @@ namespace nana
|
||||
void driver::mouse_down(graph_reference graph, const arg_mouse&)
|
||||
{
|
||||
auto & indexes = model_->get_indexes();
|
||||
if (indexes.hovered_pos == model_->npos)
|
||||
if ((indexes.hovered_pos == model_->npos) || (indexes.active_pos == indexes.hovered_pos))
|
||||
return;
|
||||
|
||||
indexes.active_pos = indexes.hovered_pos;
|
||||
refresh(graph);
|
||||
API::lazy_refresh();
|
||||
if (indexes.active_pos != indexes.hovered_pos)
|
||||
{
|
||||
indexes.active_pos = indexes.hovered_pos;
|
||||
model_->show_attached_window();
|
||||
|
||||
refresh(graph);
|
||||
API::lazy_refresh();
|
||||
|
||||
event_arg arg;
|
||||
model_->widget_ptr()->events().selected.emit(arg);
|
||||
}
|
||||
}
|
||||
//end class driver
|
||||
}
|
||||
@ -1531,6 +1557,47 @@ namespace nana
|
||||
this->create(parent_wd, r, visible);
|
||||
}
|
||||
|
||||
//capacity
|
||||
std::size_t tabbar_lite::length() const
|
||||
{
|
||||
auto& items = get_drawer_trigger().get_model()->items();
|
||||
internal_scope_guard lock;
|
||||
return static_cast<std::size_t>(std::distance(items.cbegin(), items.cend()));
|
||||
}
|
||||
|
||||
//modifiers
|
||||
void tabbar_lite::attach(std::size_t pos_set, window wd)
|
||||
{
|
||||
auto model = get_drawer_trigger().get_model();
|
||||
internal_scope_guard lock;
|
||||
|
||||
for (auto & m : model->items())
|
||||
{
|
||||
if (0 == pos_set--)
|
||||
{
|
||||
m.attached_window = wd;
|
||||
model->show_attached_window();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
throw std::out_of_range("invalid position of tabbar_lite");
|
||||
}
|
||||
|
||||
window tabbar_lite::attach(std::size_t pos_set) const
|
||||
{
|
||||
auto model = get_drawer_trigger().get_model();
|
||||
internal_scope_guard lock;
|
||||
|
||||
for (auto & m : model->items())
|
||||
{
|
||||
if (0 == pos_set--)
|
||||
return m.attached_window;
|
||||
}
|
||||
|
||||
throw std::out_of_range("invalid position of tabbar_lite");
|
||||
}
|
||||
|
||||
void tabbar_lite::push_back(std::string text, ::nana::any any)
|
||||
{
|
||||
auto & items = get_drawer_trigger().get_model()->items();
|
||||
@ -1559,6 +1626,64 @@ namespace nana
|
||||
items.emplace_front(std::move(text), std::move(any));
|
||||
API::refresh_window(handle());
|
||||
}
|
||||
|
||||
std::size_t tabbar_lite::selected() const
|
||||
{
|
||||
auto model = get_drawer_trigger().get_model();
|
||||
internal_scope_guard lock;
|
||||
|
||||
return model->get_indexes().active_pos;
|
||||
}
|
||||
|
||||
void tabbar_lite::erase(std::size_t pos, bool close_attached)
|
||||
{
|
||||
auto model = get_drawer_trigger().get_model();
|
||||
internal_scope_guard lock;
|
||||
|
||||
const auto len = length();
|
||||
|
||||
if (len <= pos)
|
||||
throw std::out_of_range("invalid position of tabbar_lite");
|
||||
|
||||
auto active_pos = model->get_indexes().active_pos;
|
||||
|
||||
//selection_changed is used to determine whether the title will be updated
|
||||
bool selection_changed = true;
|
||||
if (pos == active_pos)
|
||||
{
|
||||
if (active_pos + 1 == len)
|
||||
{
|
||||
if (active_pos)
|
||||
--active_pos;
|
||||
else
|
||||
active_pos = npos;
|
||||
}
|
||||
}
|
||||
else if (pos < active_pos)
|
||||
--active_pos;
|
||||
else
|
||||
selection_changed = false;
|
||||
|
||||
model->get_indexes().active_pos = active_pos;
|
||||
|
||||
auto i = model->items().cbefore_begin();
|
||||
std::advance(i, pos);
|
||||
|
||||
auto attached_wd = std::next(i)->attached_window;
|
||||
|
||||
model->items().erase_after(i);
|
||||
|
||||
model->show_attached_window();
|
||||
API::refresh_window(handle());
|
||||
|
||||
if (close_attached && attached_wd)
|
||||
API::close_window(attached_wd);
|
||||
|
||||
if (selection_changed && (active_pos != npos))
|
||||
{
|
||||
event_arg arg;
|
||||
events().selected.emit(arg);
|
||||
}
|
||||
}
|
||||
//end class tabbar
|
||||
}
|
||||
}//end namespace nana
|
||||
|
@ -20,26 +20,32 @@
|
||||
|
||||
namespace nana
|
||||
{
|
||||
arg_textbox::arg_textbox(textbox& wdg)
|
||||
: widget(wdg)
|
||||
arg_textbox::arg_textbox(textbox& wdg, const std::vector<upoint>& text_pos)
|
||||
: widget(wdg), text_position(text_pos)
|
||||
{}
|
||||
|
||||
namespace drawerbase {
|
||||
namespace textbox
|
||||
{
|
||||
//class event_agent
|
||||
event_agent::event_agent(::nana::textbox& wdg)
|
||||
:widget_(wdg)
|
||||
event_agent::event_agent(::nana::textbox& wdg, const std::vector<upoint>& text_pos)
|
||||
:widget_(wdg), text_position_(text_pos)
|
||||
{}
|
||||
|
||||
void event_agent::first_change()
|
||||
{
|
||||
widget_.events().first_change.emit(::nana::arg_textbox{ widget_ });
|
||||
widget_.events().first_change.emit(::nana::arg_textbox{ widget_, text_position_ });
|
||||
}
|
||||
|
||||
void event_agent::text_changed()
|
||||
{
|
||||
widget_.events().text_changed.emit(::nana::arg_textbox{ widget_ });
|
||||
widget_.events().text_changed.emit(::nana::arg_textbox{ widget_, text_position_ });
|
||||
}
|
||||
|
||||
void event_agent::text_exposed(const std::vector<upoint>& text_pos)
|
||||
{
|
||||
::nana::arg_textbox arg(widget_, text_pos);
|
||||
widget_.events().text_exposed.emit(arg);
|
||||
}
|
||||
//end class event_agent
|
||||
|
||||
@ -63,12 +69,13 @@ namespace drawerbase {
|
||||
{
|
||||
auto wd = wdg.handle();
|
||||
widget_ = &wdg;
|
||||
evt_agent_.reset(new event_agent(static_cast< ::nana::textbox&>(wdg)));
|
||||
evt_agent_.reset(new event_agent(static_cast<::nana::textbox&>(wdg), editor_->text_position()));
|
||||
|
||||
auto scheme = API::dev::get_scheme(wdg);
|
||||
|
||||
editor_ = new text_editor(wd, graph, dynamic_cast<::nana::widgets::skeletons::text_editor_scheme*>(scheme));
|
||||
editor_->textbase().set_event_agent(evt_agent_.get());
|
||||
editor_->set_event(evt_agent_.get());
|
||||
|
||||
_m_text_area(graph.width(), graph.height());
|
||||
|
||||
@ -104,8 +111,11 @@ namespace drawerbase {
|
||||
|
||||
void drawer::mouse_down(graph_reference, const arg_mouse& arg)
|
||||
{
|
||||
if(editor_->mouse_down(arg.button, arg.pos))
|
||||
if (editor_->mouse_pressed(arg))
|
||||
{
|
||||
editor_->render(true);
|
||||
API::lazy_refresh();
|
||||
}
|
||||
}
|
||||
|
||||
void drawer::mouse_move(graph_reference, const arg_mouse& arg)
|
||||
@ -116,7 +126,7 @@ namespace drawerbase {
|
||||
|
||||
void drawer::mouse_up(graph_reference graph, const arg_mouse& arg)
|
||||
{
|
||||
if(editor_->mouse_up(arg.button, arg.pos))
|
||||
if(editor_->mouse_pressed(arg))
|
||||
API::lazy_refresh();
|
||||
}
|
||||
|
||||
@ -229,7 +239,7 @@ namespace drawerbase {
|
||||
internal_scope_guard lock;
|
||||
auto editor = get_drawer_trigger().editor();
|
||||
if (editor)
|
||||
editor->textbase().store(std::move(file));
|
||||
editor->textbase().store(std::move(file), false, nana::unicode::utf8); //3rd parameter is just for syntax, it will be ignored
|
||||
}
|
||||
|
||||
void textbox::store(nana::string file, nana::unicode encoding)
|
||||
@ -237,7 +247,18 @@ namespace drawerbase {
|
||||
internal_scope_guard lock;
|
||||
auto editor = get_drawer_trigger().editor();
|
||||
if (editor)
|
||||
editor->textbase().store(std::move(file), encoding);
|
||||
editor->textbase().store(std::move(file), true, encoding);
|
||||
}
|
||||
|
||||
/// Enables/disables the textbox to indent a line. Idents a new line when it is created by pressing enter.
|
||||
/// @param generator generates text for identing a line. If it is empty, textbox indents the line according to last line.
|
||||
textbox& textbox::indention(bool enb, std::function<nana::string()> generator)
|
||||
{
|
||||
internal_scope_guard lock;
|
||||
auto editor = get_drawer_trigger().editor();
|
||||
if (editor)
|
||||
editor->indent(enb, generator);
|
||||
return *this;
|
||||
}
|
||||
|
||||
textbox& textbox::reset(nana::string str)
|
||||
@ -297,8 +318,10 @@ namespace drawerbase {
|
||||
/// Gets the caret position
|
||||
bool textbox::caret_pos(point& pos, bool text_coordinate) const
|
||||
{
|
||||
internal_scope_guard lock;
|
||||
auto editor = get_drawer_trigger().editor();
|
||||
internal_scope_guard lock;
|
||||
if (!editor)
|
||||
return false;
|
||||
|
||||
auto scr_pos = editor->caret_screen_pos();
|
||||
|
||||
@ -314,6 +337,16 @@ namespace drawerbase {
|
||||
return editor->hit_text_area(scr_pos);
|
||||
}
|
||||
|
||||
textbox& textbox::caret_pos(const upoint& pos)
|
||||
{
|
||||
auto editor = get_drawer_trigger().editor();
|
||||
internal_scope_guard lock;
|
||||
if (editor)
|
||||
editor->move_caret(pos);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
textbox& textbox::append(const nana::string& text, bool at_caret)
|
||||
{
|
||||
internal_scope_guard lock;
|
||||
@ -495,6 +528,7 @@ namespace drawerbase {
|
||||
|
||||
void textbox::set_highlight(const std::string& name, const ::nana::color& fgcolor, const ::nana::color& bgcolor)
|
||||
{
|
||||
internal_scope_guard lock;
|
||||
auto editor = get_drawer_trigger().editor();
|
||||
if (editor)
|
||||
editor->set_highlight(name, fgcolor, bgcolor);
|
||||
@ -502,6 +536,7 @@ namespace drawerbase {
|
||||
|
||||
void textbox::erase_highlight(const std::string& name)
|
||||
{
|
||||
internal_scope_guard lock;
|
||||
auto editor = get_drawer_trigger().editor();
|
||||
if (editor)
|
||||
editor->erase_highlight(name);
|
||||
@ -509,6 +544,7 @@ namespace drawerbase {
|
||||
|
||||
void textbox::set_keywords(const std::string& name, bool case_sensitive, bool whole_word_match, std::initializer_list<nana::string> kw_list)
|
||||
{
|
||||
internal_scope_guard lock;
|
||||
auto editor = get_drawer_trigger().editor();
|
||||
if (editor)
|
||||
{
|
||||
@ -519,6 +555,7 @@ namespace drawerbase {
|
||||
|
||||
void textbox::set_keywords(const std::string& name, bool case_sensitive, bool whole_word_match, std::initializer_list<std::string> kw_list_utf8)
|
||||
{
|
||||
internal_scope_guard lock;
|
||||
auto editor = get_drawer_trigger().editor();
|
||||
if (editor)
|
||||
{
|
||||
@ -529,11 +566,39 @@ namespace drawerbase {
|
||||
|
||||
void textbox::erase_keyword(const nana::string& kw)
|
||||
{
|
||||
internal_scope_guard lock;
|
||||
auto editor = get_drawer_trigger().editor();
|
||||
if (editor)
|
||||
editor->erase_keyword(kw);
|
||||
}
|
||||
|
||||
std::vector<upoint> textbox::text_position() const
|
||||
{
|
||||
internal_scope_guard lock;
|
||||
auto editor = get_drawer_trigger().editor();
|
||||
if (editor)
|
||||
return editor->text_position();
|
||||
|
||||
return{};
|
||||
}
|
||||
|
||||
rectangle textbox::text_area() const
|
||||
{
|
||||
internal_scope_guard lock;
|
||||
auto editor = get_drawer_trigger().editor();
|
||||
if (editor)
|
||||
return editor->text_area(false);
|
||||
|
||||
return{};
|
||||
}
|
||||
|
||||
unsigned textbox::line_pixels() const
|
||||
{
|
||||
internal_scope_guard lock;
|
||||
auto editor = get_drawer_trigger().editor();
|
||||
return (editor ? editor->line_height() : 0);
|
||||
}
|
||||
|
||||
//Override _m_caption for caption()
|
||||
nana::string textbox::_m_caption() const throw()
|
||||
{
|
||||
@ -559,7 +624,7 @@ namespace drawerbase {
|
||||
widget::_m_typeface(font);
|
||||
auto editor = get_drawer_trigger().editor();
|
||||
if(editor)
|
||||
editor->reset_caret_height();
|
||||
editor->reset_caret_pixels();
|
||||
}
|
||||
//end class textbox
|
||||
}//end namespace nana
|
||||
|
@ -1491,7 +1491,60 @@ namespace nana
|
||||
impl_->data.trigger_ptr = this;
|
||||
impl_->data.renderer = nana::pat::cloneable<renderer_interface>(internal_renderer());
|
||||
impl_->data.comp_placer = nana::pat::cloneable<compset_placer_interface>(internal_placer());
|
||||
impl_->adjust.timer.elapse(std::bind(&trigger::_m_deal_adjust, this));
|
||||
|
||||
impl_->adjust.timer.elapse([this]
|
||||
{
|
||||
auto & adjust = impl_->adjust;
|
||||
if (adjust.scroll_timestamp && (nana::system::timestamp() - adjust.scroll_timestamp >= 500))
|
||||
{
|
||||
if (0 == adjust.offset_x_adjust)
|
||||
{
|
||||
if (!impl_->make_adjust(adjust.node ? adjust.node : impl_->shape.first, 1))
|
||||
{
|
||||
adjust.offset_x_adjust = 0;
|
||||
adjust.node = nullptr;
|
||||
adjust.scroll_timestamp = 0;
|
||||
adjust.timer.stop();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
auto & shape = impl_->shape;
|
||||
const int delta = 5;
|
||||
int old = shape.offset_x;
|
||||
|
||||
if (shape.offset_x < adjust.offset_x_adjust)
|
||||
{
|
||||
shape.offset_x += delta;
|
||||
if (shape.offset_x > adjust.offset_x_adjust)
|
||||
shape.offset_x = adjust.offset_x_adjust;
|
||||
}
|
||||
else if (shape.offset_x > adjust.offset_x_adjust)
|
||||
{
|
||||
shape.offset_x -= delta;
|
||||
if (shape.offset_x < adjust.offset_x_adjust)
|
||||
shape.offset_x = adjust.offset_x_adjust;
|
||||
}
|
||||
|
||||
impl_->draw(false);
|
||||
API::update_window(impl_->data.widget_ptr->handle());
|
||||
|
||||
if (impl_->node_state.tooltip)
|
||||
{
|
||||
nana::point pos = impl_->node_state.tooltip->pos();
|
||||
impl_->node_state.tooltip->move(pos.x - shape.offset_x + old, pos.y);
|
||||
}
|
||||
|
||||
if (shape.offset_x == adjust.offset_x_adjust)
|
||||
{
|
||||
adjust.offset_x_adjust = 0;
|
||||
adjust.node = nullptr;
|
||||
adjust.scroll_timestamp = 0;
|
||||
adjust.timer.stop();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
impl_->adjust.timer.interval(16);
|
||||
impl_->adjust.timer.start();
|
||||
}
|
||||
@ -2098,59 +2151,6 @@ namespace nana
|
||||
API::lazy_refresh();
|
||||
}
|
||||
}
|
||||
|
||||
void trigger::_m_deal_adjust()
|
||||
{
|
||||
auto & adjust = impl_->adjust;
|
||||
if(adjust.scroll_timestamp && (nana::system::timestamp() - adjust.scroll_timestamp >= 500))
|
||||
{
|
||||
if(adjust.offset_x_adjust == 0)
|
||||
{
|
||||
if(!impl_->make_adjust(adjust.node ? adjust.node : impl_->shape.first, 1))
|
||||
{
|
||||
adjust.offset_x_adjust = 0;
|
||||
adjust.node = nullptr;
|
||||
adjust.scroll_timestamp = 0;
|
||||
adjust.timer.stop();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
auto & shape = impl_->shape;
|
||||
const int delta = 5;
|
||||
int old = shape.offset_x;
|
||||
|
||||
if(shape.offset_x < adjust.offset_x_adjust)
|
||||
{
|
||||
shape.offset_x += delta;
|
||||
if(shape.offset_x > adjust.offset_x_adjust)
|
||||
shape.offset_x = adjust.offset_x_adjust;
|
||||
}
|
||||
else if(shape.offset_x > adjust.offset_x_adjust)
|
||||
{
|
||||
shape.offset_x -= delta;
|
||||
if(shape.offset_x < adjust.offset_x_adjust)
|
||||
shape.offset_x = adjust.offset_x_adjust;
|
||||
}
|
||||
|
||||
impl_->draw(false);
|
||||
API::update_window(impl_->data.widget_ptr->handle());
|
||||
|
||||
if(impl_->node_state.tooltip)
|
||||
{
|
||||
nana::point pos = impl_->node_state.tooltip->pos();
|
||||
impl_->node_state.tooltip->move(pos.x - shape.offset_x + old, pos.y);
|
||||
}
|
||||
|
||||
if(shape.offset_x == adjust.offset_x_adjust)
|
||||
{
|
||||
adjust.offset_x_adjust = 0;
|
||||
adjust.node = nullptr;
|
||||
adjust.scroll_timestamp = 0;
|
||||
adjust.timer.stop();
|
||||
}
|
||||
}
|
||||
}
|
||||
//end class trigger
|
||||
}//end namespace treebox
|
||||
}//end namespace drawerbase
|
||||
|
@ -305,7 +305,7 @@ namespace nana
|
||||
|
||||
void widget::_m_move(int x, int y)
|
||||
{
|
||||
API::move_window(handle(), x, y);
|
||||
API::move_window(handle(), { x, y });
|
||||
}
|
||||
|
||||
void widget::_m_move(const rectangle& r)
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Nana GUI Library Definition
|
||||
* Copyright(C) 2003-2013 Jinhao(cnjinhao@hotmail.com)
|
||||
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
|
||||
*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
@ -12,9 +12,17 @@
|
||||
*/
|
||||
|
||||
#include <nana/gui/wvl.hpp>
|
||||
|
||||
#include <nana/gui/detail/bedrock.hpp>
|
||||
namespace nana
|
||||
{
|
||||
namespace detail
|
||||
{
|
||||
void form_loader_private::insert_form(::nana::widget* p)
|
||||
{
|
||||
bedrock::instance().manage_form_loader(reinterpret_cast<basic_window*>(p->handle()), true);
|
||||
}
|
||||
}
|
||||
|
||||
void exec()
|
||||
{
|
||||
detail::bedrock::instance().pump_event(nullptr, false);
|
||||
|
@ -16,6 +16,8 @@
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <map>
|
||||
|
||||
namespace nana
|
||||
{
|
||||
|
@ -13,7 +13,8 @@
|
||||
#ifndef NANA_PAINT_DETAIL_IMAGE_BMP_HPP
|
||||
#define NANA_PAINT_DETAIL_IMAGE_BMP_HPP
|
||||
|
||||
#include <nana/paint/detail/image_impl_interface.hpp>
|
||||
#include "image_pixbuf.hpp"
|
||||
|
||||
#include <memory>
|
||||
|
||||
namespace nana{ namespace paint
|
||||
@ -65,7 +66,7 @@ namespace nana{ namespace paint
|
||||
#endif
|
||||
|
||||
class image_bmp
|
||||
:public image::image_impl_interface
|
||||
:public basic_image_pixbuf
|
||||
{
|
||||
public:
|
||||
image_bmp(){}
|
||||
@ -340,35 +341,6 @@ namespace nana{ namespace paint
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool empty() const override
|
||||
{
|
||||
return pixbuf_.empty();
|
||||
}
|
||||
|
||||
void close() override
|
||||
{
|
||||
pixbuf_.close();
|
||||
}
|
||||
|
||||
nana::size size() const override
|
||||
{
|
||||
return pixbuf_.size();
|
||||
}
|
||||
|
||||
void paste(const nana::rectangle& src_r, graph_reference graph, const point& p_dst) const override
|
||||
{
|
||||
if(graph && pixbuf_)
|
||||
pixbuf_.paste(src_r, graph.handle(), p_dst);
|
||||
}
|
||||
|
||||
void stretch(const nana::rectangle& src_r, graph_reference graph, const nana::rectangle& r) const override
|
||||
{
|
||||
if(graph && pixbuf_)
|
||||
pixbuf_.stretch(src_r, graph.handle(), r);
|
||||
}
|
||||
private:
|
||||
nana::paint::pixel_buffer pixbuf_;
|
||||
};//end class bmpfile
|
||||
}//end namespace detail
|
||||
}//end namespace paint
|
||||
|
96
source/paint/detail/image_jpeg.hpp
Normal file
96
source/paint/detail/image_jpeg.hpp
Normal file
@ -0,0 +1,96 @@
|
||||
#ifndef NANA_PAINT_DETAIL_IMAGE_JPEG_HPP
|
||||
#define NANA_PAINT_DETAIL_IMAGE_JPEG_HPP
|
||||
|
||||
#include "image_pixbuf.hpp"
|
||||
|
||||
//Separate the libpng from the package that system provides.
|
||||
#if defined(NANA_LIBJPEG)
|
||||
#include <nana_extrlib/jpeglib.h>
|
||||
#else
|
||||
#include <jpeglib.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <csetjmp>
|
||||
|
||||
namespace nana
|
||||
{
|
||||
namespace paint{ namespace detail{
|
||||
|
||||
class image_jpeg
|
||||
: public basic_image_pixbuf
|
||||
{
|
||||
struct error_mgr
|
||||
{
|
||||
struct ::jpeg_error_mgr pub;
|
||||
std::jmp_buf setjmp_buf;
|
||||
};
|
||||
public:
|
||||
bool open(const nana::char_t* jpeg_file) override
|
||||
{
|
||||
#ifdef NANA_UNICODE
|
||||
FILE * fp = ::fopen(static_cast<std::string>(nana::charset(jpeg_file)).c_str(), "rb");
|
||||
#else
|
||||
FILE* fp = ::fopen(jpeg_file, "rb");
|
||||
#endif
|
||||
if(nullptr == fp) return false;
|
||||
|
||||
bool is_opened = false;
|
||||
|
||||
struct ::jpeg_decompress_struct jdstru;
|
||||
error_mgr jerr;
|
||||
|
||||
jdstru.err = ::jpeg_std_error(&jerr.pub);
|
||||
jerr.pub.error_exit = _m_error_handler;
|
||||
|
||||
if (!setjmp(jerr.setjmp_buf))
|
||||
{
|
||||
::jpeg_create_decompress(&jdstru);
|
||||
|
||||
::jpeg_stdio_src(&jdstru, fp);
|
||||
|
||||
::jpeg_read_header(&jdstru, true); //Reject a tables-only JPEG file as an error
|
||||
|
||||
::jpeg_start_decompress(&jdstru);
|
||||
|
||||
//JSAMPLEs per row in output buffer
|
||||
auto row_stride = jdstru.output_width * jdstru.output_components;
|
||||
|
||||
pixbuf_.open(jdstru.output_width, jdstru.output_height);
|
||||
|
||||
auto row_buf = jdstru.mem->alloc_sarray(reinterpret_cast<j_common_ptr>(&jdstru), JPOOL_IMAGE, row_stride, 1);
|
||||
|
||||
while (jdstru.output_scanline < jdstru.output_height)
|
||||
{
|
||||
::jpeg_read_scanlines(&jdstru, row_buf, 1);
|
||||
|
||||
pixbuf_.fill_row(jdstru.output_scanline - 1, reinterpret_cast<unsigned char*>(*row_buf), row_stride, jdstru.output_components * 8);
|
||||
}
|
||||
|
||||
jpeg_finish_decompress(&jdstru);
|
||||
}
|
||||
|
||||
::jpeg_destroy_decompress(&jdstru);
|
||||
::fclose(fp);
|
||||
return is_opened;
|
||||
}
|
||||
|
||||
bool open(const void* data, std::size_t bytes) override
|
||||
{
|
||||
throw std::logic_error("JPEG is not supported for raw data buffer");
|
||||
return false;
|
||||
}
|
||||
private:
|
||||
static void _m_error_handler(::j_common_ptr jdstru)
|
||||
{
|
||||
auto err_ptr = reinterpret_cast<error_mgr*>(jdstru->err);
|
||||
|
||||
err_ptr->pub.output_message(jdstru);
|
||||
longjmp(err_ptr->setjmp_buf, 1);
|
||||
}
|
||||
};
|
||||
}//end namespace detail
|
||||
}//end namespace paint
|
||||
}//end namespace nana
|
||||
|
||||
#endif
|
63
source/paint/detail/image_pixbuf.hpp
Normal file
63
source/paint/detail/image_pixbuf.hpp
Normal file
@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Basic Image PixelBuffer Implementation
|
||||
* Nana C++ Library(http://www.nanapro.org)
|
||||
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
|
||||
*
|
||||
* Distributed under the Boost Software License, Version 1.0.
|
||||
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
* @file: nana/paint/detail/image_pixbuf.hpp
|
||||
*/
|
||||
|
||||
#ifndef NANA_PAINT_DETAIL_IMAGE_PIXBUF_HPP
|
||||
#define NANA_PAINT_DETAIL_IMAGE_PIXBUF_HPP
|
||||
|
||||
#include <nana/paint/detail/image_impl_interface.hpp>
|
||||
#include <nana/paint/pixel_buffer.hpp>
|
||||
|
||||
namespace nana
|
||||
{
|
||||
namespace paint{ namespace detail{
|
||||
|
||||
class basic_image_pixbuf
|
||||
: public image::image_impl_interface
|
||||
{
|
||||
public:
|
||||
bool alpha_channel() const override
|
||||
{
|
||||
return pixbuf_.alpha_channel();
|
||||
}
|
||||
|
||||
bool empty() const override
|
||||
{
|
||||
return pixbuf_.empty();
|
||||
}
|
||||
|
||||
void close() override
|
||||
{
|
||||
pixbuf_.close();
|
||||
}
|
||||
|
||||
::nana::size size() const override
|
||||
{
|
||||
return pixbuf_.size();
|
||||
}
|
||||
|
||||
void paste(const ::nana::rectangle& src_r, graph_reference graph, const point& p_dst) const override
|
||||
{
|
||||
pixbuf_.paste(src_r, graph.handle(), p_dst);
|
||||
}
|
||||
|
||||
void stretch(const ::nana::rectangle& src_r, graph_reference dst, const nana::rectangle& r) const override
|
||||
{
|
||||
pixbuf_.stretch(src_r, dst.handle(), r);
|
||||
}
|
||||
protected:
|
||||
pixel_buffer pixbuf_;
|
||||
};
|
||||
}//end namespace detail
|
||||
}//end namespace paint
|
||||
}//end namespace nana
|
||||
|
||||
#endif
|
@ -1,24 +1,23 @@
|
||||
#ifndef NANA_PAINT_DETAIL_IMAGE_PNG_HPP
|
||||
#define NANA_PAINT_DETAIL_IMAGE_PNG_HPP
|
||||
|
||||
#include <nana/paint/detail/image_impl_interface.hpp>
|
||||
#include "image_pixbuf.hpp"
|
||||
|
||||
//Separate the libpng from the package that system provides.
|
||||
#if defined(NANA_LIBPNG)
|
||||
#include <nana/extrlib/png.h>
|
||||
#include <nana_extrlib/png.h>
|
||||
#else
|
||||
#include <png.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <nana/paint/pixel_buffer.hpp>
|
||||
|
||||
namespace nana
|
||||
{
|
||||
namespace paint{ namespace detail{
|
||||
|
||||
class image_png
|
||||
: public image::image_impl_interface
|
||||
: public basic_image_pixbuf
|
||||
{
|
||||
public:
|
||||
bool open(const nana::char_t* png_file) override
|
||||
@ -164,39 +163,6 @@ namespace nana
|
||||
throw std::logic_error("PNG is not supported for raw data buffer");
|
||||
return false;
|
||||
}
|
||||
|
||||
bool alpha_channel() const override
|
||||
{
|
||||
return pixbuf_.alpha_channel();
|
||||
}
|
||||
|
||||
virtual bool empty() const override
|
||||
{
|
||||
return pixbuf_.empty();
|
||||
}
|
||||
|
||||
virtual void close() override
|
||||
{
|
||||
pixbuf_.close();
|
||||
}
|
||||
|
||||
virtual nana::size size() const override
|
||||
{
|
||||
return pixbuf_.size();
|
||||
}
|
||||
|
||||
void paste(const nana::rectangle& src_r, graph_reference graph, const point& p_dst) const override
|
||||
{
|
||||
pixbuf_.paste(src_r, graph.handle(), p_dst);
|
||||
}
|
||||
|
||||
void stretch(const nana::rectangle& src_r, graph_reference dst, const nana::rectangle& r) const override
|
||||
{
|
||||
pixbuf_.stretch(src_r, dst.handle(), r);
|
||||
}
|
||||
private:
|
||||
nana::paint::pixel_buffer pixbuf_;
|
||||
|
||||
};
|
||||
}//end namespace detail
|
||||
}//end namespace paint
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user