From 85aeae5a87c378260c9aceb7207bc3474c6b85d3 Mon Sep 17 00:00:00 2001 From: sfb Date: Thu, 22 Mar 2012 14:31:07 -0500 Subject: [PATCH] merge from default --- .hgignore | 2 + code/CMakeLists.txt | 5 +- code/CMakeModules/Find3dsMaxSDK.cmake | 11 +- code/CMakeModules/FindDirectXSDK.cmake | 15 +- code/CMakeModules/FindExternal.cmake | 16 +- code/CMakeModules/FindFreeType.cmake | 9 +- code/CMakeModules/FindLibwww.cmake | 23 +- code/CMakeModules/FindMercurial.cmake | 108 + code/CMakeModules/FindWindowsSDK.cmake | 6 + code/CMakeModules/GetRevision.cmake | 59 + code/CMakeModules/PCHSupport.cmake | 131 +- code/CMakeModules/nel.cmake | 231 +- code/acinclude.m4 | 1396 ---- code/nel/CMakeLists.txt | 35 +- code/nel/Makefile.am | 46 - code/nel/acinclude.m4 | 1214 ---- code/nel/autogen.sh | 32 - code/nel/automacros/gtk-2.0.m4 | 196 - code/nel/automacros/ogg.m4 | 102 - code/nel/automacros/pkg.m4 | 157 - code/nel/automacros/vorbis.m4 | 122 - code/nel/configure.ac | 599 -- code/nel/include/Makefile.am | 10 - code/nel/include/nel/3d/Makefile.am | 343 - code/nel/include/nel/Makefile.am | 13 - code/nel/include/nel/cegui/Makefile.am | 11 - code/nel/include/nel/georges/Makefile.am | 15 - code/nel/include/nel/ligo/Makefile.am | 14 - code/nel/include/nel/misc/Makefile.am | 143 - code/nel/include/nel/misc/common.h | 2 + code/nel/include/nel/misc/eid_translator.h | 2 + code/nel/include/nel/misc/event_emitter.h | 2 +- code/nel/include/nel/net/Makefile.am | 48 - code/nel/include/nel/net/transport_class.h | 3 +- code/nel/include/nel/pacs/Makefile.am | 17 - code/nel/include/nel/sound/Makefile.am | 15 - code/nel/nel.m4 | 0 code/nel/samples/3d/Makefile.am | 11 - code/nel/samples/3d/cegui/Makefile.am | 22 - .../nel/samples/3d/cluster_viewer/Makefile.am | 24 - .../3d/cluster_viewer/fonts/Makefile.am | 12 - .../3d/cluster_viewer/groups/Makefile.am | 12 - .../3d/cluster_viewer/shapes/Makefile.am | 20 - code/nel/samples/3d/font/Makefile.am | 21 - code/nel/samples/Makefile.am | 12 - code/nel/samples/georges/Makefile.am | 24 - code/nel/samples/misc/Makefile.am | 10 - code/nel/samples/misc/command/Makefile.am | 20 - code/nel/samples/misc/configfile/Makefile.am | 23 - code/nel/samples/misc/debug/Makefile.am | 20 - code/nel/samples/misc/i18n/Makefile.am | 23 - code/nel/samples/misc/log/Makefile.am | 20 - code/nel/samples/misc/strings/Makefile.am | 20 - code/nel/samples/misc/types_check/Makefile.am | 20 - code/nel/samples/net/Makefile.am | 11 - code/nel/samples/net/chat/Makefile.am | 27 - code/nel/samples/net/login_system/Makefile.am | 30 - code/nel/samples/net/udp/Makefile.am | 32 - code/nel/samples/pacs/Makefile.am | 19 - code/nel/samples/sound_sources/Makefile.am | 23 - code/nel/src/3d/CMakeLists.txt | 5 +- code/nel/src/3d/Makefile.am | 616 -- code/nel/src/3d/driver/Makefile.am | 10 - .../nel/src/3d/driver/direct3d/CMakeLists.txt | 10 +- .../3d/driver/direct3d/driver_direct3d.cpp | 2 +- code/nel/src/3d/driver/opengl/CMakeLists.txt | 10 +- code/nel/src/3d/driver/opengl/Makefile.am | 47 - .../3d/driver/opengl/driver_opengl_light.cpp | 2 +- .../3d/driver/opengl/driver_opengl_vertex.cpp | 2 +- .../3d/driver/opengl/driver_opengl_window.cpp | 86 +- .../driver/opengl/mac/cocoa_event_emitter.cpp | 20 +- code/nel/src/3d/driver/opengl/mac/glext.h | 2 + code/nel/src/3d/nelu.cpp | 3 +- code/nel/src/3d/particle_system_shape.cpp | 16 +- code/nel/src/3d/patchdlm_context.cpp | 4 +- code/nel/src/Makefile.am | 19 - code/nel/src/Rules.mk | 56 - code/nel/src/Variables.mk | 20 - code/nel/src/cegui/CMakeLists.txt | 4 +- code/nel/src/cegui/Makefile.am | 19 - code/nel/src/gen_deps.sh | 25 - code/nel/src/georges/CMakeLists.txt | 5 +- code/nel/src/georges/Makefile.am | 34 - code/nel/src/ligo/CMakeLists.txt | 5 +- code/nel/src/ligo/Makefile.am | 36 - code/nel/src/ligo/primitive.cpp | 2 +- code/nel/src/logic/CMakeLists.txt | 4 +- code/nel/src/misc/CMakeLists.txt | 5 +- code/nel/src/misc/Makefile.am | 142 - code/nel/src/misc/common.cpp | 26 + code/nel/src/misc/config_file/Makefile.am | 21 - code/nel/src/misc/eid_translator.cpp | 11 + code/nel/src/misc/events.cpp | 2 +- code/nel/src/misc/noise_value.cpp | 13 +- code/nel/src/misc/rgba.cpp | 8 + code/nel/src/misc/win_event_emitter.cpp | 7 + code/nel/src/net/CMakeLists.txt | 5 +- code/nel/src/net/Makefile.am | 60 - code/nel/src/net/transport_class.cpp | 3 +- code/nel/src/pacs/CMakeLists.txt | 5 +- code/nel/src/pacs/Makefile.am | 69 - code/nel/src/sound/CMakeLists.txt | 5 +- code/nel/src/sound/Makefile.am | 75 - code/nel/src/sound/driver/CMakeLists.txt | 4 +- code/nel/src/sound/driver/Makefile.am | 26 - .../src/sound/driver/dsound/CMakeLists.txt | 10 +- code/nel/src/sound/driver/fmod/CMakeLists.txt | 10 +- code/nel/src/sound/driver/fmod/Makefile.am | 32 - .../src/sound/driver/openal/CMakeLists.txt | 10 +- code/nel/src/sound/driver/openal/Makefile.am | 30 - .../src/sound/driver/xaudio2/CMakeLists.txt | 10 +- code/nel/tools/3d/Makefile.am | 32 - .../tools/3d/build_coarse_mesh/Makefile.am | 21 - code/nel/tools/3d/build_far_bank/Makefile.am | 20 - code/nel/tools/3d/build_smallbank/Makefile.am | 20 - code/nel/tools/3d/ig_lighter/Makefile.am | 23 - code/nel/tools/3d/ig_lighter_lib/Makefile.am | 23 - .../nel/tools/3d/ligo/plugin_max/DllEntry.cpp | 3 + .../tools/3d/ligo/plugin_max/max_to_ligo.cpp | 7 +- code/nel/tools/3d/ligo/plugin_max/script.cpp | 31 +- .../src/3rdparty/CMakeLists.txt | 1 + .../3rdparty/qtpropertybrowser/CMakeLists.txt | 98 + .../qtpropertybrowser/LGPL_EXCEPTION.txt | 10 + .../3rdparty/qtpropertybrowser/LICENSE.GPL3 | 674 ++ .../3rdparty/qtpropertybrowser/LICENSE.LGPL | 504 ++ .../QtAbstractEditorFactoryBase | 1 + .../QtAbstractPropertyBrowser | 1 + .../QtAbstractPropertyManager | 1 + .../qtpropertybrowser/QtBoolPropertyManager | 1 + .../3rdparty/qtpropertybrowser/QtBrowserItem | 1 + .../qtpropertybrowser/QtButtonPropertyBrowser | 1 + .../qtpropertybrowser/QtCharEditorFactory | 1 + .../qtpropertybrowser/QtCharPropertyManager | 1 + .../qtpropertybrowser/QtCheckBoxFactory | 1 + .../qtpropertybrowser/QtColorEditorFactory | 1 + .../qtpropertybrowser/QtColorPropertyManager | 1 + .../qtpropertybrowser/QtCursorEditorFactory | 1 + .../qtpropertybrowser/QtCursorPropertyManager | 1 + .../qtpropertybrowser/QtDateEditFactory | 1 + .../qtpropertybrowser/QtDatePropertyManager | 1 + .../qtpropertybrowser/QtDateTimeEditFactory | 1 + .../QtDateTimePropertyManager | 1 + .../qtpropertybrowser/QtDoublePropertyManager | 1 + .../qtpropertybrowser/QtDoubleSpinBoxFactory | 1 + .../qtpropertybrowser/QtEnumEditorFactory | 1 + .../qtpropertybrowser/QtEnumPropertyManager | 1 + .../qtpropertybrowser/QtFlagPropertyManager | 1 + .../qtpropertybrowser/QtFontEditorFactory | 1 + .../qtpropertybrowser/QtFontPropertyManager | 1 + .../QtGroupBoxPropertyBrowser | 1 + .../qtpropertybrowser/QtGroupPropertyManager | 1 + .../qtpropertybrowser/QtIntPropertyManager | 1 + .../QtKeySequenceEditorFactory | 1 + .../QtKeySequencePropertyManager | 1 + .../qtpropertybrowser/QtLineEditFactory | 1 + .../qtpropertybrowser/QtLocalePropertyManager | 1 + .../qtpropertybrowser/QtPointFPropertyManager | 1 + .../qtpropertybrowser/QtPointPropertyManager | 1 + .../src/3rdparty/qtpropertybrowser/QtProperty | 1 + .../qtpropertybrowser/QtRectFPropertyManager | 1 + .../qtpropertybrowser/QtRectPropertyManager | 1 + .../qtpropertybrowser/QtScrollBarFactory | 1 + .../qtpropertybrowser/QtSizeFPropertyManager | 1 + .../QtSizePolicyPropertyManager | 1 + .../qtpropertybrowser/QtSizePropertyManager | 1 + .../qtpropertybrowser/QtSliderFactory | 1 + .../qtpropertybrowser/QtSpinBoxFactory | 1 + .../qtpropertybrowser/QtStringPropertyManager | 1 + .../qtpropertybrowser/QtTimeEditFactory | 1 + .../qtpropertybrowser/QtTimePropertyManager | 1 + .../qtpropertybrowser/QtTreePropertyBrowser | 1 + .../qtpropertybrowser/QtVariantEditorFactory | 1 + .../qtpropertybrowser/QtVariantProperty | 1 + .../QtVariantPropertyManager | 1 + .../src/3rdparty/qtpropertybrowser/README.TXT | 19 + .../qtpropertybrowser/images/cursor-arrow.png | Bin 0 -> 171 bytes .../qtpropertybrowser/images/cursor-busy.png | Bin 0 -> 201 bytes .../images/cursor-closedhand.png | Bin 0 -> 147 bytes .../qtpropertybrowser/images/cursor-cross.png | Bin 0 -> 130 bytes .../images/cursor-forbidden.png | Bin 0 -> 199 bytes .../qtpropertybrowser/images/cursor-hand.png | Bin 0 -> 159 bytes .../images/cursor-hsplit.png | Bin 0 -> 155 bytes .../qtpropertybrowser/images/cursor-ibeam.png | Bin 0 -> 124 bytes .../images/cursor-openhand.png | Bin 0 -> 160 bytes .../images/cursor-sizeall.png | Bin 0 -> 174 bytes .../qtpropertybrowser/images/cursor-sizeb.png | Bin 0 -> 161 bytes .../qtpropertybrowser/images/cursor-sizef.png | Bin 0 -> 161 bytes .../qtpropertybrowser/images/cursor-sizeh.png | Bin 0 -> 145 bytes .../qtpropertybrowser/images/cursor-sizev.png | Bin 0 -> 141 bytes .../images/cursor-uparrow.png | Bin 0 -> 132 bytes .../images/cursor-vsplit.png | Bin 0 -> 161 bytes .../qtpropertybrowser/images/cursor-wait.png | Bin 0 -> 172 bytes .../images/cursor-whatsthis.png | Bin 0 -> 191 bytes .../qtbuttonpropertybrowser.cpp | 676 ++ .../qtbuttonpropertybrowser.h | 135 + .../qtpropertybrowser/qteditorfactory.cpp | 2609 +++++++ .../qtpropertybrowser/qteditorfactory.h | 448 ++ .../qtgroupboxpropertybrowser.cpp | 578 ++ .../qtgroupboxpropertybrowser.h | 126 + .../qtpropertybrowser/qtpropertybrowser.cpp | 2053 ++++++ .../qtpropertybrowser/qtpropertybrowser.h | 379 + .../qtpropertybrowser/qtpropertybrowser.pri | 30 + .../qtpropertybrowser/qtpropertybrowser.qrc | 23 + .../qtpropertybrowserutils.cpp | 477 ++ .../qtpropertybrowserutils_p.h | 207 + .../qtpropertybrowser/qtpropertymanager.cpp | 6465 +++++++++++++++++ .../qtpropertybrowser/qtpropertymanager.h | 796 ++ .../qttreepropertybrowser.cpp | 1095 +++ .../qtpropertybrowser/qttreepropertybrowser.h | 184 + .../qtpropertybrowser/qtvariantproperty.cpp | 2329 ++++++ .../qtpropertybrowser/qtvariantproperty.h | 232 + .../3d/object_viewer_qt/src/CMakeLists.txt | 2 + .../src/extension_system/iplugin.h | 8 +- .../src/extension_system/iplugin_manager.h | 2 +- .../src/extension_system/iplugin_spec.h | 8 +- .../src/extension_system/plugin_manager.cpp | 137 +- .../src/extension_system/plugin_manager.h | 19 +- .../src/extension_system/plugin_spec.cpp | 224 +- .../src/extension_system/plugin_spec.h | 35 +- .../tools/3d/object_viewer_qt/src/main.cpp | 23 +- .../src/plugins/CMakeLists.txt | 11 +- .../src/plugins/bnp_manager/CMakeLists.txt | 47 + .../bnp_manager/bnp_dirtree_dialog.cpp | 93 + .../plugins/bnp_manager/bnp_dirtree_dialog.h | 83 + .../plugins/bnp_manager/bnp_dirtree_form.ui | 61 + .../src/plugins/bnp_manager/bnp_file.cpp | 324 + .../src/plugins/bnp_manager/bnp_file.h | 145 + .../bnp_manager/bnp_filelist_dialog.cpp | 132 + .../plugins/bnp_manager/bnp_filelist_dialog.h | 85 + .../bnp_manager/bnp_filelist_dialog.ui | 70 + .../bnp_manager/bnp_filesystem_model.cpp | 51 + .../bnp_manager/bnp_filesystem_model.h | 49 + .../src/plugins/bnp_manager/bnp_manager.qrc | 9 + .../bnp_manager/bnp_manager_constants.h | 38 + .../bnp_manager/bnp_manager_plugin.cpp | 89 + .../plugins/bnp_manager/bnp_manager_plugin.h | 130 + .../bnp_manager/bnp_manager_window.cpp | 444 ++ .../plugins/bnp_manager/bnp_manager_window.h | 156 + .../plugins/bnp_manager/bnp_manager_window.ui | 50 + .../plugins/bnp_manager/bnp_proxy_model.cpp | 56 + .../src/plugins/bnp_manager/bnp_proxy_model.h | 44 + .../bnp_manager/images/ic_nel_add_item.png | Bin 0 -> 3270 bytes .../bnp_manager/images/ic_nel_bnp_make.png | Bin 0 -> 25705 bytes .../bnp_manager/images/ic_nel_delete_item.png | Bin 0 -> 1496 bytes .../bnp_manager/images/ic_nel_export.png | Bin 0 -> 27878 bytes .../plugins/bnp_manager/images/ic_nel_new.png | Bin 0 -> 4035 bytes .../bnp_manager/images/ic_nel_reset_all.png | Bin 0 -> 30281 bytes .../bnp_manager/ovqt_plugin_bnp_manager.xml | 10 + .../src/plugins/core/CMakeLists.txt | 1 - .../src/plugins/core/context_manager.cpp | 17 + .../src/plugins/core/context_manager.h | 6 + .../src/plugins/core/core.cpp | 3 +- .../object_viewer_qt/src/plugins/core/core.h | 4 +- .../src/plugins/core/core_constants.h | 142 +- .../src/plugins/core/core_plugin.cpp | 34 +- .../src/plugins/core/core_plugin.h | 6 - .../plugins/core/general_settings_page.cpp | 38 + .../src/plugins/core/general_settings_page.h | 4 +- .../src/plugins/core/general_settings_page.ui | 40 +- .../object_viewer_qt/src/plugins/core/icore.h | 4 +- .../src/plugins/core/imenu_manager.h | 62 - .../src/plugins/core/main_window.cpp | 26 +- .../src/plugins/core/main_window.h | 8 +- .../src/plugins/core/menu_manager.cpp | 48 +- .../src/plugins/core/menu_manager.h | 40 +- .../src/plugins/core/ovqt_plugin_core.xml | 7 + .../src/plugins/core/plugin_view_dialog.cpp | 67 +- .../src/plugins/core/plugin_view_dialog.h | 27 +- .../src/plugins/core/plugin_view_dialog.ui | 20 +- .../src/plugins/core/qtwin.cpp | 6 +- .../core/search_paths_settings_page.cpp | 36 +- .../plugins/core/search_paths_settings_page.h | 10 +- .../core/search_paths_settings_page.ui | 4 +- .../src/plugins/core/settings_dialog.cpp | 78 +- .../src/plugins/core/settings_dialog.h | 24 +- .../src/plugins/core/settings_dialog.ui | 8 +- .../src/plugins/disp_sheet_id/CMakeLists.txt | 2 +- .../disp_sheet_id/disp_sheet_id_plugin.cpp | 35 +- .../disp_sheet_id/disp_sheet_id_plugin.h | 16 +- .../ovqt_plugin_disp_sheet_id.xml | 10 + .../plugins/disp_sheet_id/sheet_id_view.cpp | 4 +- .../src/plugins/example/CMakeLists.txt | 8 +- .../src/plugins/example/example_plugin.cpp | 83 + .../example/{plugin1.h => example_plugin.h} | 37 +- .../plugins/example/example_settings_page.cpp | 28 +- .../plugins/example/example_settings_page.h | 14 +- .../plugins/example/example_settings_page.ui | 4 +- .../plugins/example/ovqt_plugin_example.xml | 10 + .../src/plugins/example/plugin1.cpp | 120 - .../src/plugins/example/qnel_widget.h | 2 +- .../src/plugins/example/simple_viewer.cpp | 8 +- .../src/plugins/example/simple_viewer.h | 12 +- .../src/plugins/georges_editor/CMakeLists.txt | 10 +- .../georges_editor/expandable_headerview.cpp | 143 + .../georges_editor/expandable_headerview.h | 49 + .../plugins/georges_editor/formdelegate.cpp | 278 + .../src/plugins/georges_editor/formdelegate.h | 41 + .../src/plugins/georges_editor/formitem.cpp | 162 + .../src/plugins/georges_editor/formitem.h | 69 + .../src/plugins/georges_editor/georges.cpp | 64 + .../src/plugins/georges_editor/georges.h | 69 + .../georges_editor/georges_dirtree_dialog.cpp | 21 +- .../georges_editor/georges_dirtree_dialog.h | 2 +- .../georges_editor/georges_dirtree_form.ui | 34 +- .../georges_editor/georges_editor_form.cpp | 350 +- .../georges_editor/georges_editor_form.h | 19 +- .../georges_editor/georges_editor_form.ui | 4 + .../georges_editor/georges_editor_plugin.cpp | 28 - .../georges_editor/georges_editor_plugin.h | 7 - .../georges_filesystem_model.cpp | 69 + .../georges_editor/georges_filesystem_model.h | 69 +- .../georges_treeview_dialog.cpp | 388 + .../georges_editor/georges_treeview_dialog.h | 96 + .../georges_editor/georges_treeview_form.ui | 130 + .../georges_editor/georgesform_model.cpp | 674 ++ .../georges_editor/georgesform_model.h | 80 + .../georgesform_proxy_model.cpp | 81 + .../georges_editor/georgesform_proxy_model.h | 45 + .../ovqt_plugin_georges_editor.xml | 10 + .../landscape_editor_window.cpp | 2 - .../src/plugins/log/log_plugin.cpp | 6 +- .../src/plugins/log/ovqt_plugin_log.xml | 10 + .../plugins/mission_compiler/CMakeLists.txt | 49 + .../mission_compiler/images/arrow-left-2.png | Bin 0 -> 1512 bytes .../images/arrow-left-double-2.png | Bin 0 -> 1893 bytes .../mission_compiler/images/arrow-right-2.png | Bin 0 -> 1478 bytes .../images/arrow-right-double-2.png | Bin 0 -> 1899 bytes .../images/document-export-4.png | Bin 0 -> 1604 bytes .../images/ic_nel_add_item.png | Bin 0 -> 3270 bytes .../images/ic_nel_delete_item.png | Bin 0 -> 1496 bytes .../images/ic_nel_down_item.png | Bin 0 -> 3812 bytes .../images/ic_nel_generic_settings.png | Bin 0 -> 5633 bytes .../images/ic_nel_reset_all.png | Bin 0 -> 5938 bytes .../images/ic_nel_up_item.png | Bin 0 -> 3304 bytes .../images/news-subscribe-2.png | Bin 0 -> 1805 bytes .../mission_compiler/images/run-build-2.png | Bin 0 -> 2228 bytes .../mission_compiler/mission_compiler.qrc | 17 + .../mission_compiler_main_window.cpp | 510 ++ .../mission_compiler_main_window.h | 75 + .../mission_compiler_main_window.ui | 374 + .../mission_compiler_plugin.cpp | 76 + .../mission_compiler_plugin.h | 91 + .../mission_compiler_plugin_constants.h | 17 + .../mission_compiler_settings_page.cpp | 203 + .../mission_compiler_settings_page.h | 68 + .../mission_compiler_settings_page.ui | 210 + .../ovqt_plugin_mission_compiler.xml | 10 + .../mission_compiler/server_entry_dialog.cpp | 89 + .../mission_compiler/server_entry_dialog.h | 59 + .../mission_compiler/server_entry_dialog.ui | 130 + .../mission_compiler/validation_file.cpp | 133 + .../mission_compiler/validation_file.h | 51 + .../src/plugins/object_viewer/attrib_form.ui | 2 +- .../plugins/object_viewer/attrib_widget.cpp | 11 +- .../src/plugins/object_viewer/attrib_widget.h | 3 +- .../src/plugins/object_viewer/bin_op_dialog.h | 2 +- .../src/plugins/object_viewer/entity.h | 2 +- .../object_viewer/graphics_viewport.cpp | 6 +- .../plugins/object_viewer/graphics_viewport.h | 2 +- .../src/plugins/object_viewer/hoverpoints.cpp | 2 +- .../object_viewer/icons/ic_nel_pill.png | Bin 0 -> 9291 bytes .../src/plugins/object_viewer/main_window.cpp | 4 +- .../object_viewer/morph_mesh_dialog.cpp | 2 +- .../plugins/object_viewer/object_viewer.cpp | 2 +- .../src/plugins/object_viewer/object_viewer.h | 2 +- .../plugins/object_viewer/object_viewer.qrc | 1 + .../object_viewer/object_viewer_constants.h | 124 +- .../object_viewer/object_viewer_plugin.cpp | 27 - .../object_viewer/object_viewer_plugin.h | 9 +- .../ovqt_plugin_object_viewer.xml | 10 + .../plugins/object_viewer/particle_editor.cpp | 3 + .../object_viewer/particle_force_page.h | 2 +- .../plugins/object_viewer/particle_node.cpp | 1 + .../src/plugins/object_viewer/particle_node.h | 2 +- .../object_viewer/particle_tree_model.cpp | 4 +- .../particle_workspace_dialog.cpp | 11 +- .../object_viewer/particle_workspace_dialog.h | 2 +- .../src/plugins/object_viewer/ps_mover_page.h | 2 +- .../object_viewer/scheme_bank_dialog.cpp | 149 +- .../object_viewer/scheme_bank_dialog.h | 57 +- .../plugins/object_viewer/scheme_bank_form.ui | 36 +- .../plugins/object_viewer/scheme_manager.cpp | 26 +- .../plugins/object_viewer/scheme_manager.h | 9 +- .../plugins/object_viewer/sound_system.cpp | 5 +- .../src/plugins/object_viewer/sound_system.h | 8 +- .../vegetable_appearance_page.cpp | 2 +- .../plugins/object_viewer/workspace_form.ui | 96 +- .../ovqt_plugin_sheet_builder.xml | 10 + .../ovqt_sheet_builder/ovqt_sheet_builder.cpp | 35 +- .../ovqt_sheet_builder/ovqt_sheet_builder.h | 16 +- .../plugins/ovqt_sheet_builder/sheetbuilder.h | 8 +- .../ovqt_sheet_builder/sheetbuilderdialog.cpp | 2 +- .../translation_manager/CMakeLists.txt | 51 + .../src/plugins/translation_manager/README | 6 +- .../translation_manager/editor_phrase.cpp | 134 + .../translation_manager/editor_phrase.h | 200 + .../translation_manager/editor_worksheet.cpp | 526 ++ .../translation_manager/editor_worksheet.h | 216 + .../translation_manager/extract_bot_names.cpp | 366 + .../translation_manager/extract_bot_names.h | 99 + .../extract_new_sheet_names.cpp | 150 + .../extract_new_sheet_names.h | 63 + .../translation_manager/ftp_selection.cpp | 216 + .../translation_manager/ftp_selection.h | 50 + .../translation_manager/ftp_selection.qrc | 7 + .../translation_manager/ftp_selection.ui | 120 + .../translation_manager/images/cdtoparent.png | Bin 0 -> 139 bytes .../translation_manager/images/dir.png | Bin 0 -> 154 bytes .../translation_manager/images/file.png | Bin 0 -> 129 bytes .../ovqt_plugin_translation_manager.xml | 10 + .../translation_manager/source_selection.cpp | 60 + .../translation_manager/source_selection.h | 54 + .../translation_manager/source_selection.ui | 60 + .../translation_manager_constants.h | 39 + .../translation_manager_editor.h | 71 + .../translation_manager_main_window.cpp | 654 ++ .../translation_manager_main_window.h | 129 + .../translation_manager_main_window.ui | 48 + .../translation_manager_plugin.cpp | 89 + .../translation_manager_plugin.h | 113 + .../translation_manager_settings_page.cpp | 203 + .../translation_manager_settings_page.h | 62 + .../translation_manager_settings_page.ui | 160 + .../zone_painter/ovqt_plugin_zone_painter.xml | 10 + .../zone_painter/zone_painter_main_window.cpp | 3 +- .../zone_painter/zone_painter_model.cpp | 40 + .../plugins/zone_painter/zone_painter_model.h | 42 + .../zone_painter/zone_painter_plugin.cpp | 98 +- .../zone_painter/zone_painter_plugin.h | 27 +- code/nel/tools/3d/panoply_maker/Makefile.am | 24 - .../3d/plugin_max/nel_export/DllEntry.cpp | 4 +- .../nel_export/nel_export_script.cpp | 7 +- .../tools/3d/plugin_max/nel_export/std_afx.h | 31 +- .../tools/3d/plugin_max/nel_mesh_lib/StdAfx.h | 7 +- .../3d/plugin_max/nel_mesh_lib/calc_lm.cpp | 42 +- .../plugin_max/nel_mesh_lib/export_misc.cpp | 4 + .../nel_mesh_lib/export_particle_system.cpp | 2 +- .../plugin_max/nel_mesh_lib/export_scene.cpp | 16 +- .../plugin_max/nel_mesh_lib/export_script.cpp | 10 +- .../nel_patch_converter/DllEntry.cpp | 3 + .../plugin_max/nel_patch_converter/script.cpp | 40 +- .../3d/plugin_max/nel_patch_edit/np_mods.cpp | 4 + .../3d/plugin_max/nel_patch_lib/rpo2nel.cpp | 7 +- .../plugin_max/nel_patch_paint/DllEntry.cpp | 3 + .../nel_patch_paint/nel_patch_paint.h | 7 +- .../nel_vertex_tree_paint/dllmain.cpp | 4 +- .../3d/plugin_max/tile_utility/DllEntry.cpp | 3 + .../tools/3d/zone_dependencies/Makefile.am | 22 - code/nel/tools/3d/zone_ig_lighter/Makefile.am | 21 - code/nel/tools/3d/zone_lib/Makefile.am | 20 - code/nel/tools/3d/zone_lighter/Makefile.am | 22 - code/nel/tools/3d/zone_welder/Makefile.am | 22 - code/nel/tools/Makefile.am | 11 - code/nel/tools/build_gamedata/0_setup.py | 537 +- code/nel/tools/build_gamedata/1_export.py | 55 +- code/nel/tools/build_gamedata/2_build.py | 55 +- code/nel/tools/build_gamedata/3_install.py | 55 +- .../tools/build_gamedata/6_client_patch.py | 106 +- .../tools/build_gamedata/7_client_install.py | 63 +- code/nel/tools/build_gamedata/8_upload.py | 181 + .../build_gamedata/configuration/tools.py | 6 +- .../max_exporter_scripts/pacs_prim.py | 11 +- .../generators/max_exporter_scripts/shape.ms | 33 +- .../export_footer.ms | 4 +- .../tools/build_gamedata/interface_dev.bat | 4 + .../tools/build_gamedata/leveldesign_dev.bat | 4 + .../tools/build_gamedata/processes/0_setup.py | 40 +- .../build_gamedata/processes/1_export.py | 39 +- .../tools/build_gamedata/processes/2_build.py | 39 +- .../build_gamedata/processes/3_install.py | 39 +- .../build_gamedata/processes/anim/1_export.py | 2 +- .../processes/anim/maxscript/anim_export.ms | 4 +- .../processes/clodbank/1_export.py | 2 +- .../clodbank/maxscript/clod_export.ms | 4 +- .../processes/ig/maxscript/ig_export.ms | 4 +- .../processes/pacs_prim/1_export.py | 13 +- .../processes/pacs_prim_list/0_setup.py | 58 + .../processes/pacs_prim_list/1_export.py | 53 + .../processes/pacs_prim_list/2_build.py | 63 + .../processes/pacs_prim_list/3_install.py | 52 + .../processes/rbank/1_export.py | 2 +- .../processes/rbank/maxscript/cmb_export.ms | 4 +- .../processes/shape/maxscript/shape_export.ms | 37 +- .../processes/sheet_id/2_build.py | 2 +- .../processes/sheets/2_build.py | 2 + .../processes/sheets/3_install.py | 1 + .../build_gamedata/processes/skel/1_export.py | 2 +- .../build_gamedata/processes/swt/1_export.py | 2 +- .../processes/veget/1_export.py | 2 +- .../processes/veget/maxscript/veget_export.ms | 4 +- .../build_gamedata/processes/zone/1_export.py | 2 +- code/nel/tools/misc/Makefile.am | 13 - code/nel/tools/misc/bnp_make/Makefile.am | 19 - code/nel/tools/misc/disp_sheet_id/Makefile.am | 19 - code/nel/tools/misc/make_sheet_id/Makefile.am | 19 - code/nel/tools/misc/xml_packer/Makefile.am | 18 - code/nel/tools/pacs/Makefile.am | 10 - .../nel/tools/pacs/build_ig_boxes/Makefile.am | 21 - .../tools/pacs/build_indoor_rbank/Makefile.am | 20 - code/nel/tools/pacs/build_rbank/Makefile.am | 23 - code/nel/tools/sound/CMakeLists.txt | 5 + .../sound/build_samplebank/CMakeLists.txt | 13 + .../tools/sound/build_sound/CMakeLists.txt | 13 + .../sound/build_soundbank/CMakeLists.txt | 13 + code/nelns/CMakeLists.txt | 28 +- code/nelns/Makefile.am | 23 - code/nelns/acinclude.m4 | 1217 ---- code/nelns/admin_executor_service/Makefile.am | 25 - .../admin_executor_service/log_report.cpp | 1161 +-- code/nelns/admin_service/Makefile.am | 24 - code/nelns/autogen.sh | 15 - code/nelns/automacros/mysql.m4 | 101 - code/nelns/configure.ac | 186 - code/nelns/login_service/Makefile.am | 33 - .../nel_launcher_qt/CMakeLists.txt | 78 +- code/nelns/naming_service/Makefile.am | 22 - code/nelns/welcome_service/Makefile.am | 23 - code/revision.h.in | 7 + code/ryzom/Makefile | 37 - code/ryzom/Rules.mk | 64 - code/ryzom/Variables.mk | 33 - code/ryzom/client/CMakeLists.txt | 4 +- code/ryzom/client/Makefile | 18 - code/ryzom/client/client_default.cfg | 23 +- code/ryzom/client/client_default.cfg.in | 23 +- .../new_texture_interfaces_dxtc.tga | Bin 4194322 -> 4194322 bytes .../new_texture_interfaces_dxtc.txt | 1282 ++-- .../gamedev/adds/sfx/marauder_teleporter.ps | Bin 0 -> 3974 bytes .../GE_HOF_caster_pvp_pantabottes.shape | Bin 0 -> 60202 bytes .../GE_HOM_caster_pvp_pantabottes.shape | Bin 0 -> 74810 bytes .../adds/shapes/GE_pvp_big_shield.shape | Bin 0 -> 10202 bytes .../data/gamedev/adds/shapes/tp_diamand.shape | Bin 0 -> 4863 bytes .../data/gamedev/adds/shapes/tp_socle.shape | Bin 0 -> 12573 bytes .../adds/textures/event_refday_yber.tga | Bin 0 -> 887686 bytes .../gamedev/adds/textures/gn_pvp_dress.tga | Bin 0 -> 1048620 bytes .../adds/textures/gn_pvp_dress_hof.tga | Bin 0 -> 1048620 bytes .../adds/textures/ul_mission_hall_of_fame.dds | Bin 0 -> 1048704 bytes .../data/gamedev/interfaces_v3/commands.xml | 11 +- .../data/gamedev/interfaces_v3/config.xml | 65 +- .../gamedev/interfaces_v3/encyclopedia.xml | 2 +- .../gamedev/interfaces_v3/game_config.xml | 178 +- .../data/gamedev/interfaces_v3/guild.xml | 53 +- .../gamedev/interfaces_v3/info_player.lua | 134 +- .../gamedev/interfaces_v3/info_player.xml | 278 +- .../gamedev/interfaces_v3/interaction.xml | 28 +- .../data/gamedev/interfaces_v3/interface.txt | 1 + .../gamedev/interfaces_v3/out_v2_select.xml | 16 +- .../gamedev/interfaces_v3/out_v2_widgets.xml | 2 +- .../data/gamedev/interfaces_v3/player.lua | 41 +- .../data/gamedev/interfaces_v3/player.xml | 14 +- .../gamedev/interfaces_v3/player_trade.xml | 58 +- .../data/gamedev/interfaces_v3/reset.xml | 6 + .../interfaces_v3/texture_interfaces_v3.tga | Bin 2117952 -> 4194322 bytes .../interfaces_v3/texture_interfaces_v3.txt | 1145 +++ .../data/gamedev/interfaces_v3/webig.lua | 190 + .../gamedev/interfaces_v3/webig_widgets.xml | 120 + .../data/gamedev/interfaces_v3/widgets.xml | 129 +- code/ryzom/client/src/CMakeLists.txt | 8 +- code/ryzom/client/src/Makefile | 79 - code/ryzom/client/src/app_bundle_utils.cpp | 1 + code/ryzom/client/src/cdb_branch.cpp | 2 +- code/ryzom/client/src/cdb_branch.h | 2 +- code/ryzom/client/src/character_cl.cpp | 88 +- code/ryzom/client/src/character_cl.h | 55 +- code/ryzom/client/src/client.cpp | 15 +- code/ryzom/client/src/client_cfg.cpp | 20 +- code/ryzom/client/src/client_cfg.h | 9 +- code/ryzom/client/src/client_chat_manager.cpp | 61 +- .../client/src/client_sheets/CMakeLists.txt | 4 +- code/ryzom/client/src/client_sheets/Makefile | 37 - code/ryzom/client/src/commands.cpp | 39 +- code/ryzom/client/src/connection.cpp | 35 +- code/ryzom/client/src/cursor_functions.cpp | 3 + code/ryzom/client/src/entity_cl.cpp | 76 +- code/ryzom/client/src/entity_cl.h | 27 +- code/ryzom/client/src/init.cpp | 32 +- .../src/interface_v3/action_handler_game.cpp | 5 +- .../src/interface_v3/action_handler_help.cpp | 66 +- .../src/interface_v3/action_handler_help.h | 9 + .../src/interface_v3/action_handler_item.cpp | 140 +- .../src/interface_v3/action_handler_ui.cpp | 2 +- .../src/interface_v3/action_phrase_faber.cpp | 103 +- .../src/interface_v3/action_phrase_faber.h | 5 +- .../src/interface_v3/bot_chat_page_trade.cpp | 17 +- .../client/src/interface_v3/chat_filter.cpp | 2 +- .../src/interface_v3/chat_text_manager.cpp | 27 +- .../client/src/interface_v3/chat_window.cpp | 26 +- .../ryzom/client/src/interface_v3/ctrl_base.h | 2 + .../src/interface_v3/ctrl_base_button.h | 2 + .../client/src/interface_v3/ctrl_button.cpp | 9 +- .../client/src/interface_v3/dbctrl_sheet.cpp | 178 +- .../client/src/interface_v3/dbctrl_sheet.h | 30 + .../interface_v3/dbgroup_list_sheet_trade.cpp | 25 +- .../client/src/interface_v3/dbview_number.cpp | 28 +- .../client/src/interface_v3/group_compas.cpp | 10 + .../client/src/interface_v3/group_html.cpp | 542 +- .../client/src/interface_v3/group_html.h | 46 +- .../client/src/interface_v3/group_html_cs.cpp | 14 +- .../client/src/interface_v3/group_html_cs.h | 4 +- .../src/interface_v3/group_html_forum.cpp | 11 +- .../src/interface_v3/group_html_forum.h | 4 +- .../src/interface_v3/group_html_mail.cpp | 11 +- .../client/src/interface_v3/group_html_mail.h | 4 +- .../src/interface_v3/group_html_webig.cpp | 153 +- .../src/interface_v3/group_html_webig.h | 30 +- .../interface_v3/group_in_scene_bubble.cpp | 126 + .../src/interface_v3/group_in_scene_bubble.h | 3 + .../interface_v3/group_in_scene_user_info.cpp | 209 +- .../client/src/interface_v3/group_table.cpp | 97 +- .../client/src/interface_v3/group_table.h | 11 + .../client/src/interface_v3/guild_manager.cpp | 67 +- .../client/src/interface_v3/interface_group.h | 18 +- .../src/interface_v3/interface_manager.cpp | 49 +- .../src/interface_v3/interface_manager.h | 1 + .../src/interface_v3/interface_parser.cpp | 22 +- .../src/interface_v3/inventory_manager.cpp | 80 +- .../src/interface_v3/inventory_manager.h | 17 +- .../ryzom/client/src/interface_v3/lua_ihm.cpp | 406 +- code/ryzom/client/src/interface_v3/lua_ihm.h | 53 +- .../src/interface_v3/people_interraction.cpp | 87 +- .../client/src/interface_v3/people_list.cpp | 30 +- .../client/src/interface_v3/player_trade.cpp | 1 + .../client/src/interface_v3/skill_manager.cpp | 2 +- .../ryzom/client/src/interface_v3/view_base.h | 4 + .../client/src/interface_v3/view_bitmap.h | 2 + .../client/src/interface_v3/view_link.cpp | 18 + .../ryzom/client/src/interface_v3/view_link.h | 3 + .../client/src/interface_v3/view_pointer.cpp | 82 +- .../client/src/interface_v3/view_pointer.h | 1 + .../client/src/interface_v3/view_renderer.cpp | 9 +- .../client/src/interface_v3/view_renderer.h | 1 + code/ryzom/client/src/libwww.cpp | 9 +- code/ryzom/client/src/libwww.h | 7 +- code/ryzom/client/src/login.cpp | 20 +- code/ryzom/client/src/main_loop.cpp | 3 + code/ryzom/client/src/net_manager.cpp | 16 +- code/ryzom/client/src/player_cl.cpp | 189 +- code/ryzom/client/src/r2/editor.cpp | 2 +- .../ryzom/client/src/seven_zip/CMakeLists.txt | 6 +- code/ryzom/client/src/seven_zip/Makefile | 38 - .../client/src/string_manager_client.cpp | 50 +- code/ryzom/client/src/string_manager_client.h | 8 +- code/ryzom/client/src/user_entity.cpp | 47 +- code/ryzom/client/src/user_entity.h | 10 + code/ryzom/client/unix/CMakeLists.txt | 9 +- code/ryzom/client/unix/ryzom.xpm | 1313 ++++ code/ryzom/client/unix/ryzom_128x128.png | Bin 0 -> 37774 bytes code/ryzom/client/unix/ryzom_16x16.png | Bin 0 -> 1018 bytes code/ryzom/client/unix/ryzom_22x22.png | Bin 0 -> 1684 bytes code/ryzom/client/unix/ryzom_24x24.png | Bin 0 -> 1988 bytes code/ryzom/client/unix/ryzom_32x32.png | Bin 0 -> 3022 bytes code/ryzom/client/unix/ryzom_48x48.png | Bin 0 -> 6266 bytes code/ryzom/common/Makefile | 29 - code/ryzom/common/data_common/visual_slot.tab | Bin 9804 -> 0 bytes .../Game_elem/Building/guard_tower.building | 12 + .../Game_elem/Pacts/pacts.death_impact | 9 + .../Flora_template/forest/FO_type_01_b.flora | 136 + .../Flora_template/forest/FO_type_04_b.flora | 147 + .../Flora_template/lacustre/tr_palmtree.flora | 148 + .../forest/FX/FX_Fo-Ju-ColibrisB.plant | 64 + .../ecosystem/forest/FX/FX_Fo-SolBirthA.plant | 87 + .../ecosystem/forest/FX/FX_Fo-bugsA.plant | 61 + .../ecosystem/forest/FX/FX_Fo-bugsB.plant | 61 + .../ecosystem/forest/FX/FX_Fo-bugsC.plant | 61 + .../ecosystem/forest/FX/FX_Fo_Fishes.plant | 159 + .../forest/common/FO_S2_bigroot_A.plant | 39 + .../forest/common/FO_S2_bigroot_B.plant | 38 + .../forest/common/FO_S2_bigroot_C.plant | 40 + .../ecosystem/forest/common/FO_S2_birch.plant | 40 + .../forest/common/FO_S2_spiketree.plant | 26 + .../forest/common/Fo_s1_giant_tree.plant | 69 + .../forest/common/fo_S3_champignou_A.plant | 33 + .../forest/common/fo_S3_champignou_B.plant | 35 + .../forest/common/fo_s1_arbreagrelot.plant | 55 + .../forest/common/fo_s2_arbragrelot.plant | 53 + .../lacustre/common/tr_s2_bamboo_a.plant | 21 + .../lacustre/common/tr_s2_palmtree_a.plant | 21 + .../lacustre/common/tr_s2_palmtree_b.plant | 21 + .../lacustre/common/tr_s2_palmtree_c.plant | 21 + .../lacustre/common/tr_s2_palmtree_d.plant | 22 + .../lacustre/common/tr_s2_palmtree_e.plant | 23 + .../lacustre/common/tr_s2_palmtree_f.plant | 22 + .../anim/fx/auras.id_to_string_array | 9 + .../anim/fx/auras/_aura.animation_fx | 13 + .../damage_shield.attack_list | 12 + .../homin/magic_cur_homin.attack_list | 34 + .../homin/magic_off_homin.attack_list | 33 + .../fx/combat/attack_melee/melee.attack_list | 41 + .../fx/combat/attack_range/range.attack_list | 12 + .../fx_cast/_cast_base.animation_fx_set | 9 + .../cast_cur_healhp_begin.animation_fx_set | 33 + .../cast_cur_healhp_end.animation_fx_set | 22 + .../cast_cur_healhp_fail.animation_fx_set | 22 + .../cast_cur_healhp_loop.animation_fx_set | 26 + .../cast_off_acid_begin.animation_fx_set | 33 + .../cast_off_acid_end.animation_fx_set | 22 + .../cast_off_acid_fail.animation_fx_set | 22 + .../cast_off_acid_loop.animation_fx_set | 26 + .../acid_impact.animation_fx_set | 13 + .../healhp_impact.animation_fx_set | 13 + ...agic_projectile_cur_chain.animation_fx_set | 17 + ...agic_projectile_off_chain.animation_fx_set | 24 + .../_magic_projectile_acid.animation_fx_set | 13 + .../_magic_projectile_healhp.animation_fx_set | 13 + ...gic_projectile_acid_chain.animation_fx_set | 10 + ...c_projectile_healhp_chain.animation_fx_set | 10 + .../range_impact_generic.animation_fx_set | 18 + .../range_projectile_missile.animation_fx_set | 17 + .../anim/fx/links.id_to_string_array | 9 + .../anim/fx/links/_link.animation_fx | 13 + .../_range_impact_generic_base.animation_fx | 12 + .../fx/misc/anim_fx_misc.id_to_string_array | 9 + .../fx/static/object_street_lamp.animation_fx | 13 + .../anim/mode2animset.string_array | 26 + .../forage_source/0_0.forage_source | 6 + .../forage_source/_fx0.forage_source | 11 + .../game_element/fx/toxic_cloud_0.fx | 19 + .../game_element/fx/toxic_cloud_1.fx | 19 + .../game_element/fx/toxic_cloud_2.fx | 19 + .../outpost/building/empty.outpost_building | 14 + .../outpost/outpost/_outpost.outpost | 13 + .../outpost/example_outpost_01.outpost | 10 + .../squad/_free_squad_parent.outpost_squad | 12 + ..._squad_light_melee_fighter_b.outpost_squad | 10 + ..._squad_light_melee_fighter_c.outpost_squad | 10 + ..._squad_light_melee_fighter_d.outpost_squad | 10 + ..._squad_light_melee_fighter_e.outpost_squad | 10 + ..._squad_light_melee_fighter_f.outpost_squad | 10 + .../game_element/test_sky/fo_mainland_au.sky | 343 + .../game_element/test_sky/fo_mainland_sp.sky | 334 + .../game_element/test_sky/fo_mainland_su.sky | 335 + .../game_element/test_sky/fo_mainland_wi.sky | 335 + .../game_element/xp_table/unblock.titles | 52 + .../class_doc/destroy_item.html | 8 + .../class_doc/do_mission.html | 3 +- .../class_doc/recv_fame.html | 7 + .../class_doc/recv_item.html | 9 + .../class_doc/recv_money.html | 8 + .../class_doc/spawn_mission.html | 192 + .../world_editor_classes.xml | 72 +- .../newbieland/guild_missions.primitive | 448 ++ code/ryzom/common/src/Makefile | 36 - .../common/src/game_share/CMakeLists.txt | 28 +- code/ryzom/common/src/game_share/Makefile | 56 - .../common/src/game_share/bot_chat_types.h | 2 + .../src/game_share/character_sync_itf.h | 10 - .../game_share/deployment_configuration.cpp | 1519 ++++ .../src/game_share/deployment_configuration.h | 265 + .../common/src/game_share/entity_types.h | 2 +- .../common/src/game_share/game_share.vcproj | 1720 ----- .../src/game_share/generate_client_db.xslt | 4 +- .../common/src/game_share/item_infos.cpp | 2 + code/ryzom/common/src/game_share/item_infos.h | 1 + .../common/src/game_share/msg_ais_egs_gen.h | 18 + .../src/game_share/persistent_data_template.h | 50 +- code/ryzom/common/src/game_share/pvp_mode.cpp | 2 + code/ryzom/common/src/game_share/pvp_mode.h | 4 +- .../src/game_share/ryzom_mirror_properties.h | 2 +- code/ryzom/common/src/game_share/send_chat.h | 2 +- code/ryzom/common/src/game_share/sp_type.cpp | 2 +- .../ryzom/common/src/game_share/txt_command.h | 174 + code/ryzom/gen_deps.sh | 24 - code/ryzom/server/Makefile | 29 - .../data_shard/client_commands_privileges.txt | 23 +- code/ryzom/server/src/CMakeLists.txt | 5 +- code/ryzom/server/src/Makefile | 73 - code/ryzom/server/src/admin_modules/Makefile | 38 - .../src/admin_modules/admin_modules.vcproj | 321 - code/ryzom/server/src/ags_test/Makefile | 43 - code/ryzom/server/src/ai_service/Makefile | 65 - code/ryzom/server/src/ai_service/ai.cpp | 9 + code/ryzom/server/src/ai_service/ai.h | 6 + code/ryzom/server/src/ai_service/ai_bot.cpp | 8 +- code/ryzom/server/src/ai_service/ai_bot.h | 8 +- .../server/src/ai_service/ai_bot_npc.cpp | 9 +- .../server/src/ai_service/ai_bot_pet.cpp | 26 + code/ryzom/server/src/ai_service/ai_bot_pet.h | 2 + .../server/src/ai_service/ai_instance.cpp | 11 +- .../ryzom/server/src/ai_service/ai_instance.h | 2 +- .../server/src/ai_service/ai_mgr_pet.cpp | 7 +- .../server/src/ai_service/ai_outpost.cpp | 14 +- .../server/src/ai_service/ai_profile_npc.cpp | 133 +- .../server/src/ai_service/ai_profile_npc.h | 47 + .../server/src/ai_service/ai_service.vcproj | 1260 ---- code/ryzom/server/src/ai_service/commands.cpp | 2 +- .../src/ai_service/doc/doxycfg/Makefile | 36 - .../src/ai_service/generic_logic_action.cpp | 5 +- code/ryzom/server/src/ai_service/messages.cpp | 7 +- code/ryzom/server/src/ai_service/nf_grp.cpp | 169 +- .../server/src/ai_service/nf_grp_npc.cpp | 163 +- .../ryzom/server/src/ai_service/nf_static.cpp | 32 +- .../src/ai_service/npc_description_msg.cpp | 8 + .../src/ai_service/npc_description_msg.h | 7 +- .../server/src/ai_service/script_compiler.cpp | 38 +- .../script_compiler_native_func.cpp | 2 + .../visual_properties_interface.cpp | 6 +- .../ai_service/visual_properties_interface.h | 2 +- code/ryzom/server/src/ai_share/Makefile | 53 - .../ryzom/server/src/ai_share/ai_share.vcproj | 481 -- code/ryzom/server/src/backup_service/Makefile | 56 - .../src/backup_service/backup_service.vcproj | 379 - .../src/dynamic_scenario_service/Makefile | 64 - .../dynamic_scenario_service.vcproj | 356 - .../server/src/entities_game_service/Makefile | 92 - .../src/entities_game_service/admin.cpp | 1710 ++++- .../server/src/entities_game_service/admin.h | 2 + .../building_manager/building_manager.cpp | 15 +- .../building_manager/building_manager.h | 8 +- .../building_physical_inline.h | 1 - .../entities_game_service/client_messages.cpp | 126 +- .../creature_manager/creature.cpp | 3 + .../creature_manager/creature.h | 3 + .../creature_manager/creature_manager.cpp | 66 + .../creature_manager/creature_manager.h | 19 + .../entities_game_service/database_plr.cpp | 5 +- .../src/entities_game_service/database_plr.h | 21 +- .../entities_game_service/dyn_chat_egs.cpp | 17 + .../src/entities_game_service/dyn_chat_egs.h | 4 + .../entities_game_service.cpp | 2 + .../entities_game_service.vcproj | 2976 -------- .../entity_manager/entity_callbacks.cpp | 63 +- .../entity_manager/entity_callbacks.h | 9 + .../game_item_manager/game_item.cpp | 11 + .../game_item_manager/game_item.h | 13 + .../game_item_manager/player_inv_xchg.cpp | 4 + .../game_item_manager/player_inventory.cpp | 8 +- .../guild_manager/guild.cpp | 319 +- .../guild_manager/guild.h | 57 +- .../guild_manager/guild_leader_module.cpp | 2 +- .../guild_manager/guild_member_module.h | 6 + .../guild_manager/guild_officer_module.h | 8 + .../mission_client_callbacks.cpp | 128 +- .../mission_manager/mission_action.cpp | 813 ++- .../mission_manager/mission_event.h | 5 +- .../mission_manager/mission_guild.cpp | 69 +- .../mission_manager/mission_guild.h | 5 + .../mission_manager/mission_manager.cpp | 65 +- .../mission_manager/mission_step_kill.cpp | 254 +- .../mission_manager/mission_step_misc.cpp | 55 +- .../mission_manager/mission_step_talk.cpp | 140 +- .../mission_manager/mission_step_template.cpp | 4 + .../mission_manager/mission_step_template.h | 5 +- .../mission_manager/mission_template.cpp | 95 +- .../mission_manager/missions_commands.cpp | 14 +- .../modules/shard_unifier_client.cpp | 12 + .../outpost_manager/outpost.cpp | 69 +- .../phrase_utilities_functions.cpp | 24 +- .../player_manager/character.cpp | 599 +- .../player_manager/character.h | 112 +- .../player_manager/character_inlines.h | 26 +- .../player_manager/character_interface.h | 3 + .../character_inventory_manipulation.cpp | 14 +- .../player_manager/persistent_player_data.cpp | 8 +- .../player_manager/player_manager.cpp | 2 +- .../progression/progression_pvp.cpp | 120 +- .../progression/progression_pvp.h | 16 +- .../pvp_manager/pvp_faction.cpp | 122 +- .../pvp_manager/pvp_manager_2.cpp | 142 +- .../pvp_manager/pvp_manager_2.h | 8 +- .../pvp_manager/pvp_zone.cpp | 112 +- .../shop_type/item_for_sale.cpp | 6 + .../shop_type/item_for_sale.h | 3 +- .../team_manager/team.cpp | 416 +- .../entities_game_service/team_manager/team.h | 57 +- .../team_manager/team_manager.cpp | 245 +- .../team_manager/team_manager.h | 19 +- .../server/src/frontend_service/Makefile | 72 - .../frontend_service/frontend_service.vcproj | 600 -- .../server/src/gameplay_module_lib/Makefile | 48 - .../gameplay_module_lib.vcproj | 349 - code/ryzom/server/src/gen_compile_flags.sh | 11 - code/ryzom/server/src/gen_deps.sh | 25 - .../general_utilities_service/CMakeLists.txt | 117 +- .../src/general_utilities_service/Makefile | 52 - .../general_utilities_service/em_commands.cpp | 3 +- .../em_event_manager.cpp | 8 +- .../general_utilities_service.vcproj | 649 -- .../general_utilities_service/gus_utils.cpp | 68 - .../src/general_utilities_service/gus_utils.h | 21 - .../service_main.cpp | 6 +- code/ryzom/server/src/gpm_service/Makefile | 59 - .../server/src/gpm_service/gpm_service.vcproj | 460 -- .../server/src/input_output_service/Makefile | 59 - .../src/input_output_service/chat_manager.h | 4 +- .../input_output_service.cpp | 6 +- .../input_output_service.vcproj | 480 -- .../src/input_output_service/messages.cpp | 13 +- .../input_output_service/parameter_traits.cpp | 6 +- .../input_output_service/string_manager.cpp | 24 + .../src/input_output_service/string_manager.h | 1 + .../string_manager_parser.cpp | 4 +- .../server/src/log_analyser_service/Makefile | 54 - .../log_analyser_service.vcproj | 186 - code/ryzom/server/src/logger_service/Makefile | 56 - .../src/logger_service/logger_service.vcproj | 368 - .../server/src/mail_forum_service/Makefile | 56 - .../mail_forum_service.vcproj | 420 -- code/ryzom/server/src/mirror_service/Makefile | 53 - .../src/mirror_service/mirror_service.vcproj | 376 - .../ryzom/server/src/monitor_service/Makefile | 54 - .../monitor_service/monitor_service.vcproj | 432 -- .../src/patchman_service/CMakeLists.txt | 20 +- .../server/src/patchman_service/Makefile | 52 - .../deployment_configuration_synchroniser.cpp | 1 + .../patchman_service/log_report_module.cpp | 1 + .../pam_patchman_admin_module.cpp | 4 +- .../src/patchman_service/service_main.cpp | 7 +- .../spa_server_patch_applier.cpp | 5 +- .../spm_server_patch_manager.cpp | 2 +- .../spt_server_patch_terminal.cpp | 3 +- code/ryzom/server/src/pd_lib/Makefile | 46 - code/ryzom/server/src/pd_lib/pd_lib.vcproj | 417 -- .../server/src/pd_reference_builder/Makefile | 46 - .../pd_reference_builder.vcproj | 372 - .../server/src/pd_support_service/Makefile | 56 - .../pd_support_service.vcproj | 306 - .../src/persistant_data_service/Makefile | 51 - .../persistant_data_service.vcproj | 436 -- .../server/src/ryzom_admin_service/Makefile | 50 - .../ryzom_admin_service.vcproj | 351 - .../server/src/ryzom_naming_service/Makefile | 50 - .../ryzom_naming_service.vcproj | 351 - .../server/src/ryzom_welcome_service/Makefile | 52 - .../ryzom_welcome_service.vcproj | 355 - .../server/src/server_share/CMakeLists.txt | 10 +- code/ryzom/server/src/server_share/Makefile | 56 - .../src/server_share/entity_locator_itf.h | 36 +- .../src/server_share/entity_locator_itf.xml | 3 +- .../server/src/server_share/msg_ai_service.h | 41 + .../server_share/npc_description_messages.h | 5 +- .../src/server_share/pet_interface_msg.h | 2 + .../server/src/server_share/pvp_relation.h | 8 +- .../src/server_share/server_share.vcproj | 806 -- .../src/session_browser_server/Makefile | 61 - .../session_browser_server.vcproj | 356 - .../server/src/shard_unifier_service/Makefile | 59 - .../shard_unifier_service/entity_locator.cpp | 7 +- .../shard_unifier_service.vcproj | 468 -- code/ryzom/server/src/tick_service/Makefile | 54 - .../src/tick_service/tick_service.vcproj | 363 - code/ryzom/server/src/update_cxxpath_flags.sh | 1 - code/ryzom/server/src/update_packed_sheets.sh | 32 - .../common/characters/directories.py | 1 + .../characters_maps_hr/panoply_generique.cfg | 7 + .../common/data_common/directories.py | 12 +- .../workspace/common/data_common/process.py | 4 + .../workspace/common/exedll/directories.py | 1 + .../build_gamedata/workspace/projects.py | 2 +- .../client/client_patcher/CMakeLists.txt | 6 + .../src/images/georges_logo.icns.orig | Bin 16519 -> 0 bytes .../src/images/georges_logo.png.orig | Bin 797513 -> 0 bytes .../mission_compiler_lib/mission_compiler.h | 5 + .../leveldesign/mission_compiler_lib/step.h | 5 + .../mission_compiler_lib/step_content.cpp | 246 +- .../tools/patch_gen/patch_gen_common.cpp | 11 +- code/ryzom/tools/pdr_util/Makefile | 54 - code/ryzom/tools/pdr_util/pdr_util.cpp | 1 + .../server/admin/crons/cron_harddisk.php | 2 +- code/ryzom/tools/server/admin/index.php | 42 +- .../server/admin/tool_administration.php | 290 +- code/ryzom/tools/server/admin/tool_graphs.php | 10 +- .../tools/server/admin/tool_guild_locator.php | 6 +- .../server/admin/tool_player_locator.php | 6 +- .../translation_tools/extract_bot_names.cpp | 2 +- code/snowballs2/CMakeLists.txt | 176 +- code/snowballs2/CMakePackaging.txt | 113 + code/snowballs2/Makefile.am | 20 - code/snowballs2/acinclude.m4 | 1213 ---- code/snowballs2/autogen.sh | 26 - code/snowballs2/client/Makefile.am | 17 - code/snowballs2/client/configure.in | 260 - code/snowballs2/client/src/Makefile.am | 55 - .../client/src/snowballs_client.cpp | 10 +- code/snowballs2/configure.ac | 264 - code/snowballs2/server/Makefile.am | 11 - code/snowballs2/server/chat/Makefile.am | 15 - code/snowballs2/server/chat/src/Makefile.am | 14 - code/snowballs2/server/chat/src/main.cpp | 3 + .../collision/src/collision_service.cpp | 4 + code/snowballs2/server/frontend/Makefile.am | 15 - .../server/frontend/src/CMakeLists.txt | 2 +- .../server/frontend/src/Makefile.am | 13 - code/snowballs2/server/frontend/src/main.cpp | 4 + code/snowballs2/server/position/Makefile.am | 15 - .../server/position/src/Makefile.am | 16 - code/snowballs2/server/position/src/main.cpp | 3 + 986 files changed, 55845 insertions(+), 35227 deletions(-) create mode 100644 code/CMakeModules/FindMercurial.cmake create mode 100644 code/CMakeModules/GetRevision.cmake delete mode 100644 code/acinclude.m4 delete mode 100644 code/nel/Makefile.am delete mode 100644 code/nel/acinclude.m4 delete mode 100755 code/nel/autogen.sh delete mode 100644 code/nel/automacros/gtk-2.0.m4 delete mode 100644 code/nel/automacros/ogg.m4 delete mode 100644 code/nel/automacros/pkg.m4 delete mode 100644 code/nel/automacros/vorbis.m4 delete mode 100644 code/nel/configure.ac delete mode 100644 code/nel/include/Makefile.am delete mode 100644 code/nel/include/nel/3d/Makefile.am delete mode 100644 code/nel/include/nel/Makefile.am delete mode 100644 code/nel/include/nel/cegui/Makefile.am delete mode 100644 code/nel/include/nel/georges/Makefile.am delete mode 100644 code/nel/include/nel/ligo/Makefile.am delete mode 100644 code/nel/include/nel/misc/Makefile.am delete mode 100644 code/nel/include/nel/net/Makefile.am delete mode 100644 code/nel/include/nel/pacs/Makefile.am delete mode 100644 code/nel/include/nel/sound/Makefile.am delete mode 100644 code/nel/nel.m4 delete mode 100644 code/nel/samples/3d/Makefile.am delete mode 100644 code/nel/samples/3d/cegui/Makefile.am delete mode 100644 code/nel/samples/3d/cluster_viewer/Makefile.am delete mode 100644 code/nel/samples/3d/cluster_viewer/fonts/Makefile.am delete mode 100644 code/nel/samples/3d/cluster_viewer/groups/Makefile.am delete mode 100644 code/nel/samples/3d/cluster_viewer/shapes/Makefile.am delete mode 100644 code/nel/samples/3d/font/Makefile.am delete mode 100644 code/nel/samples/Makefile.am delete mode 100644 code/nel/samples/georges/Makefile.am delete mode 100644 code/nel/samples/misc/Makefile.am delete mode 100644 code/nel/samples/misc/command/Makefile.am delete mode 100644 code/nel/samples/misc/configfile/Makefile.am delete mode 100644 code/nel/samples/misc/debug/Makefile.am delete mode 100644 code/nel/samples/misc/i18n/Makefile.am delete mode 100644 code/nel/samples/misc/log/Makefile.am delete mode 100644 code/nel/samples/misc/strings/Makefile.am delete mode 100644 code/nel/samples/misc/types_check/Makefile.am delete mode 100644 code/nel/samples/net/Makefile.am delete mode 100644 code/nel/samples/net/chat/Makefile.am delete mode 100644 code/nel/samples/net/login_system/Makefile.am delete mode 100644 code/nel/samples/net/udp/Makefile.am delete mode 100644 code/nel/samples/pacs/Makefile.am delete mode 100644 code/nel/samples/sound_sources/Makefile.am delete mode 100644 code/nel/src/3d/Makefile.am delete mode 100644 code/nel/src/3d/driver/Makefile.am delete mode 100644 code/nel/src/3d/driver/opengl/Makefile.am delete mode 100644 code/nel/src/Makefile.am delete mode 100644 code/nel/src/Rules.mk delete mode 100644 code/nel/src/Variables.mk delete mode 100644 code/nel/src/cegui/Makefile.am delete mode 100755 code/nel/src/gen_deps.sh delete mode 100644 code/nel/src/georges/Makefile.am delete mode 100644 code/nel/src/ligo/Makefile.am delete mode 100644 code/nel/src/misc/Makefile.am delete mode 100644 code/nel/src/misc/config_file/Makefile.am delete mode 100644 code/nel/src/net/Makefile.am delete mode 100644 code/nel/src/pacs/Makefile.am delete mode 100644 code/nel/src/sound/Makefile.am delete mode 100644 code/nel/src/sound/driver/Makefile.am delete mode 100644 code/nel/src/sound/driver/fmod/Makefile.am delete mode 100644 code/nel/src/sound/driver/openal/Makefile.am delete mode 100644 code/nel/tools/3d/Makefile.am delete mode 100644 code/nel/tools/3d/build_coarse_mesh/Makefile.am delete mode 100644 code/nel/tools/3d/build_far_bank/Makefile.am delete mode 100644 code/nel/tools/3d/build_smallbank/Makefile.am delete mode 100644 code/nel/tools/3d/ig_lighter/Makefile.am delete mode 100644 code/nel/tools/3d/ig_lighter_lib/Makefile.am create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/CMakeLists.txt create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/CMakeLists.txt create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/LGPL_EXCEPTION.txt create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/LICENSE.GPL3 create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/LICENSE.LGPL create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtAbstractEditorFactoryBase create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtAbstractPropertyBrowser create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtAbstractPropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtBoolPropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtBrowserItem create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtButtonPropertyBrowser create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCharEditorFactory create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCharPropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCheckBoxFactory create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtColorEditorFactory create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtColorPropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCursorEditorFactory create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCursorPropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDateEditFactory create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDatePropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDateTimeEditFactory create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDateTimePropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDoublePropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDoubleSpinBoxFactory create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtEnumEditorFactory create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtEnumPropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtFlagPropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtFontEditorFactory create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtFontPropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtGroupBoxPropertyBrowser create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtGroupPropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtIntPropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtKeySequenceEditorFactory create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtKeySequencePropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtLineEditFactory create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtLocalePropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtPointFPropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtPointPropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtProperty create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtRectFPropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtRectPropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtScrollBarFactory create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSizeFPropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSizePolicyPropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSizePropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSliderFactory create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSpinBoxFactory create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtStringPropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtTimeEditFactory create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtTimePropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtTreePropertyBrowser create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtVariantEditorFactory create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtVariantProperty create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtVariantPropertyManager create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/README.TXT create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-arrow.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-busy.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-closedhand.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-cross.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-forbidden.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-hand.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-hsplit.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-ibeam.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-openhand.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-sizeall.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-sizeb.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-sizef.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-sizeh.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-sizev.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-uparrow.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-vsplit.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-wait.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-whatsthis.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtbuttonpropertybrowser.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtbuttonpropertybrowser.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qteditorfactory.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qteditorfactory.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtgroupboxpropertybrowser.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtgroupboxpropertybrowser.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowser.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowser.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowser.pri create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowser.qrc create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowserutils.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowserutils_p.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertymanager.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertymanager.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qttreepropertybrowser.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qttreepropertybrowser.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtvariantproperty.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtvariantproperty.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/CMakeLists.txt create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_dirtree_dialog.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_dirtree_dialog.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_dirtree_form.ui create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_file.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_file.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filelist_dialog.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filelist_dialog.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filelist_dialog.ui create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filesystem_model.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filesystem_model.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager.qrc create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_constants.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_plugin.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_plugin.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_window.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_window.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_window.ui create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_proxy_model.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_proxy_model.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/images/ic_nel_add_item.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/images/ic_nel_bnp_make.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/images/ic_nel_delete_item.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/images/ic_nel_export.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/images/ic_nel_new.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/images/ic_nel_reset_all.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/ovqt_plugin_bnp_manager.xml delete mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/core/imenu_manager.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/core/ovqt_plugin_core.xml create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/ovqt_plugin_disp_sheet_id.xml create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_plugin.cpp rename code/nel/tools/3d/object_viewer_qt/src/plugins/example/{plugin1.h => example_plugin.h} (59%) create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/example/ovqt_plugin_example.xml delete mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/example/plugin1.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/expandable_headerview.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/expandable_headerview.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formitem.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formitem.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_form.ui create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/ovqt_plugin_georges_editor.xml create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/log/ovqt_plugin_log.xml create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/CMakeLists.txt create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/arrow-left-2.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/arrow-left-double-2.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/arrow-right-2.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/arrow-right-double-2.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/document-export-4.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/ic_nel_add_item.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/ic_nel_delete_item.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/ic_nel_down_item.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/ic_nel_generic_settings.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/ic_nel_reset_all.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/ic_nel_up_item.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/news-subscribe-2.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/run-build-2.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler.qrc create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_main_window.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_main_window.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_main_window.ui create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_plugin.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_plugin.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_plugin_constants.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_settings_page.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_settings_page.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_settings_page.ui create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/ovqt_plugin_mission_compiler.xml create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/server_entry_dialog.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/server_entry_dialog.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/server_entry_dialog.ui create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/validation_file.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/validation_file.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/icons/ic_nel_pill.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/ovqt_plugin_object_viewer.xml create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/ovqt_sheet_builder/ovqt_plugin_sheet_builder.xml create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/CMakeLists.txt create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/editor_phrase.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/editor_phrase.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/editor_worksheet.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/editor_worksheet.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/extract_bot_names.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/extract_bot_names.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/extract_new_sheet_names.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/extract_new_sheet_names.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/ftp_selection.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/ftp_selection.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/ftp_selection.qrc create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/ftp_selection.ui create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/images/cdtoparent.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/images/dir.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/images/file.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/ovqt_plugin_translation_manager.xml create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/source_selection.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/source_selection.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/source_selection.ui create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_constants.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_editor.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_main_window.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_main_window.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_main_window.ui create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_plugin.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_plugin.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_settings_page.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_settings_page.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_settings_page.ui create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/ovqt_plugin_zone_painter.xml create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_model.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_model.h delete mode 100644 code/nel/tools/3d/panoply_maker/Makefile.am delete mode 100644 code/nel/tools/3d/zone_dependencies/Makefile.am delete mode 100644 code/nel/tools/3d/zone_ig_lighter/Makefile.am delete mode 100644 code/nel/tools/3d/zone_lib/Makefile.am delete mode 100644 code/nel/tools/3d/zone_lighter/Makefile.am delete mode 100644 code/nel/tools/3d/zone_welder/Makefile.am delete mode 100644 code/nel/tools/Makefile.am create mode 100644 code/nel/tools/build_gamedata/8_upload.py create mode 100644 code/nel/tools/build_gamedata/interface_dev.bat create mode 100644 code/nel/tools/build_gamedata/leveldesign_dev.bat create mode 100644 code/nel/tools/build_gamedata/processes/pacs_prim_list/0_setup.py create mode 100644 code/nel/tools/build_gamedata/processes/pacs_prim_list/1_export.py create mode 100644 code/nel/tools/build_gamedata/processes/pacs_prim_list/2_build.py create mode 100644 code/nel/tools/build_gamedata/processes/pacs_prim_list/3_install.py delete mode 100644 code/nel/tools/misc/Makefile.am delete mode 100644 code/nel/tools/misc/bnp_make/Makefile.am delete mode 100644 code/nel/tools/misc/disp_sheet_id/Makefile.am delete mode 100644 code/nel/tools/misc/make_sheet_id/Makefile.am delete mode 100644 code/nel/tools/misc/xml_packer/Makefile.am delete mode 100644 code/nel/tools/pacs/Makefile.am delete mode 100644 code/nel/tools/pacs/build_ig_boxes/Makefile.am delete mode 100644 code/nel/tools/pacs/build_indoor_rbank/Makefile.am delete mode 100644 code/nel/tools/pacs/build_rbank/Makefile.am create mode 100644 code/nel/tools/sound/build_samplebank/CMakeLists.txt create mode 100644 code/nel/tools/sound/build_sound/CMakeLists.txt create mode 100644 code/nel/tools/sound/build_soundbank/CMakeLists.txt delete mode 100644 code/nelns/Makefile.am delete mode 100644 code/nelns/acinclude.m4 delete mode 100644 code/nelns/admin_executor_service/Makefile.am delete mode 100644 code/nelns/admin_service/Makefile.am delete mode 100755 code/nelns/autogen.sh delete mode 100644 code/nelns/automacros/mysql.m4 delete mode 100644 code/nelns/configure.ac delete mode 100644 code/nelns/login_service/Makefile.am delete mode 100644 code/nelns/naming_service/Makefile.am delete mode 100644 code/nelns/welcome_service/Makefile.am create mode 100644 code/revision.h.in delete mode 100644 code/ryzom/Makefile delete mode 100644 code/ryzom/Rules.mk delete mode 100644 code/ryzom/Variables.mk delete mode 100644 code/ryzom/client/Makefile create mode 100644 code/ryzom/client/data/gamedev/adds/sfx/marauder_teleporter.ps create mode 100644 code/ryzom/client/data/gamedev/adds/shapes/GE_HOF_caster_pvp_pantabottes.shape create mode 100644 code/ryzom/client/data/gamedev/adds/shapes/GE_HOM_caster_pvp_pantabottes.shape create mode 100644 code/ryzom/client/data/gamedev/adds/shapes/GE_pvp_big_shield.shape create mode 100644 code/ryzom/client/data/gamedev/adds/shapes/tp_diamand.shape create mode 100644 code/ryzom/client/data/gamedev/adds/shapes/tp_socle.shape create mode 100644 code/ryzom/client/data/gamedev/adds/textures/event_refday_yber.tga create mode 100644 code/ryzom/client/data/gamedev/adds/textures/gn_pvp_dress.tga create mode 100644 code/ryzom/client/data/gamedev/adds/textures/gn_pvp_dress_hof.tga create mode 100644 code/ryzom/client/data/gamedev/adds/textures/ul_mission_hall_of_fame.dds create mode 100644 code/ryzom/client/data/gamedev/interfaces_v3/texture_interfaces_v3.txt create mode 100644 code/ryzom/client/data/gamedev/interfaces_v3/webig.lua create mode 100644 code/ryzom/client/data/gamedev/interfaces_v3/webig_widgets.xml delete mode 100644 code/ryzom/client/src/Makefile delete mode 100644 code/ryzom/client/src/client_sheets/Makefile delete mode 100644 code/ryzom/client/src/seven_zip/Makefile create mode 100644 code/ryzom/client/unix/ryzom.xpm create mode 100644 code/ryzom/client/unix/ryzom_128x128.png create mode 100644 code/ryzom/client/unix/ryzom_16x16.png create mode 100644 code/ryzom/client/unix/ryzom_22x22.png create mode 100644 code/ryzom/client/unix/ryzom_24x24.png create mode 100644 code/ryzom/client/unix/ryzom_32x32.png create mode 100644 code/ryzom/client/unix/ryzom_48x48.png delete mode 100644 code/ryzom/common/Makefile delete mode 100644 code/ryzom/common/data_common/visual_slot.tab create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Building/guard_tower.building create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Pacts/pacts.death_impact create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/Flora_template/forest/FO_type_01_b.flora create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/Flora_template/forest/FO_type_04_b.flora create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/Flora_template/lacustre/tr_palmtree.flora create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/forest/FX/FX_Fo-Ju-ColibrisB.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/forest/FX/FX_Fo-SolBirthA.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/forest/FX/FX_Fo-bugsA.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/forest/FX/FX_Fo-bugsB.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/forest/FX/FX_Fo-bugsC.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/forest/FX/FX_Fo_Fishes.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/forest/common/FO_S2_bigroot_A.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/forest/common/FO_S2_bigroot_B.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/forest/common/FO_S2_bigroot_C.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/forest/common/FO_S2_birch.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/forest/common/FO_S2_spiketree.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/forest/common/Fo_s1_giant_tree.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/forest/common/fo_S3_champignou_A.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/forest/common/fo_S3_champignou_B.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/forest/common/fo_s1_arbreagrelot.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/forest/common/fo_s2_arbragrelot.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/lacustre/common/tr_s2_bamboo_a.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/lacustre/common/tr_s2_palmtree_a.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/lacustre/common/tr_s2_palmtree_b.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/lacustre/common/tr_s2_palmtree_c.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/lacustre/common/tr_s2_palmtree_d.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/lacustre/common/tr_s2_palmtree_e.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/Game_elem/Plant/ecosystem/lacustre/common/tr_s2_palmtree_f.plant create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/auras.id_to_string_array create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/auras/_aura.animation_fx create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/attack_damage_shield/damage_shield.attack_list create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/attack_magic/homin/magic_cur_homin.attack_list create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/attack_magic/homin/magic_off_homin.attack_list create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/attack_melee/melee.attack_list create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/attack_range/range.attack_list create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_cast/_cast_base.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_cast/homin/new_casts/cast_cur_healhp_begin.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_cast/homin/new_casts/cast_cur_healhp_end.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_cast/homin/new_casts/cast_cur_healhp_fail.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_cast/homin/new_casts/cast_cur_healhp_loop.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_cast/homin/new_casts/cast_off_acid_begin.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_cast/homin/new_casts/cast_off_acid_end.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_cast/homin/new_casts/cast_off_acid_fail.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_cast/homin/new_casts/cast_off_acid_loop.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_magic_impact/acid_impact.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_magic_impact/healhp_impact.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_magic_projectile/base/_magic_projectile_cur_chain.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_magic_projectile/base/_magic_projectile_off_chain.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_magic_projectile/base_per_spell/_magic_projectile_acid.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_magic_projectile/base_per_spell/_magic_projectile_healhp.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_magic_projectile/magic_projectile_acid_chain.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_magic_projectile/magic_projectile_healhp_chain.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_range_impact/range_impact_generic.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/combat/fx_range_projectile/range_projectile_missile.animation_fx_set create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/links.id_to_string_array create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/links/_link.animation_fx create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/misc/_range_impact_generic_base.animation_fx create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/misc/anim_fx_misc.id_to_string_array create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/fx/static/object_street_lamp.animation_fx create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/anim/mode2animset.string_array create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/forage_source/0_0.forage_source create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/forage_source/_fx0.forage_source create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/fx/toxic_cloud_0.fx create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/fx/toxic_cloud_1.fx create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/fx/toxic_cloud_2.fx create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/outpost/building/empty.outpost_building create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/outpost/outpost/_outpost.outpost create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/outpost/outpost/example_outpost_01.outpost create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/outpost/squad/_free_squad_parent.outpost_squad create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/outpost/squad/free_squad_light_melee_fighter_b.outpost_squad create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/outpost/squad/free_squad_light_melee_fighter_c.outpost_squad create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/outpost/squad/free_squad_light_melee_fighter_d.outpost_squad create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/outpost/squad/free_squad_light_melee_fighter_e.outpost_squad create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/outpost/squad/free_squad_light_melee_fighter_f.outpost_squad create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/test_sky/fo_mainland_au.sky create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/test_sky/fo_mainland_sp.sky create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/test_sky/fo_mainland_su.sky create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/test_sky/fo_mainland_wi.sky create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/game_element/xp_table/unblock.titles create mode 100644 code/ryzom/common/data_leveldesign/leveldesign/world_editor_files/class_doc/spawn_mission.html create mode 100644 code/ryzom/common/data_leveldesign/primitives/newbieland/guild_missions.primitive delete mode 100644 code/ryzom/common/src/Makefile delete mode 100644 code/ryzom/common/src/game_share/Makefile create mode 100644 code/ryzom/common/src/game_share/deployment_configuration.cpp create mode 100644 code/ryzom/common/src/game_share/deployment_configuration.h delete mode 100644 code/ryzom/common/src/game_share/game_share.vcproj create mode 100644 code/ryzom/common/src/game_share/txt_command.h delete mode 100755 code/ryzom/gen_deps.sh delete mode 100644 code/ryzom/server/Makefile delete mode 100644 code/ryzom/server/src/Makefile delete mode 100644 code/ryzom/server/src/admin_modules/Makefile delete mode 100644 code/ryzom/server/src/admin_modules/admin_modules.vcproj delete mode 100644 code/ryzom/server/src/ags_test/Makefile delete mode 100644 code/ryzom/server/src/ai_service/Makefile delete mode 100644 code/ryzom/server/src/ai_service/ai_service.vcproj delete mode 100644 code/ryzom/server/src/ai_service/doc/doxycfg/Makefile delete mode 100644 code/ryzom/server/src/ai_share/Makefile delete mode 100644 code/ryzom/server/src/ai_share/ai_share.vcproj delete mode 100644 code/ryzom/server/src/backup_service/Makefile delete mode 100644 code/ryzom/server/src/backup_service/backup_service.vcproj delete mode 100644 code/ryzom/server/src/dynamic_scenario_service/Makefile delete mode 100644 code/ryzom/server/src/dynamic_scenario_service/dynamic_scenario_service.vcproj delete mode 100644 code/ryzom/server/src/entities_game_service/Makefile delete mode 100644 code/ryzom/server/src/entities_game_service/entities_game_service.vcproj delete mode 100644 code/ryzom/server/src/frontend_service/Makefile delete mode 100644 code/ryzom/server/src/frontend_service/frontend_service.vcproj delete mode 100644 code/ryzom/server/src/gameplay_module_lib/Makefile delete mode 100644 code/ryzom/server/src/gameplay_module_lib/gameplay_module_lib.vcproj delete mode 100644 code/ryzom/server/src/gen_compile_flags.sh delete mode 100755 code/ryzom/server/src/gen_deps.sh delete mode 100644 code/ryzom/server/src/general_utilities_service/Makefile delete mode 100644 code/ryzom/server/src/general_utilities_service/general_utilities_service.vcproj delete mode 100644 code/ryzom/server/src/gpm_service/Makefile delete mode 100644 code/ryzom/server/src/gpm_service/gpm_service.vcproj delete mode 100644 code/ryzom/server/src/input_output_service/Makefile delete mode 100644 code/ryzom/server/src/input_output_service/input_output_service.vcproj delete mode 100644 code/ryzom/server/src/log_analyser_service/Makefile delete mode 100644 code/ryzom/server/src/log_analyser_service/log_analyser_service.vcproj delete mode 100644 code/ryzom/server/src/logger_service/Makefile delete mode 100644 code/ryzom/server/src/logger_service/logger_service.vcproj delete mode 100644 code/ryzom/server/src/mail_forum_service/Makefile delete mode 100644 code/ryzom/server/src/mail_forum_service/mail_forum_service.vcproj delete mode 100644 code/ryzom/server/src/mirror_service/Makefile delete mode 100644 code/ryzom/server/src/mirror_service/mirror_service.vcproj delete mode 100644 code/ryzom/server/src/monitor_service/Makefile delete mode 100644 code/ryzom/server/src/monitor_service/monitor_service.vcproj delete mode 100644 code/ryzom/server/src/patchman_service/Makefile delete mode 100644 code/ryzom/server/src/pd_lib/Makefile delete mode 100644 code/ryzom/server/src/pd_lib/pd_lib.vcproj delete mode 100644 code/ryzom/server/src/pd_reference_builder/Makefile delete mode 100644 code/ryzom/server/src/pd_reference_builder/pd_reference_builder.vcproj delete mode 100644 code/ryzom/server/src/pd_support_service/Makefile delete mode 100644 code/ryzom/server/src/pd_support_service/pd_support_service.vcproj delete mode 100644 code/ryzom/server/src/persistant_data_service/Makefile delete mode 100644 code/ryzom/server/src/persistant_data_service/persistant_data_service.vcproj delete mode 100644 code/ryzom/server/src/ryzom_admin_service/Makefile delete mode 100644 code/ryzom/server/src/ryzom_admin_service/ryzom_admin_service.vcproj delete mode 100644 code/ryzom/server/src/ryzom_naming_service/Makefile delete mode 100644 code/ryzom/server/src/ryzom_naming_service/ryzom_naming_service.vcproj delete mode 100644 code/ryzom/server/src/ryzom_welcome_service/Makefile delete mode 100644 code/ryzom/server/src/ryzom_welcome_service/ryzom_welcome_service.vcproj delete mode 100644 code/ryzom/server/src/server_share/Makefile delete mode 100644 code/ryzom/server/src/server_share/server_share.vcproj delete mode 100644 code/ryzom/server/src/session_browser_server/Makefile delete mode 100644 code/ryzom/server/src/session_browser_server/session_browser_server.vcproj delete mode 100644 code/ryzom/server/src/shard_unifier_service/Makefile delete mode 100644 code/ryzom/server/src/shard_unifier_service/shard_unifier_service.vcproj delete mode 100644 code/ryzom/server/src/tick_service/Makefile delete mode 100644 code/ryzom/server/src/tick_service/tick_service.vcproj delete mode 100755 code/ryzom/server/src/update_cxxpath_flags.sh delete mode 100755 code/ryzom/server/src/update_packed_sheets.sh create mode 100644 code/ryzom/tools/build_gamedata/workspace/common/characters_maps_hr/panoply_generique.cfg delete mode 100644 code/ryzom/tools/leveldesign/georges_editor_qt/src/images/georges_logo.icns.orig delete mode 100644 code/ryzom/tools/leveldesign/georges_editor_qt/src/images/georges_logo.png.orig delete mode 100644 code/ryzom/tools/pdr_util/Makefile create mode 100644 code/snowballs2/CMakePackaging.txt delete mode 100644 code/snowballs2/Makefile.am delete mode 100644 code/snowballs2/acinclude.m4 delete mode 100755 code/snowballs2/autogen.sh delete mode 100644 code/snowballs2/client/Makefile.am delete mode 100644 code/snowballs2/client/configure.in delete mode 100644 code/snowballs2/client/src/Makefile.am delete mode 100644 code/snowballs2/configure.ac delete mode 100644 code/snowballs2/server/Makefile.am delete mode 100644 code/snowballs2/server/chat/Makefile.am delete mode 100644 code/snowballs2/server/chat/src/Makefile.am delete mode 100644 code/snowballs2/server/frontend/Makefile.am delete mode 100644 code/snowballs2/server/frontend/src/Makefile.am delete mode 100644 code/snowballs2/server/position/Makefile.am delete mode 100644 code/snowballs2/server/position/src/Makefile.am diff --git a/.hgignore b/.hgignore index 125eff13c..1fbad60fd 100644 --- a/.hgignore +++ b/.hgignore @@ -144,6 +144,8 @@ external external_stlport 3rdParty .svn +thumbs.db +Thumbs.db # build code/nel/build/* diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 630ff4414..bf5867327 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -91,6 +91,7 @@ NL_CONFIGURE_CHECKS() #Platform specifics SETUP_EXTERNAL() +NL_GEN_REVISION_H() IF(WIN32) SET(WINSOCK2_LIB ws2_32.lib) @@ -143,11 +144,11 @@ IF(WITH_RYZOM) ENDIF(WITH_RYZOM) IF(WITH_NELNS) -# ADD_SUBDIRECTORY(nelns) + ADD_SUBDIRECTORY(nelns) ENDIF(WITH_NELNS) IF(WITH_SNOWBALLS) -# ADD_SUBDIRECTORY(snowballs2) + ADD_SUBDIRECTORY(snowballs2) ENDIF(WITH_SNOWBALLS) IF(WITH_TOOLS) diff --git a/code/CMakeModules/Find3dsMaxSDK.cmake b/code/CMakeModules/Find3dsMaxSDK.cmake index 52c4cc011..ddec22f90 100644 --- a/code/CMakeModules/Find3dsMaxSDK.cmake +++ b/code/CMakeModules/Find3dsMaxSDK.cmake @@ -12,32 +12,35 @@ endif(MAXSDK_INCLUDE_DIR) find_path(MAXSDK_INCLUDE_DIR max.h PATHS + "$ENV{ADSK_3DSMAX_SDK_2012}/maxsdk/include" + "$ENV{3DSMAX_2011_SDK_PATH}/maxsdk/include" "$ENV{PROGRAMFILES}/Autodesk/3ds Max 2010 SDK/maxsdk/include" "$ENV{PROGRAMFILES}/Autodesk/3ds Max 2009 SDK/maxsdk/include" "$ENV{PROGRAMFILES}/Autodesk/3ds Max 2008 SDK/maxsdk/include" "$ENV{PROGRAMFILES}/Autodesk/3ds Max 9 SDK/maxsdk/include" - "$ENV{3DSMAX_2011_SDK_PATH}/maxsdk/include" ) find_path(MAXSDK_CS_INCLUDE_DIR bipexp.h PATHS + "$ENV{ADSK_3DSMAX_SDK_2012}/maxsdk/include/CS" + "$ENV{3DSMAX_2011_SDK_PATH}/maxsdk/include/CS" "$ENV{PROGRAMFILES}/Autodesk/3ds Max 2010 SDK/maxsdk/include/CS" "$ENV{PROGRAMFILES}/Autodesk/3ds Max 2009 SDK/maxsdk/include/CS" "$ENV{PROGRAMFILES}/Autodesk/3ds Max 2008 SDK/maxsdk/include/CS" "$ENV{PROGRAMFILES}/Autodesk/3ds Max 9 SDK/maxsdk/include/CS" - "$ENV{3DSMAX_2011_SDK_PATH}/maxsdk/include/CS" ) MACRO(FIND_3DS_LIBRARY MYLIBRARY MYLIBRARYNAME) FIND_LIBRARY(${MYLIBRARY} NAMES ${MYLIBRARYNAME} PATHS + "$ENV{ADSK_3DSMAX_SDK_2012}/maxsdk/lib" + "$ENV{3DSMAX_2011_SDK_PATH}/maxsdk/lib" "$ENV{PROGRAMFILES}/Autodesk/3ds Max 2010 SDK/maxsdk/lib" "$ENV{PROGRAMFILES}/Autodesk/3ds Max 2009 SDK/maxsdk/lib" "$ENV{PROGRAMFILES}/Autodesk/3ds Max 2008 SDK/maxsdk/lib" "$ENV{PROGRAMFILES}/Autodesk/3ds Max 9 SDK/maxsdk/lib" - "$ENV{3DSMAX_2011_SDK_PATH}/maxsdk/lib" - ) + ) ENDMACRO(FIND_3DS_LIBRARY MYLIBRARY MYLIBRARYNAME) FIND_3DS_LIBRARY(MAXSDK_CORE_LIBRARY core) diff --git a/code/CMakeModules/FindDirectXSDK.cmake b/code/CMakeModules/FindDirectXSDK.cmake index 1f832cf95..9947778db 100644 --- a/code/CMakeModules/FindDirectXSDK.cmake +++ b/code/CMakeModules/FindDirectXSDK.cmake @@ -14,17 +14,22 @@ FIND_PATH(DXSDK_DIR "Include/dxsdkver.h" PATHS "$ENV{DXSDK_DIR}" + "C:/Program Files (x86)/Microsoft DirectX SDK (June 2010)" + "C:/Program Files/Microsoft DirectX SDK (June 2010)" + "C:/Program Files (x86)/Microsoft DirectX SDK (February 2010)" + "C:/Program Files/Microsoft DirectX SDK (February 2010)" + "C:/Program Files (x86)/Microsoft DirectX SDK (November 2007)" + "C:/Program Files/Microsoft DirectX SDK (November 2007)" + "C:/Program Files (x86)/Microsoft DirectX SDK" + "C:/Program Files/Microsoft DirectX SDK" ) MACRO(FIND_DXSDK_LIBRARY MYLIBRARY MYLIBRARYNAME) FIND_LIBRARY(${MYLIBRARY} NAMES ${MYLIBRARYNAME} PATHS - "${DXSDK_LIBRARY_DIR}" - "$ENV{DXSDK_DIR}" - "$ENV{DXSDK_DIR}/Lib" - "$ENV{DXSDK_DIR}/Lib/x86" - ) + "${DXSDK_LIBRARY_DIR}" + ) ENDMACRO(FIND_DXSDK_LIBRARY MYLIBRARY MYLIBRARYNAME) IF(DXSDK_DIR) diff --git a/code/CMakeModules/FindExternal.cmake b/code/CMakeModules/FindExternal.cmake index fae4af92d..5d6086bc6 100644 --- a/code/CMakeModules/FindExternal.cmake +++ b/code/CMakeModules/FindExternal.cmake @@ -8,7 +8,7 @@ # EXTERNAL_FOUND - True if the external libraries are available SET(EXTERNAL_TEMP_PATH ${CMAKE_CURRENT_SOURCE_DIR}/external ${CMAKE_CURRENT_SOURCE_DIR}/../external ${CMAKE_CURRENT_SOURCE_DIR}/3rdParty ${CMAKE_CURRENT_SOURCE_DIR}/../3rdParty ${EXTERNAL_PATH}) -SET(EXTERNAL_TEMP_FILE "include/zlib.h") +SET(EXTERNAL_TEMP_FILE "include/wwwconf.h") SET(EXTERNAL_NAME "external") # If using STLport preprend external_stlport @@ -36,18 +36,18 @@ IF(EXTERNAL_PATH) SET(EXTERNAL_INCLUDE_PATH "${EXTERNAL_PATH}/include") # Using 32 or 64 bits binaries - IF(TARGET_X64) + IF(TARGET_X64 AND WIN32) SET(EXTERNAL_BINARY_PATH "${EXTERNAL_PATH}/bin64") - ELSE(TARGET_X64) + ELSE(TARGET_X64 AND WIN32) SET(EXTERNAL_BINARY_PATH "${EXTERNAL_PATH}/bin") - ENDIF(TARGET_X64) - + ENDIF(TARGET_X64 AND WIN32) + # Using 32 or 64 bits libraries - IF(TARGET_X64) + IF(TARGET_X64 AND WIN32) SET(EXTERNAL_LIBRARY_PATH "${EXTERNAL_PATH}/lib64") - ELSE(TARGET_X64) + ELSE(TARGET_X64 AND WIN32) SET(EXTERNAL_LIBRARY_PATH "${EXTERNAL_PATH}/lib") - ENDIF(TARGET_X64) + ENDIF(TARGET_X64 AND WIN32) SET(CMAKE_INCLUDE_PATH "${EXTERNAL_INCLUDE_PATH};${CMAKE_INCLUDE_PATH}") # Stupid hack for FindOpenAL.cmake diff --git a/code/CMakeModules/FindFreeType.cmake b/code/CMakeModules/FindFreeType.cmake index 0ba439fb9..4f3c84cbe 100644 --- a/code/CMakeModules/FindFreeType.cmake +++ b/code/CMakeModules/FindFreeType.cmake @@ -41,7 +41,7 @@ IF(FREETYPE_ADDITIONAL_INCLUDE_DIR) ENDIF(FREETYPE_ADDITIONAL_INCLUDE_DIR) FIND_LIBRARY(FREETYPE_LIBRARY - NAMES freetype libfreetype freetype219 + NAMES freetype libfreetype freetype219 freetype246 PATHS $ENV{FREETYPE_DIR}/lib /usr/local/lib @@ -57,6 +57,13 @@ FIND_LIBRARY(FREETYPE_LIBRARY IF(FREETYPE_LIBRARY AND FREETYPE_INCLUDE_DIRS) SET(FREETYPE_FOUND "YES") + IF(WITH_STATIC_EXTERNAL AND APPLE) + FIND_PACKAGE(BZip2) + IF(BZIP2_FOUND) + SET(FREETYPE_INCLUDE_DIRS ${FREETYPE_INCLUDE_DIRS} ${BZIP2_INCLUDE_DIR}) + SET(FREETYPE_LIBRARY ${FREETYPE_LIBRARY} ${BZIP2_LIBRARIES}) + ENDIF(BZIP2_FOUND) + ENDIF(WITH_STATIC_EXTERNAL AND APPLE) IF(NOT FREETYPE_FIND_QUIETLY) MESSAGE(STATUS "Found FreeType: ${FREETYPE_LIBRARY}") ENDIF(NOT FREETYPE_FIND_QUIETLY) diff --git a/code/CMakeModules/FindLibwww.cmake b/code/CMakeModules/FindLibwww.cmake index 8f1c1c02a..77140492e 100644 --- a/code/CMakeModules/FindLibwww.cmake +++ b/code/CMakeModules/FindLibwww.cmake @@ -6,6 +6,8 @@ # LIBWWW_LIBRARY, where to find the LibWWW library. # LIBWWW_FOUND, If false, do not try to use LibWWW. +OPTION(WITH_LIBWWW_STATIC "Use only static libraries for libwww" OFF) + SET(LIBWWW_FIND_QUIETLY ${Libwww_FIND_QUIETLY}) # also defined, but not for general use are @@ -46,6 +48,11 @@ ENDIF(LIBWWW_ADDITIONAL_INCLUDE_DIR) # helper to find all the libwww sub libraries MACRO(FIND_WWW_LIBRARY MYLIBRARY OPTION) + IF(WITH_LIBWWW_STATIC AND UNIX AND NOT APPLE AND NOT WITH_STATIC_EXTERNAL) + SET(CMAKE_FIND_LIBRARY_SUFFIXES_OLD ${CMAKE_FIND_LIBRARY_SUFFIXES}) + SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a") + ENDIF(WITH_LIBWWW_STATIC AND UNIX AND NOT APPLE AND NOT WITH_STATIC_EXTERNAL) + FIND_LIBRARY(${MYLIBRARY} NAMES ${ARGN} PATHS @@ -60,21 +67,27 @@ MACRO(FIND_WWW_LIBRARY MYLIBRARY OPTION) /usr/freeware/lib64 ) + IF(CMAKE_FIND_LIBRARY_SUFFIXES_OLD) + SET(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_OLD}) + ENDIF(CMAKE_FIND_LIBRARY_SUFFIXES_OLD) + IF(${MYLIBRARY}) - IF(${OPTION} STREQUAL REQUIRED OR WITH_STATIC) + IF(${OPTION} STREQUAL REQUIRED OR WITH_STATIC OR WITH_LIBWWW_STATIC) SET(LIBWWW_LIBRARIES ${LIBWWW_LIBRARIES} ${${MYLIBRARY}}) - ENDIF(${OPTION} STREQUAL REQUIRED OR WITH_STATIC) + ENDIF(${OPTION} STREQUAL REQUIRED OR WITH_STATIC OR WITH_LIBWWW_STATIC) ELSE(${MYLIBRARY}) - IF(NOT LIBWWW_FIND_QUIETLY) + IF(NOT LIBWWW_FIND_QUIETLY AND NOT WIN32) MESSAGE(STATUS "Warning: Libwww: Library not found: ${MYLIBRARY}") - ENDIF(NOT LIBWWW_FIND_QUIETLY) + ENDIF(NOT LIBWWW_FIND_QUIETLY AND NOT WIN32) ENDIF(${MYLIBRARY}) MARK_AS_ADVANCED(${MYLIBRARY}) ENDMACRO(FIND_WWW_LIBRARY) MACRO(LINK_WWW_LIBRARY MYLIBRARY OTHERLIBRARY SYMBOL) - LINK_DEPENDS(LIBWWW_LIBRARIES ${MYLIBRARY} ${OTHERLIBRARY} ${SYMBOL}) + IF(NOT WITH_LIBWWW_STATIC AND NOT WITH_STATIC_EXTERNAL) + LINK_DEPENDS(LIBWWW_LIBRARIES ${MYLIBRARY} ${OTHERLIBRARY} ${SYMBOL}) + ENDIF(NOT WITH_LIBWWW_STATIC AND NOT WITH_STATIC_EXTERNAL) ENDMACRO(LINK_WWW_LIBRARY) # Find and link required libs for static or dynamic diff --git a/code/CMakeModules/FindMercurial.cmake b/code/CMakeModules/FindMercurial.cmake new file mode 100644 index 000000000..9c252ad17 --- /dev/null +++ b/code/CMakeModules/FindMercurial.cmake @@ -0,0 +1,108 @@ +# - Extract information from a subversion working copy +# The module defines the following variables: +# Mercurial_HG_EXECUTABLE - path to hg command line client +# Mercurial_VERSION_HG - version of hg command line client +# Mercurial_FOUND - true if the command line client was found +# MERCURIAL_FOUND - same as Mercurial_FOUND, set for compatiblity reasons +# +# The minimum required version of Mercurial can be specified using the +# standard syntax, e.g. FIND_PACKAGE(Mercurial 1.4) +# +# If the command line client executable is found two macros are defined: +# Mercurial_WC_INFO( ) +# Mercurial_WC_LOG( ) +# Mercurial_WC_INFO extracts information of a subversion working copy at +# a given location. This macro defines the following variables: +# _WC_URL - url of the repository (at ) +# _WC_ROOT - root url of the repository +# _WC_REVISION - current revision +# _WC_LAST_CHANGED_AUTHOR - author of last commit +# _WC_LAST_CHANGED_DATE - date of last commit +# _WC_LAST_CHANGED_REV - revision of last commit +# _WC_INFO - output of command `hg info ' +# Mercurial_WC_LOG retrieves the log message of the base revision of a +# subversion working copy at a given location. This macro defines the +# variable: +# _LAST_CHANGED_LOG - last log of base revision +# Example usage: +# FIND_PACKAGE(Mercurial) +# IF(MERCURIAL_FOUND) +# Mercurial_WC_INFO(${PROJECT_SOURCE_DIR} Project) +# MESSAGE("Current revision is ${Project_WC_REVISION}") +# Mercurial_WC_LOG(${PROJECT_SOURCE_DIR} Project) +# MESSAGE("Last changed log is ${Project_LAST_CHANGED_LOG}") +# ENDIF(MERCURIAL_FOUND) + +#============================================================================= +# Copyright 2006-2009 Kitware, Inc. +# Copyright 2006 Tristan Carel +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +FIND_PROGRAM(Mercurial_HG_EXECUTABLE hg + DOC "mercurial command line client") +MARK_AS_ADVANCED(Mercurial_HG_EXECUTABLE) + +IF(Mercurial_HG_EXECUTABLE) + EXECUTE_PROCESS(COMMAND ${Mercurial_HG_EXECUTABLE} --version + OUTPUT_VARIABLE Mercurial_VERSION_HG + OUTPUT_STRIP_TRAILING_WHITESPACE) + + STRING(REGEX REPLACE ".*version ([\\.0-9]+).*" + "\\1" Mercurial_VERSION_HG "${Mercurial_VERSION_HG}") + + MACRO(Mercurial_WC_INFO dir prefix) + EXECUTE_PROCESS(COMMAND ${Mercurial_HG_EXECUTABLE} tip + WORKING_DIRECTORY ${dir} + OUTPUT_VARIABLE ${prefix}_WC_INFO + ERROR_VARIABLE Mercurial_hg_info_error + RESULT_VARIABLE Mercurial_hg_info_result + OUTPUT_STRIP_TRAILING_WHITESPACE) + + IF(NOT ${Mercurial_hg_info_result} EQUAL 0) + MESSAGE(SEND_ERROR "Command \"${Mercurial_HG_EXECUTABLE} tip\" failed with output:\n${Mercurial_hg_info_error}") + ELSE(NOT ${Mercurial_hg_info_result} EQUAL 0) + + STRING(REGEX REPLACE "^(.*\n)?Repository Root: ([^\n]+).*" + "\\2" ${prefix}_WC_ROOT "${${prefix}_WC_INFO}") + STRING(REGEX REPLACE "^(.*\n)?changeset: *([0-9]+).*" + "\\2" ${prefix}_WC_REVISION "${${prefix}_WC_INFO}") + STRING(REGEX REPLACE "^(.*\n)?Last Changed Author: ([^\n]+).*" + "\\2" ${prefix}_WC_LAST_CHANGED_AUTHOR "${${prefix}_WC_INFO}") + STRING(REGEX REPLACE "^(.*\n)?Last Changed Rev: ([^\n]+).*" + "\\2" ${prefix}_WC_LAST_CHANGED_REV "${${prefix}_WC_INFO}") + STRING(REGEX REPLACE "^(.*\n)?Last Changed Date: ([^\n]+).*" + "\\2" ${prefix}_WC_LAST_CHANGED_DATE "${${prefix}_WC_INFO}") + + ENDIF(NOT ${Mercurial_hg_info_result} EQUAL 0) + + ENDMACRO(Mercurial_WC_INFO) + + MACRO(Mercurial_WC_LOG dir prefix) + # This macro can block if the certificate is not signed: + # hg ask you to accept the certificate and wait for your answer + # This macro requires a hg server network access (Internet most of the time) + # and can also be slow since it access the hg server + EXECUTE_PROCESS(COMMAND + ${Mercurial_HG_EXECUTABLE} --non-interactive log -r BASE ${dir} + OUTPUT_VARIABLE ${prefix}_LAST_CHANGED_LOG + ERROR_VARIABLE Mercurial_hg_log_error + RESULT_VARIABLE Mercurial_hg_log_result + OUTPUT_STRIP_TRAILING_WHITESPACE) + + IF(NOT ${Mercurial_hg_log_result} EQUAL 0) + MESSAGE(SEND_ERROR "Command \"${Mercurial_HG_EXECUTABLE} log -r BASE ${dir}\" failed with output:\n${Mercurial_hg_log_error}") + ENDIF(NOT ${Mercurial_hg_log_result} EQUAL 0) + ENDMACRO(Mercurial_WC_LOG) +ENDIF(Mercurial_HG_EXECUTABLE) + +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Mercurial DEFAULT_MSG Mercurial_HG_EXECUTABLE) diff --git a/code/CMakeModules/FindWindowsSDK.cmake b/code/CMakeModules/FindWindowsSDK.cmake index 30e507f85..25903be14 100644 --- a/code/CMakeModules/FindWindowsSDK.cmake +++ b/code/CMakeModules/FindWindowsSDK.cmake @@ -33,6 +33,12 @@ FIND_PATH(WINSDK_INCLUDE_DIR Windows.h ${WINSDKCURRENT_DIR}/Include ) +FIND_PROGRAM(WINSDK_SIGNTOOL signtool + PATHS + ${WINSDK71_DIR}/Bin + ${WINSDKCURRENT_DIR}/Bin +) + IF(WINSDK_INCLUDE_DIR) SET(WINSDK_FOUND TRUE) ELSE(WINSDK_INCLUDE_DIR) diff --git a/code/CMakeModules/GetRevision.cmake b/code/CMakeModules/GetRevision.cmake new file mode 100644 index 000000000..ee3fa2e90 --- /dev/null +++ b/code/CMakeModules/GetRevision.cmake @@ -0,0 +1,59 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.6.3) + +# ROOT_DIR should be set to root of the repository (where to find the .svn or .hg directory) +# SOURCE_DIR should be set to root of your code (where to find CMakeLists.txt) + +# Replace spaces by semi-columns +IF(CMAKE_MODULE_PATH) + STRING(REPLACE " " ";" CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}) +ENDIF(CMAKE_MODULE_PATH) + +SET(CMAKE_MODULE_PATH ${SOURCE_DIR}/CMakeModules ${CMAKE_MODULE_PATH}) + +IF(NOT ROOT_DIR AND SOURCE_DIR) + SET(ROOT_DIR ${SOURCE_DIR}) +ENDIF(NOT ROOT_DIR AND SOURCE_DIR) + +IF(NOT SOURCE_DIR AND ROOT_DIR) + SET(SOURCE_DIR ${ROOT_DIR}) +ENDIF(NOT SOURCE_DIR AND ROOT_DIR) + +MACRO(NOW RESULT) + IF (WIN32) + EXECUTE_PROCESS(COMMAND "wmic" "os" "get" "localdatetime" OUTPUT_VARIABLE DATETIME) + IF(NOT DATETIME MATCHES "ERROR") + STRING(REGEX REPLACE ".*\n([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9]).*" "\\1-\\2-\\3 \\4:\\5:\\6" ${RESULT} "${DATETIME}") + ENDIF(NOT DATETIME MATCHES "ERROR") + ELSEIF(UNIX) + EXECUTE_PROCESS(COMMAND "date" "+'%Y-%m-%d %H:%M:%S'" OUTPUT_VARIABLE ${RESULT}) + ELSE (WIN32) + MESSAGE(SEND_ERROR "date not implemented") + SET(${RESULT} "0000-00-00 00:00:00") + ENDIF (WIN32) +ENDMACRO(NOW) + +IF(EXISTS "${ROOT_DIR}/.svn/") + FIND_PACKAGE(Subversion) + + IF(SUBVERSION_FOUND) + Subversion_WC_INFO(${ROOT_DIR} ER) + SET(REVISION ${ER_WC_REVISION}) + ENDIF(SUBVERSION_FOUND) +ENDIF(EXISTS "${ROOT_DIR}/.svn/") + +IF(EXISTS "${ROOT_DIR}/.hg/") + FIND_PACKAGE(Mercurial) + + IF(MERCURIAL_FOUND) + Mercurial_WC_INFO(${ROOT_DIR} ER) + SET(REVISION ${ER_WC_REVISION}) + ENDIF(MERCURIAL_FOUND) +ENDIF(EXISTS "${ROOT_DIR}/.hg/") + +IF(REVISION) + IF(EXISTS ${SOURCE_DIR}/revision.h.in) + NOW(BUILD_DATE) + CONFIGURE_FILE(${SOURCE_DIR}/revision.h.in revision.h.txt) + EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy revision.h.txt revision.h) # copy_if_different + ENDIF(EXISTS ${SOURCE_DIR}/revision.h.in) +ENDIF(REVISION) diff --git a/code/CMakeModules/PCHSupport.cmake b/code/CMakeModules/PCHSupport.cmake index bb34aebfe..ae5b30ee2 100644 --- a/code/CMakeModules/PCHSupport.cmake +++ b/code/CMakeModules/PCHSupport.cmake @@ -8,44 +8,40 @@ # ADD_PRECOMPILED_HEADER_TO_TARGET _targetName _input _pch_output_to_use # ADD_NATIVE_PRECOMPILED_HEADER _targetName _inputh _inputcpp -IF(CMAKE_COMPILER_IS_GNUCXX) +IF(MSVC) + SET(PCHSupport_FOUND TRUE) + SET(_PCH_include_prefix "/I") +ELSE(MSVC) + IF(CMAKE_COMPILER_IS_GNUCXX) + EXEC_PROGRAM(${CMAKE_CXX_COMPILER} + ARGS ${CMAKE_CXX_COMPILER_ARG1} -dumpversion + OUTPUT_VARIABLE gcc_compiler_version) - EXEC_PROGRAM( - ${CMAKE_CXX_COMPILER} - ARGS ${CMAKE_CXX_COMPILER_ARG1} -dumpversion - OUTPUT_VARIABLE gcc_compiler_version) - - IF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]") - SET(PCHSupport_FOUND TRUE) - ELSE(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]") - IF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]") + IF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]") SET(PCHSupport_FOUND TRUE) - ENDIF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]") - ENDIF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]") + ELSE(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]") + IF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]") + SET(PCHSupport_FOUND TRUE) + ENDIF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]") + ENDIF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]") + ELSE(CMAKE_COMPILER_IS_GNUCXX) + # TODO: make tests for other compilers than GCC + SET(PCHSupport_FOUND TRUE) + ENDIF(CMAKE_COMPILER_IS_GNUCXX) SET(_PCH_include_prefix "-I") - -ELSE(CMAKE_COMPILER_IS_GNUCXX) - - IF(WIN32) - SET(PCHSupport_FOUND TRUE) # for experimental msvc support - SET(_PCH_include_prefix "/I") - ELSE(WIN32) - SET(PCHSupport_FOUND FALSE) - ENDIF(WIN32) - -ENDIF(CMAKE_COMPILER_IS_GNUCXX) +ENDIF(MSVC) MACRO(_PCH_GET_COMPILE_FLAGS _out_compile_flags) STRING(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name) SET(${_out_compile_flags} ${${_flags_var_name}} ) - IF(CMAKE_COMPILER_IS_GNUCXX) + IF(NOT MSVC) GET_TARGET_PROPERTY(_targetType ${_PCH_current_target} TYPE) IF(${_targetType} STREQUAL SHARED_LIBRARY OR ${_targetType} STREQUAL MODULE_LIBRARY) LIST(APPEND ${_out_compile_flags} "-fPIC") ENDIF(${_targetType} STREQUAL SHARED_LIBRARY OR ${_targetType} STREQUAL MODULE_LIBRARY) - ENDIF(CMAKE_COMPILER_IS_GNUCXX) + ENDIF(NOT MSVC) GET_DIRECTORY_PROPERTY(DIRINC INCLUDE_DIRECTORIES ) FOREACH(item ${DIRINC}) @@ -100,17 +96,13 @@ MACRO(_PCH_GET_COMPILE_COMMAND out_command _input _inputcpp _output) SET(pchsupport_compiler_cxx_arg1 "") ENDIF(CMAKE_CXX_COMPILER_ARG1) - IF(CMAKE_COMPILER_IS_GNUCXX) - SET(${out_command} - ${CMAKE_CXX_COMPILER} ${pchsupport_compiler_cxx_arg1} ${_compile_FLAGS} -x c++-header -o ${_output} -c ${_input} - ) - ELSE(CMAKE_COMPILER_IS_GNUCXX) + IF(MSVC) _PCH_GET_PDB_FILENAME(PDB_FILE ${_PCH_current_target}) - SET(${out_command} - ${CMAKE_CXX_COMPILER} ${pchsupport_compiler_cxx_arg1} ${_compile_FLAGS} /Yc /Fp\"${_output}\" ${_inputcpp} /c /Fd\"${PDB_FILE}\" - ) - ENDIF(CMAKE_COMPILER_IS_GNUCXX) -ENDMACRO(_PCH_GET_COMPILE_COMMAND ) + SET(${out_command} ${CMAKE_CXX_COMPILER} ${pchsupport_compiler_cxx_arg1} ${_compile_FLAGS} /Yc /Fp\"${_output}\" ${_inputcpp} /c /Fd\"${PDB_FILE}\") + ELSE(MSVC) + SET(${out_command} ${CMAKE_CXX_COMPILER} ${pchsupport_compiler_cxx_arg1} ${_compile_FLAGS} -x c++-header -o ${_output} -c ${_input}) + ENDIF(MSVC) +ENDMACRO(_PCH_GET_COMPILE_COMMAND) MACRO(GET_PRECOMPILED_HEADER_OUTPUT _targetName _input _output) IF(MSVC) @@ -128,7 +120,9 @@ MACRO(ADD_PRECOMPILED_HEADER_TO_TARGET _targetName _input _pch_output_to_use ) SET(oldProps "") ENDIF(${oldProps} MATCHES NOTFOUND) - IF(CMAKE_COMPILER_IS_GNUCXX) + IF(MSVC) + SET(_target_cflags "${oldProps} /Yu\"${_input}\" /FI\"${_input}\" /Fp\"${_pch_output_to_use}\"") + ELSE(MSVC) # to do: test whether compiler flags match between target _targetName # and _pch_output_to_use FILE(TO_NATIVE_PATH ${_pch_output_to_use} _native_pch_path) @@ -137,11 +131,7 @@ MACRO(ADD_PRECOMPILED_HEADER_TO_TARGET _targetName _input _pch_output_to_use ) # on all remote machines set # PCH_ADDITIONAL_COMPILER_FLAGS to -fpch-preprocess SET(_target_cflags "${oldProps} ${PCH_ADDITIONAL_COMPILER_FLAGS}-include ${_input} -Winvalid-pch") - ELSE(CMAKE_COMPILER_IS_GNUCXX) - IF(MSVC) - SET(_target_cflags "${oldProps} /Yu\"${_input}\" /FI\"${_input}\" /Fp\"${_pch_output_to_use}\"") - ENDIF(MSVC) - ENDIF(CMAKE_COMPILER_IS_GNUCXX) + ENDIF(MSVC) SET_TARGET_PROPERTIES(${_targetName} PROPERTIES COMPILE_FLAGS ${_target_cflags}) IF(oldProps) @@ -184,8 +174,31 @@ MACRO(ADD_PRECOMPILED_HEADER _targetName _inputh _inputcpp) ADD_PRECOMPILED_HEADER_TO_TARGET(${_targetName} ${_inputh} ${_output}) ENDMACRO(ADD_PRECOMPILED_HEADER) +# Macro to move PCH creation file to the front of files list +MACRO(FIX_PRECOMPILED_HEADER _files _pch) + # Remove .cpp creating PCH from the list + LIST(REMOVE_ITEM ${_files} ${_pch}) + # Prepend .cpp creating PCH to the list + LIST(INSERT ${_files} 0 ${_pch}) +ENDMACRO(FIX_PRECOMPILED_HEADER) + MACRO(ADD_NATIVE_PRECOMPILED_HEADER _targetName _inputh _inputcpp) - IF(CMAKE_GENERATOR MATCHES Visual*) + SET(PCH_METHOD 0) + + # 0 => creating a new target for PCH, works for all makefiles + # 1 => setting PCH for VC++ project, works for VC++ projects + # 2 => setting PCH for XCode project, works for XCode projects + IF(CMAKE_GENERATOR MATCHES "Visual Studio") + SET(PCH_METHOD 1) + ELSEIF(CMAKE_GENERATOR MATCHES "NMake Makefiles" AND MFC_FOUND AND CMAKE_MFC_FLAG) + # To fix a bug with MFC + # Don't forget to use FIX_PRECOMPILED_HEADER before creating the target +# SET(PCH_METHOD 1) + ELSEIF(CMAKE_GENERATOR MATCHES "Xcode") + SET(PCH_METHOD 2) + ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio") + + IF(PCH_METHOD EQUAL 1) # Auto include the precompile (useful for moc processing, since the use of # precompiled is specified at the target level # and I don't want to specifiy /F- for each moc/res/ui generated files (using Qt) @@ -200,26 +213,24 @@ MACRO(ADD_NATIVE_PRECOMPILED_HEADER _targetName _inputh _inputcpp) #also inlude ${oldProps} to have the same compile options SET_SOURCE_FILES_PROPERTIES(${_inputcpp} PROPERTIES COMPILE_FLAGS "${oldProps} /Yc\"${_inputh}\"") - ELSE(CMAKE_GENERATOR MATCHES Visual*) - IF(CMAKE_GENERATOR MATCHES Xcode) - # For Xcode, cmake needs my patch to process - # GCC_PREFIX_HEADER and GCC_PRECOMPILE_PREFIX_HEADER as target properties + ELSEIF(PCH_METHOD EQUAL 2) + # For Xcode, cmake needs my patch to process + # GCC_PREFIX_HEADER and GCC_PRECOMPILE_PREFIX_HEADER as target properties - GET_TARGET_PROPERTY(oldProps ${_targetName} COMPILE_FLAGS) - IF(${oldProps} MATCHES NOTFOUND) - SET(oldProps "") - ENDIF(${oldProps} MATCHES NOTFOUND) + GET_TARGET_PROPERTY(oldProps ${_targetName} COMPILE_FLAGS) + IF(${oldProps} MATCHES NOTFOUND) + SET(oldProps "") + ENDIF(${oldProps} MATCHES NOTFOUND) - # When buiding out of the tree, precompiled may not be located - # Use full path instead. - GET_FILENAME_COMPONENT(fullPath ${_inputh} ABSOLUTE) + # When buiding out of the tree, precompiled may not be located + # Use full path instead. + GET_FILENAME_COMPONENT(fullPath ${_inputh} ABSOLUTE) - SET_TARGET_PROPERTIES(${_targetName} PROPERTIES XCODE_ATTRIBUTE_GCC_PREFIX_HEADER "${fullPath}") - SET_TARGET_PROPERTIES(${_targetName} PROPERTIES XCODE_ATTRIBUTE_GCC_PRECOMPILE_PREFIX_HEADER "YES") - ELSE(CMAKE_GENERATOR MATCHES Xcode) - #Fallback to the "old" precompiled suppport - ADD_PRECOMPILED_HEADER(${_targetName} ${_inputh} ${_inputcpp}) - ENDIF(CMAKE_GENERATOR MATCHES Xcode) - ENDIF(CMAKE_GENERATOR MATCHES Visual*) + SET_TARGET_PROPERTIES(${_targetName} PROPERTIES XCODE_ATTRIBUTE_GCC_PREFIX_HEADER "${fullPath}") + SET_TARGET_PROPERTIES(${_targetName} PROPERTIES XCODE_ATTRIBUTE_GCC_PRECOMPILE_PREFIX_HEADER "YES") + ELSE(PCH_METHOD EQUAL 1) + #Fallback to the "old" precompiled suppport + ADD_PRECOMPILED_HEADER(${_targetName} ${_inputh} ${_inputcpp}) + ENDIF(PCH_METHOD EQUAL 1) ENDMACRO(ADD_NATIVE_PRECOMPILED_HEADER) diff --git a/code/CMakeModules/nel.cmake b/code/CMakeModules/nel.cmake index d2a5cb014..bd92e743e 100644 --- a/code/CMakeModules/nel.cmake +++ b/code/CMakeModules/nel.cmake @@ -3,12 +3,39 @@ # Argument: name - the name of the .pc package, e.g. "nel-pacs.pc" ### MACRO(NL_GEN_PC name) - IF(NOT WIN32) + IF(NOT WIN32 AND WITH_INSTALL_LIBRARIES) CONFIGURE_FILE(${name}.in "${CMAKE_CURRENT_BINARY_DIR}/${name}") INSTALL(FILES "${CMAKE_CURRENT_BINARY_DIR}/${name}" DESTINATION lib/pkgconfig) - ENDIF(NOT WIN32) + ENDIF(NOT WIN32 AND WITH_INSTALL_LIBRARIES) ENDMACRO(NL_GEN_PC) +### +# Helper macro that generates revision.h from revision.h.in +### +MACRO(NL_GEN_REVISION_H) + IF(EXISTS ${CMAKE_SOURCE_DIR}/revision.h.in) + INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}) + ADD_DEFINITIONS(-DHAVE_REVISION_H) + SET(HAVE_REVISION_H ON) + + # a custom target that is always built + ADD_CUSTOM_TARGET(revision ALL + DEPENDS ${CMAKE_BINARY_DIR}/revision.h) + + # creates revision.h using cmake script + ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_BINARY_DIR}/revision.h + COMMAND ${CMAKE_COMMAND} + -DSOURCE_DIR=${CMAKE_SOURCE_DIR} + -DROOT_DIR=${CMAKE_SOURCE_DIR}/.. + -P ${CMAKE_SOURCE_DIR}/CMakeModules/GetRevision.cmake) + + # revision.h is a generated file + SET_SOURCE_FILES_PROPERTIES(${CMAKE_BINARY_DIR}/revision.h + PROPERTIES GENERATED TRUE + HEADER_FILE_ONLY TRUE) + ENDIF(EXISTS ${CMAKE_SOURCE_DIR}/revision.h.in) +ENDMACRO(NL_GEN_REVISION_H) + ### # ### @@ -49,6 +76,15 @@ MACRO(NL_DEFAULT_PROPS name label) SET_TARGET_PROPERTIES(${name} PROPERTIES INSTALL_NAME_DIR ${NL_LIB_PREFIX}) ENDIF(NL_LIB_PREFIX) ENDIF(${type} STREQUAL SHARED_LIBRARY) + + IF(${type} STREQUAL EXECUTABLE AND WIN32) + SET_TARGET_PROPERTIES(${name} PROPERTIES + VERSION ${NL_VERSION} + SOVERSION ${NL_VERSION_MAJOR} + COMPILE_FLAGS "/GA" + LINK_FLAGS "/VERSION:${NL_VERSION}") + ENDIF(${type} STREQUAL EXECUTABLE AND WIN32) + IF(WITH_STLPORT AND WIN32) SET_TARGET_PROPERTIES(${name} PROPERTIES COMPILE_FLAGS "/X") ENDIF(WITH_STLPORT AND WIN32) @@ -171,7 +207,13 @@ MACRO(NL_SETUP_DEFAULT_OPTIONS) OPTION(WITH_STATIC "With static libraries." OFF) ENDIF(WIN32) OPTION(WITH_STATIC_DRIVERS "With static drivers." OFF) + IF(WIN32) + OPTION(WITH_EXTERNAL "With provided external." ON ) + ELSE(WIN32) + OPTION(WITH_EXTERNAL "With provided external." OFF) + ENDIF(WIN32) OPTION(WITH_STATIC_EXTERNAL "With static external libraries" OFF) + OPTION(WITH_INSTALL_LIBRARIES "Install development files." ON ) ### # GUI toolkits @@ -196,10 +238,10 @@ MACRO(NL_SETUP_DEFAULT_OPTIONS) OPTION(BUILD_DASHBOARD "Build to the CDash dashboard" OFF) - OPTION(WITH_NEL "Build NeL (nearly always required)." ON ) - OPTION(WITH_NELNS "Build NeL Network Services." OFF) - OPTION(WITH_RYZOM "Build Ryzom Core." ON ) - OPTION(WITH_SNOWBALLS "Build Snowballs." OFF) + OPTION(WITH_NEL "Build NeL (nearly always required)." ON ) + OPTION(WITH_NELNS "Build NeL Network Services." OFF) + OPTION(WITH_RYZOM "Build Ryzom Core." ON ) + OPTION(WITH_SNOWBALLS "Build Snowballs." OFF) ENDMACRO(NL_SETUP_DEFAULT_OPTIONS) MACRO(NL_SETUP_NEL_DEFAULT_OPTIONS) @@ -289,44 +331,90 @@ MACRO(NL_SETUP_BUILD) ENDIF(CMAKE_BUILD_TYPE MATCHES "Release") ENDIF(CMAKE_BUILD_TYPE MATCHES "Debug") - # Determine target CPU -# IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86") - IF(NOT CMAKE_SIZEOF_VOID_P) - INCLUDE (CheckTypeSize) - CHECK_TYPE_SIZE("void*" CMAKE_SIZEOF_VOID_P) - ENDIF(NOT CMAKE_SIZEOF_VOID_P) + SET(HOST_CPU ${CMAKE_SYSTEM_PROCESSOR}) - # Using 32 or 64 bits libraries + # Determine target CPU + IF(NOT TARGET_CPU) + SET(TARGET_CPU $ENV{DEB_HOST_GNU_CPU}) + ENDIF(NOT TARGET_CPU) + + # If not specified, use the same CPU as host + IF(NOT TARGET_CPU) + SET(TARGET_CPU ${CMAKE_SYSTEM_PROCESSOR}) + ENDIF(NOT TARGET_CPU) + + IF(TARGET_CPU MATCHES "amd64") + SET(TARGET_CPU "x86_64") + ELSEIF(TARGET_CPU MATCHES "i.86") + SET(TARGET_CPU "x86") + ENDIF(TARGET_CPU MATCHES "amd64") + + # DEB_HOST_ARCH_ENDIAN is 'little' or 'big' + # DEB_HOST_ARCH_BITS is '32' or '64' + + # If target and host CPU are the same + IF("${HOST_CPU}" STREQUAL "${TARGET_CPU}") + # x86-compatible CPU + IF(HOST_CPU MATCHES "x86") + IF(NOT CMAKE_SIZEOF_VOID_P) + INCLUDE (CheckTypeSize) + CHECK_TYPE_SIZE("void*" CMAKE_SIZEOF_VOID_P) + ENDIF(NOT CMAKE_SIZEOF_VOID_P) + + # Using 32 or 64 bits libraries + IF(CMAKE_SIZEOF_VOID_P EQUAL 8) + SET(TARGET_CPU "x86_64") + ELSE(CMAKE_SIZEOF_VOID_P EQUAL 8) + SET(TARGET_CPU "x86") + ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 8) + ENDIF(HOST_CPU MATCHES "x86") + # TODO: add checks for ARM and PPC + ELSE("${HOST_CPU}" STREQUAL "${TARGET_CPU}") + MESSAGE(STATUS "Compiling on ${HOST_CPU} for ${TARGET_CPU}") + ENDIF("${HOST_CPU}" STREQUAL "${TARGET_CPU}") + + IF(TARGET_CPU STREQUAL "x86_64") + SET(TARGET_X64 1) + SET(PLATFORM_CFLAGS "-DHAVE_X86_64") + ELSEIF(TARGET_CPU STREQUAL "x86") SET(TARGET_X86 1) - IF(CMAKE_SIZEOF_VOID_P EQUAL 8) - SET(ARCH "x86_64") - SET(TARGET_X64 1) - ADD_DEFINITIONS(-DHAVE_X86_64) - ELSE(CMAKE_SIZEOF_VOID_P EQUAL 8) - SET(ARCH "x86") - ADD_DEFINITIONS(-DHAVE_X86) - ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 8) -# ADD_DEFINITIONS(-DHAVE_IA64) -# ENDIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86") - - IF(WIN32) + SET(PLATFORM_CFLAGS "-DHAVE_X86") + ENDIF(TARGET_CPU STREQUAL "x86_64") + + # Fix library paths suffixes for Debian MultiArch + IF(NOT CMAKE_LIBRARY_ARCHITECTURE) + SET(CMAKE_LIBRARY_ARCHITECTURE $ENV{DEB_HOST_MULTIARCH}) + ENDIF(NOT CMAKE_LIBRARY_ARCHITECTURE) + + IF(CMAKE_LIBRARY_ARCHITECTURE) + SET(CMAKE_LIBRARY_PATH "/lib/${CMAKE_LIBRARY_ARCHITECTURE};/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE};${CMAKE_LIBRARY_PATH}") + ENDIF(CMAKE_LIBRARY_ARCHITECTURE) + + IF(MSVC) IF(MSVC10) # /Ox is working with VC++ 2010, but custom optimizations don't exist SET(SPEED_OPTIMIZATIONS "/Ox /GF /GS-") # without inlining it's unusable, use custom optimizations again SET(MIN_OPTIMIZATIONS "/Od /Ob1") - ELSE(MSVC10) + ELSEIF(MSVC90) # don't use a /O[012x] flag if you want custom optimizations SET(SPEED_OPTIMIZATIONS "/Ob2 /Oi /Ot /Oy /GT /GF /GS-") # without inlining it's unusable, use custom optimizations again SET(MIN_OPTIMIZATIONS "/Ob1") + ELSEIF(MSVC80) + # don't use a /O[012x] flag if you want custom optimizations + SET(SPEED_OPTIMIZATIONS "/Ox /GF /GS-") + # without inlining it's unusable, use custom optimizations again + SET(MIN_OPTIMIZATIONS "/Od /Ob1") + ELSE(MSVC10) + MESSAGE(FATAL_ERROR "Can't determine compiler version ${MSVC_VERSION}") ENDIF(MSVC10) - SET(PLATFORM_CFLAGS "/D_CRT_SECURE_NO_WARNINGS /D_CRT_NONSTDC_NO_WARNINGS /DWIN32 /D_WINDOWS /W3 /Zi /Zm1000 /MP /Gy-") + SET(PLATFORM_CFLAGS "${PLATFORM_CFLAGS} /D_CRT_SECURE_NO_WARNINGS /D_CRT_NONSTDC_NO_WARNINGS /DWIN32 /D_WINDOWS /W3 /Zi /Zm1000 /MP /Gy-") # Common link flags SET(PLATFORM_LINKFLAGS "-DEBUG") - + IF(TARGET_X64) # Fix a bug with Intellisense SET(PLATFORM_CFLAGS "${PLATFORM_CFLAGS} /D_WIN64") @@ -344,8 +432,17 @@ MACRO(NL_SETUP_BUILD) SET(NL_RELEASE_CFLAGS "/MD /D NDEBUG ${SPEED_OPTIMIZATIONS}") SET(NL_DEBUG_LINKFLAGS "/NODEFAULTLIB:msvcrt /INCREMENTAL:YES") SET(NL_RELEASE_LINKFLAGS "/OPT:REF /OPT:ICF /INCREMENTAL:NO") - ELSE(WIN32) - SET(PLATFORM_CFLAGS "-g -pipe -ftemplate-depth-48 -D_REENTRANT -Wall -ansi -W -Wpointer-arith -Wsign-compare -Wno-deprecated-declarations -Wno-multichar -Wno-unused -fno-strict-aliasing") + ELSE(MSVC) + IF(HOST_CPU STREQUAL "x86_64" AND TARGET_CPU STREQUAL "x86") + SET(PLATFORM_CFLAGS "${PLATFORM_CFLAGS} -m32 -march=i686") + ENDIF(HOST_CPU STREQUAL "x86_64" AND TARGET_CPU STREQUAL "x86") + + IF(HOST_CPU STREQUAL "x86" AND TARGET_CPU STREQUAL "x86_64") + SET(PLATFORM_CFLAGS "${PLATFORM_CFLAGS} -m64") + ENDIF(HOST_CPU STREQUAL "x86" AND TARGET_CPU STREQUAL "x86_64") + + SET(PLATFORM_CFLAGS "${PLATFORM_CFLAGS} -g -D_REENTRANT -pipe -ftemplate-depth-48 -Wall -ansi -W -Wpointer-arith -Wsign-compare -Wno-deprecated-declarations -Wno-multichar -Wno-unused -fno-strict-aliasing") + IF(WITH_COVERAGE) SET(PLATFORM_CFLAGS "-fprofile-arcs -ftest-coverage ${PLATFORM_CFLAGS}") ENDIF(WITH_COVERAGE) @@ -354,15 +451,20 @@ MACRO(NL_SETUP_BUILD) SET(PLATFORM_CFLAGS "-gdwarf-2 ${PLATFORM_CFLAGS}") ENDIF(APPLE) + # Fix "relocation R_X86_64_32 against.." error on x64 platforms + IF(TARGET_X64 AND WITH_STATIC AND NOT WITH_STATIC_DRIVERS) + SET(PLATFORM_CFLAGS "-fPIC ${PLATFORM_CFLAGS}") + ENDIF(TARGET_X64 AND WITH_STATIC AND NOT WITH_STATIC_DRIVERS) + SET(PLATFORM_CXXFLAGS ${PLATFORM_CFLAGS}) IF(NOT APPLE) - SET(PLATFORM_LINKFLAGS "-Wl,--no-undefined -Wl,--as-needed") + SET(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -Wl,--no-undefined -Wl,--as-needed") ENDIF(NOT APPLE) SET(NL_DEBUG_CFLAGS "-DNL_DEBUG -D_DEBUG") SET(NL_RELEASE_CFLAGS "-DNL_RELEASE -DNDEBUG -O6") - ENDIF(WIN32) + ENDIF(MSVC) ENDMACRO(NL_SETUP_BUILD) MACRO(NL_SETUP_BUILD_FLAGS) @@ -426,7 +528,11 @@ MACRO(NL_SETUP_PREFIX_PATHS) IF(WIN32) SET(NL_LIB_PREFIX "../lib" CACHE PATH "Installation path for libraries.") ELSE(WIN32) - SET(NL_LIB_PREFIX "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation path for libraries.") + IF(CMAKE_LIBRARY_ARCHITECTURE) + SET(NL_LIB_PREFIX "${CMAKE_INSTALL_PREFIX}/lib/${CMAKE_LIBRARY_ARCHITECTURE}" CACHE PATH "Installation path for libraries.") + ELSE(CMAKE_LIBRARY_ARCHITECTURE) + SET(NL_LIB_PREFIX "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation path for libraries.") + ENDIF(CMAKE_LIBRARY_ARCHITECTURE) ENDIF(WIN32) ENDIF(NOT NL_LIB_PREFIX) @@ -435,7 +541,11 @@ MACRO(NL_SETUP_PREFIX_PATHS) IF(WIN32) SET(NL_DRIVER_PREFIX "../lib" CACHE PATH "Installation path for drivers.") ELSE(WIN32) - SET(NL_DRIVER_PREFIX "${CMAKE_INSTALL_PREFIX}/lib/nel" CACHE PATH "Installation path for drivers.") + IF(CMAKE_LIBRARY_ARCHITECTURE) + SET(NL_DRIVER_PREFIX "${CMAKE_INSTALL_PREFIX}/lib/${CMAKE_LIBRARY_ARCHITECTURE}/nel" CACHE PATH "Installation path for drivers.") + ELSE(CMAKE_LIBRARY_ARCHITECTURE) + SET(NL_DRIVER_PREFIX "${CMAKE_INSTALL_PREFIX}/lib/nel" CACHE PATH "Installation path for drivers.") + ENDIF(CMAKE_LIBRARY_ARCHITECTURE) ENDIF(WIN32) ENDIF(NOT NL_DRIVER_PREFIX) @@ -456,54 +566,60 @@ MACRO(RYZOM_SETUP_PREFIX_PATHS) IF(WIN32) SET(RYZOM_ETC_PREFIX "." CACHE PATH "Installation path for configurations") ELSE(WIN32) - SET(RYZOM_ETC_PREFIX "${CMAKE_INSTALL_PREFIX}/etc/ryzom" CACHE PATH "Installation path for configurations") + SET(RYZOM_ETC_PREFIX "${RYZOM_PREFIX}/etc/ryzom" CACHE PATH "Installation path for configurations") ENDIF(WIN32) ENDIF(NOT RYZOM_ETC_PREFIX) ## Allow override of install_prefix/share path. IF(NOT RYZOM_SHARE_PREFIX) IF(WIN32) - SET(RYZOM_SHARE_PREFIX "." CACHE PATH "Installation path for data.") - ELSE(WIN32) - SET(RYZOM_SHARE_PREFIX "${CMAKE_INSTALL_PREFIX}/share/ryzom" CACHE PATH "Installation path for data.") - ENDIF(WIN32) + SET(RYZOM_SHARE_PREFIX "." CACHE PATH "Installation path for data.") + ELSE(WIN32) + SET(RYZOM_SHARE_PREFIX "${RYZOM_PREFIX}/share/ryzom" CACHE PATH "Installation path for data.") + ENDIF(WIN32) ENDIF(NOT RYZOM_SHARE_PREFIX) ## Allow override of install_prefix/sbin path. IF(NOT RYZOM_SBIN_PREFIX) - IF(WIN32) - SET(RYZOM_SBIN_PREFIX "." CACHE PATH "Installation path for admin tools and services.") - ELSE(WIN32) - SET(RYZOM_SBIN_PREFIX "${CMAKE_INSTALL_PREFIX}/sbin" CACHE PATH "Installation path for admin tools and services.") - ENDIF(WIN32) + IF(WIN32) + SET(RYZOM_SBIN_PREFIX "." CACHE PATH "Installation path for admin tools and services.") + ELSE(WIN32) + SET(RYZOM_SBIN_PREFIX "${RYZOM_PREFIX}/sbin" CACHE PATH "Installation path for admin tools and services.") + ENDIF(WIN32) ENDIF(NOT RYZOM_SBIN_PREFIX) ## Allow override of install_prefix/bin path. IF(NOT RYZOM_BIN_PREFIX) IF(WIN32) - SET(RYZOM_BIN_PREFIX "." CACHE PATH "Installation path for tools and applications.") + SET(RYZOM_BIN_PREFIX "." CACHE PATH "Installation path for tools and applications.") ELSE(WIN32) - SET(RYZOM_BIN_PREFIX "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation path for tools.") + SET(RYZOM_BIN_PREFIX "${RYZOM_PREFIX}/bin" CACHE PATH "Installation path for tools.") ENDIF(WIN32) ENDIF(NOT RYZOM_BIN_PREFIX) ## Allow override of install_prefix/games path. IF(NOT RYZOM_GAMES_PREFIX) IF(WIN32) - SET(RYZOM_GAMES_PREFIX "." CACHE PATH "Installation path for tools and applications.") + SET(RYZOM_GAMES_PREFIX "." CACHE PATH "Installation path for tools and applications.") ELSE(WIN32) - SET(RYZOM_GAMES_PREFIX "${CMAKE_INSTALL_PREFIX}/games" CACHE PATH "Installation path for client.") + SET(RYZOM_GAMES_PREFIX "${RYZOM_PREFIX}/games" CACHE PATH "Installation path for client.") ENDIF(WIN32) ENDIF(NOT RYZOM_GAMES_PREFIX) ENDMACRO(RYZOM_SETUP_PREFIX_PATHS) MACRO(SETUP_EXTERNAL) - IF(WIN32) + IF(WITH_EXTERNAL) FIND_PACKAGE(External REQUIRED) + ENDIF(WITH_EXTERNAL) + IF(WIN32) INCLUDE(${CMAKE_ROOT}/Modules/Platform/Windows-cl.cmake) IF(MSVC10) + IF(NOT MSVC10_REDIST_DIR) + # If you have VC++ 2010 Express, put x64/Microsoft.VC100.CRT/*.dll in ${EXTERNAL_PATH}/redist + SET(MSVC10_REDIST_DIR "${EXTERNAL_PATH}/redist") + ENDIF(NOT MSVC10_REDIST_DIR) GET_FILENAME_COMPONENT(VC_ROOT_DIR "[HKEY_CURRENT_USER\\Software\\Microsoft\\VisualStudio\\10.0_Config;InstallDir]" ABSOLUTE) # VC_ROOT_DIR is set to "registry" when a key is not found IF(VC_ROOT_DIR MATCHES "registry") @@ -524,13 +640,19 @@ MACRO(SETUP_EXTERNAL) ENDIF(${CMAKE_MAKE_PROGRAM} MATCHES "Common7") ENDIF(MSVC10) ELSE(WIN32) - IF(CMAKE_FIND_LIBRARY_SUFFIXES AND NOT APPLE) + IF(APPLE) IF(WITH_STATIC_EXTERNAL) - SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a") + SET(CMAKE_FIND_LIBRARY_SUFFIXES .a .dylib .so) ELSE(WITH_STATIC_EXTERNAL) - SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so") - ENDIF(WITH_STATIC_EXTERNAL AND NOT APPLE) - ENDIF(CMAKE_FIND_LIBRARY_SUFFIXES) + SET(CMAKE_FIND_LIBRARY_SUFFIXES .dylib .so .a) + ENDIF(WITH_STATIC_EXTERNAL) + ELSE(APPLE) + IF(WITH_STATIC_EXTERNAL) + SET(CMAKE_FIND_LIBRARY_SUFFIXES .a .so) + ELSE(WITH_STATIC_EXTERNAL) + SET(CMAKE_FIND_LIBRARY_SUFFIXES .so .a) + ENDIF(WITH_STATIC_EXTERNAL) + ENDIF(APPLE) ENDIF(WIN32) IF(WITH_STLPORT) @@ -544,5 +666,4 @@ MACRO(SETUP_EXTERNAL) INCLUDE_DIRECTORIES(${VC_INCLUDE_DIR} ${WINSDK_INCLUDE_DIR}) ENDIF(WIN32) ENDIF(WITH_STLPORT) - ENDMACRO(SETUP_EXTERNAL) diff --git a/code/acinclude.m4 b/code/acinclude.m4 deleted file mode 100644 index 1f9286bf9..000000000 --- a/code/acinclude.m4 +++ /dev/null @@ -1,1396 +0,0 @@ -# ========================================================================= -# -# Macros used by Nevrax in configure.in files. -# -# $Id: acinclude.m4,v 1.20 2005-04-04 10:07:29 cado Exp $ -# -# ========================================================================= - -# ========================================================================= -# WARNING: The original version of this file is placed in the $CVSROOT/code -# directory. -# There is links in the $CVSROOT/code sub-directories to that file -# (ex: $CVSROOT/code/nel), so be careful of the consequences of -# any modification of that file. -# ========================================================================= - -# ========================================================================= -# Macros available in that file. -# -# -# AM_NEL_DEBUG -# -# Option: none. -# Description: manage the different debug and the release mode by setting -# correctly the CFLAGS and CXXFLAGS variables. -# -# -# AM_PATH_NEL -# -# Option: none. -# Description: check the instalation of the NeL library and set the -# CXXFLAGS and LIBS variables to use it. -# -# -# AM_PATH_STLPORT -# -# Option: none. -# Description: check the instalation of the STLPort library and set the -# CXXFLAGS and LIBS variables to use it. -# -# -# AM_PATH_OPENGL -# -# Option: "yes" if the use of the OpenGL library is mandatory. -# Description: check the instalation of the OpenGL library and set the -# OPENGL_CFLAGS and OPENGL_LIBS variables to use it. -# -# -# AM_PATH_FREETYPE -# -# Option: "yes" if the use of the Freetype library is mandatory. -# Description: check the instalation of the OpenGL library and set the -# FREETYPE_CFLAGS and FREETYPE_LIBS variables to use it. -# -# -# AM_PATH_XF86VIDMODE -# -# Option: none. -# Description: check the instalation of the OpenGL library and set the -# XF86VIDMODE_CFLAGS and XF86VIDMODE_LIBS variables to use it. -# -# -# AM_PATH_OPENAL -# -# Option: "yes" if the use of the OpenAL library is mandatory. -# Description: check the instalation of the OpenGL library and set the -# OPENAL_CFLAGS and OPENAL_LIBS variables to use it. -# -# -# AM_PATH_PYTHON -# -# Option: "yes" if the use of the Python library is mandatory. -# Description: check the instalation of the OpenGL library and set the -# PYTHON_CFLAGS and PYTHON_LIBS variables to use it. -# -# AM_PATH_CCACHE -# -# Option: none. -# Description: check the instalation of the Ccache utility. -# -# ========================================================================= - - -# ========================================================================= -# AM_NEL_DEBUG - -AC_DEFUN([AM_NEL_DEBUG], -[ - -MAX_C_OPTIMIZE="-O6" - -STL_DEBUG="-D__STL_DEBUG" - -NL_DEBUG="-DNL_DEBUG" -NL_DEBUG_FAST="-DNL_DEBUG_FAST" -NL_RELEASE_DEBUG="-DNL_RELEASE_DEBUG" -NL_RELEASE="-DNL_RELEASE_DEBUG" - -AC_ARG_WITH(debug, - [ --with-debug[=full|medium|fast] - Build a debug version (huge libraries). - Full mode set only NeL and STL debug flags. - Medium mode set NeL debug flags with inline - optimization (default mode). - Fast mode is like the Medium mode with some basic - optimization. - --without-debug Build without debugging code (default)], - [with_debug=$withval], - [with_debug=no]) - -# Build optimized or debug version ? -# First check for gcc and g++ -if test "$ac_cv_prog_gcc" = "yes" -then - DEBUG_CFLAGS="-g" - DEBUG_OPTIMIZE_CC="-O" - OPTIMIZE_CFLAGS="$MAX_C_OPTIMIZE" -else - DEBUG_CFLAGS="-g" - DEBUG_OPTIMIZE_CC="" - OPTIMIZE_CFLAGS="" -fi - -if test "$ac_cv_prog_cxx_g" = "yes" -then - DEBUG_CXXFLAGS="-g" - DEBUG_OPTIMIZE_CXX="-O" - OPTIMIZE_CXXFLAGS="-O3" - OPTIMIZE_INLINE_CXXFLAGS="-finline-functions" -else - DEBUG_CXXFLAGS="-g" - DEBUG_OPTIMIZE_CXX="" - OPTIMIZE_CXXFLAGS="" - OPTIMIZE_INLINE_CXXFLAGS="" -fi - -if test "$with_debug" = "yes" -o "$with_debug" = "medium" -then - # Medium debug. Inline optimization - CFLAGS="$DEBUG_CFLAGS $OPTIMIZE_INLINE_CFLAGS $NL_DEBUG $NL_DEBUG_FAST $CFLAGS" - CXXFLAGS="$DEBUG_CXXFLAGS $OPTIMIZE_INLINE_CXXFLAGS $NL_DEBUG $NL_DEBUG_FAST $CXXFLAGS" -else - if test "$with_debug" = "full" - then - # Full debug. Very slow in some cases - CFLAGS="$DEBUG_CFLAGS $NL_DEBUG $STL_DEBUG $CFLAGS" - CXXFLAGS="$DEBUG_CXXFLAGS $NL_DEBUG $STL_DEBUG $CXXFLAGS" - else - if test "$with_debug" = "fast" - then - # Fast debug. - CFLAGS="$DEBUG_CFLAGS $DEBUG_OPTIMIZE_CC $OPTIMIZE_INLINE_CFLAGS $NL_DEBUG $CFLAGS" - CXXFLAGS="$DEBUG_CXXFLAGS $DEBUG_OPTIMIZE_CXX $OPTIMIZE_INLINE_CXXFLAGS $NL_DEBUG $CXXFLAGS" - else - # Optimized version. No debug - CFLAGS="$OPTIMIZE_CFLAGS $NL_RELEASE_DEBUG $CFLAGS" - CXXFLAGS="$OPTIMIZE_CXXFLAGS $NL_RELEASE_DEBUG $CXXFLAGS" - fi - fi -fi - -# AC_MSG_RESULT([CFLAGS = $CFLAGS]) -# AC_MSG_RESULT([CXXGLAGS = $CXXFLAGS]) - -]) - - -# ========================================================================= -# MY_NEL_HEADER_CHK : NeL header files checking macros - -AC_DEFUN([MY_NEL_HEADER_CHK], -[ AC_REQUIRE_CPP() - -chk_message_obj="$1" -header="$2" -macro="$3" -is_mandatory="$4" - -if test $is_mandatory = "yes" -then - - _CPPFLAGS="$CPPFLAGS" - - CPPFLAGS="$CXXFLAGS $NEL_CFLAGS" - - AC_MSG_CHECKING(for $header) - - AC_EGREP_CPP( yo_header, -[#include <$header> -#ifdef $macro - yo_header -#endif], - have_header="yes", - have_header="no") - - CPPFLAGS="$_CPPFLAGS" - - if test "$have_header" = "yes" - then - AC_MSG_RESULT(yes) - else - if test "$is_mandatory" = "yes" - then - AC_MSG_ERROR([$chk_message_obj must be installed (http://www.nevrax.org).]) - else - AC_MSG_RESULT(no) - fi - fi -fi - - -]) - - -# ========================================================================= -# MY_NEL_LIB_CHK : NeL library checking macros - -AC_DEFUN([MY_NEL_LIB_CHK], -[ AC_REQUIRE_CPP() - -chk_message_obj="$1" -nel_test_lib="$2" -is_mandatory="$3" - -if test $is_mandatory = "yes" -then - - AC_CHECK_LIB($nel_test_lib, main,,[AC_MSG_ERROR([$chk_message_obj must be installed (http://www.nevrax.org).])]) -fi -]) - - -# ========================================================================= -# AM_PATH_NEL : NeL checking macros -AC_DEFUN([AM_PATH_NEL], -[ AC_REQUIRE_CPP() - -AC_ARG_WITH( nel, - [ --with-nel= path to the NeL install files directory. - e.g. /usr/local/nel]) - -AC_ARG_WITH( nel-include, - [ --with-nel-include= - path to the NeL header files directory. - e.g. /usr/local/nel/include]) - -AC_ARG_WITH( nel-lib, - [ --with-nel-lib= - path to the NeL library files directory. - e.g. /usr/local/nel/lib]) - - -nelmisc_is_mandatory="$1" -nelnet_is_mandatory="$2" -nel3d_is_mandatory="$3" -nelpacs_is_mandatory="$4" -nelsound_is_mandatory="$5" -nelai_is_mandatory="$6" -nelgeorges_is_mandatory="$7" - -# Check for nel-config -AC_PATH_PROG(NEL_CONFIG, nel-config, no) - -# -# Configure options (--with-nel*) have precendence -# over nel-config only set variables if they are not -# specified -# -if test "$NEL_CONFIG" != "no" -then - if test -z "$with_nel" -a -z "$with_nel_include" - then - CXXFLAGS="$CXXFLAGS `nel-config --cflags`" - fi - - if test -z "$with_nel" -a -z "$with_nel_lib" - then - LDFLAGS="`nel-config --ldflags` $LDFLAGS" - fi -fi - -# -# Set nel_libraries and nel_includes according to -# user specification (--with-nel*) if any. -# --with-nel-include and --with-nel-lib have precendence -# over --with-nel -# -if test "$with_nel" = "no" -then - # The user explicitly disabled the use of the NeL - AC_MSG_ERROR([NeL is mandatory: do not specify --without-nel]) -else - if test "$with_nel" -a "$with_nel" != "yes" - then - nel_includes="$with_nel/include" - nel_libraries="$with_nel/lib" - fi -fi - -if test "$with_nel_include" -then - nel_includes="$with_nel_include" -fi - -if test "$with_nel_lib" -then - nel_libraries="$with_nel_lib" -fi - -# -# Set compilation variables -# -if test "$nel_includes" -then - CXXFLAGS="$CXXFLAGS -I$nel_includes" -fi - -if test "$nel_libraries" -then - LDFLAGS="-L$nel_libraries $LDFLAGS" -fi - -# -# Collect headers information and bark if missing and -# mandatory -# - -MY_NEL_HEADER_CHK([NeL Misc], [nel/misc/types_nl.h], [NL_TYPES_H], $nelmisc_is_mandatory) -MY_NEL_HEADER_CHK([NeL Network], [nel/net/sock.h], [NL_SOCK_H], $nelnet_is_mandatory) -MY_NEL_HEADER_CHK([NeL 3D], [nel/3d/u_camera.h], [NL_U_CAMERA_H], $nel3d_is_mandatory) -MY_NEL_HEADER_CHK([NeL PACS], [nel/pacs/u_global_position.h], [NL_U_GLOBAL_POSITION_H], $nelpacs_is_mandatory) -MY_NEL_HEADER_CHK([NeL Sound], [nel/sound/u_source.h], [NL_U_SOURCE_H], $nelsound_is_mandatory) -MY_NEL_HEADER_CHK([NeL AI], [nel/ai/nl_ai.h], [_IA_NEL_H], $nelai_is_mandatory) -MY_NEL_HEADER_CHK([NeL Georges], [nel/georges/common.h], [NLGEORGES_COMMON_H], $nelgeorges_is_mandatory) - -# -# Collect libraries information and bark if missing and -# mandatory -# - -MY_NEL_LIB_CHK([NeL Misc], [nelmisc], $nelmisc_is_mandatory) -MY_NEL_LIB_CHK([NeL Network], [nelnet], $nelnet_is_mandatory) -MY_NEL_LIB_CHK([NeL 3D], [nel3d], $nel3d_is_mandatory) -MY_NEL_LIB_CHK([NeL PACS], [nelpacs], $nelpacs_is_mandatory) -MY_NEL_LIB_CHK([NeL Sound], [nelsnd], $nelsound_is_mandatory) -MY_NEL_LIB_CHK([NeL AI], [nelai], $nelai_is_mandatory) -MY_NEL_LIB_CHK([NeL Georges], [nelgeorges], $nelgeorges_is_mandatory) - -]) - - -# ========================================================================= -# AM_PATH_STLPORT : STLPort checking macros - -AC_DEFUN([AM_PATH_STLPORT], -[ AC_REQUIRE_CPP() - -AC_ARG_WITH( stlport, - [ --with-stlport= path to the STLPort install files directory. - e.g. /usr/local/stlport]) - -AC_ARG_WITH( stlport-include, - [ --with-stlport-include= - path to the STLPort header files directory. - e.g. /usr/local/stlport/stlport]) - -AC_ARG_WITH( stlport-lib, - [ --with-stlport-lib= - path to the STLPort library files directory. - e.g. /usr/local/stlport/lib]) - -if test "$with_debug" = "full" -then - stlport_lib="stlport_gcc_debug" -else - stlport_lib="stlport_gcc" -fi - -if test "$with_debug" = "full" -then - stlport_lib2="stlport_gcc_debug" -else - stlport_lib2="stlport_gcc" -fi - -if test "$with_stlport" = no -then - # The user explicitly disabled the use of the STLPorts - AC_MSG_ERROR([STLPort is mandatory: do not specify --without-stlport]) -else - stlport_includes="/usr/include/stlport" - if test "$with_stlport" -a "$with_stlport" != yes - then - stlport_includes="$with_stlport/stlport" - stlport_libraries="$with_stlport/lib" - - if test ! -d "$stlport_includes" - then - stlport_includes="$with_stlport/include/stlport" - fi - fi -fi - -if test "$with_stlport_include" -then - stlport_includes="$with_stlport_include" -fi - -if test "$with_stlport_lib" -then - stlport_libraries="$with_stlport_lib" -fi - -# Check for the 'pthread' library. SLTPort needs it. -AC_CHECK_LIB(pthread, main, , [AC_MSG_ERROR([cannot find the pthread library.])]) -AC_CHECK_LIB(dl, dlopen, , [AC_MSG_ERROR([cannot find the dl library.])]) - -AC_LANG_SAVE -AC_LANG_CPLUSPLUS - -# Put STLPorts includes in CXXFLAGS -if test "$stlport_includes" -then - CXXFLAGS="$CXXFLAGS -I$stlport_includes" -fi - -# Put STLPorts libraries directory in LIBS -if test "$stlport_libraries" -then - LIBS="-L$stlport_libraries $LIBS" -else - stlport_libraries='default' -fi - -# Put STLPort GCC libraries directory in LIBS -if test "$stlport_libraries2" -then - LIBS="-L$stlport_libraries2 $LIBS" -else - stlport_libraries2='default' -fi - -# Test the headers - -AC_CHECK_HEADER(algorithm, - have_stlport_headers="yes", - have_stlport_headers="no" ) - -AC_MSG_CHECKING(for STLPort headers) - -if test "$have_stlport_headers" = "yes" -then - AC_MSG_RESULT([$stlport_includes]) -else - AC_MSG_RESULT(no) -fi - -AC_CHECK_LIB($stlport_lib, main,, have_stlport_libraries="no") - -AC_MSG_CHECKING(for STLPort library) - -if test "$have_stlport_libraries" != "no" -then - AC_MSG_RESULT([$stlport_libraries]) -else - AC_MSG_RESULT(no) -fi - -AC_CHECK_LIB($stlport_lib2, main,, have_stlport_libraries="no") - -AC_MSG_CHECKING(for STLPort GCC library) - -if test "$have_stlport_libraries2" != "no" -then - AC_MSG_RESULT([$stlport_libraries2]) -else - AC_MSG_RESULT(no) -fi - -if test "$have_stlport_headers" = "yes" && - (test "$have_stlport_libraries" != "no" || test "$have_stlport_libraries2" != "no") -then - have_stlport="yes" -else - have_stlport="no" -fi - -if test "$have_stlport" = "no" -then - AC_MSG_ERROR([STLPort must be installed (http://www.stlport.org).]) -fi - -AC_LANG_RESTORE - -]) - - -# ========================================================================= -# AM_PATH_OPENGL : OpenGL checking macros - -AC_DEFUN([AM_PATH_OPENGL], -[ AC_MSG_CHECKING(for OpenGL headers and GL Version >= 1.2) - -is_mandatory="$1" - -AC_REQUIRE_CPP() - -AC_ARG_WITH( opengl, - [ --with-opengl= path to the OpenGL install files directory. - e.g. /usr/local]) - -AC_ARG_WITH( opengl-include, - [ --with-opengl-include= - path to the OpenGL header files directory. - e.g. /usr/local/include]) - -AC_ARG_WITH( opengl-lib, - [ --with-opengl-lib= - path to the OpenGL library files directory. - e.g. /usr/local/lib]) - -opengl_lib="GL" - -if test "$with_opengl" -then - opengl_includes="$with_opengl/include" - opengl_libraries="$with_opengl/lib" -fi - -if test "$with_opengl_include" -then - opengl_includes="$with_opengl_include" -fi - -if test "$with_opengl_lib" -then - opengl_libraries="$with_opengl_lib" -fi - -# Set OPENGL_CFLAGS -if test "$opengl_includes" -then - OPENGL_CFLAGS="-I$opengl_includes" -fi - -# Set OPENGL_LIBS -if test "$opengl_libraries" -then - OPENGL_LIBS="-L$opengl_libraries" -fi -OPENGL_LIBS="$OPENGL_LIBS -l$opengl_lib" - -# Test the headers -_CPPFLAGS="$CPPFLAGS" - -CPPFLAGS="$CXXFLAGS $OPENGL_CFLAGS" - -AC_EGREP_CPP( yo_opengl, -[#include -#if defined(GL_VERSION_1_2) - yo_opengl -#endif], - have_opengl_headers="yes", - have_opengl_headers="no" ) - -if test "$have_opengl_headers" = "yes" -then - if test "$opengl_includes" - then - AC_MSG_RESULT([$opengl_includes]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -# Checking the GLEXT version >= 7 -AC_MSG_CHECKING(for and GLEXT version >= 7) - -AC_EGREP_CPP( yo_glext_version, -[#include -#ifdef GL_GLEXT_VERSION -#if GL_GLEXT_VERSION >= 7 - yo_glext_version -#endif -#endif], - have_glext="yes", - have_glext="no" ) - -if test "$have_glext" = "yes" -then - AC_MSG_RESULT(yes) -else - AC_MSG_RESULT([no, can be downloaded from http://oss.sgi.com/projects/ogl-sample/ABI/]) -fi - -# Test the libraries -AC_MSG_CHECKING(for OpenGL libraries) - -CPPFLAGS="$CXXFLAGS $OPENGL_LIBS" - -AC_TRY_LINK( , , have_opengl_libraries="yes", have_opengl_libraries="no") - -CPPFLAGS="$_CPPFLAGS" - -if test "$have_opengl_libraries" = "yes" -then - if test "$opengl_libraries" - then - AC_MSG_RESULT([$opengl_libraries]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -opengl_libraries="$opengl_libraries" - -if test "$have_opengl_headers" = "yes" \ - -a "$have_glext" = "yes" \ - -a "$have_opengl_libraries" = "yes" -then - have_opengl="yes" -else - have_opengl="no" -fi - -if test "$have_opengl" = "no" -a "$is_mandatory" = "yes" -then - AC_MSG_ERROR([OpenGL >= 1.2 must be installed (http://www.mesa3d.org)]) -fi - -AC_SUBST(OPENGL_CFLAGS) -AC_SUBST(OPENGL_LIBS) - -]) - - -# ========================================================================= -# AM_PATH_FREETYPE : FreeType checking macros - -AC_DEFUN([AM_PATH_FREETYPE], -[ is_mandatory="$1" - -AC_REQUIRE_CPP() - -AC_ARG_WITH( freetype, - [ --with-freetype= path to the FreeType install files directory. - e.g. /usr/local/freetype]) - -AC_ARG_WITH( freetype-include, - [ --with-freetype-include= - path to the FreeType header files directory. - e.g. /usr/local/freetype/include]) - -AC_ARG_WITH( freetype-lib, - [ --with-freetype-lib= - path to the FreeType library files directory. - e.g. /usr/local/freetype/lib]) - -freetype_lib="freetype" - - -AC_PATH_PROG(FREETYPE_CONFIG, freetype-config, no) - -if test "$FREETYPE_CONFIG" = "no" -then - have_freetype_config="no" -else - FREETYPE_CFLAGS=`freetype-config --cflags` - FREETYPE_LIBS=`freetype-config --libs` - have_freetype_config="yes" -fi - -if test "$with_freetype" -then - freetype_includes="$with_freetype/include" - freetype_libraries="$with_freetype/lib" -fi - -if test "$with_freetype_include" -then - freetype_includes="$with_freetype_include" -fi - -if test "$with_freetype_lib" -then - freetype_libraries="$with_freetype_lib" -fi - -if test "$freetype_includes" -then - FREETYPE_CFLAGS="-I$freetype_includes" -fi - -# Checking the FreeType 2 instalation -_CPPFLAGS="$CPPFLAGS" -CPPFLAGS=" $FREETYPE_CFLAGS $CXXFLAGS" - -AC_MSG_CHECKING(for FreeType version = 2) - -AC_EGREP_CPP( yo_freetype2, -[#include -#if FREETYPE_MAJOR == 2 - yo_freetype2 -#endif], - have_freetype2="yes", - have_freetype2="no") - -if test "$have_freetype2" = "yes" -then - AC_MSG_RESULT(yes) -else - AC_MSG_RESULT(no) -fi - -# Test the libraries -AC_MSG_CHECKING(for FreeType libraries) - -if test $freetype_libraries -then - FREETYPE_LIBS="-L$freetype_libraries -l$freetype_lib" -fi - -CPPFLAGS="$FREETYPE_LIBS $CXXFLAGS" - -AC_TRY_LINK( , , have_freetype_libraries="yes", have_freetype_libraries="no") - -CPPFLAGS="$_CPPFLAGS" - -if test "$have_freetype_libraries" = "yes" -then - if test "$freetype_libraries" - then - AC_MSG_RESULT([$freetype_libraries]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -if test "$have_freetype2" = "yes" && test "$have_freetype_libraries" = "yes" -then - have_freetype="yes" -else - have_freetype="no" -fi - -if test "$have_freetype" = "no" && test "$is_mandatory" = "yes" -then - AC_MSG_ERROR([FreeType 2 must be installed (http://freetype.sourceforge.net)]) -fi - -AC_SUBST(FREETYPE_CFLAGS) -AC_SUBST(FREETYPE_LIBS) - -]) - - -# ========================================================================= -# AM_PATH_XF86VIDMODE : XF86VidMode checking macros - -AC_DEFUN([AM_PATH_XF86VIDMODE], -[ AC_MSG_CHECKING(for XF86VidMode extension) - -AC_REQUIRE_CPP() - -AC_ARG_WITH( xf86vidmode-lib, - [ --with-xf86vidmode-lib= - path to the XF86VidMode library. - e.g. /usr/X11R6/lib] ) - -xf86vidmode_lib="Xxf86vm" - -if test "$with_xf86vidmode_lib" = no -then - # The user explicitly disabled the use of XF86VidMode - have_xf86vidmode="disabled" - AC_MSG_RESULT(disabled) -else - if test "$with_xf86vidmode_lib" - then - xf86vidmode_libraries="$with_xf86vidmode_lib" - fi - - XF86VIDMODE_CFLAGS="-DXF86VIDMODE" -fi - -if test -z "$have_xf86vidmode" -# -a "$with_xf86vidmode_lib" -then - if test "$xf86vidmode_libraries" - then - XF86VIDMODE_LIBS="-L$xf86vidmode_libraries" - fi - - XF86VIDMODE_LIBS="$XF86VIDMODE_LIBS -l$xf86vidmode_lib" - - _CPPFLAGS="$CPPFLAGS" - - CPPFLAGS="$CXXFLAGS $XF86VIDMODE_LIBS" - - AC_TRY_LINK( , , have_xf86vidmode_libraries="yes", have_xf86vidmode_libraries="no") - - CPPFLAGS="$_CPPFLAGS" - - if test "$have_xf86vidmode_libraries" = "yes" - then - have_xf86vidmode="yes" - if test "$xf86vidmode_libraries" - then - AC_MSG_RESULT($xf86vidmode_libraries) - else - AC_MSG_RESULT(yes) - fi - else - have_xf86vidmode="no" - AC_MSG_RESULT(no, no fullscreen support available.) - fi - - xf86vidmode_libraries="$xf86vidmode_libraries" - -fi - -AC_SUBST(XF86VIDMODE_CFLAGS) -AC_SUBST(XF86VIDMODE_LIBS) - -]) - - -# ========================================================================= -# AM_PATH_OPENAL : OpenAL checking macros - -AC_DEFUN([AM_PATH_OPENAL], -[ is_mandatory="$1" - -AC_REQUIRE_CPP() - -# Get from the user option the path to the OpenAL files location -AC_ARG_WITH( openal, - [ --with-openal= path to the OpenAL install files directory. - e.g. /usr/local]) - -AC_ARG_WITH( openal-include, - [ --with-openal-include= - path to the OpenAL header files directory. - e.g. /usr/local/include]) - -AC_ARG_WITH( openal-lib, - [ --with-openal-lib= - path to the OpenAL library files directory. - e.g. /usr/local/lib]) - -openal_lib="openal" - -if test $with_openal -then - openal_includes="$with_openal/include" - openal_libraries="$with_openal/lib" -fi - -if test "$with_openal_include" -then - openal_includes="$with_openal_include" -fi - -if test "$with_openal_lib" -then - openal_libraries="$with_openal_lib" -fi - - -# Set OPENAL_CFLAGS -if test "$openal_includes" -then - OPENAL_CFLAGS="-I$openal_includes" -fi - -# Set OPENAL_LIBS -if test "$openal_libraries" -then - OPENAL_LIBS="-L$openal_libraries" -fi -OPENAL_LIBS="$OPENAL_LIBS -l$openal_lib" - -_CPPFLAGS="$CPPFLAGS" -CPPFLAGS="$CXXFLAGS $OPENAL_CFLAGS" - -AC_MSG_CHECKING(for OpenAL headers) -AC_EGREP_CPP( yo_openal, -[#include -#ifdef AL_VERSION - yo_openal -#endif], - have_openal_headers="yes", - have_openal_headers="no" ) - -if test "$have_openal_headers" = "yes" -then - if test "$openal_includes" - then - AC_MSG_RESULT([$openal_includes]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -# Test the libraries -AC_MSG_CHECKING(for OpenAL libraries) - -CPPFLAGS="$CXXFLAGS $OPENAL_LIBS" - -AC_TRY_LINK( , , have_openal_libraries="yes", have_openal_libraries="no") - -CPPFLAGS="$_CPPFLAGS" - -if test "$have_openal_libraries" = "yes" -then - if test "$openal_libraries" - then - AC_MSG_RESULT([$openal_libraries]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -openal_libraries="$openal_libraries" - -if test "$have_openal_headers" = "yes" \ - && test "$have_openal_libraries" = "yes" -then - have_openal="yes" -else - have_openal="no" -fi - -if test "$have_openal" = "no" -a "$is_mandatory" = "yes" -then - AC_MSG_ERROR([OpenAL is needed to compile NeL (http://www.openal.org).]) -fi - -AC_SUBST(OPENAL_CFLAGS) -AC_SUBST(OPENAL_LIBS) - - -]) - - -# ========================================================================= -# AM_PATH_PYTHON : Python checking macros - -AC_DEFUN([AM_PATH_PYTHON], -[ python_version_required="$1" - -is_mandatory="$2" - -AC_REQUIRE_CPP() - -# Get from the user option the path to the Python files location -AC_ARG_WITH( python, - [ --with-python= path to the Python prefix installation directory. - e.g. /usr/local], - [ PYTHON_PREFIX=$with_python ] -) - -AC_ARG_WITH( python-version, - [ --with-python-version= - Python version to use, e.g. 1.5], - [ PYTHON_VERSION=$with_python_version ] -) - -if test ! "$PYTHON_PREFIX" = "" -then - PATH="$PYTHON_PREFIX/bin:$PATH" -fi - -if test ! "$PYTHON_VERSION" = "" -then - PYTHON_EXEC="python$PYTHON_VERSION" -else - PYTHON_EXEC="python python2.1 python2.0 python1.5" -fi - -AC_PATH_PROGS(PYTHON, $PYTHON_EXEC, no, $PATH) - -if test "$PYTHON" != "no" -then - PYTHON_PREFIX=`$PYTHON -c 'import sys; print "%s" % (sys.prefix)'` - PYTHON_VERSION=`$PYTHON -c 'import sys; print "%s" % (sys.version[[:3]])'` - - is_python_version_enough=`expr $python_version_required \<= $PYTHON_VERSION` -fi - - -if test "$PYTHON" = "no" || test "$is_python_version_enough" != "1" -then - - if test "$is_mandatory" = "yes" - then - AC_MSG_ERROR([Python $python_version_required must be installed (http://www.python.org)]) - else - have_python="no" - fi - -else - - python_includes="$PYTHON_PREFIX/include/python$PYTHON_VERSION" - python_libraries="$PYTHON_PREFIX/lib/python$PYTHON_VERSION/config" - python_lib="python$PYTHON_VERSION" - - PYTHON_CFLAGS="-I$python_includes" - PYTHON_LIBS="-L$python_libraries -l$python_lib" - - _CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$CXXFLAGS ${PYTHON_CFLAGS}" - - # Test the headers - AC_MSG_CHECKING(for Python headers) - - AC_EGREP_CPP( yo_python, - [#include - yo_python - ], - have_python_headers="yes", - have_python_headers="no" ) - - if test "$have_python_headers" = "yes" - then - AC_MSG_RESULT([$python_includes]) - else - AC_MSG_RESULT(no) - fi - - # Test the libraries - AC_MSG_CHECKING(for Python libraries) - - CPPFLAGS="$CXXFLAGS $PYTHON_CFLAGS" - - AC_TRY_LINK( , , have_python_libraries="yes", have_python_libraries="no") - - CPPFLAGS="$_CPPFLAGS" - - if test "$have_python_libraries" = "yes" - then - if test "$python_libraries" - then - AC_MSG_RESULT([$python_libraries]) - else - AC_MSG_RESULT(yes) - fi - else - AC_MSG_RESULT(no) - fi - - if test "$have_python_headers" = "yes" \ - && test "$have_python_libraries" = "yes" - then - have_python="yes" - else - have_python="no" - fi - - if test "$have_python" = "no" -a "$is_mandatory" = "yes" - then - AC_MSG_ERROR([Python is needed to compile NeL (http://www.python.org).]) - fi - - AC_SUBST(PYTHON_CFLAGS) - AC_SUBST(PYTHON_LIBS) - -fi - -]) - - -# ========================================================================= -# AM_PATH_CCACHE : Ccache checking macros - -AC_DEFUN([AM_PATH_CCACHE], -[ - -AC_ARG_WITH( ccache, - [ --with-ccache use ccache for compiling.], - [ using_ccache=$with_ccache ] -) - -AC_PATH_PROG(CCACHE, ccache) -if test "$CCACHE" -a "$using_ccache" = "yes" -then - CC="ccache $CC" - CXX="ccache $CXX" -fi - -]) - -# ========================================================================= -# AM_PATH_MYSQL : MySQL library - -# AM_PATH_MYSQL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) -# Test for MYSQL, and define MYSQL_CFLAGS and MYSQL_LIBS -# -AC_DEFUN([AM_PATH_MYSQL], -[# -# Get the cflags and libraries from the mysql_config script -# -AC_ARG_WITH(mysql-prefix,[ --with-mysql-prefix=PFX Prefix where MYSQL is installed (optional)], - mysql_prefix="$withval", mysql_prefix="") -AC_ARG_WITH(mysql-exec-prefix,[ --with-mysql-exec-prefix=PFX Exec prefix where MYSQL is installed (optional)], - mysql_exec_prefix="$withval", mysql_exec_prefix="") -AC_ARG_ENABLE(mysqltest, [ --disable-mysqltest Do not try to compile and run a test MYSQL program], - , enable_mysqltest=yes) - - if test x$mysql_exec_prefix != x ; then - mysql_args="$mysql_args --exec-prefix=$mysql_exec_prefix" - if test x${MYSQL_CONFIG+set} != xset ; then - MYSQL_CONFIG=$mysql_exec_prefix/bin/mysql_config - fi - fi - if test x$mysql_prefix != x ; then - mysql_args="$mysql_args --prefix=$mysql_prefix" - if test x${MYSQL_CONFIG+set} != xset ; then - MYSQL_CONFIG=$mysql_prefix/bin/mysql_config - fi - fi - - AC_REQUIRE([AC_CANONICAL_TARGET]) - AC_PATH_PROG(MYSQL_CONFIG, mysql_config, no) - min_mysql_version=ifelse([$1], ,0.11.0,$1) - AC_MSG_CHECKING(for MYSQL - version >= $min_mysql_version) - no_mysql="" - if test "$MYSQL_CONFIG" = "no" ; then - no_mysql=yes - else - MYSQL_CFLAGS=`$MYSQL_CONFIG $mysqlconf_args --cflags | sed -e "s/'//g"` - MYSQL_LIBS=`$MYSQL_CONFIG $mysqlconf_args --libs | sed -e "s/'//g"` - - mysql_major_version=`$MYSQL_CONFIG $mysql_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - mysql_minor_version=`$MYSQL_CONFIG $mysql_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - mysql_micro_version=`$MYSQL_CONFIG $mysql_config_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - if test "x$enable_mysqltest" = "xyes" ; then - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $MYSQL_CFLAGS" - LIBS="$LIBS $MYSQL_LIBS" -# -# Now check if the installed MYSQL is sufficiently new. (Also sanity -# checks the results of mysql_config to some extent -# - rm -f conf.mysqltest - AC_TRY_RUN([ -#include -#include -#include -#include - -char* -my_strdup (char *str) -{ - char *new_str; - - if (str) - { - new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); - strcpy (new_str, str); - } - else - new_str = NULL; - - return new_str; -} - -int main (int argc, char *argv[]) -{ - int major, minor, micro; - char *tmp_version; - - /* This hangs on some systems (?) - system ("touch conf.mysqltest"); - */ - { FILE *fp = fopen("conf.mysqltest", "a"); if ( fp ) fclose(fp); } - - /* HP/UX 9 (%@#!) writes to sscanf strings */ - tmp_version = my_strdup("$min_mysql_version"); - if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { - printf("%s, bad version string\n", "$min_mysql_version"); - exit(1); - } - - if (($mysql_major_version > major) || - (($mysql_major_version == major) && ($mysql_minor_version > minor)) || - (($mysql_major_version == major) && ($mysql_minor_version == minor) && ($mysql_micro_version >= micro))) - { - return 0; - } - else - { - printf("\n*** 'mysql_config --version' returned %d.%d.%d, but the minimum version\n", $mysql_major_version, $mysql_minor_version, $mysql_micro_version); - printf("*** of MYSQL required is %d.%d.%d. If mysql_config is correct, then it is\n", major, minor, micro); - printf("*** best to upgrade to the required version.\n"); - printf("*** If mysql_config was wrong, set the environment variable MYSQL_CONFIG\n"); - printf("*** to point to the correct copy of mysql_config, and remove the file\n"); - printf("*** config.cache before re-running configure\n"); - return 1; - } -} - -],, no_mysql=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - if test "x$no_mysql" = x ; then - AC_MSG_RESULT(yes) - ifelse([$2], , :, [$2]) - else - AC_MSG_RESULT(no) - if test "$MYSQL_CONFIG" = "no" ; then - echo "*** The mysql_config script installed by MYSQL could not be found" - echo "*** If MYSQL was installed in PREFIX, make sure PREFIX/bin is in" - echo "*** your path, or set the MYSQL_CONFIG environment variable to the" - echo "*** full path to mysql_config." - else - if test -f conf.mysqltest ; then - : - else - echo "*** Could not run MYSQL test program, checking why..." - CFLAGS="$CFLAGS $MYSQL_CFLAGS" - LIBS="$LIBS $MYSQL_LIBS" - AC_TRY_LINK([ -#include -#include - -int main(int argc, char *argv[]) -{ return 0; } -#undef main -#define main K_and_R_C_main -], [ return 0; ], - [ echo "*** The test program compiled, but did not run. This usually means" - echo "*** that the run-time linker is not finding MYSQL or finding the wrong" - echo "*** version of MYSQL. If it is not finding MYSQL, you'll need to set your" - echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" - echo "*** to the installed location Also, make sure you have run ldconfig if that" - echo "*** is required on your system" - echo "***" - echo "*** If you have an old version installed, it is best to remove it, although" - echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], - [ echo "*** The test program failed to compile or link. See the file config.log for the" - echo "*** exact error that occured. This usually means MYSQL was incorrectly installed" - echo "*** or that you have moved MYSQL since it was installed. In the latter case, you" - echo "*** may want to edit the mysql_config script: $MYSQL_CONFIG" ]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - MYSQL_CFLAGS="" - MYSQL_LIBS="" - ifelse([$3], , :, [$3]) - fi - AC_SUBST(MYSQL_CFLAGS) - AC_SUBST(MYSQL_LIBS) - rm -f conf.mysqltest -]) - -# ========================================================================= -# AM_PATH_FMOD : FMOD checking macros - -AC_DEFUN([AM_PATH_FMOD], -[ is_mandatory="$1" - -AC_REQUIRE_CPP() - -# Get from the user option the path to the FMOD files location -AC_ARG_WITH( fmod, - [ --with-fmod= path to the FMOD install files directory. - e.g. /usr/local]) - -AC_ARG_WITH( fmod-include, - [ --with-fmod-include= - path to the FMOD header files directory. - e.g. /usr/local/include]) - -AC_ARG_WITH( fmod-lib, - [ --with-fmod-lib= - path to the FMOD library files directory. - e.g. /usr/local/lib]) - -fmod_lib="fmod" - -if test $with_fmod -then - fmod_includes="$with_fmod/include" - fmod_libraries="$with_fmod/lib" -fi - -if test "$with_fmod_include" -then - fmod_includes="$with_fmod_include" -fi - -if test "$with_fmod_lib" -then - fmod_libraries="$with_fmod_lib" -fi - - -# Set FMOD_CFLAGS -if test "$fmod_includes" -then - FMOD_CFLAGS="-I$fmod_includes" -fi - -# Set FMOD_LIBS -if test "$fmod_libraries" -then - FMOD_LIBS="-L$fmod_libraries" -fi -FMOD_LIBS="$FMOD_LIBS -l$fmod_lib" - -_CPPFLAGS="$CPPFLAGS" -CPPFLAGS="$CXXFLAGS $FMOD_CFLAGS" - -AC_MSG_CHECKING(for FMOD headers) -AC_EGREP_CPP( yo_fmod, -[#include -#ifdef FMOD_VERSION - yo_fmod -#endif], - have_fmod_headers="yes", - have_fmod_headers="no" ) - -if test "$have_fmod_headers" = "yes" -then - if test "$fmod_includes" - then - AC_MSG_RESULT([$fmod_includes]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -# Test the libraries -AC_MSG_CHECKING(for FMOD libraries) - -CPPFLAGS="$CXXFLAGS $FMOD_LIBS" - -AC_TRY_LINK( , , have_fmod_libraries="yes", have_fmod_libraries="no") - -CPPFLAGS="$_CPPFLAGS" - -if test "$have_fmod_libraries" = "yes" -then - if test "$fmod_libraries" - then - AC_MSG_RESULT([$fmod_libraries]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -fmod_libraries="$fmod_libraries" - -if test "$have_fmod_headers" = "yes" \ - && test "$have_fmod_libraries" = "yes" -then - have_fmod="yes" -else - have_fmod="no" -fi - -if test "$have_fmod" = "no" -a "$is_mandatory" = "yes" -then - AC_MSG_ERROR([FMOD is needed to compile NeL (http://www.fmod.org).]) -fi - -AC_SUBST(FMOD_CFLAGS) -AC_SUBST(FMOD_LIBS) - -]) - -# ========================================================================= -# End of file - diff --git a/code/nel/CMakeLists.txt b/code/nel/CMakeLists.txt index ead484a2d..57f7edd44 100644 --- a/code/nel/CMakeLists.txt +++ b/code/nel/CMakeLists.txt @@ -54,24 +54,27 @@ IF(WITH_GTK) FIND_PACKAGE(GTK2) ENDIF(WITH_GTK) -IF(UNIX) - SET(prefix ${CMAKE_INSTALL_PREFIX}) - SET(exec_prefix ${CMAKE_INSTALL_PREFIX}/bin) - SET(libdir ${CMAKE_INSTALL_PREFIX}/lib) - SET(includedir ${CMAKE_INSTALL_PREFIX}/include) - SET(enable_ligo ${WITH_LIGO}) - SET(enable_logic ${WITH_LOGIC}) - SET(enable_georges ${WITH_GEORGES}) - SET(enable_net ${WITH_NET}) - SET(enable_3d ${WITH_3D}) - SET(enable_pacs ${WITH_PACS}) - SET(enable_sound ${WITH_SOUND}) - CONFIGURE_FILE(nel-config.in ${CMAKE_CURRENT_BINARY_DIR}/nel-config) +IF(WITH_INSTALL_LIBRARIES) + IF(UNIX) + SET(prefix ${CMAKE_INSTALL_PREFIX}) + SET(exec_prefix ${CMAKE_INSTALL_PREFIX}/bin) + SET(libdir ${CMAKE_INSTALL_PREFIX}/lib) + SET(includedir ${CMAKE_INSTALL_PREFIX}/include) + SET(enable_ligo ${WITH_LIGO}) + SET(enable_logic ${WITH_LOGIC}) + SET(enable_georges ${WITH_GEORGES}) + SET(enable_net ${WITH_NET}) + SET(enable_3d ${WITH_3D}) + SET(enable_pacs ${WITH_PACS}) + SET(enable_sound ${WITH_SOUND}) + CONFIGURE_FILE(nel-config.in ${CMAKE_CURRENT_BINARY_DIR}/nel-config) - INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/nel-config DESTINATION bin) -ENDIF(UNIX) + INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/nel-config DESTINATION bin) + ENDIF(UNIX) + + ADD_SUBDIRECTORY(include) +ENDIF(WITH_INSTALL_LIBRARIES) -ADD_SUBDIRECTORY(include) ADD_SUBDIRECTORY(src) IF(WITH_NEL_SAMPLES) diff --git a/code/nel/Makefile.am b/code/nel/Makefile.am deleted file mode 100644 index f2af0b6d0..000000000 --- a/code/nel/Makefile.am +++ /dev/null @@ -1,46 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in \ - configure \ - libtool \ - config.guess \ - config.sub \ - ltconfig \ - aclocal.m4 \ - config.h.in \ - install-sh \ - missing \ - mkinstalldirs \ - ltmain.sh \ - include/nelconfig.h \ - include/nelconfig.h.in \ - include/nel/nelconfig.h - -DISTCLEANFILES = include/stamp-h \ - include/stamp-h.in - -SUBDIRS = include src @TOOLS_SUBDIR@ @SAMPLE_SUBDIR@ - -bin_SCRIPTS = nel-config - -EXTRA_DIST = nel.dsw \ - nel.sln \ - nel_8.sln \ - autogen.sh \ - nel.m4 \ - automacros \ - doc \ - kdevelop \ - tools \ - samples - -dist-hook: - find $(distdir) -name CVS -print | xargs rm -fr - find $(distdir) -name .svn -print | xargs rm -fr - -m4datadir = $(datadir)/aclocal -m4data_DATA = nel.m4 - -# End of Makefile.am - diff --git a/code/nel/acinclude.m4 b/code/nel/acinclude.m4 deleted file mode 100644 index 7a6655bff..000000000 --- a/code/nel/acinclude.m4 +++ /dev/null @@ -1,1214 +0,0 @@ -# ========================================================================= -# -# Macros used by Nevrax in configure.in files. -# -# -# ========================================================================= - -# ========================================================================= -# WARNING: The original version of this file is placed in the $CVSROOT/code -# directory. -# There is links in the $CVSROOT/code sub-directories to that file -# (ex: $CVSROOT/code/nel), so be careful of the consequences of -# any modification of that file. -# ========================================================================= - -# ========================================================================= -# Macros available in that file. -# -# -# AM_NEL_DEBUG -# -# Option: none. -# Description: manage the different debug and the release mode by setting -# correctly the CFLAGS and CXXFLAGS variables. -# -# -# AM_PATH_NEL -# -# Option: none. -# Description: check the instalation of the NeL library and set the -# CXXFLAGS and LIBS variables to use it. -# -# -# AM_PATH_OPENGL -# -# Option: "yes" if the use of the OpenGL library is mandatory. -# Description: check the instalation of the OpenGL library and set the -# OPENGL_CFLAGS and OPENGL_LIBS variables to use it. -# -# -# AM_PATH_FREETYPE -# -# Option: "yes" if the use of the Freetype library is mandatory. -# Description: check the instalation of the OpenGL library and set the -# FREETYPE_CFLAGS and FREETYPE_LIBS variables to use it. -# -# -# AM_PATH_XF86VIDMODE -# -# Option: none. -# Description: check the instalation of the OpenGL library and set the -# XF86VIDMODE_CFLAGS and XF86VIDMODE_LIBS variables to use it. -# -# -# AM_PATH_OPENAL -# -# Option: "yes" if the use of the OpenAL library is mandatory. -# Description: check the instalation of the OpenGL library and set the -# OPENAL_CFLAGS and OPENAL_LIBS variables to use it. -# -# -# AM_PATH_PYTHON -# -# Option: "yes" if the use of the Python library is mandatory. -# Description: check the instalation of the OpenGL library and set the -# PYTHON_CFLAGS and PYTHON_LIBS variables to use it. -# -# ========================================================================= - - -# ========================================================================= -# AM_NEL_DEBUG - -AC_DEFUN([AM_NEL_DEBUG], -[ - -MAX_C_OPTIMIZE="-O6" - -NL_DEBUG="-DNL_DEBUG" -NL_RELEASE="-DNL_RELEASE" - -AC_ARG_WITH(debug, - [ --with-debug[=full|medium|fast] - Build a debug version (huge libraries). - Full mode set no optimization. - Medium mode set NeL debug flags with inline - optimization (default mode). - Fast mode is like the Medium mode with some basic - optimization. - --without-debug Build without debugging code (default)], - [with_debug=$withval], - [with_debug=no]) - -# Build optimized or debug version ? -# First check for gcc and g++ -if test "$ac_cv_prog_gcc" = "yes" -then - DEBUG_CFLAGS="-g -O0" - DEBUG_OPTIMIZE_CC="-O" - OPTIMIZE_CFLAGS="$MAX_C_OPTIMIZE" -else - DEBUG_CFLAGS="" - DEBUG_OPTIMIZE_CC="" - OPTIMIZE_CFLAGS="" -fi - -if test "$ac_cv_prog_cxx_g" = "yes" -then - DEBUG_CXXFLAGS="-g -O0" - DEBUG_OPTIMIZE_CXX="-O" - OPTIMIZE_CXXFLAGS="-O3" - OPTIMIZE_INLINE_CXXFLAGS="-finline-functions" -else - DEBUG_CXXFLAGS="" - DEBUG_OPTIMIZE_CXX="" - OPTIMIZE_CXXFLAGS="" - OPTIMIZE_INLINE_CXXFLAGS="" -fi - -if test "$with_debug" = "yes" -o "$with_debug" = "medium" -then - # Medium debug. Inline optimization - CFLAGS="$DEBUG_CFLAGS $OPTIMIZE_INLINE_CFLAGS $NL_DEBUG $CFLAGS" - CXXFLAGS="$DEBUG_CXXFLAGS $OPTIMIZE_INLINE_CXXFLAGS $NL_DEBUG $CXXFLAGS" -else - if test "$with_debug" = "full" - then - # Full debug. Very slow in some cases - CFLAGS="$DEBUG_CFLAGS $NL_DEBUG $CFLAGS" - CXXFLAGS="$DEBUG_CXXFLAGS $NL_DEBUG $CXXFLAGS" - else - if test "$with_debug" = "fast" - then - # Fast debug. - CFLAGS="$DEBUG_CFLAGS $DEBUG_OPTIMIZE_CC $OPTIMIZE_INLINE_CFLAGS $NL_DEBUG $CFLAGS" - CXXFLAGS="$DEBUG_CXXFLAGS $DEBUG_OPTIMIZE_CXX $OPTIMIZE_INLINE_CXXFLAGS $NL_DEBUG $CXXFLAGS" - else - # Optimized version. No debug - CFLAGS="$OPTIMIZE_CFLAGS $NL_RELEASE $CFLAGS" - CXXFLAGS="$OPTIMIZE_CXXFLAGS $NL_RELEASE $CXXFLAGS" - fi - fi -fi - -# AC_MSG_RESULT([CFLAGS = $CFLAGS]) -# AC_MSG_RESULT([CXXGLAGS = $CXXFLAGS]) - -]) - - -# ========================================================================= -# MY_NEL_HEADER_CHK : NeL header files checking macros - -AC_DEFUN([MY_NEL_HEADER_CHK], -[ AC_REQUIRE_CPP() - -chk_message_obj="$1" -header="$2" -macro="$3" -is_mandatory="$4" - -if test $is_mandatory = "yes" -then - - _CPPFLAGS="$CPPFLAGS" - - CPPFLAGS="$CXXFLAGS $NEL_CFLAGS" - - AC_MSG_CHECKING(for $header) - - AC_EGREP_CPP( yo_header, -[#include <$header> -#ifdef $macro - yo_header -#endif], - have_header="yes", - have_header="no") - - CPPFLAGS="$_CPPFLAGS" - - if test "$have_header" = "yes" - then - AC_MSG_RESULT(yes) - else - if test "$is_mandatory" = "yes" - then - AC_MSG_ERROR([$chk_message_obj must be installed (http://dev.ryzom.com).]) - else - AC_MSG_RESULT(no) - fi - fi -fi - - -]) - - -# ========================================================================= -# MY_NEL_LIB_CHK : NeL library checking macros - -AC_DEFUN([MY_NEL_LIB_CHK], -[ AC_REQUIRE_CPP() - -chk_message_obj="$1" -nel_test_lib="$2" -is_mandatory="$3" - -if test $is_mandatory = "yes" -then - - AC_CHECK_LIB($nel_test_lib, main,,[AC_MSG_ERROR([$chk_message_obj must be installed (http://dev.ryzom.com).])]) -fi -]) - - -# ========================================================================= -# AM_PATH_NEL : NeL checking macros -AC_DEFUN([AM_PATH_NEL], -[ AC_REQUIRE_CPP() - -AC_ARG_WITH( nel, - [ --with-nel= path to the NeL install files directory. - e.g. /usr/local/nel]) - -AC_ARG_WITH( nel-include, - [ --with-nel-include= - path to the NeL header files directory. - e.g. /usr/local/nel/include]) - -AC_ARG_WITH( nel-lib, - [ --with-nel-lib= - path to the NeL library files directory. - e.g. /usr/local/nel/lib]) - - -nelmisc_is_mandatory="$1" -nelnet_is_mandatory="$2" -nel3d_is_mandatory="$3" -nelpacs_is_mandatory="$4" -nelsound_is_mandatory="$5" -nelai_is_mandatory="$6" -nelgeorges_is_mandatory="$7" - -# Check for nel-config -AC_PATH_PROG(NEL_CONFIG, nel-config, no) - -# -# Configure options (--with-nel*) have precendence -# over nel-config only set variables if they are not -# specified -# -if test "$NEL_CONFIG" != "no" -then - if test -z "$with_nel" -a -z "$with_nel_include" - then - CXXFLAGS="$CXXFLAGS `nel-config --cflags`" - fi - - if test -z "$with_nel" -a -z "$with_nel_lib" - then - LDFLAGS="`nel-config --ldflags` $LDFLAGS" - fi -fi - -# -# Set nel_libraries and nel_includes according to -# user specification (--with-nel*) if any. -# --with-nel-include and --with-nel-lib have precendence -# over --with-nel -# -if test "$with_nel" = "no" -then - # The user explicitly disabled the use of the NeL - AC_MSG_ERROR([NeL is mandatory: do not specify --without-nel]) -else - if test "$with_nel" -a "$with_nel" != "yes" - then - nel_includes="$with_nel/include" - nel_libraries="$with_nel/lib" - fi -fi - -if test "$with_nel_include" -then - nel_includes="$with_nel_include" -fi - -if test "$with_nel_lib" -then - nel_libraries="$with_nel_lib" -fi - -# -# Set compilation variables -# -if test "$nel_includes" -then - CXXFLAGS="$CXXFLAGS -I$nel_includes" -fi - -if test "$nel_libraries" -then - LDFLAGS="-L$nel_libraries $LDFLAGS" -fi - -# -# Collect headers information and bark if missing and -# mandatory -# - -MY_NEL_HEADER_CHK([NeL Misc], [nel/misc/types_nl.h], [NL_TYPES_H], $nelmisc_is_mandatory) -MY_NEL_HEADER_CHK([NeL Network], [nel/net/sock.h], [NL_SOCK_H], $nelnet_is_mandatory) -MY_NEL_HEADER_CHK([NeL 3D], [nel/3d/u_camera.h], [NL_U_CAMERA_H], $nel3d_is_mandatory) -MY_NEL_HEADER_CHK([NeL PACS], [nel/pacs/u_global_position.h], [NL_U_GLOBAL_POSITION_H], $nelpacs_is_mandatory) -MY_NEL_HEADER_CHK([NeL Sound], [nel/sound/u_source.h], [NL_U_SOURCE_H], $nelsound_is_mandatory) -MY_NEL_HEADER_CHK([NeL AI], [nel/ai/nl_ai.h], [_IA_NEL_H], $nelai_is_mandatory) -MY_NEL_HEADER_CHK([NeL Georges], [nel/georges/common.h], [NLGEORGES_COMMON_H], $nelgeorges_is_mandatory) - -# -# Collect libraries information and bark if missing and -# mandatory -# - -MY_NEL_LIB_CHK([NeL Misc], [nelmisc], $nelmisc_is_mandatory) -MY_NEL_LIB_CHK([NeL Network], [nelnet], $nelnet_is_mandatory) -MY_NEL_LIB_CHK([NeL 3D], [nel3d], $nel3d_is_mandatory) -MY_NEL_LIB_CHK([NeL PACS], [nelpacs], $nelpacs_is_mandatory) -MY_NEL_LIB_CHK([NeL Sound], [nelsnd], $nelsound_is_mandatory) -MY_NEL_LIB_CHK([NeL AI], [nelai], $nelai_is_mandatory) -MY_NEL_LIB_CHK([NeL Georges], [nelgeorges], $nelgeorges_is_mandatory) - -]) - -# ========================================================================= -# AM_PATH_OPENGL : OpenGL checking macros - -AC_DEFUN([AM_PATH_OPENGL], -[ AC_MSG_CHECKING(for OpenGL headers and GL Version >= 1.2) - -is_mandatory="$1" - -AC_REQUIRE_CPP() - -AC_ARG_WITH( opengl, - [ --with-opengl= path to the OpenGL install files directory. - e.g. /usr/local]) - -AC_ARG_WITH( opengl-include, - [ --with-opengl-include= - path to the OpenGL header files directory. - e.g. /usr/local/include]) - -AC_ARG_WITH( opengl-lib, - [ --with-opengl-lib= - path to the OpenGL library files directory. - e.g. /usr/local/lib]) - -opengl_lib="GL" - -if test "$with_opengl" -then - opengl_includes="$with_opengl/include" - opengl_libraries="$with_opengl/lib" -fi - -if test "$with_opengl_include" -then - opengl_includes="$with_opengl_include" -fi - -if test "$with_opengl_lib" -then - opengl_libraries="$with_opengl_lib" -fi - -# Set OPENGL_CFLAGS -if test "$opengl_includes" -then - OPENGL_CFLAGS="-I$opengl_includes" -fi - -# Set OPENGL_LIBS -if test "$opengl_libraries" -then - OPENGL_LIBS="-L$opengl_libraries" -fi -OPENGL_LIBS="$OPENGL_LIBS -l$opengl_lib" - -# Test the headers -_CPPFLAGS="$CPPFLAGS" - -CPPFLAGS="$CXXFLAGS $OPENGL_CFLAGS" - -AC_EGREP_CPP( yo_opengl, -[#include -#if defined(GL_VERSION_1_2) - yo_opengl -#endif], - have_opengl_headers="yes", - have_opengl_headers="no" ) - -if test "$have_opengl_headers" = "yes" -then - if test "$opengl_includes" - then - AC_MSG_RESULT([$opengl_includes]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -# Checking the GLEXT version >= 7 -AC_MSG_CHECKING(for and GLEXT version >= 7) - -AC_EGREP_CPP( yo_glext_version, -[#include -#ifdef GL_GLEXT_VERSION -#if GL_GLEXT_VERSION >= 7 - yo_glext_version -#endif -#endif], - have_glext="yes", - have_glext="no" ) - -if test "$have_glext" = "yes" -then - AC_MSG_RESULT(yes) -else - AC_MSG_RESULT([no, can be downloaded from http://www.opengl.org/registry/]) -fi - -# Test the libraries -AC_MSG_CHECKING(for OpenGL libraries) - -CPPFLAGS="$CXXFLAGS $OPENGL_LIBS" - -AC_TRY_LINK( , , have_opengl_libraries="yes", have_opengl_libraries="no") - -CPPFLAGS="$_CPPFLAGS" - -if test "$have_opengl_libraries" = "yes" -then - if test "$opengl_libraries" - then - AC_MSG_RESULT([$opengl_libraries]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -opengl_libraries="$opengl_libraries" - -if test "$have_opengl_headers" = "yes" \ - -a "$have_glext" = "yes" \ - -a "$have_opengl_libraries" = "yes" -then - have_opengl="yes" -else - have_opengl="no" -fi - -if test "$have_opengl" = "no" -a "$is_mandatory" = "yes" -then - AC_MSG_ERROR([OpenGL >= 1.2 must be installed (http://www.mesa3d.org)]) -fi - -AC_SUBST(OPENGL_CFLAGS) -AC_SUBST(OPENGL_LIBS) - -]) - - -# ========================================================================= -# AM_PATH_FREETYPE : FreeType checking macros - -AC_DEFUN([AM_PATH_FREETYPE], -[ is_mandatory="$1" - -AC_REQUIRE_CPP() - -AC_ARG_WITH( freetype, - [ --with-freetype= path to the FreeType install files directory. - e.g. /usr/local/freetype]) - -AC_ARG_WITH( freetype-include, - [ --with-freetype-include= - path to the FreeType header files directory. - e.g. /usr/local/freetype/include]) - -AC_ARG_WITH( freetype-lib, - [ --with-freetype-lib= - path to the FreeType library files directory. - e.g. /usr/local/freetype/lib]) - -freetype_lib="freetype" - - -AC_PATH_PROG(FREETYPE_CONFIG, freetype-config, no) - -if test "$FREETYPE_CONFIG" = "no" -then - have_freetype_config="no" -else - FREETYPE_CFLAGS=`freetype-config --cflags` - FREETYPE_LIBS=`freetype-config --libs` - have_freetype_config="yes" -fi - -if test "$with_freetype" -then - freetype_includes="$with_freetype/include" - freetype_libraries="$with_freetype/lib" -fi - -if test "$with_freetype_include" -then - freetype_includes="$with_freetype_include" -fi - -if test "$with_freetype_lib" -then - freetype_libraries="$with_freetype_lib" -fi - -if test "$freetype_includes" -then - FREETYPE_CFLAGS="-I$freetype_includes" -fi - -# Checking the FreeType 2 instalation -_CPPFLAGS="$CPPFLAGS" -CPPFLAGS=" $FREETYPE_CFLAGS $CXXFLAGS" - -AC_MSG_CHECKING(for FreeType version = 2) - -AC_EGREP_CPP( yo_freetype2, -[#include -#if FREETYPE_MAJOR == 2 - yo_freetype2 -#endif], - have_freetype2="yes", - have_freetype2="no") - -if test "$have_freetype2" = "yes" -then - AC_MSG_RESULT(yes) -else - AC_MSG_RESULT(no) -fi - -# Test the libraries -AC_MSG_CHECKING(for FreeType libraries) - -if test $freetype_libraries -then - FREETYPE_LIBS="-L$freetype_libraries -l$freetype_lib" -fi - -CPPFLAGS="$FREETYPE_LIBS $CXXFLAGS" - -AC_TRY_LINK( , , have_freetype_libraries="yes", have_freetype_libraries="no") - -CPPFLAGS="$_CPPFLAGS" - -if test "$have_freetype_libraries" = "yes" -then - if test "$freetype_libraries" - then - AC_MSG_RESULT([$freetype_libraries]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -if test "$have_freetype2" = "yes" && test "$have_freetype_libraries" = "yes" -then - have_freetype="yes" -else - have_freetype="no" -fi - -if test "$have_freetype" = "no" && test "$is_mandatory" = "yes" -then - AC_MSG_ERROR([FreeType 2 must be installed (http://freetype.sourceforge.net)]) -fi - -AC_SUBST(FREETYPE_CFLAGS) -AC_SUBST(FREETYPE_LIBS) - -]) - - -# ========================================================================= -# AM_PATH_XF86VIDMODE : XF86VidMode checking macros - -AC_DEFUN([AM_PATH_XF86VIDMODE], -[ AC_MSG_CHECKING(for XF86VidMode extension) - -AC_REQUIRE_CPP() - -AC_ARG_WITH( xf86vidmode-lib, - [ --with-xf86vidmode-lib= - path to the XF86VidMode library. - e.g. /usr/X11R6/lib] ) - -xf86vidmode_lib="Xxf86vm" - -if test "$with_xf86vidmode_lib" = no -then - # The user explicitly disabled the use of XF86VidMode - have_xf86vidmode="disabled" - AC_MSG_RESULT(disabled) -else - if test "$with_xf86vidmode_lib" - then - xf86vidmode_libraries="$with_xf86vidmode_lib" - fi - - XF86VIDMODE_CFLAGS="-DXF86VIDMODE" -fi - -if test -z "$have_xf86vidmode" -# -a "$with_xf86vidmode_lib" -then - if test "$xf86vidmode_libraries" - then - XF86VIDMODE_LIBS="-L$xf86vidmode_libraries" - fi - - XF86VIDMODE_LIBS="$XF86VIDMODE_LIBS -l$xf86vidmode_lib" - - _CPPFLAGS="$CPPFLAGS" - - CPPFLAGS="$CXXFLAGS $XF86VIDMODE_LIBS" - - AC_TRY_LINK( , , have_xf86vidmode_libraries="yes", have_xf86vidmode_libraries="no") - - CPPFLAGS="$_CPPFLAGS" - - if test "$have_xf86vidmode_libraries" = "yes" - then - have_xf86vidmode="yes" - if test "$xf86vidmode_libraries" - then - AC_MSG_RESULT($xf86vidmode_libraries) - else - AC_MSG_RESULT(yes) - fi - else - have_xf86vidmode="no" - AC_MSG_RESULT(no, no fullscreen support available.) - fi - - xf86vidmode_libraries="$xf86vidmode_libraries" - -fi - -AC_SUBST(XF86VIDMODE_CFLAGS) -AC_SUBST(XF86VIDMODE_LIBS) - -]) - - -# ========================================================================= -# AM_PATH_OPENAL : OpenAL checking macros - -AC_DEFUN([AM_PATH_OPENAL], -[ is_mandatory="$1" - -AC_REQUIRE_CPP() - -# Get from the user option the path to the OpenAL files location -AC_ARG_WITH( openal, - [ --with-openal= path to the OpenAL install files directory. - e.g. /usr/local]) - -AC_ARG_WITH( openal-include, - [ --with-openal-include= - path to the OpenAL header files directory. - e.g. /usr/local/include]) - -AC_ARG_WITH( openal-lib, - [ --with-openal-lib= - path to the OpenAL library files directory. - e.g. /usr/local/lib]) - -openal_lib="openal" -alut_lib="alut" - -if test $with_openal -then - openal_includes="$with_openal/include" - openal_libraries="$with_openal/lib" -fi - -if test "$with_openal_include" -then - openal_includes="$with_openal_include" -fi - -if test "$with_openal_lib" -then - openal_libraries="$with_openal_lib" -fi - - -# Set OPENAL_CFLAGS -if test "$openal_includes" -then - OPENAL_CFLAGS="-I$openal_includes" -fi - -# Set OPENAL_LIBS -if test "$openal_libraries" -then - OPENAL_LIBS="-L$openal_libraries" -fi -OPENAL_LIBS="$OPENAL_LIBS -l$openal_lib -l$alut_lib" - -_CPPFLAGS="$CPPFLAGS" -CPPFLAGS="$CXXFLAGS $OPENAL_CFLAGS" - -AC_MSG_CHECKING(for OpenAL headers) -AC_EGREP_CPP( yo_openal, -[#include -#include -#ifdef AL_VERSION - yo_openal -#endif], - have_openal_headers="yes", - have_openal_headers="no" ) - -if test "$have_openal_headers" = "yes" -then - if test "$openal_includes" - then - AC_MSG_RESULT([$openal_includes]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -# Test the libraries -AC_MSG_CHECKING(for OpenAL libraries) - -CPPFLAGS="$CXXFLAGS $OPENAL_LIBS" - -AC_TRY_LINK( , , have_openal_libraries="yes", have_openal_libraries="no") - -CPPFLAGS="$_CPPFLAGS" - -if test "$have_openal_libraries" = "yes" -then - if test "$openal_libraries" - then - AC_MSG_RESULT([$openal_libraries]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -openal_libraries="$openal_libraries" - -if test "$have_openal_headers" = "yes" \ - && test "$have_openal_libraries" = "yes" -then - have_openal="yes" -else - have_openal="no" -fi - -if test "$have_openal" = "no" -a "$is_mandatory" = "yes" -then - AC_MSG_ERROR([OpenAL is needed to compile NeL (http://www.openal.org).]) -fi - -AC_SUBST(OPENAL_CFLAGS) -AC_SUBST(OPENAL_LIBS) -AC_SUBST([have_openal]) - -]) - - -# ========================================================================= -# AM_PATH_PYTHON : Python checking macros - -AC_DEFUN([AM_PATH_PYTHON], -[ python_version_required="$1" - -is_mandatory="$2" - -AC_REQUIRE_CPP() - -# Get from the user option the path to the Python files location -AC_ARG_WITH( python, - [ --with-python= path to the Python prefix installation directory. - e.g. /usr/local], - [ PYTHON_PREFIX=$with_python ] -) - -AC_ARG_WITH( python-version, - [ --with-python-version= - Python version to use, e.g. 1.5], - [ PYTHON_VERSION=$with_python_version ] -) - -if test ! "$PYTHON_PREFIX" = "" -then - PATH="$PYTHON_PREFIX/bin:$PATH" -fi - -if test ! "$PYTHON_VERSION" = "" -then - PYTHON_EXEC="python$PYTHON_VERSION" -else - PYTHON_EXEC="python python2.1 python2.0 python1.5" -fi - -AC_PATH_PROGS(PYTHON, $PYTHON_EXEC, no, $PATH) - -if test "$PYTHON" != "no" -then - PYTHON_PREFIX=`$PYTHON -c 'import sys; print "%s" % (sys.prefix)'` - PYTHON_VERSION=`$PYTHON -c 'import sys; print "%s" % (sys.version[[:3]])'` - - is_python_version_enough=`expr $python_version_required \<= $PYTHON_VERSION` -fi - - -if test "$PYTHON" = "no" || test "$is_python_version_enough" != "1" -then - - if test "$is_mandatory" = "yes" - then - AC_MSG_ERROR([Python $python_version_required must be installed (http://www.python.org)]) - else - have_python="no" - fi - -else - - python_includes="$PYTHON_PREFIX/include/python$PYTHON_VERSION" - python_libraries="$PYTHON_PREFIX/lib/python$PYTHON_VERSION/config" - python_lib="python$PYTHON_VERSION" - - PYTHON_CFLAGS="-I$python_includes" - PYTHON_LIBS="-L$python_libraries -l$python_lib" - - _CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$CXXFLAGS ${PYTHON_CFLAGS}" - - # Test the headers - AC_MSG_CHECKING(for Python headers) - - AC_EGREP_CPP( yo_python, - [#include - yo_python - ], - have_python_headers="yes", - have_python_headers="no" ) - - if test "$have_python_headers" = "yes" - then - AC_MSG_RESULT([$python_includes]) - else - AC_MSG_RESULT(no) - fi - - # Test the libraries - AC_MSG_CHECKING(for Python libraries) - - CPPFLAGS="$CXXFLAGS $PYTHON_CFLAGS" - - AC_TRY_LINK( , , have_python_libraries="yes", have_python_libraries="no") - - CPPFLAGS="$_CPPFLAGS" - - if test "$have_python_libraries" = "yes" - then - if test "$python_libraries" - then - AC_MSG_RESULT([$python_libraries]) - else - AC_MSG_RESULT(yes) - fi - else - AC_MSG_RESULT(no) - fi - - if test "$have_python_headers" = "yes" \ - && test "$have_python_libraries" = "yes" - then - have_python="yes" - else - have_python="no" - fi - - if test "$have_python" = "no" -a "$is_mandatory" = "yes" - then - AC_MSG_ERROR([Python is needed to compile NeL (http://www.python.org).]) - fi - - AC_SUBST(PYTHON_CFLAGS) - AC_SUBST(PYTHON_LIBS) - -fi - -]) - -# ========================================================================= -# AM_PATH_MYSQL : MySQL library - -# AM_PATH_MYSQL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) -# Test for MYSQL, and define MYSQL_CFLAGS and MYSQL_LIBS -# -AC_DEFUN([AM_PATH_MYSQL], -[# -# Get the cflags and libraries from the mysql_config script -# -AC_ARG_WITH(mysql-prefix,[ --with-mysql-prefix=PFX Prefix where MYSQL is installed (optional)], - mysql_prefix="$withval", mysql_prefix="") -AC_ARG_WITH(mysql-exec-prefix,[ --with-mysql-exec-prefix=PFX Exec prefix where MYSQL is installed (optional)], - mysql_exec_prefix="$withval", mysql_exec_prefix="") -AC_ARG_ENABLE(mysqltest, [ --disable-mysqltest Do not try to compile and run a test MYSQL program], - , enable_mysqltest=yes) - - if test x$mysql_exec_prefix != x ; then - mysql_args="$mysql_args --exec-prefix=$mysql_exec_prefix" - if test x${MYSQL_CONFIG+set} != xset ; then - MYSQL_CONFIG=$mysql_exec_prefix/bin/mysql_config - fi - fi - if test x$mysql_prefix != x ; then - mysql_args="$mysql_args --prefix=$mysql_prefix" - if test x${MYSQL_CONFIG+set} != xset ; then - MYSQL_CONFIG=$mysql_prefix/bin/mysql_config - fi - fi - - AC_REQUIRE([AC_CANONICAL_TARGET]) - AC_PATH_PROG(MYSQL_CONFIG, mysql_config, no) - min_mysql_version=ifelse([$1], ,0.11.0,$1) - AC_MSG_CHECKING(for MYSQL - version >= $min_mysql_version) - no_mysql="" - if test "$MYSQL_CONFIG" = "no" ; then - no_mysql=yes - else - MYSQL_CFLAGS=`$MYSQL_CONFIG $mysqlconf_args --cflags | sed -e "s/'//g"` - MYSQL_LIBS=`$MYSQL_CONFIG $mysqlconf_args --libs | sed -e "s/'//g"` - - mysql_major_version=`$MYSQL_CONFIG $mysql_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - mysql_minor_version=`$MYSQL_CONFIG $mysql_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - mysql_micro_version=`$MYSQL_CONFIG $mysql_config_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - if test "x$enable_mysqltest" = "xyes" ; then - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $MYSQL_CFLAGS" - LIBS="$LIBS $MYSQL_LIBS" -# -# Now check if the installed MYSQL is sufficiently new. (Also sanity -# checks the results of mysql_config to some extent -# - rm -f conf.mysqltest - AC_TRY_RUN([ -#include -#include -#include -#include - -char* -my_strdup (char *str) -{ - char *new_str; - - if (str) - { - new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); - strcpy (new_str, str); - } - else - new_str = NULL; - - return new_str; -} - -int main (int argc, char *argv[]) -{ - int major, minor, micro; - char *tmp_version; - - /* This hangs on some systems (?) - system ("touch conf.mysqltest"); - */ - { FILE *fp = fopen("conf.mysqltest", "a"); if ( fp ) fclose(fp); } - - /* HP/UX 9 (%@#!) writes to sscanf strings */ - tmp_version = my_strdup("$min_mysql_version"); - if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { - printf("%s, bad version string\n", "$min_mysql_version"); - exit(1); - } - - if (($mysql_major_version > major) || - (($mysql_major_version == major) && ($mysql_minor_version > minor)) || - (($mysql_major_version == major) && ($mysql_minor_version == minor) && ($mysql_micro_version >= micro))) - { - return 0; - } - else - { - printf("\n*** 'mysql_config --version' returned %d.%d.%d, but the minimum version\n", $mysql_major_version, $mysql_minor_version, $mysql_micro_version); - printf("*** of MYSQL required is %d.%d.%d. If mysql_config is correct, then it is\n", major, minor, micro); - printf("*** best to upgrade to the required version.\n"); - printf("*** If mysql_config was wrong, set the environment variable MYSQL_CONFIG\n"); - printf("*** to point to the correct copy of mysql_config, and remove the file\n"); - printf("*** config.cache before re-running configure\n"); - return 1; - } -} - -],, no_mysql=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - if test "x$no_mysql" = x ; then - AC_MSG_RESULT(yes) - ifelse([$2], , :, [$2]) - else - AC_MSG_RESULT(no) - if test "$MYSQL_CONFIG" = "no" ; then - echo "*** The mysql_config script installed by MYSQL could not be found" - echo "*** If MYSQL was installed in PREFIX, make sure PREFIX/bin is in" - echo "*** your path, or set the MYSQL_CONFIG environment variable to the" - echo "*** full path to mysql_config." - else - if test -f conf.mysqltest ; then - : - else - echo "*** Could not run MYSQL test program, checking why..." - CFLAGS="$CFLAGS $MYSQL_CFLAGS" - LIBS="$LIBS $MYSQL_LIBS" - AC_TRY_LINK([ -#include -#include - -int main(int argc, char *argv[]) -{ return 0; } -#undef main -#define main K_and_R_C_main -], [ return 0; ], - [ echo "*** The test program compiled, but did not run. This usually means" - echo "*** that the run-time linker is not finding MYSQL or finding the wrong" - echo "*** version of MYSQL. If it is not finding MYSQL, you'll need to set your" - echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" - echo "*** to the installed location Also, make sure you have run ldconfig if that" - echo "*** is required on your system" - echo "***" - echo "*** If you have an old version installed, it is best to remove it, although" - echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], - [ echo "*** The test program failed to compile or link. See the file config.log for the" - echo "*** exact error that occured. This usually means MYSQL was incorrectly installed" - echo "*** or that you have moved MYSQL since it was installed. In the latter case, you" - echo "*** may want to edit the mysql_config script: $MYSQL_CONFIG" ]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - MYSQL_CFLAGS="" - MYSQL_LIBS="" - ifelse([$3], , :, [$3]) - fi - AC_SUBST(MYSQL_CFLAGS) - AC_SUBST(MYSQL_LIBS) - rm -f conf.mysqltest -]) - -# ========================================================================= -# AM_PATH_FMOD : FMOD checking macros - -AC_DEFUN([AM_PATH_FMOD], -[ is_mandatory="$1" - -AC_REQUIRE_CPP() - -# Get from the user option the path to the FMOD files location -AC_ARG_WITH( fmod, - [ --with-fmod= path to the FMOD install files directory. - e.g. /usr/local]) - -AC_ARG_WITH( fmod-include, - [ --with-fmod-include= - path to the FMOD header files directory. - e.g. /usr/local/include]) - -AC_ARG_WITH( fmod-lib, - [ --with-fmod-lib= - path to the FMOD library files directory. - e.g. /usr/local/lib]) - -fmod_lib="fmod" - -if test $with_fmod -then - fmod_includes="$with_fmod/include" - fmod_libraries="$with_fmod/lib" -fi - -if test "$with_fmod_include" -then - fmod_includes="$with_fmod_include" -fi - -if test "$with_fmod_lib" -then - fmod_libraries="$with_fmod_lib" -fi - - -# Set FMOD_CFLAGS -if test "$fmod_includes" -then - FMOD_CFLAGS="-I$fmod_includes" -fi - -# Set FMOD_LIBS -if test "$fmod_libraries" -then - FMOD_LIBS="-L$fmod_libraries" -fi -FMOD_LIBS="$FMOD_LIBS -l$fmod_lib" - -_CPPFLAGS="$CPPFLAGS" -CPPFLAGS="$CXXFLAGS $FMOD_CFLAGS" - -AC_MSG_CHECKING(for FMOD headers) -AC_EGREP_CPP( yo_fmod, -[#include -#ifdef FMOD_VERSION - yo_fmod -#endif], - have_fmod_headers="yes", - have_fmod_headers="no" ) - -if test "$have_fmod_headers" = "yes" -then - if test "$fmod_includes" - then - AC_MSG_RESULT([$fmod_includes]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -# Test the libraries -AC_MSG_CHECKING(for FMOD libraries) - -CPPFLAGS="$CXXFLAGS $FMOD_LIBS" - -AC_TRY_LINK( , , have_fmod_libraries="yes", have_fmod_libraries="no") - -CPPFLAGS="$_CPPFLAGS" - -if test "$have_fmod_libraries" = "yes" -then - if test "$fmod_libraries" - then - AC_MSG_RESULT([$fmod_libraries]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -fmod_libraries="$fmod_libraries" - -if test "$have_fmod_headers" = "yes" \ - && test "$have_fmod_libraries" = "yes" -then - have_fmod="yes" -else - have_fmod="no" -fi - -if test "$have_fmod" = "no" -a "$is_mandatory" = "yes" -then - AC_MSG_ERROR([FMOD is needed to compile NeL (http://www.fmod.org).]) -fi - -AC_SUBST(FMOD_CFLAGS) -AC_SUBST(FMOD_LIBS) -AC_SUBST([have_fmod]) - -]) - -# ========================================================================= -# End of file - diff --git a/code/nel/autogen.sh b/code/nel/autogen.sh deleted file mode 100755 index b863e1067..000000000 --- a/code/nel/autogen.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh - - -WANT_AUTOMAKE="1.6" - -case `uname -s` in -Darwin) - LIBTOOLIZE=glibtoolize - ;; -*) - LIBTOOLIZE=libtoolize - ;; -esac - -# be able to customize the aclocal (for example to add extra param) -if test "x$ACLOCAL" = "x" -then - ACLOCAL=aclocal -fi - -echo "Creating macros..." && \ -$ACLOCAL -I automacros/ && \ -echo "Creating library tools..." && \ -$LIBTOOLIZE --force && \ -echo "Creating header templates..." && \ -autoheader && \ -echo "Creating Makefile templates..." && \ -automake --gnu --add-missing && \ -echo "Creating 'configure'..." && \ -autoconf && \ -echo "" && \ -echo "Run: ./configure; make; make install" && \ -echo "" diff --git a/code/nel/automacros/gtk-2.0.m4 b/code/nel/automacros/gtk-2.0.m4 deleted file mode 100644 index 3deba01be..000000000 --- a/code/nel/automacros/gtk-2.0.m4 +++ /dev/null @@ -1,196 +0,0 @@ -# Configure paths for GTK+ -# Owen Taylor 1997-2001 - -dnl AM_PATH_GTK_2_0([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]]) -dnl Test for GTK+, and define GTK_CFLAGS and GTK_LIBS, if gthread is specified in MODULES, -dnl pass to pkg-config -dnl -AC_DEFUN([AM_PATH_GTK_2_0], -[dnl -dnl Get the cflags and libraries from pkg-config -dnl -AC_ARG_ENABLE(gtktest, [ --disable-gtktest do not try to compile and run a test GTK+ program], - , enable_gtktest=yes) - - pkg_config_args=gtk+-2.0 - for module in . $4 - do - case "$module" in - gthread) - pkg_config_args="$pkg_config_args gthread-2.0" - ;; - esac - done - - no_gtk="" - - AC_PATH_PROG(PKG_CONFIG, pkg-config, no) - - if test x$PKG_CONFIG != xno ; then - if pkg-config --atleast-pkgconfig-version 0.7 ; then - : - else - echo "*** pkg-config too old; version 0.7 or better required." - no_gtk=yes - PKG_CONFIG=no - fi - else - no_gtk=yes - fi - - min_gtk_version=ifelse([$1], ,2.0.0,$1) - AC_MSG_CHECKING(for GTK+ - version >= $min_gtk_version) - - if test x$PKG_CONFIG != xno ; then - ## don't try to run the test against uninstalled libtool libs - if $PKG_CONFIG --uninstalled $pkg_config_args; then - echo "Will use uninstalled version of GTK+ found in PKG_CONFIG_PATH" - enable_gtktest=no - fi - - if $PKG_CONFIG --atleast-version $min_gtk_version $pkg_config_args; then - : - else - no_gtk=yes - fi - fi - - if test x"$no_gtk" = x ; then - GTK_CFLAGS=`$PKG_CONFIG $pkg_config_args --cflags` - GTK_LIBS=`$PKG_CONFIG $pkg_config_args --libs` - gtk_config_major_version=`$PKG_CONFIG --modversion gtk+-2.0 | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - gtk_config_minor_version=`$PKG_CONFIG --modversion gtk+-2.0 | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - gtk_config_micro_version=`$PKG_CONFIG --modversion gtk+-2.0 | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - if test "x$enable_gtktest" = "xyes" ; then - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $GTK_CFLAGS" - LIBS="$GTK_LIBS $LIBS" -dnl -dnl Now check if the installed GTK+ is sufficiently new. (Also sanity -dnl checks the results of pkg-config to some extent) -dnl - rm -f conf.gtktest - AC_TRY_RUN([ -#include -#include -#include - -int -main () -{ - int major, minor, micro; - char *tmp_version; - - system ("touch conf.gtktest"); - - /* HP/UX 9 (%@#!) writes to sscanf strings */ - tmp_version = g_strdup("$min_gtk_version"); - if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { - printf("%s, bad version string\n", "$min_gtk_version"); - exit(1); - } - - if ((gtk_major_version != $gtk_config_major_version) || - (gtk_minor_version != $gtk_config_minor_version) || - (gtk_micro_version != $gtk_config_micro_version)) - { - printf("\n*** 'pkg-config --modversion gtk+-2.0' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n", - $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version, - gtk_major_version, gtk_minor_version, gtk_micro_version); - printf ("*** was found! If pkg-config was correct, then it is best\n"); - printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n"); - printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n"); - printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n"); - printf("*** required on your system.\n"); - printf("*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH\n"); - printf("*** to point to the correct configuration files\n"); - } - else if ((gtk_major_version != GTK_MAJOR_VERSION) || - (gtk_minor_version != GTK_MINOR_VERSION) || - (gtk_micro_version != GTK_MICRO_VERSION)) - { - printf("*** GTK+ header files (version %d.%d.%d) do not match\n", - GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION); - printf("*** library (version %d.%d.%d)\n", - gtk_major_version, gtk_minor_version, gtk_micro_version); - } - else - { - if ((gtk_major_version > major) || - ((gtk_major_version == major) && (gtk_minor_version > minor)) || - ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro))) - { - return 0; - } - else - { - printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n", - gtk_major_version, gtk_minor_version, gtk_micro_version); - printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n", - major, minor, micro); - printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n"); - printf("***\n"); - printf("*** If you have already installed a sufficiently new version, this error\n"); - printf("*** probably means that the wrong copy of the pkg-config shell script is\n"); - printf("*** being found. The easiest way to fix this is to remove the old version\n"); - printf("*** of GTK+, but you can also set the PKG_CONFIG environment to point to the\n"); - printf("*** correct copy of pkg-config. (In this case, you will have to\n"); - printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n"); - printf("*** so that the correct libraries are found at run-time))\n"); - } - } - return 1; -} -],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - if test "x$no_gtk" = x ; then - AC_MSG_RESULT(yes (version $gtk_config_major_version.$gtk_config_minor_version.$gtk_config_micro_version)) - ifelse([$2], , :, [$2]) - else - AC_MSG_RESULT(no) - if test "$PKG_CONFIG" = "no" ; then - echo "*** A new enough version of pkg-config was not found." - echo "*** See http://pkgconfig.sourceforge.net" - else - if test -f conf.gtktest ; then - : - else - echo "*** Could not run GTK+ test program, checking why..." - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $GTK_CFLAGS" - LIBS="$LIBS $GTK_LIBS" - AC_TRY_LINK([ -#include -#include -], [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ], - [ echo "*** The test program compiled, but did not run. This usually means" - echo "*** that the run-time linker is not finding GTK+ or finding the wrong" - echo "*** version of GTK+. If it is not finding GTK+, you'll need to set your" - echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" - echo "*** to the installed location Also, make sure you have run ldconfig if that" - echo "*** is required on your system" - echo "***" - echo "*** If you have an old version installed, it is best to remove it, although" - echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" ], - [ echo "*** The test program failed to compile or link. See the file config.log for the" - echo "*** exact error that occured. This usually means GTK+ is incorrectly installed."]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - GTK_CFLAGS="" - GTK_LIBS="" - ifelse([$3], , :, [$3]) - fi - AC_SUBST(GTK_CFLAGS) - AC_SUBST(GTK_LIBS) - rm -f conf.gtktest -]) diff --git a/code/nel/automacros/ogg.m4 b/code/nel/automacros/ogg.m4 deleted file mode 100644 index 0e1f1abf5..000000000 --- a/code/nel/automacros/ogg.m4 +++ /dev/null @@ -1,102 +0,0 @@ -# Configure paths for libogg -# Jack Moffitt 10-21-2000 -# Shamelessly stolen from Owen Taylor and Manish Singh - -dnl XIPH_PATH_OGG([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) -dnl Test for libogg, and define OGG_CFLAGS and OGG_LIBS -dnl -AC_DEFUN([XIPH_PATH_OGG], -[dnl -dnl Get the cflags and libraries -dnl -AC_ARG_WITH(ogg,[ --with-ogg=PFX Prefix where libogg is installed (optional)], ogg_prefix="$withval", ogg_prefix="") -AC_ARG_WITH(ogg-libraries,[ --with-ogg-libraries=DIR Directory where libogg library is installed (optional)], ogg_libraries="$withval", ogg_libraries="") -AC_ARG_WITH(ogg-includes,[ --with-ogg-includes=DIR Directory where libogg header files are installed (optional)], ogg_includes="$withval", ogg_includes="") -AC_ARG_ENABLE(oggtest, [ --disable-oggtest Do not try to compile and run a test Ogg program],, enable_oggtest=yes) - - if test "x$ogg_libraries" != "x" ; then - OGG_LIBS="-L$ogg_libraries" - elif test "x$ogg_prefix" != "x" ; then - OGG_LIBS="-L$ogg_prefix/lib" - elif test "x$prefix" != "xNONE" ; then - OGG_LIBS="-L$prefix/lib" - fi - - OGG_LIBS="$OGG_LIBS -logg" - - if test "x$ogg_includes" != "x" ; then - OGG_CFLAGS="-I$ogg_includes" - elif test "x$ogg_prefix" != "x" ; then - OGG_CFLAGS="-I$ogg_prefix/include" - elif test "x$prefix" != "xNONE"; then - OGG_CFLAGS="-I$prefix/include" - fi - - AC_MSG_CHECKING(for Ogg) - no_ogg="" - - - if test "x$enable_oggtest" = "xyes" ; then - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $OGG_CFLAGS" - LIBS="$LIBS $OGG_LIBS" -dnl -dnl Now check if the installed Ogg is sufficiently new. -dnl - rm -f conf.oggtest - AC_TRY_RUN([ -#include -#include -#include -#include - -int main () -{ - system("touch conf.oggtest"); - return 0; -} - -],, no_ogg=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - - if test "x$no_ogg" = "x" ; then - AC_MSG_RESULT(yes) - ifelse([$1], , :, [$1]) - else - AC_MSG_RESULT(no) - if test -f conf.oggtest ; then - : - else - echo "*** Could not run Ogg test program, checking why..." - CFLAGS="$CFLAGS $OGG_CFLAGS" - LIBS="$LIBS $OGG_LIBS" - AC_TRY_LINK([ -#include -#include -], [ return 0; ], - [ echo "*** The test program compiled, but did not run. This usually means" - echo "*** that the run-time linker is not finding Ogg or finding the wrong" - echo "*** version of Ogg. If it is not finding Ogg, you'll need to set your" - echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" - echo "*** to the installed location Also, make sure you have run ldconfig if that" - echo "*** is required on your system" - echo "***" - echo "*** If you have an old version installed, it is best to remove it, although" - echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], - [ echo "*** The test program failed to compile or link. See the file config.log for the" - echo "*** exact error that occured. This usually means Ogg was incorrectly installed" - echo "*** or that you have moved Ogg since it was installed." ]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - OGG_CFLAGS="" - OGG_LIBS="" - ifelse([$2], , :, [$2]) - fi - AC_SUBST(OGG_CFLAGS) - AC_SUBST(OGG_LIBS) - rm -f conf.oggtest -]) diff --git a/code/nel/automacros/pkg.m4 b/code/nel/automacros/pkg.m4 deleted file mode 100644 index c29b6c057..000000000 --- a/code/nel/automacros/pkg.m4 +++ /dev/null @@ -1,157 +0,0 @@ -# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -# -# Copyright © 2004 Scott James Remnant . -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# PKG_PROG_PKG_CONFIG([MIN-VERSION]) -# ---------------------------------- -AC_DEFUN([PKG_PROG_PKG_CONFIG], -[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) -m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) -AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl -if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then - AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) -fi -if test -n "$PKG_CONFIG"; then - _pkg_min_version=m4_default([$1], [0.9.0]) - AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) - if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - PKG_CONFIG="" - fi - -fi[]dnl -])# PKG_PROG_PKG_CONFIG - -# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -# -# Check to see whether a particular set of modules exists. Similar -# to PKG_CHECK_MODULES(), but does not set variables or print errors. -# -# -# Similar to PKG_CHECK_MODULES, make sure that the first instance of -# this or PKG_CHECK_MODULES is called, or make sure to call -# PKG_CHECK_EXISTS manually -# -------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_EXISTS], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -if test -n "$PKG_CONFIG" && \ - AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then - m4_ifval([$2], [$2], [:]) -m4_ifvaln([$3], [else - $3])dnl -fi]) - - -# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) -# --------------------------------------------- -m4_define([_PKG_CONFIG], -[if test -n "$PKG_CONFIG"; then - if test -n "$$1"; then - pkg_cv_[]$1="$$1" - else - PKG_CHECK_EXISTS([$3], - [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], - [pkg_failed=yes]) - fi -else - pkg_failed=untried -fi[]dnl -])# _PKG_CONFIG - -# _PKG_SHORT_ERRORS_SUPPORTED -# ----------------------------- -AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then - _pkg_short_errors_supported=yes -else - _pkg_short_errors_supported=no -fi[]dnl -])# _PKG_SHORT_ERRORS_SUPPORTED - - -# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], -# [ACTION-IF-NOT-FOUND]) -# -# -# Note that if there is a possibility the first call to -# PKG_CHECK_MODULES might not happen, you should be sure to include an -# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac -# -# -# -------------------------------------------------------------- -AC_DEFUN([PKG_CHECK_MODULES], -[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl -AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl - -pkg_failed=no -AC_MSG_CHECKING([for $1]) - -_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) -_PKG_CONFIG([$1][_LIBS], [libs], [$2]) - -m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS -and $1[]_LIBS to avoid the need to call pkg-config. -See the pkg-config man page for more details.]) - -if test $pkg_failed = yes; then - _PKG_SHORT_ERRORS_SUPPORTED - if test $_pkg_short_errors_supported = yes; then - $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` - else - $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` - fi - # Put the nasty error message in config.log where it belongs - echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD - - ifelse([$4], , [AC_MSG_ERROR(dnl -[Package requirements ($2) were not met: - -$$1_PKG_ERRORS - -Consider adjusting the PKG_CONFIG_PATH environment variable if you -installed software in a non-standard prefix. - -_PKG_TEXT -])], - [AC_MSG_RESULT([no]) - $4]) -elif test $pkg_failed = untried; then - ifelse([$4], , [AC_MSG_FAILURE(dnl -[The pkg-config script could not be found or is too old. Make sure it -is in your PATH or set the PKG_CONFIG environment variable to the full -path to pkg-config. - -_PKG_TEXT - -To get pkg-config, see .])], - [$4]) -else - $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS - $1[]_LIBS=$pkg_cv_[]$1[]_LIBS - AC_MSG_RESULT([yes]) - ifelse([$3], , :, [$3]) -fi[]dnl -])# PKG_CHECK_MODULES diff --git a/code/nel/automacros/vorbis.m4 b/code/nel/automacros/vorbis.m4 deleted file mode 100644 index 300cc6c7d..000000000 --- a/code/nel/automacros/vorbis.m4 +++ /dev/null @@ -1,122 +0,0 @@ -# Configure paths for libvorbis -# Jack Moffitt 10-21-2000 -# Shamelessly stolen from Owen Taylor and Manish Singh -# thomasvs added check for vorbis_bitrate_addblock which is new in rc3 - -dnl XIPH_PATH_VORBIS([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) -dnl Test for libvorbis, and define VORBIS_CFLAGS and VORBIS_LIBS -dnl -AC_DEFUN([XIPH_PATH_VORBIS], -[dnl -dnl Get the cflags and libraries -dnl -AC_ARG_WITH(vorbis,[ --with-vorbis=PFX Prefix where libvorbis is installed (optional)], vorbis_prefix="$withval", vorbis_prefix="") -AC_ARG_WITH(vorbis-libraries,[ --with-vorbis-libraries=DIR Directory where libvorbis library is installed (optional)], vorbis_libraries="$withval", vorbis_libraries="") -AC_ARG_WITH(vorbis-includes,[ --with-vorbis-includes=DIR Directory where libvorbis header files are installed (optional)], vorbis_includes="$withval", vorbis_includes="") -AC_ARG_ENABLE(vorbistest, [ --disable-vorbistest Do not try to compile and run a test Vorbis program],, enable_vorbistest=yes) - - if test "x$vorbis_libraries" != "x" ; then - VORBIS_LIBS="-L$vorbis_libraries" - elif test "x$vorbis_prefix" != "x" ; then - VORBIS_LIBS="-L$vorbis_prefix/lib" - elif test "x$prefix" != "xNONE"; then - VORBIS_LIBS="-L$prefix/lib" - fi - - VORBIS_LIBS="$VORBIS_LIBS -lvorbis -lm" - VORBISFILE_LIBS="-lvorbisfile" - VORBISENC_LIBS="-lvorbisenc" - - if test "x$vorbis_includes" != "x" ; then - VORBIS_CFLAGS="-I$vorbis_includes" - elif test "x$vorbis_prefix" != "x" ; then - VORBIS_CFLAGS="-I$vorbis_prefix/include" - elif test "x$prefix" != "xNONE"; then - VORBIS_CFLAGS="-I$prefix/include" - fi - - - AC_MSG_CHECKING(for Vorbis) - no_vorbis="" - - - if test "x$enable_vorbistest" = "xyes" ; then - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $VORBIS_CFLAGS $OGG_CFLAGS" - LIBS="$LIBS $VORBIS_LIBS $VORBISENC_LIBS $OGG_LIBS" -dnl -dnl Now check if the installed Vorbis is sufficiently new. -dnl - rm -f conf.vorbistest - AC_TRY_RUN([ -#include -#include -#include -#include -#include - -int main () -{ - vorbis_block vb; - vorbis_dsp_state vd; - vorbis_info vi; - - vorbis_info_init (&vi); - vorbis_encode_init (&vi, 2, 44100, -1, 128000, -1); - vorbis_analysis_init (&vd, &vi); - vorbis_block_init (&vd, &vb); - /* this function was added in 1.0rc3, so this is what we're testing for */ - vorbis_bitrate_addblock (&vb); - - system("touch conf.vorbistest"); - return 0; -} - -],, no_vorbis=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - - if test "x$no_vorbis" = "x" ; then - AC_MSG_RESULT(yes) - ifelse([$1], , :, [$1]) - else - AC_MSG_RESULT(no) - if test -f conf.vorbistest ; then - : - else - echo "*** Could not run Vorbis test program, checking why..." - CFLAGS="$CFLAGS $VORBIS_CFLAGS" - LIBS="$LIBS $VORBIS_LIBS $OGG_LIBS" - AC_TRY_LINK([ -#include -#include -], [ return 0; ], - [ echo "*** The test program compiled, but did not run. This usually means" - echo "*** that the run-time linker is not finding Vorbis or finding the wrong" - echo "*** version of Vorbis. If it is not finding Vorbis, you'll need to set your" - echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" - echo "*** to the installed location Also, make sure you have run ldconfig if that" - echo "*** is required on your system" - echo "***" - echo "*** If you have an old version installed, it is best to remove it, although" - echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], - [ echo "*** The test program failed to compile or link. See the file config.log for the" - echo "*** exact error that occured. This usually means Vorbis was incorrectly installed" - echo "*** or that you have moved Vorbis since it was installed." ]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - VORBIS_CFLAGS="" - VORBIS_LIBS="" - VORBISFILE_LIBS="" - VORBISENC_LIBS="" - ifelse([$2], , :, [$2]) - fi - AC_SUBST(VORBIS_CFLAGS) - AC_SUBST(VORBIS_LIBS) - AC_SUBST(VORBISFILE_LIBS) - AC_SUBST(VORBISENC_LIBS) - rm -f conf.vorbistest -]) diff --git a/code/nel/configure.ac b/code/nel/configure.ac deleted file mode 100644 index 84edccc05..000000000 --- a/code/nel/configure.ac +++ /dev/null @@ -1,599 +0,0 @@ -# ==================================================================== -# Configuration script for NeL -# ==================================================================== -# -# $Id: configure.ac,v 1.8 2005/04/14 15:54:32 cado Exp $ -# - -# ==================================================================== -# Process this file with autoconf to produce a configure script. -# ==================================================================== - -# If you want to change the version, must must change AC_INIT -# *and* AC_SUBST(LIBTOOL_VERSION) - -AC_PREREQ(2.57) -AC_INIT([nel],[0.8.0],[nel-all@nevrax.org]) -AM_INIT_AUTOMAKE([tar-ustar]) - -AC_CONFIG_SRCDIR(include/nel/misc/types_nl.h) -AM_CONFIG_HEADER(include/nelconfig.h) - -AC_SUBST(LIBTOOL_VERSION, [0:7:0]) - -# Checks for programs. -AC_CANONICAL_HOST -AC_PROG_CXX -AC_PROG_CPP -AC_PROG_YACC -AC_PROG_LEX -AC_PROG_INSTALL -AC_PROG_LN_S -AC_PROG_MAKE_SET -AC_PROG_LIBTOOL -AM_PROG_LIBTOOL -AM_SANITY_CHECK - -AC_SYS_LARGEFILE - -AM_MAINTAINER_MODE - - -# Template needed to generate the nelconfig.h.in -AH_TEMPLATE([NEL_DEFAULT_DISPLAYER],[Define to 1 if you want log on standard output]) -AH_TEMPLATE([NEL_LOG_IN_FILE],[Define to 1 if you want a debug log.log file in the current directory]) -AH_TEMPLATE([HAVE_X86],[Define to 1 if you are on a INTEL compatible processor]) -AH_TEMPLATE([HAVE_X86_64],[Define to 1 if you are on AMD opteron 64bits processor]) -AH_TEMPLATE([NL_USE_GTK], [Define to 1 if you want GTK support]) - -# Get host type info -if test "$host_cpu" = "i386" -o "$host_cpu" = "i486" -o "$host_cpu" = "i586" \ - -o "$host_cpu" = "i686" -o "$host_cpu" = "i786" -o "$host_cpu" = "x86_64" -then - AC_DEFINE([HAVE_X86]) -fi - -if test "$host_cpu" = "x86_64" -then - AC_DEFINE([HAVE_X86_64]) -fi - -# The following hack should ensure that configure doesnt add optimizing -# or debugging flags to CFLAGS or CXXFLAGS -CXXFLAGS="$CXXFLAGS -fno-strict-aliasing -ftemplate-depth-24 -fno-stack-protector" - - -# ==================================================================== -# Checks NeL modules (net, 3d) to install / Disable -# ==================================================================== - -# The misc is mandatory, it is use by the other modules. - -NEL_SUBDIRS="misc" - -# NeL libraries that are enabled by default - -# Network library -AC_ARG_ENABLE([net], - AC_HELP_STRING([--disable-net], - [disable compilation and install of NeL Network]), - [], - [enable_net=yes]) - -if test "$enable_net" = "no" -then - AC_MSG_RESULT([disable NeL Network]) -else - NEL_SUBDIRS="$NEL_SUBDIRS net" -fi - -# 3D library -AC_ARG_ENABLE([3d], - AC_HELP_STRING([--disable-3d], - [disable compilation and install of NeL 3D]), - [], - [enable_3d=yes]) - -if test "$enable_3d" = "no" -then - AC_MSG_RESULT([disable NeL 3D]) -else - NEL_SUBDIRS="$NEL_SUBDIRS 3d" -fi - -# PACS library -AC_ARG_ENABLE([pacs], - AC_HELP_STRING([--disable-pacs], - [disable compilation and install of NeL PACS]), - [], - [enable_pacs=yes]) - -if test "$enable_pacs" = "no" -then - AC_MSG_RESULT([disable NeL PACS]) -else - NEL_SUBDIRS="$NEL_SUBDIRS pacs" -fi - -# Georges library -AC_ARG_ENABLE([georges], - AC_HELP_STRING([--disable-georges], - [disable compilation and install of NeL Georges]), - [], - [enable_georges=yes]) - -if test "$enable_georges" = "no" -then - AC_MSG_RESULT([disable NeL Georges]) -else - NEL_SUBDIRS="$NEL_SUBDIRS georges" -fi - -# Ligo library -AC_ARG_ENABLE([ligo], - AC_HELP_STRING([--disable-ligo], - [disable compilation and install of NeL Ligo]), - [], - [enable_ligo=yes]) - -if test "$enable_ligo" = "no" -then - AC_MSG_RESULT([disable NeL Ligo]) -else - NEL_SUBDIRS="$NEL_SUBDIRS ligo" -fi - - -# NeL libraries that are disabled by default - -# Sound library -AC_ARG_ENABLE([sound], - AC_HELP_STRING([--enable-sound], - [enable compilation and install of NeL Sound]), - [], - [enable_sound=no]) - -if test "$enable_sound" = "yes" -then - AC_MSG_RESULT([enable NeL Sound]) - NEL_SUBDIRS="$NEL_SUBDIRS sound" -fi - -# CEGUI Renderer library -AC_ARG_ENABLE([cegui], - AC_HELP_STRING([--enable-cegui], - [enable compilation and install of NeL CEGUI Renderer]), - [], - [enable_cegui=no]) - -CEGUI_SUBDIR="" -if test "$enable_cegui" = "yes" -then - AC_MSG_RESULT([enable NeL CEGUI Renderer]) - NEL_SUBDIRS="$NEL_SUBDIRS cegui" - CEGUI_SUBDIR="cegui" -fi - -# Unit Tests -AC_ARG_ENABLE([tests], - AC_HELP_STRING([--enable-tests], - [enable unit tests of NeL]), - [], - [enable_tests=no]) - -if test "$enable_tests" = "yes" -then - AC_MSG_RESULT([enable NeL Unit Tests]) -fi - -# Code Coverage -AC_ARG_ENABLE([coverage], - AC_HELP_STRING([--enable-coverage], - [enable code coverage generation]), - [] - [enable_coverage=no]) - -if test "$enable_coverage" = "yes" -then - AC_MSG_RESULT([enable Code Coverage generation]) - - CXXFLAGS="$CXXFLAGS -fprofile-arcs -ftest-coverage" -fi - -# Enable/disable samples compilation. -AC_ARG_ENABLE([samples], - AC_HELP_STRING([--disable-samples], - [disable sample code]), - [], - [enable_samples="yes"]) - -if test "$enable_samples" = "no" -then - AC_MSG_RESULT([disable sample code.]) - SAMPLE_SUBDIR="" -else - SAMPLE_SUBDIR="samples" -fi - -# Enable/disable tools compilation. -AC_ARG_ENABLE([tools], - AC_HELP_STRING([--disable-tools], - [disable tools code]), - [], - [enable_tools="yes"]) - -if test "$enable_tools" = "no" -then - AC_MSG_RESULT([disable tools code.]) - TOOLS_SUBDIR="" -else - TOOLS_SUBDIR="tools" -fi - -AC_SUBST([enable_net]) -AC_SUBST([enable_3d]) -AC_SUBST([enable_pacs]) -AC_SUBST([enable_sound]) -AC_SUBST([enable_georges]) -AC_SUBST([enable_ligo]) -AC_SUBST([enable_cegui]) - -AC_SUBST([NEL_SUBDIRS]) -AC_SUBST([SAMPLE_SUBDIR]) -AC_SUBST([TOOLS_SUBDIR]) -AC_SUBST([CEGUI_SUBDIR]) - -# ==================================================================== -# Checks for programs. -# ==================================================================== - -# ==================================================================== -# Configure Settings -# ==================================================================== - -# Disable the static linking by default -# AC_DISABLE_STATIC - -# Use C++ compiler as a default for the compilation tests. -AC_LANG([C++]) - - -# ==================================================================== -# Debug/optimized compilation mode -# ==================================================================== - -AM_NEL_DEBUG - -AC_ARG_WITH([logging], - AC_HELP_STRING([--without-logging], - [be silent on stdout and in no log.log]), - [], - [with_logging=yes]) - -if test "$with_logging" = "yes" -then - AC_DEFINE([NEL_DEFAULT_DISPLAYER], 1) - AC_DEFINE([NEL_LOG_IN_FILE], 1) -fi - -# ==================================================================== -# Checks for typedefs, structures, and compiler characteristics. -# ==================================================================== - -# Test endianness -AC_C_BIGENDIAN - -# Supress GCC "multi-character character constant" warnings. -if test "$ac_cv_cxx_compiler_gnu" = "yes"; -then - if test "$with_debug" = "yes" - then - # - # When debugging variables are declared for the sole purpose of - # inspecting their content with a debugger. They are not used - # in the code itself and this is legitimate, hence the -Wno-unused - # - CXXFLAGS="$CXXFLAGS -Wno-unused" - fi -fi - -# Add some common define -if test "$ac_cv_cxx_compiler_gnu" = "yes"; -then - CXXFLAGS="$CXXFLAGS -D_REENTRANT -Wall -ansi -W -Wpointer-arith -Wsign-compare -Wno-deprecated-declarations -Wno-multichar -Wno-long-long -Wno-unused" -fi - - -# ==================================================================== -# Checks for header and lib files. -# ==================================================================== - -AC_FUNC_ALLOCA -AC_HEADER_DIRENT -AC_HEADER_STDC -AC_HEADER_TIME -AC_CHECK_HEADERS([arpa/inet.h fcntl.h float.h malloc.h netdb.h netinet/in.h stddef.h stdlib.h string.h sys/ioctl.h sys/socket.h unistd.h sys/time.h]) -AC_CHECK_LIB([pthread], [pthread_create]) -AC_CHECK_LIB([dl], [dlopen]) - - -# ==================================================================== -# Checks for typedefs, structures, and compiler characteristics. -# ==================================================================== - -AC_HEADER_STDBOOL -AC_C_CONST -AC_C_INLINE -AC_TYPE_SIZE_T -AC_HEADER_TIME -AC_STRUCT_TM -AC_C_VOLATILE -AC_CHECK_TYPES([ptrdiff_t]) -AC_CHECK_TYPES([size_t]) -AC_CHECK_TYPES([uintptr_t]) - - -# ==================================================================== -# Checks for library functions. -# ==================================================================== - -AC_FUNC_CLOSEDIR_VOID -AC_FUNC_ERROR_AT_LINE -AC_PROG_GCC_TRADITIONAL -AC_FUNC_MALLOC -AC_FUNC_MEMCMP -AC_FUNC_REALLOC -AC_FUNC_SELECT_ARGTYPES -AC_TYPE_SIGNAL -AC_FUNC_STAT -AC_FUNC_STRFTIME -AC_FUNC_FORK -AC_FUNC_VPRINTF -AC_CHECK_FUNCS([floor getcwd gethostbyaddr gethostbyname gethostname gettimeofday inet_ntoa memmove memset mkdir pow select socket sqrt strcasecmp strchr strdup strerror strrchr strstr strtoul sys/time.h]) - - -# ==================================================================== -# X11 - -AC_PATH_X - -if test ! "$no_x" = "yes" -then - if test ! X"$x_libraries" = X - then - LIBS="$LIBS -L$x_libraries" - fi - - if test ! X"$x_includes" = X - then - CXXFLAGS="$CXXFLAGS -I$x_includes" - fi -else - if test "$enable_3d" = "yes" - then - AC_MSG_ERROR([X11 must be installed for NeL 3d library, use --disable-3d if you don't need NeL 3d library]) - fi -fi - -# ==================================================================== -# LibXML - -# Use C compiler as a default for the libxml tests. -AC_LANG([C]) - -AM_PATH_XML2([2.0.0], [], [AC_MSG_ERROR([libxml2 must be installed])]) - -CXXFLAGS="$CXXFLAGS $XML_CFLAGS $XML_CPPFLAGS" - -LIBS="$LIBS $XML_LIBS" - -# Use C++ compiler as a default for the compilation tests. -AC_LANG([C++]) - -# ==================================================================== -# libpng - -AC_CHECK_HEADER(png.h, [], AC_MSG_ERROR([libpng must be installed])) - -# ==================================================================== -# libjpeg - -AC_CHECK_HEADER(jpeglib.h, [], AC_MSG_ERROR([libjpeg must be installed])) - -# ==================================================================== -# Checks for libraries. -# ==================================================================== - -# ==================================================================== -# GTK 2.0+ - -AC_ARG_WITH([gtk], - AC_HELP_STRING([--with-gtk], - [add GTK dependent code like GTK displayer]), - [], - [with_gtk=no]) - -if test "$with_gtk" = "yes" -then - AC_LANG([C]) - - AM_PATH_GTK_2_0([2.0.0], - CXXFLAGS="$CXXFLAGS $GTK_CFLAGS" - LIBS="$LIBS $GTK_LIBS" - AC_DEFINE(NL_USE_GTK, [], [Undef if you don't want to use anything GTK based like the GTK Displayer] -) - ) - - AC_LANG([C++]) - - AC_SUBST([with_gtk]) -fi - -# ==================================================================== -# CEGUI - -if test "$enable_cegui" = "yes" -then - PKG_CHECK_MODULES(CEGUI, CEGUI >= 0.4, - [], - [ - AC_MSG_ERROR([Couldn't find CEGUI or tests failed: -$CEGUI_PKG_ERRORS -Please go to http://crayzedsgui.sourceforge.net to get the latest, or check -config.log to see why the tests failed, and fix it.]) - ]) -fi - -# ==================================================================== -# FreeType 2 - -AM_PATH_FREETYPE($enable_3d) - - -# ==================================================================== -# OpenGL - -AM_PATH_OPENGL($enable_3d) - - -# ==================================================================== -# Check for XF86VidMode extension (-lXxf86vm) - -AM_PATH_XF86VIDMODE - - -# ==================================================================== -# FMOD, OpenAL - -if test "$enable_sound" = "yes" -then - AM_PATH_FMOD("no") - AM_PATH_OPENAL("no") - if test "$have_fmod" = "no" -a "$have_openal" = "no" - then - AC_MSG_ERROR([Either FMod or OpenAL must be installed to use sound.]) - fi - if test "$have_fmod" = "yes" - then - SOUND_SUBDIRS="fmod" - else - SOUND_SUBDIRS="" - fi - if test "$have_openal" = "yes" - then - SOUND_SUBDIRS="$SOUND_SUBDIRS openal" - - XIPH_PATH_OGG([], AC_MSG_ERROR([Driver OpenAL Requires libogg!])) - XIPH_PATH_VORBIS([], AC_MSG_ERROR([Driver OpenAL Requires libvorbis!])) - fi - AC_SUBST([SOUND_SUBDIRS]) -fi - - -# ==================================================================== -# CppTest - -#AM_PATH_CPPTEST($enable_tests) - -# ==================================================================== -# Arrange for the include directory to be in the search path even when -# build is done outside the source tree -# Put the nelconfig.h define -CXXFLAGS="$CXXFLAGS -I\${top_srcdir}/include -DHAVE_NELCONFIG_H" - -# ==================================================================== -# Checks for library functions. -# ==================================================================== - - -# ==================================================================== -# Output files to generate. -# ==================================================================== - -AC_CONFIG_FILES([Makefile \ - include/Makefile \ - include/nel/Makefile \ - include/nel/ligo/Makefile \ - include/nel/misc/Makefile \ - include/nel/net/Makefile \ - include/nel/3d/Makefile \ - include/nel/pacs/Makefile \ - include/nel/sound/Makefile \ - include/nel/georges/Makefile \ - include/nel/cegui/Makefile \ - src/Makefile \ - src/misc/Makefile \ - src/misc/nel-misc.pc \ - src/misc/config_file/Makefile \ - src/net/Makefile \ - src/3d/Makefile \ - src/3d/nel-3d.pc \ - src/3d/driver/Makefile \ - src/3d/driver/opengl/Makefile \ - src/3d/driver/opengl/nel-driverogl.pc \ - src/pacs/Makefile \ - src/sound/Makefile \ - src/sound/driver/Makefile \ - src/sound/driver/fmod/Makefile \ - src/sound/driver/openal/Makefile \ - src/georges/Makefile \ - src/ligo/Makefile \ - src/cegui/Makefile \ - tools/Makefile \ - tools/3d/Makefile \ - tools/3d/build_coarse_mesh/Makefile \ - tools/3d/build_far_bank/Makefile \ - tools/3d/build_smallbank/Makefile \ - tools/3d/ig_lighter/Makefile \ - tools/3d/ig_lighter_lib/Makefile \ - tools/3d/panoply_maker/Makefile \ - tools/3d/zone_dependencies/Makefile \ - tools/3d/zone_ig_lighter/Makefile \ - tools/3d/zone_lib/Makefile \ - tools/3d/zone_lighter/Makefile \ - tools/3d/zone_welder/Makefile \ - tools/misc/Makefile \ - tools/misc/bnp_make/Makefile \ - tools/misc/disp_sheet_id/Makefile \ - tools/misc/make_sheet_id/Makefile \ - tools/misc/xml_packer/Makefile \ - tools/pacs/Makefile \ - tools/pacs/build_ig_boxes/Makefile \ - tools/pacs/build_indoor_rbank/Makefile \ - tools/pacs/build_rbank/Makefile \ - samples/Makefile \ - samples/sound_sources/Makefile \ - samples/pacs/Makefile \ - samples/georges/Makefile \ - samples/3d/Makefile \ - samples/3d/font/Makefile \ - samples/3d/cluster_viewer/Makefile \ - samples/3d/cluster_viewer/shapes/Makefile \ - samples/3d/cluster_viewer/groups/Makefile \ - samples/3d/cluster_viewer/fonts/Makefile \ - samples/3d/cegui/Makefile \ - samples/misc/Makefile \ - samples/misc/command/Makefile \ - samples/misc/configfile/Makefile \ - samples/misc/debug/Makefile \ - samples/misc/i18n/Makefile \ - samples/misc/log/Makefile \ - samples/misc/strings/Makefile \ - samples/misc/types_check/Makefile \ - samples/net/Makefile \ - samples/net/chat/Makefile \ - samples/net/udp/Makefile \ - samples/net/login_system/Makefile \ - nel-config - -]) -AC_OUTPUT - -# samples/net/class_transport/Makefile \ -# tools/nel_unit_test/Makefile \ -# tools/nel_unit_test/misc_ut/Makefile \ -# tools/nel_unit_test/ligo_ut/Makefile \ -# tools/nel_unit_test/net_ut/Makefile \ -# tools/nel_unit_test/net_ut/net_service_lib_test/Makefile \ -# tools/nel_unit_test/net_ut/net_module_lib_test/Makefile \ -# End of configure.in diff --git a/code/nel/include/Makefile.am b/code/nel/include/Makefile.am deleted file mode 100644 index 193d2e405..000000000 --- a/code/nel/include/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -SUBDIRS = nel - -pkginclude_HEADERS = nelconfig.h - -# End of Makefile.am diff --git a/code/nel/include/nel/3d/Makefile.am b/code/nel/include/nel/3d/Makefile.am deleted file mode 100644 index 8118d8348..000000000 --- a/code/nel/include/nel/3d/Makefile.am +++ /dev/null @@ -1,343 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -includedir = ${prefix}/include/nel/3d - -include_HEADERS = \ -animatable.h \ -animated_lightmap.h \ -animated_material.h \ -animated_morph.h \ -animated_value.h \ -animation.h \ -animation_optimizer.h \ -animation_playlist.h \ -animation_set.h \ -animation_set_user.h \ -animation_time.h \ -anim_ctrl.h \ -anim_detail_trav.h \ -async_file_manager_3d.h \ -async_texture_block.h \ -async_texture_manager.h \ -bezier_patch.h \ -bloom_effect.h \ -bone.h \ -bsp_tree.h \ -camera_col.h \ -camera.h \ -channel_mixer.h \ -clip_trav.h \ -cloud.h \ -cloud_scape.h \ -cloud_scape_user.h \ -cluster.h \ -coarse_mesh_build.h \ -coarse_mesh_manager.h \ -computed_string.h \ -cube_grid.h \ -cube_map_builder.h \ -debug_vb.h \ -deform_2d.h \ -driver.h \ -driver_material_inline.h \ -driver_user.h \ -dru.h \ -event_mouse_listener.h \ -fasthls_modifier.h \ -fast_ptr_list.h \ -flare_model.h \ -flare_shape.h \ -font_generator.h \ -font_manager.h \ -frustum.h \ -heat_haze.h \ -height_map.h \ -hls_color_texture.h \ -hls_texture_bank.h \ -hls_texture_manager.h \ -hrc_trav.h \ -ig_surface_light_build.h \ -ig_surface_light.h \ -index_buffer.h \ -init_3d.h \ -instance_group_user.h \ -instance_lighter.h \ -key.h \ -landscape_collision_grid.h \ -landscape_def.h \ -landscape_face_vector_manager.h \ -landscape.h \ -landscapeig_manager.h \ -landscape_model.h \ -landscape_profile.h \ -landscape_user.h \ -landscapevb_allocator.h \ -landscapevb_info.h \ -landscape_vegetable_block.h \ -layered_ordering_table.h \ -light_contribution.h \ -light.h \ -light_influence_interpolator.h \ -lighting_manager.h \ -light_trav.h \ -light_user.h \ -load_balancing_trav.h \ -lod_character_builder.h \ -lod_character_instance.h \ -lod_character_manager.h \ -lod_character_shape_bank.h \ -lod_character_shape.h \ -lod_character_texture.h \ -logic_info.h \ -material.h \ -matrix_3x4.h \ -mesh_base.h \ -mesh_base_instance.h \ -mesh_blender.h \ -mesh_block_manager.h \ -mesh_geom.h \ -mesh.h \ -mesh_instance.h \ -mesh_morpher.h \ -mesh_mrm.h \ -mesh_mrm_instance.h \ -mesh_mrm_skinned.h \ -mesh_mrm_skinned_instance.h \ -mesh_multi_lod.h \ -mesh_multi_lod_instance.h \ -mesh_vertex_program.h \ -meshvp_per_pixel_light.h \ -meshvp_wind_tree.h \ -mini_col.h \ -motion_blur.h \ -mrm_builder.h \ -mrm_internal.h \ -mrm_level_detail.h \ -mrm_mesh.h \ -mrm_parameters.h \ -nelu.h \ -noise_3d.h \ -occlusion_query.h \ -ordering_table.h \ -packed_world.h \ -packed_zone.h \ -particle_system.h \ -particle_system_manager.h \ -particle_system_model.h \ -particle_system_process.h \ -particle_system_shape.h \ -patchdlm_context.h \ -patch.h \ -patch_rdr_pass.h \ -patchuv_locator.h \ -play_list_manager.h \ -play_list_manager_user.h \ -play_list_user.h \ -point_light.h \ -point_light_influence.h \ -point_light_model.h \ -point_light_named_array.h \ -point_light_named.h \ -portal.h \ -primitive_profile.h \ -ps_allocator.h \ -ps_attrib.h \ -ps_attrib_maker_bin_op.h \ -ps_attrib_maker_bin_op_inline.h \ -ps_attrib_maker.h \ -ps_attrib_maker_helper.h \ -ps_attrib_maker_iterators.h \ -ps_attrib_maker_template.h \ -ps_color.h \ -ps_direction.h \ -ps_dot.h \ -ps_edit.h \ -ps_emitter.h \ -ps_face.h \ -ps_face_look_at.h \ -ps_fan_light.h \ -ps_float.h \ -ps_force.h \ -ps_int.h \ -ps_iterator.h \ -ps_light.h \ -ps_located.h \ -ps_lod.h \ -ps_macro.h \ -ps_mesh.h \ -ps_misc.h \ -ps_particle2.h \ -ps_particle_basic.h \ -ps_particle.h \ -ps_plane_basis.h \ -ps_plane_basis_maker.h \ -ps_quad.h \ -ps_register_color_attribs.h \ -ps_register_float_attribs.h \ -ps_register_int_attribs.h \ -ps_register_plane_basis_attribs.h \ -ps_ribbon_base.h \ -ps_ribbon.h \ -ps_ribbon_look_at.h \ -ps_shockwave.h \ -ps_sound.h \ -ps_spawn_info.h \ -ps_tail_dot.h \ -ps_util.h \ -ps_zone.h \ -ptr_set.h \ -quad_effect.h \ -quad_grid_clip_cluster.h \ -quad_grid_clip_manager.h \ -quad_grid.h \ -quad_tree.h \ -radix_sort.h \ -raw_skin.h \ -raw_skinned.h \ -ray_mesh.h \ -register_3d.h \ -render_trav.h \ -root_model.h \ -scene_group.h \ -scene.h \ -scene_user.h \ -scissor.h \ -seg_remanence.h \ -seg_remanence_shape.h \ -shader.h \ -shadow_map.h \ -shadow_map_manager.h \ -shadow_poly_receiver.h \ -shadow_skin.h \ -shape_bank.h \ -shape_bank_user.h \ -shape.h \ -shape_info.h \ -shifted_triangle_cache.h \ -skeleton_model.h \ -skeleton_shape.h \ -skeleton_spawn_script.h \ -skeleton_weight.h \ -static_quad_grid.h \ -stripifier.h \ -surface_light_grid.h \ -tangent_space_build.h \ -target_anim_ctrl.h \ -tess_block.h \ -tessellation.h \ -tess_face_priority_list.h \ -tess_list.h \ -text_context.h \ -text_context_user.h \ -texture_blank.h \ -texture_blend.h \ -texture_bloom.h \ -texture_bump.h \ -texture_cube.h \ -texture_dlm.h \ -texture_emboss.h \ -texture_far.h \ -texture_file.h \ -texture_font.h \ -texture_grouped.h \ -texture.h \ -texture_mem.h \ -texture_multi_file.h \ -texture_near.h \ -texture_user.h \ -tile_bank.h \ -tile_color.h \ -tile_element.h \ -tile_far_bank.h \ -tile_light_influence.h \ -tile_lumel.h \ -tile_noise_map.h \ -tile_vegetable_desc.h \ -track_bezier.h \ -track.h \ -track_keyframer.h \ -track_sampled_common.h \ -track_sampled_quat.h \ -track_sampled_quat_small_header.h \ -track_sampled_vector.h \ -track_tcb.h \ -transformable.h \ -transform.h \ -transform_shape.h \ -trav_scene.h \ -u_3d_mouse_listener.h \ -u_animation.h \ -u_animation_set.h \ -u_bone.h \ -u_camera.h \ -u_cloud_scape.h \ -u_driver.h \ -u_instance_group.h \ -u_instance.h \ -u_instance_material.h \ -u_landscape.h \ -u_light.h \ -u_material.h \ -u_particle_system_instance.h \ -u_particle_system_sound.h \ -u_play_list.h \ -u_play_list_manager.h \ -u_point_light.h \ -u_ps_sound_impl.h \ -u_ps_sound_interface.h \ -u_scene.h \ -u_shape_bank.h \ -u_shape.h \ -u_skeleton.h \ -u_text_context.h \ -u_texture.h \ -u_track.h \ -u_transformable.h \ -u_transform.h \ -u_visual_collision_entity.h \ -u_visual_collision_manager.h \ -u_visual_collision_mesh.h \ -u_water_env_map.h \ -u_water.h \ -vegetable_blend_layer_model.h \ -vegetable_clip_block.h \ -vegetable_def.h \ -vegetable.h \ -vegetable_instance_group.h \ -vegetable_light_ex.h \ -vegetable_manager.h \ -vegetable_quadrant.h \ -vegetable_shape.h \ -vegetable_sort_block.h \ -vegetable_uv8.h \ -vegetablevb_allocator.h \ -vertex_buffer.h \ -vertex_buffer_heap.h \ -vertex_program.h \ -vertex_program_parse.h \ -vertex_stream_manager.h \ -viewport.h \ -visual_collision_entity.h \ -visual_collision_entity_user.h \ -visual_collision_manager.h \ -visual_collision_manager_user.h \ -visual_collision_mesh.h \ -water_env_map.h \ -water_env_map_user.h \ -water_height_map.h \ -water_model.h \ -water_pool_manager.h \ -water_shape.h \ -zone_corner_smoother.h \ -zone.h \ -zone_lighter.h \ -zone_manager.h \ -zone_search.h \ -zone_smoother.h \ -zone_symmetrisation.h \ -zone_tgt_smoother.h - -# End of Makefile.am diff --git a/code/nel/include/nel/Makefile.am b/code/nel/include/nel/Makefile.am deleted file mode 100644 index 7e4686f14..000000000 --- a/code/nel/include/nel/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -DIST_SUBDIRS = net 3d pacs sound misc georges ligo - -SUBDIRS = @NEL_SUBDIRS@ - -includedir = ${prefix}/include/nel - -# End of Makefile.am - diff --git a/code/nel/include/nel/cegui/Makefile.am b/code/nel/include/nel/cegui/Makefile.am deleted file mode 100644 index ba2530dff..000000000 --- a/code/nel/include/nel/cegui/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2001-08-01 08:45:06 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -includedir = ${prefix}/include/nel/cegui - -include_HEADERS = nelrenderer.h nelresourceprovider.h neltexture.h - -# End of Makefile.am diff --git a/code/nel/include/nel/georges/Makefile.am b/code/nel/include/nel/georges/Makefile.am deleted file mode 100644 index 153e9b102..000000000 --- a/code/nel/include/nel/georges/Makefile.am +++ /dev/null @@ -1,15 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -includedir = ${prefix}/include/nel/georges - -include_HEADERS = load_form.h \ - u_form_dfn.h \ - u_form_elm.h \ - u_form.h \ - u_form_loader.h \ - u_type.h - -# End of Makefile.am diff --git a/code/nel/include/nel/ligo/Makefile.am b/code/nel/include/nel/ligo/Makefile.am deleted file mode 100644 index 48fb3c54b..000000000 --- a/code/nel/include/nel/ligo/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -includedir = ${prefix}/include/nel/ligo - -include_HEADERS = ligo_config.h \ - primitive_class.h \ - primitive_configuration.h \ - primitive.h \ - primitive_utils.h - -# End of Makefile.am diff --git a/code/nel/include/nel/misc/Makefile.am b/code/nel/include/nel/misc/Makefile.am deleted file mode 100644 index 75bde6b95..000000000 --- a/code/nel/include/nel/misc/Makefile.am +++ /dev/null @@ -1,143 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -includedir = ${prefix}/include/nel/misc - -include_HEADERS = aabbox.h \ - algo.h \ - app_context.h \ - array_2d.h \ - async_file_manager.h \ - big_file.h \ - bitmap.h \ - bit_mem_stream.h \ - bit_set.h \ - block_memory.h \ - bsphere.h \ - buf_fifo.h \ - check_fpu.h \ - class_id.h \ - class_registry.h \ - command.h \ - common.h \ - config_file.h \ - contiguous_block_allocator.h \ - co_task.h \ - cpu_time_stat.h \ - debug.h \ - di_event_emitter.h \ - diff_tool.h \ - displayer.h \ - dummy_window.h \ - dynloadlib.h \ - eid_translator.h \ - entity_id.h \ - enum_bitset.h \ - eval_num_expr.h \ - event_emitter.h \ - event_emitter_multi.h \ - event_listener.h \ - event_server.h \ - events.h \ - factory.h \ - fast_floor.h \ - fast_mem.h \ - file.h \ - fixed_size_allocator.h \ - game_device_events.h \ - game_device.h \ - geom_ext.h \ - grid_traversal.h \ - gtk_displayer.h \ - heap_memory.h \ - hierarchical_timer.h \ - historic.h \ - i18n.h \ - input_device.h \ - input_device_manager.h \ - input_device_server.h \ - inter_window_msg_queue.h \ - i_xml.h \ - keyboard_device.h \ - line.h \ - log.h \ - matrix.h \ - md5.h \ - mem_displayer.h \ - mem_stream.h \ - mouse_device.h \ - mouse_smoother.h \ - mutable_container.h \ - mutex.h \ - noise_value.h \ - object_arena_allocator.h \ - object_vector.h \ - o_xml.h \ - path.h \ - plane.h \ - plane_inline.h \ - polygon.h \ - pool_memory.h \ - progress_callback.h \ - p_thread.h \ - quad.h \ - quat.h \ - random.h \ - reader_writer.h \ - rect.h \ - report.h \ - resource_ptr.h \ - resource_ptr_inline.h \ - rgba.h \ - sha1.h \ - shared_memory.h \ - sheet_id.h \ - singleton.h \ - smart_ptr.h \ - smart_ptr_inline.h \ - speaker_listener.h \ - sstring.h \ - static_map.h \ - stl_block_allocator.h \ - stl_block_list.h \ - stop_watch.h \ - stream.h \ - stream_inline.h \ - string_common.h \ - string_conversion.h \ - string_id_array.h \ - string_mapper.h \ - string_stream.h \ - system_info.h \ - task_manager.h \ - tds.h \ - thread.h \ - time_nl.h \ - timeout_assertion_thread.h \ - traits_nl.h \ - triangle.h \ - twin_map.h \ - types_nl.h \ - ucstring.h \ - uv.h \ - value_smoother.h \ - variable.h \ - vector_2d.h \ - vector_2f.h \ - vectord.h \ - vectord_inline.h \ - vector.h \ - vector_h.h \ - vector_inline.h \ - win32_util.h \ - win_displayer.h \ - window_displayer.h \ - win_event_emitter.h \ - win_thread.h \ - win_tray.h \ - words_dictionary.h \ - xml_pack.h - -# End of Makefile.am diff --git a/code/nel/include/nel/misc/common.h b/code/nel/include/nel/misc/common.h index 42bf56d3b..fa9272386 100644 --- a/code/nel/include/nel/misc/common.h +++ b/code/nel/include/nel/misc/common.h @@ -342,6 +342,8 @@ std::string secondsToHumanReadable (uint32 time); /// Get a bytes or time in string format and convert it in seconds or bytes uint32 fromHumanReadable (const std::string &str); +/// Add digit grouping seperator to if value >= 10 000. Assumes input is numerical string. +std::string formatThousands(const std::string& s); /// This function executes a program in the background and returns instantly (used for example to launch services in AES). /// The program will be launched in the current directory diff --git a/code/nel/include/nel/misc/eid_translator.h b/code/nel/include/nel/misc/eid_translator.h index 695f7724e..9937b72fd 100644 --- a/code/nel/include/nel/misc/eid_translator.h +++ b/code/nel/include/nel/misc/eid_translator.h @@ -146,6 +146,8 @@ public: TAdditionalInfoCb EntityInfoCallback; + static void removeShardFromName(ucstring& name); + private: // get all eid for a user using the user name or the user id void getByUser (uint32 uid, std::vector &res); diff --git a/code/nel/include/nel/misc/event_emitter.h b/code/nel/include/nel/misc/event_emitter.h index e678c2674..5c547d07f 100644 --- a/code/nel/include/nel/misc/event_emitter.h +++ b/code/nel/include/nel/misc/event_emitter.h @@ -49,7 +49,7 @@ public: * \param server */ virtual void submitEvents(CEventServer & server, bool allWindows) = 0; - + /** * Instruct the event emitter to send CGDMouseMove instead of CEventMouseMove. * diff --git a/code/nel/include/nel/net/Makefile.am b/code/nel/include/nel/net/Makefile.am deleted file mode 100644 index 7a5dfe1be..000000000 --- a/code/nel/include/nel/net/Makefile.am +++ /dev/null @@ -1,48 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -includedir = ${prefix}/include/nel/net - -include_HEADERS = admin.h \ - buf_client.h \ - buf_net_base.h \ - buf_server.h \ - buf_sock.h \ - callback_client.h \ - callback_net_base.h \ - callback_server.h \ - cvar_log_filter.h \ - dummy_tcp_sock.h \ - email.h \ - inet_address.h \ - listen_sock.h \ - login_client.h \ - login_cookie.h \ - login_server.h \ - message.h \ - message_recorder.h \ - module_builder_parts.h \ - module_common.h \ - module_gateway.h \ - module.h \ - module_manager.h \ - module_message.h \ - module_socket.h \ - naming_client.h \ - net_displayer.h \ - net_log.h \ - net_manager.h \ - pacs_client.h \ - service.h \ - sock.h \ - tcp_sock.h \ - transport_class.h \ - udp_sim_sock.h \ - udp_sock.h \ - unified_network.h \ - unitime.h \ - varpath.h - -# End of Makefile.am diff --git a/code/nel/include/nel/net/transport_class.h b/code/nel/include/nel/net/transport_class.h index 11161d7cd..2517da64b 100644 --- a/code/nel/include/nel/net/transport_class.h +++ b/code/nel/include/nel/net/transport_class.h @@ -75,7 +75,7 @@ public: enum TProp { PropUInt8, PropUInt16, PropUInt32, PropUInt64, PropSInt8, PropSInt16, PropSInt32, PropSInt64, - PropBool, PropFloat, PropDouble, PropString, PropDataSetRow, PropSheetId, PropUKN }; + PropBool, PropFloat, PropDouble, PropString, PropDataSetRow, PropSheetId, PropUCString, PropUKN }; // PropBool, PropFloat, PropDouble, PropString, PropDataSetRow, PropEntityId, PropSheetId, PropUKN }; @@ -160,6 +160,7 @@ public: case PropString: nlassert(sizeof(T) == sizeof (std::string)); break; // case PropEntityId: nlassert(sizeof(T) == sizeof (NLMISC::CEntityId)); break; case PropSheetId: nlassert(sizeof(T) == sizeof (NLMISC::CSheetId)); break; + case PropUCString: nlassert(sizeof(T) == sizeof (ucstring)); break; default: nlerror ("property %s have unknown type %d", name.c_str(), type); } diff --git a/code/nel/include/nel/pacs/Makefile.am b/code/nel/include/nel/pacs/Makefile.am deleted file mode 100644 index 7160ec65c..000000000 --- a/code/nel/include/nel/pacs/Makefile.am +++ /dev/null @@ -1,17 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -includedir = ${prefix}/include/nel/pacs - -include_HEADERS = u_collision_desc.h \ - u_global_position.h \ - u_global_retriever.h \ - u_move_container.h \ - u_move_primitive.h \ - u_primitive_block.h \ - u_retriever_bank.h - -# End of Makefile.am - diff --git a/code/nel/include/nel/sound/Makefile.am b/code/nel/include/nel/sound/Makefile.am deleted file mode 100644 index 77dd246a6..000000000 --- a/code/nel/include/nel/sound/Makefile.am +++ /dev/null @@ -1,15 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -includedir = ${prefix}/include/nel/sound - -include_HEADERS = sound_animation.h \ - sound_anim_manager.h \ - sound_anim_marker.h \ - u_audio_mixer.h \ - u_listener.h \ - u_source.h - -# End of Makefile.am diff --git a/code/nel/nel.m4 b/code/nel/nel.m4 deleted file mode 100644 index e69de29bb..000000000 diff --git a/code/nel/samples/3d/Makefile.am b/code/nel/samples/3d/Makefile.am deleted file mode 100644 index d00e99366..000000000 --- a/code/nel/samples/3d/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005/04/04 09:45:05 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -SUBDIRS = font cluster_viewer @CEGUI_SUBDIR@ - - -# End of Makefile.am - diff --git a/code/nel/samples/3d/cegui/Makefile.am b/code/nel/samples/3d/cegui/Makefile.am deleted file mode 100644 index afc817166..000000000 --- a/code/nel/samples/3d/cegui/Makefile.am +++ /dev/null @@ -1,22 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005-04-04 09:45:06 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = demonel_8.sln demonel_8.vcproj demonel.rc demonel.sln demonel.vcproj icon1.ico datafiles - -bin_PROGRAMS = nel_sample_cegui - -nel_sample_cegui_SOURCES = main.cpp NeLDriver.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src @CEGUI_CFLAGS@ - -nel_sample_cegui_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/3d/libnel3d.la \ - ../../../src/cegui/libnelceguirenderer.la \ - @CEGUI_LIBS@ - - -# End of Makefile.am - diff --git a/code/nel/samples/3d/cluster_viewer/Makefile.am b/code/nel/samples/3d/cluster_viewer/Makefile.am deleted file mode 100644 index 5814a0394..000000000 --- a/code/nel/samples/3d/cluster_viewer/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005/04/04 09:45:06 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -SUBDIRS = shapes groups fonts - -bin_PROGRAMS = cluster_viewer - -cluster_viewer_SOURCES = main.cpp - -cluster_viewerdir = $(datadir)/nel/samples/cluster_viewer - -cluster_viewer_DATA = readme.txt main.cvs - -AM_CXXFLAGS = -DCV_DIR="\"$(cluster_viewerdir)\"" -I$(top_srcdir)/src - -cluster_viewer_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/3d/libnel3d.la - - -# End of Makefile.am - diff --git a/code/nel/samples/3d/cluster_viewer/fonts/Makefile.am b/code/nel/samples/3d/cluster_viewer/fonts/Makefile.am deleted file mode 100644 index 11e9a8f31..000000000 --- a/code/nel/samples/3d/cluster_viewer/fonts/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005-04-04 09:45:06 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -cluster_viewerdir = $(datadir)/nel/samples/cluster_viewer/fonts/ - -cluster_viewer_DATA = n019003l.pfb - -# End of Makefile.am - diff --git a/code/nel/samples/3d/cluster_viewer/groups/Makefile.am b/code/nel/samples/3d/cluster_viewer/groups/Makefile.am deleted file mode 100644 index 54cdb5867..000000000 --- a/code/nel/samples/3d/cluster_viewer/groups/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005-04-04 09:45:06 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -cluster_viewerdir = $(datadir)/nel/samples/cluster_viewer/groups/ - -cluster_viewer_DATA = street.ig - -# End of Makefile.am - diff --git a/code/nel/samples/3d/cluster_viewer/shapes/Makefile.am b/code/nel/samples/3d/cluster_viewer/shapes/Makefile.am deleted file mode 100644 index 3b251867a..000000000 --- a/code/nel/samples/3d/cluster_viewer/shapes/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005-04-04 09:45:06 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -cluster_viewerdir = $(datadir)/nel/samples/cluster_viewer/shapes/ - -cluster_viewer_DATA = box02.shape \ - sphere01.shape \ - sphere02.shape \ - sphere03.shape \ - sphere04.shape \ - sphere05.shape \ - sphere06.shape \ - sphere07.shape \ - sphere08.shape - -# End of Makefile.am - diff --git a/code/nel/samples/3d/font/Makefile.am b/code/nel/samples/3d/font/Makefile.am deleted file mode 100644 index 5548ec8f6..000000000 --- a/code/nel/samples/3d/font/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005/04/04 09:45:06 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -bin_PROGRAMS = font - -font_SOURCES = main.cpp - -fontdir = $(datadir)/nel/samples/font -font_DATA = beteckna.ttf - -AM_CXXFLAGS = -DFONT_DIR="\"$(fontdir)\"" -I$(top_srcdir)/src - -font_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/3d/libnel3d.la - - -# End of Makefile.am - diff --git a/code/nel/samples/Makefile.am b/code/nel/samples/Makefile.am deleted file mode 100644 index 98edb586d..000000000 --- a/code/nel/samples/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -# -# $Id: Makefile.am,v 1.2 2005/04/13 12:37:26 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -DIST_SUBDIRS = sound_sources pacs georges 3d net misc - -SUBDIRS = pacs georges 3d net misc - -# End of Makefile.am - diff --git a/code/nel/samples/georges/Makefile.am b/code/nel/samples/georges/Makefile.am deleted file mode 100644 index bf2c83d5f..000000000 --- a/code/nel/samples/georges/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005/04/04 09:45:06 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = georges_sample_8.vcproj georges_sample.sln georges_sample.vcproj - -bin_PROGRAMS = georges - -georges_SOURCES = main.cpp - -georgesdir = $(datadir)/nel/samples/georges - -georges_DATA = boolean.typ coolfilesinfo.dfn default.sample_config int.typ positiondata.dfn sample_config.dfn string.typ - -AM_CXXFLAGS = -DGF_DIR="\"$(georgesdir)\"" -I$(top_srcdir)/src - - -georges_LDADD = ../../src/misc/libnelmisc.la \ - ../../src/georges/libnelgeorges.la - - -# End of Makefile.am diff --git a/code/nel/samples/misc/Makefile.am b/code/nel/samples/misc/Makefile.am deleted file mode 100644 index 0e13cb6f1..000000000 --- a/code/nel/samples/misc/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -# -# $Id: Makefile.am,v 1.2 2005-04-13 12:37:26 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -SUBDIRS = command configfile debug i18n log strings - -# End of Makefile.am - diff --git a/code/nel/samples/misc/command/Makefile.am b/code/nel/samples/misc/command/Makefile.am deleted file mode 100644 index 890a9fa18..000000000 --- a/code/nel/samples/misc/command/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005-04-04 09:45:06 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = command_8.vcproj main.dsp main.dsw - -bin_PROGRAMS = command - -command_SOURCES = main.cpp - -commanddir = $(datadir)/nel/samples/command - -AM_CXXFLAGS = -I$(top_srcdir)/src - -command_LDADD = ../../../src/misc/libnelmisc.la - -# End of Makefile.am - diff --git a/code/nel/samples/misc/configfile/Makefile.am b/code/nel/samples/misc/configfile/Makefile.am deleted file mode 100644 index 538d3af28..000000000 --- a/code/nel/samples/misc/configfile/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005-04-04 09:45:06 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = configfile_8.vcproj main.dsp main.dsw - -bin_PROGRAMS = configfile - -configfile_SOURCES = main.cpp - -configfiledir = $(datadir)/nel/samples/configfile - -configfile_DATA = simpletest.txt - -AM_CXXFLAGS = -DCF_DIR="\"$(configfiledir)\"" -I$(top_srcdir)/src - -configfile_LDADD = ../../../src/misc/libnelmisc.la - - -# End of Makefile.am - diff --git a/code/nel/samples/misc/debug/Makefile.am b/code/nel/samples/misc/debug/Makefile.am deleted file mode 100644 index d8d2c733a..000000000 --- a/code/nel/samples/misc/debug/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005-04-04 09:45:06 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = debug_8.vcproj main.dsp main.dsw - -bin_PROGRAMS = debug - -debug_SOURCES = main.cpp - -debugdir = $(datadir)/nel/samples/debug - -AM_CXXFLAGS = -I$(top_srcdir)/src - -debug_LDADD = ../../../src/misc/libnelmisc.la - -# End of Makefile.am - diff --git a/code/nel/samples/misc/i18n/Makefile.am b/code/nel/samples/misc/i18n/Makefile.am deleted file mode 100644 index 6c9c574c9..000000000 --- a/code/nel/samples/misc/i18n/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005-04-04 09:45:06 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = i18n_8.vcproj main.dsp main.dsw - -bin_PROGRAMS = i18n - -i18n_SOURCES = main.cpp - -i18ndir = $(datadir)/nel/samples/i18n - -i18n_DATA = en.uxt fr.uxt de.uxt - -AM_CXXFLAGS = -DI18N_DIR="\"$(i18ndir)\"" -I$(top_srcdir)/src - -i18n_LDADD = ../../../src/misc/libnelmisc.la - - -# End of Makefile.am - diff --git a/code/nel/samples/misc/log/Makefile.am b/code/nel/samples/misc/log/Makefile.am deleted file mode 100644 index 3d57e533d..000000000 --- a/code/nel/samples/misc/log/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005-04-04 09:45:06 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = log_8.vcproj main.dsp main.dsw - -bin_PROGRAMS = log - -log_SOURCES = main.cpp - -logdir = $(datadir)/nel/samples/log - -AM_CXXFLAGS = -I$(top_srcdir)/src - -log_LDADD = ../../../src/misc/libnelmisc.la - -# End of Makefile.am - diff --git a/code/nel/samples/misc/strings/Makefile.am b/code/nel/samples/misc/strings/Makefile.am deleted file mode 100644 index 151e8ef32..000000000 --- a/code/nel/samples/misc/strings/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005-04-04 09:45:06 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = main.dsp main.dsw strings_8.vcproj - -bin_PROGRAMS = strings - -strings_SOURCES = main.cpp - -stringsdir = $(datadir)/nel/samples/strings - -AM_CXXFLAGS = -I$(top_srcdir)/src - -strings_LDADD = ../../../src/misc/libnelmisc.la - -# End of Makefile.am - diff --git a/code/nel/samples/misc/types_check/Makefile.am b/code/nel/samples/misc/types_check/Makefile.am deleted file mode 100644 index 9c79d6aa2..000000000 --- a/code/nel/samples/misc/types_check/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005-04-04 09:45:06 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = main.dsp main.dsw types_check_8.vcproj - -bin_PROGRAMS = types_check - -types_check_SOURCES = main.cpp - -types_checkdir = $(datadir)/nel/samples/types_check - -AM_CXXFLAGS = -I$(top_srcdir)/src - -types_check_LDADD = ../../../src/misc/libnelmisc.la - -# End of Makefile.am - diff --git a/code/nel/samples/net/Makefile.am b/code/nel/samples/net/Makefile.am deleted file mode 100644 index ad7388761..000000000 --- a/code/nel/samples/net/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005/04/13 12:37:26 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -SUBDIRS = chat udp login_system - - -# End of Makefile.am - diff --git a/code/nel/samples/net/chat/Makefile.am b/code/nel/samples/net/chat/Makefile.am deleted file mode 100644 index bc2df9ef9..000000000 --- a/code/nel/samples/net/chat/Makefile.am +++ /dev/null @@ -1,27 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005/04/13 12:37:26 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -bin_PROGRAMS = chatserver chatclient - -chatserver_SOURCES = server.cpp - -chatclient_SOURCES = client.cpp kbhit.h kbhit.cpp - -chatserverdir=$(datadir)/nel/samples/net/chat -chatserver_DATA=chat_service.cfg - -chatclientdir=$(datadir)/nel/samples/net/chat -chatclient_DATA=client.cfg - -AM_CXXFLAGS = -DCHAT_DIR="\"$(chatclientdir)\"" -I$(top_srcdir)/src - -chatserver_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/net/libnelnet.la - -chatclient_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/net/libnelnet.la - -# End of Makefile.am diff --git a/code/nel/samples/net/login_system/Makefile.am b/code/nel/samples/net/login_system/Makefile.am deleted file mode 100644 index 5ef4fe26c..000000000 --- a/code/nel/samples/net/login_system/Makefile.am +++ /dev/null @@ -1,30 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005-04-13 12:37:26 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = main.dsw client.dsp client.cfg frontend_service.cfg frontend_service.dsp - -bin_PROGRAMS = nls_login_client nls_frontend_service - -nls_frontend_service_SOURCES = frontend_service.cpp - -nls_login_client_SOURCES = client.cpp - -nls_frontend_servicedir=$(datadir)/nel/samples/net/udp -nls_frontend_service_DATA=frontend_service.cfg - -nls_login_clientdir=$(datadir)/nel/samples/net/udp -nls_login_client_DATA=client.cfg - -AM_CXXFLAGS = -DLC_DIR="\"$(nls_login_clientdir)\"" -I$(top_srcdir)/src - -nls_frontend_service_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/net/libnelnet.la - -nls_login_client_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/net/libnelnet.la - -# End of Makefile.am - diff --git a/code/nel/samples/net/udp/Makefile.am b/code/nel/samples/net/udp/Makefile.am deleted file mode 100644 index 07a131fd8..000000000 --- a/code/nel/samples/net/udp/Makefile.am +++ /dev/null @@ -1,32 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005-04-13 12:37:26 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = main.dsw main.sln bench_service_8.vcproj bench_service.vcproj bench_service.dsp client_8.vcproj client.dsp client.vcproj readme.txt - -bin_PROGRAMS = udp_bench_service udp_bench_client - -udp_bench_service_SOURCES = bench_service.cpp receive_task.cpp receive_task.h - -udp_bench_client_SOURCES = client.cpp graph.cpp graph.h simlag.cpp simlag.h - -noinst_HEADERS = receive_task.h graph.h simlag.h - -udp_bench_servicedir=$(datadir)/nel/samples/net/udp -udp_bench_service_DATA= bench_service.cfg - -udp_bench_clientdir=$(datadir)/nel/samples/net/udp -udp_bench_client_DATA=client.cfg - -AM_CXXFLAGS = -DUDP_DIR="\"$(udp_bench_clientdir)\"" -I$(top_srcdir)/src - -udp_bench_service_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/net/libnelnet.la - -udp_bench_client_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/net/libnelnet.la - -# End of Makefile.am - diff --git a/code/nel/samples/pacs/Makefile.am b/code/nel/samples/pacs/Makefile.am deleted file mode 100644 index d7a552769..000000000 --- a/code/nel/samples/pacs/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005/04/04 09:45:06 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -bin_PROGRAMS = pacs_sample - -pacs_sample_SOURCES = main.cpp object.cpp object.h - -AM_CXXFLAGS = -I$(top_srcdir)/src - -pacs_sample_LDADD = ../../src/misc/libnelmisc.la \ - ../../src/3d/libnel3d.la \ - ../../src/pacs/libnelpacs.la - - -# End of Makefile.am - diff --git a/code/nel/samples/sound_sources/Makefile.am b/code/nel/samples/sound_sources/Makefile.am deleted file mode 100644 index 1e05afa90..000000000 --- a/code/nel/samples/sound_sources/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2005/04/04 09:45:06 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -bin_PROGRAMS = sound_sources - -sound_sources_SOURCES = main.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src - -sound_sources_LDADD = ../../src/misc/libnelmisc.la \ - ../../src/sound/libnelsnd.la \ - ../../src/sound/driver/libnelsnd_lowlevel.la \ - ../../src/sound/driver/fmod/libnel_drv_fmod.la \ - ../../src/ligo/libnelligo.la \ - ../../src/georges/libnelgeorges.la \ - ../../src/3d/libnel3d.la - - -# End of Makefile.am - diff --git a/code/nel/src/3d/CMakeLists.txt b/code/nel/src/3d/CMakeLists.txt index 3888be211..45b38fcbd 100644 --- a/code/nel/src/3d/CMakeLists.txt +++ b/code/nel/src/3d/CMakeLists.txt @@ -706,6 +706,9 @@ IF(WITH_PCH) ENDIF(WITH_PCH) NL_GEN_PC(nel-3d.pc) -INSTALL(TARGETS nel3d LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) + +IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) + INSTALL(TARGETS nel3d LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) +ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) ADD_SUBDIRECTORY(driver) diff --git a/code/nel/src/3d/Makefile.am b/code/nel/src/3d/Makefile.am deleted file mode 100644 index 441c4ee47..000000000 --- a/code/nel/src/3d/Makefile.am +++ /dev/null @@ -1,616 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -SUBDIRS = driver - -lib_LTLIBRARIES = libnel3d.la - -EXTRA_DIST = mesh_mrm_skin_template.cpp mesh_mrm_skinned_template.cpp - -libnel3d_la_SOURCES = \ - anim_ctrl.cpp \ - anim_detail_trav.cpp \ - anim_detail_trav.h \ - animatable.cpp \ - animatable.h \ - animated_lightmap.cpp \ - animated_lightmap.h \ - animated_material.cpp \ - animated_material.h \ - animated_morph.cpp \ - animated_morph.h \ - animated_value.cpp \ - animated_value.h \ - animation.cpp \ - animation.h \ - animation_optimizer.cpp \ - animation_optimizer.h \ - animation_playlist.cpp \ - animation_playlist.h \ - animation_set.cpp \ - animation_set.h \ - animation_set_user.cpp \ - animation_set_user.h \ - animation_time.cpp \ - async_file_manager_3d.cpp \ - async_file_manager_3d.h \ - async_texture_block.cpp \ - async_texture_block.h \ - async_texture_manager.cpp \ - async_texture_manager.h \ - bezier_patch.cpp \ - bezier_patch.h \ - bloom_effect.cpp \ - bloom_effect.h \ - bone.cpp \ - bone.h \ - bsp_tree.h \ - camera.cpp \ - camera.h \ - camera_col.cpp \ - camera_col.h \ - channel_mixer.cpp \ - channel_mixer.h \ - clip_trav.cpp \ - clip_trav.h \ - cloud.cpp \ - cloud.h \ - cloud_scape.cpp \ - cloud_scape.h \ - cloud_scape_user.cpp \ - cloud_scape_user.h \ - cluster.cpp \ - cluster.h \ - coarse_mesh_build.cpp \ - coarse_mesh_build.h \ - coarse_mesh_manager.cpp \ - coarse_mesh_manager.h \ - computed_string.cpp \ - computed_string.h \ - cube_grid.cpp \ - cube_grid.h \ - cube_map_builder.cpp \ - cube_map_builder.h \ - debug_vb.cpp \ - debug_vb.h \ - deform_2d.cpp \ - deform_2d.h \ - driver.cpp \ - driver.h \ - driver_material_inline.h \ - driver_user.cpp \ - driver_user.h \ - driver_user2.cpp \ - dru.cpp \ - dru.h \ - event_mouse_listener.cpp \ - event_mouse_listener.h \ - fast_ptr_list.cpp \ - fast_ptr_list.h \ - fasthls_modifier.cpp \ - fasthls_modifier.h \ - flare_model.cpp \ - flare_model.h \ - flare_shape.cpp \ - flare_shape.h \ - font_generator.cpp \ - font_generator.h \ - font_manager.cpp \ - font_manager.h \ - frustum.cpp \ - heat_haze.cpp \ - heat_haze.h \ - height_map.cpp \ - hls_color_texture.cpp \ - hls_color_texture.h \ - hls_texture_bank.cpp \ - hls_texture_bank.h \ - hls_texture_manager.cpp \ - hls_texture_manager.h \ - hrc_trav.cpp \ - hrc_trav.h \ - ig_surface_light.cpp \ - ig_surface_light.h \ - ig_surface_light_build.cpp \ - ig_surface_light_build.h \ - index_buffer.cpp \ - index_buffer.h \ - init_3d.cpp \ - init_3d.h \ - instance_group_user.cpp \ - instance_group_user.h \ - instance_lighter.cpp \ - instance_lighter.h \ - key.cpp \ - key.h \ - landscape.cpp \ - landscape.h \ - landscape_collision_grid.cpp \ - landscape_collision_grid.h \ - landscape_def.cpp \ - landscape_def.h \ - landscape_face_vector_manager.cpp \ - landscape_face_vector_manager.h \ - landscape_model.cpp \ - landscape_model.h \ - landscape_profile.cpp \ - landscape_profile.h \ - landscape_user.cpp \ - landscape_user.h \ - landscape_vegetable_block.cpp \ - landscape_vegetable_block.h \ - landscapeig_manager.cpp \ - landscapevb_allocator.cpp \ - landscapevb_allocator.h \ - landscapevb_info.cpp \ - landscapevb_info.h \ - layered_ordering_table.h \ - light.cpp \ - light.h \ - light_contribution.cpp \ - light_contribution.h \ - light_influence_interpolator.cpp \ - light_influence_interpolator.h \ - light_trav.cpp \ - light_trav.h \ - light_user.cpp \ - light_user.h \ - lighting_manager.cpp \ - lighting_manager.h \ - load_balancing_trav.cpp \ - load_balancing_trav.h \ - lod_character_builder.cpp \ - lod_character_builder.h \ - lod_character_instance.cpp \ - lod_character_instance.h \ - lod_character_manager.cpp \ - lod_character_manager.h \ - lod_character_shape.cpp \ - lod_character_shape.h \ - lod_character_shape_bank.cpp \ - lod_character_shape_bank.h \ - lod_character_texture.cpp \ - lod_character_texture.h \ - logic_info.cpp \ - material.cpp \ - material.h \ - matrix_3x4.cpp \ - matrix_3x4.h \ - mesh.cpp \ - mesh.h \ - mesh_base.cpp \ - mesh_base.h \ - mesh_base_instance.cpp \ - mesh_base_instance.h \ - mesh_blender.cpp \ - mesh_blender.h \ - mesh_block_manager.cpp \ - mesh_block_manager.h \ - mesh_geom.cpp \ - mesh_geom.h \ - mesh_instance.cpp \ - mesh_instance.h \ - mesh_morpher.cpp \ - mesh_morpher.h \ - mesh_mrm.cpp \ - mesh_mrm.h \ - mesh_mrm_instance.cpp \ - mesh_mrm_instance.h \ - mesh_mrm_skin.cpp \ - mesh_mrm_skin_template.cpp \ - mesh_mrm_skinned.cpp \ - mesh_mrm_skinned.h \ - mesh_mrm_skinned_instance.cpp \ - mesh_mrm_skinned_instance.h \ - mesh_mrm_skinned_template.cpp \ - mesh_multi_lod.cpp \ - mesh_multi_lod.h \ - mesh_multi_lod_instance.cpp \ - mesh_multi_lod_instance.h \ - mesh_vertex_program.cpp \ - mesh_vertex_program.h \ - meshvp_per_pixel_light.cpp \ - meshvp_per_pixel_light.h \ - meshvp_wind_tree.cpp \ - meshvp_wind_tree.h \ - mini_col.cpp \ - mini_col.h \ - motion_blur.cpp \ - motion_blur.h \ - mrm_builder.cpp \ - mrm_builder.h \ - mrm_internal.cpp \ - mrm_internal.h \ - mrm_level_detail.cpp \ - mrm_level_detail.h \ - mrm_mesh.cpp \ - mrm_mesh.h \ - mrm_parameters.cpp \ - mrm_parameters.h \ - nelu.cpp \ - nelu.h \ - noise_3d.cpp \ - noise_3d.h \ - occlusion_query.h \ - ordering_table.h \ - packed_zone.cpp \ - packed_zone.h \ - packed_world.cpp \ - packed_world.h \ - particle_system.cpp \ - particle_system.h \ - particle_system_manager.cpp \ - particle_system_manager.h \ - particle_system_model.cpp \ - particle_system_model.h \ - particle_system_process.cpp \ - particle_system_process.h \ - particle_system_shape.cpp \ - particle_system_shape.h \ - particle_system_sound_user.cpp \ - patch.cpp \ - patch.h \ - patch_lightmap.cpp \ - patch_noise.cpp \ - patch_rdr_pass.cpp \ - patch_rdr_pass.h \ - patch_render.cpp \ - patch_vegetable.cpp \ - patchdlm_context.cpp \ - patchdlm_context.h \ - patchuv_locator.cpp \ - patchuv_locator.h \ - play_list_manager.cpp \ - play_list_manager.h \ - play_list_manager_user.cpp \ - play_list_manager_user.h \ - play_list_user.cpp \ - play_list_user.h \ - point_light.cpp \ - point_light.h \ - point_light_model.cpp \ - point_light_model.h \ - point_light_named.cpp \ - point_light_named.h \ - point_light_named_array.cpp \ - point_light_named_array.h \ - portal.cpp \ - portal.h \ - primitive_profile.cpp \ - ps_allocator.cpp \ - ps_allocator.h \ - ps_attrib.h \ - ps_attrib_maker.h \ - ps_attrib_maker_bin_op.cpp \ - ps_attrib_maker_bin_op.h \ - ps_attrib_maker_bin_op_inline.h \ - ps_attrib_maker_helper.cpp \ - ps_attrib_maker_helper.h \ - ps_attrib_maker_iterators.h \ - ps_attrib_maker_template.cpp \ - ps_attrib_maker_template.h \ - ps_color.cpp \ - ps_color.h \ - ps_direction.h \ - ps_dot.cpp \ - ps_dot.h \ - ps_edit.h \ - ps_emitter.cpp \ - ps_emitter.h \ - ps_face.cpp \ - ps_face.h \ - ps_face_look_at.cpp \ - ps_face_look_at.h \ - ps_fan_light.cpp \ - ps_fan_light.h \ - ps_float.cpp \ - ps_float.h \ - ps_force.cpp \ - ps_force.h \ - ps_int.cpp \ - ps_int.h \ - ps_iterator.h \ - ps_light.cpp \ - ps_light.h \ - ps_located.cpp \ - ps_located.h \ - ps_lod.h \ - ps_macro.h \ - ps_mesh.cpp \ - ps_mesh.h \ - ps_misc.h \ - ps_particle.cpp \ - ps_particle.h \ - ps_particle2.cpp \ - ps_particle2.h \ - ps_particle_basic.cpp \ - ps_particle_basic.h \ - ps_plane_basis.h \ - ps_plane_basis_maker.cpp \ - ps_plane_basis_maker.h \ - ps_quad.cpp \ - ps_quad.h \ - ps_register_attribs.cpp \ - ps_register_color_attribs.h \ - ps_register_emitters.cpp \ - ps_register_float_attribs.h \ - ps_register_forces.cpp \ - ps_register_int_attribs.h \ - ps_register_particles.cpp \ - ps_register_plane_basis_attribs.h \ - ps_register_zones.cpp \ - ps_ribbon.cpp \ - ps_ribbon.h \ - ps_ribbon_base.cpp \ - ps_ribbon_base.h \ - ps_ribbon_look_at.cpp \ - ps_ribbon_look_at.h \ - ps_shockwave.cpp \ - ps_shockwave.h \ - ps_spawn_info.h \ - ps_sound.cpp \ - ps_sound.h \ - ps_tail_dot.cpp \ - ps_tail_dot.h \ - ps_util.cpp \ - ps_util.h \ - ps_zone.cpp \ - ps_zone.h \ - ptr_set.cpp \ - ptr_set.h \ - quad_effect.cpp \ - quad_effect.h \ - quad_grid.cpp \ - quad_grid.h \ - quad_grid_clip_cluster.cpp \ - quad_grid_clip_cluster.h \ - quad_grid_clip_manager.cpp \ - quad_grid_clip_manager.h \ - radix_sort.cpp \ - radix_sort.h \ - raw_skin.cpp \ - raw_skin.h \ - raw_skinned.cpp \ - raw_skinned.h \ - ray_mesh.cpp \ - ray_mesh.h \ - register_3d.cpp \ - register_3d.h \ - render_trav.cpp \ - render_trav.h \ - root_model.cpp \ - root_model.h \ - scene.cpp \ - scene.h \ - scene_group.cpp \ - scene_group.h \ - scene_user.cpp \ - scene_user.h \ - scissor.cpp \ - seg_remanence.cpp \ - seg_remanence.h \ - seg_remanence_shape.cpp \ - seg_remanence_shape.h \ - shader.cpp \ - shader.h \ - shadow_map.cpp \ - shadow_map.h \ - shadow_map_manager.cpp \ - shadow_map_manager.h \ - shadow_poly_receiver.cpp \ - shadow_poly_receiver.h \ - shadow_skin.cpp \ - shadow_skin.h \ - shape.cpp \ - shape.h \ - shape_bank.cpp \ - shape_bank.h \ - shape_bank_user.cpp \ - shape_bank_user.h \ - shape_info.cpp \ - shape_info.h \ - shifted_triangle_cache.cpp \ - shifted_triangle_cache.h \ - skeleton_model.cpp \ - skeleton_model.h \ - skeleton_shape.cpp \ - skeleton_shape.h \ - skeleton_spawn_script.cpp \ - skeleton_spawn_script.h \ - skeleton_weight.cpp \ - skeleton_weight.h \ - static_quad_grid.cpp \ - static_quad_grid.h \ - std3d.cpp \ - std3d.h \ - stripifier.cpp \ - stripifier.h \ - surface_light_grid.cpp \ - surface_light_grid.h \ - tangent_space_build.cpp \ - tangent_space_build.h \ - target_anim_ctrl.cpp \ - tess_block.cpp \ - tess_block.h \ - tess_face_priority_list.cpp \ - tess_face_priority_list.h \ - tess_list.cpp \ - tess_list.h \ - tessellation.cpp \ - tessellation.h \ - text_context.cpp \ - text_context.h \ - text_context_user.cpp \ - text_context_user.h \ - texture.cpp \ - texture.h \ - texture_blank.cpp \ - texture_blank.h \ - texture_bloom.cpp \ - texture_bloom.h \ - texture_blend.cpp \ - texture_blend.h \ - texture_bump.cpp \ - texture_bump.h \ - texture_cube.cpp \ - texture_cube.h \ - texture_dlm.cpp \ - texture_dlm.h \ - texture_emboss.cpp \ - texture_emboss.h \ - texture_far.cpp \ - texture_far.h \ - texture_file.cpp \ - texture_file.h \ - texture_font.cpp \ - texture_font.h \ - texture_grouped.cpp \ - texture_grouped.h \ - texture_mem.cpp \ - texture_mem.h \ - texture_multi_file.cpp \ - texture_multi_file.h \ - texture_near.cpp \ - texture_near.h \ - texture_user.cpp \ - texture_user.h \ - tile_bank.cpp \ - tile_bank.h \ - tile_color.cpp \ - tile_color.h \ - tile_element.cpp \ - tile_element.h \ - tile_far_bank.cpp \ - tile_far_bank.h \ - tile_light_influence.cpp \ - tile_light_influence.h \ - tile_lumel.cpp \ - tile_lumel.h \ - tile_noise_map.cpp \ - tile_noise_map.h \ - tile_vegetable_desc.cpp \ - tile_vegetable_desc.h \ - track.cpp \ - track.h \ - track_bezier.h \ - track_keyframer.cpp \ - track_keyframer.h \ - track_sampled_common.cpp \ - track_sampled_common.h \ - track_sampled_quat.cpp \ - track_sampled_quat.h \ - track_sampled_quat_small_header.cpp \ - track_sampled_quat_small_header.h \ - track_sampled_vector.cpp \ - track_sampled_vector.h \ - track_tcb.h \ - transform.cpp \ - transform.h \ - transform_shape.cpp \ - transform_shape.h \ - transformable.cpp \ - transformable.h \ - trav_scene.cpp \ - trav_scene.h \ - u_bone.cpp \ - u_camera.cpp \ - u_instance.cpp \ - u_instance_material.cpp \ - u_material.cpp \ - u_particle_system_instance.cpp \ - u_point_light.cpp \ - u_shape.cpp \ - u_skeleton.cpp \ - u_transform.cpp \ - u_transformable.cpp \ - u_visual_collision_mesh.cpp \ - u_water.cpp \ - vegetable.cpp \ - vegetable.h \ - vegetable_blend_layer_model.cpp \ - vegetable_blend_layer_model.h \ - vegetable_clip_block.cpp \ - vegetable_clip_block.h \ - vegetable_def.cpp \ - vegetable_def.h \ - vegetable_instance_group.cpp \ - vegetable_instance_group.h \ - vegetable_light_ex.cpp \ - vegetable_light_ex.h \ - vegetable_manager.cpp \ - vegetable_manager.h \ - vegetable_quadrant.cpp \ - vegetable_quadrant.h \ - vegetable_shape.cpp \ - vegetable_shape.h \ - vegetable_sort_block.cpp \ - vegetable_sort_block.h \ - vegetable_uv8.cpp \ - vegetable_uv8.h \ - vegetablevb_allocator.cpp \ - vegetablevb_allocator.h \ - vertex_buffer.cpp \ - vertex_buffer.h \ - vertex_buffer_heap.cpp \ - vertex_buffer_heap.h \ - vertex_program.cpp \ - vertex_program.h \ - vertex_program_parse.cpp \ - vertex_program_parse.h \ - vertex_stream_manager.cpp \ - vertex_stream_manager.h \ - viewport.cpp \ - visual_collision_entity.cpp \ - visual_collision_entity.h \ - visual_collision_entity_user.cpp \ - visual_collision_entity_user.h \ - visual_collision_manager.cpp \ - visual_collision_manager.h \ - visual_collision_manager_user.cpp \ - visual_collision_manager_user.h \ - visual_collision_mesh.cpp \ - visual_collision_mesh.h \ - water_env_map.cpp \ - water_env_map.h \ - water_env_map_user.cpp \ - water_env_map_user.h \ - water_height_map.cpp \ - water_height_map.h \ - water_model.cpp \ - water_model.h \ - water_pool_manager.cpp \ - water_pool_manager.h \ - water_shape.cpp \ - water_shape.h \ - zone.cpp \ - zone.h \ - zone_corner_smoother.cpp \ - zone_corner_smoother.h \ - zone_lighter.cpp \ - zone_lighter.h \ - zone_manager.cpp \ - zone_manager.h \ - zone_search.cpp \ - zone_search.h \ - zone_smoother.cpp \ - zone_smoother.h \ - zone_symmetrisation.cpp \ - zone_symmetrisation.h \ - zone_tgt_smoother.cpp \ - zone_tgt_smoother.h - -noinst_HEADERS = std3d.h -# mesh_vertex_program.h meshvp_wind_tree.h - -AM_CXXFLAGS = -I$(top_srcdir)/src @FREETYPE_CFLAGS@ - -libnel3d_la_LIBADD = @FREETYPE_LIBS@ -lc -ldl -lpthread - -libnel3d_la_LDFLAGS = -version-info @LIBTOOL_VERSION@ - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = nel-3d.pc - -# End of Makefile.am diff --git a/code/nel/src/3d/driver/Makefile.am b/code/nel/src/3d/driver/Makefile.am deleted file mode 100644 index 0603c2362..000000000 --- a/code/nel/src/3d/driver/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = direct3d - -SUBDIRS = opengl - -# End of Makefile.am diff --git a/code/nel/src/3d/driver/direct3d/CMakeLists.txt b/code/nel/src/3d/driver/direct3d/CMakeLists.txt index 5011c3c45..cc61fa9bd 100644 --- a/code/nel/src/3d/driver/direct3d/CMakeLists.txt +++ b/code/nel/src/3d/driver/direct3d/CMakeLists.txt @@ -16,7 +16,9 @@ IF(WITH_PCH) ADD_NATIVE_PRECOMPILED_HEADER(nel_drv_direct3d_win ${CMAKE_CURRENT_SOURCE_DIR}/stddirect3d.h ${CMAKE_CURRENT_SOURCE_DIR}/stddirect3d.cpp) ENDIF(WITH_PCH) -INSTALL(TARGETS nel_drv_direct3d_win LIBRARY DESTINATION ${NL_DRIVER_PREFIX} ARCHIVE DESTINATION lib RUNTIME DESTINATION bin COMPONENT drivers3d) -IF(WITH_MAXPLUGIN) - INSTALL(TARGETS nel_drv_direct3d_win RUNTIME DESTINATION maxplugin COMPONENT drivers3d) -ENDIF(WITH_MAXPLUGIN) +IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC_DRIVERS) OR NOT WITH_STATIC_DRIVERS) + INSTALL(TARGETS nel_drv_direct3d_win LIBRARY DESTINATION ${NL_DRIVER_PREFIX} ARCHIVE DESTINATION lib RUNTIME DESTINATION bin COMPONENT drivers3d) + IF(WITH_MAXPLUGIN) + INSTALL(TARGETS nel_drv_direct3d_win RUNTIME DESTINATION maxplugin COMPONENT drivers3d) + ENDIF(WITH_MAXPLUGIN) +ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC_DRIVERS) OR NOT WITH_STATIC_DRIVERS) diff --git a/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp b/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp index 5ac1d2906..bfbd3fdb7 100644 --- a/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp +++ b/code/nel/src/3d/driver/direct3d/driver_direct3d.cpp @@ -1228,7 +1228,7 @@ bool CDriverD3D::init (uint windowIcon, emptyProc exitFunc) ExitFunc = exitFunc; createCursors(); - + // Register a window class WNDCLASSW wc; diff --git a/code/nel/src/3d/driver/opengl/CMakeLists.txt b/code/nel/src/3d/driver/opengl/CMakeLists.txt index 6fdecab71..d90c7e0b3 100644 --- a/code/nel/src/3d/driver/opengl/CMakeLists.txt +++ b/code/nel/src/3d/driver/opengl/CMakeLists.txt @@ -61,7 +61,9 @@ IF(NOT APPLE AND WITH_PCH) ADD_NATIVE_PRECOMPILED_HEADER(${NLDRV_OGL_LIB} ${CMAKE_CURRENT_SOURCE_DIR}/stdopengl.h ${CMAKE_CURRENT_SOURCE_DIR}/stdopengl.cpp) ENDIF(NOT APPLE AND WITH_PCH) -INSTALL(TARGETS ${NLDRV_OGL_LIB} LIBRARY DESTINATION ${NL_DRIVER_PREFIX} ARCHIVE DESTINATION lib RUNTIME DESTINATION bin COMPONENT drivers3d) -IF(WITH_MAXPLUGIN) - INSTALL(TARGETS ${NLDRV_OGL_LIB} RUNTIME DESTINATION maxplugin COMPONENT drivers3d) -ENDIF(WITH_MAXPLUGIN) +IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC_DRIVERS) OR NOT WITH_STATIC_DRIVERS) + INSTALL(TARGETS ${NLDRV_OGL_LIB} LIBRARY DESTINATION ${NL_DRIVER_PREFIX} ARCHIVE DESTINATION lib RUNTIME DESTINATION bin COMPONENT drivers3d) + IF(WITH_MAXPLUGIN) + INSTALL(TARGETS ${NLDRV_OGL_LIB} RUNTIME DESTINATION maxplugin COMPONENT drivers3d) + ENDIF(WITH_MAXPLUGIN) +ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC_DRIVERS) OR NOT WITH_STATIC_DRIVERS) diff --git a/code/nel/src/3d/driver/opengl/Makefile.am b/code/nel/src/3d/driver/opengl/Makefile.am deleted file mode 100644 index 744801217..000000000 --- a/code/nel/src/3d/driver/opengl/Makefile.am +++ /dev/null @@ -1,47 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = driver_opengl_8.vcproj \ - driver_opengl.vcproj \ - driver_opengl.dsp \ - driver_opengl.def - -lib_LTLIBRARIES = libnel_drv_opengl.la - -libnel_drv_opengl_la_SOURCES = driver_opengl.cpp \ - driver_opengl.h \ - driver_opengl_extension.cpp \ - driver_opengl_extension.h \ - driver_opengl_extension_def.h \ - driver_opengl_light.cpp \ - driver_opengl_mac.cpp \ - driver_opengl_material.cpp \ - driver_opengl_matrix.cpp \ - driver_opengl_states.cpp \ - driver_opengl_states.h \ - driver_opengl_texture.cpp \ - driver_opengl_vertex.cpp \ - driver_opengl_vertex_buffer_hard.cpp \ - driver_opengl_vertex_buffer_hard.h \ - driver_opengl_vertex_program.cpp \ - stdopengl.cpp \ - stdopengl.h \ - unix_event_emitter.cpp \ - unix_event_emitter.h - - -noinst_HEADERS = stdopengl.h - -AM_CXXFLAGS = -I$(top_srcdir)/src \ - @OPENGL_CFLAGS@ @XF86VIDMODE_CFLAGS@ - -libnel_drv_opengl_la_LIBADD = @OPENGL_LIBS@ @XF86VIDMODE_LIBS@ -lXmu -libnel_drv_opengl_la_LDFLAGS = -no-undefined - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = nel-driverogl.pc - -# End of Makefile.am - diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_light.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_light.cpp index e5c3cff6e..2fc25f94a 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_light.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_light.cpp @@ -138,7 +138,7 @@ void CDriverGL::setLightInternal(uint8 num, const CLight& light) } else { - // Deactivate spot properties + // Disable spot properties #ifdef USE_OPENGLES glLightf (lightNum, GL_SPOT_CUTOFF, 180.f); glLightf (lightNum, GL_SPOT_EXPONENT, 0.f); diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_vertex.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_vertex.cpp index 502c971f1..7241d499b 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_vertex.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_vertex.cpp @@ -978,7 +978,7 @@ void CDriverGL::setupGlArraysStd(CVertexBufferInfo &vb) // Check type nlassert (vb.Type[CVertexBuffer::Normal]==CVertexBuffer::Float3); _DriverGLStates.enableNormalArray(true); - nglArrayObjectATI(GL_NORMAL_ARRAY, 3, GL_FLOAT, vb.VertexSize, vb.VertexObjectId, (ptrdiff_t) vb.ValuePtr[CVertexBuffer::Normal]); + nglArrayObjectATI(GL_NORMAL_ARRAY, 3, GL_FLOAT, vb.VertexSize, vb.VertexObjectId, (ptrdiff_t) vb.ValuePtr[CVertexBuffer::Normal]); } else { diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp index 6501d70c4..6ebcff4c7 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp @@ -188,6 +188,9 @@ bool GlWndProc(CDriverGL *driver, const void* e) static Atom XA_WM_STATE = 0; static Atom XA_WM_STATE_FULLSCREEN = 0; static Atom XA_WM_ICON = 0; +static Atom XA_WM_WINDOW_TYPE = 0; +static Atom XA_WM_WINDOW_TYPE_NORMAL = 0; +static Atom XA_FRAME_EXTENTS = 0; sint nelXErrorsHandler(Display *dpy, XErrorEvent *e) { @@ -233,7 +236,7 @@ bool GlWndProc(CDriverGL *driver, XEvent &e) break; case Expose: - nlwarning("Expose event"); +// nlwarning("Expose event"); break; case ConfigureNotify: @@ -243,20 +246,36 @@ bool GlWndProc(CDriverGL *driver, XEvent &e) // first time setting decoration sizes if ((driver->_DecorationWidth == -1) || (driver->_DecorationWidth == 0)) { - driver->_DecorationWidth = e.xconfigure.x - driver->_WindowX; - driver->_DecorationHeight = e.xconfigure.y - driver->_WindowY; + Atom type_return = 0; + int format_return = 0; + unsigned long nitems_return = 0; + unsigned long bytes_after_return = 0; + long *data = NULL; + + int status = XGetWindowProperty(driver->_dpy, driver->_win, XA_FRAME_EXTENTS, 0, 4, False, XA_CARDINAL, &type_return, &format_return, &nitems_return, &bytes_after_return, (unsigned char**)&data); - nlwarning("Decoration size x = %d, y = %d", driver->_DecorationWidth, driver->_DecorationHeight); + // succeeded to retrieve decoration size + if (status == Success && type_return == XA_CARDINAL && format_return == 32 && nitems_return == 4 && data) + { + driver->_DecorationWidth = data[0]; + driver->_DecorationHeight = data[2]; + } + else + { + // use difference between current position and previous one (set by application) + driver->_DecorationWidth = e.xconfigure.x - driver->_WindowX; + driver->_DecorationHeight = e.xconfigure.y - driver->_WindowY; + } + + // don't allow negative decoration sizes + if (driver->_DecorationWidth < 0) driver->_DecorationWidth = 0; + if (driver->_DecorationHeight < 0) driver->_DecorationHeight = 0; } driver->_CurrentMode.Width = e.xconfigure.width; driver->_CurrentMode.Height = e.xconfigure.height; driver->_WindowX = e.xconfigure.x - driver->_DecorationWidth; driver->_WindowY = e.xconfigure.y - driver->_DecorationHeight; - - XConfigureEvent event = e.xconfigure; - - nlwarning("Configure x = %d, y = %d, width = %d, height = %d, send event = %d", event.x, event.y, event.width, event.height, event.send_event); } break; @@ -401,6 +420,9 @@ bool CDriverGL::init (uint windowIcon, emptyProc exitFunc) XA_WM_STATE = XInternAtom(_dpy, "_NET_WM_STATE", False); XA_WM_STATE_FULLSCREEN = XInternAtom(_dpy, "_NET_WM_STATE_FULLSCREEN", False); XA_WM_ICON = XInternAtom(_dpy, "_NET_WM_ICON", False); + XA_WM_WINDOW_TYPE = XInternAtom(_dpy, "_NET_WM_WINDOW_TYPE", False); + XA_WM_WINDOW_TYPE_NORMAL = XInternAtom(_dpy, "_NET_WM_WINDOW_TYPE_NORMAL", False); + XA_FRAME_EXTENTS = XInternAtom(_dpy, "_NET_FRAME_EXTENTS", False); #endif @@ -1528,6 +1550,42 @@ bool CDriverGL::createWindow(const GfxMode &mode) return false; } + // normal window type + XChangeProperty(_dpy, window, XA_WM_WINDOW_TYPE, XA_ATOM, 32, PropModeReplace, (const unsigned char*)&XA_WM_WINDOW_TYPE_NORMAL, 1); + + // set WM hints + XWMHints *wm_hints = XAllocWMHints(); + + if (wm_hints) + { + wm_hints->flags = StateHint | InputHint; + wm_hints->initial_state = NormalState; + wm_hints->input = True; + + XSetWMHints(_dpy, window, wm_hints); + XFree(wm_hints); + } + else + { + nlwarning("3D: Couldn't allocate XWMHints"); + } + + // set class hints + XClassHint *class_hints = XAllocClassHint(); + + if (class_hints) + { + class_hints->res_name = (char*)"NeL"; + class_hints->res_class = (char*)"nel"; + + XSetClassHint(_dpy, window, class_hints); + XFree(class_hints); + } + else + { + nlwarning("3D: Couldn't allocate XClassHint"); + } + #endif // NL_OS_UNIX _win = window; @@ -2201,11 +2259,19 @@ void CDriverGL::setWindowTitle(const ucstring &title) #elif defined (NL_OS_UNIX) #ifdef X_HAVE_UTF8_STRING + // UTF8 properties Xutf8SetWMProperties (_dpy, _win, (char*)title.toUtf8().c_str(), (char*)title.toUtf8().c_str(), NULL, 0, NULL, NULL, NULL); #else + // standard properties XTextProperty text_property; - XStringListToTextProperty((char**)&title.toUtf8().c_str(), 1, &text_property); - XSetWMProperties (_dpy, _win, &text_property, &text_property, 0, 0, NULL, 0, 0); + if (XStringListToTextProperty((char**)&title.toUtf8().c_str(), 1, &text_property) != 0) + { + XSetWMProperties (_dpy, _win, &text_property, &text_property, NULL, 0, NULL, NULL, NULL); + } + else + { + nlwarning("3D: Can't convert title to TextProperty"); + } #endif #endif // NL_OS_WINDOWS diff --git a/code/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.cpp b/code/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.cpp index 95c713021..15bb40d28 100644 --- a/code/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.cpp +++ b/code/nel/src/3d/driver/opengl/mac/cocoa_event_emitter.cpp @@ -149,14 +149,28 @@ static NLMISC::TKey virtualKeycodeToNelKey(unsigned short keycode) bool CCocoaEventEmitter::pasteTextFromClipboard(ucstring &text) { -#warning "OpenGL Driver: Missing Mac Implementation for pasteTextFromClipboard" + NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; + NSArray *classArray = [NSArray arrayWithObject:[NSString class]]; + NSDictionary *options = [NSDictionary dictionary]; + + BOOL ok = [pasteboard canReadObjectForClasses:classArray options:options]; + if (ok) + { + NSArray *objectsToPaste = [pasteboard readObjectsForClasses:classArray options:options]; + NSString *nstext = [objectsToPaste objectAtIndex:0]; + text.fromUtf8([nstext UTF8String]); + return true; + } return false; } bool CCocoaEventEmitter::copyTextToClipboard(const ucstring &text) { -#warning "OpenGL Driver: Missing Mac Implementation for copyTextToClipboard" - return false; + NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; + [pasteboard clearContents]; + NSArray *copiedObjects = [NSArray arrayWithObject:[NSString stringWithUTF8String:text.toUtf8().c_str()]]; + [pasteboard writeObjects:copiedObjects]; + return true; } /// convert modifier key state to nel internal modifier key state diff --git a/code/nel/src/3d/driver/opengl/mac/glext.h b/code/nel/src/3d/driver/opengl/mac/glext.h index 7d222aa19..6bcd8c238 100644 --- a/code/nel/src/3d/driver/opengl/mac/glext.h +++ b/code/nel/src/3d/driver/opengl/mac/glext.h @@ -4851,8 +4851,10 @@ typedef ptrdiff_t GLsizeiptrARB; #ifndef GL_ARB_shader_objects /* GL types for program/shader text and shader object handles */ typedef char GLcharARB; +#if !defined(MAC_OS_X_VERSION_10_7) typedef unsigned int GLhandleARB; #endif +#endif /* GL type for "half" precision (s10e5) float data in host memory */ #ifndef GL_ARB_half_float_pixel diff --git a/code/nel/src/3d/nelu.cpp b/code/nel/src/3d/nelu.cpp index 80ef89ec4..3d143bce1 100644 --- a/code/nel/src/3d/nelu.cpp +++ b/code/nel/src/3d/nelu.cpp @@ -58,7 +58,7 @@ bool CNELU::initDriver (uint w, uint h, uint bpp, bool windowed, nlWindow syst CNELU::Driver = NULL; // Init driver. -#if defined(NL_OS_WINDOWS) +#ifdef NL_OS_WINDOWS if (direct3d) { CNELU::Driver= CDRU::createD3DDriver(); @@ -75,6 +75,7 @@ bool CNELU::initDriver (uint w, uint h, uint bpp, bool windowed, nlWindow syst nlwarning ("CNELU::initDriver: no driver found"); return false; } + if (!CNELU::Driver->init()) { nlwarning ("CNELU::initDriver: init() failed"); diff --git a/code/nel/src/3d/particle_system_shape.cpp b/code/nel/src/3d/particle_system_shape.cpp index 5e41ba530..fb7aaa405 100644 --- a/code/nel/src/3d/particle_system_shape.cpp +++ b/code/nel/src/3d/particle_system_shape.cpp @@ -39,7 +39,11 @@ namespace NL3D { using NLMISC::CIFile; +namespace { +NLMISC::CMutex s_PSSMutex; + +} /* anonymous namespace */ // private usage : macro to check the memory integrity #if defined(NL_DEBUG) && defined(NL_OS_WINDOWS) @@ -220,9 +224,8 @@ CParticleSystem *CParticleSystemShape::instanciatePS(CScene &scene, NLMISC::CCon return _SharedSystem; } - // avoid prb with concurent thread (may append if an instance group containing ps is loaded in background) - NLMISC::CMutex mutex; - mutex.enter(); + // avoid prb with concurrent thread (may happen if an instance group containing ps is loaded in background) + s_PSSMutex.enter(); #ifdef PS_FAST_ALLOC @@ -295,7 +298,7 @@ CParticleSystem *CParticleSystemShape::instanciatePS(CScene &scene, NLMISC::CCon } #endif - mutex.leave(); + s_PSSMutex.leave(); /*NLMISC::TTicks end = NLMISC::CTime::getPerformanceTime(); nlinfo("instanciation time = %.2f", (float) (1000 * NLMISC::CTime::ticksToSecond(end - start))); */ @@ -390,8 +393,7 @@ void CParticleSystemShape::flushTextures(IDriver &driver, uint selectedTexture) } else { - NLMISC::CMutex mutex; - mutex.enter(); + s_PSSMutex.enter(); // must create an instance just to flush the textures CParticleSystem *myInstance = NULL; @@ -436,7 +438,7 @@ void CParticleSystemShape::flushTextures(IDriver &driver, uint selectedTexture) #ifdef PS_FAST_ALLOC PSBlockAllocator = NULL; #endif - mutex.leave(); + s_PSSMutex.leave(); } for(uint k = 0; k < _CachedTex.size(); ++k) { diff --git a/code/nel/src/3d/patchdlm_context.cpp b/code/nel/src/3d/patchdlm_context.cpp index f5a5b578d..e50f1befe 100644 --- a/code/nel/src/3d/patchdlm_context.cpp +++ b/code/nel/src/3d/patchdlm_context.cpp @@ -1018,8 +1018,8 @@ void CPatchDLMContext::computeTextureFar() // compute src pixel const CRGBA *srcPixel= pTile->getPixels(CTileFarBank::diffuse, CTileFarBank::order1); // compute src info, for this tile rot and 256x256 context. - sint srcDeltaX; - sint srcDeltaY; + sint srcDeltaX = 0; + sint srcDeltaY = 0; srcPixel= computeTileFarSrcDeltas(nRot, is256x256, uvOff, srcPixel, srcDeltaX, srcDeltaY); // compute dst coordinate. start writing at pixel (1,1) diff --git a/code/nel/src/Makefile.am b/code/nel/src/Makefile.am deleted file mode 100644 index dbedcae88..000000000 --- a/code/nel/src/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -DIST_SUBDIRS = net 3d pacs sound misc georges ligo - -SUBDIRS = @NEL_SUBDIRS@ - -EXTRA_DIST = 3d.vcproj \ - georges.vcproj \ - ligo.vcproj \ - logic.vcproj \ - misc.vcproj \ - net.vcproj \ - pacs.vcproj \ - sound.vcproj - -# End of Makefile.am diff --git a/code/nel/src/Rules.mk b/code/nel/src/Rules.mk deleted file mode 100644 index cb5d3dc57..000000000 --- a/code/nel/src/Rules.mk +++ /dev/null @@ -1,56 +0,0 @@ -############################################################################# -# A few basic default rules and intrinsic rules - -# Load objects dependencies -ifeq (Dependencies.mk,$(wildcard Dependencies.mk)) -include Dependencies.mk -check-deps: - @echo - @echo Dependencies found [OK] - @echo -else -check-deps: - @echo - @echo "No dependencies found [ERROR]" - @echo "You should try 'make update' first" - @echo - @exit 1 -endif - -# Start off by over-riding the default build rules with our own intrinsics -.SUFFIXES: -.SUFFIXES: .cpp .o -.cpp.o: - $(CXX) -c $(CXXFLAGS) $< -o $@ - -# remove object files and core (if any) -clean: - find . -name "core*" -exec $(RM) {} \; - find . -name "*.o" -exec $(RM) {} \; - find . -name "*~" -exec $(RM) {} \; - find . -name "Dependencies.mk" -exec $(RM) {} \; - -# remove object files, core dump, and executable (if any) -distclean: - $(MAKE) clean - $(RM) $(TARGETS) - $(RM) $(TARGETS)_debug - -# make the thing again from scratch -again: - $(MAKE) distclean - $(MAKE) $(TARGETS) - -UPDATE_OBJS=`cat ../$(DSP_TARGET) | grep SOURCE | sed -e 's/\r$$//' | grep "\.cpp$$" | cut -d\\\\ -f3- | tr '\n' ' ' | sed -e 's/=/..\\\\/g' | tr '\n' ' ' | sed -e 's/\\\\/\\//g' | sed -e 's/\.cpp /\.o /g'` - -UPDATE_SRCS=`cat ../$(DSP_TARGET) | grep SOURCE | sed -e 's/\r$$//' | grep "\.cpp$$" | cut -d\\\\ -f3- | tr '\n' ' ' | sed -e 's/=/..\\\\/g' | tr '\n' ' ' | sed -e 's/\\\\/\\//g'` - -dep: update - -update: - ../gen_deps.sh $(CXX) $(CXXFLAGS) -- $(UPDATE_SRCS) > Dependencies.mk - echo "OBJS=$(UPDATE_OBJS)" > Objects.mk - -touch: - $(RM) $(TARGETS) - $(RM) $(TARGETS)_debug diff --git a/code/nel/src/Variables.mk b/code/nel/src/Variables.mk deleted file mode 100644 index 216b4b1c8..000000000 --- a/code/nel/src/Variables.mk +++ /dev/null @@ -1,20 +0,0 @@ -############################################################################# -# Setting up the global compiler settings... - -# The names of the executables -CXX = c++ -RM = rm -f -MAKE = make - -DBG = off - -FLAGS_CMN = -g -pipe -Wno-ctor-dtor-privacy -Wno-multichar -D_REENTRANT -DHAVE_X86 - -FLAGS_DBG_on = -O0 -finline-functions -DNL_DEBUG -DNL_DEBUG_FAST -FLAGS_DBG_off = -O3 -ftemplate-depth-24 -funroll-loops -DNL_RELEASE_DEBUG -DIR_DBG_on = debug -DIR_DBG_off = release - -ifeq (Objects.mk,$(wildcard Objects.mk)) -include Objects.mk -endif diff --git a/code/nel/src/cegui/CMakeLists.txt b/code/nel/src/cegui/CMakeLists.txt index 99fcfedf3..342e08780 100644 --- a/code/nel/src/cegui/CMakeLists.txt +++ b/code/nel/src/cegui/CMakeLists.txt @@ -11,4 +11,6 @@ NL_ADD_LIB_SUFFIX(nelceguirenderer) ADD_DEFINITIONS(${LIBXML2_DEFINITIONS} -DNEL_CEGUIRENDERER_EXPORTS) -INSTALL(TARGETS nelceguirenderer RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) +IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) + INSTALL(TARGETS nelceguirenderer RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) +ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) diff --git a/code/nel/src/cegui/Makefile.am b/code/nel/src/cegui/Makefile.am deleted file mode 100644 index 43786d8e8..000000000 --- a/code/nel/src/cegui/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -# -# $Id: Makefile.am,v 1.7 2002-06-10 17:02:05 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -lib_LTLIBRARIES = libnelceguirenderer.la - -libnelceguirenderer_la_SOURCES = nelrenderer.cpp nelresourceprovider.cpp neltexture.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src @CEGUI_CFLAGS@ - -libnelceguirenderer_la_LIBADD = -lc -lpthread @CEGUI_LIBS@ - -libnelceguirenderer_la_LDFLAGS = -version-info @LIBTOOL_VERSION@ - - -# End of Makefile.am - diff --git a/code/nel/src/gen_deps.sh b/code/nel/src/gen_deps.sh deleted file mode 100755 index 45f41e17f..000000000 --- a/code/nel/src/gen_deps.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh - -command='' -sources='' -phase=0 -for arg in $* -do - if [ "$phase" == 0 ] && [ "$arg" == '--' ] - then - phase=1 - elif [ "$phase" == 0 ] - then - command="$command $arg" - elif [ "$phase" == 1 ] - then - sources="$sources $arg" - fi -done - -for src in $sources -do - obj=`echo $src | sed -e 's/.cpp$/.o/'` - $command -MT $obj -M $src -done - diff --git a/code/nel/src/georges/CMakeLists.txt b/code/nel/src/georges/CMakeLists.txt index d3c0199d7..6954bb87b 100644 --- a/code/nel/src/georges/CMakeLists.txt +++ b/code/nel/src/georges/CMakeLists.txt @@ -21,4 +21,7 @@ IF(WITH_PCH) ENDIF(WITH_PCH) NL_GEN_PC(nel-georges.pc) -INSTALL(TARGETS nelgeorges LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) + +IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) + INSTALL(TARGETS nelgeorges LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) +ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) diff --git a/code/nel/src/georges/Makefile.am b/code/nel/src/georges/Makefile.am deleted file mode 100644 index 389110b9f..000000000 --- a/code/nel/src/georges/Makefile.am +++ /dev/null @@ -1,34 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = georges_file_format.txt - -lib_LTLIBRARIES = libnelgeorges.la - -libnelgeorges_la_SOURCES = form.cpp \ - form.h \ - form_loader.cpp \ - form_loader.h \ - form_dfn.cpp \ - form_dfn.h \ - form_elm.cpp \ - form_elm.h \ - stdgeorges.cpp \ - stdgeorges.h \ - header.cpp \ - header.h \ - load_form.cpp \ - type.cpp \ - type.h - -AM_CXXFLAGS = -I$(top_srcdir)/src - -libnelgeorges_la_LIBADD = -lc -lpthread - -libnelgeorges_la_LDFLAGS = -version-info @LIBTOOL_VERSION@ - - -# End of Makefile.am - diff --git a/code/nel/src/ligo/CMakeLists.txt b/code/nel/src/ligo/CMakeLists.txt index f600637b7..4d8d49f3d 100644 --- a/code/nel/src/ligo/CMakeLists.txt +++ b/code/nel/src/ligo/CMakeLists.txt @@ -19,4 +19,7 @@ IF(WITH_PCH) ENDIF(WITH_PCH) NL_GEN_PC(nel-ligo.pc) -INSTALL(TARGETS nelligo LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) + +IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) + INSTALL(TARGETS nelligo LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) +ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) diff --git a/code/nel/src/ligo/Makefile.am b/code/nel/src/ligo/Makefile.am deleted file mode 100644 index db6e5d423..000000000 --- a/code/nel/src/ligo/Makefile.am +++ /dev/null @@ -1,36 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -lib_LTLIBRARIES = libnelligo.la - -libnelligo_la_SOURCES = ligo_config.cpp \ - ligo_error.cpp \ - ligo_error.h \ - ligo_material.cpp \ - ligo_material.h \ - primitive.cpp \ - primitive_class.cpp \ - primitive_configuration.cpp \ - transition.cpp \ - transition.h \ - zone_bank.cpp \ - zone_bank.h \ - zone_edge.cpp \ - zone_edge.h \ - zone_region.cpp \ - zone_region.h \ - zone_template.cpp \ - zone_template.h \ - primitive_utils.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src - -libnelligo_la_LIBADD = -lc -lpthread - -libnelligo_la_LDFLAGS = -version-info @LIBTOOL_VERSION@ - - -# End of Makefile.am - diff --git a/code/nel/src/ligo/primitive.cpp b/code/nel/src/ligo/primitive.cpp index ff8c71c18..62c4ab9d6 100644 --- a/code/nel/src/ligo/primitive.cpp +++ b/code/nel/src/ligo/primitive.cpp @@ -2118,7 +2118,7 @@ bool CPrimAlias::read (xmlNodePtr xmlNode, const char *filename, uint version, C xmlNodePtr ptNode = CIXml::getFirstChildNode (xmlNode, "ALIAS"); if (ptNode) { - int val; + sint val = 0; if (ReadInt ("VALUE", val, filename, ptNode)) { _Alias = uint32(val); diff --git a/code/nel/src/logic/CMakeLists.txt b/code/nel/src/logic/CMakeLists.txt index 107c57850..c84e8d18e 100644 --- a/code/nel/src/logic/CMakeLists.txt +++ b/code/nel/src/logic/CMakeLists.txt @@ -14,4 +14,6 @@ NL_ADD_LIB_SUFFIX(nellogic) ADD_DEFINITIONS(${LIBXML2_DEFINITIONS}) -INSTALL(TARGETS nellogic LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) +IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) + INSTALL(TARGETS nellogic LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) +ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) diff --git a/code/nel/src/misc/CMakeLists.txt b/code/nel/src/misc/CMakeLists.txt index 1710e5b6b..38d291552 100644 --- a/code/nel/src/misc/CMakeLists.txt +++ b/code/nel/src/misc/CMakeLists.txt @@ -53,4 +53,7 @@ IF(WITH_PCH) ENDIF(WITH_PCH) NL_GEN_PC(nel-misc.pc) -INSTALL(TARGETS nelmisc LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) + +IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) + INSTALL(TARGETS nelmisc LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) +ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) diff --git a/code/nel/src/misc/Makefile.am b/code/nel/src/misc/Makefile.am deleted file mode 100644 index 345a210c4..000000000 --- a/code/nel/src/misc/Makefile.am +++ /dev/null @@ -1,142 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -SUBDIRS = config_file - -lib_LTLIBRARIES = libnelmisc.la - -libnelmisc_la_SOURCES = \ - aabbox.cpp \ - app_context.cpp \ - algo.cpp \ - async_file_manager.cpp \ - big_file.cpp \ - bit_mem_stream.cpp \ - bit_set.cpp \ - bitmap.cpp \ - bitmap_jpeg.cpp \ - bitmap_png.cpp \ - block_memory.cpp \ - bsphere.cpp \ - buf_fifo.cpp \ - class_id.cpp \ - class_registry.cpp \ - command.cpp \ - common.cpp \ - contiguous_block_allocator.cpp \ - cpu_time_stat.cpp \ - debug.cpp \ - di_event_emitter.cpp \ - di_game_device.cpp \ - di_game_device.h \ - di_keyboard_device.cpp \ - di_keyboard_device.h \ - di_mouse_device.cpp \ - di_mouse_device.h \ - diff_tool.cpp \ - displayer.cpp \ - eid_translator.cpp \ - entity_id.cpp \ - eval_num_expr.cpp \ - event_emitter.cpp \ - event_emitter_multi.cpp \ - event_listener.cpp \ - event_server.cpp \ - events.cpp \ - fast_floor.cpp \ - fast_mem.cpp \ - file.cpp \ - fixed_size_allocator.cpp \ - game_device.cpp \ - game_device_events.cpp \ - geom_ext.cpp \ - grid_traversal.cpp \ - gtk_displayer.cpp \ - heap_memory.cpp \ - hierarchical_timer.cpp \ - i18n.cpp \ - i_xml.cpp \ - input_device.cpp \ - input_device_server.cpp \ - keyboard_device.cpp \ - line.cpp \ - log.cpp \ - matrix.cpp \ - md5.cpp \ - mem_displayer.cpp \ - mem_stream.cpp \ - mouse_smoother.cpp \ - mutex.cpp \ - noise_value.cpp \ - o_xml.cpp \ - object_arena_allocator.cpp \ - object_vector.cpp \ - p_thread.cpp \ - path.cpp \ - plane.cpp \ - polygon.cpp \ - progress_callback.cpp \ - quad.cpp \ - quat.cpp \ - reader_writer.cpp \ - rect.cpp \ - report.cpp \ - rgba.cpp \ - sha1.cpp \ - shared_memory.cpp \ - sheet_id.cpp \ - smart_ptr.cpp \ - stdmisc.cpp \ - stdmisc.h \ - stl_block_allocator.cpp \ - stl_block_list.cpp \ - stop_watch.cpp \ - stream.cpp \ - string_common.cpp \ - string_id_array.cpp \ - string_mapper.cpp \ - system_info.cpp \ - system_utils.cpp \ - task_manager.cpp \ - tds.cpp \ - time_nl.cpp \ - triangle.cpp \ - uv.cpp \ - unicode.cpp \ - value_smoother.cpp \ - variable.cpp \ - vector.cpp \ - vector_2d.cpp \ - vector_2f.cpp \ - vector_h.cpp \ - vectord.cpp \ - win_displayer.cpp \ - win_event_emitter.cpp \ - win_thread.cpp \ - window_displayer.cpp \ - words_dictionary.cpp \ - dynloadlib.cpp \ - sstring.cpp \ - co_task.cpp \ - xml_pack.cpp \ - inter_window_msg_queue.cpp \ - win32_util.cpp - - -noinst_HEADERS = di_game_device.h \ - di_keyboard_device.h \ - di_mouse_device.h \ - stdmisc.h - - -libnelmisc_la_LIBADD = config_file/libconfig.la -lc -lpthread -lrt -ldl -lpng -ljpeg - -libnelmisc_la_LDFLAGS = -version-info @LIBTOOL_VERSION@ - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = nel-misc.pc - -# End of Makefile.am - diff --git a/code/nel/src/misc/common.cpp b/code/nel/src/misc/common.cpp index fb9a9c6f5..19be95367 100644 --- a/code/nel/src/misc/common.cpp +++ b/code/nel/src/misc/common.cpp @@ -30,6 +30,7 @@ #include "nel/misc/command.h" #include "nel/misc/path.h" +#include "nel/misc/i18n.h" using namespace std; @@ -526,6 +527,31 @@ void toUpper(char *str) } } +std::string formatThousands(const std::string& s) +{ + int i, k; + int remaining = s.length() - 1; + static std::string separator = NLMISC::CI18N::get("uiThousandsSeparator").toUtf8(); + + // Don't add separator if the number is < 10k + if (remaining < 4) return s; + + std::string ns; + + do + { + for (i = remaining, k = 0; i >= 0 && k < 3; --i, ++k ) + { + ns = s[i] + ns; // New char is added to front of ns + if ( i > 0 && k == 2) ns = separator + ns; // j > 0 means still more digits + } + + remaining -= 3; + } + while (remaining >= 0); + + return ns; +} // // Exceptions diff --git a/code/nel/src/misc/config_file/Makefile.am b/code/nel/src/misc/config_file/Makefile.am deleted file mode 100644 index ee72fe42c..000000000 --- a/code/nel/src/misc/config_file/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -noinst_LTLIBRARIES = libconfig.la - -AM_YFLAGS = --defines=cf_gramatical.h -p cf - -AM_LFLAGS = -f -8 -Pcf -olex.yy.c - -EXTRA_DIST = cf_gramatical.h cf_bison.simple cf_flex.skl do.bat - -libconfig_la_SOURCES = cf_lexical.lpp \ - cf_gramatical.ypp \ - config_file.cpp - -#libconfig_la_SOURCES = config_file.cpp - -# End of Makefile.am - diff --git a/code/nel/src/misc/eid_translator.cpp b/code/nel/src/misc/eid_translator.cpp index 36ea84247..e254831c4 100644 --- a/code/nel/src/misc/eid_translator.cpp +++ b/code/nel/src/misc/eid_translator.cpp @@ -417,6 +417,17 @@ void CEntityIdTranslator::checkEntity (const CEntityId &eid, const ucstring &ent } } +void CEntityIdTranslator::removeShardFromName(ucstring& name) +{ + // The string must contain a '(' and a ')' + ucstring::size_type p0= name.find('('); + ucstring::size_type p1= name.find(')'); + if (p0 == ucstring::npos || p1 == ucstring::npos || p1 <= p0) + return; + + name = name.substr(0, p0) + name.substr(p1 + 1); +} + // this callback is call when the file is changed void cbInvalidEntityNamesFilename(const std::string &invalidEntityNamesFilename) { diff --git a/code/nel/src/misc/events.cpp b/code/nel/src/misc/events.cpp index 4d3979416..7cef02f44 100644 --- a/code/nel/src/misc/events.cpp +++ b/code/nel/src/misc/events.cpp @@ -178,7 +178,7 @@ static const CStringConversion::CPair stringTable [] = { "KeyZOOM", KeyZOOM }, { "KeyNONAME", KeyNONAME }, { "KeyPA1", KeyPA1 }, - { "KeyOEM_CLEAR", KeyOEM_CLEAR }, + { "KeyOEM_CLEAR", KeyOEM_CLEAR } }; diff --git a/code/nel/src/misc/noise_value.cpp b/code/nel/src/misc/noise_value.cpp index 89b9a8ad4..4b7cade1f 100644 --- a/code/nel/src/misc/noise_value.cpp +++ b/code/nel/src/misc/noise_value.cpp @@ -18,7 +18,7 @@ #include "nel/misc/noise_value.h" #include "nel/misc/fast_floor.h" - +#include "nel/misc/random.h" namespace NLMISC @@ -45,7 +45,8 @@ public: CRandomGrid3D() { //seed - srand(0); + CRandom Random; + Random.srand(0); // init the grid for(uint z=0; z> 5; + uint v= Random.rand() >> 5; _Texture3d[id]= v&255; } } @@ -80,9 +81,9 @@ public: // init LevelPhases. for(i=0; ipostEvent (new CEventKeyDown ((NLMISC::TKey)wParam, getKeyButton(_AltButton, _ShiftButton, _CtrlButton), true, this)); + } + // Post the message if (wParam < KeyCount) server->postEvent (new CEventKeyUp ((NLMISC::TKey)wParam, getKeyButton(_AltButton, _ShiftButton, _CtrlButton), this)); diff --git a/code/nel/src/net/CMakeLists.txt b/code/nel/src/net/CMakeLists.txt index ea68efe32..c24a94215 100644 --- a/code/nel/src/net/CMakeLists.txt +++ b/code/nel/src/net/CMakeLists.txt @@ -24,4 +24,7 @@ IF(WITH_PCH) ENDIF(WITH_PCH) NL_GEN_PC(nel-net.pc) -INSTALL(TARGETS nelnet LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) + +IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) + INSTALL(TARGETS nelnet LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) +ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) diff --git a/code/nel/src/net/Makefile.am b/code/nel/src/net/Makefile.am deleted file mode 100644 index ef0d956be..000000000 --- a/code/nel/src/net/Makefile.am +++ /dev/null @@ -1,60 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -lib_LTLIBRARIES = libnelnet.la - -libnelnet_la_SOURCES = buf_client.cpp \ - buf_net_base.cpp \ - buf_server.cpp \ - buf_sock.cpp \ - callback_client.cpp \ - callback_net_base.cpp \ - callback_server.cpp \ - dummy_tcp_sock.cpp \ - inet_address.cpp \ - listen_sock.cpp \ - login_client.cpp \ - login_cookie.cpp \ - login_server.cpp \ - message.cpp \ - message_recorder.cpp \ - naming_client.cpp \ - net_displayer.cpp \ - net_log.cpp \ - service.cpp \ - sock.cpp \ - tcp_sock.cpp \ - udp_sock.cpp \ - udp_sim_sock.cpp \ - unitime.cpp \ - unified_network.cpp \ - varpath.cpp \ - transport_class.cpp \ - email.cpp \ - admin.cpp \ - stdin_monitor_thread.cpp \ - stdin_monitor_thread.h \ - module.cpp \ - module_common.cpp \ - module_gateway.cpp \ - module_manager.cpp \ - module_message.cpp \ - module_socket.cpp \ - module_gateway_transport.cpp \ - module_l5_transport.cpp \ - module_local_gateway.cpp \ - stdnet.cpp - -noinst_HEADERS = stdnet.h - -AM_CXXFLAGS = -I$(top_srcdir)/src - -libnelnet_la_LIBADD = -lc -lpthread - -libnelnet_la_LDFLAGS = -version-info @LIBTOOL_VERSION@ - - -# End of Makefile.am - diff --git a/code/nel/src/net/transport_class.cpp b/code/nel/src/net/transport_class.cpp index a5f826728..dca866916 100644 --- a/code/nel/src/net/transport_class.cpp +++ b/code/nel/src/net/transport_class.cpp @@ -77,7 +77,7 @@ string typeToString (CTransportClass::TProp type) string conv[] = { "PropUInt8", "PropUInt16", "PropUInt32", "PropUInt64", "PropSInt8", "PropSInt16", "PropSInt32", "PropSInt64", - "PropBool", "PropFloat", "PropDouble", "PropString", "PropDataSetRow", "PropSheetId", "PropUKN" }; + "PropBool", "PropFloat", "PropDouble", "PropString", "PropDataSetRow", "PropSheetId", "PropUCString", "PropUKN" }; // "PropBool", "PropFloat", "PropDouble", "PropString", "PropDataSetRow", "PropEntityId", "PropSheetId", "PropUKN" }; if (type > CTransportClass::PropUKN) @@ -352,6 +352,7 @@ void CTransportClass::init () // nlassert (PropDataSetRow < PropUKN); DummyProp[PropDataSetRow] = new CTransportClass::CRegisteredProp; // nlassert (PropEntityId < PropUKN); DummyProp[PropEntityId] = new CTransportClass::CRegisteredProp; nlassert (PropSheetId < PropUKN); DummyProp[PropSheetId] = new CTransportClass::CRegisteredProp; + nlassert (PropUCString < PropUKN); DummyProp[PropUCString] = new CTransportClass::CRegisteredProp; // we have to know when a service comes, so add callback (put the callback before all other one because we have to send this message first) CUnifiedNetwork::getInstance()->setServiceUpCallback("*", cbTCUpService, NULL, false); diff --git a/code/nel/src/pacs/CMakeLists.txt b/code/nel/src/pacs/CMakeLists.txt index 0fa059d68..62a809407 100644 --- a/code/nel/src/pacs/CMakeLists.txt +++ b/code/nel/src/pacs/CMakeLists.txt @@ -19,4 +19,7 @@ IF(WITH_PCH) ENDIF(WITH_PCH) NL_GEN_PC(nel-pacs.pc) -INSTALL(TARGETS nelpacs LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) + +IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) + INSTALL(TARGETS nelpacs LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) +ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) diff --git a/code/nel/src/pacs/Makefile.am b/code/nel/src/pacs/Makefile.am deleted file mode 100644 index 0b05a2ed6..000000000 --- a/code/nel/src/pacs/Makefile.am +++ /dev/null @@ -1,69 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -lib_LTLIBRARIES = libnelpacs.la - -libnelpacs_la_SOURCES = chain.cpp \ - chain.h \ - chain_quad.cpp \ - chain_quad.h \ - collision_callback.cpp \ - collision_callback.h \ - collision_desc.cpp \ - collision_desc.h \ - collision_mesh_build.h \ - collision_ot.cpp \ - collision_ot.h \ - collision_surface_temp.cpp \ - collision_surface_temp.h \ - edge_collide.cpp \ - edge_collide.h \ - edge_quad.cpp \ - edge_quad.h \ - exterior_mesh.cpp \ - exterior_mesh.h \ - global_retriever.cpp \ - global_retriever.h \ - local_retriever.cpp \ - local_retriever.h \ - move_cell.cpp \ - move_cell.h \ - move_container.cpp \ - move_container.h \ - move_container_inline.h \ - move_element.cpp \ - move_element.h \ - move_element_inline.h \ - move_primitive.cpp \ - move_primitive.h \ - primitive_world_image.cpp \ - primitive_world_image.h \ - primitive_block_pacs.cpp \ - primitive_block.h \ - retrievable_surface.cpp \ - retrievable_surface.h \ - retriever_bank.cpp \ - retriever_bank.h \ - retriever_instance.cpp \ - retriever_instance.h \ - stdpacs.cpp \ - surface_quad.cpp \ - surface_quad.h \ - vector_2s.cpp \ - vector_2s.h \ - build_indoor.cpp \ - build_indoor.h - -AM_CXXFLAGS = -I$(top_srcdir)/src - -noinst_HEADERS = stdpacs.h face_grid.h quad_grid.h - -libnelpacs_la_LIBADD = -lc - -libnelpacs_la_LDFLAGS = -version-info @LIBTOOL_VERSION@ - - -# End of Makefile.am - diff --git a/code/nel/src/sound/CMakeLists.txt b/code/nel/src/sound/CMakeLists.txt index 9497357ee..21c1de1f8 100644 --- a/code/nel/src/sound/CMakeLists.txt +++ b/code/nel/src/sound/CMakeLists.txt @@ -19,6 +19,9 @@ IF(WITH_PCH) ENDIF(WITH_PCH) NL_GEN_PC(nel-sound.pc) -INSTALL(TARGETS nelsound LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) + +IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) + INSTALL(TARGETS nelsound LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) +ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) ADD_SUBDIRECTORY(driver) diff --git a/code/nel/src/sound/Makefile.am b/code/nel/src/sound/Makefile.am deleted file mode 100644 index b919e10c4..000000000 --- a/code/nel/src/sound/Makefile.am +++ /dev/null @@ -1,75 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -SUBDIRS = driver - -lib_LTLIBRARIES = libnelsnd.la - -libnelsnd_la_SOURCES = async_file_manager_sound.cpp \ - async_file_manager_sound.h \ - audio_mixer_user.cpp \ - audio_mixer_user.h \ - background_sound.cpp \ - background_sound.h \ - background_sound_manager.cpp \ - background_sound_manager.h \ - background_source.cpp \ - background_source.h \ - clustered_sound.cpp \ - clustered_sound.h \ - complex_sound.cpp \ - complex_sound.h \ - complex_source.cpp \ - complex_source.h \ - context_sound.cpp \ - context_sound.h \ - listener_user.cpp \ - listener_user.h \ - mixing_track.cpp \ - mixing_track.h \ - music_channel_fader.h \ - music_channel_fader.cpp \ - music_sound.cpp \ - music_sound.h \ - music_sound_manager.cpp \ - music_sound_manager.h \ - music_source.cpp \ - music_source.h \ - sample_bank.cpp \ - sample_bank.h \ - sample_bank_manager.cpp \ - sample_bank_manager.h \ - simple_sound.cpp \ - simple_sound.h \ - simple_source.cpp \ - simple_source.h \ - sound_animation.cpp \ - sound_anim_manager.cpp \ - sound_anim_marker.cpp \ - sound_bank.cpp \ - sound_bank.h \ - sound.cpp \ - sound.h \ - sound_pattern.h \ - source_common.cpp \ - source_common.h \ - stdsound.cpp \ - stdsound.h \ - stream_source.cpp \ - stream_source.h \ - stream_sound.cpp \ - stream_sound.h - -AM_CXXFLAGS = -I$(top_srcdir)/src - -noinst_HEADERS = stdsound.h - -libnelsnd_la_LIBADD = driver/libnelsnd_lowlevel.la - -libnelsnd_la_LDFLAGS = -version-info @LIBTOOL_VERSION@ - - -# End of Makefile.am - diff --git a/code/nel/src/sound/driver/CMakeLists.txt b/code/nel/src/sound/driver/CMakeLists.txt index c2ae80606..1a8391c41 100644 --- a/code/nel/src/sound/driver/CMakeLists.txt +++ b/code/nel/src/sound/driver/CMakeLists.txt @@ -23,7 +23,9 @@ IF(WITH_PCH) ADD_NATIVE_PRECOMPILED_HEADER(nelsnd_lowlevel ${CMAKE_CURRENT_SOURCE_DIR}/stdsound_lowlevel.h ${CMAKE_CURRENT_SOURCE_DIR}/stdsound_lowlevel.cpp) ENDIF(WITH_PCH) -INSTALL(TARGETS nelsnd_lowlevel LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) +IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) + INSTALL(TARGETS nelsnd_lowlevel LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) +ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) IF(WITH_DRIVER_OPENAL) ADD_SUBDIRECTORY(openal) diff --git a/code/nel/src/sound/driver/Makefile.am b/code/nel/src/sound/driver/Makefile.am deleted file mode 100644 index 0e7325b29..000000000 --- a/code/nel/src/sound/driver/Makefile.am +++ /dev/null @@ -1,26 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = fmod openal dsound - -SUBDIRS = @SOUND_SUBDIRS@ - -noinst_LTLIBRARIES = libnelsnd_lowlevel.la - -libnelsnd_lowlevel_la_SOURCES = buffer.cpp \ - buffer.h \ - effect.h \ - effect.cpp \ - listener.cpp \ - listener.h \ - sound_driver.cpp \ - sound_driver.h \ - source.cpp \ - source.h - -AM_CXXFLAGS = -I$(top_srcdir)/src - -# End of Makefile.am - diff --git a/code/nel/src/sound/driver/dsound/CMakeLists.txt b/code/nel/src/sound/driver/dsound/CMakeLists.txt index f2d13d785..c2fc934dc 100644 --- a/code/nel/src/sound/driver/dsound/CMakeLists.txt +++ b/code/nel/src/sound/driver/dsound/CMakeLists.txt @@ -13,7 +13,9 @@ IF(WITH_PCH) ADD_NATIVE_PRECOMPILED_HEADER(nel_drv_dsound_win ${CMAKE_CURRENT_SOURCE_DIR}/stddsound.h ${CMAKE_CURRENT_SOURCE_DIR}/stddsound.cpp) ENDIF(WITH_PCH) -INSTALL(TARGETS nel_drv_dsound_win RUNTIME DESTINATION bin LIBRARY DESTINATION ${NL_DRIVER_PREFIX} ARCHIVE DESTINATION lib COMPONENT driverssound) -IF(WITH_MAXPLUGIN) - INSTALL(TARGETS nel_drv_dsound_win RUNTIME DESTINATION maxplugin COMPONENT driverssound) -ENDIF(WITH_MAXPLUGIN) +IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC_DRIVERS) OR NOT WITH_STATIC_DRIVERS) + INSTALL(TARGETS nel_drv_dsound_win RUNTIME DESTINATION bin LIBRARY DESTINATION ${NL_DRIVER_PREFIX} ARCHIVE DESTINATION lib COMPONENT driverssound) + IF(WITH_MAXPLUGIN) + INSTALL(TARGETS nel_drv_dsound_win RUNTIME DESTINATION maxplugin COMPONENT driverssound) + ENDIF(WITH_MAXPLUGIN) +ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC_DRIVERS) OR NOT WITH_STATIC_DRIVERS) diff --git a/code/nel/src/sound/driver/fmod/CMakeLists.txt b/code/nel/src/sound/driver/fmod/CMakeLists.txt index 049d8b627..e641a9277 100644 --- a/code/nel/src/sound/driver/fmod/CMakeLists.txt +++ b/code/nel/src/sound/driver/fmod/CMakeLists.txt @@ -13,7 +13,9 @@ IF(WITH_PCH) ADD_NATIVE_PRECOMPILED_HEADER(nel_drv_fmod_win ${CMAKE_CURRENT_SOURCE_DIR}/stdfmod.h ${CMAKE_CURRENT_SOURCE_DIR}/stdfmod.cpp) ENDIF(WITH_PCH) -INSTALL(TARGETS nel_drv_fmod_win RUNTIME DESTINATION bin LIBRARY DESTINATION ${NL_DRIVER_PREFIX} ARCHIVE DESTINATION lib COMPONENT driverssound) -IF(WITH_MAXPLUGIN) - INSTALL(TARGETS nel_drv_fmod_win RUNTIME DESTINATION maxplugin COMPONENT driverssound) -ENDIF(WITH_MAXPLUGIN) +IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC_DRIVERS) OR NOT WITH_STATIC_DRIVERS) + INSTALL(TARGETS nel_drv_fmod_win RUNTIME DESTINATION bin LIBRARY DESTINATION ${NL_DRIVER_PREFIX} ARCHIVE DESTINATION lib COMPONENT driverssound) + IF(WITH_MAXPLUGIN) + INSTALL(TARGETS nel_drv_fmod_win RUNTIME DESTINATION maxplugin COMPONENT driverssound) + ENDIF(WITH_MAXPLUGIN) +ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC_DRIVERS) OR NOT WITH_STATIC_DRIVERS) diff --git a/code/nel/src/sound/driver/fmod/Makefile.am b/code/nel/src/sound/driver/fmod/Makefile.am deleted file mode 100644 index 505c77173..000000000 --- a/code/nel/src/sound/driver/fmod/Makefile.am +++ /dev/null @@ -1,32 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -lib_LTLIBRARIES = libnel_drv_fmod.la - -libnel_drv_fmod_la_SOURCES = buffer_fmod.cpp \ - buffer_fmod.h \ - listener_fmod.cpp \ - listener_fmod.h \ - music_channel_fmod.cpp \ - music_channel_fmod.h \ - sound_driver_fmod.cpp \ - sound_driver_fmod.h \ - source_fmod.cpp \ - source_fmod.h \ - stdfmod.cpp \ - stdfmod.h - - -AM_CXXFLAGS = -I$(top_srcdir)/src @FMOD_CFLAGS@ - -noinst_HEADERS = stdfmod.h - -libnel_drv_fmod_la_LIBADD = @FMOD_LIBS@ - -libnel_drv_fmod_la_LDFLAGS = -version-info @LIBTOOL_VERSION@ - - -# End of Makefile.am - diff --git a/code/nel/src/sound/driver/openal/CMakeLists.txt b/code/nel/src/sound/driver/openal/CMakeLists.txt index 53b0c8c2a..47ce5b24f 100644 --- a/code/nel/src/sound/driver/openal/CMakeLists.txt +++ b/code/nel/src/sound/driver/openal/CMakeLists.txt @@ -44,7 +44,9 @@ IF(WITH_PCH) ADD_NATIVE_PRECOMPILED_HEADER(${NLDRV_AL_LIB} ${CMAKE_CURRENT_SOURCE_DIR}/stdopenal.h ${CMAKE_CURRENT_SOURCE_DIR}/stdopenal.cpp) ENDIF(WITH_PCH) -INSTALL(TARGETS ${NLDRV_AL_LIB} RUNTIME DESTINATION bin LIBRARY DESTINATION ${NL_DRIVER_PREFIX} ARCHIVE DESTINATION lib COMPONENT driverssound) -IF(WITH_MAXPLUGIN) - INSTALL(TARGETS ${NLDRV_AL_LIB} RUNTIME DESTINATION maxplugin COMPONENT driverssound) -ENDIF(WITH_MAXPLUGIN) +IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC_DRIVERS) OR NOT WITH_STATIC_DRIVERS) + INSTALL(TARGETS ${NLDRV_AL_LIB} RUNTIME DESTINATION ${NL_DRIVER_PREFIX} LIBRARY DESTINATION ${NL_DRIVER_PREFIX} ARCHIVE DESTINATION lib COMPONENT driverssound) + IF(WITH_MAXPLUGIN) + INSTALL(TARGETS ${NLDRV_AL_LIB} RUNTIME DESTINATION maxplugin COMPONENT driverssound) + ENDIF(WITH_MAXPLUGIN) +ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC_DRIVERS) OR NOT WITH_STATIC_DRIVERS) diff --git a/code/nel/src/sound/driver/openal/Makefile.am b/code/nel/src/sound/driver/openal/Makefile.am deleted file mode 100644 index 559a26370..000000000 --- a/code/nel/src/sound/driver/openal/Makefile.am +++ /dev/null @@ -1,30 +0,0 @@ -# -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = driver_openal.def driver_openal.dsp driver_openal.vcproj - -lib_LTLIBRARIES = libnel_drv_openal.la - -libnel_drv_openal_la_SOURCES = buffer_al.cpp \ - buffer_al.h \ - listener_al.cpp \ - listener_al.h \ - sound_driver_al.cpp \ - sound_driver_al.h \ - source_al.cpp \ - source_al.h \ - stdopenal.h - -AM_CXXFLAGS = -I$(top_srcdir)/src @OPENAL_CFLAGS@ @OGG_CFLAGS@ @VORBIS_CFLAGS@ - -noinst_HEADERS = stdopenal.h - -libnel_drv_openal_la_LIBADD = @OPENAL_LIBS@ @OGG_LIBS@ @VORBIS_LIBS@ - -libnel_drv_openal_la_LDFLAGS = -version-info @LIBTOOL_VERSION@ - - -# End of Makefile.am - diff --git a/code/nel/src/sound/driver/xaudio2/CMakeLists.txt b/code/nel/src/sound/driver/xaudio2/CMakeLists.txt index 5e45a9809..eb342a4df 100644 --- a/code/nel/src/sound/driver/xaudio2/CMakeLists.txt +++ b/code/nel/src/sound/driver/xaudio2/CMakeLists.txt @@ -40,7 +40,9 @@ IF(WITH_PCH) ADD_NATIVE_PRECOMPILED_HEADER(nel_drv_xaudio2_win ${CMAKE_CURRENT_SOURCE_DIR}/stdxaudio2.h ${CMAKE_CURRENT_SOURCE_DIR}/stdxaudio2.cpp) ENDIF(WITH_PCH) -INSTALL(TARGETS nel_drv_xaudio2_win RUNTIME DESTINATION bin LIBRARY DESTINATION ${NL_DRIVER_PREFIX} ARCHIVE DESTINATION lib COMPONENT driverssound) -IF(WITH_MAXPLUGIN) - INSTALL(TARGETS nel_drv_xaudio2_win RUNTIME DESTINATION maxplugin COMPONENT driverssound) -ENDIF(WITH_MAXPLUGIN) +IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC_DRIVERS) OR NOT WITH_STATIC_DRIVERS) + INSTALL(TARGETS nel_drv_xaudio2_win RUNTIME DESTINATION bin LIBRARY DESTINATION ${NL_DRIVER_PREFIX} ARCHIVE DESTINATION lib COMPONENT driverssound) + IF(WITH_MAXPLUGIN) + INSTALL(TARGETS nel_drv_xaudio2_win RUNTIME DESTINATION maxplugin COMPONENT driverssound) + ENDIF(WITH_MAXPLUGIN) +ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC_DRIVERS) OR NOT WITH_STATIC_DRIVERS) diff --git a/code/nel/tools/3d/Makefile.am b/code/nel/tools/3d/Makefile.am deleted file mode 100644 index 7cde91464..000000000 --- a/code/nel/tools/3d/Makefile.am +++ /dev/null @@ -1,32 +0,0 @@ -# -# $Id: Makefile.am,v 1.2 2002/05/14 13:33:59 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -DIST_SUBDIRS = build_coarse_mesh \ - build_far_bank \ - build_smallbank \ - ig_lighter_lib \ - ig_lighter \ - panoply_maker \ - zone_lib \ - zone_dependencies \ - zone_ig_lighter \ - zone_lighter \ - zone_welder - -SUBDIRS = build_coarse_mesh \ - build_far_bank \ - build_smallbank \ - ig_lighter_lib \ - ig_lighter \ - zone_lib \ - zone_dependencies \ - zone_ig_lighter \ - zone_lighter \ - zone_welder - - -# End of Makefile.am - diff --git a/code/nel/tools/3d/build_coarse_mesh/Makefile.am b/code/nel/tools/3d/build_coarse_mesh/Makefile.am deleted file mode 100644 index b161e1b59..000000000 --- a/code/nel/tools/3d/build_coarse_mesh/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2002/05/13 15:44:57 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = build.cfg \ - build_coarse_mesh.dsp - -bin_PROGRAMS = build_coarse_mesh - -build_coarse_mesh_SOURCES = build_coarse_mesh.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src - -build_coarse_mesh_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/3d/libnel3d.la - - -# End of Makefile.am - diff --git a/code/nel/tools/3d/build_far_bank/Makefile.am b/code/nel/tools/3d/build_far_bank/Makefile.am deleted file mode 100644 index 9dd0eadec..000000000 --- a/code/nel/tools/3d/build_far_bank/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2002/05/13 15:44:57 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = build_far_bank.dsp - -bin_PROGRAMS = build_far_bank - -build_far_bank_SOURCES = build_far_bank.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src - -build_far_bank_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/3d/libnel3d.la - - -# End of Makefile.am - diff --git a/code/nel/tools/3d/build_smallbank/Makefile.am b/code/nel/tools/3d/build_smallbank/Makefile.am deleted file mode 100644 index f70258cb6..000000000 --- a/code/nel/tools/3d/build_smallbank/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2002/05/13 15:44:57 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = build_smallbank.dsp - -bin_PROGRAMS = build_smallbank - -build_smallbank_SOURCES = build_smallbank.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src - -build_smallbank_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/3d/libnel3d.la - - -# End of Makefile.am - diff --git a/code/nel/tools/3d/ig_lighter/Makefile.am b/code/nel/tools/3d/ig_lighter/Makefile.am deleted file mode 100644 index ccde76fd0..000000000 --- a/code/nel/tools/3d/ig_lighter/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2002/05/13 15:44:57 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = config.cfg \ - ig_lighter.dsp - -bin_PROGRAMS = ig_lighter - -ig_lighter_SOURCES = ig_lighter.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src - -ig_lighter_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/3d/libnel3d.la \ - ../../../src/pacs/libnelpacs.la \ - ../ig_lighter_lib/libig_lighter.la - - -# End of Makefile.am - diff --git a/code/nel/tools/3d/ig_lighter_lib/Makefile.am b/code/nel/tools/3d/ig_lighter_lib/Makefile.am deleted file mode 100644 index e66b9a94b..000000000 --- a/code/nel/tools/3d/ig_lighter_lib/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2002/05/13 15:44:57 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = ig_lighter_lib.dsp - -noinst_LTLIBRARIES = libig_lighter.la - -libig_lighter_la_SOURCES = ig_lighter_lib.cpp - -noinst_HEADERS = ig_lighter_lib.h - -AM_CXXFLAGS = -I$(top_srcdir)/src - -libig_lighter_la_LIBADD = ../../../src/misc/libnelmisc.la \ - ../../../src/3d/libnel3d.la \ - ../../../src/pacs/libnelpacs.la - - -# End of Makefile.am - diff --git a/code/nel/tools/3d/ligo/plugin_max/DllEntry.cpp b/code/nel/tools/3d/ligo/plugin_max/DllEntry.cpp index 3cf88f4a7..ee9964566 100644 --- a/code/nel/tools/3d/ligo/plugin_max/DllEntry.cpp +++ b/code/nel/tools/3d/ligo/plugin_max/DllEntry.cpp @@ -18,6 +18,7 @@ #include "nel/misc/app_context.h" #include #include "../../plugin_max/nel_3dsmax_shared/nel_3dsmax_shared.h" +#include extern ClassDesc2* GetLigoscapeDesc(); @@ -44,7 +45,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL,ULONG fdwReason,LPVOID lpvReserved) if (!controlsInit) { controlsInit = TRUE; +#if MAX_VERSION_MAJOR < 14 InitCustomControls(hInstance); // Initialize MAX's custom controls +#endif InitCommonControls(); // Initialize Win95 controls } diff --git a/code/nel/tools/3d/ligo/plugin_max/max_to_ligo.cpp b/code/nel/tools/3d/ligo/plugin_max/max_to_ligo.cpp index 7500b027b..eb4951991 100644 --- a/code/nel/tools/3d/ligo/plugin_max/max_to_ligo.cpp +++ b/code/nel/tools/3d/ligo/plugin_max/max_to_ligo.cpp @@ -17,7 +17,12 @@ #include // From MAXSDK -#include +#include +#if MAX_VERSION_MAJOR >= 14 +# include +#else +# include +#endif #include "max_to_ligo.h" diff --git a/code/nel/tools/3d/ligo/plugin_max/script.cpp b/code/nel/tools/3d/ligo/plugin_max/script.cpp index 5d6381303..b00de5fe4 100644 --- a/code/nel/tools/3d/ligo/plugin_max/script.cpp +++ b/code/nel/tools/3d/ligo/plugin_max/script.cpp @@ -19,17 +19,30 @@ #include // Various MAX and MXS includes -#include -#include -#include -#include -#include -#include -#include -#include +#include +#if MAX_VERSION_MAJOR >= 14 +# include +# include +# include +# include +# include +# include +# include +# include +# include +#else +# include +# include +# include +# include +# include +# include +# include +# include +# include +#endif #include #include -#include // Visual #include diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/CMakeLists.txt new file mode 100644 index 000000000..2caaa1be7 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/CMakeLists.txt @@ -0,0 +1 @@ +ADD_SUBDIRECTORY(qtpropertybrowser) diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/CMakeLists.txt new file mode 100644 index 000000000..f4ed13e0a --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/CMakeLists.txt @@ -0,0 +1,98 @@ +INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${QT_INCLUDES}) +INCLUDE(${QT_USE_FILE}) + +FILE(GLOB SRC *.cpp *.h) + +SET(QT_PROPERTY_EDITOR_HDR qtpropertybrowser.h + qtpropertymanager.h + qteditorfactory.h + qtvariantproperty.h + qttreepropertybrowser.h + qtbuttonpropertybrowser.h + qtgroupboxpropertybrowser.h + qtpropertybrowserutils_p.h) + +SET(QT_PROPERTY_EDITOR_RCS qtpropertybrowser.qrc) + +SET(QT_USE_QTGUI TRUE) + +QT4_ADD_RESOURCES(QT_PROPERTY_EDITOR_RC_SRCS ${QT_PROPERTY_EDITOR_RCS}) +QT4_WRAP_CPP(QT_PROPERTY_EDITOR_MOC_SRC ${QT_PROPERTY_EDITOR_HDR}) + +SOURCE_GROUP(QtResources FILES ${QT_PROPERTY_EDITOR_RCS}) +SOURCE_GROUP(QtGeneratedMocSrc FILES ${QT_PROPERTY_EDITOR_MOC_SRC}) +SOURCE_GROUP("Qt Property Editor Source" FILES ${SRC}) + +qt4_generate_moc(qtpropertymanager.cpp ${CMAKE_CURRENT_BINARY_DIR}/qtpropertymanager.moc) +qt4_generate_moc(qteditorfactory.cpp ${CMAKE_CURRENT_BINARY_DIR}/qteditorfactory.moc) +qt4_generate_moc(qttreepropertybrowser.cpp ${CMAKE_CURRENT_BINARY_DIR}/qttreepropertybrowser.moc) + +# Need to remove these so that they are not linked as they are inline included. +LIST(REMOVE_ITEM QT_PROPERTY_EDITOR_MOC_SRC ${CMAKE_CURRENT_BINARY_DIR}/moc_qtbuttonpropertybrowser.cxx + ${CMAKE_CURRENT_BINARY_DIR}/moc_qteditorfactory.cxx + ${CMAKE_CURRENT_BINARY_DIR}/moc_qtgroupboxpropertybrowser.cxx + ${CMAKE_CURRENT_BINARY_DIR}/moc_qtpropertybrowser.cxx + ${CMAKE_CURRENT_BINARY_DIR}/moc_qtpropertymanager.cxx + ${CMAKE_CURRENT_BINARY_DIR}/moc_qttreepropertybrowser.cxx + ${CMAKE_CURRENT_BINARY_DIR}/moc_qtvariantproperty.cxx) + +# We need to add new depencencies on removed files because we need them to be still generated +SET_PROPERTY(SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/qtbuttonpropertybrowser.cpp APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/moc_qtbuttonpropertybrowser.cxx) +SET_PROPERTY(SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/qteditorfactory.cpp APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/moc_qteditorfactory.cxx) +SET_PROPERTY(SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/qtgroupboxpropertybrowser.cpp APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/moc_qtgroupboxpropertybrowser.cxx) +SET_PROPERTY(SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/qtpropertybrowser.cpp APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/moc_qtpropertybrowser.cxx) +SET_PROPERTY(SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/qtpropertymanager.cpp APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/moc_qtpropertymanager.cxx) +SET_PROPERTY(SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/qttreepropertybrowser.cpp APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/moc_qttreepropertybrowser.cxx) +SET_PROPERTY(SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/qtvariantproperty.cpp APPEND PROPERTY OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/moc_qtvariantproperty.cxx) + +#set( +# qtpropertyeditor_HEADERS_ONLY_MOC +# ${CMAKE_CURRENT_BINARY_DIR}/moc_qtpropertybrowser.cpp +# ${CMAKE_CURRENT_BINARY_DIR}/moc_qtpropertymanager.cpp +# ${CMAKE_CURRENT_BINARY_DIR}/moc_qteditorfactory.cpp +# ${CMAKE_CURRENT_BINARY_DIR}/moc_qtvariantproperty.cpp +# ${CMAKE_CURRENT_BINARY_DIR}/moc_qttreepropertybrowser.cpp +# ${CMAKE_CURRENT_BINARY_DIR}/moc_qtbuttonpropertybrowser.cpp +# ${CMAKE_CURRENT_BINARY_DIR}/moc_qtgroupboxpropertybrowser.cpp +# ${CMAKE_CURRENT_BINARY_DIR}/qtpropertymanager.moc +# ${CMAKE_CURRENT_BINARY_DIR}/qteditorfactory.moc +# ${CMAKE_CURRENT_BINARY_DIR}/qttreepropertybrowser.moc +#) +# +#set_source_files_properties( +# ${qtpropertyeditor_HEADERS_ONLY_MOC} +# PROPERTIES +# HEADER_FILE_ONLY true +#) +# + +#set( +# qtpropertyeditor_HEADERS_MOC +# ${CMAKE_CURRENT_BINARY_DIR}/moc_qtpropertybrowserutils_p.cpp +#) + +#set( +# qtpropertyeditor_MOC +# ${qtpropertyeditor_HEADERS_MOC} +# ${qtpropertyeditor_HEADERS_ONLY_MOC} +#) + +ADD_LIBRARY(qt_property_browser SHARED ${SRC} + ${QT_PROPERTY_EDITOR_MOC_SRC} + ${QT_PROPERTY_EDITOR_RC_SRCS} + ${CMAKE_CURRENT_BINARY_DIR}/qtpropertymanager.moc + ${CMAKE_CURRENT_BINARY_DIR}/qttreepropertybrowser.moc + ${CMAKE_CURRENT_BINARY_DIR}/qteditorfactory.moc) + +TARGET_LINK_LIBRARIES(qt_property_browser ${QT_LIBRARIES}) + +ADD_DEFINITIONS(${QT_DEFINITIONS}) +ADD_DEFINITIONS(-DQT_DLL) +ADD_DEFINITIONS(-DQT_QTPROPERTYBROWSER_EXPORT) +ADD_DEFINITIONS(-DQT_PLUGIN) +#ADD_DEFINITIONS(-DQT_NO_DEBUG) +ADD_DEFINITIONS(-DQT_SHARED) + +NL_DEFAULT_PROPS(qt_property_browser "3rdParty: Qt Property Browser 2.5") +NL_ADD_RUNTIME_FLAGS(qt_property_browser) +NL_ADD_LIB_SUFFIX(qt_property_browser) diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/LGPL_EXCEPTION.txt b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/LGPL_EXCEPTION.txt new file mode 100644 index 000000000..0b56ff1ef --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/LGPL_EXCEPTION.txt @@ -0,0 +1,10 @@ +Nokia Qt LGPL Exception version 1.0 + +As a special exception to the GNU Lesser General Public License +version 2.1, the object code form of a "work that uses the Library" +may incorporate material from a header file that is part of the +Library. You may distribute such object code under terms of your +choice, provided that the incorporated material (i) does not exceed +more than 5% of the total size of the Library; and (ii) is limited to +numerical parameters, data structure layouts, accessors, macros, +inline functions and templates. diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/LICENSE.GPL3 b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/LICENSE.GPL3 new file mode 100644 index 000000000..94a9ed024 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/LICENSE.GPL3 @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/LICENSE.LGPL b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/LICENSE.LGPL new file mode 100644 index 000000000..5ab7695ab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/LICENSE.LGPL @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtAbstractEditorFactoryBase b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtAbstractEditorFactoryBase new file mode 100644 index 000000000..ab4e7104a --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtAbstractEditorFactoryBase @@ -0,0 +1 @@ +#include "qtpropertybrowser.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtAbstractPropertyBrowser b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtAbstractPropertyBrowser new file mode 100644 index 000000000..ab4e7104a --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtAbstractPropertyBrowser @@ -0,0 +1 @@ +#include "qtpropertybrowser.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtAbstractPropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtAbstractPropertyManager new file mode 100644 index 000000000..ab4e7104a --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtAbstractPropertyManager @@ -0,0 +1 @@ +#include "qtpropertybrowser.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtBoolPropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtBoolPropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtBoolPropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtBrowserItem b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtBrowserItem new file mode 100644 index 000000000..ab4e7104a --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtBrowserItem @@ -0,0 +1 @@ +#include "qtpropertybrowser.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtButtonPropertyBrowser b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtButtonPropertyBrowser new file mode 100644 index 000000000..56e089704 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtButtonPropertyBrowser @@ -0,0 +1 @@ +#include "qtbuttonpropertybrowser.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCharEditorFactory b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCharEditorFactory new file mode 100644 index 000000000..75f35adab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCharEditorFactory @@ -0,0 +1 @@ +#include "qteditorfactory.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCharPropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCharPropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCharPropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCheckBoxFactory b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCheckBoxFactory new file mode 100644 index 000000000..75f35adab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCheckBoxFactory @@ -0,0 +1 @@ +#include "qteditorfactory.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtColorEditorFactory b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtColorEditorFactory new file mode 100644 index 000000000..75f35adab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtColorEditorFactory @@ -0,0 +1 @@ +#include "qteditorfactory.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtColorPropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtColorPropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtColorPropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCursorEditorFactory b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCursorEditorFactory new file mode 100644 index 000000000..75f35adab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCursorEditorFactory @@ -0,0 +1 @@ +#include "qteditorfactory.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCursorPropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCursorPropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtCursorPropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDateEditFactory b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDateEditFactory new file mode 100644 index 000000000..75f35adab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDateEditFactory @@ -0,0 +1 @@ +#include "qteditorfactory.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDatePropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDatePropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDatePropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDateTimeEditFactory b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDateTimeEditFactory new file mode 100644 index 000000000..75f35adab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDateTimeEditFactory @@ -0,0 +1 @@ +#include "qteditorfactory.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDateTimePropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDateTimePropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDateTimePropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDoublePropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDoublePropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDoublePropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDoubleSpinBoxFactory b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDoubleSpinBoxFactory new file mode 100644 index 000000000..75f35adab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtDoubleSpinBoxFactory @@ -0,0 +1 @@ +#include "qteditorfactory.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtEnumEditorFactory b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtEnumEditorFactory new file mode 100644 index 000000000..75f35adab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtEnumEditorFactory @@ -0,0 +1 @@ +#include "qteditorfactory.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtEnumPropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtEnumPropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtEnumPropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtFlagPropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtFlagPropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtFlagPropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtFontEditorFactory b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtFontEditorFactory new file mode 100644 index 000000000..75f35adab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtFontEditorFactory @@ -0,0 +1 @@ +#include "qteditorfactory.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtFontPropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtFontPropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtFontPropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtGroupBoxPropertyBrowser b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtGroupBoxPropertyBrowser new file mode 100644 index 000000000..27964c080 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtGroupBoxPropertyBrowser @@ -0,0 +1 @@ +#include "qtgroupboxpropertybrowser.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtGroupPropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtGroupPropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtGroupPropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtIntPropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtIntPropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtIntPropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtKeySequenceEditorFactory b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtKeySequenceEditorFactory new file mode 100644 index 000000000..75f35adab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtKeySequenceEditorFactory @@ -0,0 +1 @@ +#include "qteditorfactory.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtKeySequencePropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtKeySequencePropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtKeySequencePropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtLineEditFactory b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtLineEditFactory new file mode 100644 index 000000000..75f35adab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtLineEditFactory @@ -0,0 +1 @@ +#include "qteditorfactory.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtLocalePropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtLocalePropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtLocalePropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtPointFPropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtPointFPropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtPointFPropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtPointPropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtPointPropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtPointPropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtProperty b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtProperty new file mode 100644 index 000000000..ab4e7104a --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtProperty @@ -0,0 +1 @@ +#include "qtpropertybrowser.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtRectFPropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtRectFPropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtRectFPropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtRectPropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtRectPropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtRectPropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtScrollBarFactory b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtScrollBarFactory new file mode 100644 index 000000000..75f35adab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtScrollBarFactory @@ -0,0 +1 @@ +#include "qteditorfactory.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSizeFPropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSizeFPropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSizeFPropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSizePolicyPropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSizePolicyPropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSizePolicyPropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSizePropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSizePropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSizePropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSliderFactory b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSliderFactory new file mode 100644 index 000000000..75f35adab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSliderFactory @@ -0,0 +1 @@ +#include "qteditorfactory.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSpinBoxFactory b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSpinBoxFactory new file mode 100644 index 000000000..75f35adab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtSpinBoxFactory @@ -0,0 +1 @@ +#include "qteditorfactory.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtStringPropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtStringPropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtStringPropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtTimeEditFactory b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtTimeEditFactory new file mode 100644 index 000000000..75f35adab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtTimeEditFactory @@ -0,0 +1 @@ +#include "qteditorfactory.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtTimePropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtTimePropertyManager new file mode 100644 index 000000000..1842e431d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtTimePropertyManager @@ -0,0 +1 @@ +#include "qtpropertymanager.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtTreePropertyBrowser b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtTreePropertyBrowser new file mode 100644 index 000000000..aab106c75 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtTreePropertyBrowser @@ -0,0 +1 @@ +#include "qttreepropertybrowser.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtVariantEditorFactory b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtVariantEditorFactory new file mode 100644 index 000000000..8118190d5 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtVariantEditorFactory @@ -0,0 +1 @@ +#include "qtvariantproperty.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtVariantProperty b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtVariantProperty new file mode 100644 index 000000000..8118190d5 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtVariantProperty @@ -0,0 +1 @@ +#include "qtvariantproperty.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtVariantPropertyManager b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtVariantPropertyManager new file mode 100644 index 000000000..8118190d5 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/QtVariantPropertyManager @@ -0,0 +1 @@ +#include "qtvariantproperty.h" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/README.TXT b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/README.TXT new file mode 100644 index 000000000..d9452cfc1 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/README.TXT @@ -0,0 +1,19 @@ +Property Browser v2.5 + +A property browser framework enabling the user to edit a set of +properties. + +The framework provides a browser widget that displays the given +properties with labels and corresponding editing widgets (e.g. +line edits or comboboxes). The various types of editing widgets +are provided by the framework's editor factories: For each +property type, the framework provides a property manager (e.g. +QtIntPropertyManager and QtStringPropertyManager) which can be +associated with the preferred editor factory (e.g. +QtSpinBoxFactory and QtLineEditFactory). The framework also +provides a variant based property type with corresponding variant +manager and factory. Finally, the framework provides three +ready-made implementations of the browser widget: +QtTreePropertyBrowser, QtButtonPropertyBrowser and +QtGroupBoxPropertyBrowser. + diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-arrow.png b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..a69ef4eb6158503c7c67c916aea86e65fdc81f72 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~)3?z59=Y9ZEoB=)|uK&RR$m{!Z_zjR^ED7=p zW^j0RBMrz2@N{tusfe>Zw~@EOfQR+sk_Oou&-fjcEVpj<&$!X3+c~E>J1*JV{%`IM zZgwlFFx}G*?uS>UO1?P#t>x;u4TbmfTg6u$kN3O$qTon=;uum9xAyEt-c|zv=78lpdFvQ2-{H`#GwYbpmwD+D`;ru|4Sly6 z!u|DfH10id;EhPQ?!aC0$4imznq|kzoDQ|k!q4v~%5Ey$Ds|~#XU>6Rfw7|8GuZ2t ub|G literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-closedhand.png b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-closedhand.png new file mode 100644 index 0000000000000000000000000000000000000000..b78dd1dac5a827fa698f1993718f22c282019505 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6I14-?iy0WWJ3*My{N(AiKtWee z7sn8d^J_1j=3-FbaJl&N|NMQrDg{-+lDl3uEOL6iyxxIhJsV5IbqBU04WsP|EmPEI sG+%tqc!TF=!@MiLH_pW!e7ccq3Qxekuk)up2O7xW>FVdQ&MBb@057mJumAu6 literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-cross.png b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-cross.png new file mode 100644 index 0000000000000000000000000000000000000000..fe38e744805f61abefcc555e07d399725c3fd7e6 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~)3?z59=Y9ZEoB=)|uK&RR$m{!Z_zjR^ED7=p zW^j0RBMrz=_jGX#;h346aDZ1vLF6&ZrWY3kt_3XM>{%UFuy$6%gUPvacWfgV8N9#n V_FPj?S`E~~;OXk;vd$@?2>`R9Dxv@Y literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-forbidden.png b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-forbidden.png new file mode 100644 index 0000000000000000000000000000000000000000..2b08c4e2a3cafc992459a8f484e6c8e6c3e74857 GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~)3?z59=Y9ZEoB=)|uK&RR$m{!Z_zjR^ED7=p zW^j0RBMr#O@pN$vsfa5*w~^P`kb@;)w}Ny_&ztDY@kvlRIOU`3qAsV; zTo+`Y{*UQrTXjS>sKxPHd$OYcrG25=M&E9}?0tT1Yy7oqDMB$hU$uYoMqOpDnka4~ qygb6(Z%*F(qx}EZO#W7L6_Nk?#pi+cGI+ZBxvX&}>iqs75rOW+zd6_S+ yS|~6}xHpZ9x7T5rLt)D22WQ%mvv4FO#t=)GwlEX literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-ibeam.png b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-ibeam.png new file mode 100644 index 0000000000000000000000000000000000000000..097fc5fa7287da71ffd907b3a11adbda4516aca6 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~)3?z59=Y9ZEoB=)|uK)l42QqgTe~DWM4f DkdQT7 literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-sizeall.png b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-sizeall.png new file mode 100644 index 0000000000000000000000000000000000000000..69f13eb347a6c299e06844729a14f657b282fe8f GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~)3?z59=Y9ZEoB=)|uK)l42Qq(Z!J(8lD*)YR5__{zaA2hTRnmr4+Dcjj*u+}&-pB%i42~uelF{r5}E+x CJu-a& literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-sizef.png b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-sizef.png new file mode 100644 index 0000000000000000000000000000000000000000..3b127a05d34b48a2f4f9b9cc77b681c6b43afcdd GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~)3?z59=Y9ZEoB=)|uK)l42QqD?iBlbDB7>)^pUXO@geCxo C3NS_h literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-sizeh.png b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-sizeh.png new file mode 100644 index 0000000000000000000000000000000000000000..a9f40cbc3d77c566c11c32c0631b4f94f44dd441 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~)3?z59=Y9ZEoB=)|uK)l42Qq&V7RQzr9bPir8&?922WQ%mvv4FO#sHOC(Zx> literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-sizev.png b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-sizev.png new file mode 100644 index 0000000000000000000000000000000000000000..1edbab27a5b05555aaf515931f69ad6bf7e417f0 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~)3?z59=Y9ZEoB=)|uK)l42QqM`U1 literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-wait.png b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-wait.png new file mode 100644 index 0000000000000000000000000000000000000000..69056c479e9b2f009e366dfd71999a7c74f97620 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~)3?z59=Y9ZEoB=)|uK&RR$m{!Z_zjR^ED7=p zW^j0RBMrz2^mK6y;h346;J_ZVI&3Y=<%J7po~YS&;ev>WRgqc?pLgqp;N^OZ7kj)9 zt2OYRn)8&w&_Fn;AZ-e>OWiG&j$ap41wJoZG>h5TTvwNMesusN!}2q-U)D!*O8^aL N@O1TaS?83{1OR$JJ0<`C literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-whatsthis.png b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/images/cursor-whatsthis.png new file mode 100644 index 0000000000000000000000000000000000000000..b47601c3780eec780fdae43bab7481bbfebdddae GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$ef*Z*JuL59RLGuTpf8VsdEq+OT~Tw87C;38om{D5bL fNHFu^21W*zFY +#include +#include +#include +#include +#include +#include + +#if QT_VERSION >= 0x040400 +QT_BEGIN_NAMESPACE +#endif + +class QtButtonPropertyBrowserPrivate +{ + QtButtonPropertyBrowser *q_ptr; + Q_DECLARE_PUBLIC(QtButtonPropertyBrowser) +public: + + void init(QWidget *parent); + + void propertyInserted(QtBrowserItem *index, QtBrowserItem *afterIndex); + void propertyRemoved(QtBrowserItem *index); + void propertyChanged(QtBrowserItem *index); + QWidget *createEditor(QtProperty *property, QWidget *parent) const + { return q_ptr->createEditor(property, parent); } + + void slotEditorDestroyed(); + void slotUpdate(); + void slotToggled(bool checked); + + struct WidgetItem + { + WidgetItem() : widget(0), label(0), widgetLabel(0), + button(0), container(0), layout(0), /*line(0), */parent(0), expanded(false) { } + QWidget *widget; // can be null + QLabel *label; // main label with property name + QLabel *widgetLabel; // label substitute showing the current value if there is no widget + QToolButton *button; // expandable button for items with children + QWidget *container; // container which is expanded when the button is clicked + QGridLayout *layout; // layout in container + WidgetItem *parent; + QList children; + bool expanded; + }; +private: + void updateLater(); + void updateItem(WidgetItem *item); + void insertRow(QGridLayout *layout, int row) const; + void removeRow(QGridLayout *layout, int row) const; + int gridRow(WidgetItem *item) const; + int gridSpan(WidgetItem *item) const; + void setExpanded(WidgetItem *item, bool expanded); + QToolButton *createButton(QWidget *panret = 0) const; + + QMap m_indexToItem; + QMap m_itemToIndex; + QMap m_widgetToItem; + QMap m_buttonToItem; + QGridLayout *m_mainLayout; + QList m_children; + QList m_recreateQueue; +}; + +QToolButton *QtButtonPropertyBrowserPrivate::createButton(QWidget *parent) const +{ + QToolButton *button = new QToolButton(parent); + button->setCheckable(true); + button->setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed)); + button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + button->setArrowType(Qt::DownArrow); + button->setIconSize(QSize(3, 16)); + /* + QIcon icon; + icon.addPixmap(q_ptr->style()->standardPixmap(QStyle::SP_ArrowDown), QIcon::Normal, QIcon::Off); + icon.addPixmap(q_ptr->style()->standardPixmap(QStyle::SP_ArrowUp), QIcon::Normal, QIcon::On); + button->setIcon(icon); + */ + return button; +} + +int QtButtonPropertyBrowserPrivate::gridRow(WidgetItem *item) const +{ + QList siblings; + if (item->parent) + siblings = item->parent->children; + else + siblings = m_children; + + int row = 0; + QListIterator it(siblings); + while (it.hasNext()) { + WidgetItem *sibling = it.next(); + if (sibling == item) + return row; + row += gridSpan(sibling); + } + return -1; +} + +int QtButtonPropertyBrowserPrivate::gridSpan(WidgetItem *item) const +{ + if (item->container && item->expanded) + return 2; + return 1; +} + +void QtButtonPropertyBrowserPrivate::init(QWidget *parent) +{ + m_mainLayout = new QGridLayout(); + parent->setLayout(m_mainLayout); + QLayoutItem *item = new QSpacerItem(0, 0, + QSizePolicy::Fixed, QSizePolicy::Expanding); + m_mainLayout->addItem(item, 0, 0); +} + +void QtButtonPropertyBrowserPrivate::slotEditorDestroyed() +{ + QWidget *editor = qobject_cast(q_ptr->sender()); + if (!editor) + return; + if (!m_widgetToItem.contains(editor)) + return; + m_widgetToItem[editor]->widget = 0; + m_widgetToItem.remove(editor); +} + +void QtButtonPropertyBrowserPrivate::slotUpdate() +{ + QListIterator itItem(m_recreateQueue); + while (itItem.hasNext()) { + WidgetItem *item = itItem.next(); + + WidgetItem *parent = item->parent; + QWidget *w = 0; + QGridLayout *l = 0; + const int oldRow = gridRow(item); + if (parent) { + w = parent->container; + l = parent->layout; + } else { + w = q_ptr; + l = m_mainLayout; + } + + int span = 1; + if (!item->widget && !item->widgetLabel) + span = 2; + item->label = new QLabel(w); + item->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); + l->addWidget(item->label, oldRow, 0, 1, span); + + updateItem(item); + } + m_recreateQueue.clear(); +} + +void QtButtonPropertyBrowserPrivate::setExpanded(WidgetItem *item, bool expanded) +{ + if (item->expanded == expanded) + return; + + if (!item->container) + return; + + item->expanded = expanded; + const int row = gridRow(item); + WidgetItem *parent = item->parent; + QGridLayout *l = 0; + if (parent) + l = parent->layout; + else + l = m_mainLayout; + + if (expanded) { + insertRow(l, row + 1); + l->addWidget(item->container, row + 1, 0, 1, 2); + item->container->show(); + } else { + l->removeWidget(item->container); + item->container->hide(); + removeRow(l, row + 1); + } + + item->button->setChecked(expanded); + item->button->setArrowType(expanded ? Qt::UpArrow : Qt::DownArrow); +} + +void QtButtonPropertyBrowserPrivate::slotToggled(bool checked) +{ + WidgetItem *item = m_buttonToItem.value(q_ptr->sender()); + if (!item) + return; + + setExpanded(item, checked); + + if (checked) + emit q_ptr->expanded(m_itemToIndex.value(item)); + else + emit q_ptr->collapsed(m_itemToIndex.value(item)); +} + +void QtButtonPropertyBrowserPrivate::updateLater() +{ + QTimer::singleShot(0, q_ptr, SLOT(slotUpdate())); +} + +void QtButtonPropertyBrowserPrivate::propertyInserted(QtBrowserItem *index, QtBrowserItem *afterIndex) +{ + WidgetItem *afterItem = m_indexToItem.value(afterIndex); + WidgetItem *parentItem = m_indexToItem.value(index->parent()); + + WidgetItem *newItem = new WidgetItem(); + newItem->parent = parentItem; + + QGridLayout *layout = 0; + QWidget *parentWidget = 0; + int row = -1; + if (!afterItem) { + row = 0; + if (parentItem) + parentItem->children.insert(0, newItem); + else + m_children.insert(0, newItem); + } else { + row = gridRow(afterItem) + gridSpan(afterItem); + if (parentItem) + parentItem->children.insert(parentItem->children.indexOf(afterItem) + 1, newItem); + else + m_children.insert(m_children.indexOf(afterItem) + 1, newItem); + } + + if (!parentItem) { + layout = m_mainLayout; + parentWidget = q_ptr; + } else { + if (!parentItem->container) { + m_recreateQueue.removeAll(parentItem); + WidgetItem *grandParent = parentItem->parent; + QWidget *w = 0; + QGridLayout *l = 0; + const int oldRow = gridRow(parentItem); + if (grandParent) { + w = grandParent->container; + l = grandParent->layout; + } else { + w = q_ptr; + l = m_mainLayout; + } + QFrame *container = new QFrame(); + container->setFrameShape(QFrame::Panel); + container->setFrameShadow(QFrame::Raised); + parentItem->container = container; + parentItem->button = createButton(); + m_buttonToItem[parentItem->button] = parentItem; + q_ptr->connect(parentItem->button, SIGNAL(toggled(bool)), q_ptr, SLOT(slotToggled(bool))); + parentItem->layout = new QGridLayout(); + container->setLayout(parentItem->layout); + if (parentItem->label) { + l->removeWidget(parentItem->label); + delete parentItem->label; + parentItem->label = 0; + } + int span = 1; + if (!parentItem->widget && !parentItem->widgetLabel) + span = 2; + l->addWidget(parentItem->button, oldRow, 0, 1, span); + updateItem(parentItem); + } + layout = parentItem->layout; + parentWidget = parentItem->container; + } + + newItem->label = new QLabel(parentWidget); + newItem->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); + newItem->widget = createEditor(index->property(), parentWidget); + if (newItem->widget) { + QObject::connect(newItem->widget, SIGNAL(destroyed()), q_ptr, SLOT(slotEditorDestroyed())); + m_widgetToItem[newItem->widget] = newItem; + } else if (index->property()->hasValue()) { + newItem->widgetLabel = new QLabel(parentWidget); + newItem->widgetLabel->setSizePolicy(QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed)); + } + + insertRow(layout, row); + int span = 1; + if (newItem->widget) + layout->addWidget(newItem->widget, row, 1); + else if (newItem->widgetLabel) + layout->addWidget(newItem->widgetLabel, row, 1); + else + span = 2; + layout->addWidget(newItem->label, row, 0, span, 1); + + m_itemToIndex[newItem] = index; + m_indexToItem[index] = newItem; + + updateItem(newItem); +} + +void QtButtonPropertyBrowserPrivate::propertyRemoved(QtBrowserItem *index) +{ + WidgetItem *item = m_indexToItem.value(index); + + m_indexToItem.remove(index); + m_itemToIndex.remove(item); + + WidgetItem *parentItem = item->parent; + + const int row = gridRow(item); + + if (parentItem) + parentItem->children.removeAt(parentItem->children.indexOf(item)); + else + m_children.removeAt(m_children.indexOf(item)); + + const int colSpan = gridSpan(item); + + m_buttonToItem.remove(item->button); + + if (item->widget) + delete item->widget; + if (item->label) + delete item->label; + if (item->widgetLabel) + delete item->widgetLabel; + if (item->button) + delete item->button; + if (item->container) + delete item->container; + + if (!parentItem) { + removeRow(m_mainLayout, row); + if (colSpan > 1) + removeRow(m_mainLayout, row); + } else if (parentItem->children.count() != 0) { + removeRow(parentItem->layout, row); + if (colSpan > 1) + removeRow(parentItem->layout, row); + } else { + const WidgetItem *grandParent = parentItem->parent; + QGridLayout *l = 0; + if (grandParent) { + l = grandParent->layout; + } else { + l = m_mainLayout; + } + + const int parentRow = gridRow(parentItem); + const int parentSpan = gridSpan(parentItem); + + l->removeWidget(parentItem->button); + l->removeWidget(parentItem->container); + delete parentItem->button; + delete parentItem->container; + parentItem->button = 0; + parentItem->container = 0; + parentItem->layout = 0; + if (!m_recreateQueue.contains(parentItem)) + m_recreateQueue.append(parentItem); + if (parentSpan > 1) + removeRow(l, parentRow + 1); + + updateLater(); + } + m_recreateQueue.removeAll(item); + + delete item; +} + +void QtButtonPropertyBrowserPrivate::insertRow(QGridLayout *layout, int row) const +{ + QMap itemToPos; + int idx = 0; + while (idx < layout->count()) { + int r, c, rs, cs; + layout->getItemPosition(idx, &r, &c, &rs, &cs); + if (r >= row) { + itemToPos[layout->takeAt(idx)] = QRect(r + 1, c, rs, cs); + } else { + idx++; + } + } + + const QMap::ConstIterator icend = itemToPos.constEnd(); + for(QMap::ConstIterator it = itemToPos.constBegin(); it != icend; ++it) { + const QRect r = it.value(); + layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height()); + } +} + +void QtButtonPropertyBrowserPrivate::removeRow(QGridLayout *layout, int row) const +{ + QMap itemToPos; + int idx = 0; + while (idx < layout->count()) { + int r, c, rs, cs; + layout->getItemPosition(idx, &r, &c, &rs, &cs); + if (r > row) { + itemToPos[layout->takeAt(idx)] = QRect(r - 1, c, rs, cs); + } else { + idx++; + } + } + + const QMap::ConstIterator icend = itemToPos.constEnd(); + for(QMap::ConstIterator it = itemToPos.constBegin(); it != icend; ++it) { + const QRect r = it.value(); + layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height()); + } +} + +void QtButtonPropertyBrowserPrivate::propertyChanged(QtBrowserItem *index) +{ + WidgetItem *item = m_indexToItem.value(index); + + updateItem(item); +} + +void QtButtonPropertyBrowserPrivate::updateItem(WidgetItem *item) +{ + QtProperty *property = m_itemToIndex[item]->property(); + if (item->button) { + QFont font = item->button->font(); + font.setUnderline(property->isModified()); + item->button->setFont(font); + item->button->setText(property->propertyName()); + item->button->setToolTip(property->toolTip()); + item->button->setStatusTip(property->statusTip()); + item->button->setWhatsThis(property->whatsThis()); + item->button->setEnabled(property->isEnabled()); + } + if (item->label) { + QFont font = item->label->font(); + font.setUnderline(property->isModified()); + item->label->setFont(font); + item->label->setText(property->propertyName()); + item->label->setToolTip(property->toolTip()); + item->label->setStatusTip(property->statusTip()); + item->label->setWhatsThis(property->whatsThis()); + item->label->setEnabled(property->isEnabled()); + } + if (item->widgetLabel) { + QFont font = item->widgetLabel->font(); + font.setUnderline(false); + item->widgetLabel->setFont(font); + item->widgetLabel->setText(property->valueText()); + item->widgetLabel->setToolTip(property->valueText()); + item->widgetLabel->setEnabled(property->isEnabled()); + } + if (item->widget) { + QFont font = item->widget->font(); + font.setUnderline(false); + item->widget->setFont(font); + item->widget->setEnabled(property->isEnabled()); + item->widget->setToolTip(property->valueText()); + } +} + + + +/*! + \class QtButtonPropertyBrowser + + \brief The QtButtonPropertyBrowser class provides a drop down QToolButton + based property browser. + + A property browser is a widget that enables the user to edit a + given set of properties. Each property is represented by a label + specifying the property's name, and an editing widget (e.g. a line + edit or a combobox) holding its value. A property can have zero or + more subproperties. + + QtButtonPropertyBrowser provides drop down button for all nested + properties, i.e. subproperties are enclosed by a container associated with + the drop down button. The parent property's name is displayed as button text. For example: + + \image qtbuttonpropertybrowser.png + + Use the QtAbstractPropertyBrowser API to add, insert and remove + properties from an instance of the QtButtonPropertyBrowser + class. The properties themselves are created and managed by + implementations of the QtAbstractPropertyManager class. + + \sa QtTreePropertyBrowser, QtAbstractPropertyBrowser +*/ + +/*! + \fn void QtButtonPropertyBrowser::collapsed(QtBrowserItem *item) + + This signal is emitted when the \a item is collapsed. + + \sa expanded(), setExpanded() +*/ + +/*! + \fn void QtButtonPropertyBrowser::expanded(QtBrowserItem *item) + + This signal is emitted when the \a item is expanded. + + \sa collapsed(), setExpanded() +*/ + +/*! + Creates a property browser with the given \a parent. +*/ +QtButtonPropertyBrowser::QtButtonPropertyBrowser(QWidget *parent) + : QtAbstractPropertyBrowser(parent) +{ + d_ptr = new QtButtonPropertyBrowserPrivate; + d_ptr->q_ptr = this; + + d_ptr->init(this); +} + +/*! + Destroys this property browser. + + Note that the properties that were inserted into this browser are + \e not destroyed since they may still be used in other + browsers. The properties are owned by the manager that created + them. + + \sa QtProperty, QtAbstractPropertyManager +*/ +QtButtonPropertyBrowser::~QtButtonPropertyBrowser() +{ + const QMap::ConstIterator icend = d_ptr->m_itemToIndex.constEnd(); + for (QMap::ConstIterator it = d_ptr->m_itemToIndex.constBegin(); it != icend; ++it) + delete it.key(); + delete d_ptr; +} + +/*! + \reimp +*/ +void QtButtonPropertyBrowser::itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem) +{ + d_ptr->propertyInserted(item, afterItem); +} + +/*! + \reimp +*/ +void QtButtonPropertyBrowser::itemRemoved(QtBrowserItem *item) +{ + d_ptr->propertyRemoved(item); +} + +/*! + \reimp +*/ +void QtButtonPropertyBrowser::itemChanged(QtBrowserItem *item) +{ + d_ptr->propertyChanged(item); +} + +/*! + Sets the \a item to either collapse or expanded, depending on the value of \a expanded. + + \sa isExpanded(), expanded(), collapsed() +*/ + +void QtButtonPropertyBrowser::setExpanded(QtBrowserItem *item, bool expanded) +{ + QtButtonPropertyBrowserPrivate::WidgetItem *itm = d_ptr->m_indexToItem.value(item); + if (itm) + d_ptr->setExpanded(itm, expanded); +} + +/*! + Returns true if the \a item is expanded; otherwise returns false. + + \sa setExpanded() +*/ + +bool QtButtonPropertyBrowser::isExpanded(QtBrowserItem *item) const +{ + QtButtonPropertyBrowserPrivate::WidgetItem *itm = d_ptr->m_indexToItem.value(item); + if (itm) + return itm->expanded; + return false; +} + +#if QT_VERSION >= 0x040400 +QT_END_NAMESPACE +#endif + +#include "moc_qtbuttonpropertybrowser.cxx" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtbuttonpropertybrowser.h b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtbuttonpropertybrowser.h new file mode 100644 index 000000000..518e047e8 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtbuttonpropertybrowser.h @@ -0,0 +1,135 @@ +/**************************************************************************** +** +** This file is part of a Qt Solutions component. +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QTBUTTONPROPERTYBROWSER_H +#define QTBUTTONPROPERTYBROWSER_H + +#include "qtpropertybrowser.h" + +#if QT_VERSION >= 0x040400 +QT_BEGIN_NAMESPACE +#endif + +class QtButtonPropertyBrowserPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtButtonPropertyBrowser : public QtAbstractPropertyBrowser +{ + Q_OBJECT +public: + + QtButtonPropertyBrowser(QWidget *parent = 0); + ~QtButtonPropertyBrowser(); + + void setExpanded(QtBrowserItem *item, bool expanded); + bool isExpanded(QtBrowserItem *item) const; + +Q_SIGNALS: + + void collapsed(QtBrowserItem *item); + void expanded(QtBrowserItem *item); + +protected: + virtual void itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem); + virtual void itemRemoved(QtBrowserItem *item); + virtual void itemChanged(QtBrowserItem *item); + +private: + + QtButtonPropertyBrowserPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtButtonPropertyBrowser) + Q_DISABLE_COPY(QtButtonPropertyBrowser) + Q_PRIVATE_SLOT(d_func(), void slotUpdate()) + Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed()) + Q_PRIVATE_SLOT(d_func(), void slotToggled(bool)) + +}; + +#if QT_VERSION >= 0x040400 +QT_END_NAMESPACE +#endif + +#endif diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qteditorfactory.cpp b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qteditorfactory.cpp new file mode 100644 index 000000000..e619cf8cb --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qteditorfactory.cpp @@ -0,0 +1,2609 @@ +/**************************************************************************** +** +** This file is part of a Qt Solutions component. +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qteditorfactory.h" +#include "qtpropertybrowserutils_p.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(Q_CC_MSVC) +# pragma warning(disable: 4786) /* MS VS 6: truncating debug info after 255 characters */ +#endif + +#if QT_VERSION >= 0x040400 +QT_BEGIN_NAMESPACE +#endif + +// Set a hard coded left margin to account for the indentation +// of the tree view icon when switching to an editor + +static inline void setupTreeViewEditorMargin(QLayout *lt) +{ + enum { DecorationMargin = 4 }; + if (QApplication::layoutDirection() == Qt::LeftToRight) + lt->setContentsMargins(DecorationMargin, 0, 0, 0); + else + lt->setContentsMargins(0, 0, DecorationMargin, 0); +} + +// ---------- EditorFactoryPrivate : +// Base class for editor factory private classes. Manages mapping of properties to editors and vice versa. + +template +class EditorFactoryPrivate +{ +public: + + typedef QList EditorList; + typedef QMap PropertyToEditorListMap; + typedef QMap EditorToPropertyMap; + + Editor *createEditor(QtProperty *property, QWidget *parent); + void initializeEditor(QtProperty *property, Editor *e); + void slotEditorDestroyed(QObject *object); + + PropertyToEditorListMap m_createdEditors; + EditorToPropertyMap m_editorToProperty; +}; + +template +Editor *EditorFactoryPrivate::createEditor(QtProperty *property, QWidget *parent) +{ + Editor *editor = new Editor(parent); + initializeEditor(property, editor); + return editor; +} + +template +void EditorFactoryPrivate::initializeEditor(QtProperty *property, Editor *editor) +{ + Q_TYPENAME PropertyToEditorListMap::iterator it = m_createdEditors.find(property); + if (it == m_createdEditors.end()) + it = m_createdEditors.insert(property, EditorList()); + it.value().append(editor); + m_editorToProperty.insert(editor, property); +} + +template +void EditorFactoryPrivate::slotEditorDestroyed(QObject *object) +{ + const Q_TYPENAME EditorToPropertyMap::iterator ecend = m_editorToProperty.end(); + for (Q_TYPENAME EditorToPropertyMap::iterator itEditor = m_editorToProperty.begin(); itEditor != ecend; ++itEditor) { + if (itEditor.key() == object) { + Editor *editor = itEditor.key(); + QtProperty *property = itEditor.value(); + const Q_TYPENAME PropertyToEditorListMap::iterator pit = m_createdEditors.find(property); + if (pit != m_createdEditors.end()) { + pit.value().removeAll(editor); + if (pit.value().empty()) + m_createdEditors.erase(pit); + } + m_editorToProperty.erase(itEditor); + return; + } + } +} + +// ------------ QtSpinBoxFactory + +class QtSpinBoxFactoryPrivate : public EditorFactoryPrivate +{ + QtSpinBoxFactory *q_ptr; + Q_DECLARE_PUBLIC(QtSpinBoxFactory) +public: + + void slotPropertyChanged(QtProperty *property, int value); + void slotRangeChanged(QtProperty *property, int min, int max); + void slotSingleStepChanged(QtProperty *property, int step); + void slotSetValue(int value); +}; + +void QtSpinBoxFactoryPrivate::slotPropertyChanged(QtProperty *property, int value) +{ + if (!m_createdEditors.contains(property)) + return; + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QSpinBox *editor = itEditor.next(); + if (editor->value() != value) { + editor->blockSignals(true); + editor->setValue(value); + editor->blockSignals(false); + } + } +} + +void QtSpinBoxFactoryPrivate::slotRangeChanged(QtProperty *property, int min, int max) +{ + if (!m_createdEditors.contains(property)) + return; + + QtIntPropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QSpinBox *editor = itEditor.next(); + editor->blockSignals(true); + editor->setRange(min, max); + editor->setValue(manager->value(property)); + editor->blockSignals(false); + } +} + +void QtSpinBoxFactoryPrivate::slotSingleStepChanged(QtProperty *property, int step) +{ + if (!m_createdEditors.contains(property)) + return; + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QSpinBox *editor = itEditor.next(); + editor->blockSignals(true); + editor->setSingleStep(step); + editor->blockSignals(false); + } +} + +void QtSpinBoxFactoryPrivate::slotSetValue(int value) +{ + QObject *object = q_ptr->sender(); + const QMap::ConstIterator ecend = m_editorToProperty.constEnd(); + for (QMap::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor) { + if (itEditor.key() == object) { + QtProperty *property = itEditor.value(); + QtIntPropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + manager->setValue(property, value); + return; + } + } +} + +/*! + \class QtSpinBoxFactory + + \brief The QtSpinBoxFactory class provides QSpinBox widgets for + properties created by QtIntPropertyManager objects. + + \sa QtAbstractEditorFactory, QtIntPropertyManager +*/ + +/*! + Creates a factory with the given \a parent. +*/ +QtSpinBoxFactory::QtSpinBoxFactory(QObject *parent) + : QtAbstractEditorFactory(parent) +{ + d_ptr = new QtSpinBoxFactoryPrivate(); + d_ptr->q_ptr = this; + +} + +/*! + Destroys this factory, and all the widgets it has created. +*/ +QtSpinBoxFactory::~QtSpinBoxFactory() +{ + qDeleteAll(d_ptr->m_editorToProperty.keys()); + delete d_ptr; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtSpinBoxFactory::connectPropertyManager(QtIntPropertyManager *manager) +{ + connect(manager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotPropertyChanged(QtProperty *, int))); + connect(manager, SIGNAL(rangeChanged(QtProperty *, int, int)), + this, SLOT(slotRangeChanged(QtProperty *, int, int))); + connect(manager, SIGNAL(singleStepChanged(QtProperty *, int)), + this, SLOT(slotSingleStepChanged(QtProperty *, int))); +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +QWidget *QtSpinBoxFactory::createEditor(QtIntPropertyManager *manager, QtProperty *property, + QWidget *parent) +{ + QSpinBox *editor = d_ptr->createEditor(property, parent); + editor->setSingleStep(manager->singleStep(property)); + editor->setRange(manager->minimum(property), manager->maximum(property)); + editor->setValue(manager->value(property)); + editor->setKeyboardTracking(false); + + connect(editor, SIGNAL(valueChanged(int)), this, SLOT(slotSetValue(int))); + connect(editor, SIGNAL(destroyed(QObject *)), + this, SLOT(slotEditorDestroyed(QObject *))); + return editor; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtSpinBoxFactory::disconnectPropertyManager(QtIntPropertyManager *manager) +{ + disconnect(manager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotPropertyChanged(QtProperty *, int))); + disconnect(manager, SIGNAL(rangeChanged(QtProperty *, int, int)), + this, SLOT(slotRangeChanged(QtProperty *, int, int))); + disconnect(manager, SIGNAL(singleStepChanged(QtProperty *, int)), + this, SLOT(slotSingleStepChanged(QtProperty *, int))); +} + +// QtSliderFactory + +class QtSliderFactoryPrivate : public EditorFactoryPrivate +{ + QtSliderFactory *q_ptr; + Q_DECLARE_PUBLIC(QtSliderFactory) +public: + void slotPropertyChanged(QtProperty *property, int value); + void slotRangeChanged(QtProperty *property, int min, int max); + void slotSingleStepChanged(QtProperty *property, int step); + void slotSetValue(int value); +}; + +void QtSliderFactoryPrivate::slotPropertyChanged(QtProperty *property, int value) +{ + if (!m_createdEditors.contains(property)) + return; + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QSlider *editor = itEditor.next(); + editor->blockSignals(true); + editor->setValue(value); + editor->blockSignals(false); + } +} + +void QtSliderFactoryPrivate::slotRangeChanged(QtProperty *property, int min, int max) +{ + if (!m_createdEditors.contains(property)) + return; + + QtIntPropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QSlider *editor = itEditor.next(); + editor->blockSignals(true); + editor->setRange(min, max); + editor->setValue(manager->value(property)); + editor->blockSignals(false); + } +} + +void QtSliderFactoryPrivate::slotSingleStepChanged(QtProperty *property, int step) +{ + if (!m_createdEditors.contains(property)) + return; + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QSlider *editor = itEditor.next(); + editor->blockSignals(true); + editor->setSingleStep(step); + editor->blockSignals(false); + } +} + +void QtSliderFactoryPrivate::slotSetValue(int value) +{ + QObject *object = q_ptr->sender(); + const QMap::ConstIterator ecend = m_editorToProperty.constEnd(); + for (QMap::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor ) { + if (itEditor.key() == object) { + QtProperty *property = itEditor.value(); + QtIntPropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + manager->setValue(property, value); + return; + } + } +} + +/*! + \class QtSliderFactory + + \brief The QtSliderFactory class provides QSlider widgets for + properties created by QtIntPropertyManager objects. + + \sa QtAbstractEditorFactory, QtIntPropertyManager +*/ + +/*! + Creates a factory with the given \a parent. +*/ +QtSliderFactory::QtSliderFactory(QObject *parent) + : QtAbstractEditorFactory(parent) +{ + d_ptr = new QtSliderFactoryPrivate(); + d_ptr->q_ptr = this; + +} + +/*! + Destroys this factory, and all the widgets it has created. +*/ +QtSliderFactory::~QtSliderFactory() +{ + qDeleteAll(d_ptr->m_editorToProperty.keys()); + delete d_ptr; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtSliderFactory::connectPropertyManager(QtIntPropertyManager *manager) +{ + connect(manager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotPropertyChanged(QtProperty *, int))); + connect(manager, SIGNAL(rangeChanged(QtProperty *, int, int)), + this, SLOT(slotRangeChanged(QtProperty *, int, int))); + connect(manager, SIGNAL(singleStepChanged(QtProperty *, int)), + this, SLOT(slotSingleStepChanged(QtProperty *, int))); +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +QWidget *QtSliderFactory::createEditor(QtIntPropertyManager *manager, QtProperty *property, + QWidget *parent) +{ + QSlider *editor = new QSlider(Qt::Horizontal, parent); + d_ptr->initializeEditor(property, editor); + editor->setSingleStep(manager->singleStep(property)); + editor->setRange(manager->minimum(property), manager->maximum(property)); + editor->setValue(manager->value(property)); + + connect(editor, SIGNAL(valueChanged(int)), this, SLOT(slotSetValue(int))); + connect(editor, SIGNAL(destroyed(QObject *)), + this, SLOT(slotEditorDestroyed(QObject *))); + return editor; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtSliderFactory::disconnectPropertyManager(QtIntPropertyManager *manager) +{ + disconnect(manager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotPropertyChanged(QtProperty *, int))); + disconnect(manager, SIGNAL(rangeChanged(QtProperty *, int, int)), + this, SLOT(slotRangeChanged(QtProperty *, int, int))); + disconnect(manager, SIGNAL(singleStepChanged(QtProperty *, int)), + this, SLOT(slotSingleStepChanged(QtProperty *, int))); +} + +// QtSliderFactory + +class QtScrollBarFactoryPrivate : public EditorFactoryPrivate +{ + QtScrollBarFactory *q_ptr; + Q_DECLARE_PUBLIC(QtScrollBarFactory) +public: + void slotPropertyChanged(QtProperty *property, int value); + void slotRangeChanged(QtProperty *property, int min, int max); + void slotSingleStepChanged(QtProperty *property, int step); + void slotSetValue(int value); +}; + +void QtScrollBarFactoryPrivate::slotPropertyChanged(QtProperty *property, int value) +{ + if (!m_createdEditors.contains(property)) + return; + + QListIterator itEditor( m_createdEditors[property]); + while (itEditor.hasNext()) { + QScrollBar *editor = itEditor.next(); + editor->blockSignals(true); + editor->setValue(value); + editor->blockSignals(false); + } +} + +void QtScrollBarFactoryPrivate::slotRangeChanged(QtProperty *property, int min, int max) +{ + if (!m_createdEditors.contains(property)) + return; + + QtIntPropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + + QListIterator itEditor( m_createdEditors[property]); + while (itEditor.hasNext()) { + QScrollBar *editor = itEditor.next(); + editor->blockSignals(true); + editor->setRange(min, max); + editor->setValue(manager->value(property)); + editor->blockSignals(false); + } +} + +void QtScrollBarFactoryPrivate::slotSingleStepChanged(QtProperty *property, int step) +{ + if (!m_createdEditors.contains(property)) + return; + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QScrollBar *editor = itEditor.next(); + editor->blockSignals(true); + editor->setSingleStep(step); + editor->blockSignals(false); + } +} + +void QtScrollBarFactoryPrivate::slotSetValue(int value) +{ + QObject *object = q_ptr->sender(); + const QMap::ConstIterator ecend = m_editorToProperty.constEnd(); + for (QMap::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor) + if (itEditor.key() == object) { + QtProperty *property = itEditor.value(); + QtIntPropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + manager->setValue(property, value); + return; + } +} + +/*! + \class QtScrollBarFactory + + \brief The QtScrollBarFactory class provides QScrollBar widgets for + properties created by QtIntPropertyManager objects. + + \sa QtAbstractEditorFactory, QtIntPropertyManager +*/ + +/*! + Creates a factory with the given \a parent. +*/ +QtScrollBarFactory::QtScrollBarFactory(QObject *parent) + : QtAbstractEditorFactory(parent) +{ + d_ptr = new QtScrollBarFactoryPrivate(); + d_ptr->q_ptr = this; + +} + +/*! + Destroys this factory, and all the widgets it has created. +*/ +QtScrollBarFactory::~QtScrollBarFactory() +{ + qDeleteAll(d_ptr->m_editorToProperty.keys()); + delete d_ptr; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtScrollBarFactory::connectPropertyManager(QtIntPropertyManager *manager) +{ + connect(manager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotPropertyChanged(QtProperty *, int))); + connect(manager, SIGNAL(rangeChanged(QtProperty *, int, int)), + this, SLOT(slotRangeChanged(QtProperty *, int, int))); + connect(manager, SIGNAL(singleStepChanged(QtProperty *, int)), + this, SLOT(slotSingleStepChanged(QtProperty *, int))); +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +QWidget *QtScrollBarFactory::createEditor(QtIntPropertyManager *manager, QtProperty *property, + QWidget *parent) +{ + QScrollBar *editor = new QScrollBar(Qt::Horizontal, parent); + d_ptr->initializeEditor(property, editor); + editor->setSingleStep(manager->singleStep(property)); + editor->setRange(manager->minimum(property), manager->maximum(property)); + editor->setValue(manager->value(property)); + connect(editor, SIGNAL(valueChanged(int)), this, SLOT(slotSetValue(int))); + connect(editor, SIGNAL(destroyed(QObject *)), + this, SLOT(slotEditorDestroyed(QObject *))); + return editor; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtScrollBarFactory::disconnectPropertyManager(QtIntPropertyManager *manager) +{ + disconnect(manager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotPropertyChanged(QtProperty *, int))); + disconnect(manager, SIGNAL(rangeChanged(QtProperty *, int, int)), + this, SLOT(slotRangeChanged(QtProperty *, int, int))); + disconnect(manager, SIGNAL(singleStepChanged(QtProperty *, int)), + this, SLOT(slotSingleStepChanged(QtProperty *, int))); +} + +// QtCheckBoxFactory + +class QtCheckBoxFactoryPrivate : public EditorFactoryPrivate +{ + QtCheckBoxFactory *q_ptr; + Q_DECLARE_PUBLIC(QtCheckBoxFactory) +public: + void slotPropertyChanged(QtProperty *property, bool value); + void slotSetValue(bool value); +}; + +void QtCheckBoxFactoryPrivate::slotPropertyChanged(QtProperty *property, bool value) +{ + if (!m_createdEditors.contains(property)) + return; + + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QtBoolEdit *editor = itEditor.next(); + editor->blockCheckBoxSignals(true); + editor->setChecked(value); + editor->blockCheckBoxSignals(false); + } +} + +void QtCheckBoxFactoryPrivate::slotSetValue(bool value) +{ + QObject *object = q_ptr->sender(); + + const QMap::ConstIterator ecend = m_editorToProperty.constEnd(); + for (QMap::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor) + if (itEditor.key() == object) { + QtProperty *property = itEditor.value(); + QtBoolPropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + manager->setValue(property, value); + return; + } +} + +/*! + \class QtCheckBoxFactory + + \brief The QtCheckBoxFactory class provides QCheckBox widgets for + properties created by QtBoolPropertyManager objects. + + \sa QtAbstractEditorFactory, QtBoolPropertyManager +*/ + +/*! + Creates a factory with the given \a parent. +*/ +QtCheckBoxFactory::QtCheckBoxFactory(QObject *parent) + : QtAbstractEditorFactory(parent) +{ + d_ptr = new QtCheckBoxFactoryPrivate(); + d_ptr->q_ptr = this; + +} + +/*! + Destroys this factory, and all the widgets it has created. +*/ +QtCheckBoxFactory::~QtCheckBoxFactory() +{ + qDeleteAll(d_ptr->m_editorToProperty.keys()); + delete d_ptr; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtCheckBoxFactory::connectPropertyManager(QtBoolPropertyManager *manager) +{ + connect(manager, SIGNAL(valueChanged(QtProperty *, bool)), + this, SLOT(slotPropertyChanged(QtProperty *, bool))); +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +QWidget *QtCheckBoxFactory::createEditor(QtBoolPropertyManager *manager, QtProperty *property, + QWidget *parent) +{ + QtBoolEdit *editor = d_ptr->createEditor(property, parent); + editor->setChecked(manager->value(property)); + + connect(editor, SIGNAL(toggled(bool)), this, SLOT(slotSetValue(bool))); + connect(editor, SIGNAL(destroyed(QObject *)), + this, SLOT(slotEditorDestroyed(QObject *))); + return editor; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtCheckBoxFactory::disconnectPropertyManager(QtBoolPropertyManager *manager) +{ + disconnect(manager, SIGNAL(valueChanged(QtProperty *, bool)), + this, SLOT(slotPropertyChanged(QtProperty *, bool))); +} + +// QtDoubleSpinBoxFactory + +class QtDoubleSpinBoxFactoryPrivate : public EditorFactoryPrivate +{ + QtDoubleSpinBoxFactory *q_ptr; + Q_DECLARE_PUBLIC(QtDoubleSpinBoxFactory) +public: + + void slotPropertyChanged(QtProperty *property, double value); + void slotRangeChanged(QtProperty *property, double min, double max); + void slotSingleStepChanged(QtProperty *property, double step); + void slotDecimalsChanged(QtProperty *property, int prec); + void slotSetValue(double value); +}; + +void QtDoubleSpinBoxFactoryPrivate::slotPropertyChanged(QtProperty *property, double value) +{ + QList editors = m_createdEditors[property]; + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QDoubleSpinBox *editor = itEditor.next(); + if (editor->value() != value) { + editor->blockSignals(true); + editor->setValue(value); + editor->blockSignals(false); + } + } +} + +void QtDoubleSpinBoxFactoryPrivate::slotRangeChanged(QtProperty *property, + double min, double max) +{ + if (!m_createdEditors.contains(property)) + return; + + QtDoublePropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + + QList editors = m_createdEditors[property]; + QListIterator itEditor(editors); + while (itEditor.hasNext()) { + QDoubleSpinBox *editor = itEditor.next(); + editor->blockSignals(true); + editor->setRange(min, max); + editor->setValue(manager->value(property)); + editor->blockSignals(false); + } +} + +void QtDoubleSpinBoxFactoryPrivate::slotSingleStepChanged(QtProperty *property, double step) +{ + if (!m_createdEditors.contains(property)) + return; + + QtDoublePropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + + QList editors = m_createdEditors[property]; + QListIterator itEditor(editors); + while (itEditor.hasNext()) { + QDoubleSpinBox *editor = itEditor.next(); + editor->blockSignals(true); + editor->setSingleStep(step); + editor->blockSignals(false); + } +} + +void QtDoubleSpinBoxFactoryPrivate::slotDecimalsChanged(QtProperty *property, int prec) +{ + if (!m_createdEditors.contains(property)) + return; + + QtDoublePropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + + QList editors = m_createdEditors[property]; + QListIterator itEditor(editors); + while (itEditor.hasNext()) { + QDoubleSpinBox *editor = itEditor.next(); + editor->blockSignals(true); + editor->setDecimals(prec); + editor->setValue(manager->value(property)); + editor->blockSignals(false); + } +} + +void QtDoubleSpinBoxFactoryPrivate::slotSetValue(double value) +{ + QObject *object = q_ptr->sender(); + const QMap::ConstIterator itcend = m_editorToProperty.constEnd(); + for (QMap::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != itcend; ++itEditor) { + if (itEditor.key() == object) { + QtProperty *property = itEditor.value(); + QtDoublePropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + manager->setValue(property, value); + return; + } + } +} + +/*! \class QtDoubleSpinBoxFactory + + \brief The QtDoubleSpinBoxFactory class provides QDoubleSpinBox + widgets for properties created by QtDoublePropertyManager objects. + + \sa QtAbstractEditorFactory, QtDoublePropertyManager +*/ + +/*! + Creates a factory with the given \a parent. +*/ +QtDoubleSpinBoxFactory::QtDoubleSpinBoxFactory(QObject *parent) + : QtAbstractEditorFactory(parent) +{ + d_ptr = new QtDoubleSpinBoxFactoryPrivate(); + d_ptr->q_ptr = this; + +} + +/*! + Destroys this factory, and all the widgets it has created. +*/ +QtDoubleSpinBoxFactory::~QtDoubleSpinBoxFactory() +{ + qDeleteAll(d_ptr->m_editorToProperty.keys()); + delete d_ptr; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtDoubleSpinBoxFactory::connectPropertyManager(QtDoublePropertyManager *manager) +{ + connect(manager, SIGNAL(valueChanged(QtProperty *, double)), + this, SLOT(slotPropertyChanged(QtProperty *, double))); + connect(manager, SIGNAL(rangeChanged(QtProperty *, double, double)), + this, SLOT(slotRangeChanged(QtProperty *, double, double))); + connect(manager, SIGNAL(singleStepChanged(QtProperty *, double)), + this, SLOT(slotSingleStepChanged(QtProperty *, double))); + connect(manager, SIGNAL(decimalsChanged(QtProperty *, int)), + this, SLOT(slotDecimalsChanged(QtProperty *, int))); +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +QWidget *QtDoubleSpinBoxFactory::createEditor(QtDoublePropertyManager *manager, + QtProperty *property, QWidget *parent) +{ + QDoubleSpinBox *editor = d_ptr->createEditor(property, parent); + editor->setSingleStep(manager->singleStep(property)); + editor->setDecimals(6); + editor->setRange(manager->minimum(property), manager->maximum(property)); + editor->setValue(manager->value(property)); + editor->setKeyboardTracking(false); + + connect(editor, SIGNAL(valueChanged(double)), this, SLOT(slotSetValue(double))); + connect(editor, SIGNAL(destroyed(QObject *)), + this, SLOT(slotEditorDestroyed(QObject *))); + return editor; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtDoubleSpinBoxFactory::disconnectPropertyManager(QtDoublePropertyManager *manager) +{ + disconnect(manager, SIGNAL(valueChanged(QtProperty *, double)), + this, SLOT(slotPropertyChanged(QtProperty *, double))); + disconnect(manager, SIGNAL(rangeChanged(QtProperty *, double, double)), + this, SLOT(slotRangeChanged(QtProperty *, double, double))); + disconnect(manager, SIGNAL(singleStepChanged(QtProperty *, double)), + this, SLOT(slotSingleStepChanged(QtProperty *, double))); + disconnect(manager, SIGNAL(decimalsChanged(QtProperty *, int)), + this, SLOT(slotDecimalsChanged(QtProperty *, int))); +} + +// QtLineEditFactory + +class QtLineEditFactoryPrivate : public EditorFactoryPrivate +{ + QtLineEditFactory *q_ptr; + Q_DECLARE_PUBLIC(QtLineEditFactory) +public: + + void slotPropertyChanged(QtProperty *property, const QString &value); + void slotRegExpChanged(QtProperty *property, const QRegExp ®Exp); + void slotSetValue(const QString &value); + void slotEditingFinished(); +}; + +void QtLineEditFactoryPrivate::slotPropertyChanged(QtProperty *property, + const QString &value) +{ + if (!m_createdEditors.contains(property)) + return; + + QListIterator itEditor( m_createdEditors[property]); + while (itEditor.hasNext()) { + QLineEdit *editor = itEditor.next(); + if (editor->text() != value) + editor->setText(value); + } +} + +void QtLineEditFactoryPrivate::slotRegExpChanged(QtProperty *property, + const QRegExp ®Exp) +{ + if (!m_createdEditors.contains(property)) + return; + + QtStringPropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QLineEdit *editor = itEditor.next(); + editor->blockSignals(true); + const QValidator *oldValidator = editor->validator(); + QValidator *newValidator = 0; + if (regExp.isValid()) { + newValidator = new QRegExpValidator(regExp, editor); + } + editor->setValidator(newValidator); + if (oldValidator) + delete oldValidator; + editor->blockSignals(false); + } +} + +void QtLineEditFactoryPrivate::slotSetValue(const QString &value) +{ + QObject *object = q_ptr->sender(); + const QMap::ConstIterator ecend = m_editorToProperty.constEnd(); + for (QMap::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor) + if (itEditor.key() == object) { + QtProperty *property = itEditor.value(); + QtStringPropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + manager->setValue(property, value); + return; + } +} + +void QtLineEditFactoryPrivate::slotEditingFinished() +{ + QObject *object = q_ptr->sender(); + const QMap::ConstIterator ecend = m_editorToProperty.constEnd(); + for (QMap::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor) + if (itEditor.key() == object) { + QtProperty *property = itEditor.value(); + QtStringPropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + QString value = static_cast(itEditor.key())->text(); + manager->setValue(property, value); + return; + } +} + +/*! + \class QtLineEditFactory + + \brief The QtLineEditFactory class provides QLineEdit widgets for + properties created by QtStringPropertyManager objects. + + \sa QtAbstractEditorFactory, QtStringPropertyManager +*/ + +/*! + Creates a factory with the given \a parent. +*/ +QtLineEditFactory::QtLineEditFactory(QObject *parent) + : QtAbstractEditorFactory(parent) +{ + d_ptr = new QtLineEditFactoryPrivate(); + d_ptr->q_ptr = this; + +} + +/*! + Destroys this factory, and all the widgets it has created. +*/ +QtLineEditFactory::~QtLineEditFactory() +{ + qDeleteAll(d_ptr->m_editorToProperty.keys()); + delete d_ptr; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtLineEditFactory::connectPropertyManager(QtStringPropertyManager *manager) +{ + connect(manager, SIGNAL(valueChanged(QtProperty *, const QString &)), + this, SLOT(slotPropertyChanged(QtProperty *, const QString &))); + connect(manager, SIGNAL(regExpChanged(QtProperty *, const QRegExp &)), + this, SLOT(slotRegExpChanged(QtProperty *, const QRegExp &))); +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +QWidget *QtLineEditFactory::createEditor(QtStringPropertyManager *manager, + QtProperty *property, QWidget *parent) +{ + + QLineEdit *editor = d_ptr->createEditor(property, parent); + QRegExp regExp = manager->regExp(property); + if (regExp.isValid()) { + QValidator *validator = new QRegExpValidator(regExp, editor); + editor->setValidator(validator); + } + editor->setText(manager->value(property)); + + connect(editor, SIGNAL(editingFinished()), + this, SLOT(slotEditingFinished())); + connect(editor, SIGNAL(destroyed(QObject *)), + this, SLOT(slotEditorDestroyed(QObject *))); + return editor; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtLineEditFactory::disconnectPropertyManager(QtStringPropertyManager *manager) +{ + disconnect(manager, SIGNAL(valueChanged(QtProperty *, const QString &)), + this, SLOT(slotPropertyChanged(QtProperty *, const QString &))); + disconnect(manager, SIGNAL(regExpChanged(QtProperty *, const QRegExp &)), + this, SLOT(slotRegExpChanged(QtProperty *, const QRegExp &))); +} + +// QtDateEditFactory + +class QtDateEditFactoryPrivate : public EditorFactoryPrivate +{ + QtDateEditFactory *q_ptr; + Q_DECLARE_PUBLIC(QtDateEditFactory) +public: + + void slotPropertyChanged(QtProperty *property, const QDate &value); + void slotRangeChanged(QtProperty *property, const QDate &min, const QDate &max); + void slotSetValue(const QDate &value); +}; + +void QtDateEditFactoryPrivate::slotPropertyChanged(QtProperty *property, const QDate &value) +{ + if (!m_createdEditors.contains(property)) + return; + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QDateEdit *editor = itEditor.next(); + editor->blockSignals(true); + editor->setDate(value); + editor->blockSignals(false); + } +} + +void QtDateEditFactoryPrivate::slotRangeChanged(QtProperty *property, + const QDate &min, const QDate &max) +{ + if (!m_createdEditors.contains(property)) + return; + + QtDatePropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QDateEdit *editor = itEditor.next(); + editor->blockSignals(true); + editor->setDateRange(min, max); + editor->setDate(manager->value(property)); + editor->blockSignals(false); + } +} + +void QtDateEditFactoryPrivate::slotSetValue(const QDate &value) +{ + QObject *object = q_ptr->sender(); + const QMap::ConstIterator ecend = m_editorToProperty.constEnd(); + for (QMap::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor) + if (itEditor.key() == object) { + QtProperty *property = itEditor.value(); + QtDatePropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + manager->setValue(property, value); + return; + } +} + +/*! + \class QtDateEditFactory + + \brief The QtDateEditFactory class provides QDateEdit widgets for + properties created by QtDatePropertyManager objects. + + \sa QtAbstractEditorFactory, QtDatePropertyManager +*/ + +/*! + Creates a factory with the given \a parent. +*/ +QtDateEditFactory::QtDateEditFactory(QObject *parent) + : QtAbstractEditorFactory(parent) +{ + d_ptr = new QtDateEditFactoryPrivate(); + d_ptr->q_ptr = this; + +} + +/*! + Destroys this factory, and all the widgets it has created. +*/ +QtDateEditFactory::~QtDateEditFactory() +{ + qDeleteAll(d_ptr->m_editorToProperty.keys()); + delete d_ptr; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtDateEditFactory::connectPropertyManager(QtDatePropertyManager *manager) +{ + connect(manager, SIGNAL(valueChanged(QtProperty *, const QDate &)), + this, SLOT(slotPropertyChanged(QtProperty *, const QDate &))); + connect(manager, SIGNAL(rangeChanged(QtProperty *, const QDate &, const QDate &)), + this, SLOT(slotRangeChanged(QtProperty *, const QDate &, const QDate &))); +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +QWidget *QtDateEditFactory::createEditor(QtDatePropertyManager *manager, QtProperty *property, + QWidget *parent) +{ + QDateEdit *editor = d_ptr->createEditor(property, parent); + editor->setCalendarPopup(true); + editor->setDateRange(manager->minimum(property), manager->maximum(property)); + editor->setDate(manager->value(property)); + + connect(editor, SIGNAL(dateChanged(const QDate &)), + this, SLOT(slotSetValue(const QDate &))); + connect(editor, SIGNAL(destroyed(QObject *)), + this, SLOT(slotEditorDestroyed(QObject *))); + return editor; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtDateEditFactory::disconnectPropertyManager(QtDatePropertyManager *manager) +{ + disconnect(manager, SIGNAL(valueChanged(QtProperty *, const QDate &)), + this, SLOT(slotPropertyChanged(QtProperty *, const QDate &))); + disconnect(manager, SIGNAL(rangeChanged(QtProperty *, const QDate &, const QDate &)), + this, SLOT(slotRangeChanged(QtProperty *, const QDate &, const QDate &))); +} + +// QtTimeEditFactory + +class QtTimeEditFactoryPrivate : public EditorFactoryPrivate +{ + QtTimeEditFactory *q_ptr; + Q_DECLARE_PUBLIC(QtTimeEditFactory) +public: + + void slotPropertyChanged(QtProperty *property, const QTime &value); + void slotSetValue(const QTime &value); +}; + +void QtTimeEditFactoryPrivate::slotPropertyChanged(QtProperty *property, const QTime &value) +{ + if (!m_createdEditors.contains(property)) + return; + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QTimeEdit *editor = itEditor.next(); + editor->blockSignals(true); + editor->setTime(value); + editor->blockSignals(false); + } +} + +void QtTimeEditFactoryPrivate::slotSetValue(const QTime &value) +{ + QObject *object = q_ptr->sender(); + const QMap::ConstIterator ecend = m_editorToProperty.constEnd(); + for (QMap::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor) + if (itEditor.key() == object) { + QtProperty *property = itEditor.value(); + QtTimePropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + manager->setValue(property, value); + return; + } +} + +/*! + \class QtTimeEditFactory + + \brief The QtTimeEditFactory class provides QTimeEdit widgets for + properties created by QtTimePropertyManager objects. + + \sa QtAbstractEditorFactory, QtTimePropertyManager +*/ + +/*! + Creates a factory with the given \a parent. +*/ +QtTimeEditFactory::QtTimeEditFactory(QObject *parent) + : QtAbstractEditorFactory(parent) +{ + d_ptr = new QtTimeEditFactoryPrivate(); + d_ptr->q_ptr = this; + +} + +/*! + Destroys this factory, and all the widgets it has created. +*/ +QtTimeEditFactory::~QtTimeEditFactory() +{ + qDeleteAll(d_ptr->m_editorToProperty.keys()); + delete d_ptr; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtTimeEditFactory::connectPropertyManager(QtTimePropertyManager *manager) +{ + connect(manager, SIGNAL(valueChanged(QtProperty *, const QTime &)), + this, SLOT(slotPropertyChanged(QtProperty *, const QTime &))); +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +QWidget *QtTimeEditFactory::createEditor(QtTimePropertyManager *manager, QtProperty *property, + QWidget *parent) +{ + QTimeEdit *editor = d_ptr->createEditor(property, parent); + editor->setTime(manager->value(property)); + + connect(editor, SIGNAL(timeChanged(const QTime &)), + this, SLOT(slotSetValue(const QTime &))); + connect(editor, SIGNAL(destroyed(QObject *)), + this, SLOT(slotEditorDestroyed(QObject *))); + return editor; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtTimeEditFactory::disconnectPropertyManager(QtTimePropertyManager *manager) +{ + disconnect(manager, SIGNAL(valueChanged(QtProperty *, const QTime &)), + this, SLOT(slotPropertyChanged(QtProperty *, const QTime &))); +} + +// QtDateTimeEditFactory + +class QtDateTimeEditFactoryPrivate : public EditorFactoryPrivate +{ + QtDateTimeEditFactory *q_ptr; + Q_DECLARE_PUBLIC(QtDateTimeEditFactory) +public: + + void slotPropertyChanged(QtProperty *property, const QDateTime &value); + void slotSetValue(const QDateTime &value); + +}; + +void QtDateTimeEditFactoryPrivate::slotPropertyChanged(QtProperty *property, + const QDateTime &value) +{ + if (!m_createdEditors.contains(property)) + return; + + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QDateTimeEdit *editor = itEditor.next(); + editor->blockSignals(true); + editor->setDateTime(value); + editor->blockSignals(false); + } +} + +void QtDateTimeEditFactoryPrivate::slotSetValue(const QDateTime &value) +{ + QObject *object = q_ptr->sender(); + const QMap::ConstIterator ecend = m_editorToProperty.constEnd(); + for (QMap::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor) + if (itEditor.key() == object) { + QtProperty *property = itEditor.value(); + QtDateTimePropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + manager->setValue(property, value); + return; + } +} + +/*! + \class QtDateTimeEditFactory + + \brief The QtDateTimeEditFactory class provides QDateTimeEdit + widgets for properties created by QtDateTimePropertyManager objects. + + \sa QtAbstractEditorFactory, QtDateTimePropertyManager +*/ + +/*! + Creates a factory with the given \a parent. +*/ +QtDateTimeEditFactory::QtDateTimeEditFactory(QObject *parent) + : QtAbstractEditorFactory(parent) +{ + d_ptr = new QtDateTimeEditFactoryPrivate(); + d_ptr->q_ptr = this; + +} + +/*! + Destroys this factory, and all the widgets it has created. +*/ +QtDateTimeEditFactory::~QtDateTimeEditFactory() +{ + qDeleteAll(d_ptr->m_editorToProperty.keys()); + delete d_ptr; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtDateTimeEditFactory::connectPropertyManager(QtDateTimePropertyManager *manager) +{ + connect(manager, SIGNAL(valueChanged(QtProperty *, const QDateTime &)), + this, SLOT(slotPropertyChanged(QtProperty *, const QDateTime &))); +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +QWidget *QtDateTimeEditFactory::createEditor(QtDateTimePropertyManager *manager, + QtProperty *property, QWidget *parent) +{ + QDateTimeEdit *editor = d_ptr->createEditor(property, parent); + editor->setDateTime(manager->value(property)); + + connect(editor, SIGNAL(dateTimeChanged(const QDateTime &)), + this, SLOT(slotSetValue(const QDateTime &))); + connect(editor, SIGNAL(destroyed(QObject *)), + this, SLOT(slotEditorDestroyed(QObject *))); + return editor; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtDateTimeEditFactory::disconnectPropertyManager(QtDateTimePropertyManager *manager) +{ + disconnect(manager, SIGNAL(valueChanged(QtProperty *, const QDateTime &)), + this, SLOT(slotPropertyChanged(QtProperty *, const QDateTime &))); +} + +// QtKeySequenceEditorFactory + +class QtKeySequenceEditorFactoryPrivate : public EditorFactoryPrivate +{ + QtKeySequenceEditorFactory *q_ptr; + Q_DECLARE_PUBLIC(QtKeySequenceEditorFactory) +public: + + void slotPropertyChanged(QtProperty *property, const QKeySequence &value); + void slotSetValue(const QKeySequence &value); +}; + +void QtKeySequenceEditorFactoryPrivate::slotPropertyChanged(QtProperty *property, + const QKeySequence &value) +{ + if (!m_createdEditors.contains(property)) + return; + + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QtKeySequenceEdit *editor = itEditor.next(); + editor->blockSignals(true); + editor->setKeySequence(value); + editor->blockSignals(false); + } +} + +void QtKeySequenceEditorFactoryPrivate::slotSetValue(const QKeySequence &value) +{ + QObject *object = q_ptr->sender(); + const QMap::ConstIterator ecend = m_editorToProperty.constEnd(); + for (QMap::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor) + if (itEditor.key() == object) { + QtProperty *property = itEditor.value(); + QtKeySequencePropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + manager->setValue(property, value); + return; + } +} + +/*! + \class QtKeySequenceEditorFactory + + \brief The QtKeySequenceEditorFactory class provides editor + widgets for properties created by QtKeySequencePropertyManager objects. + + \sa QtAbstractEditorFactory +*/ + +/*! + Creates a factory with the given \a parent. +*/ +QtKeySequenceEditorFactory::QtKeySequenceEditorFactory(QObject *parent) + : QtAbstractEditorFactory(parent) +{ + d_ptr = new QtKeySequenceEditorFactoryPrivate(); + d_ptr->q_ptr = this; + +} + +/*! + Destroys this factory, and all the widgets it has created. +*/ +QtKeySequenceEditorFactory::~QtKeySequenceEditorFactory() +{ + qDeleteAll(d_ptr->m_editorToProperty.keys()); + delete d_ptr; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtKeySequenceEditorFactory::connectPropertyManager(QtKeySequencePropertyManager *manager) +{ + connect(manager, SIGNAL(valueChanged(QtProperty *, const QKeySequence &)), + this, SLOT(slotPropertyChanged(QtProperty *, const QKeySequence &))); +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +QWidget *QtKeySequenceEditorFactory::createEditor(QtKeySequencePropertyManager *manager, + QtProperty *property, QWidget *parent) +{ + QtKeySequenceEdit *editor = d_ptr->createEditor(property, parent); + editor->setKeySequence(manager->value(property)); + + connect(editor, SIGNAL(keySequenceChanged(const QKeySequence &)), + this, SLOT(slotSetValue(const QKeySequence &))); + connect(editor, SIGNAL(destroyed(QObject *)), + this, SLOT(slotEditorDestroyed(QObject *))); + return editor; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtKeySequenceEditorFactory::disconnectPropertyManager(QtKeySequencePropertyManager *manager) +{ + disconnect(manager, SIGNAL(valueChanged(QtProperty *, const QKeySequence &)), + this, SLOT(slotPropertyChanged(QtProperty *, const QKeySequence &))); +} + +// QtCharEdit + +class QtCharEdit : public QWidget +{ + Q_OBJECT +public: + QtCharEdit(QWidget *parent = 0); + + QChar value() const; + bool eventFilter(QObject *o, QEvent *e); +public Q_SLOTS: + void setValue(const QChar &value); +Q_SIGNALS: + void valueChanged(const QChar &value); +protected: + void focusInEvent(QFocusEvent *e); + void focusOutEvent(QFocusEvent *e); + void keyPressEvent(QKeyEvent *e); + void keyReleaseEvent(QKeyEvent *e); + bool event(QEvent *e); +private slots: + void slotClearChar(); +private: + void handleKeyEvent(QKeyEvent *e); + + QChar m_value; + QLineEdit *m_lineEdit; +}; + +QtCharEdit::QtCharEdit(QWidget *parent) + : QWidget(parent), m_lineEdit(new QLineEdit(this)) +{ + QHBoxLayout *layout = new QHBoxLayout(this); + layout->addWidget(m_lineEdit); + layout->setMargin(0); + m_lineEdit->installEventFilter(this); + m_lineEdit->setReadOnly(true); + m_lineEdit->setFocusProxy(this); + setFocusPolicy(m_lineEdit->focusPolicy()); + setAttribute(Qt::WA_InputMethodEnabled); +} + +bool QtCharEdit::eventFilter(QObject *o, QEvent *e) +{ + if (o == m_lineEdit && e->type() == QEvent::ContextMenu) { + QContextMenuEvent *c = static_cast(e); + QMenu *menu = m_lineEdit->createStandardContextMenu(); + QList actions = menu->actions(); + QListIterator itAction(actions); + while (itAction.hasNext()) { + QAction *action = itAction.next(); + action->setShortcut(QKeySequence()); + QString actionString = action->text(); + const int pos = actionString.lastIndexOf(QLatin1Char('\t')); + if (pos > 0) + actionString = actionString.remove(pos, actionString.length() - pos); + action->setText(actionString); + } + QAction *actionBefore = 0; + if (actions.count() > 0) + actionBefore = actions[0]; + QAction *clearAction = new QAction(tr("Clear Char"), menu); + menu->insertAction(actionBefore, clearAction); + menu->insertSeparator(actionBefore); + clearAction->setEnabled(!m_value.isNull()); + connect(clearAction, SIGNAL(triggered()), this, SLOT(slotClearChar())); + menu->exec(c->globalPos()); + delete menu; + e->accept(); + return true; + } + + return QWidget::eventFilter(o, e); +} + +void QtCharEdit::slotClearChar() +{ + if (m_value.isNull()) + return; + setValue(QChar()); + emit valueChanged(m_value); +} + +void QtCharEdit::handleKeyEvent(QKeyEvent *e) +{ + const int key = e->key(); + switch (key) { + case Qt::Key_Control: + case Qt::Key_Shift: + case Qt::Key_Meta: + case Qt::Key_Alt: + case Qt::Key_Super_L: + case Qt::Key_Return: + return; + default: + break; + } + + const QString text = e->text(); + if (text.count() != 1) + return; + + const QChar c = text.at(0); + if (!c.isPrint()) + return; + + if (m_value == c) + return; + + m_value = c; + const QString str = m_value.isNull() ? QString() : QString(m_value); + m_lineEdit->setText(str); + e->accept(); + emit valueChanged(m_value); +} + +void QtCharEdit::setValue(const QChar &value) +{ + if (value == m_value) + return; + + m_value = value; + QString str = value.isNull() ? QString() : QString(value); + m_lineEdit->setText(str); +} + +QChar QtCharEdit::value() const +{ + return m_value; +} + +void QtCharEdit::focusInEvent(QFocusEvent *e) +{ + m_lineEdit->event(e); + m_lineEdit->selectAll(); + QWidget::focusInEvent(e); +} + +void QtCharEdit::focusOutEvent(QFocusEvent *e) +{ + m_lineEdit->event(e); + QWidget::focusOutEvent(e); +} + +void QtCharEdit::keyPressEvent(QKeyEvent *e) +{ + handleKeyEvent(e); + e->accept(); +} + +void QtCharEdit::keyReleaseEvent(QKeyEvent *e) +{ + m_lineEdit->event(e); +} + +bool QtCharEdit::event(QEvent *e) +{ + switch(e->type()) { + case QEvent::Shortcut: + case QEvent::ShortcutOverride: + case QEvent::KeyRelease: + e->accept(); + return true; + default: + break; + } + return QWidget::event(e); +} + +// QtCharEditorFactory + +class QtCharEditorFactoryPrivate : public EditorFactoryPrivate +{ + QtCharEditorFactory *q_ptr; + Q_DECLARE_PUBLIC(QtCharEditorFactory) +public: + + void slotPropertyChanged(QtProperty *property, const QChar &value); + void slotSetValue(const QChar &value); + +}; + +void QtCharEditorFactoryPrivate::slotPropertyChanged(QtProperty *property, + const QChar &value) +{ + if (!m_createdEditors.contains(property)) + return; + + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QtCharEdit *editor = itEditor.next(); + editor->blockSignals(true); + editor->setValue(value); + editor->blockSignals(false); + } +} + +void QtCharEditorFactoryPrivate::slotSetValue(const QChar &value) +{ + QObject *object = q_ptr->sender(); + const QMap::ConstIterator ecend = m_editorToProperty.constEnd(); + for (QMap::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor) + if (itEditor.key() == object) { + QtProperty *property = itEditor.value(); + QtCharPropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + manager->setValue(property, value); + return; + } +} + +/*! + \class QtCharEditorFactory + + \brief The QtCharEditorFactory class provides editor + widgets for properties created by QtCharPropertyManager objects. + + \sa QtAbstractEditorFactory +*/ + +/*! + Creates a factory with the given \a parent. +*/ +QtCharEditorFactory::QtCharEditorFactory(QObject *parent) + : QtAbstractEditorFactory(parent) +{ + d_ptr = new QtCharEditorFactoryPrivate(); + d_ptr->q_ptr = this; + +} + +/*! + Destroys this factory, and all the widgets it has created. +*/ +QtCharEditorFactory::~QtCharEditorFactory() +{ + qDeleteAll(d_ptr->m_editorToProperty.keys()); + delete d_ptr; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtCharEditorFactory::connectPropertyManager(QtCharPropertyManager *manager) +{ + connect(manager, SIGNAL(valueChanged(QtProperty *, const QChar &)), + this, SLOT(slotPropertyChanged(QtProperty *, const QChar &))); +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +QWidget *QtCharEditorFactory::createEditor(QtCharPropertyManager *manager, + QtProperty *property, QWidget *parent) +{ + QtCharEdit *editor = d_ptr->createEditor(property, parent); + editor->setValue(manager->value(property)); + + connect(editor, SIGNAL(valueChanged(const QChar &)), + this, SLOT(slotSetValue(const QChar &))); + connect(editor, SIGNAL(destroyed(QObject *)), + this, SLOT(slotEditorDestroyed(QObject *))); + return editor; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtCharEditorFactory::disconnectPropertyManager(QtCharPropertyManager *manager) +{ + disconnect(manager, SIGNAL(valueChanged(QtProperty *, const QChar &)), + this, SLOT(slotPropertyChanged(QtProperty *, const QChar &))); +} + +// QtEnumEditorFactory + +class QtEnumEditorFactoryPrivate : public EditorFactoryPrivate +{ + QtEnumEditorFactory *q_ptr; + Q_DECLARE_PUBLIC(QtEnumEditorFactory) +public: + + void slotPropertyChanged(QtProperty *property, int value); + void slotEnumNamesChanged(QtProperty *property, const QStringList &); + void slotEnumIconsChanged(QtProperty *property, const QMap &); + void slotSetValue(int value); +}; + +void QtEnumEditorFactoryPrivate::slotPropertyChanged(QtProperty *property, int value) +{ + if (!m_createdEditors.contains(property)) + return; + + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QComboBox *editor = itEditor.next(); + editor->blockSignals(true); + editor->setCurrentIndex(value); + editor->blockSignals(false); + } +} + +void QtEnumEditorFactoryPrivate::slotEnumNamesChanged(QtProperty *property, + const QStringList &enumNames) +{ + if (!m_createdEditors.contains(property)) + return; + + QtEnumPropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + + QMap enumIcons = manager->enumIcons(property); + + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QComboBox *editor = itEditor.next(); + editor->blockSignals(true); + editor->clear(); + editor->addItems(enumNames); + const int nameCount = enumNames.count(); + for (int i = 0; i < nameCount; i++) + editor->setItemIcon(i, enumIcons.value(i)); + editor->setCurrentIndex(manager->value(property)); + editor->blockSignals(false); + } +} + +void QtEnumEditorFactoryPrivate::slotEnumIconsChanged(QtProperty *property, + const QMap &enumIcons) +{ + if (!m_createdEditors.contains(property)) + return; + + QtEnumPropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + + const QStringList enumNames = manager->enumNames(property); + QListIterator itEditor(m_createdEditors[property]); + while (itEditor.hasNext()) { + QComboBox *editor = itEditor.next(); + editor->blockSignals(true); + const int nameCount = enumNames.count(); + for (int i = 0; i < nameCount; i++) + editor->setItemIcon(i, enumIcons.value(i)); + editor->setCurrentIndex(manager->value(property)); + editor->blockSignals(false); + } +} + +void QtEnumEditorFactoryPrivate::slotSetValue(int value) +{ + QObject *object = q_ptr->sender(); + const QMap::ConstIterator ecend = m_editorToProperty.constEnd(); + for (QMap::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor) + if (itEditor.key() == object) { + QtProperty *property = itEditor.value(); + QtEnumPropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + manager->setValue(property, value); + return; + } +} + +/*! + \class QtEnumEditorFactory + + \brief The QtEnumEditorFactory class provides QComboBox widgets for + properties created by QtEnumPropertyManager objects. + + \sa QtAbstractEditorFactory, QtEnumPropertyManager +*/ + +/*! + Creates a factory with the given \a parent. +*/ +QtEnumEditorFactory::QtEnumEditorFactory(QObject *parent) + : QtAbstractEditorFactory(parent) +{ + d_ptr = new QtEnumEditorFactoryPrivate(); + d_ptr->q_ptr = this; + +} + +/*! + Destroys this factory, and all the widgets it has created. +*/ +QtEnumEditorFactory::~QtEnumEditorFactory() +{ + qDeleteAll(d_ptr->m_editorToProperty.keys()); + delete d_ptr; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtEnumEditorFactory::connectPropertyManager(QtEnumPropertyManager *manager) +{ + connect(manager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotPropertyChanged(QtProperty *, int))); + connect(manager, SIGNAL(enumNamesChanged(QtProperty *, const QStringList &)), + this, SLOT(slotEnumNamesChanged(QtProperty *, const QStringList &))); +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +QWidget *QtEnumEditorFactory::createEditor(QtEnumPropertyManager *manager, QtProperty *property, + QWidget *parent) +{ + QComboBox *editor = d_ptr->createEditor(property, parent); + editor->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed); + editor->view()->setTextElideMode(Qt::ElideRight); + QStringList enumNames = manager->enumNames(property); + editor->addItems(enumNames); + QMap enumIcons = manager->enumIcons(property); + const int enumNamesCount = enumNames.count(); + for (int i = 0; i < enumNamesCount; i++) + editor->setItemIcon(i, enumIcons.value(i)); + editor->setCurrentIndex(manager->value(property)); + + connect(editor, SIGNAL(currentIndexChanged(int)), this, SLOT(slotSetValue(int))); + connect(editor, SIGNAL(destroyed(QObject *)), + this, SLOT(slotEditorDestroyed(QObject *))); + return editor; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtEnumEditorFactory::disconnectPropertyManager(QtEnumPropertyManager *manager) +{ + disconnect(manager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotPropertyChanged(QtProperty *, int))); + disconnect(manager, SIGNAL(enumNamesChanged(QtProperty *, const QStringList &)), + this, SLOT(slotEnumNamesChanged(QtProperty *, const QStringList &))); +} + +// QtCursorEditorFactory + +Q_GLOBAL_STATIC(QtCursorDatabase, cursorDatabase) + +class QtCursorEditorFactoryPrivate +{ + QtCursorEditorFactory *q_ptr; + Q_DECLARE_PUBLIC(QtCursorEditorFactory) +public: + QtCursorEditorFactoryPrivate(); + + void slotPropertyChanged(QtProperty *property, const QCursor &cursor); + void slotEnumChanged(QtProperty *property, int value); + void slotEditorDestroyed(QObject *object); + + QtEnumEditorFactory *m_enumEditorFactory; + QtEnumPropertyManager *m_enumPropertyManager; + + QMap m_propertyToEnum; + QMap m_enumToProperty; + QMap > m_enumToEditors; + QMap m_editorToEnum; + bool m_updatingEnum; +}; + +QtCursorEditorFactoryPrivate::QtCursorEditorFactoryPrivate() + : m_updatingEnum(false) +{ + +} + +void QtCursorEditorFactoryPrivate::slotPropertyChanged(QtProperty *property, const QCursor &cursor) +{ + // update enum property + QtProperty *enumProp = m_propertyToEnum.value(property); + if (!enumProp) + return; + + m_updatingEnum = true; + m_enumPropertyManager->setValue(enumProp, cursorDatabase()->cursorToValue(cursor)); + m_updatingEnum = false; +} + +void QtCursorEditorFactoryPrivate::slotEnumChanged(QtProperty *property, int value) +{ + if (m_updatingEnum) + return; + // update cursor property + QtProperty *prop = m_enumToProperty.value(property); + if (!prop) + return; + QtCursorPropertyManager *cursorManager = q_ptr->propertyManager(prop); + if (!cursorManager) + return; +#ifndef QT_NO_CURSOR + cursorManager->setValue(prop, QCursor(cursorDatabase()->valueToCursor(value))); +#endif +} + +void QtCursorEditorFactoryPrivate::slotEditorDestroyed(QObject *object) +{ + // remove from m_editorToEnum map; + // remove from m_enumToEditors map; + // if m_enumToEditors doesn't contains more editors delete enum property; + const QMap::ConstIterator ecend = m_editorToEnum.constEnd(); + for (QMap::ConstIterator itEditor = m_editorToEnum.constBegin(); itEditor != ecend; ++itEditor) + if (itEditor.key() == object) { + QWidget *editor = itEditor.key(); + QtProperty *enumProp = itEditor.value(); + m_editorToEnum.remove(editor); + m_enumToEditors[enumProp].removeAll(editor); + if (m_enumToEditors[enumProp].isEmpty()) { + m_enumToEditors.remove(enumProp); + QtProperty *property = m_enumToProperty.value(enumProp); + m_enumToProperty.remove(enumProp); + m_propertyToEnum.remove(property); + delete enumProp; + } + return; + } +} + +/*! + \class QtCursorEditorFactory + + \brief The QtCursorEditorFactory class provides QComboBox widgets for + properties created by QtCursorPropertyManager objects. + + \sa QtAbstractEditorFactory, QtCursorPropertyManager +*/ + +/*! + Creates a factory with the given \a parent. +*/ +QtCursorEditorFactory::QtCursorEditorFactory(QObject *parent) + : QtAbstractEditorFactory(parent) +{ + d_ptr = new QtCursorEditorFactoryPrivate(); + d_ptr->q_ptr = this; + + d_ptr->m_enumEditorFactory = new QtEnumEditorFactory(this); + d_ptr->m_enumPropertyManager = new QtEnumPropertyManager(this); + connect(d_ptr->m_enumPropertyManager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotEnumChanged(QtProperty *, int))); + d_ptr->m_enumEditorFactory->addPropertyManager(d_ptr->m_enumPropertyManager); +} + +/*! + Destroys this factory, and all the widgets it has created. +*/ +QtCursorEditorFactory::~QtCursorEditorFactory() +{ + delete d_ptr; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtCursorEditorFactory::connectPropertyManager(QtCursorPropertyManager *manager) +{ + connect(manager, SIGNAL(valueChanged(QtProperty *, const QCursor &)), + this, SLOT(slotPropertyChanged(QtProperty *, const QCursor &))); +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +QWidget *QtCursorEditorFactory::createEditor(QtCursorPropertyManager *manager, QtProperty *property, + QWidget *parent) +{ + QtProperty *enumProp = 0; + if (d_ptr->m_propertyToEnum.contains(property)) { + enumProp = d_ptr->m_propertyToEnum[property]; + } else { + enumProp = d_ptr->m_enumPropertyManager->addProperty(property->propertyName()); + d_ptr->m_enumPropertyManager->setEnumNames(enumProp, cursorDatabase()->cursorShapeNames()); + d_ptr->m_enumPropertyManager->setEnumIcons(enumProp, cursorDatabase()->cursorShapeIcons()); +#ifndef QT_NO_CURSOR + d_ptr->m_enumPropertyManager->setValue(enumProp, cursorDatabase()->cursorToValue(manager->value(property))); +#endif + d_ptr->m_propertyToEnum[property] = enumProp; + d_ptr->m_enumToProperty[enumProp] = property; + } + QtAbstractEditorFactoryBase *af = d_ptr->m_enumEditorFactory; + QWidget *editor = af->createEditor(enumProp, parent); + d_ptr->m_enumToEditors[enumProp].append(editor); + d_ptr->m_editorToEnum[editor] = enumProp; + connect(editor, SIGNAL(destroyed(QObject *)), + this, SLOT(slotEditorDestroyed(QObject *))); + return editor; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtCursorEditorFactory::disconnectPropertyManager(QtCursorPropertyManager *manager) +{ + disconnect(manager, SIGNAL(valueChanged(QtProperty *, const QCursor &)), + this, SLOT(slotPropertyChanged(QtProperty *, const QCursor &))); +} + +// QtColorEditWidget + +class QtColorEditWidget : public QWidget { + Q_OBJECT + +public: + QtColorEditWidget(QWidget *parent); + + bool eventFilter(QObject *obj, QEvent *ev); + +public Q_SLOTS: + void setValue(const QColor &value); + +private Q_SLOTS: + void buttonClicked(); + +Q_SIGNALS: + void valueChanged(const QColor &value); + +private: + QColor m_color; + QLabel *m_pixmapLabel; + QLabel *m_label; + QToolButton *m_button; +}; + +QtColorEditWidget::QtColorEditWidget(QWidget *parent) : + QWidget(parent), + m_pixmapLabel(new QLabel), + m_label(new QLabel), + m_button(new QToolButton) +{ + QHBoxLayout *lt = new QHBoxLayout(this); + setupTreeViewEditorMargin(lt); + lt->setSpacing(0); + lt->addWidget(m_pixmapLabel); + lt->addWidget(m_label); + lt->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Ignored)); + + m_button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Ignored); + m_button->setFixedWidth(20); + setFocusProxy(m_button); + setFocusPolicy(m_button->focusPolicy()); + m_button->setText(tr("...")); + m_button->installEventFilter(this); + connect(m_button, SIGNAL(clicked()), this, SLOT(buttonClicked())); + lt->addWidget(m_button); + m_pixmapLabel->setPixmap(QtPropertyBrowserUtils::brushValuePixmap(QBrush(m_color))); + m_label->setText(QtPropertyBrowserUtils::colorValueText(m_color)); +} + +void QtColorEditWidget::setValue(const QColor &c) +{ + if (m_color != c) { + m_color = c; + m_pixmapLabel->setPixmap(QtPropertyBrowserUtils::brushValuePixmap(QBrush(c))); + m_label->setText(QtPropertyBrowserUtils::colorValueText(c)); + } +} + +void QtColorEditWidget::buttonClicked() +{ + bool ok = false; + QRgb oldRgba = m_color.rgba(); + QRgb newRgba = QColorDialog::getRgba(oldRgba, &ok, this); + if (ok && newRgba != oldRgba) { + setValue(QColor::fromRgba(newRgba)); + emit valueChanged(m_color); + } +} + +bool QtColorEditWidget::eventFilter(QObject *obj, QEvent *ev) +{ + if (obj == m_button) { + switch (ev->type()) { + case QEvent::KeyPress: + case QEvent::KeyRelease: { // Prevent the QToolButton from handling Enter/Escape meant control the delegate + switch (static_cast(ev)->key()) { + case Qt::Key_Escape: + case Qt::Key_Enter: + case Qt::Key_Return: + ev->ignore(); + return true; + default: + break; + } + } + break; + default: + break; + } + } + return QWidget::eventFilter(obj, ev); +} + +// QtColorEditorFactoryPrivate + +class QtColorEditorFactoryPrivate : public EditorFactoryPrivate +{ + QtColorEditorFactory *q_ptr; + Q_DECLARE_PUBLIC(QtColorEditorFactory) +public: + + void slotPropertyChanged(QtProperty *property, const QColor &value); + void slotSetValue(const QColor &value); +}; + +void QtColorEditorFactoryPrivate::slotPropertyChanged(QtProperty *property, + const QColor &value) +{ + const PropertyToEditorListMap::iterator it = m_createdEditors.find(property); + if (it == m_createdEditors.end()) + return; + QListIterator itEditor(it.value()); + + while (itEditor.hasNext()) + itEditor.next()->setValue(value); +} + +void QtColorEditorFactoryPrivate::slotSetValue(const QColor &value) +{ + QObject *object = q_ptr->sender(); + const EditorToPropertyMap::ConstIterator ecend = m_editorToProperty.constEnd(); + for (EditorToPropertyMap::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor) + if (itEditor.key() == object) { + QtProperty *property = itEditor.value(); + QtColorPropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + manager->setValue(property, value); + return; + } +} + +/*! + \class QtColorEditorFactory + + \brief The QtColorEditorFactory class provides color editing for + properties created by QtColorPropertyManager objects. + + \sa QtAbstractEditorFactory, QtColorPropertyManager +*/ + +/*! + Creates a factory with the given \a parent. +*/ +QtColorEditorFactory::QtColorEditorFactory(QObject *parent) : + QtAbstractEditorFactory(parent), + d_ptr(new QtColorEditorFactoryPrivate()) +{ + d_ptr->q_ptr = this; +} + +/*! + Destroys this factory, and all the widgets it has created. +*/ +QtColorEditorFactory::~QtColorEditorFactory() +{ + qDeleteAll(d_ptr->m_editorToProperty.keys()); + delete d_ptr; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtColorEditorFactory::connectPropertyManager(QtColorPropertyManager *manager) +{ + connect(manager, SIGNAL(valueChanged(QtProperty*,QColor)), + this, SLOT(slotPropertyChanged(QtProperty*,QColor))); +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +QWidget *QtColorEditorFactory::createEditor(QtColorPropertyManager *manager, + QtProperty *property, QWidget *parent) +{ + QtColorEditWidget *editor = d_ptr->createEditor(property, parent); + editor->setValue(manager->value(property)); + connect(editor, SIGNAL(valueChanged(QColor)), this, SLOT(slotSetValue(QColor))); + connect(editor, SIGNAL(destroyed(QObject *)), this, SLOT(slotEditorDestroyed(QObject *))); + return editor; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtColorEditorFactory::disconnectPropertyManager(QtColorPropertyManager *manager) +{ + disconnect(manager, SIGNAL(valueChanged(QtProperty*,QColor)), this, SLOT(slotPropertyChanged(QtProperty*,QColor))); +} + +// QtFontEditWidget + +class QtFontEditWidget : public QWidget { + Q_OBJECT + +public: + QtFontEditWidget(QWidget *parent); + + bool eventFilter(QObject *obj, QEvent *ev); + +public Q_SLOTS: + void setValue(const QFont &value); + +private Q_SLOTS: + void buttonClicked(); + +Q_SIGNALS: + void valueChanged(const QFont &value); + +private: + QFont m_font; + QLabel *m_pixmapLabel; + QLabel *m_label; + QToolButton *m_button; +}; + +QtFontEditWidget::QtFontEditWidget(QWidget *parent) : + QWidget(parent), + m_pixmapLabel(new QLabel), + m_label(new QLabel), + m_button(new QToolButton) +{ + QHBoxLayout *lt = new QHBoxLayout(this); + setupTreeViewEditorMargin(lt); + lt->setSpacing(0); + lt->addWidget(m_pixmapLabel); + lt->addWidget(m_label); + lt->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Ignored)); + + m_button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Ignored); + m_button->setFixedWidth(20); + setFocusProxy(m_button); + setFocusPolicy(m_button->focusPolicy()); + m_button->setText(tr("...")); + m_button->installEventFilter(this); + connect(m_button, SIGNAL(clicked()), this, SLOT(buttonClicked())); + lt->addWidget(m_button); + m_pixmapLabel->setPixmap(QtPropertyBrowserUtils::fontValuePixmap(m_font)); + m_label->setText(QtPropertyBrowserUtils::fontValueText(m_font)); +} + +void QtFontEditWidget::setValue(const QFont &f) +{ + if (m_font != f) { + m_font = f; + m_pixmapLabel->setPixmap(QtPropertyBrowserUtils::fontValuePixmap(f)); + m_label->setText(QtPropertyBrowserUtils::fontValueText(f)); + } +} + +void QtFontEditWidget::buttonClicked() +{ + bool ok = false; + QFont newFont = QFontDialog::getFont(&ok, m_font, this, tr("Select Font")); + if (ok && newFont != m_font) { + QFont f = m_font; + // prevent mask for unchanged attributes, don't change other attributes (like kerning, etc...) + if (m_font.family() != newFont.family()) + f.setFamily(newFont.family()); + if (m_font.pointSize() != newFont.pointSize()) + f.setPointSize(newFont.pointSize()); + if (m_font.bold() != newFont.bold()) + f.setBold(newFont.bold()); + if (m_font.italic() != newFont.italic()) + f.setItalic(newFont.italic()); + if (m_font.underline() != newFont.underline()) + f.setUnderline(newFont.underline()); + if (m_font.strikeOut() != newFont.strikeOut()) + f.setStrikeOut(newFont.strikeOut()); + setValue(f); + emit valueChanged(m_font); + } +} + +bool QtFontEditWidget::eventFilter(QObject *obj, QEvent *ev) +{ + if (obj == m_button) { + switch (ev->type()) { + case QEvent::KeyPress: + case QEvent::KeyRelease: { // Prevent the QToolButton from handling Enter/Escape meant control the delegate + switch (static_cast(ev)->key()) { + case Qt::Key_Escape: + case Qt::Key_Enter: + case Qt::Key_Return: + ev->ignore(); + return true; + default: + break; + } + } + break; + default: + break; + } + } + return QWidget::eventFilter(obj, ev); +} + +// QtFontEditorFactoryPrivate + +class QtFontEditorFactoryPrivate : public EditorFactoryPrivate +{ + QtFontEditorFactory *q_ptr; + Q_DECLARE_PUBLIC(QtFontEditorFactory) +public: + + void slotPropertyChanged(QtProperty *property, const QFont &value); + void slotSetValue(const QFont &value); +}; + +void QtFontEditorFactoryPrivate::slotPropertyChanged(QtProperty *property, + const QFont &value) +{ + const PropertyToEditorListMap::iterator it = m_createdEditors.find(property); + if (it == m_createdEditors.end()) + return; + QListIterator itEditor(it.value()); + + while (itEditor.hasNext()) + itEditor.next()->setValue(value); +} + +void QtFontEditorFactoryPrivate::slotSetValue(const QFont &value) +{ + QObject *object = q_ptr->sender(); + const EditorToPropertyMap::ConstIterator ecend = m_editorToProperty.constEnd(); + for (EditorToPropertyMap::ConstIterator itEditor = m_editorToProperty.constBegin(); itEditor != ecend; ++itEditor) + if (itEditor.key() == object) { + QtProperty *property = itEditor.value(); + QtFontPropertyManager *manager = q_ptr->propertyManager(property); + if (!manager) + return; + manager->setValue(property, value); + return; + } +} + +/*! + \class QtFontEditorFactory + + \brief The QtFontEditorFactory class provides font editing for + properties created by QtFontPropertyManager objects. + + \sa QtAbstractEditorFactory, QtFontPropertyManager +*/ + +/*! + Creates a factory with the given \a parent. +*/ +QtFontEditorFactory::QtFontEditorFactory(QObject *parent) : + QtAbstractEditorFactory(parent), + d_ptr(new QtFontEditorFactoryPrivate()) +{ + d_ptr->q_ptr = this; +} + +/*! + Destroys this factory, and all the widgets it has created. +*/ +QtFontEditorFactory::~QtFontEditorFactory() +{ + qDeleteAll(d_ptr->m_editorToProperty.keys()); + delete d_ptr; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtFontEditorFactory::connectPropertyManager(QtFontPropertyManager *manager) +{ + connect(manager, SIGNAL(valueChanged(QtProperty*,QFont)), + this, SLOT(slotPropertyChanged(QtProperty*,QFont))); +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +QWidget *QtFontEditorFactory::createEditor(QtFontPropertyManager *manager, + QtProperty *property, QWidget *parent) +{ + QtFontEditWidget *editor = d_ptr->createEditor(property, parent); + editor->setValue(manager->value(property)); + connect(editor, SIGNAL(valueChanged(QFont)), this, SLOT(slotSetValue(QFont))); + connect(editor, SIGNAL(destroyed(QObject *)), this, SLOT(slotEditorDestroyed(QObject *))); + return editor; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtFontEditorFactory::disconnectPropertyManager(QtFontPropertyManager *manager) +{ + disconnect(manager, SIGNAL(valueChanged(QtProperty*,QFont)), this, SLOT(slotPropertyChanged(QtProperty*,QFont))); +} + +#if QT_VERSION >= 0x040400 +QT_END_NAMESPACE +#endif + +#include "moc_qteditorfactory.cxx" +#include "qteditorfactory.moc" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qteditorfactory.h b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qteditorfactory.h new file mode 100644 index 000000000..47e7b507f --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qteditorfactory.h @@ -0,0 +1,448 @@ +/**************************************************************************** +** +** This file is part of a Qt Solutions component. +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QTEDITORFACTORY_H +#define QTEDITORFACTORY_H + +#include "qtpropertymanager.h" + +#if QT_VERSION >= 0x040400 +QT_BEGIN_NAMESPACE +#endif + +class QtSpinBoxFactoryPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtSpinBoxFactory : public QtAbstractEditorFactory +{ + Q_OBJECT +public: + QtSpinBoxFactory(QObject *parent = 0); + ~QtSpinBoxFactory(); +protected: + void connectPropertyManager(QtIntPropertyManager *manager); + QWidget *createEditor(QtIntPropertyManager *manager, QtProperty *property, + QWidget *parent); + void disconnectPropertyManager(QtIntPropertyManager *manager); +private: + QtSpinBoxFactoryPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtSpinBoxFactory) + Q_DISABLE_COPY(QtSpinBoxFactory) + Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, int, int)) + Q_PRIVATE_SLOT(d_func(), void slotSingleStepChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotSetValue(int)) + Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *)) +}; + +class QtSliderFactoryPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtSliderFactory : public QtAbstractEditorFactory +{ + Q_OBJECT +public: + QtSliderFactory(QObject *parent = 0); + ~QtSliderFactory(); +protected: + void connectPropertyManager(QtIntPropertyManager *manager); + QWidget *createEditor(QtIntPropertyManager *manager, QtProperty *property, + QWidget *parent); + void disconnectPropertyManager(QtIntPropertyManager *manager); +private: + QtSliderFactoryPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtSliderFactory) + Q_DISABLE_COPY(QtSliderFactory) + Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, int, int)) + Q_PRIVATE_SLOT(d_func(), void slotSingleStepChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotSetValue(int)) + Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *)) +}; + +class QtScrollBarFactoryPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtScrollBarFactory : public QtAbstractEditorFactory +{ + Q_OBJECT +public: + QtScrollBarFactory(QObject *parent = 0); + ~QtScrollBarFactory(); +protected: + void connectPropertyManager(QtIntPropertyManager *manager); + QWidget *createEditor(QtIntPropertyManager *manager, QtProperty *property, + QWidget *parent); + void disconnectPropertyManager(QtIntPropertyManager *manager); +private: + QtScrollBarFactoryPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtScrollBarFactory) + Q_DISABLE_COPY(QtScrollBarFactory) + Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, int, int)) + Q_PRIVATE_SLOT(d_func(), void slotSingleStepChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotSetValue(int)) + Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *)) +}; + +class QtCheckBoxFactoryPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtCheckBoxFactory : public QtAbstractEditorFactory +{ + Q_OBJECT +public: + QtCheckBoxFactory(QObject *parent = 0); + ~QtCheckBoxFactory(); +protected: + void connectPropertyManager(QtBoolPropertyManager *manager); + QWidget *createEditor(QtBoolPropertyManager *manager, QtProperty *property, + QWidget *parent); + void disconnectPropertyManager(QtBoolPropertyManager *manager); +private: + QtCheckBoxFactoryPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtCheckBoxFactory) + Q_DISABLE_COPY(QtCheckBoxFactory) + Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, bool)) + Q_PRIVATE_SLOT(d_func(), void slotSetValue(bool)) + Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *)) +}; + +class QtDoubleSpinBoxFactoryPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtDoubleSpinBoxFactory : public QtAbstractEditorFactory +{ + Q_OBJECT +public: + QtDoubleSpinBoxFactory(QObject *parent = 0); + ~QtDoubleSpinBoxFactory(); +protected: + void connectPropertyManager(QtDoublePropertyManager *manager); + QWidget *createEditor(QtDoublePropertyManager *manager, QtProperty *property, + QWidget *parent); + void disconnectPropertyManager(QtDoublePropertyManager *manager); +private: + QtDoubleSpinBoxFactoryPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtDoubleSpinBoxFactory) + Q_DISABLE_COPY(QtDoubleSpinBoxFactory) + Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, double)) + Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, double, double)) + Q_PRIVATE_SLOT(d_func(), void slotSingleStepChanged(QtProperty *, double)) + Q_PRIVATE_SLOT(d_func(), void slotDecimalsChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotSetValue(double)) + Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *)) +}; + +class QtLineEditFactoryPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtLineEditFactory : public QtAbstractEditorFactory +{ + Q_OBJECT +public: + QtLineEditFactory(QObject *parent = 0); + ~QtLineEditFactory(); +protected: + void connectPropertyManager(QtStringPropertyManager *manager); + QWidget *createEditor(QtStringPropertyManager *manager, QtProperty *property, + QWidget *parent); + void disconnectPropertyManager(QtStringPropertyManager *manager); +private: + QtLineEditFactoryPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtLineEditFactory) + Q_DISABLE_COPY(QtLineEditFactory) + Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QString &)) + Q_PRIVATE_SLOT(d_func(), void slotRegExpChanged(QtProperty *, const QRegExp &)) + Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QString &)) + Q_PRIVATE_SLOT(d_func(), void slotEditingFinished()) + Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *)) +}; + +class QtDateEditFactoryPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtDateEditFactory : public QtAbstractEditorFactory +{ + Q_OBJECT +public: + QtDateEditFactory(QObject *parent = 0); + ~QtDateEditFactory(); +protected: + void connectPropertyManager(QtDatePropertyManager *manager); + QWidget *createEditor(QtDatePropertyManager *manager, QtProperty *property, + QWidget *parent); + void disconnectPropertyManager(QtDatePropertyManager *manager); +private: + QtDateEditFactoryPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtDateEditFactory) + Q_DISABLE_COPY(QtDateEditFactory) + Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QDate &)) + Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, + const QDate &, const QDate &)) + Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QDate &)) + Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *)) +}; + +class QtTimeEditFactoryPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtTimeEditFactory : public QtAbstractEditorFactory +{ + Q_OBJECT +public: + QtTimeEditFactory(QObject *parent = 0); + ~QtTimeEditFactory(); +protected: + void connectPropertyManager(QtTimePropertyManager *manager); + QWidget *createEditor(QtTimePropertyManager *manager, QtProperty *property, + QWidget *parent); + void disconnectPropertyManager(QtTimePropertyManager *manager); +private: + QtTimeEditFactoryPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtTimeEditFactory) + Q_DISABLE_COPY(QtTimeEditFactory) + Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QTime &)) + Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QTime &)) + Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *)) +}; + +class QtDateTimeEditFactoryPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtDateTimeEditFactory : public QtAbstractEditorFactory +{ + Q_OBJECT +public: + QtDateTimeEditFactory(QObject *parent = 0); + ~QtDateTimeEditFactory(); +protected: + void connectPropertyManager(QtDateTimePropertyManager *manager); + QWidget *createEditor(QtDateTimePropertyManager *manager, QtProperty *property, + QWidget *parent); + void disconnectPropertyManager(QtDateTimePropertyManager *manager); +private: + QtDateTimeEditFactoryPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtDateTimeEditFactory) + Q_DISABLE_COPY(QtDateTimeEditFactory) + Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QDateTime &)) + Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QDateTime &)) + Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *)) +}; + +class QtKeySequenceEditorFactoryPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtKeySequenceEditorFactory : public QtAbstractEditorFactory +{ + Q_OBJECT +public: + QtKeySequenceEditorFactory(QObject *parent = 0); + ~QtKeySequenceEditorFactory(); +protected: + void connectPropertyManager(QtKeySequencePropertyManager *manager); + QWidget *createEditor(QtKeySequencePropertyManager *manager, QtProperty *property, + QWidget *parent); + void disconnectPropertyManager(QtKeySequencePropertyManager *manager); +private: + QtKeySequenceEditorFactoryPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtKeySequenceEditorFactory) + Q_DISABLE_COPY(QtKeySequenceEditorFactory) + Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QKeySequence &)) + Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QKeySequence &)) + Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *)) +}; + +class QtCharEditorFactoryPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtCharEditorFactory : public QtAbstractEditorFactory +{ + Q_OBJECT +public: + QtCharEditorFactory(QObject *parent = 0); + ~QtCharEditorFactory(); +protected: + void connectPropertyManager(QtCharPropertyManager *manager); + QWidget *createEditor(QtCharPropertyManager *manager, QtProperty *property, + QWidget *parent); + void disconnectPropertyManager(QtCharPropertyManager *manager); +private: + QtCharEditorFactoryPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtCharEditorFactory) + Q_DISABLE_COPY(QtCharEditorFactory) + Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QChar &)) + Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QChar &)) + Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *)) +}; + +class QtEnumEditorFactoryPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtEnumEditorFactory : public QtAbstractEditorFactory +{ + Q_OBJECT +public: + QtEnumEditorFactory(QObject *parent = 0); + ~QtEnumEditorFactory(); +protected: + void connectPropertyManager(QtEnumPropertyManager *manager); + QWidget *createEditor(QtEnumPropertyManager *manager, QtProperty *property, + QWidget *parent); + void disconnectPropertyManager(QtEnumPropertyManager *manager); +private: + QtEnumEditorFactoryPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtEnumEditorFactory) + Q_DISABLE_COPY(QtEnumEditorFactory) + Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotEnumNamesChanged(QtProperty *, + const QStringList &)) + Q_PRIVATE_SLOT(d_func(), void slotEnumIconsChanged(QtProperty *, + const QMap &)) + Q_PRIVATE_SLOT(d_func(), void slotSetValue(int)) + Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *)) +}; + +class QtCursorEditorFactoryPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtCursorEditorFactory : public QtAbstractEditorFactory +{ + Q_OBJECT +public: + QtCursorEditorFactory(QObject *parent = 0); + ~QtCursorEditorFactory(); +protected: + void connectPropertyManager(QtCursorPropertyManager *manager); + QWidget *createEditor(QtCursorPropertyManager *manager, QtProperty *property, + QWidget *parent); + void disconnectPropertyManager(QtCursorPropertyManager *manager); +private: + QtCursorEditorFactoryPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtCursorEditorFactory) + Q_DISABLE_COPY(QtCursorEditorFactory) + Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QCursor &)) + Q_PRIVATE_SLOT(d_func(), void slotEnumChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *)) +}; + +class QtColorEditorFactoryPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtColorEditorFactory : public QtAbstractEditorFactory +{ + Q_OBJECT +public: + QtColorEditorFactory(QObject *parent = 0); + ~QtColorEditorFactory(); +protected: + void connectPropertyManager(QtColorPropertyManager *manager); + QWidget *createEditor(QtColorPropertyManager *manager, QtProperty *property, + QWidget *parent); + void disconnectPropertyManager(QtColorPropertyManager *manager); +private: + QtColorEditorFactoryPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtColorEditorFactory) + Q_DISABLE_COPY(QtColorEditorFactory) + Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QColor &)) + Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *)) + Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QColor &)) +}; + +class QtFontEditorFactoryPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtFontEditorFactory : public QtAbstractEditorFactory +{ + Q_OBJECT +public: + QtFontEditorFactory(QObject *parent = 0); + ~QtFontEditorFactory(); +protected: + void connectPropertyManager(QtFontPropertyManager *manager); + QWidget *createEditor(QtFontPropertyManager *manager, QtProperty *property, + QWidget *parent); + void disconnectPropertyManager(QtFontPropertyManager *manager); +private: + QtFontEditorFactoryPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtFontEditorFactory) + Q_DISABLE_COPY(QtFontEditorFactory) + Q_PRIVATE_SLOT(d_func(), void slotPropertyChanged(QtProperty *, const QFont &)) + Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed(QObject *)) + Q_PRIVATE_SLOT(d_func(), void slotSetValue(const QFont &)) +}; + +#if QT_VERSION >= 0x040400 +QT_END_NAMESPACE +#endif + +#endif diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtgroupboxpropertybrowser.cpp b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtgroupboxpropertybrowser.cpp new file mode 100644 index 000000000..d789c8695 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtgroupboxpropertybrowser.cpp @@ -0,0 +1,578 @@ +/**************************************************************************** +** +** This file is part of a Qt Solutions component. +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qtgroupboxpropertybrowser.h" +#include +#include +#include +#include +#include +#include + +#if QT_VERSION >= 0x040400 +QT_BEGIN_NAMESPACE +#endif + +class QtGroupBoxPropertyBrowserPrivate +{ + QtGroupBoxPropertyBrowser *q_ptr; + Q_DECLARE_PUBLIC(QtGroupBoxPropertyBrowser) +public: + + void init(QWidget *parent); + + void propertyInserted(QtBrowserItem *index, QtBrowserItem *afterIndex); + void propertyRemoved(QtBrowserItem *index); + void propertyChanged(QtBrowserItem *index); + QWidget *createEditor(QtProperty *property, QWidget *parent) const + { return q_ptr->createEditor(property, parent); } + + void slotEditorDestroyed(); + void slotUpdate(); + + struct WidgetItem + { + WidgetItem() : widget(0), label(0), widgetLabel(0), + groupBox(0), layout(0), line(0), parent(0) { } + QWidget *widget; // can be null + QLabel *label; + QLabel *widgetLabel; + QGroupBox *groupBox; + QGridLayout *layout; + QFrame *line; + WidgetItem *parent; + QList children; + }; +private: + void updateLater(); + void updateItem(WidgetItem *item); + void insertRow(QGridLayout *layout, int row) const; + void removeRow(QGridLayout *layout, int row) const; + + bool hasHeader(WidgetItem *item) const; + + QMap m_indexToItem; + QMap m_itemToIndex; + QMap m_widgetToItem; + QGridLayout *m_mainLayout; + QList m_children; + QList m_recreateQueue; +}; + +void QtGroupBoxPropertyBrowserPrivate::init(QWidget *parent) +{ + m_mainLayout = new QGridLayout(); + parent->setLayout(m_mainLayout); + QLayoutItem *item = new QSpacerItem(0, 0, + QSizePolicy::Fixed, QSizePolicy::Expanding); + m_mainLayout->addItem(item, 0, 0); +} + +void QtGroupBoxPropertyBrowserPrivate::slotEditorDestroyed() +{ + QWidget *editor = qobject_cast(q_ptr->sender()); + if (!editor) + return; + if (!m_widgetToItem.contains(editor)) + return; + m_widgetToItem[editor]->widget = 0; + m_widgetToItem.remove(editor); +} + +void QtGroupBoxPropertyBrowserPrivate::slotUpdate() +{ + QListIterator itItem(m_recreateQueue); + while (itItem.hasNext()) { + WidgetItem *item = itItem.next(); + + WidgetItem *par = item->parent; + QWidget *w = 0; + QGridLayout *l = 0; + int oldRow = -1; + if (!par) { + w = q_ptr; + l = m_mainLayout; + oldRow = m_children.indexOf(item); + } else { + w = par->groupBox; + l = par->layout; + oldRow = par->children.indexOf(item); + if (hasHeader(par)) + oldRow += 2; + } + + if (item->widget) { + item->widget->setParent(w); + } else if (item->widgetLabel) { + item->widgetLabel->setParent(w); + } else { + item->widgetLabel = new QLabel(w); + } + int span = 1; + if (item->widget) + l->addWidget(item->widget, oldRow, 1, 1, 1); + else if (item->widgetLabel) + l->addWidget(item->widgetLabel, oldRow, 1, 1, 1); + else + span = 2; + item->label = new QLabel(w); + item->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); + l->addWidget(item->label, oldRow, 0, 1, span); + + updateItem(item); + } + m_recreateQueue.clear(); +} + +void QtGroupBoxPropertyBrowserPrivate::updateLater() +{ + QTimer::singleShot(0, q_ptr, SLOT(slotUpdate())); +} + +void QtGroupBoxPropertyBrowserPrivate::propertyInserted(QtBrowserItem *index, QtBrowserItem *afterIndex) +{ + WidgetItem *afterItem = m_indexToItem.value(afterIndex); + WidgetItem *parentItem = m_indexToItem.value(index->parent()); + + WidgetItem *newItem = new WidgetItem(); + newItem->parent = parentItem; + + QGridLayout *layout = 0; + QWidget *parentWidget = 0; + int row = -1; + if (!afterItem) { + row = 0; + if (parentItem) + parentItem->children.insert(0, newItem); + else + m_children.insert(0, newItem); + } else { + if (parentItem) { + row = parentItem->children.indexOf(afterItem) + 1; + parentItem->children.insert(row, newItem); + } else { + row = m_children.indexOf(afterItem) + 1; + m_children.insert(row, newItem); + } + } + if (parentItem && hasHeader(parentItem)) + row += 2; + + if (!parentItem) { + layout = m_mainLayout; + parentWidget = q_ptr;; + } else { + if (!parentItem->groupBox) { + m_recreateQueue.removeAll(parentItem); + WidgetItem *par = parentItem->parent; + QWidget *w = 0; + QGridLayout *l = 0; + int oldRow = -1; + if (!par) { + w = q_ptr; + l = m_mainLayout; + oldRow = m_children.indexOf(parentItem); + } else { + w = par->groupBox; + l = par->layout; + oldRow = par->children.indexOf(parentItem); + if (hasHeader(par)) + oldRow += 2; + } + parentItem->groupBox = new QGroupBox(w); + parentItem->layout = new QGridLayout(); + parentItem->groupBox->setLayout(parentItem->layout); + if (parentItem->label) { + l->removeWidget(parentItem->label); + delete parentItem->label; + parentItem->label = 0; + } + if (parentItem->widget) { + l->removeWidget(parentItem->widget); + parentItem->widget->setParent(parentItem->groupBox); + parentItem->layout->addWidget(parentItem->widget, 0, 0, 1, 2); + parentItem->line = new QFrame(parentItem->groupBox); + } else if (parentItem->widgetLabel) { + l->removeWidget(parentItem->widgetLabel); + delete parentItem->widgetLabel; + parentItem->widgetLabel = 0; + } + if (parentItem->line) { + parentItem->line->setFrameShape(QFrame::HLine); + parentItem->line->setFrameShadow(QFrame::Sunken); + parentItem->layout->addWidget(parentItem->line, 1, 0, 1, 2); + } + l->addWidget(parentItem->groupBox, oldRow, 0, 1, 2); + updateItem(parentItem); + } + layout = parentItem->layout; + parentWidget = parentItem->groupBox; + } + + newItem->label = new QLabel(parentWidget); + newItem->label->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); + newItem->widget = createEditor(index->property(), parentWidget); + if (!newItem->widget) { + newItem->widgetLabel = new QLabel(parentWidget); + } else { + QObject::connect(newItem->widget, SIGNAL(destroyed()), q_ptr, SLOT(slotEditorDestroyed())); + m_widgetToItem[newItem->widget] = newItem; + } + + insertRow(layout, row); + int span = 1; + if (newItem->widget) + layout->addWidget(newItem->widget, row, 1); + else if (newItem->widgetLabel) + layout->addWidget(newItem->widgetLabel, row, 1); + else + span = 2; + layout->addWidget(newItem->label, row, 0, 1, span); + + m_itemToIndex[newItem] = index; + m_indexToItem[index] = newItem; + + updateItem(newItem); +} + +void QtGroupBoxPropertyBrowserPrivate::propertyRemoved(QtBrowserItem *index) +{ + WidgetItem *item = m_indexToItem.value(index); + + m_indexToItem.remove(index); + m_itemToIndex.remove(item); + + WidgetItem *parentItem = item->parent; + + int row = -1; + + if (parentItem) { + row = parentItem->children.indexOf(item); + parentItem->children.removeAt(row); + if (hasHeader(parentItem)) + row += 2; + } else { + row = m_children.indexOf(item); + m_children.removeAt(row); + } + + if (item->widget) + delete item->widget; + if (item->label) + delete item->label; + if (item->widgetLabel) + delete item->widgetLabel; + if (item->groupBox) + delete item->groupBox; + + if (!parentItem) { + removeRow(m_mainLayout, row); + } else if (parentItem->children.count() != 0) { + removeRow(parentItem->layout, row); + } else { + WidgetItem *par = parentItem->parent; + QWidget *w = 0; + QGridLayout *l = 0; + int oldRow = -1; + if (!par) { + w = q_ptr; + l = m_mainLayout; + oldRow = m_children.indexOf(parentItem); + } else { + w = par->groupBox; + l = par->layout; + oldRow = par->children.indexOf(parentItem); + if (hasHeader(par)) + oldRow += 2; + } + + if (parentItem->widget) { + parentItem->widget->hide(); + parentItem->widget->setParent(0); + } else if (parentItem->widgetLabel) { + parentItem->widgetLabel->hide(); + parentItem->widgetLabel->setParent(0); + } else { + //parentItem->widgetLabel = new QLabel(w); + } + l->removeWidget(parentItem->groupBox); + delete parentItem->groupBox; + parentItem->groupBox = 0; + parentItem->line = 0; + parentItem->layout = 0; + if (!m_recreateQueue.contains(parentItem)) + m_recreateQueue.append(parentItem); + updateLater(); + } + m_recreateQueue.removeAll(item); + + delete item; +} + +void QtGroupBoxPropertyBrowserPrivate::insertRow(QGridLayout *layout, int row) const +{ + QMap itemToPos; + int idx = 0; + while (idx < layout->count()) { + int r, c, rs, cs; + layout->getItemPosition(idx, &r, &c, &rs, &cs); + if (r >= row) { + itemToPos[layout->takeAt(idx)] = QRect(r + 1, c, rs, cs); + } else { + idx++; + } + } + + const QMap::ConstIterator icend = itemToPos.constEnd(); + for (QMap::ConstIterator it = itemToPos.constBegin(); it != icend; ++it) { + const QRect r = it.value(); + layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height()); + } +} + +void QtGroupBoxPropertyBrowserPrivate::removeRow(QGridLayout *layout, int row) const +{ + QMap itemToPos; + int idx = 0; + while (idx < layout->count()) { + int r, c, rs, cs; + layout->getItemPosition(idx, &r, &c, &rs, &cs); + if (r > row) { + itemToPos[layout->takeAt(idx)] = QRect(r - 1, c, rs, cs); + } else { + idx++; + } + } + + const QMap::ConstIterator icend = itemToPos.constEnd(); + for (QMap::ConstIterator it = itemToPos.constBegin(); it != icend; ++it) { + const QRect r = it.value(); + layout->addItem(it.key(), r.x(), r.y(), r.width(), r.height()); + } +} + +bool QtGroupBoxPropertyBrowserPrivate::hasHeader(WidgetItem *item) const +{ + if (item->widget) + return true; + return false; +} + +void QtGroupBoxPropertyBrowserPrivate::propertyChanged(QtBrowserItem *index) +{ + WidgetItem *item = m_indexToItem.value(index); + + updateItem(item); +} + +void QtGroupBoxPropertyBrowserPrivate::updateItem(WidgetItem *item) +{ + QtProperty *property = m_itemToIndex[item]->property(); + if (item->groupBox) { + QFont font = item->groupBox->font(); + font.setUnderline(property->isModified()); + item->groupBox->setFont(font); + item->groupBox->setTitle(property->propertyName()); + item->groupBox->setToolTip(property->toolTip()); + item->groupBox->setStatusTip(property->statusTip()); + item->groupBox->setWhatsThis(property->whatsThis()); + item->groupBox->setEnabled(property->isEnabled()); + } + if (item->label) { + QFont font = item->label->font(); + font.setUnderline(property->isModified()); + item->label->setFont(font); + item->label->setText(property->propertyName()); + item->label->setToolTip(property->toolTip()); + item->label->setStatusTip(property->statusTip()); + item->label->setWhatsThis(property->whatsThis()); + item->label->setEnabled(property->isEnabled()); + } + if (item->widgetLabel) { + QFont font = item->widgetLabel->font(); + font.setUnderline(false); + item->widgetLabel->setFont(font); + item->widgetLabel->setText(property->valueText()); + item->widgetLabel->setEnabled(property->isEnabled()); + } + if (item->widget) { + QFont font = item->widget->font(); + font.setUnderline(false); + item->widget->setFont(font); + item->widget->setEnabled(property->isEnabled()); + item->widget->setToolTip(property->valueText()); + } + //item->setIcon(1, property->valueIcon()); +} + + + +/*! + \class QtGroupBoxPropertyBrowser + + \brief The QtGroupBoxPropertyBrowser class provides a QGroupBox + based property browser. + + A property browser is a widget that enables the user to edit a + given set of properties. Each property is represented by a label + specifying the property's name, and an editing widget (e.g. a line + edit or a combobox) holding its value. A property can have zero or + more subproperties. + + QtGroupBoxPropertyBrowser provides group boxes for all nested + properties, i.e. subproperties are enclosed by a group box with + the parent property's name as its title. For example: + + \image qtgroupboxpropertybrowser.png + + Use the QtAbstractPropertyBrowser API to add, insert and remove + properties from an instance of the QtGroupBoxPropertyBrowser + class. The properties themselves are created and managed by + implementations of the QtAbstractPropertyManager class. + + \sa QtTreePropertyBrowser, QtAbstractPropertyBrowser +*/ + +/*! + Creates a property browser with the given \a parent. +*/ +QtGroupBoxPropertyBrowser::QtGroupBoxPropertyBrowser(QWidget *parent) + : QtAbstractPropertyBrowser(parent) +{ + d_ptr = new QtGroupBoxPropertyBrowserPrivate; + d_ptr->q_ptr = this; + + d_ptr->init(this); +} + +/*! + Destroys this property browser. + + Note that the properties that were inserted into this browser are + \e not destroyed since they may still be used in other + browsers. The properties are owned by the manager that created + them. + + \sa QtProperty, QtAbstractPropertyManager +*/ +QtGroupBoxPropertyBrowser::~QtGroupBoxPropertyBrowser() +{ + const QMap::ConstIterator icend = d_ptr->m_itemToIndex.constEnd(); + for (QMap::ConstIterator it = d_ptr->m_itemToIndex.constBegin(); it != icend; ++it) + delete it.key(); + delete d_ptr; +} + +/*! + \reimp +*/ +void QtGroupBoxPropertyBrowser::itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem) +{ + d_ptr->propertyInserted(item, afterItem); +} + +/*! + \reimp +*/ +void QtGroupBoxPropertyBrowser::itemRemoved(QtBrowserItem *item) +{ + d_ptr->propertyRemoved(item); +} + +/*! + \reimp +*/ +void QtGroupBoxPropertyBrowser::itemChanged(QtBrowserItem *item) +{ + d_ptr->propertyChanged(item); +} + +#if QT_VERSION >= 0x040400 +QT_END_NAMESPACE +#endif + +#include "moc_qtgroupboxpropertybrowser.cxx" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtgroupboxpropertybrowser.h b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtgroupboxpropertybrowser.h new file mode 100644 index 000000000..075f3286e --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtgroupboxpropertybrowser.h @@ -0,0 +1,126 @@ +/**************************************************************************** +** +** This file is part of a Qt Solutions component. +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QTGROUPBOXPROPERTYBROWSER_H +#define QTGROUPBOXPROPERTYBROWSER_H + +#include "qtpropertybrowser.h" + +#if QT_VERSION >= 0x040400 +QT_BEGIN_NAMESPACE +#endif + +class QtGroupBoxPropertyBrowserPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtGroupBoxPropertyBrowser : public QtAbstractPropertyBrowser +{ + Q_OBJECT +public: + + QtGroupBoxPropertyBrowser(QWidget *parent = 0); + ~QtGroupBoxPropertyBrowser(); + +protected: + virtual void itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem); + virtual void itemRemoved(QtBrowserItem *item); + virtual void itemChanged(QtBrowserItem *item); + +private: + + QtGroupBoxPropertyBrowserPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtGroupBoxPropertyBrowser) + Q_DISABLE_COPY(QtGroupBoxPropertyBrowser) + Q_PRIVATE_SLOT(d_func(), void slotUpdate()) + Q_PRIVATE_SLOT(d_func(), void slotEditorDestroyed()) + +}; + +#if QT_VERSION >= 0x040400 +QT_END_NAMESPACE +#endif + +#endif diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowser.cpp b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowser.cpp new file mode 100644 index 000000000..e8c103d9b --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowser.cpp @@ -0,0 +1,2053 @@ +/**************************************************************************** +** +** This file is part of a Qt Solutions component. +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qtpropertybrowser.h" +#include +#include +#include + +#if defined(Q_CC_MSVC) +# pragma warning(disable: 4786) /* MS VS 6: truncating debug info after 255 characters */ +#endif + +#if QT_VERSION >= 0x040400 +QT_BEGIN_NAMESPACE +#endif + +class QtPropertyPrivate +{ +public: + QtPropertyPrivate(QtAbstractPropertyManager *manager) : m_enabled(true), m_modified(false), m_bold(false), m_manager(manager) {} + QtProperty *q_ptr; + + QSet m_parentItems; + QList m_subItems; + + QString m_toolTip; + QString m_statusTip; + QString m_whatsThis; + QString m_name; + bool m_enabled; + bool m_modified; + bool m_bold; + + QtAbstractPropertyManager * const m_manager; +}; + +class QtAbstractPropertyManagerPrivate +{ + QtAbstractPropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtAbstractPropertyManager) +public: + void propertyDestroyed(QtProperty *property); + void propertyChanged(QtProperty *property) const; + void propertyRemoved(QtProperty *property, + QtProperty *parentProperty) const; + void propertyInserted(QtProperty *property, QtProperty *parentProperty, + QtProperty *afterProperty) const; + + QSet m_properties; +}; + +/*! + \class QtProperty + + \brief The QtProperty class encapsulates an instance of a property. + + Properties are created by objects of QtAbstractPropertyManager + subclasses; a manager can create properties of a given type, and + is used in conjunction with the QtAbstractPropertyBrowser class. A + property is always owned by the manager that created it, which can + be retrieved using the propertyManager() function. + + QtProperty contains the most common property attributes, and + provides functions for retrieving as well as setting their values: + + \table + \header \o Getter \o Setter + \row + \o propertyName() \o setPropertyName() + \row + \o statusTip() \o setStatusTip() + \row + \o toolTip() \o setToolTip() + \row + \o whatsThis() \o setWhatsThis() + \row + \o isEnabled() \o setEnabled() + \row + \o isModified() \o setModified() + \row + \o valueText() \o Nop + \row + \o valueIcon() \o Nop + \endtable + + It is also possible to nest properties: QtProperty provides the + addSubProperty(), insertSubProperty() and removeSubProperty() functions to + manipulate the set of subproperties. Use the subProperties() + function to retrieve a property's current set of subproperties. + Note that nested properties are not owned by the parent property, + i.e. each subproperty is owned by the manager that created it. + + \sa QtAbstractPropertyManager, QtBrowserItem +*/ + +/*! + Creates a property with the given \a manager. + + This constructor is only useful when creating a custom QtProperty + subclass (e.g. QtVariantProperty). To create a regular QtProperty + object, use the QtAbstractPropertyManager::addProperty() + function instead. + + \sa QtAbstractPropertyManager::addProperty() +*/ +QtProperty::QtProperty(QtAbstractPropertyManager *manager) +{ + d_ptr = new QtPropertyPrivate(manager); + d_ptr->q_ptr = this; +} + +/*! + Destroys this property. + + Note that subproperties are detached but not destroyed, i.e. they + can still be used in another context. + + \sa QtAbstractPropertyManager::clear() + +*/ +QtProperty::~QtProperty() +{ + QSetIterator itParent(d_ptr->m_parentItems); + while (itParent.hasNext()) { + QtProperty *property = itParent.next(); + property->d_ptr->m_manager->d_ptr->propertyRemoved(this, property); + } + + d_ptr->m_manager->d_ptr->propertyDestroyed(this); + + QListIterator itChild(d_ptr->m_subItems); + while (itChild.hasNext()) { + QtProperty *property = itChild.next(); + property->d_ptr->m_parentItems.remove(this); + } + + itParent.toFront(); + while (itParent.hasNext()) { + QtProperty *property = itParent.next(); + property->d_ptr->m_subItems.removeAll(this); + } + delete d_ptr; +} + +/*! + Returns the set of subproperties. + + Note that subproperties are not owned by \e this property, but by + the manager that created them. + + \sa insertSubProperty(), removeSubProperty() +*/ +QList QtProperty::subProperties() const +{ + return d_ptr->m_subItems; +} + +/*! + Returns a pointer to the manager that owns this property. +*/ +QtAbstractPropertyManager *QtProperty::propertyManager() const +{ + return d_ptr->m_manager; +} + +/*! + Returns the property's tool tip. + + \sa setToolTip() +*/ +QString QtProperty::toolTip() const +{ + return d_ptr->m_toolTip; +} + +/*! + Returns the property's status tip. + + \sa setStatusTip() +*/ +QString QtProperty::statusTip() const +{ + return d_ptr->m_statusTip; +} + +/*! + Returns the property's "What's This" help text. + + \sa setWhatsThis() +*/ +QString QtProperty::whatsThis() const +{ + return d_ptr->m_whatsThis; +} + +/*! + Returns the property's name. + + \sa setPropertyName() +*/ +QString QtProperty::propertyName() const +{ + return d_ptr->m_name; +} + +/*! + Returns whether the property is enabled. + + \sa setEnabled() +*/ +bool QtProperty::isEnabled() const +{ + return d_ptr->m_enabled; +} + +/*! + Returns whether the property is modified. + + \sa setModified() +*/ +bool QtProperty::isModified() const +{ + return d_ptr->m_modified; +} + +/*! + Returns whether the property is displayed as bold. + + \sa setBold() +*/ +bool QtProperty::isBold() const +{ + return d_ptr->m_bold; +} + +/*! + Returns whether the property has a value. + + \sa QtAbstractPropertyManager::hasValue() +*/ +bool QtProperty::hasValue() const +{ + return d_ptr->m_manager->hasValue(this); +} + +/*! + Returns an icon representing the current state of this property. + + If the given property type can not generate such an icon, this + function returns an invalid icon. + + \sa QtAbstractPropertyManager::valueIcon() +*/ +QIcon QtProperty::valueIcon() const +{ + return d_ptr->m_manager->valueIcon(this); +} + +/*! + Returns a string representing the current state of this property. + + If the given property type can not generate such a string, this + function returns an empty string. + + \sa QtAbstractPropertyManager::valueText() +*/ +QString QtProperty::valueText() const +{ + return d_ptr->m_manager->valueText(this); +} + +/*! + Sets the property's tool tip to the given \a text. + + \sa toolTip() +*/ +void QtProperty::setToolTip(const QString &text) +{ + if (d_ptr->m_toolTip == text) + return; + + d_ptr->m_toolTip = text; + propertyChanged(); +} + +/*! + Sets the property's status tip to the given \a text. + + \sa statusTip() +*/ +void QtProperty::setStatusTip(const QString &text) +{ + if (d_ptr->m_statusTip == text) + return; + + d_ptr->m_statusTip = text; + propertyChanged(); +} + +/*! + Sets the property's "What's This" help text to the given \a text. + + \sa whatsThis() +*/ +void QtProperty::setWhatsThis(const QString &text) +{ + if (d_ptr->m_whatsThis == text) + return; + + d_ptr->m_whatsThis = text; + propertyChanged(); +} + +/*! + \fn void QtProperty::setPropertyName(const QString &name) + + Sets the property's name to the given \a name. + + \sa propertyName() +*/ +void QtProperty::setPropertyName(const QString &text) +{ + if (d_ptr->m_name == text) + return; + + d_ptr->m_name = text; + propertyChanged(); +} + +/*! + Enables or disables the property according to the passed \a enable value. + + \sa isEnabled() +*/ +void QtProperty::setEnabled(bool enable) +{ + if (d_ptr->m_enabled == enable) + return; + + d_ptr->m_enabled = enable; + propertyChanged(); +} + +/*! + Sets the property's modified state according to the passed \a modified value. + + \sa isModified() +*/ +void QtProperty::setModified(bool modified) +{ + if (d_ptr->m_modified == modified) + return; + + d_ptr->m_modified = modified; + propertyChanged(); +} + +/*! + Sets the property's bold state according to the passed \a bold value. + + \sa isBold() +*/ +void QtProperty::setBold(bool bold) +{ + if (d_ptr->m_bold == bold) + return; + + d_ptr->m_bold = bold; + propertyChanged(); +} + +/*! + Appends the given \a property to this property's subproperties. + + If the given \a property already is added, this function does + nothing. + + \sa insertSubProperty(), removeSubProperty() +*/ +void QtProperty::addSubProperty(QtProperty *property) +{ + QtProperty *after = 0; + if (d_ptr->m_subItems.count() > 0) + after = d_ptr->m_subItems.last(); + insertSubProperty(property, after); +} + +/*! + \fn void QtProperty::insertSubProperty(QtProperty *property, QtProperty *precedingProperty) + + Inserts the given \a property after the specified \a + precedingProperty into this property's list of subproperties. If + \a precedingProperty is 0, the specified \a property is inserted + at the beginning of the list. + + If the given \a property already is inserted, this function does + nothing. + + \sa addSubProperty(), removeSubProperty() +*/ +void QtProperty::insertSubProperty(QtProperty *property, + QtProperty *afterProperty) +{ + if (!property) + return; + + if (property == this) + return; + + // traverse all children of item. if this item is a child of item then cannot add. + QList pendingList = property->subProperties(); + QMap visited; + while (!pendingList.isEmpty()) { + QtProperty *i = pendingList.first(); + if (i == this) + return; + pendingList.removeFirst(); + if (visited.contains(i)) + continue; + visited[i] = true; + pendingList += i->subProperties(); + } + + pendingList = subProperties(); + int pos = 0; + int newPos = 0; + QtProperty *properAfterProperty = 0; + while (pos < pendingList.count()) { + QtProperty *i = pendingList.at(pos); + if (i == property) + return; // if item is already inserted in this item then cannot add. + if (i == afterProperty) { + newPos = pos + 1; + properAfterProperty = afterProperty; + } + pos++; + } + + d_ptr->m_subItems.insert(newPos, property); + property->d_ptr->m_parentItems.insert(this); + + d_ptr->m_manager->d_ptr->propertyInserted(property, this, properAfterProperty); +} + +/*! + Removes the given \a property from the list of subproperties + without deleting it. + + \sa addSubProperty(), insertSubProperty() +*/ +void QtProperty::removeSubProperty(QtProperty *property) +{ + if (!property) + return; + + d_ptr->m_manager->d_ptr->propertyRemoved(property, this); + + QList pendingList = subProperties(); + int pos = 0; + while (pos < pendingList.count()) { + if (pendingList.at(pos) == property) { + d_ptr->m_subItems.removeAt(pos); + property->d_ptr->m_parentItems.remove(this); + + return; + } + pos++; + } +} + +/*! + \internal +*/ +void QtProperty::propertyChanged() +{ + d_ptr->m_manager->d_ptr->propertyChanged(this); +} + +//////////////////////////////// + +void QtAbstractPropertyManagerPrivate::propertyDestroyed(QtProperty *property) +{ + if (m_properties.contains(property)) { + emit q_ptr->propertyDestroyed(property); + q_ptr->uninitializeProperty(property); + m_properties.remove(property); + } +} + +void QtAbstractPropertyManagerPrivate::propertyChanged(QtProperty *property) const +{ + emit q_ptr->propertyChanged(property); +} + +void QtAbstractPropertyManagerPrivate::propertyRemoved(QtProperty *property, + QtProperty *parentProperty) const +{ + emit q_ptr->propertyRemoved(property, parentProperty); +} + +void QtAbstractPropertyManagerPrivate::propertyInserted(QtProperty *property, + QtProperty *parentProperty, QtProperty *afterProperty) const +{ + emit q_ptr->propertyInserted(property, parentProperty, afterProperty); +} + +/*! + \class QtAbstractPropertyManager + + \brief The QtAbstractPropertyManager provides an interface for + property managers. + + A manager can create and manage properties of a given type, and is + used in conjunction with the QtAbstractPropertyBrowser class. + + When using a property browser widget, the properties are created + and managed by implementations of the QtAbstractPropertyManager + class. To ensure that the properties' values will be displayed + using suitable editing widgets, the managers are associated with + objects of QtAbstractEditorFactory subclasses. The property browser + will use these associations to determine which factories it should + use to create the preferred editing widgets. + + The QtAbstractPropertyManager class provides common functionality + like creating a property using the addProperty() function, and + retrieving the properties created by the manager using the + properties() function. The class also provides signals that are + emitted when the manager's properties change: propertyInserted(), + propertyRemoved(), propertyChanged() and propertyDestroyed(). + + QtAbstractPropertyManager subclasses are supposed to provide their + own type specific API. Note that several ready-made + implementations are available: + + \list + \o QtBoolPropertyManager + \o QtColorPropertyManager + \o QtDatePropertyManager + \o QtDateTimePropertyManager + \o QtDoublePropertyManager + \o QtEnumPropertyManager + \o QtFlagPropertyManager + \o QtFontPropertyManager + \o QtGroupPropertyManager + \o QtIntPropertyManager + \o QtPointPropertyManager + \o QtRectPropertyManager + \o QtSizePropertyManager + \o QtSizePolicyPropertyManager + \o QtStringPropertyManager + \o QtTimePropertyManager + \o QtVariantPropertyManager + \endlist + + \sa QtAbstractEditorFactoryBase, QtAbstractPropertyBrowser, QtProperty +*/ + +/*! + \fn void QtAbstractPropertyManager::propertyInserted(QtProperty *newProperty, + QtProperty *parentProperty, QtProperty *precedingProperty) + + This signal is emitted when a new subproperty is inserted into an + existing property, passing pointers to the \a newProperty, \a + parentProperty and \a precedingProperty as parameters. + + If \a precedingProperty is 0, the \a newProperty was inserted at + the beginning of the \a parentProperty's subproperties list. + + Note that signal is emitted only if the \a parentProperty is created + by this manager. + + \sa QtAbstractPropertyBrowser::itemInserted() +*/ + +/*! + \fn void QtAbstractPropertyManager::propertyChanged(QtProperty *property) + + This signal is emitted whenever a property's data changes, passing + a pointer to the \a property as parameter. + + Note that signal is only emitted for properties that are created by + this manager. + + \sa QtAbstractPropertyBrowser::itemChanged() +*/ + +/*! + \fn void QtAbstractPropertyManager::propertyRemoved(QtProperty *property, QtProperty *parent) + + This signal is emitted when a subproperty is removed, passing + pointers to the removed \a property and the \a parent property as + parameters. + + Note that signal is emitted only when the \a parent property is + created by this manager. + + \sa QtAbstractPropertyBrowser::itemRemoved() +*/ + +/*! + \fn void QtAbstractPropertyManager::propertyDestroyed(QtProperty *property) + + This signal is emitted when the specified \a property is about to + be destroyed. + + Note that signal is only emitted for properties that are created + by this manager. + + \sa clear(), uninitializeProperty() +*/ + +/*! + \fn void QtAbstractPropertyBrowser::currentItemChanged(QtBrowserItem *current) + + This signal is emitted when the current item changes. The current item is specified by \a current. + + \sa QtAbstractPropertyBrowser::setCurrentItem() +*/ + +/*! + Creates an abstract property manager with the given \a parent. +*/ +QtAbstractPropertyManager::QtAbstractPropertyManager(QObject *parent) + : QObject(parent) +{ + d_ptr = new QtAbstractPropertyManagerPrivate; + d_ptr->q_ptr = this; + +} + +/*! + Destroys the manager. All properties created by the manager are + destroyed. +*/ +QtAbstractPropertyManager::~QtAbstractPropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Destroys all the properties that this manager has created. + + \sa propertyDestroyed(), uninitializeProperty() +*/ +void QtAbstractPropertyManager::clear() const +{ + while (!properties().isEmpty()) { + QSetIterator itProperty(properties()); + QtProperty *prop = itProperty.next(); + delete prop; + } +} + +/*! + Returns the set of properties created by this manager. + + \sa addProperty() +*/ +QSet QtAbstractPropertyManager::properties() const +{ + return d_ptr->m_properties; +} + +/*! + Returns whether the given \a property has a value. + + The default implementation of this function returns true. + + \sa QtProperty::hasValue() +*/ +bool QtAbstractPropertyManager::hasValue(const QtProperty *property) const +{ + Q_UNUSED(property) + return true; +} + +/*! + Returns an icon representing the current state of the given \a + property. + + The default implementation of this function returns an invalid + icon. + + \sa QtProperty::valueIcon() +*/ +QIcon QtAbstractPropertyManager::valueIcon(const QtProperty *property) const +{ + Q_UNUSED(property) + return QIcon(); +} + +/*! + Returns a string representing the current state of the given \a + property. + + The default implementation of this function returns an empty + string. + + \sa QtProperty::valueText() +*/ +QString QtAbstractPropertyManager::valueText(const QtProperty *property) const +{ + Q_UNUSED(property) + return QString(); +} + +/*! + Creates a property with the given \a name which then is owned by this manager. + + Internally, this function calls the createProperty() and + initializeProperty() functions. + + \sa initializeProperty(), properties() +*/ +QtProperty *QtAbstractPropertyManager::addProperty(const QString &name) +{ + QtProperty *property = createProperty(); + if (property) { + property->setPropertyName(name); + d_ptr->m_properties.insert(property); + initializeProperty(property); + } + return property; +} + +/*! + Creates a property. + + The base implementation produce QtProperty instances; Reimplement + this function to make this manager produce objects of a QtProperty + subclass. + + \sa addProperty(), initializeProperty() +*/ +QtProperty *QtAbstractPropertyManager::createProperty() +{ + return new QtProperty(this); +} + +/*! + \fn void QtAbstractPropertyManager::initializeProperty(QtProperty *property) = 0 + + This function is called whenever a new valid property pointer has + been created, passing the pointer as parameter. + + The purpose is to let the manager know that the \a property has + been created so that it can provide additional attributes for the + new property, e.g. QtIntPropertyManager adds \l + {QtIntPropertyManager::value()}{value}, \l + {QtIntPropertyManager::minimum()}{minimum} and \l + {QtIntPropertyManager::maximum()}{maximum} attributes. Since each manager + subclass adds type specific attributes, this function is pure + virtual and must be reimplemented when deriving from the + QtAbstractPropertyManager class. + + \sa addProperty(), createProperty() +*/ + +/*! + This function is called just before the specified \a property is destroyed. + + The purpose is to let the property manager know that the \a + property is being destroyed so that it can remove the property's + additional attributes. + + \sa clear(), propertyDestroyed() +*/ +void QtAbstractPropertyManager::uninitializeProperty(QtProperty *property) +{ + Q_UNUSED(property) +} + +//////////////////////////////////// + +/*! + \class QtAbstractEditorFactoryBase + + \brief The QtAbstractEditorFactoryBase provides an interface for + editor factories. + + An editor factory is a class that is able to create an editing + widget of a specified type (e.g. line edits or comboboxes) for a + given QtProperty object, and it is used in conjunction with the + QtAbstractPropertyManager and QtAbstractPropertyBrowser classes. + + When using a property browser widget, the properties are created + and managed by implementations of the QtAbstractPropertyManager + class. To ensure that the properties' values will be displayed + using suitable editing widgets, the managers are associated with + objects of QtAbstractEditorFactory subclasses. The property browser + will use these associations to determine which factories it should + use to create the preferred editing widgets. + + Typically, an editor factory is created by subclassing the + QtAbstractEditorFactory template class which inherits + QtAbstractEditorFactoryBase. But note that several ready-made + implementations are available: + + \list + \o QtCheckBoxFactory + \o QtDateEditFactory + \o QtDateTimeEditFactory + \o QtDoubleSpinBoxFactory + \o QtEnumEditorFactory + \o QtLineEditFactory + \o QtScrollBarFactory + \o QtSliderFactory + \o QtSpinBoxFactory + \o QtTimeEditFactory + \o QtVariantEditorFactory + \endlist + + \sa QtAbstractPropertyManager, QtAbstractPropertyBrowser +*/ + +/*! + \fn virtual QWidget *QtAbstractEditorFactoryBase::createEditor(QtProperty *property, + QWidget *parent) = 0 + + Creates an editing widget (with the given \a parent) for the given + \a property. + + This function is reimplemented in QtAbstractEditorFactory template class + which also provides a pure virtual convenience overload of this + function enabling access to the property's manager. + + \sa QtAbstractEditorFactory::createEditor() +*/ + +/*! + \fn QtAbstractEditorFactoryBase::QtAbstractEditorFactoryBase(QObject *parent = 0) + + Creates an abstract editor factory with the given \a parent. +*/ + +/*! + \fn virtual void QtAbstractEditorFactoryBase::breakConnection(QtAbstractPropertyManager *manager) = 0 + + \internal + + Detaches property manager from factory. + This method is reimplemented in QtAbstractEditorFactory template subclass. + You don't need to reimplement it in your subclasses. Instead implement more convenient + QtAbstractEditorFactory::disconnectPropertyManager() which gives you access to particular manager subclass. +*/ + +/*! + \fn virtual void QtAbstractEditorFactoryBase::managerDestroyed(QObject *manager) = 0 + + \internal + + This method is called when property manager is being destroyed. + Basically it notifies factory not to produce editors for properties owned by \a manager. + You don't need to reimplement it in your subclass. This method is implemented in + QtAbstractEditorFactory template subclass. +*/ + +/*! + \class QtAbstractEditorFactory + + \brief The QtAbstractEditorFactory is the base template class for editor + factories. + + An editor factory is a class that is able to create an editing + widget of a specified type (e.g. line edits or comboboxes) for a + given QtProperty object, and it is used in conjunction with the + QtAbstractPropertyManager and QtAbstractPropertyBrowser classes. + + Note that the QtAbstractEditorFactory functions are using the + PropertyManager template argument class which can be any + QtAbstractPropertyManager subclass. For example: + + \code + QtSpinBoxFactory *factory; + QSet managers = factory->propertyManagers(); + \endcode + + Note that QtSpinBoxFactory by definition creates editing widgets + \e only for properties created by QtIntPropertyManager. + + When using a property browser widget, the properties are created + and managed by implementations of the QtAbstractPropertyManager + class. To ensure that the properties' values will be displayed + using suitable editing widgets, the managers are associated with + objects of QtAbstractEditorFactory subclasses. The property browser will + use these associations to determine which factories it should use + to create the preferred editing widgets. + + A QtAbstractEditorFactory object is capable of producing editors for + several property managers at the same time. To create an + association between this factory and a given manager, use the + addPropertyManager() function. Use the removePropertyManager() function to make + this factory stop producing editors for a given property + manager. Use the propertyManagers() function to retrieve the set of + managers currently associated with this factory. + + Several ready-made implementations of the QtAbstractEditorFactory class + are available: + + \list + \o QtCheckBoxFactory + \o QtDateEditFactory + \o QtDateTimeEditFactory + \o QtDoubleSpinBoxFactory + \o QtEnumEditorFactory + \o QtLineEditFactory + \o QtScrollBarFactory + \o QtSliderFactory + \o QtSpinBoxFactory + \o QtTimeEditFactory + \o QtVariantEditorFactory + \endlist + + When deriving from the QtAbstractEditorFactory class, several pure virtual + functions must be implemented: the connectPropertyManager() function is + used by the factory to connect to the given manager's signals, the + createEditor() function is supposed to create an editor for the + given property controlled by the given manager, and finally the + disconnectPropertyManager() function is used by the factory to disconnect + from the specified manager's signals. + + \sa QtAbstractEditorFactoryBase, QtAbstractPropertyManager +*/ + +/*! + \fn QtAbstractEditorFactory::QtAbstractEditorFactory(QObject *parent = 0) + + Creates an editor factory with the given \a parent. + + \sa addPropertyManager() +*/ + +/*! + \fn QWidget *QtAbstractEditorFactory::createEditor(QtProperty *property, QWidget *parent) + + Creates an editing widget (with the given \a parent) for the given + \a property. +*/ + +/*! + \fn void QtAbstractEditorFactory::addPropertyManager(PropertyManager *manager) + + Adds the given \a manager to this factory's set of managers, + making this factory produce editing widgets for properties created + by the given manager. + + The PropertyManager type is a template argument class, and represents the chosen + QtAbstractPropertyManager subclass. + + \sa propertyManagers(), removePropertyManager() +*/ + +/*! + \fn void QtAbstractEditorFactory::removePropertyManager(PropertyManager *manager) + + Removes the given \a manager from this factory's set of + managers. The PropertyManager type is a template argument class, and may be + any QtAbstractPropertyManager subclass. + + \sa propertyManagers(), addPropertyManager() +*/ + +/*! + \fn virtual void QtAbstractEditorFactory::connectPropertyManager(PropertyManager *manager) = 0 + + Connects this factory to the given \a manager's signals. The + PropertyManager type is a template argument class, and represents + the chosen QtAbstractPropertyManager subclass. + + This function is used internally by the addPropertyManager() function, and + makes it possible to update an editing widget when the associated + property's data changes. This is typically done in custom slots + responding to the signals emitted by the property's manager, + e.g. QtIntPropertyManager::valueChanged() and + QtIntPropertyManager::rangeChanged(). + + \sa propertyManagers(), disconnectPropertyManager() +*/ + +/*! + \fn virtual QWidget *QtAbstractEditorFactory::createEditor(PropertyManager *manager, QtProperty *property, + QWidget *parent) = 0 + + Creates an editing widget with the given \a parent for the + specified \a property created by the given \a manager. The + PropertyManager type is a template argument class, and represents + the chosen QtAbstractPropertyManager subclass. + + This function must be implemented in derived classes: It is + recommended to store a pointer to the widget and map it to the + given \a property, since the widget must be updated whenever the + associated property's data changes. This is typically done in + custom slots responding to the signals emitted by the property's + manager, e.g. QtIntPropertyManager::valueChanged() and + QtIntPropertyManager::rangeChanged(). + + \sa connectPropertyManager() +*/ + +/*! + \fn virtual void QtAbstractEditorFactory::disconnectPropertyManager(PropertyManager *manager) = 0 + + Disconnects this factory from the given \a manager's signals. The + PropertyManager type is a template argument class, and represents + the chosen QtAbstractPropertyManager subclass. + + This function is used internally by the removePropertyManager() function. + + \sa propertyManagers(), connectPropertyManager() +*/ + +/*! + \fn QSet QtAbstractEditorFactory::propertyManagers() const + + Returns the factory's set of associated managers. The + PropertyManager type is a template argument class, and represents + the chosen QtAbstractPropertyManager subclass. + + \sa addPropertyManager(), removePropertyManager() +*/ + +/*! + \fn PropertyManager *QtAbstractEditorFactory::propertyManager(QtProperty *property) const + + Returns the property manager for the given \a property, or 0 if + the given \a property doesn't belong to any of this factory's + registered managers. + + The PropertyManager type is a template argument class, and represents the chosen + QtAbstractPropertyManager subclass. + + \sa propertyManagers() +*/ + +/*! + \fn virtual void QtAbstractEditorFactory::managerDestroyed(QObject *manager) + + \internal + \reimp +*/ + +//////////////////////////////////// +class QtBrowserItemPrivate +{ +public: + QtBrowserItemPrivate(QtAbstractPropertyBrowser *browser, QtProperty *property, QtBrowserItem *parent) + : m_browser(browser), m_property(property), m_parent(parent), q_ptr(0) {} + + void addChild(QtBrowserItem *index, QtBrowserItem *after); + void removeChild(QtBrowserItem *index); + + QtAbstractPropertyBrowser * const m_browser; + QtProperty *m_property; + QtBrowserItem *m_parent; + + QtBrowserItem *q_ptr; + + QList m_children; + +}; + +void QtBrowserItemPrivate::addChild(QtBrowserItem *index, QtBrowserItem *after) +{ + if (m_children.contains(index)) + return; + int idx = m_children.indexOf(after) + 1; // we insert after returned idx, if it was -1 then we set idx to 0; + m_children.insert(idx, index); +} + +void QtBrowserItemPrivate::removeChild(QtBrowserItem *index) +{ + m_children.removeAll(index); +} + + +/*! + \class QtBrowserItem + + \brief The QtBrowserItem class represents a property in + a property browser instance. + + Browser items are created whenever a QtProperty is inserted to the + property browser. A QtBrowserItem uniquely identifies a + browser's item. Thus, if the same QtProperty is inserted multiple + times, each occurrence gets its own unique QtBrowserItem. The + items are owned by QtAbstractPropertyBrowser and automatically + deleted when they are removed from the browser. + + You can traverse a browser's properties by calling parent() and + children(). The property and the browser associated with an item + are available as property() and browser(). + + \sa QtAbstractPropertyBrowser, QtProperty +*/ + +/*! + Returns the property which is accosiated with this item. Note that + several items can be associated with the same property instance in + the same property browser. + + \sa QtAbstractPropertyBrowser::items() +*/ + +QtProperty *QtBrowserItem::property() const +{ + return d_ptr->m_property; +} + +/*! + Returns the parent item of \e this item. Returns 0 if \e this item + is associated with top-level property in item's property browser. + + \sa children() +*/ + +QtBrowserItem *QtBrowserItem::parent() const +{ + return d_ptr->m_parent; +} + +/*! + Returns the children items of \e this item. The properties + reproduced from children items are always the same as + reproduced from associated property' children, for example: + + \code + QtBrowserItem *item; + QList childrenItems = item->children(); + + QList childrenProperties = item->property()->subProperties(); + \endcode + + The \e childrenItems list represents the same list as \e childrenProperties. +*/ + +QList QtBrowserItem::children() const +{ + return d_ptr->m_children; +} + +/*! + Returns the property browser which owns \e this item. +*/ + +QtAbstractPropertyBrowser *QtBrowserItem::browser() const +{ + return d_ptr->m_browser; +} + +QtBrowserItem::QtBrowserItem(QtAbstractPropertyBrowser *browser, QtProperty *property, QtBrowserItem *parent) +{ + d_ptr = new QtBrowserItemPrivate(browser, property, parent); + d_ptr->q_ptr = this; +} + +QtBrowserItem::~QtBrowserItem() +{ + delete d_ptr; +} + + +//////////////////////////////////// + +typedef QMap > Map1; +typedef QMap > > Map2; +Q_GLOBAL_STATIC(Map1, m_viewToManagerToFactory) +Q_GLOBAL_STATIC(Map2, m_managerToFactoryToViews) + +class QtAbstractPropertyBrowserPrivate +{ + QtAbstractPropertyBrowser *q_ptr; + Q_DECLARE_PUBLIC(QtAbstractPropertyBrowser) +public: + QtAbstractPropertyBrowserPrivate(); + + void insertSubTree(QtProperty *property, + QtProperty *parentProperty); + void removeSubTree(QtProperty *property, + QtProperty *parentProperty); + void createBrowserIndexes(QtProperty *property, QtProperty *parentProperty, QtProperty *afterProperty); + void removeBrowserIndexes(QtProperty *property, QtProperty *parentProperty); + QtBrowserItem *createBrowserIndex(QtProperty *property, QtBrowserItem *parentIndex, QtBrowserItem *afterIndex); + void removeBrowserIndex(QtBrowserItem *index); + void clearIndex(QtBrowserItem *index); + + void slotPropertyInserted(QtProperty *property, + QtProperty *parentProperty, QtProperty *afterProperty); + void slotPropertyRemoved(QtProperty *property, QtProperty *parentProperty); + void slotPropertyDestroyed(QtProperty *property); + void slotPropertyDataChanged(QtProperty *property); + + QList m_subItems; + QMap > m_managerToProperties; + QMap > m_propertyToParents; + + QMap m_topLevelPropertyToIndex; + QList m_topLevelIndexes; + QMap > m_propertyToIndexes; + + QtBrowserItem *m_currentItem; +}; + +QtAbstractPropertyBrowserPrivate::QtAbstractPropertyBrowserPrivate() : + m_currentItem(0) +{ +} + +void QtAbstractPropertyBrowserPrivate::insertSubTree(QtProperty *property, + QtProperty *parentProperty) +{ + if (m_propertyToParents.contains(property)) { + // property was already inserted, so its manager is connected + // and all its children are inserted and theirs managers are connected + // we just register new parent (parent has to be new). + m_propertyToParents[property].append(parentProperty); + // don't need to update m_managerToProperties map since + // m_managerToProperties[manager] already contains property. + return; + } + QtAbstractPropertyManager *manager = property->propertyManager(); + if (m_managerToProperties[manager].isEmpty()) { + // connect manager's signals + q_ptr->connect(manager, SIGNAL(propertyInserted(QtProperty *, + QtProperty *, QtProperty *)), + q_ptr, SLOT(slotPropertyInserted(QtProperty *, + QtProperty *, QtProperty *))); + q_ptr->connect(manager, SIGNAL(propertyRemoved(QtProperty *, + QtProperty *)), + q_ptr, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *))); + q_ptr->connect(manager, SIGNAL(propertyDestroyed(QtProperty *)), + q_ptr, SLOT(slotPropertyDestroyed(QtProperty *))); + q_ptr->connect(manager, SIGNAL(propertyChanged(QtProperty *)), + q_ptr, SLOT(slotPropertyDataChanged(QtProperty *))); + } + m_managerToProperties[manager].append(property); + m_propertyToParents[property].append(parentProperty); + + QList subList = property->subProperties(); + QListIterator itSub(subList); + while (itSub.hasNext()) { + QtProperty *subProperty = itSub.next(); + insertSubTree(subProperty, property); + } +} + +void QtAbstractPropertyBrowserPrivate::removeSubTree(QtProperty *property, + QtProperty *parentProperty) +{ + if (!m_propertyToParents.contains(property)) { + // ASSERT + return; + } + + m_propertyToParents[property].removeAll(parentProperty); + if (!m_propertyToParents[property].isEmpty()) + return; + + m_propertyToParents.remove(property); + QtAbstractPropertyManager *manager = property->propertyManager(); + m_managerToProperties[manager].removeAll(property); + if (m_managerToProperties[manager].isEmpty()) { + // disconnect manager's signals + q_ptr->disconnect(manager, SIGNAL(propertyInserted(QtProperty *, + QtProperty *, QtProperty *)), + q_ptr, SLOT(slotPropertyInserted(QtProperty *, + QtProperty *, QtProperty *))); + q_ptr->disconnect(manager, SIGNAL(propertyRemoved(QtProperty *, + QtProperty *)), + q_ptr, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *))); + q_ptr->disconnect(manager, SIGNAL(propertyDestroyed(QtProperty *)), + q_ptr, SLOT(slotPropertyDestroyed(QtProperty *))); + q_ptr->disconnect(manager, SIGNAL(propertyChanged(QtProperty *)), + q_ptr, SLOT(slotPropertyDataChanged(QtProperty *))); + + m_managerToProperties.remove(manager); + } + + QList subList = property->subProperties(); + QListIterator itSub(subList); + while (itSub.hasNext()) { + QtProperty *subProperty = itSub.next(); + removeSubTree(subProperty, property); + } +} + +void QtAbstractPropertyBrowserPrivate::createBrowserIndexes(QtProperty *property, QtProperty *parentProperty, QtProperty *afterProperty) +{ + QMap parentToAfter; + if (afterProperty) { + QMap >::ConstIterator it = + m_propertyToIndexes.find(afterProperty); + if (it == m_propertyToIndexes.constEnd()) + return; + + QList indexes = it.value(); + QListIterator itIndex(indexes); + while (itIndex.hasNext()) { + QtBrowserItem *idx = itIndex.next(); + QtBrowserItem *parentIdx = idx->parent(); + if ((parentProperty && parentIdx && parentIdx->property() == parentProperty) || (!parentProperty && !parentIdx)) + parentToAfter[idx->parent()] = idx; + } + } else if (parentProperty) { + QMap >::ConstIterator it = + m_propertyToIndexes.find(parentProperty); + if (it == m_propertyToIndexes.constEnd()) + return; + + QList indexes = it.value(); + QListIterator itIndex(indexes); + while (itIndex.hasNext()) { + QtBrowserItem *idx = itIndex.next(); + parentToAfter[idx] = 0; + } + } else { + parentToAfter[0] = 0; + } + + const QMap::ConstIterator pcend = parentToAfter.constEnd(); + for (QMap::ConstIterator it = parentToAfter.constBegin(); it != pcend; ++it) + createBrowserIndex(property, it.key(), it.value()); +} + +QtBrowserItem *QtAbstractPropertyBrowserPrivate::createBrowserIndex(QtProperty *property, + QtBrowserItem *parentIndex, QtBrowserItem *afterIndex) +{ + QtBrowserItem *newIndex = new QtBrowserItem(q_ptr, property, parentIndex); + if (parentIndex) { + parentIndex->d_ptr->addChild(newIndex, afterIndex); + } else { + m_topLevelPropertyToIndex[property] = newIndex; + m_topLevelIndexes.insert(m_topLevelIndexes.indexOf(afterIndex) + 1, newIndex); + } + m_propertyToIndexes[property].append(newIndex); + + q_ptr->itemInserted(newIndex, afterIndex); + + QList subItems = property->subProperties(); + QListIterator itChild(subItems); + QtBrowserItem *afterChild = 0; + while (itChild.hasNext()) { + QtProperty *child = itChild.next(); + afterChild = createBrowserIndex(child, newIndex, afterChild); + } + return newIndex; +} + +void QtAbstractPropertyBrowserPrivate::removeBrowserIndexes(QtProperty *property, QtProperty *parentProperty) +{ + QList toRemove; + QMap >::ConstIterator it = + m_propertyToIndexes.find(property); + if (it == m_propertyToIndexes.constEnd()) + return; + + QList indexes = it.value(); + QListIterator itIndex(indexes); + while (itIndex.hasNext()) { + QtBrowserItem *idx = itIndex.next(); + QtBrowserItem *parentIdx = idx->parent(); + if ((parentProperty && parentIdx && parentIdx->property() == parentProperty) || (!parentProperty && !parentIdx)) + toRemove.append(idx); + } + + QListIterator itRemove(toRemove); + while (itRemove.hasNext()) { + QtBrowserItem *index = itRemove.next(); + removeBrowserIndex(index); + } +} + +void QtAbstractPropertyBrowserPrivate::removeBrowserIndex(QtBrowserItem *index) +{ + QList children = index->children(); + for (int i = children.count(); i > 0; i--) { + removeBrowserIndex(children.at(i - 1)); + } + + q_ptr->itemRemoved(index); + + if (index->parent()) { + index->parent()->d_ptr->removeChild(index); + } else { + m_topLevelPropertyToIndex.remove(index->property()); + m_topLevelIndexes.removeAll(index); + } + + QtProperty *property = index->property(); + + m_propertyToIndexes[property].removeAll(index); + if (m_propertyToIndexes[property].isEmpty()) + m_propertyToIndexes.remove(property); + + delete index; +} + +void QtAbstractPropertyBrowserPrivate::clearIndex(QtBrowserItem *index) +{ + QList children = index->children(); + QListIterator itChild(children); + while (itChild.hasNext()) { + clearIndex(itChild.next()); + } + delete index; +} + +void QtAbstractPropertyBrowserPrivate::slotPropertyInserted(QtProperty *property, + QtProperty *parentProperty, QtProperty *afterProperty) +{ + if (!m_propertyToParents.contains(parentProperty)) + return; + createBrowserIndexes(property, parentProperty, afterProperty); + insertSubTree(property, parentProperty); + //q_ptr->propertyInserted(property, parentProperty, afterProperty); +} + +void QtAbstractPropertyBrowserPrivate::slotPropertyRemoved(QtProperty *property, + QtProperty *parentProperty) +{ + if (!m_propertyToParents.contains(parentProperty)) + return; + removeSubTree(property, parentProperty); // this line should be probably moved down after propertyRemoved call + //q_ptr->propertyRemoved(property, parentProperty); + removeBrowserIndexes(property, parentProperty); +} + +void QtAbstractPropertyBrowserPrivate::slotPropertyDestroyed(QtProperty *property) +{ + if (!m_subItems.contains(property)) + return; + q_ptr->removeProperty(property); +} + +void QtAbstractPropertyBrowserPrivate::slotPropertyDataChanged(QtProperty *property) +{ + if (!m_propertyToParents.contains(property)) + return; + + QMap >::ConstIterator it = + m_propertyToIndexes.find(property); + if (it == m_propertyToIndexes.constEnd()) + return; + + QList indexes = it.value(); + QListIterator itIndex(indexes); + while (itIndex.hasNext()) { + QtBrowserItem *idx = itIndex.next(); + q_ptr->itemChanged(idx); + } + //q_ptr->propertyChanged(property); +} + +/*! + \class QtAbstractPropertyBrowser + + \brief QtAbstractPropertyBrowser provides a base class for + implementing property browsers. + + A property browser is a widget that enables the user to edit a + given set of properties. Each property is represented by a label + specifying the property's name, and an editing widget (e.g. a line + edit or a combobox) holding its value. A property can have zero or + more subproperties. + + \image qtpropertybrowser.png + + The top level properties can be retrieved using the + properties() function. To traverse each property's + subproperties, use the QtProperty::subProperties() function. In + addition, the set of top level properties can be manipulated using + the addProperty(), insertProperty() and removeProperty() + functions. Note that the QtProperty class provides a corresponding + set of functions making it possible to manipulate the set of + subproperties as well. + + To remove all the properties from the property browser widget, use + the clear() function. This function will clear the editor, but it + will not delete the properties since they can still be used in + other editors. + + The properties themselves are created and managed by + implementations of the QtAbstractPropertyManager class. A manager + can handle (i.e. create and manage) properties of a given type. In + the property browser the managers are associated with + implementations of the QtAbstractEditorFactory: A factory is a + class able to create an editing widget of a specified type. + + When using a property browser widget, managers must be created for + each of the required property types before the properties + themselves can be created. To ensure that the properties' values + will be displayed using suitable editing widgets, the managers + must be associated with objects of the preferred factory + implementations using the setFactoryForManager() function. The + property browser will use these associations to determine which + factory it should use to create the preferred editing widget. + + Note that a factory can be associated with many managers, but a + manager can only be associated with one single factory within the + context of a single property browser. The associations between + managers and factories can at any time be removed using the + unsetFactoryForManager() function. + + Whenever the property data changes or a property is inserted or + removed, the itemChanged(), itemInserted() or + itemRemoved() functions are called, respectively. These + functions must be reimplemented in derived classes in order to + update the property browser widget. Be aware that some property + instances can appear several times in an abstract tree + structure. For example: + + \table 100% + \row + \o + \code + QtProperty *property1, *property2, *property3; + + property2->addSubProperty(property1); + property3->addSubProperty(property2); + + QtAbstractPropertyBrowser *editor; + + editor->addProperty(property1); + editor->addProperty(property2); + editor->addProperty(property3); + \endcode + \o \image qtpropertybrowser-duplicate.png + \endtable + + The addProperty() function returns a QtBrowserItem that uniquely + identifies the created item. + + To make a property editable in the property browser, the + createEditor() function must be called to provide the + property with a suitable editing widget. + + Note that there are two ready-made property browser + implementations: + + \list + \o QtGroupBoxPropertyBrowser + \o QtTreePropertyBrowser + \endlist + + \sa QtAbstractPropertyManager, QtAbstractEditorFactoryBase +*/ + +/*! + \fn void QtAbstractPropertyBrowser::setFactoryForManager(PropertyManager *manager, + QtAbstractEditorFactory *factory) + + Connects the given \a manager to the given \a factory, ensuring + that properties of the \a manager's type will be displayed with an + editing widget suitable for their value. + + For example: + + \code + QtIntPropertyManager *intManager; + QtDoublePropertyManager *doubleManager; + + QtProperty *myInteger = intManager->addProperty(); + QtProperty *myDouble = doubleManager->addProperty(); + + QtSpinBoxFactory *spinBoxFactory; + QtDoubleSpinBoxFactory *doubleSpinBoxFactory; + + QtAbstractPropertyBrowser *editor; + editor->setFactoryForManager(intManager, spinBoxFactory); + editor->setFactoryForManager(doubleManager, doubleSpinBoxFactory); + + editor->addProperty(myInteger); + editor->addProperty(myDouble); + \endcode + + In this example the \c myInteger property's value is displayed + with a QSpinBox widget, while the \c myDouble property's value is + displayed with a QDoubleSpinBox widget. + + Note that a factory can be associated with many managers, but a + manager can only be associated with one single factory. If the + given \a manager already is associated with another factory, the + old association is broken before the new one established. + + This function ensures that the given \a manager and the given \a + factory are compatible, and it automatically calls the + QtAbstractEditorFactory::addPropertyManager() function if necessary. + + \sa unsetFactoryForManager() +*/ + +/*! + \fn virtual void QtAbstractPropertyBrowser::itemInserted(QtBrowserItem *insertedItem, + QtBrowserItem *precedingItem) = 0 + + This function is called to update the widget whenever a property + is inserted or added to the property browser, passing pointers to + the \a insertedItem of property and the specified + \a precedingItem as parameters. + + If \a precedingItem is 0, the \a insertedItem was put at + the beginning of its parent item's list of subproperties. If + the parent of \a insertedItem is 0, the \a insertedItem was added as a top + level property of \e this property browser. + + This function must be reimplemented in derived classes. Note that + if the \a insertedItem's property has subproperties, this + method will be called for those properties as soon as the current call is finished. + + \sa insertProperty(), addProperty() +*/ + +/*! + \fn virtual void QtAbstractPropertyBrowser::itemRemoved(QtBrowserItem *item) = 0 + + This function is called to update the widget whenever a property + is removed from the property browser, passing the pointer to the + \a item of the property as parameters. The passed \a item is + deleted just after this call is finished. + + If the the parent of \a item is 0, the removed \a item was a + top level property in this editor. + + This function must be reimplemented in derived classes. Note that + if the removed \a item's property has subproperties, this + method will be called for those properties just before the current call is started. + + \sa removeProperty() +*/ + +/*! + \fn virtual void QtAbstractPropertyBrowser::itemChanged(QtBrowserItem *item) = 0 + + This function is called whenever a property's data changes, + passing a pointer to the \a item of property as parameter. + + This function must be reimplemented in derived classes in order to + update the property browser widget whenever a property's name, + tool tip, status tip, "what's this" text, value text or value icon + changes. + + Note that if the property browser contains several occurrences of + the same property, this method will be called once for each + occurrence (with a different item each time). + + \sa QtProperty, items() +*/ + +/*! + Creates an abstract property browser with the given \a parent. +*/ +QtAbstractPropertyBrowser::QtAbstractPropertyBrowser(QWidget *parent) + : QWidget(parent) +{ + d_ptr = new QtAbstractPropertyBrowserPrivate; + d_ptr->q_ptr = this; + +} + +/*! + Destroys the property browser, and destroys all the items that were + created by this property browser. + + Note that the properties that were displayed in the editor are not + deleted since they still can be used in other editors. Neither + does the destructor delete the property managers and editor + factories that were used by this property browser widget unless + this widget was their parent. + + \sa QtAbstractPropertyManager::~QtAbstractPropertyManager() +*/ +QtAbstractPropertyBrowser::~QtAbstractPropertyBrowser() +{ + QList indexes = topLevelItems(); + QListIterator itItem(indexes); + while (itItem.hasNext()) + d_ptr->clearIndex(itItem.next()); + delete d_ptr; +} + +/*! + Returns the property browser's list of top level properties. + + To traverse the subproperties, use the QtProperty::subProperties() + function. + + \sa addProperty(), insertProperty(), removeProperty() +*/ +QList QtAbstractPropertyBrowser::properties() const +{ + return d_ptr->m_subItems; +} + +/*! + Returns the property browser's list of all items associated + with the given \a property. + + There is one item per instance of the property in the browser. + + \sa topLevelItem() +*/ + +QList QtAbstractPropertyBrowser::items(QtProperty *property) const +{ + return d_ptr->m_propertyToIndexes.value(property); +} + +/*! + Returns the top-level items associated with the given \a property. + + Returns 0 if \a property wasn't inserted into this property + browser or isn't a top-level one. + + \sa topLevelItems(), items() +*/ + +QtBrowserItem *QtAbstractPropertyBrowser::topLevelItem(QtProperty *property) const +{ + return d_ptr->m_topLevelPropertyToIndex.value(property); +} + +/*! + Returns the list of top-level items. + + \sa topLevelItem() +*/ + +QList QtAbstractPropertyBrowser::topLevelItems() const +{ + return d_ptr->m_topLevelIndexes; +} + +/*! + Removes all the properties from the editor, but does not delete + them since they can still be used in other editors. + + \sa removeProperty(), QtAbstractPropertyManager::clear() +*/ +void QtAbstractPropertyBrowser::clear() +{ + QList subList = properties(); + QListIterator itSub(subList); + itSub.toBack(); + while (itSub.hasPrevious()) { + QtProperty *property = itSub.previous(); + removeProperty(property); + } +} + +/*! + Appends the given \a property (and its subproperties) to the + property browser's list of top level properties. Returns the item + created by property browser which is associated with the \a property. + In order to get all children items created by the property + browser in this call, the returned item should be traversed. + + If the specified \a property is already added, this function does + nothing and returns 0. + + \sa insertProperty(), QtProperty::addSubProperty(), properties() +*/ +QtBrowserItem *QtAbstractPropertyBrowser::addProperty(QtProperty *property) +{ + QtProperty *afterProperty = 0; + if (d_ptr->m_subItems.count() > 0) + afterProperty = d_ptr->m_subItems.last(); + return insertProperty(property, afterProperty); +} + +/*! + \fn QtBrowserItem *QtAbstractPropertyBrowser::insertProperty(QtProperty *property, + QtProperty *afterProperty) + + Inserts the given \a property (and its subproperties) after + the specified \a afterProperty in the browser's list of top + level properties. Returns item created by property browser which + is associated with the \a property. In order to get all children items + created by the property browser in this call returned item should be traversed. + + If the specified \a afterProperty is 0, the given \a property is + inserted at the beginning of the list. If \a property is + already inserted, this function does nothing and returns 0. + + \sa addProperty(), QtProperty::insertSubProperty(), properties() +*/ +QtBrowserItem *QtAbstractPropertyBrowser::insertProperty(QtProperty *property, + QtProperty *afterProperty) +{ + if (!property) + return 0; + + // if item is already inserted in this item then cannot add. + QList pendingList = properties(); + int pos = 0; + int newPos = 0; + QtProperty *properAfterProperty = 0; + while (pos < pendingList.count()) { + QtProperty *prop = pendingList.at(pos); + if (prop == property) + return 0; + if (prop == afterProperty) { + newPos = pos + 1; + properAfterProperty = afterProperty; + } + pos++; + } + d_ptr->createBrowserIndexes(property, 0, afterProperty); + + // traverse inserted subtree and connect to manager's signals + d_ptr->insertSubTree(property, 0); + + d_ptr->m_subItems.insert(newPos, property); + //propertyInserted(property, 0, properAfterProperty); + return topLevelItem(property); +} + +/*! + Removes the specified \a property (and its subproperties) from the + property browser's list of top level properties. All items + that were associated with the given \a property and its children + are deleted. + + Note that the properties are \e not deleted since they can still + be used in other editors. + + \sa clear(), QtProperty::removeSubProperty(), properties() +*/ +void QtAbstractPropertyBrowser::removeProperty(QtProperty *property) +{ + if (!property) + return; + + QList pendingList = properties(); + int pos = 0; + while (pos < pendingList.count()) { + if (pendingList.at(pos) == property) { + d_ptr->m_subItems.removeAt(pos); //perhaps this two lines + d_ptr->removeSubTree(property, 0); //should be moved down after propertyRemoved call. + //propertyRemoved(property, 0); + + d_ptr->removeBrowserIndexes(property, 0); + + // when item is deleted, item will call removeItem for top level items, + // and itemRemoved for nested items. + + return; + } + pos++; + } +} + +/*! + Creates an editing widget (with the given \a parent) for the given + \a property according to the previously established associations + between property managers and editor factories. + + If the property is created by a property manager which was not + associated with any of the existing factories in \e this property + editor, the function returns 0. + + To make a property editable in the property browser, the + createEditor() function must be called to provide the + property with a suitable editing widget. + + Reimplement this function to provide additional decoration for the + editing widgets created by the installed factories. + + \sa setFactoryForManager() +*/ +QWidget *QtAbstractPropertyBrowser::createEditor(QtProperty *property, + QWidget *parent) +{ + QtAbstractEditorFactoryBase *factory = 0; + QtAbstractPropertyManager *manager = property->propertyManager(); + + if (m_viewToManagerToFactory()->contains(this) && + (*m_viewToManagerToFactory())[this].contains(manager)) { + factory = (*m_viewToManagerToFactory())[this][manager]; + } + + if (!factory) + return 0; + return factory->createEditor(property, parent); +} + +bool QtAbstractPropertyBrowser::addFactory(QtAbstractPropertyManager *abstractManager, + QtAbstractEditorFactoryBase *abstractFactory) +{ + bool connectNeeded = false; + if (!m_managerToFactoryToViews()->contains(abstractManager) || + !(*m_managerToFactoryToViews())[abstractManager].contains(abstractFactory)) { + connectNeeded = true; + } else if ((*m_managerToFactoryToViews())[abstractManager][abstractFactory] + .contains(this)) { + return connectNeeded; + } + + if (m_viewToManagerToFactory()->contains(this) && + (*m_viewToManagerToFactory())[this].contains(abstractManager)) { + unsetFactoryForManager(abstractManager); + } + + (*m_managerToFactoryToViews())[abstractManager][abstractFactory].append(this); + (*m_viewToManagerToFactory())[this][abstractManager] = abstractFactory; + + return connectNeeded; +} + +/*! + Removes the association between the given \a manager and the + factory bound to it, automatically calling the + QtAbstractEditorFactory::removePropertyManager() function if necessary. + + \sa setFactoryForManager() +*/ +void QtAbstractPropertyBrowser::unsetFactoryForManager(QtAbstractPropertyManager *manager) +{ + if (!m_viewToManagerToFactory()->contains(this) || + !(*m_viewToManagerToFactory())[this].contains(manager)) { + return; + } + + QtAbstractEditorFactoryBase *abstractFactory = + (*m_viewToManagerToFactory())[this][manager]; + (*m_viewToManagerToFactory())[this].remove(manager); + if ((*m_viewToManagerToFactory())[this].isEmpty()) { + (*m_viewToManagerToFactory()).remove(this); + } + + (*m_managerToFactoryToViews())[manager][abstractFactory].removeAll(this); + if ((*m_managerToFactoryToViews())[manager][abstractFactory].isEmpty()) { + (*m_managerToFactoryToViews())[manager].remove(abstractFactory); + abstractFactory->breakConnection(manager); + if ((*m_managerToFactoryToViews())[manager].isEmpty()) { + (*m_managerToFactoryToViews()).remove(manager); + } + } +} + +/*! + Returns the current item in the property browser. + + \sa setCurrentItem() +*/ +QtBrowserItem *QtAbstractPropertyBrowser::currentItem() const +{ + return d_ptr->m_currentItem; +} + +/*! + Sets the current item in the property browser to \a item. + + \sa currentItem(), currentItemChanged() +*/ +void QtAbstractPropertyBrowser::setCurrentItem(QtBrowserItem *item) +{ + QtBrowserItem *oldItem = d_ptr->m_currentItem; + d_ptr->m_currentItem = item; + if (oldItem != item) + emit currentItemChanged(item); +} + +#if QT_VERSION >= 0x040400 +QT_END_NAMESPACE +#endif + +#include "moc_qtpropertybrowser.cxx" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowser.h b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowser.h new file mode 100644 index 000000000..35b7ac0f8 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowser.h @@ -0,0 +1,379 @@ +/**************************************************************************** +** +** This file is part of a Qt Solutions component. +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QTPROPERTYBROWSER_H +#define QTPROPERTYBROWSER_H + +#include +#include + +#if QT_VERSION >= 0x040400 +QT_BEGIN_NAMESPACE +#endif + +#if defined(Q_WS_WIN) +# if !defined(QT_QTPROPERTYBROWSER_EXPORT) && !defined(QT_QTPROPERTYBROWSER_IMPORT) +# define QT_QTPROPERTYBROWSER_EXPORT +# elif defined(QT_QTPROPERTYBROWSER_IMPORT) +# if defined(QT_QTPROPERTYBROWSER_EXPORT) +# undef QT_QTPROPERTYBROWSER_EXPORT +# endif +# define QT_QTPROPERTYBROWSER_EXPORT __declspec(dllimport) +# elif defined(QT_QTPROPERTYBROWSER_EXPORT) +# undef QT_QTPROPERTYBROWSER_EXPORT +# define QT_QTPROPERTYBROWSER_EXPORT __declspec(dllexport) +# endif +#else +# define QT_QTPROPERTYBROWSER_EXPORT +#endif + + +class QtAbstractPropertyManager; +class QtPropertyPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtProperty +{ +public: + virtual ~QtProperty(); + + QList subProperties() const; + + QtAbstractPropertyManager *propertyManager() const; + + QString toolTip() const; + QString statusTip() const; + QString whatsThis() const; + QString propertyName() const; + + bool isEnabled() const; + bool isModified() const; + bool isBold() const; + + bool hasValue() const; + QIcon valueIcon() const; + QString valueText() const; + + void setToolTip(const QString &text); + void setStatusTip(const QString &text); + void setWhatsThis(const QString &text); + void setPropertyName(const QString &text); + void setEnabled(bool enable); + void setModified(bool modified); + void setBold(bool bold); + + void addSubProperty(QtProperty *property); + void insertSubProperty(QtProperty *property, QtProperty *afterProperty); + void removeSubProperty(QtProperty *property); +protected: + explicit QtProperty(QtAbstractPropertyManager *manager); + void propertyChanged(); +private: + friend class QtAbstractPropertyManager; + QtPropertyPrivate *d_ptr; +}; + +class QtAbstractPropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtAbstractPropertyManager : public QObject +{ + Q_OBJECT +public: + + explicit QtAbstractPropertyManager(QObject *parent = 0); + ~QtAbstractPropertyManager(); + + QSet properties() const; + void clear() const; + + QtProperty *addProperty(const QString &name = QString()); +Q_SIGNALS: + + void propertyInserted(QtProperty *property, + QtProperty *parent, QtProperty *after); + void propertyChanged(QtProperty *property); + void propertyRemoved(QtProperty *property, QtProperty *parent); + void propertyDestroyed(QtProperty *property); +protected: + virtual bool hasValue(const QtProperty *property) const; + virtual QIcon valueIcon(const QtProperty *property) const; + virtual QString valueText(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property) = 0; + virtual void uninitializeProperty(QtProperty *property); + virtual QtProperty *createProperty(); +private: + friend class QtProperty; + QtAbstractPropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtAbstractPropertyManager) + Q_DISABLE_COPY(QtAbstractPropertyManager) +}; + +class QT_QTPROPERTYBROWSER_EXPORT QtAbstractEditorFactoryBase : public QObject +{ + Q_OBJECT +public: + virtual QWidget *createEditor(QtProperty *property, QWidget *parent) = 0; +protected: + explicit QtAbstractEditorFactoryBase(QObject *parent = 0) + : QObject(parent) {} + + virtual void breakConnection(QtAbstractPropertyManager *manager) = 0; +protected Q_SLOTS: + virtual void managerDestroyed(QObject *manager) = 0; + + friend class QtAbstractPropertyBrowser; +}; + +template +class QtAbstractEditorFactory : public QtAbstractEditorFactoryBase +{ +public: + explicit QtAbstractEditorFactory(QObject *parent) : QtAbstractEditorFactoryBase(parent) {} + QWidget *createEditor(QtProperty *property, QWidget *parent) + { + QSetIterator it(m_managers); + while (it.hasNext()) { + PropertyManager *manager = it.next(); + if (manager == property->propertyManager()) { + return createEditor(manager, property, parent); + } + } + return 0; + } + void addPropertyManager(PropertyManager *manager) + { + if (m_managers.contains(manager)) + return; + m_managers.insert(manager); + connectPropertyManager(manager); + connect(manager, SIGNAL(destroyed(QObject *)), + this, SLOT(managerDestroyed(QObject *))); + } + void removePropertyManager(PropertyManager *manager) + { + if (!m_managers.contains(manager)) + return; + disconnect(manager, SIGNAL(destroyed(QObject *)), + this, SLOT(managerDestroyed(QObject *))); + disconnectPropertyManager(manager); + m_managers.remove(manager); + } + QSet propertyManagers() const + { + return m_managers; + } + PropertyManager *propertyManager(QtProperty *property) const + { + QtAbstractPropertyManager *manager = property->propertyManager(); + QSetIterator itManager(m_managers); + while (itManager.hasNext()) { + PropertyManager *m = itManager.next(); + if (m == manager) { + return m; + } + } + return 0; + } +protected: + virtual void connectPropertyManager(PropertyManager *manager) = 0; + virtual QWidget *createEditor(PropertyManager *manager, QtProperty *property, + QWidget *parent) = 0; + virtual void disconnectPropertyManager(PropertyManager *manager) = 0; + void managerDestroyed(QObject *manager) + { + QSetIterator it(m_managers); + while (it.hasNext()) { + PropertyManager *m = it.next(); + if (m == manager) { + m_managers.remove(m); + return; + } + } + } +private: + void breakConnection(QtAbstractPropertyManager *manager) + { + QSetIterator it(m_managers); + while (it.hasNext()) { + PropertyManager *m = it.next(); + if (m == manager) { + removePropertyManager(m); + return; + } + } + } +private: + QSet m_managers; + friend class QtAbstractPropertyEditor; +}; + +class QtAbstractPropertyBrowser; +class QtBrowserItemPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtBrowserItem +{ +public: + QtProperty *property() const; + QtBrowserItem *parent() const; + QList children() const; + QtAbstractPropertyBrowser *browser() const; +private: + explicit QtBrowserItem(QtAbstractPropertyBrowser *browser, QtProperty *property, QtBrowserItem *parent); + ~QtBrowserItem(); + QtBrowserItemPrivate *d_ptr; + friend class QtAbstractPropertyBrowserPrivate; +}; + +class QtAbstractPropertyBrowserPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtAbstractPropertyBrowser : public QWidget +{ + Q_OBJECT +public: + + explicit QtAbstractPropertyBrowser(QWidget *parent = 0); + ~QtAbstractPropertyBrowser(); + + QList properties() const; + QList items(QtProperty *property) const; + QtBrowserItem *topLevelItem(QtProperty *property) const; + QList topLevelItems() const; + void clear(); + + template + void setFactoryForManager(PropertyManager *manager, + QtAbstractEditorFactory *factory) { + QtAbstractPropertyManager *abstractManager = manager; + QtAbstractEditorFactoryBase *abstractFactory = factory; + + if (addFactory(abstractManager, abstractFactory)) + factory->addPropertyManager(manager); + } + + void unsetFactoryForManager(QtAbstractPropertyManager *manager); + + QtBrowserItem *currentItem() const; + void setCurrentItem(QtBrowserItem *); + +Q_SIGNALS: + void currentItemChanged(QtBrowserItem *); + +public Q_SLOTS: + + QtBrowserItem *addProperty(QtProperty *property); + QtBrowserItem *insertProperty(QtProperty *property, QtProperty *afterProperty); + void removeProperty(QtProperty *property); + +protected: + + virtual void itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem) = 0; + virtual void itemRemoved(QtBrowserItem *item) = 0; + // can be tooltip, statustip, whatsthis, name, icon, text. + virtual void itemChanged(QtBrowserItem *item) = 0; + + virtual QWidget *createEditor(QtProperty *property, QWidget *parent); +private: + + bool addFactory(QtAbstractPropertyManager *abstractManager, + QtAbstractEditorFactoryBase *abstractFactory); + + QtAbstractPropertyBrowserPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtAbstractPropertyBrowser) + Q_DISABLE_COPY(QtAbstractPropertyBrowser) + Q_PRIVATE_SLOT(d_func(), void slotPropertyInserted(QtProperty *, + QtProperty *, QtProperty *)) + Q_PRIVATE_SLOT(d_func(), void slotPropertyRemoved(QtProperty *, + QtProperty *)) + Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *)) + Q_PRIVATE_SLOT(d_func(), void slotPropertyDataChanged(QtProperty *)) + +}; + +#if QT_VERSION >= 0x040400 +QT_END_NAMESPACE +#endif + +#endif // QTPROPERTYBROWSER_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowser.pri b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowser.pri new file mode 100644 index 000000000..6a6050c75 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowser.pri @@ -0,0 +1,30 @@ +include(../common.pri) +INCLUDEPATH += $$PWD +DEPENDPATH += $$PWD + +qtpropertybrowser-uselib:!qtpropertybrowser-buildlib { + LIBS += -L$$QTPROPERTYBROWSER_LIBDIR -l$$QTPROPERTYBROWSER_LIBNAME +} else { + SOURCES += $$PWD/qtpropertybrowser.cpp \ + $$PWD/qtpropertymanager.cpp \ + $$PWD/qteditorfactory.cpp \ + $$PWD/qtvariantproperty.cpp \ + $$PWD/qttreepropertybrowser.cpp \ + $$PWD/qtbuttonpropertybrowser.cpp \ + $$PWD/qtgroupboxpropertybrowser.cpp \ + $$PWD/qtpropertybrowserutils.cpp + HEADERS += $$PWD/qtpropertybrowser.h \ + $$PWD/qtpropertymanager.h \ + $$PWD/qteditorfactory.h \ + $$PWD/qtvariantproperty.h \ + $$PWD/qttreepropertybrowser.h \ + $$PWD/qtbuttonpropertybrowser.h \ + $$PWD/qtgroupboxpropertybrowser.h \ + $$PWD/qtpropertybrowserutils_p.h + RESOURCES += $$PWD/qtpropertybrowser.qrc +} + +win32 { + contains(TEMPLATE, lib):contains(CONFIG, shared):DEFINES += QT_QTPROPERTYBROWSER_EXPORT + else:qtpropertybrowser-uselib:DEFINES += QT_QTPROPERTYBROWSER_IMPORT +} diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowser.qrc b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowser.qrc new file mode 100644 index 000000000..4f91ab782 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowser.qrc @@ -0,0 +1,23 @@ + + + images/cursor-arrow.png + images/cursor-busy.png + images/cursor-closedhand.png + images/cursor-cross.png + images/cursor-forbidden.png + images/cursor-hand.png + images/cursor-hsplit.png + images/cursor-ibeam.png + images/cursor-openhand.png + images/cursor-sizeall.png + images/cursor-sizeb.png + images/cursor-sizef.png + images/cursor-sizeh.png + images/cursor-sizev.png + images/cursor-uparrow.png + images/cursor-vsplit.png + images/cursor-wait.png + images/cursor-whatsthis.png + + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowserutils.cpp b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowserutils.cpp new file mode 100644 index 000000000..ce198bfca --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowserutils.cpp @@ -0,0 +1,477 @@ +/**************************************************************************** +** +** This file is part of a Qt Solutions component. +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qtpropertybrowserutils_p.h" +#include +#include +#include +#include +#include +#include +#include + +#if QT_VERSION >= 0x040400 +QT_BEGIN_NAMESPACE +#endif + +QtCursorDatabase::QtCursorDatabase() +{ + appendCursor(Qt::ArrowCursor, QApplication::translate("QtCursorDatabase", "Arrow", 0, + QApplication::UnicodeUTF8), QIcon(QLatin1String(":/trolltech/qtpropertybrowser/images/cursor-arrow.png"))); + appendCursor(Qt::UpArrowCursor, QApplication::translate("QtCursorDatabase", "Up Arrow", 0, + QApplication::UnicodeUTF8), QIcon(QLatin1String(":/trolltech/qtpropertybrowser/images/cursor-uparrow.png"))); + appendCursor(Qt::CrossCursor, QApplication::translate("QtCursorDatabase", "Cross", 0, + QApplication::UnicodeUTF8), QIcon(QLatin1String(":/trolltech/qtpropertybrowser/images/cursor-cross.png"))); + appendCursor(Qt::WaitCursor, QApplication::translate("QtCursorDatabase", "Wait", 0, + QApplication::UnicodeUTF8), QIcon(QLatin1String(":/trolltech/qtpropertybrowser/images/cursor-wait.png"))); + appendCursor(Qt::IBeamCursor, QApplication::translate("QtCursorDatabase", "IBeam", 0, + QApplication::UnicodeUTF8), QIcon(QLatin1String(":/trolltech/qtpropertybrowser/images/cursor-ibeam.png"))); + appendCursor(Qt::SizeVerCursor, QApplication::translate("QtCursorDatabase", "Size Vertical", 0, + QApplication::UnicodeUTF8), QIcon(QLatin1String(":/trolltech/qtpropertybrowser/images/cursor-sizev.png"))); + appendCursor(Qt::SizeHorCursor, QApplication::translate("QtCursorDatabase", "Size Horizontal", 0, + QApplication::UnicodeUTF8), QIcon(QLatin1String(":/trolltech/qtpropertybrowser/images/cursor-sizeh.png"))); + appendCursor(Qt::SizeFDiagCursor, QApplication::translate("QtCursorDatabase", "Size Backslash", 0, + QApplication::UnicodeUTF8), QIcon(QLatin1String(":/trolltech/qtpropertybrowser/images/cursor-sizef.png"))); + appendCursor(Qt::SizeBDiagCursor, QApplication::translate("QtCursorDatabase", "Size Slash", 0, + QApplication::UnicodeUTF8), QIcon(QLatin1String(":/trolltech/qtpropertybrowser/images/cursor-sizeb.png"))); + appendCursor(Qt::SizeAllCursor, QApplication::translate("QtCursorDatabase", "Size All", 0, + QApplication::UnicodeUTF8), QIcon(QLatin1String(":/trolltech/qtpropertybrowser/images/cursor-sizeall.png"))); + appendCursor(Qt::BlankCursor, QApplication::translate("QtCursorDatabase", "Blank", 0, + QApplication::UnicodeUTF8), QIcon()); + appendCursor(Qt::SplitVCursor, QApplication::translate("QtCursorDatabase", "Split Vertical", 0, + QApplication::UnicodeUTF8), QIcon(QLatin1String(":/trolltech/qtpropertybrowser/images/cursor-vsplit.png"))); + appendCursor(Qt::SplitHCursor, QApplication::translate("QtCursorDatabase", "Split Horizontal", 0, + QApplication::UnicodeUTF8), QIcon(QLatin1String(":/trolltech/qtpropertybrowser/images/cursor-hsplit.png"))); + appendCursor(Qt::PointingHandCursor, QApplication::translate("QtCursorDatabase", "Pointing Hand", 0, + QApplication::UnicodeUTF8), QIcon(QLatin1String(":/trolltech/qtpropertybrowser/images/cursor-hand.png"))); + appendCursor(Qt::ForbiddenCursor, QApplication::translate("QtCursorDatabase", "Forbidden", 0, + QApplication::UnicodeUTF8), QIcon(QLatin1String(":/trolltech/qtpropertybrowser/images/cursor-forbidden.png"))); + appendCursor(Qt::OpenHandCursor, QApplication::translate("QtCursorDatabase", "Open Hand", 0, + QApplication::UnicodeUTF8), QIcon(QLatin1String(":/trolltech/qtpropertybrowser/images/cursor-openhand.png"))); + appendCursor(Qt::ClosedHandCursor, QApplication::translate("QtCursorDatabase", "Closed Hand", 0, + QApplication::UnicodeUTF8), QIcon(QLatin1String(":/trolltech/qtpropertybrowser/images/cursor-closedhand.png"))); + appendCursor(Qt::WhatsThisCursor, QApplication::translate("QtCursorDatabase", "What's This", 0, + QApplication::UnicodeUTF8), QIcon(QLatin1String(":/trolltech/qtpropertybrowser/images/cursor-whatsthis.png"))); + appendCursor(Qt::BusyCursor, QApplication::translate("QtCursorDatabase", "Busy", 0, + QApplication::UnicodeUTF8), QIcon(QLatin1String(":/trolltech/qtpropertybrowser/images/cursor-busy.png"))); +} + +void QtCursorDatabase::appendCursor(Qt::CursorShape shape, const QString &name, const QIcon &icon) +{ + if (m_cursorShapeToValue.contains(shape)) + return; + int value = m_cursorNames.count(); + m_cursorNames.append(name); + m_cursorIcons[value] = icon; + m_valueToCursorShape[value] = shape; + m_cursorShapeToValue[shape] = value; +} + +QStringList QtCursorDatabase::cursorShapeNames() const +{ + return m_cursorNames; +} + +QMap QtCursorDatabase::cursorShapeIcons() const +{ + return m_cursorIcons; +} + +QString QtCursorDatabase::cursorToShapeName(const QCursor &cursor) const +{ + int val = cursorToValue(cursor); + if (val >= 0) + return m_cursorNames.at(val); + return QString(); +} + +QIcon QtCursorDatabase::cursorToShapeIcon(const QCursor &cursor) const +{ + int val = cursorToValue(cursor); + return m_cursorIcons.value(val); +} + +int QtCursorDatabase::cursorToValue(const QCursor &cursor) const +{ +#ifndef QT_NO_CURSOR + Qt::CursorShape shape = cursor.shape(); + if (m_cursorShapeToValue.contains(shape)) + return m_cursorShapeToValue[shape]; +#endif + return -1; +} + +#ifndef QT_NO_CURSOR +QCursor QtCursorDatabase::valueToCursor(int value) const +{ + if (m_valueToCursorShape.contains(value)) + return QCursor(m_valueToCursorShape[value]); + return QCursor(); +} +#endif + +QPixmap QtPropertyBrowserUtils::brushValuePixmap(const QBrush &b) +{ + QImage img(16, 16, QImage::Format_ARGB32_Premultiplied); + img.fill(0); + + QPainter painter(&img); + painter.setCompositionMode(QPainter::CompositionMode_Source); + painter.fillRect(0, 0, img.width(), img.height(), b); + QColor color = b.color(); + if (color.alpha() != 255) { // indicate alpha by an inset + QBrush opaqueBrush = b; + color.setAlpha(255); + opaqueBrush.setColor(color); + painter.fillRect(img.width() / 4, img.height() / 4, + img.width() / 2, img.height() / 2, opaqueBrush); + } + painter.end(); + return QPixmap::fromImage(img); +} + +QIcon QtPropertyBrowserUtils::brushValueIcon(const QBrush &b) +{ + return QIcon(brushValuePixmap(b)); +} + +QString QtPropertyBrowserUtils::colorValueText(const QColor &c) +{ + return QApplication::translate("QtPropertyBrowserUtils", "[%1, %2, %3] (%4)", 0, QApplication::UnicodeUTF8) + .arg(QString::number(c.red())) + .arg(QString::number(c.green())) + .arg(QString::number(c.blue())) + .arg(QString::number(c.alpha())); +} + +QPixmap QtPropertyBrowserUtils::fontValuePixmap(const QFont &font) +{ + QFont f = font; + QImage img(16, 16, QImage::Format_ARGB32_Premultiplied); + img.fill(0); + QPainter p(&img); + p.setRenderHint(QPainter::TextAntialiasing, true); + p.setRenderHint(QPainter::Antialiasing, true); + f.setPointSize(13); + p.setFont(f); + QTextOption t; + t.setAlignment(Qt::AlignCenter); + p.drawText(QRect(0, 0, 16, 16), QString(QLatin1Char('A')), t); + return QPixmap::fromImage(img); +} + +QIcon QtPropertyBrowserUtils::fontValueIcon(const QFont &f) +{ + return QIcon(fontValuePixmap(f)); +} + +QString QtPropertyBrowserUtils::fontValueText(const QFont &f) +{ + return QApplication::translate("QtPropertyBrowserUtils", "[%1, %2]", 0, QApplication::UnicodeUTF8) + .arg(f.family()) + .arg(f.pointSize()); +} + + +QtBoolEdit::QtBoolEdit(QWidget *parent) : + QWidget(parent), + m_checkBox(new QCheckBox(this)), + m_textVisible(true) +{ + QHBoxLayout *lt = new QHBoxLayout; + if (QApplication::layoutDirection() == Qt::LeftToRight) + lt->setContentsMargins(4, 0, 0, 0); + else + lt->setContentsMargins(0, 0, 4, 0); + lt->addWidget(m_checkBox); + setLayout(lt); + connect(m_checkBox, SIGNAL(toggled(bool)), this, SIGNAL(toggled(bool))); + setFocusProxy(m_checkBox); + m_checkBox->setText(QString()); +} + +void QtBoolEdit::setTextVisible(bool textVisible) +{ + if (m_textVisible == textVisible) + return; + + m_textVisible = textVisible; + m_checkBox->setText(QString()); +} + +Qt::CheckState QtBoolEdit::checkState() const +{ + return m_checkBox->checkState(); +} + +void QtBoolEdit::setCheckState(Qt::CheckState state) +{ + m_checkBox->setCheckState(state); +} + +bool QtBoolEdit::isChecked() const +{ + return m_checkBox->isChecked(); +} + +void QtBoolEdit::setChecked(bool c) +{ + m_checkBox->setChecked(c); + if (!m_textVisible) + return; + m_checkBox->setText(QString()); +} + +bool QtBoolEdit::blockCheckBoxSignals(bool block) +{ + return m_checkBox->blockSignals(block); +} + +void QtBoolEdit::mousePressEvent(QMouseEvent *event) +{ + if (event->buttons() == Qt::LeftButton) { + m_checkBox->click(); + event->accept(); + } else { + QWidget::mousePressEvent(event); + } +} + + +QtKeySequenceEdit::QtKeySequenceEdit(QWidget *parent) + : QWidget(parent), m_num(0), m_lineEdit(new QLineEdit(this)) +{ + QHBoxLayout *layout = new QHBoxLayout(this); + layout->addWidget(m_lineEdit); + layout->setMargin(0); + m_lineEdit->installEventFilter(this); + m_lineEdit->setReadOnly(true); + m_lineEdit->setFocusProxy(this); + setFocusPolicy(m_lineEdit->focusPolicy()); + setAttribute(Qt::WA_InputMethodEnabled); +} + +bool QtKeySequenceEdit::eventFilter(QObject *o, QEvent *e) +{ + if (o == m_lineEdit && e->type() == QEvent::ContextMenu) { + QContextMenuEvent *c = static_cast(e); + QMenu *menu = m_lineEdit->createStandardContextMenu(); + const QList actions = menu->actions(); + QListIterator itAction(actions); + while (itAction.hasNext()) { + QAction *action = itAction.next(); + action->setShortcut(QKeySequence()); + QString actionString = action->text(); + const int pos = actionString.lastIndexOf(QLatin1Char('\t')); + if (pos > 0) + actionString.remove(pos, actionString.length() - pos); + action->setText(actionString); + } + QAction *actionBefore = 0; + if (actions.count() > 0) + actionBefore = actions[0]; + QAction *clearAction = new QAction(tr("Clear Shortcut"), menu); + menu->insertAction(actionBefore, clearAction); + menu->insertSeparator(actionBefore); + clearAction->setEnabled(!m_keySequence.isEmpty()); + connect(clearAction, SIGNAL(triggered()), this, SLOT(slotClearShortcut())); + menu->exec(c->globalPos()); + delete menu; + e->accept(); + return true; + } + + return QWidget::eventFilter(o, e); +} + +void QtKeySequenceEdit::slotClearShortcut() +{ + if (m_keySequence.isEmpty()) + return; + setKeySequence(QKeySequence()); + emit keySequenceChanged(m_keySequence); +} + +void QtKeySequenceEdit::handleKeyEvent(QKeyEvent *e) +{ + int nextKey = e->key(); + if (nextKey == Qt::Key_Control || nextKey == Qt::Key_Shift || + nextKey == Qt::Key_Meta || nextKey == Qt::Key_Alt || + nextKey == Qt::Key_Super_L || nextKey == Qt::Key_AltGr) + return; + + nextKey |= translateModifiers(e->modifiers(), e->text()); + int k0 = m_keySequence[0]; + int k1 = m_keySequence[1]; + int k2 = m_keySequence[2]; + int k3 = m_keySequence[3]; + switch (m_num) { + case 0: k0 = nextKey; k1 = 0; k2 = 0; k3 = 0; break; + case 1: k1 = nextKey; k2 = 0; k3 = 0; break; + case 2: k2 = nextKey; k3 = 0; break; + case 3: k3 = nextKey; break; + default: break; + } + ++m_num; + if (m_num > 3) + m_num = 0; + m_keySequence = QKeySequence(k0, k1, k2, k3); + m_lineEdit->setText(m_keySequence.toString(QKeySequence::NativeText)); + e->accept(); + emit keySequenceChanged(m_keySequence); +} + +void QtKeySequenceEdit::setKeySequence(const QKeySequence &sequence) +{ + if (sequence == m_keySequence) + return; + m_num = 0; + m_keySequence = sequence; + m_lineEdit->setText(m_keySequence.toString(QKeySequence::NativeText)); +} + +QKeySequence QtKeySequenceEdit::keySequence() const +{ + return m_keySequence; +} + +int QtKeySequenceEdit::translateModifiers(Qt::KeyboardModifiers state, const QString &text) const +{ + int result = 0; + if ((state & Qt::ShiftModifier) && (text.size() == 0 || !text.at(0).isPrint() || text.at(0).isLetter() || text.at(0).isSpace())) + result |= Qt::SHIFT; + if (state & Qt::ControlModifier) + result |= Qt::CTRL; + if (state & Qt::MetaModifier) + result |= Qt::META; + if (state & Qt::AltModifier) + result |= Qt::ALT; + return result; +} + +void QtKeySequenceEdit::focusInEvent(QFocusEvent *e) +{ + m_lineEdit->event(e); + m_lineEdit->selectAll(); + QWidget::focusInEvent(e); +} + +void QtKeySequenceEdit::focusOutEvent(QFocusEvent *e) +{ + m_num = 0; + m_lineEdit->event(e); + QWidget::focusOutEvent(e); +} + +void QtKeySequenceEdit::keyPressEvent(QKeyEvent *e) +{ + handleKeyEvent(e); + e->accept(); +} + +void QtKeySequenceEdit::keyReleaseEvent(QKeyEvent *e) +{ + m_lineEdit->event(e); +} + +bool QtKeySequenceEdit::event(QEvent *e) +{ + if (e->type() == QEvent::Shortcut || + e->type() == QEvent::ShortcutOverride || + e->type() == QEvent::KeyRelease) { + e->accept(); + return true; + } + return QWidget::event(e); +} + + + + +#if QT_VERSION >= 0x040400 +QT_END_NAMESPACE +#endif diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowserutils_p.h b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowserutils_p.h new file mode 100644 index 000000000..dca4b8c37 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertybrowserutils_p.h @@ -0,0 +1,207 @@ +/**************************************************************************** +** +** This file is part of a Qt Solutions component. +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of Qt Designer. This header +// file may change from version to version without notice, or even be removed. +// +// We mean it. +// + +#ifndef QTPROPERTYBROWSERUTILS_H +#define QTPROPERTYBROWSERUTILS_H + +#include +#include +#include +#include + +#if QT_VERSION >= 0x040400 +QT_BEGIN_NAMESPACE +#endif + +class QMouseEvent; +class QCheckBox; +class QLineEdit; + +class QtCursorDatabase +{ +public: + QtCursorDatabase(); + + QStringList cursorShapeNames() const; + QMap cursorShapeIcons() const; + QString cursorToShapeName(const QCursor &cursor) const; + QIcon cursorToShapeIcon(const QCursor &cursor) const; + int cursorToValue(const QCursor &cursor) const; +#ifndef QT_NO_CURSOR + QCursor valueToCursor(int value) const; +#endif +private: + void appendCursor(Qt::CursorShape shape, const QString &name, const QIcon &icon); + QStringList m_cursorNames; + QMap m_cursorIcons; + QMap m_valueToCursorShape; + QMap m_cursorShapeToValue; +}; + +class QtPropertyBrowserUtils +{ +public: + static QPixmap brushValuePixmap(const QBrush &b); + static QIcon brushValueIcon(const QBrush &b); + static QString colorValueText(const QColor &c); + static QPixmap fontValuePixmap(const QFont &f); + static QIcon fontValueIcon(const QFont &f); + static QString fontValueText(const QFont &f); +}; + +class QtBoolEdit : public QWidget { + Q_OBJECT +public: + QtBoolEdit(QWidget *parent = 0); + + bool textVisible() const { return m_textVisible; } + void setTextVisible(bool textVisible); + + Qt::CheckState checkState() const; + void setCheckState(Qt::CheckState state); + + bool isChecked() const; + void setChecked(bool c); + + bool blockCheckBoxSignals(bool block); + +Q_SIGNALS: + void toggled(bool); + +protected: + void mousePressEvent(QMouseEvent * event); + +private: + QCheckBox *m_checkBox; + bool m_textVisible; +}; + +class QtKeySequenceEdit : public QWidget +{ + Q_OBJECT +public: + QtKeySequenceEdit(QWidget *parent = 0); + + QKeySequence keySequence() const; + bool eventFilter(QObject *o, QEvent *e); +public Q_SLOTS: + void setKeySequence(const QKeySequence &sequence); +Q_SIGNALS: + void keySequenceChanged(const QKeySequence &sequence); +protected: + void focusInEvent(QFocusEvent *e); + void focusOutEvent(QFocusEvent *e); + void keyPressEvent(QKeyEvent *e); + void keyReleaseEvent(QKeyEvent *e); + bool event(QEvent *e); +private slots: + void slotClearShortcut(); +private: + void handleKeyEvent(QKeyEvent *e); + int translateModifiers(Qt::KeyboardModifiers state, const QString &text) const; + + int m_num; + QKeySequence m_keySequence; + QLineEdit *m_lineEdit; +}; + +#if QT_VERSION >= 0x040400 +QT_END_NAMESPACE +#endif + +#endif diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertymanager.cpp b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertymanager.cpp new file mode 100644 index 000000000..20de19786 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertymanager.cpp @@ -0,0 +1,6465 @@ +/**************************************************************************** +** +** This file is part of a Qt Solutions component. +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qtpropertymanager.h" +#include "qtpropertybrowserutils_p.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#if defined(Q_CC_MSVC) +# pragma warning(disable: 4786) /* MS VS 6: truncating debug info after 255 characters */ +#endif + +#if QT_VERSION >= 0x040400 +QT_BEGIN_NAMESPACE +#endif + +template +static void setSimpleMinimumData(PrivateData *data, const Value &minVal) +{ + data->minVal = minVal; + if (data->maxVal < data->minVal) + data->maxVal = data->minVal; + + if (data->val < data->minVal) + data->val = data->minVal; +} + +template +static void setSimpleMaximumData(PrivateData *data, const Value &maxVal) +{ + data->maxVal = maxVal; + if (data->minVal > data->maxVal) + data->minVal = data->maxVal; + + if (data->val > data->maxVal) + data->val = data->maxVal; +} + +template +static void setSizeMinimumData(PrivateData *data, const Value &newMinVal) +{ + data->minVal = newMinVal; + if (data->maxVal.width() < data->minVal.width()) + data->maxVal.setWidth(data->minVal.width()); + if (data->maxVal.height() < data->minVal.height()) + data->maxVal.setHeight(data->minVal.height()); + + if (data->val.width() < data->minVal.width()) + data->val.setWidth(data->minVal.width()); + if (data->val.height() < data->minVal.height()) + data->val.setHeight(data->minVal.height()); +} + +template +static void setSizeMaximumData(PrivateData *data, const Value &newMaxVal) +{ + data->maxVal = newMaxVal; + if (data->minVal.width() > data->maxVal.width()) + data->minVal.setWidth(data->maxVal.width()); + if (data->minVal.height() > data->maxVal.height()) + data->minVal.setHeight(data->maxVal.height()); + + if (data->val.width() > data->maxVal.width()) + data->val.setWidth(data->maxVal.width()); + if (data->val.height() > data->maxVal.height()) + data->val.setHeight(data->maxVal.height()); +} + +template +static SizeValue qBoundSize(const SizeValue &minVal, const SizeValue &val, const SizeValue &maxVal) +{ + SizeValue croppedVal = val; + if (minVal.width() > val.width()) + croppedVal.setWidth(minVal.width()); + else if (maxVal.width() < val.width()) + croppedVal.setWidth(maxVal.width()); + + if (minVal.height() > val.height()) + croppedVal.setHeight(minVal.height()); + else if (maxVal.height() < val.height()) + croppedVal.setHeight(maxVal.height()); + + return croppedVal; +} + +// Match the exact signature of qBound for VS 6. +QSize qBound(QSize minVal, QSize val, QSize maxVal) +{ + return qBoundSize(minVal, val, maxVal); +} + +QSizeF qBound(QSizeF minVal, QSizeF val, QSizeF maxVal) +{ + return qBoundSize(minVal, val, maxVal); +} + +namespace { + +namespace { +template +void orderBorders(Value &minVal, Value &maxVal) +{ + if (minVal > maxVal) + qSwap(minVal, maxVal); +} + +template +static void orderSizeBorders(Value &minVal, Value &maxVal) +{ + Value fromSize = minVal; + Value toSize = maxVal; + if (fromSize.width() > toSize.width()) { + fromSize.setWidth(maxVal.width()); + toSize.setWidth(minVal.width()); + } + if (fromSize.height() > toSize.height()) { + fromSize.setHeight(maxVal.height()); + toSize.setHeight(minVal.height()); + } + minVal = fromSize; + maxVal = toSize; +} + +void orderBorders(QSize &minVal, QSize &maxVal) +{ + orderSizeBorders(minVal, maxVal); +} + +void orderBorders(QSizeF &minVal, QSizeF &maxVal) +{ + orderSizeBorders(minVal, maxVal); +} + +} +} +//////// + +template +static Value getData(const QMap &propertyMap, + Value PrivateData::*data, + const QtProperty *property, const Value &defaultValue = Value()) +{ + typedef QMap PropertyToData; + typedef Q_TYPENAME PropertyToData::const_iterator PropertyToDataConstIterator; + const PropertyToDataConstIterator it = propertyMap.constFind(property); + if (it == propertyMap.constEnd()) + return defaultValue; + return it.value().*data; +} + +template +static Value getValue(const QMap &propertyMap, + const QtProperty *property, const Value &defaultValue = Value()) +{ + return getData(propertyMap, &PrivateData::val, property, defaultValue); +} + +template +static Value getMinimum(const QMap &propertyMap, + const QtProperty *property, const Value &defaultValue = Value()) +{ + return getData(propertyMap, &PrivateData::minVal, property, defaultValue); +} + +template +static Value getMaximum(const QMap &propertyMap, + const QtProperty *property, const Value &defaultValue = Value()) +{ + return getData(propertyMap, &PrivateData::maxVal, property, defaultValue); +} + +template +static void setSimpleValue(QMap &propertyMap, + PropertyManager *manager, + void (PropertyManager::*propertyChangedSignal)(QtProperty *), + void (PropertyManager::*valueChangedSignal)(QtProperty *, ValueChangeParameter), + QtProperty *property, const Value &val) +{ + typedef QMap PropertyToData; + typedef Q_TYPENAME PropertyToData::iterator PropertyToDataIterator; + const PropertyToDataIterator it = propertyMap.find(property); + if (it == propertyMap.end()) + return; + + if (it.value() == val) + return; + + it.value() = val; + + emit (manager->*propertyChangedSignal)(property); + emit (manager->*valueChangedSignal)(property, val); +} + +template +static void setValueInRange(PropertyManager *manager, PropertyManagerPrivate *managerPrivate, + void (PropertyManager::*propertyChangedSignal)(QtProperty *), + void (PropertyManager::*valueChangedSignal)(QtProperty *, ValueChangeParameter), + QtProperty *property, const Value &val, + void (PropertyManagerPrivate::*setSubPropertyValue)(QtProperty *, ValueChangeParameter)) +{ + typedef Q_TYPENAME PropertyManagerPrivate::Data PrivateData; + typedef QMap PropertyToData; + typedef Q_TYPENAME PropertyToData::iterator PropertyToDataIterator; + const PropertyToDataIterator it = managerPrivate->m_values.find(property); + if (it == managerPrivate->m_values.end()) + return; + + PrivateData &data = it.value(); + + if (data.val == val) + return; + + const Value oldVal = data.val; + + data.val = qBound(data.minVal, val, data.maxVal); + + if (data.val == oldVal) + return; + + if (setSubPropertyValue) + (managerPrivate->*setSubPropertyValue)(property, data.val); + + emit (manager->*propertyChangedSignal)(property); + emit (manager->*valueChangedSignal)(property, data.val); +} + +template +static void setBorderValues(PropertyManager *manager, PropertyManagerPrivate *managerPrivate, + void (PropertyManager::*propertyChangedSignal)(QtProperty *), + void (PropertyManager::*valueChangedSignal)(QtProperty *, ValueChangeParameter), + void (PropertyManager::*rangeChangedSignal)(QtProperty *, ValueChangeParameter, ValueChangeParameter), + QtProperty *property, const Value &minVal, const Value &maxVal, + void (PropertyManagerPrivate::*setSubPropertyRange)(QtProperty *, + ValueChangeParameter, ValueChangeParameter, ValueChangeParameter)) +{ + typedef Q_TYPENAME PropertyManagerPrivate::Data PrivateData; + typedef QMap PropertyToData; + typedef Q_TYPENAME PropertyToData::iterator PropertyToDataIterator; + const PropertyToDataIterator it = managerPrivate->m_values.find(property); + if (it == managerPrivate->m_values.end()) + return; + + Value fromVal = minVal; + Value toVal = maxVal; + orderBorders(fromVal, toVal); + + PrivateData &data = it.value(); + + if (data.minVal == fromVal && data.maxVal == toVal) + return; + + const Value oldVal = data.val; + + data.setMinimumValue(fromVal); + data.setMaximumValue(toVal); + + emit (manager->*rangeChangedSignal)(property, data.minVal, data.maxVal); + + if (setSubPropertyRange) + (managerPrivate->*setSubPropertyRange)(property, data.minVal, data.maxVal, data.val); + + if (data.val == oldVal) + return; + + emit (manager->*propertyChangedSignal)(property); + emit (manager->*valueChangedSignal)(property, data.val); +} + +template +static void setBorderValue(PropertyManager *manager, PropertyManagerPrivate *managerPrivate, + void (PropertyManager::*propertyChangedSignal)(QtProperty *), + void (PropertyManager::*valueChangedSignal)(QtProperty *, ValueChangeParameter), + void (PropertyManager::*rangeChangedSignal)(QtProperty *, ValueChangeParameter, ValueChangeParameter), + QtProperty *property, + Value (PrivateData::*getRangeVal)() const, + void (PrivateData::*setRangeVal)(ValueChangeParameter), const Value &borderVal, + void (PropertyManagerPrivate::*setSubPropertyRange)(QtProperty *, + ValueChangeParameter, ValueChangeParameter, ValueChangeParameter)) +{ + typedef QMap PropertyToData; + typedef Q_TYPENAME PropertyToData::iterator PropertyToDataIterator; + const PropertyToDataIterator it = managerPrivate->m_values.find(property); + if (it == managerPrivate->m_values.end()) + return; + + PrivateData &data = it.value(); + + if ((data.*getRangeVal)() == borderVal) + return; + + const Value oldVal = data.val; + + (data.*setRangeVal)(borderVal); + + emit (manager->*rangeChangedSignal)(property, data.minVal, data.maxVal); + + if (setSubPropertyRange) + (managerPrivate->*setSubPropertyRange)(property, data.minVal, data.maxVal, data.val); + + if (data.val == oldVal) + return; + + emit (manager->*propertyChangedSignal)(property); + emit (manager->*valueChangedSignal)(property, data.val); +} + +template +static void setMinimumValue(PropertyManager *manager, PropertyManagerPrivate *managerPrivate, + void (PropertyManager::*propertyChangedSignal)(QtProperty *), + void (PropertyManager::*valueChangedSignal)(QtProperty *, ValueChangeParameter), + void (PropertyManager::*rangeChangedSignal)(QtProperty *, ValueChangeParameter, ValueChangeParameter), + QtProperty *property, const Value &minVal) +{ + void (PropertyManagerPrivate::*setSubPropertyRange)(QtProperty *, + ValueChangeParameter, ValueChangeParameter, ValueChangeParameter) = 0; + setBorderValue(manager, managerPrivate, + propertyChangedSignal, valueChangedSignal, rangeChangedSignal, + property, &PropertyManagerPrivate::Data::minimumValue, &PropertyManagerPrivate::Data::setMinimumValue, minVal, setSubPropertyRange); +} + +template +static void setMaximumValue(PropertyManager *manager, PropertyManagerPrivate *managerPrivate, + void (PropertyManager::*propertyChangedSignal)(QtProperty *), + void (PropertyManager::*valueChangedSignal)(QtProperty *, ValueChangeParameter), + void (PropertyManager::*rangeChangedSignal)(QtProperty *, ValueChangeParameter, ValueChangeParameter), + QtProperty *property, const Value &maxVal) +{ + void (PropertyManagerPrivate::*setSubPropertyRange)(QtProperty *, + ValueChangeParameter, ValueChangeParameter, ValueChangeParameter) = 0; + setBorderValue(manager, managerPrivate, + propertyChangedSignal, valueChangedSignal, rangeChangedSignal, + property, &PropertyManagerPrivate::Data::maximumValue, &PropertyManagerPrivate::Data::setMaximumValue, maxVal, setSubPropertyRange); +} + +class QtMetaEnumWrapper : public QObject +{ + Q_OBJECT + Q_PROPERTY(QSizePolicy::Policy policy READ policy) +public: + QSizePolicy::Policy policy() const { return QSizePolicy::Ignored; } +private: + QtMetaEnumWrapper(QObject *parent) : QObject(parent) {} +}; + +class QtMetaEnumProvider +{ +public: + QtMetaEnumProvider(); + + QStringList policyEnumNames() const { return m_policyEnumNames; } + QStringList languageEnumNames() const { return m_languageEnumNames; } + QStringList countryEnumNames(QLocale::Language language) const { return m_countryEnumNames.value(language); } + + QSizePolicy::Policy indexToSizePolicy(int index) const; + int sizePolicyToIndex(QSizePolicy::Policy policy) const; + + void indexToLocale(int languageIndex, int countryIndex, QLocale::Language *language, QLocale::Country *country) const; + void localeToIndex(QLocale::Language language, QLocale::Country country, int *languageIndex, int *countryIndex) const; + +private: + void initLocale(); + + QStringList m_policyEnumNames; + QStringList m_languageEnumNames; + QMap m_countryEnumNames; + QMap m_indexToLanguage; + QMap m_languageToIndex; + QMap > m_indexToCountry; + QMap > m_countryToIndex; + QMetaEnum m_policyEnum; +}; + +#if QT_VERSION < 0x040300 + +static QList countriesForLanguage(QLocale::Language language) +{ + QList countries; + QLocale::Country country = QLocale::AnyCountry; + while (country <= QLocale::LastCountry) { + QLocale locale(language, country); + if (locale.language() == language && !countries.contains(locale.country())) + countries << locale.country(); + country = (QLocale::Country)((uint)country + 1); // ++country + } + return countries; +} + +#endif + +static QList sortCountries(const QList &countries) +{ + QMultiMap nameToCountry; + QListIterator itCountry(countries); + while (itCountry.hasNext()) { + QLocale::Country country = itCountry.next(); + nameToCountry.insert(QLocale::countryToString(country), country); + } + return nameToCountry.values(); +} + +void QtMetaEnumProvider::initLocale() +{ + QMultiMap nameToLanguage; + QLocale::Language language = QLocale::C; + while (language <= QLocale::LastLanguage) { + QLocale locale(language); + if (locale.language() == language) + nameToLanguage.insert(QLocale::languageToString(language), language); + language = (QLocale::Language)((uint)language + 1); // ++language + } + + const QLocale system = QLocale::system(); + if (!nameToLanguage.contains(QLocale::languageToString(system.language()))) + nameToLanguage.insert(QLocale::languageToString(system.language()), system.language()); + + QList languages = nameToLanguage.values(); + QListIterator itLang(languages); + while (itLang.hasNext()) { + QLocale::Language language = itLang.next(); + QList countries; +#if QT_VERSION < 0x040300 + countries = countriesForLanguage(language); +#else + countries = QLocale::countriesForLanguage(language); +#endif + if (countries.isEmpty() && language == system.language()) + countries << system.country(); + + if (!countries.isEmpty() && !m_languageToIndex.contains(language)) { + countries = sortCountries(countries); + int langIdx = m_languageEnumNames.count(); + m_indexToLanguage[langIdx] = language; + m_languageToIndex[language] = langIdx; + QStringList countryNames; + QListIterator it(countries); + int countryIdx = 0; + while (it.hasNext()) { + QLocale::Country country = it.next(); + countryNames << QLocale::countryToString(country); + m_indexToCountry[langIdx][countryIdx] = country; + m_countryToIndex[language][country] = countryIdx; + ++countryIdx; + } + m_languageEnumNames << QLocale::languageToString(language); + m_countryEnumNames[language] = countryNames; + } + } +} + +QtMetaEnumProvider::QtMetaEnumProvider() +{ + QMetaProperty p; + + p = QtMetaEnumWrapper::staticMetaObject.property( + QtMetaEnumWrapper::staticMetaObject.propertyOffset() + 0); + m_policyEnum = p.enumerator(); + const int keyCount = m_policyEnum.keyCount(); + for (int i = 0; i < keyCount; i++) + m_policyEnumNames << QLatin1String(m_policyEnum.key(i)); + + initLocale(); +} + +QSizePolicy::Policy QtMetaEnumProvider::indexToSizePolicy(int index) const +{ + return static_cast(m_policyEnum.value(index)); +} + +int QtMetaEnumProvider::sizePolicyToIndex(QSizePolicy::Policy policy) const +{ + const int keyCount = m_policyEnum.keyCount(); + for (int i = 0; i < keyCount; i++) + if (indexToSizePolicy(i) == policy) + return i; + return -1; +} + +void QtMetaEnumProvider::indexToLocale(int languageIndex, int countryIndex, QLocale::Language *language, QLocale::Country *country) const +{ + QLocale::Language l = QLocale::C; + QLocale::Country c = QLocale::AnyCountry; + if (m_indexToLanguage.contains(languageIndex)) { + l = m_indexToLanguage[languageIndex]; + if (m_indexToCountry.contains(languageIndex) && m_indexToCountry[languageIndex].contains(countryIndex)) + c = m_indexToCountry[languageIndex][countryIndex]; + } + if (language) + *language = l; + if (country) + *country = c; +} + +void QtMetaEnumProvider::localeToIndex(QLocale::Language language, QLocale::Country country, int *languageIndex, int *countryIndex) const +{ + int l = -1; + int c = -1; + if (m_languageToIndex.contains(language)) { + l = m_languageToIndex[language]; + if (m_countryToIndex.contains(language) && m_countryToIndex[language].contains(country)) + c = m_countryToIndex[language][country]; + } + + if (languageIndex) + *languageIndex = l; + if (countryIndex) + *countryIndex = c; +} + +Q_GLOBAL_STATIC(QtMetaEnumProvider, metaEnumProvider) + +// QtGroupPropertyManager + +/*! + \class QtGroupPropertyManager + + \brief The QtGroupPropertyManager provides and manages group properties. + + This class is intended to provide a grouping element without any value. + + \sa QtAbstractPropertyManager +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtGroupPropertyManager::QtGroupPropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtGroupPropertyManager::~QtGroupPropertyManager() +{ + +} + +/*! + \reimp +*/ +bool QtGroupPropertyManager::hasValue(const QtProperty *property) const +{ + Q_UNUSED(property) + return false; +} + +/*! + \reimp +*/ +void QtGroupPropertyManager::initializeProperty(QtProperty *property) +{ + Q_UNUSED(property) +} + +/*! + \reimp +*/ +void QtGroupPropertyManager::uninitializeProperty(QtProperty *property) +{ + Q_UNUSED(property) +} + +// QtIntPropertyManager + +class QtIntPropertyManagerPrivate +{ + QtIntPropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtIntPropertyManager) +public: + + struct Data + { + Data() : val(0), minVal(-INT_MAX), maxVal(INT_MAX), singleStep(1) {} + int val; + int minVal; + int maxVal; + int singleStep; + int minimumValue() const { return minVal; } + int maximumValue() const { return maxVal; } + void setMinimumValue(int newMinVal) { setSimpleMinimumData(this, newMinVal); } + void setMaximumValue(int newMaxVal) { setSimpleMaximumData(this, newMaxVal); } + }; + + typedef QMap PropertyValueMap; + PropertyValueMap m_values; +}; + +/*! + \class QtIntPropertyManager + + \brief The QtIntPropertyManager provides and manages int properties. + + An int property has a current value, and a range specifying the + valid values. The range is defined by a minimum and a maximum + value. + + The property's value and range can be retrieved using the value(), + minimum() and maximum() functions, and can be set using the + setValue(), setMinimum() and setMaximum() slots. Alternatively, + the range can be defined in one go using the setRange() slot. + + In addition, QtIntPropertyManager provides the valueChanged() signal which + is emitted whenever a property created by this manager changes, + and the rangeChanged() signal which is emitted whenever such a + property changes its range of valid values. + + \sa QtAbstractPropertyManager, QtSpinBoxFactory, QtSliderFactory, QtScrollBarFactory +*/ + +/*! + \fn void QtIntPropertyManager::valueChanged(QtProperty *property, int value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the new + \a value as parameters. + + \sa setValue() +*/ + +/*! + \fn void QtIntPropertyManager::rangeChanged(QtProperty *property, int minimum, int maximum) + + This signal is emitted whenever a property created by this manager + changes its range of valid values, passing a pointer to the + \a property and the new \a minimum and \a maximum values. + + \sa setRange() +*/ + +/*! + \fn void QtIntPropertyManager::singleStepChanged(QtProperty *property, int step) + + This signal is emitted whenever a property created by this manager + changes its single step property, passing a pointer to the + \a property and the new \a step value + + \sa setSingleStep() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtIntPropertyManager::QtIntPropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtIntPropertyManagerPrivate; + d_ptr->q_ptr = this; +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtIntPropertyManager::~QtIntPropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the given \a property's value. + + If the given property is not managed by this manager, this + function returns 0. + + \sa setValue() +*/ +int QtIntPropertyManager::value(const QtProperty *property) const +{ + return getValue(d_ptr->m_values, property, 0); +} + +/*! + Returns the given \a property's minimum value. + + \sa setMinimum(), maximum(), setRange() +*/ +int QtIntPropertyManager::minimum(const QtProperty *property) const +{ + return getMinimum(d_ptr->m_values, property, 0); +} + +/*! + Returns the given \a property's maximum value. + + \sa setMaximum(), minimum(), setRange() +*/ +int QtIntPropertyManager::maximum(const QtProperty *property) const +{ + return getMaximum(d_ptr->m_values, property, 0); +} + +/*! + Returns the given \a property's step value. + + The step is typically used to increment or decrement a property value while pressing an arrow key. + + \sa setSingleStep() +*/ +int QtIntPropertyManager::singleStep(const QtProperty *property) const +{ + return getData(d_ptr->m_values, &QtIntPropertyManagerPrivate::Data::singleStep, property, 0); +} + +/*! + \reimp +*/ +QString QtIntPropertyManager::valueText(const QtProperty *property) const +{ + const QtIntPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + return QString::number(it.value().val); +} + +/*! + \fn void QtIntPropertyManager::setValue(QtProperty *property, int value) + + Sets the value of the given \a property to \a value. + + If the specified \a value is not valid according to the given \a + property's range, the \a value is adjusted to the nearest valid + value within the range. + + \sa value(), setRange(), valueChanged() +*/ +void QtIntPropertyManager::setValue(QtProperty *property, int val) +{ + void (QtIntPropertyManagerPrivate::*setSubPropertyValue)(QtProperty *, int) = 0; + setValueInRange(this, d_ptr, + &QtIntPropertyManager::propertyChanged, + &QtIntPropertyManager::valueChanged, + property, val, setSubPropertyValue); +} + +/*! + Sets the minimum value for the given \a property to \a minVal. + + When setting the minimum value, the maximum and current values are + adjusted if necessary (ensuring that the range remains valid and + that the current value is within the range). + + \sa minimum(), setRange(), rangeChanged() +*/ +void QtIntPropertyManager::setMinimum(QtProperty *property, int minVal) +{ + setMinimumValue(this, d_ptr, + &QtIntPropertyManager::propertyChanged, + &QtIntPropertyManager::valueChanged, + &QtIntPropertyManager::rangeChanged, + property, minVal); +} + +/*! + Sets the maximum value for the given \a property to \a maxVal. + + When setting maximum value, the minimum and current values are + adjusted if necessary (ensuring that the range remains valid and + that the current value is within the range). + + \sa maximum(), setRange(), rangeChanged() +*/ +void QtIntPropertyManager::setMaximum(QtProperty *property, int maxVal) +{ + setMaximumValue(this, d_ptr, + &QtIntPropertyManager::propertyChanged, + &QtIntPropertyManager::valueChanged, + &QtIntPropertyManager::rangeChanged, + property, maxVal); +} + +/*! + \fn void QtIntPropertyManager::setRange(QtProperty *property, int minimum, int maximum) + + Sets the range of valid values. + + This is a convenience function defining the range of valid values + in one go; setting the \a minimum and \a maximum values for the + given \a property with a single function call. + + When setting a new range, the current value is adjusted if + necessary (ensuring that the value remains within range). + + \sa setMinimum(), setMaximum(), rangeChanged() +*/ +void QtIntPropertyManager::setRange(QtProperty *property, int minVal, int maxVal) +{ + void (QtIntPropertyManagerPrivate::*setSubPropertyRange)(QtProperty *, int, int, int) = 0; + setBorderValues(this, d_ptr, + &QtIntPropertyManager::propertyChanged, + &QtIntPropertyManager::valueChanged, + &QtIntPropertyManager::rangeChanged, + property, minVal, maxVal, setSubPropertyRange); +} + +/*! + Sets the step value for the given \a property to \a step. + + The step is typically used to increment or decrement a property value while pressing an arrow key. + + \sa singleStep() +*/ +void QtIntPropertyManager::setSingleStep(QtProperty *property, int step) +{ + const QtIntPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + QtIntPropertyManagerPrivate::Data data = it.value(); + + if (step < 0) + step = 0; + + if (data.singleStep == step) + return; + + data.singleStep = step; + + it.value() = data; + + emit singleStepChanged(property, data.singleStep); +} + +/*! + \reimp +*/ +void QtIntPropertyManager::initializeProperty(QtProperty *property) +{ + d_ptr->m_values[property] = QtIntPropertyManagerPrivate::Data(); +} + +/*! + \reimp +*/ +void QtIntPropertyManager::uninitializeProperty(QtProperty *property) +{ + d_ptr->m_values.remove(property); +} + +// QtDoublePropertyManager + +class QtDoublePropertyManagerPrivate +{ + QtDoublePropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtDoublePropertyManager) +public: + + struct Data + { + Data() : val(0), minVal(-INT_MAX), maxVal(INT_MAX), singleStep(1), decimals(2) {} + double val; + double minVal; + double maxVal; + double singleStep; + int decimals; + double minimumValue() const { return minVal; } + double maximumValue() const { return maxVal; } + void setMinimumValue(double newMinVal) { setSimpleMinimumData(this, newMinVal); } + void setMaximumValue(double newMaxVal) { setSimpleMaximumData(this, newMaxVal); } + }; + + typedef QMap PropertyValueMap; + PropertyValueMap m_values; +}; + +/*! + \class QtDoublePropertyManager + + \brief The QtDoublePropertyManager provides and manages double properties. + + A double property has a current value, and a range specifying the + valid values. The range is defined by a minimum and a maximum + value. + + The property's value and range can be retrieved using the value(), + minimum() and maximum() functions, and can be set using the + setValue(), setMinimum() and setMaximum() slots. + Alternatively, the range can be defined in one go using the + setRange() slot. + + In addition, QtDoublePropertyManager provides the valueChanged() signal + which is emitted whenever a property created by this manager + changes, and the rangeChanged() signal which is emitted whenever + such a property changes its range of valid values. + + \sa QtAbstractPropertyManager, QtDoubleSpinBoxFactory +*/ + +/*! + \fn void QtDoublePropertyManager::valueChanged(QtProperty *property, double value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the new + \a value as parameters. + + \sa setValue() +*/ + +/*! + \fn void QtDoublePropertyManager::rangeChanged(QtProperty *property, double minimum, double maximum) + + This signal is emitted whenever a property created by this manager + changes its range of valid values, passing a pointer to the + \a property and the new \a minimum and \a maximum values + + \sa setRange() +*/ + +/*! + \fn void QtDoublePropertyManager::decimalsChanged(QtProperty *property, int prec) + + This signal is emitted whenever a property created by this manager + changes its precision of value, passing a pointer to the + \a property and the new \a prec value + + \sa setDecimals() +*/ + +/*! + \fn void QtDoublePropertyManager::singleStepChanged(QtProperty *property, double step) + + This signal is emitted whenever a property created by this manager + changes its single step property, passing a pointer to the + \a property and the new \a step value + + \sa setSingleStep() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtDoublePropertyManager::QtDoublePropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtDoublePropertyManagerPrivate; + d_ptr->q_ptr = this; +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtDoublePropertyManager::~QtDoublePropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the given \a property's value. + + If the given property is not managed by this manager, this + function returns 0. + + \sa setValue() +*/ +double QtDoublePropertyManager::value(const QtProperty *property) const +{ + return getValue(d_ptr->m_values, property, 0.0); +} + +/*! + Returns the given \a property's minimum value. + + \sa maximum(), setRange() +*/ +double QtDoublePropertyManager::minimum(const QtProperty *property) const +{ + return getMinimum(d_ptr->m_values, property, 0.0); +} + +/*! + Returns the given \a property's maximum value. + + \sa minimum(), setRange() +*/ +double QtDoublePropertyManager::maximum(const QtProperty *property) const +{ + return getMaximum(d_ptr->m_values, property, 0.0); +} + +/*! + Returns the given \a property's step value. + + The step is typically used to increment or decrement a property value while pressing an arrow key. + + \sa setSingleStep() +*/ +double QtDoublePropertyManager::singleStep(const QtProperty *property) const +{ + return getData(d_ptr->m_values, &QtDoublePropertyManagerPrivate::Data::singleStep, property, 0); +} + +/*! + Returns the given \a property's precision, in decimals. + + \sa setDecimals() +*/ +int QtDoublePropertyManager::decimals(const QtProperty *property) const +{ + return getData(d_ptr->m_values, &QtDoublePropertyManagerPrivate::Data::decimals, property, 0); +} + +/*! + \reimp +*/ +QString QtDoublePropertyManager::valueText(const QtProperty *property) const +{ + const QtDoublePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + + return QString("%1").arg(it.value().val); +} + +/*! + \fn void QtDoublePropertyManager::setValue(QtProperty *property, double value) + + Sets the value of the given \a property to \a value. + + If the specified \a value is not valid according to the given + \a property's range, the \a value is adjusted to the nearest valid value + within the range. + + \sa value(), setRange(), valueChanged() +*/ +void QtDoublePropertyManager::setValue(QtProperty *property, double val) +{ + void (QtDoublePropertyManagerPrivate::*setSubPropertyValue)(QtProperty *, double) = 0; + setValueInRange(this, d_ptr, + &QtDoublePropertyManager::propertyChanged, + &QtDoublePropertyManager::valueChanged, + property, val, setSubPropertyValue); +} + +/*! + Sets the step value for the given \a property to \a step. + + The step is typically used to increment or decrement a property value while pressing an arrow key. + + \sa singleStep() +*/ +void QtDoublePropertyManager::setSingleStep(QtProperty *property, double step) +{ + const QtDoublePropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + QtDoublePropertyManagerPrivate::Data data = it.value(); + + if (step < 0) + step = 0; + + if (data.singleStep == step) + return; + + data.singleStep = step; + + it.value() = data; + + emit singleStepChanged(property, data.singleStep); +} + +/*! + \fn void QtDoublePropertyManager::setDecimals(QtProperty *property, int prec) + + Sets the precision of the given \a property to \a prec. + + The valid decimal range is 0-13. The default is 2. + + \sa decimals() +*/ +void QtDoublePropertyManager::setDecimals(QtProperty *property, int prec) +{ + const QtDoublePropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + QtDoublePropertyManagerPrivate::Data data = it.value(); + + if (prec > 13) + prec = 13; + else if (prec < 0) + prec = 0; + + if (data.decimals == prec) + return; + + data.decimals = prec; + + it.value() = data; + + emit decimalsChanged(property, data.decimals); +} + +/*! + Sets the minimum value for the given \a property to \a minVal. + + When setting the minimum value, the maximum and current values are + adjusted if necessary (ensuring that the range remains valid and + that the current value is within in the range). + + \sa minimum(), setRange(), rangeChanged() +*/ +void QtDoublePropertyManager::setMinimum(QtProperty *property, double minVal) +{ + setMinimumValue(this, d_ptr, + &QtDoublePropertyManager::propertyChanged, + &QtDoublePropertyManager::valueChanged, + &QtDoublePropertyManager::rangeChanged, + property, minVal); +} + +/*! + Sets the maximum value for the given \a property to \a maxVal. + + When setting the maximum value, the minimum and current values are + adjusted if necessary (ensuring that the range remains valid and + that the current value is within in the range). + + \sa maximum(), setRange(), rangeChanged() +*/ +void QtDoublePropertyManager::setMaximum(QtProperty *property, double maxVal) +{ + setMaximumValue(this, d_ptr, + &QtDoublePropertyManager::propertyChanged, + &QtDoublePropertyManager::valueChanged, + &QtDoublePropertyManager::rangeChanged, + property, maxVal); +} + +/*! + \fn void QtDoublePropertyManager::setRange(QtProperty *property, double minimum, double maximum) + + Sets the range of valid values. + + This is a convenience function defining the range of valid values + in one go; setting the \a minimum and \a maximum values for the + given \a property with a single function call. + + When setting a new range, the current value is adjusted if + necessary (ensuring that the value remains within range). + + \sa setMinimum(), setMaximum(), rangeChanged() +*/ +void QtDoublePropertyManager::setRange(QtProperty *property, double minVal, double maxVal) +{ + void (QtDoublePropertyManagerPrivate::*setSubPropertyRange)(QtProperty *, double, double, double) = 0; + setBorderValues(this, d_ptr, + &QtDoublePropertyManager::propertyChanged, + &QtDoublePropertyManager::valueChanged, + &QtDoublePropertyManager::rangeChanged, + property, minVal, maxVal, setSubPropertyRange); +} + +/*! + \reimp +*/ +void QtDoublePropertyManager::initializeProperty(QtProperty *property) +{ + d_ptr->m_values[property] = QtDoublePropertyManagerPrivate::Data(); +} + +/*! + \reimp +*/ +void QtDoublePropertyManager::uninitializeProperty(QtProperty *property) +{ + d_ptr->m_values.remove(property); +} + +// QtStringPropertyManager + +class QtStringPropertyManagerPrivate +{ + QtStringPropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtStringPropertyManager) +public: + + struct Data + { + Data() : regExp(QString(QLatin1Char('*')), Qt::CaseSensitive, QRegExp::Wildcard) + { + } + QString val; + QRegExp regExp; + }; + + typedef QMap PropertyValueMap; + QMap m_values; +}; + +/*! + \class QtStringPropertyManager + + \brief The QtStringPropertyManager provides and manages QString properties. + + A string property's value can be retrieved using the value() + function, and set using the setValue() slot. + + The current value can be checked against a regular expression. To + set the regular expression use the setRegExp() slot, use the + regExp() function to retrieve the currently set expression. + + In addition, QtStringPropertyManager provides the valueChanged() signal + which is emitted whenever a property created by this manager + changes, and the regExpChanged() signal which is emitted whenever + such a property changes its currently set regular expression. + + \sa QtAbstractPropertyManager, QtLineEditFactory +*/ + +/*! + \fn void QtStringPropertyManager::valueChanged(QtProperty *property, const QString &value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the + new \a value as parameters. + + \sa setValue() +*/ + +/*! + \fn void QtStringPropertyManager::regExpChanged(QtProperty *property, const QRegExp ®Exp) + + This signal is emitted whenever a property created by this manager + changes its currenlty set regular expression, passing a pointer to + the \a property and the new \a regExp as parameters. + + \sa setRegExp() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtStringPropertyManager::QtStringPropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtStringPropertyManagerPrivate; + d_ptr->q_ptr = this; +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtStringPropertyManager::~QtStringPropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the given \a property's value. + + If the given property is not managed by this manager, this + function returns an empty string. + + \sa setValue() +*/ +QString QtStringPropertyManager::value(const QtProperty *property) const +{ + return getValue(d_ptr->m_values, property); +} + +/*! + Returns the given \a property's currently set regular expression. + + If the given \a property is not managed by this manager, this + function returns an empty expression. + + \sa setRegExp() +*/ +QRegExp QtStringPropertyManager::regExp(const QtProperty *property) const +{ + return getData(d_ptr->m_values, &QtStringPropertyManagerPrivate::Data::regExp, property, QRegExp()); +} + +/*! + \reimp +*/ +QString QtStringPropertyManager::valueText(const QtProperty *property) const +{ + const QtStringPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + return it.value().val; +} + +/*! + \fn void QtStringPropertyManager::setValue(QtProperty *property, const QString &value) + + Sets the value of the given \a property to \a value. + + If the specified \a value doesn't match the given \a property's + regular expression, this function does nothing. + + \sa value(), setRegExp(), valueChanged() +*/ +void QtStringPropertyManager::setValue(QtProperty *property, const QString &val) +{ + const QtStringPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + QtStringPropertyManagerPrivate::Data data = it.value(); + + if (data.val == val) + return; + + if (data.regExp.isValid() && !data.regExp.exactMatch(val)) + return; + + data.val = val; + + it.value() = data; + + emit propertyChanged(property); + emit valueChanged(property, data.val); +} + +/*! + Sets the regular expression of the given \a property to \a regExp. + + \sa regExp(), setValue(), regExpChanged() +*/ +void QtStringPropertyManager::setRegExp(QtProperty *property, const QRegExp ®Exp) +{ + const QtStringPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + QtStringPropertyManagerPrivate::Data data = it.value() ; + + if (data.regExp == regExp) + return; + + data.regExp = regExp; + + it.value() = data; + + emit regExpChanged(property, data.regExp); +} + +/*! + \reimp +*/ +void QtStringPropertyManager::initializeProperty(QtProperty *property) +{ + d_ptr->m_values[property] = QtStringPropertyManagerPrivate::Data(); +} + +/*! + \reimp +*/ +void QtStringPropertyManager::uninitializeProperty(QtProperty *property) +{ + d_ptr->m_values.remove(property); +} + +// QtBoolPropertyManager + +class QtBoolPropertyManagerPrivate +{ + QtBoolPropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtBoolPropertyManager) +public: + + QMap m_values; +}; + +/*! + \class QtBoolPropertyManager + + \brief The QtBoolPropertyManager class provides and manages boolean properties. + + The property's value can be retrieved using the value() function, + and set using the setValue() slot. + + In addition, QtBoolPropertyManager provides the valueChanged() signal + which is emitted whenever a property created by this manager + changes. + + \sa QtAbstractPropertyManager, QtCheckBoxFactory +*/ + +/*! + \fn void QtBoolPropertyManager::valueChanged(QtProperty *property, bool value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the + new \a value as parameters. +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtBoolPropertyManager::QtBoolPropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtBoolPropertyManagerPrivate; + d_ptr->q_ptr = this; +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtBoolPropertyManager::~QtBoolPropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the given \a property's value. + + If the given \a property is not managed by \e this manager, this + function returns false. + + \sa setValue() +*/ +bool QtBoolPropertyManager::value(const QtProperty *property) const +{ + return d_ptr->m_values.value(property, false); +} + +/*! + \reimp +*/ +QString QtBoolPropertyManager::valueText(const QtProperty *property) const +{ + return QString(); +} + +// Return an icon containing a check box indicator +static QIcon drawCheckBox(bool value) +{ + QStyleOptionButton opt; + opt.state |= value ? QStyle::State_On : QStyle::State_Off; + opt.state |= QStyle::State_Enabled; + const QStyle *style = QApplication::style(); + // Figure out size of an indicator and make sure it is not scaled down in a list view item + // by making the pixmap as big as a list view icon and centering the indicator in it. + // (if it is smaller, it can't be helped) + const int indicatorWidth = style->pixelMetric(QStyle::PM_IndicatorWidth, &opt); + const int indicatorHeight = style->pixelMetric(QStyle::PM_IndicatorHeight, &opt); + const int listViewIconSize = indicatorWidth; + const int pixmapWidth = indicatorWidth; + const int pixmapHeight = qMax(indicatorHeight, listViewIconSize); + + opt.rect = QRect(0, 0, indicatorWidth, indicatorHeight); + QPixmap pixmap = QPixmap(pixmapWidth, pixmapHeight); + pixmap.fill(Qt::transparent); + { + // Center? + const int xoff = (pixmapWidth > indicatorWidth) ? (pixmapWidth - indicatorWidth) / 2 : 0; + const int yoff = (pixmapHeight > indicatorHeight) ? (pixmapHeight - indicatorHeight) / 2 : 0; + QPainter painter(&pixmap); + painter.translate(xoff, yoff); + style->drawPrimitive(QStyle::PE_IndicatorCheckBox, &opt, &painter); + } + return QIcon(pixmap); +} + +/*! + \reimp +*/ +QIcon QtBoolPropertyManager::valueIcon(const QtProperty *property) const +{ + const QMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QIcon(); + + static const QIcon checkedIcon = drawCheckBox(true); + static const QIcon uncheckedIcon = drawCheckBox(false); + return it.value() ? checkedIcon : uncheckedIcon; +} + +/*! + \fn void QtBoolPropertyManager::setValue(QtProperty *property, bool value) + + Sets the value of the given \a property to \a value. + + \sa value() +*/ +void QtBoolPropertyManager::setValue(QtProperty *property, bool val) +{ + setSimpleValue(d_ptr->m_values, this, + &QtBoolPropertyManager::propertyChanged, + &QtBoolPropertyManager::valueChanged, + property, val); +} + +/*! + \reimp +*/ +void QtBoolPropertyManager::initializeProperty(QtProperty *property) +{ + d_ptr->m_values[property] = false; +} + +/*! + \reimp +*/ +void QtBoolPropertyManager::uninitializeProperty(QtProperty *property) +{ + d_ptr->m_values.remove(property); +} + +// QtDatePropertyManager + +class QtDatePropertyManagerPrivate +{ + QtDatePropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtDatePropertyManager) +public: + + struct Data + { + Data() : val(QDate::currentDate()), minVal(QDate(1752, 9, 14)), + maxVal(QDate(7999, 12, 31)) {} + QDate val; + QDate minVal; + QDate maxVal; + QDate minimumValue() const { return minVal; } + QDate maximumValue() const { return maxVal; } + void setMinimumValue(const QDate &newMinVal) { setSimpleMinimumData(this, newMinVal); } + void setMaximumValue(const QDate &newMaxVal) { setSimpleMaximumData(this, newMaxVal); } + }; + + QString m_format; + + typedef QMap PropertyValueMap; + QMap m_values; +}; + +/*! + \class QtDatePropertyManager + + \brief The QtDatePropertyManager provides and manages QDate properties. + + A date property has a current value, and a range specifying the + valid dates. The range is defined by a minimum and a maximum + value. + + The property's values can be retrieved using the minimum(), + maximum() and value() functions, and can be set using the + setMinimum(), setMaximum() and setValue() slots. Alternatively, + the range can be defined in one go using the setRange() slot. + + In addition, QtDatePropertyManager provides the valueChanged() signal + which is emitted whenever a property created by this manager + changes, and the rangeChanged() signal which is emitted whenever + such a property changes its range of valid dates. + + \sa QtAbstractPropertyManager, QtDateEditFactory, QtDateTimePropertyManager +*/ + +/*! + \fn void QtDatePropertyManager::valueChanged(QtProperty *property, const QDate &value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the new + \a value as parameters. + + \sa setValue() +*/ + +/*! + \fn void QtDatePropertyManager::rangeChanged(QtProperty *property, const QDate &minimum, const QDate &maximum) + + This signal is emitted whenever a property created by this manager + changes its range of valid dates, passing a pointer to the \a + property and the new \a minimum and \a maximum dates. + + \sa setRange() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtDatePropertyManager::QtDatePropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtDatePropertyManagerPrivate; + d_ptr->q_ptr = this; + + QLocale loc; + d_ptr->m_format = loc.dateFormat(QLocale::ShortFormat); +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtDatePropertyManager::~QtDatePropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the given \a property's value. + + If the given \a property is not managed by \e this manager, this + function returns an invalid date. + + \sa setValue() +*/ +QDate QtDatePropertyManager::value(const QtProperty *property) const +{ + return getValue(d_ptr->m_values, property); +} + +/*! + Returns the given \a property's minimum date. + + \sa maximum(), setRange() +*/ +QDate QtDatePropertyManager::minimum(const QtProperty *property) const +{ + return getMinimum(d_ptr->m_values, property); +} + +/*! + Returns the given \a property's maximum date. + + \sa minimum(), setRange() +*/ +QDate QtDatePropertyManager::maximum(const QtProperty *property) const +{ + return getMaximum(d_ptr->m_values, property); +} + +/*! + \reimp +*/ +QString QtDatePropertyManager::valueText(const QtProperty *property) const +{ + const QtDatePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + return it.value().val.toString(d_ptr->m_format); +} + +/*! + \fn void QtDatePropertyManager::setValue(QtProperty *property, const QDate &value) + + Sets the value of the given \a property to \a value. + + If the specified \a value is not a valid date according to the + given \a property's range, the value is adjusted to the nearest + valid value within the range. + + \sa value(), setRange(), valueChanged() +*/ +void QtDatePropertyManager::setValue(QtProperty *property, const QDate &val) +{ + void (QtDatePropertyManagerPrivate::*setSubPropertyValue)(QtProperty *, const QDate &) = 0; + setValueInRange(this, d_ptr, + &QtDatePropertyManager::propertyChanged, + &QtDatePropertyManager::valueChanged, + property, val, setSubPropertyValue); +} + +/*! + Sets the minimum value for the given \a property to \a minVal. + + When setting the minimum value, the maximum and current values are + adjusted if necessary (ensuring that the range remains valid and + that the current value is within in the range). + + \sa minimum(), setRange() +*/ +void QtDatePropertyManager::setMinimum(QtProperty *property, const QDate &minVal) +{ + setMinimumValue(this, d_ptr, + &QtDatePropertyManager::propertyChanged, + &QtDatePropertyManager::valueChanged, + &QtDatePropertyManager::rangeChanged, + property, minVal); +} + +/*! + Sets the maximum value for the given \a property to \a maxVal. + + When setting the maximum value, the minimum and current + values are adjusted if necessary (ensuring that the range remains + valid and that the current value is within in the range). + + \sa maximum(), setRange() +*/ +void QtDatePropertyManager::setMaximum(QtProperty *property, const QDate &maxVal) +{ + setMaximumValue(this, d_ptr, + &QtDatePropertyManager::propertyChanged, + &QtDatePropertyManager::valueChanged, + &QtDatePropertyManager::rangeChanged, + property, maxVal); +} + +/*! + \fn void QtDatePropertyManager::setRange(QtProperty *property, const QDate &minimum, const QDate &maximum) + + Sets the range of valid dates. + + This is a convenience function defining the range of valid dates + in one go; setting the \a minimum and \a maximum values for the + given \a property with a single function call. + + When setting a new date range, the current value is adjusted if + necessary (ensuring that the value remains in date range). + + \sa setMinimum(), setMaximum(), rangeChanged() +*/ +void QtDatePropertyManager::setRange(QtProperty *property, const QDate &minVal, const QDate &maxVal) +{ + void (QtDatePropertyManagerPrivate::*setSubPropertyRange)(QtProperty *, const QDate &, + const QDate &, const QDate &) = 0; + setBorderValues(this, d_ptr, + &QtDatePropertyManager::propertyChanged, + &QtDatePropertyManager::valueChanged, + &QtDatePropertyManager::rangeChanged, + property, minVal, maxVal, setSubPropertyRange); +} + +/*! + \reimp +*/ +void QtDatePropertyManager::initializeProperty(QtProperty *property) +{ + d_ptr->m_values[property] = QtDatePropertyManagerPrivate::Data(); +} + +/*! + \reimp +*/ +void QtDatePropertyManager::uninitializeProperty(QtProperty *property) +{ + d_ptr->m_values.remove(property); +} + +// QtTimePropertyManager + +class QtTimePropertyManagerPrivate +{ + QtTimePropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtTimePropertyManager) +public: + + QString m_format; + + typedef QMap PropertyValueMap; + PropertyValueMap m_values; +}; + +/*! + \class QtTimePropertyManager + + \brief The QtTimePropertyManager provides and manages QTime properties. + + A time property's value can be retrieved using the value() + function, and set using the setValue() slot. + + In addition, QtTimePropertyManager provides the valueChanged() signal + which is emitted whenever a property created by this manager + changes. + + \sa QtAbstractPropertyManager, QtTimeEditFactory +*/ + +/*! + \fn void QtTimePropertyManager::valueChanged(QtProperty *property, const QTime &value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the + new \a value as parameters. + + \sa setValue() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtTimePropertyManager::QtTimePropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtTimePropertyManagerPrivate; + d_ptr->q_ptr = this; + + QLocale loc; + d_ptr->m_format = loc.timeFormat(QLocale::ShortFormat); +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtTimePropertyManager::~QtTimePropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the given \a property's value. + + If the given property is not managed by this manager, this + function returns an invalid time object. + + \sa setValue() +*/ +QTime QtTimePropertyManager::value(const QtProperty *property) const +{ + return d_ptr->m_values.value(property, QTime()); +} + +/*! + \reimp +*/ +QString QtTimePropertyManager::valueText(const QtProperty *property) const +{ + const QtTimePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + return it.value().toString(d_ptr->m_format); +} + +/*! + \fn void QtTimePropertyManager::setValue(QtProperty *property, const QTime &value) + + Sets the value of the given \a property to \a value. + + \sa value(), valueChanged() +*/ +void QtTimePropertyManager::setValue(QtProperty *property, const QTime &val) +{ + setSimpleValue(d_ptr->m_values, this, + &QtTimePropertyManager::propertyChanged, + &QtTimePropertyManager::valueChanged, + property, val); +} + +/*! + \reimp +*/ +void QtTimePropertyManager::initializeProperty(QtProperty *property) +{ + d_ptr->m_values[property] = QTime::currentTime(); +} + +/*! + \reimp +*/ +void QtTimePropertyManager::uninitializeProperty(QtProperty *property) +{ + d_ptr->m_values.remove(property); +} + +// QtDateTimePropertyManager + +class QtDateTimePropertyManagerPrivate +{ + QtDateTimePropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtDateTimePropertyManager) +public: + + QString m_format; + + typedef QMap PropertyValueMap; + PropertyValueMap m_values; +}; + +/*! \class QtDateTimePropertyManager + + \brief The QtDateTimePropertyManager provides and manages QDateTime properties. + + A date and time property has a current value which can be + retrieved using the value() function, and set using the setValue() + slot. In addition, QtDateTimePropertyManager provides the + valueChanged() signal which is emitted whenever a property created + by this manager changes. + + \sa QtAbstractPropertyManager, QtDateTimeEditFactory, QtDatePropertyManager +*/ + +/*! + \fn void QtDateTimePropertyManager::valueChanged(QtProperty *property, const QDateTime &value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the new + \a value as parameters. +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtDateTimePropertyManager::QtDateTimePropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtDateTimePropertyManagerPrivate; + d_ptr->q_ptr = this; + + QLocale loc; + d_ptr->m_format = loc.dateFormat(QLocale::ShortFormat); + d_ptr->m_format += QLatin1Char(' '); + d_ptr->m_format += loc.timeFormat(QLocale::ShortFormat); +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtDateTimePropertyManager::~QtDateTimePropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the given \a property's value. + + If the given \a property is not managed by this manager, this + function returns an invalid QDateTime object. + + \sa setValue() +*/ +QDateTime QtDateTimePropertyManager::value(const QtProperty *property) const +{ + return d_ptr->m_values.value(property, QDateTime()); +} + +/*! + \reimp +*/ +QString QtDateTimePropertyManager::valueText(const QtProperty *property) const +{ + const QtDateTimePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + return it.value().toString(d_ptr->m_format); +} + +/*! + \fn void QtDateTimePropertyManager::setValue(QtProperty *property, const QDateTime &value) + + Sets the value of the given \a property to \a value. + + \sa value(), valueChanged() +*/ +void QtDateTimePropertyManager::setValue(QtProperty *property, const QDateTime &val) +{ + setSimpleValue(d_ptr->m_values, this, + &QtDateTimePropertyManager::propertyChanged, + &QtDateTimePropertyManager::valueChanged, + property, val); +} + +/*! + \reimp +*/ +void QtDateTimePropertyManager::initializeProperty(QtProperty *property) +{ + d_ptr->m_values[property] = QDateTime::currentDateTime(); +} + +/*! + \reimp +*/ +void QtDateTimePropertyManager::uninitializeProperty(QtProperty *property) +{ + d_ptr->m_values.remove(property); +} + +// QtKeySequencePropertyManager + +class QtKeySequencePropertyManagerPrivate +{ + QtKeySequencePropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtKeySequencePropertyManager) +public: + + QString m_format; + + typedef QMap PropertyValueMap; + PropertyValueMap m_values; +}; + +/*! \class QtKeySequencePropertyManager + + \brief The QtKeySequencePropertyManager provides and manages QKeySequence properties. + + A key sequence's value can be retrieved using the value() + function, and set using the setValue() slot. + + In addition, QtKeySequencePropertyManager provides the valueChanged() signal + which is emitted whenever a property created by this manager + changes. + + \sa QtAbstractPropertyManager +*/ + +/*! + \fn void QtKeySequencePropertyManager::valueChanged(QtProperty *property, const QKeySequence &value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the new + \a value as parameters. +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtKeySequencePropertyManager::QtKeySequencePropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtKeySequencePropertyManagerPrivate; + d_ptr->q_ptr = this; +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtKeySequencePropertyManager::~QtKeySequencePropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the given \a property's value. + + If the given \a property is not managed by this manager, this + function returns an empty QKeySequence object. + + \sa setValue() +*/ +QKeySequence QtKeySequencePropertyManager::value(const QtProperty *property) const +{ + return d_ptr->m_values.value(property, QKeySequence()); +} + +/*! + \reimp +*/ +QString QtKeySequencePropertyManager::valueText(const QtProperty *property) const +{ + const QtKeySequencePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + return it.value().toString(QKeySequence::NativeText); +} + +/*! + \fn void QtKeySequencePropertyManager::setValue(QtProperty *property, const QKeySequence &value) + + Sets the value of the given \a property to \a value. + + \sa value(), valueChanged() +*/ +void QtKeySequencePropertyManager::setValue(QtProperty *property, const QKeySequence &val) +{ + setSimpleValue(d_ptr->m_values, this, + &QtKeySequencePropertyManager::propertyChanged, + &QtKeySequencePropertyManager::valueChanged, + property, val); +} + +/*! + \reimp +*/ +void QtKeySequencePropertyManager::initializeProperty(QtProperty *property) +{ + d_ptr->m_values[property] = QKeySequence(); +} + +/*! + \reimp +*/ +void QtKeySequencePropertyManager::uninitializeProperty(QtProperty *property) +{ + d_ptr->m_values.remove(property); +} + +// QtCharPropertyManager + +class QtCharPropertyManagerPrivate +{ + QtCharPropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtCharPropertyManager) +public: + + typedef QMap PropertyValueMap; + PropertyValueMap m_values; +}; + +/*! \class QtCharPropertyManager + + \brief The QtCharPropertyManager provides and manages QChar properties. + + A char's value can be retrieved using the value() + function, and set using the setValue() slot. + + In addition, QtCharPropertyManager provides the valueChanged() signal + which is emitted whenever a property created by this manager + changes. + + \sa QtAbstractPropertyManager +*/ + +/*! + \fn void QtCharPropertyManager::valueChanged(QtProperty *property, const QChar &value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the new + \a value as parameters. +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtCharPropertyManager::QtCharPropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtCharPropertyManagerPrivate; + d_ptr->q_ptr = this; +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtCharPropertyManager::~QtCharPropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the given \a property's value. + + If the given \a property is not managed by this manager, this + function returns an null QChar object. + + \sa setValue() +*/ +QChar QtCharPropertyManager::value(const QtProperty *property) const +{ + return d_ptr->m_values.value(property, QChar()); +} + +/*! + \reimp +*/ +QString QtCharPropertyManager::valueText(const QtProperty *property) const +{ + const QtCharPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + const QChar c = it.value(); + return c.isNull() ? QString() : QString(c); +} + +/*! + \fn void QtCharPropertyManager::setValue(QtProperty *property, const QChar &value) + + Sets the value of the given \a property to \a value. + + \sa value(), valueChanged() +*/ +void QtCharPropertyManager::setValue(QtProperty *property, const QChar &val) +{ + setSimpleValue(d_ptr->m_values, this, + &QtCharPropertyManager::propertyChanged, + &QtCharPropertyManager::valueChanged, + property, val); +} + +/*! + \reimp +*/ +void QtCharPropertyManager::initializeProperty(QtProperty *property) +{ + d_ptr->m_values[property] = QChar(); +} + +/*! + \reimp +*/ +void QtCharPropertyManager::uninitializeProperty(QtProperty *property) +{ + d_ptr->m_values.remove(property); +} + +// QtLocalePropertyManager + +class QtLocalePropertyManagerPrivate +{ + QtLocalePropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtLocalePropertyManager) +public: + + QtLocalePropertyManagerPrivate(); + + void slotEnumChanged(QtProperty *property, int value); + void slotPropertyDestroyed(QtProperty *property); + + typedef QMap PropertyValueMap; + PropertyValueMap m_values; + + QtEnumPropertyManager *m_enumPropertyManager; + + QMap m_propertyToLanguage; + QMap m_propertyToCountry; + + QMap m_languageToProperty; + QMap m_countryToProperty; +}; + +QtLocalePropertyManagerPrivate::QtLocalePropertyManagerPrivate() +{ +} + +void QtLocalePropertyManagerPrivate::slotEnumChanged(QtProperty *property, int value) +{ + if (QtProperty *prop = m_languageToProperty.value(property, 0)) { + const QLocale loc = m_values[prop]; + QLocale::Language newLanguage = loc.language(); + QLocale::Country newCountry = loc.country(); + metaEnumProvider()->indexToLocale(value, 0, &newLanguage, 0); + QLocale newLoc(newLanguage, newCountry); + q_ptr->setValue(prop, newLoc); + } else if (QtProperty *prop = m_countryToProperty.value(property, 0)) { + const QLocale loc = m_values[prop]; + QLocale::Language newLanguage = loc.language(); + QLocale::Country newCountry = loc.country(); + metaEnumProvider()->indexToLocale(m_enumPropertyManager->value(m_propertyToLanguage.value(prop)), value, &newLanguage, &newCountry); + QLocale newLoc(newLanguage, newCountry); + q_ptr->setValue(prop, newLoc); + } +} + +void QtLocalePropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property) +{ + if (QtProperty *subProp = m_languageToProperty.value(property, 0)) { + m_propertyToLanguage[subProp] = 0; + m_languageToProperty.remove(property); + } else if (QtProperty *subProp = m_countryToProperty.value(property, 0)) { + m_propertyToCountry[subProp] = 0; + m_countryToProperty.remove(property); + } +} + +/*! + \class QtLocalePropertyManager + + \brief The QtLocalePropertyManager provides and manages QLocale properties. + + A locale property has nested \e language and \e country + subproperties. The top-level property's value can be retrieved + using the value() function, and set using the setValue() slot. + + The subproperties are created by QtEnumPropertyManager object. + These submanager can be retrieved using the subEnumPropertyManager() + function. In order to provide editing widgets for the subproperties + in a property browser widget, this manager must be associated with editor factory. + + In addition, QtLocalePropertyManager provides the valueChanged() + signal which is emitted whenever a property created by this + manager changes. + + \sa QtAbstractPropertyManager, QtEnumPropertyManager +*/ + +/*! + \fn void QtLocalePropertyManager::valueChanged(QtProperty *property, const QLocale &value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the + new \a value as parameters. + + \sa setValue() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtLocalePropertyManager::QtLocalePropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtLocalePropertyManagerPrivate; + d_ptr->q_ptr = this; + + d_ptr->m_enumPropertyManager = new QtEnumPropertyManager(this); + connect(d_ptr->m_enumPropertyManager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotEnumChanged(QtProperty *, int))); + + connect(d_ptr->m_enumPropertyManager, SIGNAL(propertyDestroyed(QtProperty *)), + this, SLOT(slotPropertyDestroyed(QtProperty *))); +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtLocalePropertyManager::~QtLocalePropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the manager that creates the nested \e language + and \e country subproperties. + + In order to provide editing widgets for the mentioned subproperties + in a property browser widget, this manager must be associated with + an editor factory. + + \sa QtAbstractPropertyBrowser::setFactoryForManager() +*/ +QtEnumPropertyManager *QtLocalePropertyManager::subEnumPropertyManager() const +{ + return d_ptr->m_enumPropertyManager; +} + +/*! + Returns the given \a property's value. + + If the given property is not managed by this manager, this + function returns the default locale. + + \sa setValue() +*/ +QLocale QtLocalePropertyManager::value(const QtProperty *property) const +{ + return d_ptr->m_values.value(property, QLocale()); +} + +/*! + \reimp +*/ +QString QtLocalePropertyManager::valueText(const QtProperty *property) const +{ + const QtLocalePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + + QLocale loc = it.value(); + + int langIdx = 0; + int countryIdx = 0; + metaEnumProvider()->localeToIndex(loc.language(), loc.country(), &langIdx, &countryIdx); + QString str = tr("%1, %2") + .arg(metaEnumProvider()->languageEnumNames().at(langIdx)) + .arg(metaEnumProvider()->countryEnumNames(loc.language()).at(countryIdx)); + return str; +} + +/*! + \fn void QtLocalePropertyManager::setValue(QtProperty *property, const QLocale &value) + + Sets the value of the given \a property to \a value. Nested + properties are updated automatically. + + \sa value(), valueChanged() +*/ +void QtLocalePropertyManager::setValue(QtProperty *property, const QLocale &val) +{ + const QtLocalePropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + const QLocale loc = it.value(); + if (loc == val) + return; + + it.value() = val; + + int langIdx = 0; + int countryIdx = 0; + metaEnumProvider()->localeToIndex(val.language(), val.country(), &langIdx, &countryIdx); + if (loc.language() != val.language()) { + d_ptr->m_enumPropertyManager->setValue(d_ptr->m_propertyToLanguage.value(property), langIdx); + d_ptr->m_enumPropertyManager->setEnumNames(d_ptr->m_propertyToCountry.value(property), + metaEnumProvider()->countryEnumNames(val.language())); + } + d_ptr->m_enumPropertyManager->setValue(d_ptr->m_propertyToCountry.value(property), countryIdx); + + emit propertyChanged(property); + emit valueChanged(property, val); +} + +/*! + \reimp +*/ +void QtLocalePropertyManager::initializeProperty(QtProperty *property) +{ + QLocale val; + d_ptr->m_values[property] = val; + + int langIdx = 0; + int countryIdx = 0; + metaEnumProvider()->localeToIndex(val.language(), val.country(), &langIdx, &countryIdx); + + QtProperty *languageProp = d_ptr->m_enumPropertyManager->addProperty(); + languageProp->setPropertyName(tr("Language")); + d_ptr->m_enumPropertyManager->setEnumNames(languageProp, metaEnumProvider()->languageEnumNames()); + d_ptr->m_enumPropertyManager->setValue(languageProp, langIdx); + d_ptr->m_propertyToLanguage[property] = languageProp; + d_ptr->m_languageToProperty[languageProp] = property; + property->addSubProperty(languageProp); + + QtProperty *countryProp = d_ptr->m_enumPropertyManager->addProperty(); + countryProp->setPropertyName(tr("Country")); + d_ptr->m_enumPropertyManager->setEnumNames(countryProp, metaEnumProvider()->countryEnumNames(val.language())); + d_ptr->m_enumPropertyManager->setValue(countryProp, countryIdx); + d_ptr->m_propertyToCountry[property] = countryProp; + d_ptr->m_countryToProperty[countryProp] = property; + property->addSubProperty(countryProp); +} + +/*! + \reimp +*/ +void QtLocalePropertyManager::uninitializeProperty(QtProperty *property) +{ + QtProperty *languageProp = d_ptr->m_propertyToLanguage[property]; + if (languageProp) { + d_ptr->m_languageToProperty.remove(languageProp); + delete languageProp; + } + d_ptr->m_propertyToLanguage.remove(property); + + QtProperty *countryProp = d_ptr->m_propertyToCountry[property]; + if (countryProp) { + d_ptr->m_countryToProperty.remove(countryProp); + delete countryProp; + } + d_ptr->m_propertyToCountry.remove(property); + + d_ptr->m_values.remove(property); +} + +// QtPointPropertyManager + +class QtPointPropertyManagerPrivate +{ + QtPointPropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtPointPropertyManager) +public: + + void slotIntChanged(QtProperty *property, int value); + void slotPropertyDestroyed(QtProperty *property); + + typedef QMap PropertyValueMap; + PropertyValueMap m_values; + + QtIntPropertyManager *m_intPropertyManager; + + QMap m_propertyToX; + QMap m_propertyToY; + + QMap m_xToProperty; + QMap m_yToProperty; +}; + +void QtPointPropertyManagerPrivate::slotIntChanged(QtProperty *property, int value) +{ + if (QtProperty *xprop = m_xToProperty.value(property, 0)) { + QPoint p = m_values[xprop]; + p.setX(value); + q_ptr->setValue(xprop, p); + } else if (QtProperty *yprop = m_yToProperty.value(property, 0)) { + QPoint p = m_values[yprop]; + p.setY(value); + q_ptr->setValue(yprop, p); + } +} + +void QtPointPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property) +{ + if (QtProperty *pointProp = m_xToProperty.value(property, 0)) { + m_propertyToX[pointProp] = 0; + m_xToProperty.remove(property); + } else if (QtProperty *pointProp = m_yToProperty.value(property, 0)) { + m_propertyToY[pointProp] = 0; + m_yToProperty.remove(property); + } +} + +/*! \class QtPointPropertyManager + + \brief The QtPointPropertyManager provides and manages QPoint properties. + + A point property has nested \e x and \e y subproperties. The + top-level property's value can be retrieved using the value() + function, and set using the setValue() slot. + + The subproperties are created by a QtIntPropertyManager object. This + manager can be retrieved using the subIntPropertyManager() function. In + order to provide editing widgets for the subproperties in a + property browser widget, this manager must be associated with an + editor factory. + + In addition, QtPointPropertyManager provides the valueChanged() signal which + is emitted whenever a property created by this manager changes. + + \sa QtAbstractPropertyManager, QtIntPropertyManager, QtPointFPropertyManager +*/ + +/*! + \fn void QtPointPropertyManager::valueChanged(QtProperty *property, const QPoint &value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the + new \a value as parameters. + + \sa setValue() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtPointPropertyManager::QtPointPropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtPointPropertyManagerPrivate; + d_ptr->q_ptr = this; + + d_ptr->m_intPropertyManager = new QtIntPropertyManager(this); + connect(d_ptr->m_intPropertyManager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotIntChanged(QtProperty *, int))); + connect(d_ptr->m_intPropertyManager, SIGNAL(propertyDestroyed(QtProperty *)), + this, SLOT(slotPropertyDestroyed(QtProperty *))); +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtPointPropertyManager::~QtPointPropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the manager that creates the nested \e x and \e y + subproperties. + + In order to provide editing widgets for the subproperties in a + property browser widget, this manager must be associated with an + editor factory. + + \sa QtAbstractPropertyBrowser::setFactoryForManager() +*/ +QtIntPropertyManager *QtPointPropertyManager::subIntPropertyManager() const +{ + return d_ptr->m_intPropertyManager; +} + +/*! + Returns the given \a property's value. + + If the given \a property is not managed by this manager, this + function returns a point with coordinates (0, 0). + + \sa setValue() +*/ +QPoint QtPointPropertyManager::value(const QtProperty *property) const +{ + return d_ptr->m_values.value(property, QPoint()); +} + +/*! + \reimp +*/ +QString QtPointPropertyManager::valueText(const QtProperty *property) const +{ + const QtPointPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + const QPoint v = it.value(); + return QString(tr("(%1, %2)").arg(QString::number(v.x())) + .arg(QString::number(v.y()))); +} + +/*! + \fn void QtPointPropertyManager::setValue(QtProperty *property, const QPoint &value) + + Sets the value of the given \a property to \a value. Nested + properties are updated automatically. + + \sa value(), valueChanged() +*/ +void QtPointPropertyManager::setValue(QtProperty *property, const QPoint &val) +{ + const QtPointPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + if (it.value() == val) + return; + + it.value() = val; + d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToX[property], val.x()); + d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToY[property], val.y()); + + emit propertyChanged(property); + emit valueChanged(property, val); +} + +/*! + \reimp +*/ +void QtPointPropertyManager::initializeProperty(QtProperty *property) +{ + d_ptr->m_values[property] = QPoint(0, 0); + + QtProperty *xProp = d_ptr->m_intPropertyManager->addProperty(); + xProp->setPropertyName(tr("X")); + d_ptr->m_intPropertyManager->setValue(xProp, 0); + d_ptr->m_propertyToX[property] = xProp; + d_ptr->m_xToProperty[xProp] = property; + property->addSubProperty(xProp); + + QtProperty *yProp = d_ptr->m_intPropertyManager->addProperty(); + yProp->setPropertyName(tr("Y")); + d_ptr->m_intPropertyManager->setValue(yProp, 0); + d_ptr->m_propertyToY[property] = yProp; + d_ptr->m_yToProperty[yProp] = property; + property->addSubProperty(yProp); +} + +/*! + \reimp +*/ +void QtPointPropertyManager::uninitializeProperty(QtProperty *property) +{ + QtProperty *xProp = d_ptr->m_propertyToX[property]; + if (xProp) { + d_ptr->m_xToProperty.remove(xProp); + delete xProp; + } + d_ptr->m_propertyToX.remove(property); + + QtProperty *yProp = d_ptr->m_propertyToY[property]; + if (yProp) { + d_ptr->m_yToProperty.remove(yProp); + delete yProp; + } + d_ptr->m_propertyToY.remove(property); + + d_ptr->m_values.remove(property); +} + +// QtPointFPropertyManager + +class QtPointFPropertyManagerPrivate +{ + QtPointFPropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtPointFPropertyManager) +public: + + struct Data + { + Data() : decimals(2) {} + QPointF val; + int decimals; + }; + + void slotDoubleChanged(QtProperty *property, double value); + void slotPropertyDestroyed(QtProperty *property); + + typedef QMap PropertyValueMap; + PropertyValueMap m_values; + + QtDoublePropertyManager *m_doublePropertyManager; + + QMap m_propertyToX; + QMap m_propertyToY; + + QMap m_xToProperty; + QMap m_yToProperty; +}; + +void QtPointFPropertyManagerPrivate::slotDoubleChanged(QtProperty *property, double value) +{ + if (QtProperty *prop = m_xToProperty.value(property, 0)) { + QPointF p = m_values[prop].val; + p.setX(value); + q_ptr->setValue(prop, p); + } else if (QtProperty *prop = m_yToProperty.value(property, 0)) { + QPointF p = m_values[prop].val; + p.setY(value); + q_ptr->setValue(prop, p); + } +} + +void QtPointFPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property) +{ + if (QtProperty *pointProp = m_xToProperty.value(property, 0)) { + m_propertyToX[pointProp] = 0; + m_xToProperty.remove(property); + } else if (QtProperty *pointProp = m_yToProperty.value(property, 0)) { + m_propertyToY[pointProp] = 0; + m_yToProperty.remove(property); + } +} + +/*! \class QtPointFPropertyManager + + \brief The QtPointFPropertyManager provides and manages QPointF properties. + + A point property has nested \e x and \e y subproperties. The + top-level property's value can be retrieved using the value() + function, and set using the setValue() slot. + + The subproperties are created by a QtDoublePropertyManager object. This + manager can be retrieved using the subDoublePropertyManager() function. In + order to provide editing widgets for the subproperties in a + property browser widget, this manager must be associated with an + editor factory. + + In addition, QtPointFPropertyManager provides the valueChanged() signal which + is emitted whenever a property created by this manager changes. + + \sa QtAbstractPropertyManager, QtDoublePropertyManager, QtPointPropertyManager +*/ + +/*! + \fn void QtPointFPropertyManager::valueChanged(QtProperty *property, const QPointF &value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the + new \a value as parameters. + + \sa setValue() +*/ + +/*! + \fn void QtPointFPropertyManager::decimalsChanged(QtProperty *property, int prec) + + This signal is emitted whenever a property created by this manager + changes its precision of value, passing a pointer to the + \a property and the new \a prec value + + \sa setDecimals() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtPointFPropertyManager::QtPointFPropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtPointFPropertyManagerPrivate; + d_ptr->q_ptr = this; + + d_ptr->m_doublePropertyManager = new QtDoublePropertyManager(this); + connect(d_ptr->m_doublePropertyManager, SIGNAL(valueChanged(QtProperty *, double)), + this, SLOT(slotDoubleChanged(QtProperty *, double))); + connect(d_ptr->m_doublePropertyManager, SIGNAL(propertyDestroyed(QtProperty *)), + this, SLOT(slotPropertyDestroyed(QtProperty *))); +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtPointFPropertyManager::~QtPointFPropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the manager that creates the nested \e x and \e y + subproperties. + + In order to provide editing widgets for the subproperties in a + property browser widget, this manager must be associated with an + editor factory. + + \sa QtAbstractPropertyBrowser::setFactoryForManager() +*/ +QtDoublePropertyManager *QtPointFPropertyManager::subDoublePropertyManager() const +{ + return d_ptr->m_doublePropertyManager; +} + +/*! + Returns the given \a property's value. + + If the given \a property is not managed by this manager, this + function returns a point with coordinates (0, 0). + + \sa setValue() +*/ +QPointF QtPointFPropertyManager::value(const QtProperty *property) const +{ + return getValue(d_ptr->m_values, property); +} + +/*! + Returns the given \a property's precision, in decimals. + + \sa setDecimals() +*/ +int QtPointFPropertyManager::decimals(const QtProperty *property) const +{ + return getData(d_ptr->m_values, &QtPointFPropertyManagerPrivate::Data::decimals, property, 0); +} + +/*! + \reimp +*/ +QString QtPointFPropertyManager::valueText(const QtProperty *property) const +{ + const QtPointFPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + const QPointF v = it.value().val; + const int dec = it.value().decimals; + return QString(tr("(%1, %2)").arg(QString::number(v.x(), 'f', dec)) + .arg(QString::number(v.y(), 'f', dec))); +} + +/*! + \fn void QtPointFPropertyManager::setValue(QtProperty *property, const QPointF &value) + + Sets the value of the given \a property to \a value. Nested + properties are updated automatically. + + \sa value(), valueChanged() +*/ +void QtPointFPropertyManager::setValue(QtProperty *property, const QPointF &val) +{ + const QtPointFPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + if (it.value().val == val) + return; + + it.value().val = val; + d_ptr->m_doublePropertyManager->setValue(d_ptr->m_propertyToX[property], val.x()); + d_ptr->m_doublePropertyManager->setValue(d_ptr->m_propertyToY[property], val.y()); + + emit propertyChanged(property); + emit valueChanged(property, val); +} + +/*! + \fn void QtPointFPropertyManager::setDecimals(QtProperty *property, int prec) + + Sets the precision of the given \a property to \a prec. + + The valid decimal range is 0-13. The default is 2. + + \sa decimals() +*/ +void QtPointFPropertyManager::setDecimals(QtProperty *property, int prec) +{ + const QtPointFPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + QtPointFPropertyManagerPrivate::Data data = it.value(); + + if (prec > 13) + prec = 13; + else if (prec < 0) + prec = 0; + + if (data.decimals == prec) + return; + + data.decimals = prec; + d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToX[property], prec); + d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToY[property], prec); + + it.value() = data; + + emit decimalsChanged(property, data.decimals); +} + +/*! + \reimp +*/ +void QtPointFPropertyManager::initializeProperty(QtProperty *property) +{ + d_ptr->m_values[property] = QtPointFPropertyManagerPrivate::Data(); + + QtProperty *xProp = d_ptr->m_doublePropertyManager->addProperty(); + xProp->setPropertyName(tr("X")); + d_ptr->m_doublePropertyManager->setDecimals(xProp, decimals(property)); + d_ptr->m_doublePropertyManager->setValue(xProp, 0); + d_ptr->m_propertyToX[property] = xProp; + d_ptr->m_xToProperty[xProp] = property; + property->addSubProperty(xProp); + + QtProperty *yProp = d_ptr->m_doublePropertyManager->addProperty(); + yProp->setPropertyName(tr("Y")); + d_ptr->m_doublePropertyManager->setDecimals(yProp, decimals(property)); + d_ptr->m_doublePropertyManager->setValue(yProp, 0); + d_ptr->m_propertyToY[property] = yProp; + d_ptr->m_yToProperty[yProp] = property; + property->addSubProperty(yProp); +} + +/*! + \reimp +*/ +void QtPointFPropertyManager::uninitializeProperty(QtProperty *property) +{ + QtProperty *xProp = d_ptr->m_propertyToX[property]; + if (xProp) { + d_ptr->m_xToProperty.remove(xProp); + delete xProp; + } + d_ptr->m_propertyToX.remove(property); + + QtProperty *yProp = d_ptr->m_propertyToY[property]; + if (yProp) { + d_ptr->m_yToProperty.remove(yProp); + delete yProp; + } + d_ptr->m_propertyToY.remove(property); + + d_ptr->m_values.remove(property); +} + +// QtSizePropertyManager + +class QtSizePropertyManagerPrivate +{ + QtSizePropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtSizePropertyManager) +public: + + void slotIntChanged(QtProperty *property, int value); + void slotPropertyDestroyed(QtProperty *property); + void setValue(QtProperty *property, const QSize &val); + void setRange(QtProperty *property, + const QSize &minVal, const QSize &maxVal, const QSize &val); + + struct Data + { + Data() : val(QSize(0, 0)), minVal(QSize(0, 0)), maxVal(QSize(INT_MAX, INT_MAX)) {} + QSize val; + QSize minVal; + QSize maxVal; + QSize minimumValue() const { return minVal; } + QSize maximumValue() const { return maxVal; } + void setMinimumValue(const QSize &newMinVal) { setSizeMinimumData(this, newMinVal); } + void setMaximumValue(const QSize &newMaxVal) { setSizeMaximumData(this, newMaxVal); } + }; + + typedef QMap PropertyValueMap; + PropertyValueMap m_values; + + QtIntPropertyManager *m_intPropertyManager; + + QMap m_propertyToW; + QMap m_propertyToH; + + QMap m_wToProperty; + QMap m_hToProperty; +}; + +void QtSizePropertyManagerPrivate::slotIntChanged(QtProperty *property, int value) +{ + if (QtProperty *prop = m_wToProperty.value(property, 0)) { + QSize s = m_values[prop].val; + s.setWidth(value); + q_ptr->setValue(prop, s); + } else if (QtProperty *prop = m_hToProperty.value(property, 0)) { + QSize s = m_values[prop].val; + s.setHeight(value); + q_ptr->setValue(prop, s); + } +} + +void QtSizePropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property) +{ + if (QtProperty *pointProp = m_wToProperty.value(property, 0)) { + m_propertyToW[pointProp] = 0; + m_wToProperty.remove(property); + } else if (QtProperty *pointProp = m_hToProperty.value(property, 0)) { + m_propertyToH[pointProp] = 0; + m_hToProperty.remove(property); + } +} + +void QtSizePropertyManagerPrivate::setValue(QtProperty *property, const QSize &val) +{ + m_intPropertyManager->setValue(m_propertyToW.value(property), val.width()); + m_intPropertyManager->setValue(m_propertyToH.value(property), val.height()); +} + +void QtSizePropertyManagerPrivate::setRange(QtProperty *property, + const QSize &minVal, const QSize &maxVal, const QSize &val) +{ + QtProperty *wProperty = m_propertyToW.value(property); + QtProperty *hProperty = m_propertyToH.value(property); + m_intPropertyManager->setRange(wProperty, minVal.width(), maxVal.width()); + m_intPropertyManager->setValue(wProperty, val.width()); + m_intPropertyManager->setRange(hProperty, minVal.height(), maxVal.height()); + m_intPropertyManager->setValue(hProperty, val.height()); +} + +/*! + \class QtSizePropertyManager + + \brief The QtSizePropertyManager provides and manages QSize properties. + + A size property has nested \e width and \e height + subproperties. The top-level property's value can be retrieved + using the value() function, and set using the setValue() slot. + + The subproperties are created by a QtIntPropertyManager object. This + manager can be retrieved using the subIntPropertyManager() function. In + order to provide editing widgets for the subproperties in a + property browser widget, this manager must be associated with an + editor factory. + + A size property also has a range of valid values defined by a + minimum size and a maximum size. These sizes can be retrieved + using the minimum() and the maximum() functions, and set using the + setMinimum() and setMaximum() slots. Alternatively, the range can + be defined in one go using the setRange() slot. + + In addition, QtSizePropertyManager provides the valueChanged() signal + which is emitted whenever a property created by this manager + changes, and the rangeChanged() signal which is emitted whenever + such a property changes its range of valid sizes. + + \sa QtAbstractPropertyManager, QtIntPropertyManager, QtSizeFPropertyManager +*/ + +/*! + \fn void QtSizePropertyManager::valueChanged(QtProperty *property, const QSize &value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the new + \a value as parameters. + + \sa setValue() +*/ + +/*! + \fn void QtSizePropertyManager::rangeChanged(QtProperty *property, const QSize &minimum, const QSize &maximum) + + This signal is emitted whenever a property created by this manager + changes its range of valid sizes, passing a pointer to the \a + property and the new \a minimum and \a maximum sizes. + + \sa setRange() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtSizePropertyManager::QtSizePropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtSizePropertyManagerPrivate; + d_ptr->q_ptr = this; + + d_ptr->m_intPropertyManager = new QtIntPropertyManager(this); + connect(d_ptr->m_intPropertyManager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotIntChanged(QtProperty *, int))); + connect(d_ptr->m_intPropertyManager, SIGNAL(propertyDestroyed(QtProperty *)), + this, SLOT(slotPropertyDestroyed(QtProperty *))); +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtSizePropertyManager::~QtSizePropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the manager that creates the nested \e width and \e height + subproperties. + + In order to provide editing widgets for the \e width and \e height + properties in a property browser widget, this manager must be + associated with an editor factory. + + \sa QtAbstractPropertyBrowser::setFactoryForManager() +*/ +QtIntPropertyManager *QtSizePropertyManager::subIntPropertyManager() const +{ + return d_ptr->m_intPropertyManager; +} + +/*! + Returns the given \a property's value. + + If the given \a property is not managed by this manager, this + function returns an invalid size + + \sa setValue() +*/ +QSize QtSizePropertyManager::value(const QtProperty *property) const +{ + return getValue(d_ptr->m_values, property); +} + +/*! + Returns the given \a property's minimum size value. + + \sa setMinimum(), maximum(), setRange() +*/ +QSize QtSizePropertyManager::minimum(const QtProperty *property) const +{ + return getMinimum(d_ptr->m_values, property); +} + +/*! + Returns the given \a property's maximum size value. + + \sa setMaximum(), minimum(), setRange() +*/ +QSize QtSizePropertyManager::maximum(const QtProperty *property) const +{ + return getMaximum(d_ptr->m_values, property); +} + +/*! + \reimp +*/ +QString QtSizePropertyManager::valueText(const QtProperty *property) const +{ + const QtSizePropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + const QSize v = it.value().val; + return QString(tr("%1 x %2").arg(QString::number(v.width())) + .arg(QString::number(v.height()))); +} + +/*! + \fn void QtSizePropertyManager::setValue(QtProperty *property, const QSize &value) + + Sets the value of the given \a property to \a value. + + If the specified \a value is not valid according to the given \a + property's size range, the \a value is adjusted to the nearest + valid value within the size range. + + \sa value(), setRange(), valueChanged() +*/ +void QtSizePropertyManager::setValue(QtProperty *property, const QSize &val) +{ + setValueInRange(this, d_ptr, + &QtSizePropertyManager::propertyChanged, + &QtSizePropertyManager::valueChanged, + property, val, &QtSizePropertyManagerPrivate::setValue); +} + +/*! + Sets the minimum size value for the given \a property to \a minVal. + + When setting the minimum size value, the maximum and current + values are adjusted if necessary (ensuring that the size range + remains valid and that the current value is within the range). + + \sa minimum(), setRange(), rangeChanged() +*/ +void QtSizePropertyManager::setMinimum(QtProperty *property, const QSize &minVal) +{ + setBorderValue(this, d_ptr, + &QtSizePropertyManager::propertyChanged, + &QtSizePropertyManager::valueChanged, + &QtSizePropertyManager::rangeChanged, + property, + &QtSizePropertyManagerPrivate::Data::minimumValue, + &QtSizePropertyManagerPrivate::Data::setMinimumValue, + minVal, &QtSizePropertyManagerPrivate::setRange); +} + +/*! + Sets the maximum size value for the given \a property to \a maxVal. + + When setting the maximum size value, the minimum and current + values are adjusted if necessary (ensuring that the size range + remains valid and that the current value is within the range). + + \sa maximum(), setRange(), rangeChanged() +*/ +void QtSizePropertyManager::setMaximum(QtProperty *property, const QSize &maxVal) +{ + setBorderValue(this, d_ptr, + &QtSizePropertyManager::propertyChanged, + &QtSizePropertyManager::valueChanged, + &QtSizePropertyManager::rangeChanged, + property, + &QtSizePropertyManagerPrivate::Data::maximumValue, + &QtSizePropertyManagerPrivate::Data::setMaximumValue, + maxVal, &QtSizePropertyManagerPrivate::setRange); +} + +/*! + \fn void QtSizePropertyManager::setRange(QtProperty *property, const QSize &minimum, const QSize &maximum) + + Sets the range of valid values. + + This is a convenience function defining the range of valid values + in one go; setting the \a minimum and \a maximum values for the + given \a property with a single function call. + + When setting a new range, the current value is adjusted if + necessary (ensuring that the value remains within the range). + + \sa setMinimum(), setMaximum(), rangeChanged() +*/ +void QtSizePropertyManager::setRange(QtProperty *property, const QSize &minVal, const QSize &maxVal) +{ + setBorderValues(this, d_ptr, + &QtSizePropertyManager::propertyChanged, + &QtSizePropertyManager::valueChanged, + &QtSizePropertyManager::rangeChanged, + property, minVal, maxVal, &QtSizePropertyManagerPrivate::setRange); +} + +/*! + \reimp +*/ +void QtSizePropertyManager::initializeProperty(QtProperty *property) +{ + d_ptr->m_values[property] = QtSizePropertyManagerPrivate::Data(); + + QtProperty *wProp = d_ptr->m_intPropertyManager->addProperty(); + wProp->setPropertyName(tr("Width")); + d_ptr->m_intPropertyManager->setValue(wProp, 0); + d_ptr->m_intPropertyManager->setMinimum(wProp, 0); + d_ptr->m_propertyToW[property] = wProp; + d_ptr->m_wToProperty[wProp] = property; + property->addSubProperty(wProp); + + QtProperty *hProp = d_ptr->m_intPropertyManager->addProperty(); + hProp->setPropertyName(tr("Height")); + d_ptr->m_intPropertyManager->setValue(hProp, 0); + d_ptr->m_intPropertyManager->setMinimum(hProp, 0); + d_ptr->m_propertyToH[property] = hProp; + d_ptr->m_hToProperty[hProp] = property; + property->addSubProperty(hProp); +} + +/*! + \reimp +*/ +void QtSizePropertyManager::uninitializeProperty(QtProperty *property) +{ + QtProperty *wProp = d_ptr->m_propertyToW[property]; + if (wProp) { + d_ptr->m_wToProperty.remove(wProp); + delete wProp; + } + d_ptr->m_propertyToW.remove(property); + + QtProperty *hProp = d_ptr->m_propertyToH[property]; + if (hProp) { + d_ptr->m_hToProperty.remove(hProp); + delete hProp; + } + d_ptr->m_propertyToH.remove(property); + + d_ptr->m_values.remove(property); +} + +// QtSizeFPropertyManager + +class QtSizeFPropertyManagerPrivate +{ + QtSizeFPropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtSizeFPropertyManager) +public: + + void slotDoubleChanged(QtProperty *property, double value); + void slotPropertyDestroyed(QtProperty *property); + void setValue(QtProperty *property, const QSizeF &val); + void setRange(QtProperty *property, + const QSizeF &minVal, const QSizeF &maxVal, const QSizeF &val); + + struct Data + { + Data() : val(QSizeF(0, 0)), minVal(QSizeF(0, 0)), maxVal(QSizeF(INT_MAX, INT_MAX)), decimals(2) {} + QSizeF val; + QSizeF minVal; + QSizeF maxVal; + int decimals; + QSizeF minimumValue() const { return minVal; } + QSizeF maximumValue() const { return maxVal; } + void setMinimumValue(const QSizeF &newMinVal) { setSizeMinimumData(this, newMinVal); } + void setMaximumValue(const QSizeF &newMaxVal) { setSizeMaximumData(this, newMaxVal); } + }; + + typedef QMap PropertyValueMap; + PropertyValueMap m_values; + + QtDoublePropertyManager *m_doublePropertyManager; + + QMap m_propertyToW; + QMap m_propertyToH; + + QMap m_wToProperty; + QMap m_hToProperty; +}; + +void QtSizeFPropertyManagerPrivate::slotDoubleChanged(QtProperty *property, double value) +{ + if (QtProperty *prop = m_wToProperty.value(property, 0)) { + QSizeF s = m_values[prop].val; + s.setWidth(value); + q_ptr->setValue(prop, s); + } else if (QtProperty *prop = m_hToProperty.value(property, 0)) { + QSizeF s = m_values[prop].val; + s.setHeight(value); + q_ptr->setValue(prop, s); + } +} + +void QtSizeFPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property) +{ + if (QtProperty *pointProp = m_wToProperty.value(property, 0)) { + m_propertyToW[pointProp] = 0; + m_wToProperty.remove(property); + } else if (QtProperty *pointProp = m_hToProperty.value(property, 0)) { + m_propertyToH[pointProp] = 0; + m_hToProperty.remove(property); + } +} + +void QtSizeFPropertyManagerPrivate::setValue(QtProperty *property, const QSizeF &val) +{ + m_doublePropertyManager->setValue(m_propertyToW.value(property), val.width()); + m_doublePropertyManager->setValue(m_propertyToH.value(property), val.height()); +} + +void QtSizeFPropertyManagerPrivate::setRange(QtProperty *property, + const QSizeF &minVal, const QSizeF &maxVal, const QSizeF &val) +{ + m_doublePropertyManager->setRange(m_propertyToW[property], minVal.width(), maxVal.width()); + m_doublePropertyManager->setValue(m_propertyToW[property], val.width()); + m_doublePropertyManager->setRange(m_propertyToH[property], minVal.height(), maxVal.height()); + m_doublePropertyManager->setValue(m_propertyToH[property], val.height()); +} + +/*! + \class QtSizeFPropertyManager + + \brief The QtSizeFPropertyManager provides and manages QSizeF properties. + + A size property has nested \e width and \e height + subproperties. The top-level property's value can be retrieved + using the value() function, and set using the setValue() slot. + + The subproperties are created by a QtDoublePropertyManager object. This + manager can be retrieved using the subDoublePropertyManager() function. In + order to provide editing widgets for the subproperties in a + property browser widget, this manager must be associated with an + editor factory. + + A size property also has a range of valid values defined by a + minimum size and a maximum size. These sizes can be retrieved + using the minimum() and the maximum() functions, and set using the + setMinimum() and setMaximum() slots. Alternatively, the range can + be defined in one go using the setRange() slot. + + In addition, QtSizeFPropertyManager provides the valueChanged() signal + which is emitted whenever a property created by this manager + changes, and the rangeChanged() signal which is emitted whenever + such a property changes its range of valid sizes. + + \sa QtAbstractPropertyManager, QtDoublePropertyManager, QtSizePropertyManager +*/ + +/*! + \fn void QtSizeFPropertyManager::valueChanged(QtProperty *property, const QSizeF &value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the new + \a value as parameters. + + \sa setValue() +*/ + +/*! + \fn void QtSizeFPropertyManager::rangeChanged(QtProperty *property, const QSizeF &minimum, const QSizeF &maximum) + + This signal is emitted whenever a property created by this manager + changes its range of valid sizes, passing a pointer to the \a + property and the new \a minimum and \a maximum sizes. + + \sa setRange() +*/ + +/*! + \fn void QtSizeFPropertyManager::decimalsChanged(QtProperty *property, int prec) + + This signal is emitted whenever a property created by this manager + changes its precision of value, passing a pointer to the + \a property and the new \a prec value + + \sa setDecimals() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtSizeFPropertyManager::QtSizeFPropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtSizeFPropertyManagerPrivate; + d_ptr->q_ptr = this; + + d_ptr->m_doublePropertyManager = new QtDoublePropertyManager(this); + connect(d_ptr->m_doublePropertyManager, SIGNAL(valueChanged(QtProperty *, double)), + this, SLOT(slotDoubleChanged(QtProperty *, double))); + connect(d_ptr->m_doublePropertyManager, SIGNAL(propertyDestroyed(QtProperty *)), + this, SLOT(slotPropertyDestroyed(QtProperty *))); +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtSizeFPropertyManager::~QtSizeFPropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the manager that creates the nested \e width and \e height + subproperties. + + In order to provide editing widgets for the \e width and \e height + properties in a property browser widget, this manager must be + associated with an editor factory. + + \sa QtAbstractPropertyBrowser::setFactoryForManager() +*/ +QtDoublePropertyManager *QtSizeFPropertyManager::subDoublePropertyManager() const +{ + return d_ptr->m_doublePropertyManager; +} + +/*! + Returns the given \a property's value. + + If the given \a property is not managed by this manager, this + function returns an invalid size + + \sa setValue() +*/ +QSizeF QtSizeFPropertyManager::value(const QtProperty *property) const +{ + return getValue(d_ptr->m_values, property); +} + +/*! + Returns the given \a property's precision, in decimals. + + \sa setDecimals() +*/ +int QtSizeFPropertyManager::decimals(const QtProperty *property) const +{ + return getData(d_ptr->m_values, &QtSizeFPropertyManagerPrivate::Data::decimals, property, 0); +} + +/*! + Returns the given \a property's minimum size value. + + \sa setMinimum(), maximum(), setRange() +*/ +QSizeF QtSizeFPropertyManager::minimum(const QtProperty *property) const +{ + return getMinimum(d_ptr->m_values, property); +} + +/*! + Returns the given \a property's maximum size value. + + \sa setMaximum(), minimum(), setRange() +*/ +QSizeF QtSizeFPropertyManager::maximum(const QtProperty *property) const +{ + return getMaximum(d_ptr->m_values, property); +} + +/*! + \reimp +*/ +QString QtSizeFPropertyManager::valueText(const QtProperty *property) const +{ + const QtSizeFPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + const QSizeF v = it.value().val; + const int dec = it.value().decimals; + return QString(tr("%1 x %2").arg(QString::number(v.width(), 'f', dec)) + .arg(QString::number(v.height(), 'f', dec))); +} + +/*! + \fn void QtSizeFPropertyManager::setValue(QtProperty *property, const QSizeF &value) + + Sets the value of the given \a property to \a value. + + If the specified \a value is not valid according to the given \a + property's size range, the \a value is adjusted to the nearest + valid value within the size range. + + \sa value(), setRange(), valueChanged() +*/ +void QtSizeFPropertyManager::setValue(QtProperty *property, const QSizeF &val) +{ + setValueInRange(this, d_ptr, + &QtSizeFPropertyManager::propertyChanged, + &QtSizeFPropertyManager::valueChanged, + property, val, &QtSizeFPropertyManagerPrivate::setValue); +} + +/*! + \fn void QtSizeFPropertyManager::setDecimals(QtProperty *property, int prec) + + Sets the precision of the given \a property to \a prec. + + The valid decimal range is 0-13. The default is 2. + + \sa decimals() +*/ +void QtSizeFPropertyManager::setDecimals(QtProperty *property, int prec) +{ + const QtSizeFPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + QtSizeFPropertyManagerPrivate::Data data = it.value(); + + if (prec > 13) + prec = 13; + else if (prec < 0) + prec = 0; + + if (data.decimals == prec) + return; + + data.decimals = prec; + d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToW[property], prec); + d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToH[property], prec); + + it.value() = data; + + emit decimalsChanged(property, data.decimals); +} + +/*! + Sets the minimum size value for the given \a property to \a minVal. + + When setting the minimum size value, the maximum and current + values are adjusted if necessary (ensuring that the size range + remains valid and that the current value is within the range). + + \sa minimum(), setRange(), rangeChanged() +*/ +void QtSizeFPropertyManager::setMinimum(QtProperty *property, const QSizeF &minVal) +{ + setBorderValue(this, d_ptr, + &QtSizeFPropertyManager::propertyChanged, + &QtSizeFPropertyManager::valueChanged, + &QtSizeFPropertyManager::rangeChanged, + property, + &QtSizeFPropertyManagerPrivate::Data::minimumValue, + &QtSizeFPropertyManagerPrivate::Data::setMinimumValue, + minVal, &QtSizeFPropertyManagerPrivate::setRange); +} + +/*! + Sets the maximum size value for the given \a property to \a maxVal. + + When setting the maximum size value, the minimum and current + values are adjusted if necessary (ensuring that the size range + remains valid and that the current value is within the range). + + \sa maximum(), setRange(), rangeChanged() +*/ +void QtSizeFPropertyManager::setMaximum(QtProperty *property, const QSizeF &maxVal) +{ + setBorderValue(this, d_ptr, + &QtSizeFPropertyManager::propertyChanged, + &QtSizeFPropertyManager::valueChanged, + &QtSizeFPropertyManager::rangeChanged, + property, + &QtSizeFPropertyManagerPrivate::Data::maximumValue, + &QtSizeFPropertyManagerPrivate::Data::setMaximumValue, + maxVal, &QtSizeFPropertyManagerPrivate::setRange); +} + +/*! + \fn void QtSizeFPropertyManager::setRange(QtProperty *property, const QSizeF &minimum, const QSizeF &maximum) + + Sets the range of valid values. + + This is a convenience function defining the range of valid values + in one go; setting the \a minimum and \a maximum values for the + given \a property with a single function call. + + When setting a new range, the current value is adjusted if + necessary (ensuring that the value remains within the range). + + \sa setMinimum(), setMaximum(), rangeChanged() +*/ +void QtSizeFPropertyManager::setRange(QtProperty *property, const QSizeF &minVal, const QSizeF &maxVal) +{ + setBorderValues(this, d_ptr, + &QtSizeFPropertyManager::propertyChanged, + &QtSizeFPropertyManager::valueChanged, + &QtSizeFPropertyManager::rangeChanged, + property, minVal, maxVal, &QtSizeFPropertyManagerPrivate::setRange); +} + +/*! + \reimp +*/ +void QtSizeFPropertyManager::initializeProperty(QtProperty *property) +{ + d_ptr->m_values[property] = QtSizeFPropertyManagerPrivate::Data(); + + QtProperty *wProp = d_ptr->m_doublePropertyManager->addProperty(); + wProp->setPropertyName(tr("Width")); + d_ptr->m_doublePropertyManager->setDecimals(wProp, decimals(property)); + d_ptr->m_doublePropertyManager->setValue(wProp, 0); + d_ptr->m_doublePropertyManager->setMinimum(wProp, 0); + d_ptr->m_propertyToW[property] = wProp; + d_ptr->m_wToProperty[wProp] = property; + property->addSubProperty(wProp); + + QtProperty *hProp = d_ptr->m_doublePropertyManager->addProperty(); + hProp->setPropertyName(tr("Height")); + d_ptr->m_doublePropertyManager->setDecimals(hProp, decimals(property)); + d_ptr->m_doublePropertyManager->setValue(hProp, 0); + d_ptr->m_doublePropertyManager->setMinimum(hProp, 0); + d_ptr->m_propertyToH[property] = hProp; + d_ptr->m_hToProperty[hProp] = property; + property->addSubProperty(hProp); +} + +/*! + \reimp +*/ +void QtSizeFPropertyManager::uninitializeProperty(QtProperty *property) +{ + QtProperty *wProp = d_ptr->m_propertyToW[property]; + if (wProp) { + d_ptr->m_wToProperty.remove(wProp); + delete wProp; + } + d_ptr->m_propertyToW.remove(property); + + QtProperty *hProp = d_ptr->m_propertyToH[property]; + if (hProp) { + d_ptr->m_hToProperty.remove(hProp); + delete hProp; + } + d_ptr->m_propertyToH.remove(property); + + d_ptr->m_values.remove(property); +} + +// QtRectPropertyManager + +class QtRectPropertyManagerPrivate +{ + QtRectPropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtRectPropertyManager) +public: + + void slotIntChanged(QtProperty *property, int value); + void slotPropertyDestroyed(QtProperty *property); + void setConstraint(QtProperty *property, const QRect &constraint, const QRect &val); + + struct Data + { + Data() : val(0, 0, 0, 0) {} + QRect val; + QRect constraint; + }; + + typedef QMap PropertyValueMap; + PropertyValueMap m_values; + + QtIntPropertyManager *m_intPropertyManager; + + QMap m_propertyToX; + QMap m_propertyToY; + QMap m_propertyToW; + QMap m_propertyToH; + + QMap m_xToProperty; + QMap m_yToProperty; + QMap m_wToProperty; + QMap m_hToProperty; +}; + +void QtRectPropertyManagerPrivate::slotIntChanged(QtProperty *property, int value) +{ + if (QtProperty *prop = m_xToProperty.value(property, 0)) { + QRect r = m_values[prop].val; + r.moveLeft(value); + q_ptr->setValue(prop, r); + } else if (QtProperty *prop = m_yToProperty.value(property)) { + QRect r = m_values[prop].val; + r.moveTop(value); + q_ptr->setValue(prop, r); + } else if (QtProperty *prop = m_wToProperty.value(property, 0)) { + Data data = m_values[prop]; + QRect r = data.val; + r.setWidth(value); + if (!data.constraint.isNull() && data.constraint.x() + data.constraint.width() < r.x() + r.width()) { + r.moveLeft(data.constraint.left() + data.constraint.width() - r.width()); + } + q_ptr->setValue(prop, r); + } else if (QtProperty *prop = m_hToProperty.value(property, 0)) { + Data data = m_values[prop]; + QRect r = data.val; + r.setHeight(value); + if (!data.constraint.isNull() && data.constraint.y() + data.constraint.height() < r.y() + r.height()) { + r.moveTop(data.constraint.top() + data.constraint.height() - r.height()); + } + q_ptr->setValue(prop, r); + } +} + +void QtRectPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property) +{ + if (QtProperty *pointProp = m_xToProperty.value(property, 0)) { + m_propertyToX[pointProp] = 0; + m_xToProperty.remove(property); + } else if (QtProperty *pointProp = m_yToProperty.value(property, 0)) { + m_propertyToY[pointProp] = 0; + m_yToProperty.remove(property); + } else if (QtProperty *pointProp = m_wToProperty.value(property, 0)) { + m_propertyToW[pointProp] = 0; + m_wToProperty.remove(property); + } else if (QtProperty *pointProp = m_hToProperty.value(property, 0)) { + m_propertyToH[pointProp] = 0; + m_hToProperty.remove(property); + } +} + +void QtRectPropertyManagerPrivate::setConstraint(QtProperty *property, + const QRect &constraint, const QRect &val) +{ + const bool isNull = constraint.isNull(); + const int left = isNull ? INT_MIN : constraint.left(); + const int right = isNull ? INT_MAX : constraint.left() + constraint.width(); + const int top = isNull ? INT_MIN : constraint.top(); + const int bottom = isNull ? INT_MAX : constraint.top() + constraint.height(); + const int width = isNull ? INT_MAX : constraint.width(); + const int height = isNull ? INT_MAX : constraint.height(); + + m_intPropertyManager->setRange(m_propertyToX[property], left, right); + m_intPropertyManager->setRange(m_propertyToY[property], top, bottom); + m_intPropertyManager->setRange(m_propertyToW[property], 0, width); + m_intPropertyManager->setRange(m_propertyToH[property], 0, height); + + m_intPropertyManager->setValue(m_propertyToX[property], val.x()); + m_intPropertyManager->setValue(m_propertyToY[property], val.y()); + m_intPropertyManager->setValue(m_propertyToW[property], val.width()); + m_intPropertyManager->setValue(m_propertyToH[property], val.height()); +} + +/*! + \class QtRectPropertyManager + + \brief The QtRectPropertyManager provides and manages QRect properties. + + A rectangle property has nested \e x, \e y, \e width and \e height + subproperties. The top-level property's value can be retrieved + using the value() function, and set using the setValue() slot. + + The subproperties are created by a QtIntPropertyManager object. This + manager can be retrieved using the subIntPropertyManager() function. In + order to provide editing widgets for the subproperties in a + property browser widget, this manager must be associated with an + editor factory. + + A rectangle property also has a constraint rectangle which can be + retrieved using the constraint() function, and set using the + setConstraint() slot. + + In addition, QtRectPropertyManager provides the valueChanged() signal + which is emitted whenever a property created by this manager + changes, and the constraintChanged() signal which is emitted + whenever such a property changes its constraint rectangle. + + \sa QtAbstractPropertyManager, QtIntPropertyManager, QtRectFPropertyManager +*/ + +/*! + \fn void QtRectPropertyManager::valueChanged(QtProperty *property, const QRect &value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the new + \a value as parameters. + + \sa setValue() +*/ + +/*! + \fn void QtRectPropertyManager::constraintChanged(QtProperty *property, const QRect &constraint) + + This signal is emitted whenever property changes its constraint + rectangle, passing a pointer to the \a property and the new \a + constraint rectangle as parameters. + + \sa setConstraint() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtRectPropertyManager::QtRectPropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtRectPropertyManagerPrivate; + d_ptr->q_ptr = this; + + d_ptr->m_intPropertyManager = new QtIntPropertyManager(this); + connect(d_ptr->m_intPropertyManager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotIntChanged(QtProperty *, int))); + connect(d_ptr->m_intPropertyManager, SIGNAL(propertyDestroyed(QtProperty *)), + this, SLOT(slotPropertyDestroyed(QtProperty *))); +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtRectPropertyManager::~QtRectPropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the manager that creates the nested \e x, \e y, \e width + and \e height subproperties. + + In order to provide editing widgets for the mentioned + subproperties in a property browser widget, this manager must be + associated with an editor factory. + + \sa QtAbstractPropertyBrowser::setFactoryForManager() +*/ +QtIntPropertyManager *QtRectPropertyManager::subIntPropertyManager() const +{ + return d_ptr->m_intPropertyManager; +} + +/*! + Returns the given \a property's value. + + If the given \a property is not managed by this manager, this + function returns an invalid rectangle. + + \sa setValue(), constraint() +*/ +QRect QtRectPropertyManager::value(const QtProperty *property) const +{ + return getValue(d_ptr->m_values, property); +} + +/*! + Returns the given \a property's constraining rectangle. If returned value is null QRect it means there is no constraint applied. + + \sa value(), setConstraint() +*/ +QRect QtRectPropertyManager::constraint(const QtProperty *property) const +{ + return getData(d_ptr->m_values, &QtRectPropertyManagerPrivate::Data::constraint, property, QRect()); +} + +/*! + \reimp +*/ +QString QtRectPropertyManager::valueText(const QtProperty *property) const +{ + const QtRectPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + const QRect v = it.value().val; + return QString(tr("[(%1, %2), %3 x %4]").arg(QString::number(v.x())) + .arg(QString::number(v.y())) + .arg(QString::number(v.width())) + .arg(QString::number(v.height()))); +} + +/*! + \fn void QtRectPropertyManager::setValue(QtProperty *property, const QRect &value) + + Sets the value of the given \a property to \a value. Nested + properties are updated automatically. + + If the specified \a value is not inside the given \a property's + constraining rectangle, the value is adjusted accordingly to fit + within the constraint. + + \sa value(), setConstraint(), valueChanged() +*/ +void QtRectPropertyManager::setValue(QtProperty *property, const QRect &val) +{ + const QtRectPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + QtRectPropertyManagerPrivate::Data data = it.value(); + + QRect newRect = val.normalized(); + if (!data.constraint.isNull() && !data.constraint.contains(newRect)) { + const QRect r1 = data.constraint; + const QRect r2 = newRect; + newRect.setLeft(qMax(r1.left(), r2.left())); + newRect.setRight(qMin(r1.right(), r2.right())); + newRect.setTop(qMax(r1.top(), r2.top())); + newRect.setBottom(qMin(r1.bottom(), r2.bottom())); + if (newRect.width() < 0 || newRect.height() < 0) + return; + } + + if (data.val == newRect) + return; + + data.val = newRect; + + it.value() = data; + d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToX[property], newRect.x()); + d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToY[property], newRect.y()); + d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToW[property], newRect.width()); + d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToH[property], newRect.height()); + + emit propertyChanged(property); + emit valueChanged(property, data.val); +} + +/*! + Sets the given \a property's constraining rectangle to \a + constraint. + + When setting the constraint, the current value is adjusted if + necessary (ensuring that the current rectangle value is inside the + constraint). In order to reset the constraint pass a null QRect value. + + \sa setValue(), constraint(), constraintChanged() +*/ +void QtRectPropertyManager::setConstraint(QtProperty *property, const QRect &constraint) +{ + const QtRectPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + QtRectPropertyManagerPrivate::Data data = it.value(); + + QRect newConstraint = constraint.normalized(); + if (data.constraint == newConstraint) + return; + + const QRect oldVal = data.val; + + data.constraint = newConstraint; + + if (!data.constraint.isNull() && !data.constraint.contains(oldVal)) { + QRect r1 = data.constraint; + QRect r2 = data.val; + + if (r2.width() > r1.width()) + r2.setWidth(r1.width()); + if (r2.height() > r1.height()) + r2.setHeight(r1.height()); + if (r2.left() < r1.left()) + r2.moveLeft(r1.left()); + else if (r2.right() > r1.right()) + r2.moveRight(r1.right()); + if (r2.top() < r1.top()) + r2.moveTop(r1.top()); + else if (r2.bottom() > r1.bottom()) + r2.moveBottom(r1.bottom()); + + data.val = r2; + } + + it.value() = data; + + emit constraintChanged(property, data.constraint); + + d_ptr->setConstraint(property, data.constraint, data.val); + + if (data.val == oldVal) + return; + + emit propertyChanged(property); + emit valueChanged(property, data.val); +} + +/*! + \reimp +*/ +void QtRectPropertyManager::initializeProperty(QtProperty *property) +{ + d_ptr->m_values[property] = QtRectPropertyManagerPrivate::Data(); + + QtProperty *xProp = d_ptr->m_intPropertyManager->addProperty(); + xProp->setPropertyName(tr("X")); + d_ptr->m_intPropertyManager->setValue(xProp, 0); + d_ptr->m_propertyToX[property] = xProp; + d_ptr->m_xToProperty[xProp] = property; + property->addSubProperty(xProp); + + QtProperty *yProp = d_ptr->m_intPropertyManager->addProperty(); + yProp->setPropertyName(tr("Y")); + d_ptr->m_intPropertyManager->setValue(yProp, 0); + d_ptr->m_propertyToY[property] = yProp; + d_ptr->m_yToProperty[yProp] = property; + property->addSubProperty(yProp); + + QtProperty *wProp = d_ptr->m_intPropertyManager->addProperty(); + wProp->setPropertyName(tr("Width")); + d_ptr->m_intPropertyManager->setValue(wProp, 0); + d_ptr->m_intPropertyManager->setMinimum(wProp, 0); + d_ptr->m_propertyToW[property] = wProp; + d_ptr->m_wToProperty[wProp] = property; + property->addSubProperty(wProp); + + QtProperty *hProp = d_ptr->m_intPropertyManager->addProperty(); + hProp->setPropertyName(tr("Height")); + d_ptr->m_intPropertyManager->setValue(hProp, 0); + d_ptr->m_intPropertyManager->setMinimum(hProp, 0); + d_ptr->m_propertyToH[property] = hProp; + d_ptr->m_hToProperty[hProp] = property; + property->addSubProperty(hProp); +} + +/*! + \reimp +*/ +void QtRectPropertyManager::uninitializeProperty(QtProperty *property) +{ + QtProperty *xProp = d_ptr->m_propertyToX[property]; + if (xProp) { + d_ptr->m_xToProperty.remove(xProp); + delete xProp; + } + d_ptr->m_propertyToX.remove(property); + + QtProperty *yProp = d_ptr->m_propertyToY[property]; + if (yProp) { + d_ptr->m_yToProperty.remove(yProp); + delete yProp; + } + d_ptr->m_propertyToY.remove(property); + + QtProperty *wProp = d_ptr->m_propertyToW[property]; + if (wProp) { + d_ptr->m_wToProperty.remove(wProp); + delete wProp; + } + d_ptr->m_propertyToW.remove(property); + + QtProperty *hProp = d_ptr->m_propertyToH[property]; + if (hProp) { + d_ptr->m_hToProperty.remove(hProp); + delete hProp; + } + d_ptr->m_propertyToH.remove(property); + + d_ptr->m_values.remove(property); +} + +// QtRectFPropertyManager + +class QtRectFPropertyManagerPrivate +{ + QtRectFPropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtRectFPropertyManager) +public: + + void slotDoubleChanged(QtProperty *property, double value); + void slotPropertyDestroyed(QtProperty *property); + void setConstraint(QtProperty *property, const QRectF &constraint, const QRectF &val); + + struct Data + { + Data() : val(0, 0, 0, 0), decimals(2) {} + QRectF val; + QRectF constraint; + int decimals; + }; + + typedef QMap PropertyValueMap; + PropertyValueMap m_values; + + QtDoublePropertyManager *m_doublePropertyManager; + + QMap m_propertyToX; + QMap m_propertyToY; + QMap m_propertyToW; + QMap m_propertyToH; + + QMap m_xToProperty; + QMap m_yToProperty; + QMap m_wToProperty; + QMap m_hToProperty; +}; + +void QtRectFPropertyManagerPrivate::slotDoubleChanged(QtProperty *property, double value) +{ + if (QtProperty *prop = m_xToProperty.value(property, 0)) { + QRectF r = m_values[prop].val; + r.moveLeft(value); + q_ptr->setValue(prop, r); + } else if (QtProperty *prop = m_yToProperty.value(property, 0)) { + QRectF r = m_values[prop].val; + r.moveTop(value); + q_ptr->setValue(prop, r); + } else if (QtProperty *prop = m_wToProperty.value(property, 0)) { + Data data = m_values[prop]; + QRectF r = data.val; + r.setWidth(value); + if (!data.constraint.isNull() && data.constraint.x() + data.constraint.width() < r.x() + r.width()) { + r.moveLeft(data.constraint.left() + data.constraint.width() - r.width()); + } + q_ptr->setValue(prop, r); + } else if (QtProperty *prop = m_hToProperty.value(property, 0)) { + Data data = m_values[prop]; + QRectF r = data.val; + r.setHeight(value); + if (!data.constraint.isNull() && data.constraint.y() + data.constraint.height() < r.y() + r.height()) { + r.moveTop(data.constraint.top() + data.constraint.height() - r.height()); + } + q_ptr->setValue(prop, r); + } +} + +void QtRectFPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property) +{ + if (QtProperty *pointProp = m_xToProperty.value(property, 0)) { + m_propertyToX[pointProp] = 0; + m_xToProperty.remove(property); + } else if (QtProperty *pointProp = m_yToProperty.value(property, 0)) { + m_propertyToY[pointProp] = 0; + m_yToProperty.remove(property); + } else if (QtProperty *pointProp = m_wToProperty.value(property, 0)) { + m_propertyToW[pointProp] = 0; + m_wToProperty.remove(property); + } else if (QtProperty *pointProp = m_hToProperty.value(property, 0)) { + m_propertyToH[pointProp] = 0; + m_hToProperty.remove(property); + } +} + +void QtRectFPropertyManagerPrivate::setConstraint(QtProperty *property, + const QRectF &constraint, const QRectF &val) +{ + const bool isNull = constraint.isNull(); + const float left = isNull ? FLT_MIN : constraint.left(); + const float right = isNull ? FLT_MAX : constraint.left() + constraint.width(); + const float top = isNull ? FLT_MIN : constraint.top(); + const float bottom = isNull ? FLT_MAX : constraint.top() + constraint.height(); + const float width = isNull ? FLT_MAX : constraint.width(); + const float height = isNull ? FLT_MAX : constraint.height(); + + m_doublePropertyManager->setRange(m_propertyToX[property], left, right); + m_doublePropertyManager->setRange(m_propertyToY[property], top, bottom); + m_doublePropertyManager->setRange(m_propertyToW[property], 0, width); + m_doublePropertyManager->setRange(m_propertyToH[property], 0, height); + + m_doublePropertyManager->setValue(m_propertyToX[property], val.x()); + m_doublePropertyManager->setValue(m_propertyToY[property], val.y()); + m_doublePropertyManager->setValue(m_propertyToW[property], val.width()); + m_doublePropertyManager->setValue(m_propertyToH[property], val.height()); +} + +/*! + \class QtRectFPropertyManager + + \brief The QtRectFPropertyManager provides and manages QRectF properties. + + A rectangle property has nested \e x, \e y, \e width and \e height + subproperties. The top-level property's value can be retrieved + using the value() function, and set using the setValue() slot. + + The subproperties are created by a QtDoublePropertyManager object. This + manager can be retrieved using the subDoublePropertyManager() function. In + order to provide editing widgets for the subproperties in a + property browser widget, this manager must be associated with an + editor factory. + + A rectangle property also has a constraint rectangle which can be + retrieved using the constraint() function, and set using the + setConstraint() slot. + + In addition, QtRectFPropertyManager provides the valueChanged() signal + which is emitted whenever a property created by this manager + changes, and the constraintChanged() signal which is emitted + whenever such a property changes its constraint rectangle. + + \sa QtAbstractPropertyManager, QtDoublePropertyManager, QtRectPropertyManager +*/ + +/*! + \fn void QtRectFPropertyManager::valueChanged(QtProperty *property, const QRectF &value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the new + \a value as parameters. + + \sa setValue() +*/ + +/*! + \fn void QtRectFPropertyManager::constraintChanged(QtProperty *property, const QRectF &constraint) + + This signal is emitted whenever property changes its constraint + rectangle, passing a pointer to the \a property and the new \a + constraint rectangle as parameters. + + \sa setConstraint() +*/ + +/*! + \fn void QtRectFPropertyManager::decimalsChanged(QtProperty *property, int prec) + + This signal is emitted whenever a property created by this manager + changes its precision of value, passing a pointer to the + \a property and the new \a prec value + + \sa setDecimals() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtRectFPropertyManager::QtRectFPropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtRectFPropertyManagerPrivate; + d_ptr->q_ptr = this; + + d_ptr->m_doublePropertyManager = new QtDoublePropertyManager(this); + connect(d_ptr->m_doublePropertyManager, SIGNAL(valueChanged(QtProperty *, double)), + this, SLOT(slotDoubleChanged(QtProperty *, double))); + connect(d_ptr->m_doublePropertyManager, SIGNAL(propertyDestroyed(QtProperty *)), + this, SLOT(slotPropertyDestroyed(QtProperty *))); +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtRectFPropertyManager::~QtRectFPropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the manager that creates the nested \e x, \e y, \e width + and \e height subproperties. + + In order to provide editing widgets for the mentioned + subproperties in a property browser widget, this manager must be + associated with an editor factory. + + \sa QtAbstractPropertyBrowser::setFactoryForManager() +*/ +QtDoublePropertyManager *QtRectFPropertyManager::subDoublePropertyManager() const +{ + return d_ptr->m_doublePropertyManager; +} + +/*! + Returns the given \a property's value. + + If the given \a property is not managed by this manager, this + function returns an invalid rectangle. + + \sa setValue(), constraint() +*/ +QRectF QtRectFPropertyManager::value(const QtProperty *property) const +{ + return getValue(d_ptr->m_values, property); +} + +/*! + Returns the given \a property's precision, in decimals. + + \sa setDecimals() +*/ +int QtRectFPropertyManager::decimals(const QtProperty *property) const +{ + return getData(d_ptr->m_values, &QtRectFPropertyManagerPrivate::Data::decimals, property, 0); +} + +/*! + Returns the given \a property's constraining rectangle. If returned value is null QRectF it means there is no constraint applied. + + \sa value(), setConstraint() +*/ +QRectF QtRectFPropertyManager::constraint(const QtProperty *property) const +{ + return getData(d_ptr->m_values, &QtRectFPropertyManagerPrivate::Data::constraint, property, QRect()); +} + +/*! + \reimp +*/ +QString QtRectFPropertyManager::valueText(const QtProperty *property) const +{ + const QtRectFPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + const QRectF v = it.value().val; + const int dec = it.value().decimals; + return QString(tr("[(%1, %2), %3 x %4]").arg(QString::number(v.x(), 'f', dec)) + .arg(QString::number(v.y(), 'f', dec)) + .arg(QString::number(v.width(), 'f', dec)) + .arg(QString::number(v.height(), 'f', dec))); +} + +/*! + \fn void QtRectFPropertyManager::setValue(QtProperty *property, const QRectF &value) + + Sets the value of the given \a property to \a value. Nested + properties are updated automatically. + + If the specified \a value is not inside the given \a property's + constraining rectangle, the value is adjusted accordingly to fit + within the constraint. + + \sa value(), setConstraint(), valueChanged() +*/ +void QtRectFPropertyManager::setValue(QtProperty *property, const QRectF &val) +{ + const QtRectFPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + QtRectFPropertyManagerPrivate::Data data = it.value(); + + QRectF newRect = val.normalized(); + if (!data.constraint.isNull() && !data.constraint.contains(newRect)) { + const QRectF r1 = data.constraint; + const QRectF r2 = newRect; + newRect.setLeft(qMax(r1.left(), r2.left())); + newRect.setRight(qMin(r1.right(), r2.right())); + newRect.setTop(qMax(r1.top(), r2.top())); + newRect.setBottom(qMin(r1.bottom(), r2.bottom())); + if (newRect.width() < 0 || newRect.height() < 0) + return; + } + + if (data.val == newRect) + return; + + data.val = newRect; + + it.value() = data; + d_ptr->m_doublePropertyManager->setValue(d_ptr->m_propertyToX[property], newRect.x()); + d_ptr->m_doublePropertyManager->setValue(d_ptr->m_propertyToY[property], newRect.y()); + d_ptr->m_doublePropertyManager->setValue(d_ptr->m_propertyToW[property], newRect.width()); + d_ptr->m_doublePropertyManager->setValue(d_ptr->m_propertyToH[property], newRect.height()); + + emit propertyChanged(property); + emit valueChanged(property, data.val); +} + +/*! + Sets the given \a property's constraining rectangle to \a + constraint. + + When setting the constraint, the current value is adjusted if + necessary (ensuring that the current rectangle value is inside the + constraint). In order to reset the constraint pass a null QRectF value. + + \sa setValue(), constraint(), constraintChanged() +*/ +void QtRectFPropertyManager::setConstraint(QtProperty *property, const QRectF &constraint) +{ + const QtRectFPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + QtRectFPropertyManagerPrivate::Data data = it.value(); + + QRectF newConstraint = constraint.normalized(); + if (data.constraint == newConstraint) + return; + + const QRectF oldVal = data.val; + + data.constraint = newConstraint; + + if (!data.constraint.isNull() && !data.constraint.contains(oldVal)) { + QRectF r1 = data.constraint; + QRectF r2 = data.val; + + if (r2.width() > r1.width()) + r2.setWidth(r1.width()); + if (r2.height() > r1.height()) + r2.setHeight(r1.height()); + if (r2.left() < r1.left()) + r2.moveLeft(r1.left()); + else if (r2.right() > r1.right()) + r2.moveRight(r1.right()); + if (r2.top() < r1.top()) + r2.moveTop(r1.top()); + else if (r2.bottom() > r1.bottom()) + r2.moveBottom(r1.bottom()); + + data.val = r2; + } + + it.value() = data; + + emit constraintChanged(property, data.constraint); + + d_ptr->setConstraint(property, data.constraint, data.val); + + if (data.val == oldVal) + return; + + emit propertyChanged(property); + emit valueChanged(property, data.val); +} + +/*! + \fn void QtRectFPropertyManager::setDecimals(QtProperty *property, int prec) + + Sets the precision of the given \a property to \a prec. + + The valid decimal range is 0-13. The default is 2. + + \sa decimals() +*/ +void QtRectFPropertyManager::setDecimals(QtProperty *property, int prec) +{ + const QtRectFPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + QtRectFPropertyManagerPrivate::Data data = it.value(); + + if (prec > 13) + prec = 13; + else if (prec < 0) + prec = 0; + + if (data.decimals == prec) + return; + + data.decimals = prec; + d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToX[property], prec); + d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToY[property], prec); + d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToW[property], prec); + d_ptr->m_doublePropertyManager->setDecimals(d_ptr->m_propertyToH[property], prec); + + it.value() = data; + + emit decimalsChanged(property, data.decimals); +} + +/*! + \reimp +*/ +void QtRectFPropertyManager::initializeProperty(QtProperty *property) +{ + d_ptr->m_values[property] = QtRectFPropertyManagerPrivate::Data(); + + QtProperty *xProp = d_ptr->m_doublePropertyManager->addProperty(); + xProp->setPropertyName(tr("X")); + d_ptr->m_doublePropertyManager->setDecimals(xProp, decimals(property)); + d_ptr->m_doublePropertyManager->setValue(xProp, 0); + d_ptr->m_propertyToX[property] = xProp; + d_ptr->m_xToProperty[xProp] = property; + property->addSubProperty(xProp); + + QtProperty *yProp = d_ptr->m_doublePropertyManager->addProperty(); + yProp->setPropertyName(tr("Y")); + d_ptr->m_doublePropertyManager->setDecimals(yProp, decimals(property)); + d_ptr->m_doublePropertyManager->setValue(yProp, 0); + d_ptr->m_propertyToY[property] = yProp; + d_ptr->m_yToProperty[yProp] = property; + property->addSubProperty(yProp); + + QtProperty *wProp = d_ptr->m_doublePropertyManager->addProperty(); + wProp->setPropertyName(tr("Width")); + d_ptr->m_doublePropertyManager->setDecimals(wProp, decimals(property)); + d_ptr->m_doublePropertyManager->setValue(wProp, 0); + d_ptr->m_doublePropertyManager->setMinimum(wProp, 0); + d_ptr->m_propertyToW[property] = wProp; + d_ptr->m_wToProperty[wProp] = property; + property->addSubProperty(wProp); + + QtProperty *hProp = d_ptr->m_doublePropertyManager->addProperty(); + hProp->setPropertyName(tr("Height")); + d_ptr->m_doublePropertyManager->setDecimals(hProp, decimals(property)); + d_ptr->m_doublePropertyManager->setValue(hProp, 0); + d_ptr->m_doublePropertyManager->setMinimum(hProp, 0); + d_ptr->m_propertyToH[property] = hProp; + d_ptr->m_hToProperty[hProp] = property; + property->addSubProperty(hProp); +} + +/*! + \reimp +*/ +void QtRectFPropertyManager::uninitializeProperty(QtProperty *property) +{ + QtProperty *xProp = d_ptr->m_propertyToX[property]; + if (xProp) { + d_ptr->m_xToProperty.remove(xProp); + delete xProp; + } + d_ptr->m_propertyToX.remove(property); + + QtProperty *yProp = d_ptr->m_propertyToY[property]; + if (yProp) { + d_ptr->m_yToProperty.remove(yProp); + delete yProp; + } + d_ptr->m_propertyToY.remove(property); + + QtProperty *wProp = d_ptr->m_propertyToW[property]; + if (wProp) { + d_ptr->m_wToProperty.remove(wProp); + delete wProp; + } + d_ptr->m_propertyToW.remove(property); + + QtProperty *hProp = d_ptr->m_propertyToH[property]; + if (hProp) { + d_ptr->m_hToProperty.remove(hProp); + delete hProp; + } + d_ptr->m_propertyToH.remove(property); + + d_ptr->m_values.remove(property); +} + +// QtEnumPropertyManager + +class QtEnumPropertyManagerPrivate +{ + QtEnumPropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtEnumPropertyManager) +public: + + struct Data + { + Data() : val(-1) {} + int val; + QStringList enumNames; + QMap enumIcons; + }; + + typedef QMap PropertyValueMap; + PropertyValueMap m_values; +}; + +/*! + \class QtEnumPropertyManager + + \brief The QtEnumPropertyManager provides and manages enum properties. + + Each enum property has an associated list of enum names which can + be retrieved using the enumNames() function, and set using the + corresponding setEnumNames() function. An enum property's value is + represented by an index in this list, and can be retrieved and set + using the value() and setValue() slots respectively. + + Each enum value can also have an associated icon. The mapping from + values to icons can be set using the setEnumIcons() function and + queried with the enumIcons() function. + + In addition, QtEnumPropertyManager provides the valueChanged() signal + which is emitted whenever a property created by this manager + changes. The enumNamesChanged() or enumIconsChanged() signal is emitted + whenever the list of enum names or icons is altered. + + \sa QtAbstractPropertyManager, QtEnumEditorFactory +*/ + +/*! + \fn void QtEnumPropertyManager::valueChanged(QtProperty *property, int value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the new + \a value as parameters. + + \sa setValue() +*/ + +/*! + \fn void QtEnumPropertyManager::enumNamesChanged(QtProperty *property, const QStringList &names) + + This signal is emitted whenever a property created by this manager + changes its enum names, passing a pointer to the \a property and + the new \a names as parameters. + + \sa setEnumNames() +*/ + +/*! + \fn void QtEnumPropertyManager::enumIconsChanged(QtProperty *property, const QMap &icons) + + This signal is emitted whenever a property created by this manager + changes its enum icons, passing a pointer to the \a property and + the new mapping of values to \a icons as parameters. + + \sa setEnumIcons() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtEnumPropertyManager::QtEnumPropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtEnumPropertyManagerPrivate; + d_ptr->q_ptr = this; +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtEnumPropertyManager::~QtEnumPropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the given \a property's value which is an index in the + list returned by enumNames() + + If the given property is not managed by this manager, this + function returns -1. + + \sa enumNames(), setValue() +*/ +int QtEnumPropertyManager::value(const QtProperty *property) const +{ + return getValue(d_ptr->m_values, property, -1); +} + +/*! + Returns the given \a property's list of enum names. + + \sa value(), setEnumNames() +*/ +QStringList QtEnumPropertyManager::enumNames(const QtProperty *property) const +{ + return getData(d_ptr->m_values, &QtEnumPropertyManagerPrivate::Data::enumNames, property, QStringList()); +} + +/*! + Returns the given \a property's map of enum values to their icons. + + \sa value(), setEnumIcons() +*/ +QMap QtEnumPropertyManager::enumIcons(const QtProperty *property) const +{ + return getData >(d_ptr->m_values, &QtEnumPropertyManagerPrivate::Data::enumIcons, property, QMap()); +} + +/*! + \reimp +*/ +QString QtEnumPropertyManager::valueText(const QtProperty *property) const +{ + const QtEnumPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + + const QtEnumPropertyManagerPrivate::Data &data = it.value(); + + const int v = data.val; + if (v >= 0 && v < data.enumNames.count()) + return data.enumNames.at(v); + return QString(); +} + +/*! + \reimp +*/ +QIcon QtEnumPropertyManager::valueIcon(const QtProperty *property) const +{ + const QtEnumPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QIcon(); + + const QtEnumPropertyManagerPrivate::Data &data = it.value(); + + const int v = data.val; + return data.enumIcons.value(v); +} + +/*! + \fn void QtEnumPropertyManager::setValue(QtProperty *property, int value) + + Sets the value of the given \a property to \a value. + + The specified \a value must be less than the size of the given \a + property's enumNames() list, and larger than (or equal to) 0. + + \sa value(), valueChanged() +*/ +void QtEnumPropertyManager::setValue(QtProperty *property, int val) +{ + const QtEnumPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + QtEnumPropertyManagerPrivate::Data data = it.value(); + + if (val >= data.enumNames.count()) + return; + + if (val < 0 && data.enumNames.count() > 0) + return; + + if (val < 0) + val = -1; + + if (data.val == val) + return; + + data.val = val; + + it.value() = data; + + emit propertyChanged(property); + emit valueChanged(property, data.val); +} + +/*! + Sets the given \a property's list of enum names to \a + enumNames. The \a property's current value is reset to 0 + indicating the first item of the list. + + If the specified \a enumNames list is empty, the \a property's + current value is set to -1. + + \sa enumNames(), enumNamesChanged() +*/ +void QtEnumPropertyManager::setEnumNames(QtProperty *property, const QStringList &enumNames) +{ + const QtEnumPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + QtEnumPropertyManagerPrivate::Data data = it.value(); + + if (data.enumNames == enumNames) + return; + + data.enumNames = enumNames; + + data.val = -1; + + if (enumNames.count() > 0) + data.val = 0; + + it.value() = data; + + emit enumNamesChanged(property, data.enumNames); + + emit propertyChanged(property); + emit valueChanged(property, data.val); +} + +/*! + Sets the given \a property's map of enum values to their icons to \a + enumIcons. + + Each enum value can have associated icon. This association is represented with passed \a enumIcons map. + + \sa enumNames(), enumNamesChanged() +*/ +void QtEnumPropertyManager::setEnumIcons(QtProperty *property, const QMap &enumIcons) +{ + const QtEnumPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + it.value().enumIcons = enumIcons; + + emit enumIconsChanged(property, it.value().enumIcons); + + emit propertyChanged(property); +} + +/*! + \reimp +*/ +void QtEnumPropertyManager::initializeProperty(QtProperty *property) +{ + d_ptr->m_values[property] = QtEnumPropertyManagerPrivate::Data(); +} + +/*! + \reimp +*/ +void QtEnumPropertyManager::uninitializeProperty(QtProperty *property) +{ + d_ptr->m_values.remove(property); +} + +// QtFlagPropertyManager + +class QtFlagPropertyManagerPrivate +{ + QtFlagPropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtFlagPropertyManager) +public: + + void slotBoolChanged(QtProperty *property, bool value); + void slotPropertyDestroyed(QtProperty *property); + + struct Data + { + Data() : val(-1) {} + int val; + QStringList flagNames; + }; + + typedef QMap PropertyValueMap; + PropertyValueMap m_values; + + QtBoolPropertyManager *m_boolPropertyManager; + + QMap > m_propertyToFlags; + + QMap m_flagToProperty; +}; + +void QtFlagPropertyManagerPrivate::slotBoolChanged(QtProperty *property, bool value) +{ + QtProperty *prop = m_flagToProperty.value(property, 0); + if (prop == 0) + return; + + QListIterator itProp(m_propertyToFlags[prop]); + int level = 0; + while (itProp.hasNext()) { + QtProperty *p = itProp.next(); + if (p == property) { + int v = m_values[prop].val; + if (value) { + v |= (1 << level); + } else { + v &= ~(1 << level); + } + q_ptr->setValue(prop, v); + return; + } + level++; + } +} + +void QtFlagPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property) +{ + QtProperty *flagProperty = m_flagToProperty.value(property, 0); + if (flagProperty == 0) + return; + + m_propertyToFlags[flagProperty].replace(m_propertyToFlags[flagProperty].indexOf(property), 0); + m_flagToProperty.remove(property); +} + +/*! + \class QtFlagPropertyManager + + \brief The QtFlagPropertyManager provides and manages flag properties. + + Each flag property has an associated list of flag names which can + be retrieved using the flagNames() function, and set using the + corresponding setFlagNames() function. + + The flag manager provides properties with nested boolean + subproperties representing each flag, i.e. a flag property's value + is the binary combination of the subproperties' values. A + property's value can be retrieved and set using the value() and + setValue() slots respectively. The combination of flags is represented + by single int value - that's why it's possible to store up to + 32 independent flags in one flag property. + + The subproperties are created by a QtBoolPropertyManager object. This + manager can be retrieved using the subBoolPropertyManager() function. In + order to provide editing widgets for the subproperties in a + property browser widget, this manager must be associated with an + editor factory. + + In addition, QtFlagPropertyManager provides the valueChanged() signal + which is emitted whenever a property created by this manager + changes, and the flagNamesChanged() signal which is emitted + whenever the list of flag names is altered. + + \sa QtAbstractPropertyManager, QtBoolPropertyManager +*/ + +/*! + \fn void QtFlagPropertyManager::valueChanged(QtProperty *property, int value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the new + \a value as parameters. + + \sa setValue() +*/ + +/*! + \fn void QtFlagPropertyManager::flagNamesChanged(QtProperty *property, const QStringList &names) + + This signal is emitted whenever a property created by this manager + changes its flag names, passing a pointer to the \a property and the + new \a names as parameters. + + \sa setFlagNames() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtFlagPropertyManager::QtFlagPropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtFlagPropertyManagerPrivate; + d_ptr->q_ptr = this; + + d_ptr->m_boolPropertyManager = new QtBoolPropertyManager(this); + connect(d_ptr->m_boolPropertyManager, SIGNAL(valueChanged(QtProperty *, bool)), + this, SLOT(slotBoolChanged(QtProperty *, bool))); + connect(d_ptr->m_boolPropertyManager, SIGNAL(propertyDestroyed(QtProperty *)), + this, SLOT(slotPropertyDestroyed(QtProperty *))); +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtFlagPropertyManager::~QtFlagPropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the manager that produces the nested boolean subproperties + representing each flag. + + In order to provide editing widgets for the subproperties in a + property browser widget, this manager must be associated with an + editor factory. + + \sa QtAbstractPropertyBrowser::setFactoryForManager() +*/ +QtBoolPropertyManager *QtFlagPropertyManager::subBoolPropertyManager() const +{ + return d_ptr->m_boolPropertyManager; +} + +/*! + Returns the given \a property's value. + + If the given property is not managed by this manager, this + function returns 0. + + \sa flagNames(), setValue() +*/ +int QtFlagPropertyManager::value(const QtProperty *property) const +{ + return getValue(d_ptr->m_values, property, 0); +} + +/*! + Returns the given \a property's list of flag names. + + \sa value(), setFlagNames() +*/ +QStringList QtFlagPropertyManager::flagNames(const QtProperty *property) const +{ + return getData(d_ptr->m_values, &QtFlagPropertyManagerPrivate::Data::flagNames, property, QStringList()); +} + +/*! + \reimp +*/ +QString QtFlagPropertyManager::valueText(const QtProperty *property) const +{ + const QtFlagPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + + const QtFlagPropertyManagerPrivate::Data &data = it.value(); + + QString str; + int level = 0; + const QChar bar = QLatin1Char('|'); + const QStringList::const_iterator fncend = data.flagNames.constEnd(); + for (QStringList::const_iterator it = data.flagNames.constBegin(); it != fncend; ++it) { + if (data.val & (1 << level)) { + if (!str.isEmpty()) + str += bar; + str += *it; + } + + level++; + } + return str; +} + +/*! + \fn void QtFlagPropertyManager::setValue(QtProperty *property, int value) + + Sets the value of the given \a property to \a value. Nested + properties are updated automatically. + + The specified \a value must be less than the binary combination of + the property's flagNames() list size (i.e. less than 2\sup n, + where \c n is the size of the list) and larger than (or equal to) + 0. + + \sa value(), valueChanged() +*/ +void QtFlagPropertyManager::setValue(QtProperty *property, int val) +{ + const QtFlagPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + QtFlagPropertyManagerPrivate::Data data = it.value(); + + if (data.val == val) + return; + + if (val > (1 << data.flagNames.count()) - 1) + return; + + if (val < 0) + return; + + data.val = val; + + it.value() = data; + + QListIterator itProp(d_ptr->m_propertyToFlags[property]); + int level = 0; + while (itProp.hasNext()) { + QtProperty *prop = itProp.next(); + if (prop) + d_ptr->m_boolPropertyManager->setValue(prop, val & (1 << level)); + level++; + } + + emit propertyChanged(property); + emit valueChanged(property, data.val); +} + +/*! + Sets the given \a property's list of flag names to \a flagNames. The + property's current value is reset to 0 indicating the first item + of the list. + + \sa flagNames(), flagNamesChanged() +*/ +void QtFlagPropertyManager::setFlagNames(QtProperty *property, const QStringList &flagNames) +{ + const QtFlagPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + QtFlagPropertyManagerPrivate::Data data = it.value(); + + if (data.flagNames == flagNames) + return; + + data.flagNames = flagNames; + data.val = 0; + + it.value() = data; + + QListIterator itProp(d_ptr->m_propertyToFlags[property]); + while (itProp.hasNext()) { + QtProperty *prop = itProp.next(); + if (prop) { + delete prop; + d_ptr->m_flagToProperty.remove(prop); + } + } + d_ptr->m_propertyToFlags[property].clear(); + + QStringListIterator itFlag(flagNames); + while (itFlag.hasNext()) { + const QString flagName = itFlag.next(); + QtProperty *prop = d_ptr->m_boolPropertyManager->addProperty(); + prop->setPropertyName(flagName); + property->addSubProperty(prop); + d_ptr->m_propertyToFlags[property].append(prop); + d_ptr->m_flagToProperty[prop] = property; + } + + emit flagNamesChanged(property, data.flagNames); + + emit propertyChanged(property); + emit valueChanged(property, data.val); +} + +/*! + \reimp +*/ +void QtFlagPropertyManager::initializeProperty(QtProperty *property) +{ + d_ptr->m_values[property] = QtFlagPropertyManagerPrivate::Data(); + + d_ptr->m_propertyToFlags[property] = QList(); +} + +/*! + \reimp +*/ +void QtFlagPropertyManager::uninitializeProperty(QtProperty *property) +{ + QListIterator itProp(d_ptr->m_propertyToFlags[property]); + while (itProp.hasNext()) { + QtProperty *prop = itProp.next(); + if (prop) { + delete prop; + d_ptr->m_flagToProperty.remove(prop); + } + } + d_ptr->m_propertyToFlags.remove(property); + + d_ptr->m_values.remove(property); +} + +// QtSizePolicyPropertyManager + +class QtSizePolicyPropertyManagerPrivate +{ + QtSizePolicyPropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtSizePolicyPropertyManager) +public: + + QtSizePolicyPropertyManagerPrivate(); + + void slotIntChanged(QtProperty *property, int value); + void slotEnumChanged(QtProperty *property, int value); + void slotPropertyDestroyed(QtProperty *property); + + typedef QMap PropertyValueMap; + PropertyValueMap m_values; + + QtIntPropertyManager *m_intPropertyManager; + QtEnumPropertyManager *m_enumPropertyManager; + + QMap m_propertyToHPolicy; + QMap m_propertyToVPolicy; + QMap m_propertyToHStretch; + QMap m_propertyToVStretch; + + QMap m_hPolicyToProperty; + QMap m_vPolicyToProperty; + QMap m_hStretchToProperty; + QMap m_vStretchToProperty; +}; + +QtSizePolicyPropertyManagerPrivate::QtSizePolicyPropertyManagerPrivate() +{ +} + +void QtSizePolicyPropertyManagerPrivate::slotIntChanged(QtProperty *property, int value) +{ + if (QtProperty *prop = m_hStretchToProperty.value(property, 0)) { + QSizePolicy sp = m_values[prop]; + sp.setHorizontalStretch(value); + q_ptr->setValue(prop, sp); + } else if (QtProperty *prop = m_vStretchToProperty.value(property, 0)) { + QSizePolicy sp = m_values[prop]; + sp.setVerticalStretch(value); + q_ptr->setValue(prop, sp); + } +} + +void QtSizePolicyPropertyManagerPrivate::slotEnumChanged(QtProperty *property, int value) +{ + if (QtProperty *prop = m_hPolicyToProperty.value(property, 0)) { + QSizePolicy sp = m_values[prop]; + sp.setHorizontalPolicy(metaEnumProvider()->indexToSizePolicy(value)); + q_ptr->setValue(prop, sp); + } else if (QtProperty *prop = m_vPolicyToProperty.value(property, 0)) { + QSizePolicy sp = m_values[prop]; + sp.setVerticalPolicy(metaEnumProvider()->indexToSizePolicy(value)); + q_ptr->setValue(prop, sp); + } +} + +void QtSizePolicyPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property) +{ + if (QtProperty *pointProp = m_hStretchToProperty.value(property, 0)) { + m_propertyToHStretch[pointProp] = 0; + m_hStretchToProperty.remove(property); + } else if (QtProperty *pointProp = m_vStretchToProperty.value(property, 0)) { + m_propertyToVStretch[pointProp] = 0; + m_vStretchToProperty.remove(property); + } else if (QtProperty *pointProp = m_hPolicyToProperty.value(property, 0)) { + m_propertyToHPolicy[pointProp] = 0; + m_hPolicyToProperty.remove(property); + } else if (QtProperty *pointProp = m_vPolicyToProperty.value(property, 0)) { + m_propertyToVPolicy[pointProp] = 0; + m_vPolicyToProperty.remove(property); + } +} + +/*! + \class QtSizePolicyPropertyManager + + \brief The QtSizePolicyPropertyManager provides and manages QSizePolicy properties. + + A size policy property has nested \e horizontalPolicy, \e + verticalPolicy, \e horizontalStretch and \e verticalStretch + subproperties. The top-level property's value can be retrieved + using the value() function, and set using the setValue() slot. + + The subproperties are created by QtIntPropertyManager and QtEnumPropertyManager + objects. These managers can be retrieved using the subIntPropertyManager() + and subEnumPropertyManager() functions respectively. In order to provide + editing widgets for the subproperties in a property browser widget, + these managers must be associated with editor factories. + + In addition, QtSizePolicyPropertyManager provides the valueChanged() + signal which is emitted whenever a property created by this + manager changes. + + \sa QtAbstractPropertyManager, QtIntPropertyManager, QtEnumPropertyManager +*/ + +/*! + \fn void QtSizePolicyPropertyManager::valueChanged(QtProperty *property, const QSizePolicy &value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the + new \a value as parameters. + + \sa setValue() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtSizePolicyPropertyManager::QtSizePolicyPropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtSizePolicyPropertyManagerPrivate; + d_ptr->q_ptr = this; + + d_ptr->m_intPropertyManager = new QtIntPropertyManager(this); + connect(d_ptr->m_intPropertyManager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotIntChanged(QtProperty *, int))); + d_ptr->m_enumPropertyManager = new QtEnumPropertyManager(this); + connect(d_ptr->m_enumPropertyManager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotEnumChanged(QtProperty *, int))); + + connect(d_ptr->m_intPropertyManager, SIGNAL(propertyDestroyed(QtProperty *)), + this, SLOT(slotPropertyDestroyed(QtProperty *))); + connect(d_ptr->m_enumPropertyManager, SIGNAL(propertyDestroyed(QtProperty *)), + this, SLOT(slotPropertyDestroyed(QtProperty *))); +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtSizePolicyPropertyManager::~QtSizePolicyPropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the manager that creates the nested \e horizontalStretch + and \e verticalStretch subproperties. + + In order to provide editing widgets for the mentioned subproperties + in a property browser widget, this manager must be associated with + an editor factory. + + \sa QtAbstractPropertyBrowser::setFactoryForManager() +*/ +QtIntPropertyManager *QtSizePolicyPropertyManager::subIntPropertyManager() const +{ + return d_ptr->m_intPropertyManager; +} + +/*! + Returns the manager that creates the nested \e horizontalPolicy + and \e verticalPolicy subproperties. + + In order to provide editing widgets for the mentioned subproperties + in a property browser widget, this manager must be associated with + an editor factory. + + \sa QtAbstractPropertyBrowser::setFactoryForManager() +*/ +QtEnumPropertyManager *QtSizePolicyPropertyManager::subEnumPropertyManager() const +{ + return d_ptr->m_enumPropertyManager; +} + +/*! + Returns the given \a property's value. + + If the given property is not managed by this manager, this + function returns the default size policy. + + \sa setValue() +*/ +QSizePolicy QtSizePolicyPropertyManager::value(const QtProperty *property) const +{ + return d_ptr->m_values.value(property, QSizePolicy()); +} + +/*! + \reimp +*/ +QString QtSizePolicyPropertyManager::valueText(const QtProperty *property) const +{ + const QtSizePolicyPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + + const QSizePolicy sp = it.value(); + const QtMetaEnumProvider *mep = metaEnumProvider(); + const int hIndex = mep->sizePolicyToIndex(sp.horizontalPolicy()); + const int vIndex = mep->sizePolicyToIndex(sp.verticalPolicy()); + //! Unknown size policy on reading invalid uic3 files + const QString hPolicy = hIndex != -1 ? mep->policyEnumNames().at(hIndex) : tr(""); + const QString vPolicy = vIndex != -1 ? mep->policyEnumNames().at(vIndex) : tr(""); + const QString str = tr("[%1, %2, %3, %4]").arg(hPolicy, vPolicy).arg(sp.horizontalStretch()).arg(sp.verticalStretch()); + return str; +} + +/*! + \fn void QtSizePolicyPropertyManager::setValue(QtProperty *property, const QSizePolicy &value) + + Sets the value of the given \a property to \a value. Nested + properties are updated automatically. + + \sa value(), valueChanged() +*/ +void QtSizePolicyPropertyManager::setValue(QtProperty *property, const QSizePolicy &val) +{ + const QtSizePolicyPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + if (it.value() == val) + return; + + it.value() = val; + + d_ptr->m_enumPropertyManager->setValue(d_ptr->m_propertyToHPolicy[property], + metaEnumProvider()->sizePolicyToIndex(val.horizontalPolicy())); + d_ptr->m_enumPropertyManager->setValue(d_ptr->m_propertyToVPolicy[property], + metaEnumProvider()->sizePolicyToIndex(val.verticalPolicy())); + d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToHStretch[property], + val.horizontalStretch()); + d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToVStretch[property], + val.verticalStretch()); + + emit propertyChanged(property); + emit valueChanged(property, val); +} + +/*! + \reimp +*/ +void QtSizePolicyPropertyManager::initializeProperty(QtProperty *property) +{ + QSizePolicy val; + d_ptr->m_values[property] = val; + + QtProperty *hPolicyProp = d_ptr->m_enumPropertyManager->addProperty(); + hPolicyProp->setPropertyName(tr("Horizontal Policy")); + d_ptr->m_enumPropertyManager->setEnumNames(hPolicyProp, metaEnumProvider()->policyEnumNames()); + d_ptr->m_enumPropertyManager->setValue(hPolicyProp, + metaEnumProvider()->sizePolicyToIndex(val.horizontalPolicy())); + d_ptr->m_propertyToHPolicy[property] = hPolicyProp; + d_ptr->m_hPolicyToProperty[hPolicyProp] = property; + property->addSubProperty(hPolicyProp); + + QtProperty *vPolicyProp = d_ptr->m_enumPropertyManager->addProperty(); + vPolicyProp->setPropertyName(tr("Vertical Policy")); + d_ptr->m_enumPropertyManager->setEnumNames(vPolicyProp, metaEnumProvider()->policyEnumNames()); + d_ptr->m_enumPropertyManager->setValue(vPolicyProp, + metaEnumProvider()->sizePolicyToIndex(val.verticalPolicy())); + d_ptr->m_propertyToVPolicy[property] = vPolicyProp; + d_ptr->m_vPolicyToProperty[vPolicyProp] = property; + property->addSubProperty(vPolicyProp); + + QtProperty *hStretchProp = d_ptr->m_intPropertyManager->addProperty(); + hStretchProp->setPropertyName(tr("Horizontal Stretch")); + d_ptr->m_intPropertyManager->setValue(hStretchProp, val.horizontalStretch()); + d_ptr->m_intPropertyManager->setRange(hStretchProp, 0, 0xff); + d_ptr->m_propertyToHStretch[property] = hStretchProp; + d_ptr->m_hStretchToProperty[hStretchProp] = property; + property->addSubProperty(hStretchProp); + + QtProperty *vStretchProp = d_ptr->m_intPropertyManager->addProperty(); + vStretchProp->setPropertyName(tr("Vertical Stretch")); + d_ptr->m_intPropertyManager->setValue(vStretchProp, val.verticalStretch()); + d_ptr->m_intPropertyManager->setRange(vStretchProp, 0, 0xff); + d_ptr->m_propertyToVStretch[property] = vStretchProp; + d_ptr->m_vStretchToProperty[vStretchProp] = property; + property->addSubProperty(vStretchProp); + +} + +/*! + \reimp +*/ +void QtSizePolicyPropertyManager::uninitializeProperty(QtProperty *property) +{ + QtProperty *hPolicyProp = d_ptr->m_propertyToHPolicy[property]; + if (hPolicyProp) { + d_ptr->m_hPolicyToProperty.remove(hPolicyProp); + delete hPolicyProp; + } + d_ptr->m_propertyToHPolicy.remove(property); + + QtProperty *vPolicyProp = d_ptr->m_propertyToVPolicy[property]; + if (vPolicyProp) { + d_ptr->m_vPolicyToProperty.remove(vPolicyProp); + delete vPolicyProp; + } + d_ptr->m_propertyToVPolicy.remove(property); + + QtProperty *hStretchProp = d_ptr->m_propertyToHStretch[property]; + if (hStretchProp) { + d_ptr->m_hStretchToProperty.remove(hStretchProp); + delete hStretchProp; + } + d_ptr->m_propertyToHStretch.remove(property); + + QtProperty *vStretchProp = d_ptr->m_propertyToVStretch[property]; + if (vStretchProp) { + d_ptr->m_vStretchToProperty.remove(vStretchProp); + delete vStretchProp; + } + d_ptr->m_propertyToVStretch.remove(property); + + d_ptr->m_values.remove(property); +} + +// QtFontPropertyManager: +// QtFontPropertyManagerPrivate has a mechanism for reacting +// to QApplication::fontDatabaseChanged() [4.5], which is emitted +// when someone loads an application font. The signals are compressed +// using a timer with interval 0, which then causes the family +// enumeration manager to re-set its strings and index values +// for each property. + +Q_GLOBAL_STATIC(QFontDatabase, fontDatabase) + +class QtFontPropertyManagerPrivate +{ + QtFontPropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtFontPropertyManager) +public: + + QtFontPropertyManagerPrivate(); + + void slotIntChanged(QtProperty *property, int value); + void slotEnumChanged(QtProperty *property, int value); + void slotBoolChanged(QtProperty *property, bool value); + void slotPropertyDestroyed(QtProperty *property); + void slotFontDatabaseChanged(); + void slotFontDatabaseDelayedChange(); + + QStringList m_familyNames; + + typedef QMap PropertyValueMap; + PropertyValueMap m_values; + + QtIntPropertyManager *m_intPropertyManager; + QtEnumPropertyManager *m_enumPropertyManager; + QtBoolPropertyManager *m_boolPropertyManager; + + QMap m_propertyToFamily; + QMap m_propertyToPointSize; + QMap m_propertyToBold; + QMap m_propertyToItalic; + QMap m_propertyToUnderline; + QMap m_propertyToStrikeOut; + QMap m_propertyToKerning; + + QMap m_familyToProperty; + QMap m_pointSizeToProperty; + QMap m_boldToProperty; + QMap m_italicToProperty; + QMap m_underlineToProperty; + QMap m_strikeOutToProperty; + QMap m_kerningToProperty; + + bool m_settingValue; + QTimer *m_fontDatabaseChangeTimer; +}; + +QtFontPropertyManagerPrivate::QtFontPropertyManagerPrivate() : + m_settingValue(false), + m_fontDatabaseChangeTimer(0) +{ +} + +void QtFontPropertyManagerPrivate::slotIntChanged(QtProperty *property, int value) +{ + if (m_settingValue) + return; + if (QtProperty *prop = m_pointSizeToProperty.value(property, 0)) { + QFont f = m_values[prop]; + f.setPointSize(value); + q_ptr->setValue(prop, f); + } +} + +void QtFontPropertyManagerPrivate::slotEnumChanged(QtProperty *property, int value) +{ + if (m_settingValue) + return; + if (QtProperty *prop = m_familyToProperty.value(property, 0)) { + QFont f = m_values[prop]; + f.setFamily(m_familyNames.at(value)); + q_ptr->setValue(prop, f); + } +} + +void QtFontPropertyManagerPrivate::slotBoolChanged(QtProperty *property, bool value) +{ + if (m_settingValue) + return; + if (QtProperty *prop = m_boldToProperty.value(property, 0)) { + QFont f = m_values[prop]; + f.setBold(value); + q_ptr->setValue(prop, f); + } else if (QtProperty *prop = m_italicToProperty.value(property, 0)) { + QFont f = m_values[prop]; + f.setItalic(value); + q_ptr->setValue(prop, f); + } else if (QtProperty *prop = m_underlineToProperty.value(property, 0)) { + QFont f = m_values[prop]; + f.setUnderline(value); + q_ptr->setValue(prop, f); + } else if (QtProperty *prop = m_strikeOutToProperty.value(property, 0)) { + QFont f = m_values[prop]; + f.setStrikeOut(value); + q_ptr->setValue(prop, f); + } else if (QtProperty *prop = m_kerningToProperty.value(property, 0)) { + QFont f = m_values[prop]; + f.setKerning(value); + q_ptr->setValue(prop, f); + } +} + +void QtFontPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property) +{ + if (QtProperty *pointProp = m_pointSizeToProperty.value(property, 0)) { + m_propertyToPointSize[pointProp] = 0; + m_pointSizeToProperty.remove(property); + } else if (QtProperty *pointProp = m_familyToProperty.value(property, 0)) { + m_propertyToFamily[pointProp] = 0; + m_familyToProperty.remove(property); + } else if (QtProperty *pointProp = m_boldToProperty.value(property, 0)) { + m_propertyToBold[pointProp] = 0; + m_boldToProperty.remove(property); + } else if (QtProperty *pointProp = m_italicToProperty.value(property, 0)) { + m_propertyToItalic[pointProp] = 0; + m_italicToProperty.remove(property); + } else if (QtProperty *pointProp = m_underlineToProperty.value(property, 0)) { + m_propertyToUnderline[pointProp] = 0; + m_underlineToProperty.remove(property); + } else if (QtProperty *pointProp = m_strikeOutToProperty.value(property, 0)) { + m_propertyToStrikeOut[pointProp] = 0; + m_strikeOutToProperty.remove(property); + } else if (QtProperty *pointProp = m_kerningToProperty.value(property, 0)) { + m_propertyToKerning[pointProp] = 0; + m_kerningToProperty.remove(property); + } +} + +void QtFontPropertyManagerPrivate::slotFontDatabaseChanged() +{ + if (!m_fontDatabaseChangeTimer) { + m_fontDatabaseChangeTimer = new QTimer(q_ptr); + m_fontDatabaseChangeTimer->setInterval(0); + m_fontDatabaseChangeTimer->setSingleShot(true); + QObject::connect(m_fontDatabaseChangeTimer, SIGNAL(timeout()), q_ptr, SLOT(slotFontDatabaseDelayedChange())); + } + if (!m_fontDatabaseChangeTimer->isActive()) + m_fontDatabaseChangeTimer->start(); +} + +void QtFontPropertyManagerPrivate::slotFontDatabaseDelayedChange() +{ + typedef QMap PropertyPropertyMap; + // rescan available font names + const QStringList oldFamilies = m_familyNames; + m_familyNames = fontDatabase()->families(); + + // Adapt all existing properties + if (!m_propertyToFamily.empty()) { + PropertyPropertyMap::const_iterator cend = m_propertyToFamily.constEnd(); + for (PropertyPropertyMap::const_iterator it = m_propertyToFamily.constBegin(); it != cend; ++it) { + QtProperty *familyProp = it.value(); + const int oldIdx = m_enumPropertyManager->value(familyProp); + int newIdx = m_familyNames.indexOf(oldFamilies.at(oldIdx)); + if (newIdx < 0) + newIdx = 0; + m_enumPropertyManager->setEnumNames(familyProp, m_familyNames); + m_enumPropertyManager->setValue(familyProp, newIdx); + } + } +} + +/*! + \class QtFontPropertyManager + + \brief The QtFontPropertyManager provides and manages QFont properties. + + A font property has nested \e family, \e pointSize, \e bold, \e + italic, \e underline, \e strikeOut and \e kerning subproperties. The top-level + property's value can be retrieved using the value() function, and + set using the setValue() slot. + + The subproperties are created by QtIntPropertyManager, QtEnumPropertyManager and + QtBoolPropertyManager objects. These managers can be retrieved using the + corresponding subIntPropertyManager(), subEnumPropertyManager() and + subBoolPropertyManager() functions. In order to provide editing widgets + for the subproperties in a property browser widget, these managers + must be associated with editor factories. + + In addition, QtFontPropertyManager provides the valueChanged() signal + which is emitted whenever a property created by this manager + changes. + + \sa QtAbstractPropertyManager, QtEnumPropertyManager, QtIntPropertyManager, QtBoolPropertyManager +*/ + +/*! + \fn void QtFontPropertyManager::valueChanged(QtProperty *property, const QFont &value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the + new \a value as parameters. + + \sa setValue() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtFontPropertyManager::QtFontPropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtFontPropertyManagerPrivate; + d_ptr->q_ptr = this; +#if QT_VERSION >= 0x040500 + QObject::connect(qApp, SIGNAL(fontDatabaseChanged()), this, SLOT(slotFontDatabaseChanged())); +#endif + + d_ptr->m_intPropertyManager = new QtIntPropertyManager(this); + connect(d_ptr->m_intPropertyManager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotIntChanged(QtProperty *, int))); + d_ptr->m_enumPropertyManager = new QtEnumPropertyManager(this); + connect(d_ptr->m_enumPropertyManager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotEnumChanged(QtProperty *, int))); + d_ptr->m_boolPropertyManager = new QtBoolPropertyManager(this); + connect(d_ptr->m_boolPropertyManager, SIGNAL(valueChanged(QtProperty *, bool)), + this, SLOT(slotBoolChanged(QtProperty *, bool))); + + connect(d_ptr->m_intPropertyManager, SIGNAL(propertyDestroyed(QtProperty *)), + this, SLOT(slotPropertyDestroyed(QtProperty *))); + connect(d_ptr->m_enumPropertyManager, SIGNAL(propertyDestroyed(QtProperty *)), + this, SLOT(slotPropertyDestroyed(QtProperty *))); + connect(d_ptr->m_boolPropertyManager, SIGNAL(propertyDestroyed(QtProperty *)), + this, SLOT(slotPropertyDestroyed(QtProperty *))); +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtFontPropertyManager::~QtFontPropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the manager that creates the \e pointSize subproperty. + + In order to provide editing widgets for the \e pointSize property + in a property browser widget, this manager must be associated + with an editor factory. + + \sa QtAbstractPropertyBrowser::setFactoryForManager() +*/ +QtIntPropertyManager *QtFontPropertyManager::subIntPropertyManager() const +{ + return d_ptr->m_intPropertyManager; +} + +/*! + Returns the manager that create the \e family subproperty. + + In order to provide editing widgets for the \e family property + in a property browser widget, this manager must be associated + with an editor factory. + + \sa QtAbstractPropertyBrowser::setFactoryForManager() +*/ +QtEnumPropertyManager *QtFontPropertyManager::subEnumPropertyManager() const +{ + return d_ptr->m_enumPropertyManager; +} + +/*! + Returns the manager that creates the \e bold, \e italic, \e underline, + \e strikeOut and \e kerning subproperties. + + In order to provide editing widgets for the mentioned properties + in a property browser widget, this manager must be associated with + an editor factory. + + \sa QtAbstractPropertyBrowser::setFactoryForManager() +*/ +QtBoolPropertyManager *QtFontPropertyManager::subBoolPropertyManager() const +{ + return d_ptr->m_boolPropertyManager; +} + +/*! + Returns the given \a property's value. + + If the given property is not managed by this manager, this + function returns a font object that uses the application's default + font. + + \sa setValue() +*/ +QFont QtFontPropertyManager::value(const QtProperty *property) const +{ + return d_ptr->m_values.value(property, QFont()); +} + +/*! + \reimp +*/ +QString QtFontPropertyManager::valueText(const QtProperty *property) const +{ + const QtFontPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + + return QtPropertyBrowserUtils::fontValueText(it.value()); +} + +/*! + \reimp +*/ +QIcon QtFontPropertyManager::valueIcon(const QtProperty *property) const +{ + const QtFontPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QIcon(); + + return QtPropertyBrowserUtils::fontValueIcon(it.value()); +} + +/*! + \fn void QtFontPropertyManager::setValue(QtProperty *property, const QFont &value) + + Sets the value of the given \a property to \a value. Nested + properties are updated automatically. + + \sa value(), valueChanged() +*/ +void QtFontPropertyManager::setValue(QtProperty *property, const QFont &val) +{ + const QtFontPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + const QFont oldVal = it.value(); + if (oldVal == val && oldVal.resolve() == val.resolve()) + return; + + it.value() = val; + + int idx = d_ptr->m_familyNames.indexOf(val.family()); + if (idx == -1) + idx = 0; + bool settingValue = d_ptr->m_settingValue; + d_ptr->m_settingValue = true; + d_ptr->m_enumPropertyManager->setValue(d_ptr->m_propertyToFamily[property], idx); + d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToPointSize[property], val.pointSize()); + d_ptr->m_boolPropertyManager->setValue(d_ptr->m_propertyToBold[property], val.bold()); + d_ptr->m_boolPropertyManager->setValue(d_ptr->m_propertyToItalic[property], val.italic()); + d_ptr->m_boolPropertyManager->setValue(d_ptr->m_propertyToUnderline[property], val.underline()); + d_ptr->m_boolPropertyManager->setValue(d_ptr->m_propertyToStrikeOut[property], val.strikeOut()); + d_ptr->m_boolPropertyManager->setValue(d_ptr->m_propertyToKerning[property], val.kerning()); + d_ptr->m_settingValue = settingValue; + + emit propertyChanged(property); + emit valueChanged(property, val); +} + +/*! + \reimp +*/ +void QtFontPropertyManager::initializeProperty(QtProperty *property) +{ + QFont val; + d_ptr->m_values[property] = val; + + QtProperty *familyProp = d_ptr->m_enumPropertyManager->addProperty(); + familyProp->setPropertyName(tr("Family")); + if (d_ptr->m_familyNames.empty()) + d_ptr->m_familyNames = fontDatabase()->families(); + d_ptr->m_enumPropertyManager->setEnumNames(familyProp, d_ptr->m_familyNames); + int idx = d_ptr->m_familyNames.indexOf(val.family()); + if (idx == -1) + idx = 0; + d_ptr->m_enumPropertyManager->setValue(familyProp, idx); + d_ptr->m_propertyToFamily[property] = familyProp; + d_ptr->m_familyToProperty[familyProp] = property; + property->addSubProperty(familyProp); + + QtProperty *pointSizeProp = d_ptr->m_intPropertyManager->addProperty(); + pointSizeProp->setPropertyName(tr("Point Size")); + d_ptr->m_intPropertyManager->setValue(pointSizeProp, val.pointSize()); + d_ptr->m_intPropertyManager->setMinimum(pointSizeProp, 1); + d_ptr->m_propertyToPointSize[property] = pointSizeProp; + d_ptr->m_pointSizeToProperty[pointSizeProp] = property; + property->addSubProperty(pointSizeProp); + + QtProperty *boldProp = d_ptr->m_boolPropertyManager->addProperty(); + boldProp->setPropertyName(tr("Bold")); + d_ptr->m_boolPropertyManager->setValue(boldProp, val.bold()); + d_ptr->m_propertyToBold[property] = boldProp; + d_ptr->m_boldToProperty[boldProp] = property; + property->addSubProperty(boldProp); + + QtProperty *italicProp = d_ptr->m_boolPropertyManager->addProperty(); + italicProp->setPropertyName(tr("Italic")); + d_ptr->m_boolPropertyManager->setValue(italicProp, val.italic()); + d_ptr->m_propertyToItalic[property] = italicProp; + d_ptr->m_italicToProperty[italicProp] = property; + property->addSubProperty(italicProp); + + QtProperty *underlineProp = d_ptr->m_boolPropertyManager->addProperty(); + underlineProp->setPropertyName(tr("Underline")); + d_ptr->m_boolPropertyManager->setValue(underlineProp, val.underline()); + d_ptr->m_propertyToUnderline[property] = underlineProp; + d_ptr->m_underlineToProperty[underlineProp] = property; + property->addSubProperty(underlineProp); + + QtProperty *strikeOutProp = d_ptr->m_boolPropertyManager->addProperty(); + strikeOutProp->setPropertyName(tr("Strikeout")); + d_ptr->m_boolPropertyManager->setValue(strikeOutProp, val.strikeOut()); + d_ptr->m_propertyToStrikeOut[property] = strikeOutProp; + d_ptr->m_strikeOutToProperty[strikeOutProp] = property; + property->addSubProperty(strikeOutProp); + + QtProperty *kerningProp = d_ptr->m_boolPropertyManager->addProperty(); + kerningProp->setPropertyName(tr("Kerning")); + d_ptr->m_boolPropertyManager->setValue(kerningProp, val.kerning()); + d_ptr->m_propertyToKerning[property] = kerningProp; + d_ptr->m_kerningToProperty[kerningProp] = property; + property->addSubProperty(kerningProp); +} + +/*! + \reimp +*/ +void QtFontPropertyManager::uninitializeProperty(QtProperty *property) +{ + QtProperty *familyProp = d_ptr->m_propertyToFamily[property]; + if (familyProp) { + d_ptr->m_familyToProperty.remove(familyProp); + delete familyProp; + } + d_ptr->m_propertyToFamily.remove(property); + + QtProperty *pointSizeProp = d_ptr->m_propertyToPointSize[property]; + if (pointSizeProp) { + d_ptr->m_pointSizeToProperty.remove(pointSizeProp); + delete pointSizeProp; + } + d_ptr->m_propertyToPointSize.remove(property); + + QtProperty *boldProp = d_ptr->m_propertyToBold[property]; + if (boldProp) { + d_ptr->m_boldToProperty.remove(boldProp); + delete boldProp; + } + d_ptr->m_propertyToBold.remove(property); + + QtProperty *italicProp = d_ptr->m_propertyToItalic[property]; + if (italicProp) { + d_ptr->m_italicToProperty.remove(italicProp); + delete italicProp; + } + d_ptr->m_propertyToItalic.remove(property); + + QtProperty *underlineProp = d_ptr->m_propertyToUnderline[property]; + if (underlineProp) { + d_ptr->m_underlineToProperty.remove(underlineProp); + delete underlineProp; + } + d_ptr->m_propertyToUnderline.remove(property); + + QtProperty *strikeOutProp = d_ptr->m_propertyToStrikeOut[property]; + if (strikeOutProp) { + d_ptr->m_strikeOutToProperty.remove(strikeOutProp); + delete strikeOutProp; + } + d_ptr->m_propertyToStrikeOut.remove(property); + + QtProperty *kerningProp = d_ptr->m_propertyToKerning[property]; + if (kerningProp) { + d_ptr->m_kerningToProperty.remove(kerningProp); + delete kerningProp; + } + d_ptr->m_propertyToKerning.remove(property); + + d_ptr->m_values.remove(property); +} + +// QtColorPropertyManager + +class QtColorPropertyManagerPrivate +{ + QtColorPropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtColorPropertyManager) +public: + + void slotIntChanged(QtProperty *property, int value); + void slotPropertyDestroyed(QtProperty *property); + + typedef QMap PropertyValueMap; + PropertyValueMap m_values; + + QtIntPropertyManager *m_intPropertyManager; + + QMap m_propertyToR; + QMap m_propertyToG; + QMap m_propertyToB; + QMap m_propertyToA; + + QMap m_rToProperty; + QMap m_gToProperty; + QMap m_bToProperty; + QMap m_aToProperty; +}; + +void QtColorPropertyManagerPrivate::slotIntChanged(QtProperty *property, int value) +{ + if (QtProperty *prop = m_rToProperty.value(property, 0)) { + QColor c = m_values[prop]; + c.setRed(value); + q_ptr->setValue(prop, c); + } else if (QtProperty *prop = m_gToProperty.value(property, 0)) { + QColor c = m_values[prop]; + c.setGreen(value); + q_ptr->setValue(prop, c); + } else if (QtProperty *prop = m_bToProperty.value(property, 0)) { + QColor c = m_values[prop]; + c.setBlue(value); + q_ptr->setValue(prop, c); + } else if (QtProperty *prop = m_aToProperty.value(property, 0)) { + QColor c = m_values[prop]; + c.setAlpha(value); + q_ptr->setValue(prop, c); + } +} + +void QtColorPropertyManagerPrivate::slotPropertyDestroyed(QtProperty *property) +{ + if (QtProperty *pointProp = m_rToProperty.value(property, 0)) { + m_propertyToR[pointProp] = 0; + m_rToProperty.remove(property); + } else if (QtProperty *pointProp = m_gToProperty.value(property, 0)) { + m_propertyToG[pointProp] = 0; + m_gToProperty.remove(property); + } else if (QtProperty *pointProp = m_bToProperty.value(property, 0)) { + m_propertyToB[pointProp] = 0; + m_bToProperty.remove(property); + } else if (QtProperty *pointProp = m_aToProperty.value(property, 0)) { + m_propertyToA[pointProp] = 0; + m_aToProperty.remove(property); + } +} + +/*! + \class QtColorPropertyManager + + \brief The QtColorPropertyManager provides and manages QColor properties. + + A color property has nested \e red, \e green and \e blue + subproperties. The top-level property's value can be retrieved + using the value() function, and set using the setValue() slot. + + The subproperties are created by a QtIntPropertyManager object. This + manager can be retrieved using the subIntPropertyManager() function. In + order to provide editing widgets for the subproperties in a + property browser widget, this manager must be associated with an + editor factory. + + In addition, QtColorPropertyManager provides the valueChanged() signal + which is emitted whenever a property created by this manager + changes. + + \sa QtAbstractPropertyManager, QtAbstractPropertyBrowser, QtIntPropertyManager +*/ + +/*! + \fn void QtColorPropertyManager::valueChanged(QtProperty *property, const QColor &value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the new + \a value as parameters. + + \sa setValue() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtColorPropertyManager::QtColorPropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtColorPropertyManagerPrivate; + d_ptr->q_ptr = this; + + d_ptr->m_intPropertyManager = new QtIntPropertyManager(this); + connect(d_ptr->m_intPropertyManager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotIntChanged(QtProperty *, int))); + + connect(d_ptr->m_intPropertyManager, SIGNAL(propertyDestroyed(QtProperty *)), + this, SLOT(slotPropertyDestroyed(QtProperty *))); +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtColorPropertyManager::~QtColorPropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the manager that produces the nested \e red, \e green and + \e blue subproperties. + + In order to provide editing widgets for the subproperties in a + property browser widget, this manager must be associated with an + editor factory. + + \sa QtAbstractPropertyBrowser::setFactoryForManager() +*/ +QtIntPropertyManager *QtColorPropertyManager::subIntPropertyManager() const +{ + return d_ptr->m_intPropertyManager; +} + +/*! + Returns the given \a property's value. + + If the given \a property is not managed by \e this manager, this + function returns an invalid color. + + \sa setValue() +*/ +QColor QtColorPropertyManager::value(const QtProperty *property) const +{ + return d_ptr->m_values.value(property, QColor()); +} + +/*! + \reimp +*/ + +QString QtColorPropertyManager::valueText(const QtProperty *property) const +{ + const QtColorPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + + return QtPropertyBrowserUtils::colorValueText(it.value()); +} + +/*! + \reimp +*/ + +QIcon QtColorPropertyManager::valueIcon(const QtProperty *property) const +{ + const QtColorPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QIcon(); + return QtPropertyBrowserUtils::brushValueIcon(QBrush(it.value())); +} + +/*! + \fn void QtColorPropertyManager::setValue(QtProperty *property, const QColor &value) + + Sets the value of the given \a property to \a value. Nested + properties are updated automatically. + + \sa value(), valueChanged() +*/ +void QtColorPropertyManager::setValue(QtProperty *property, const QColor &val) +{ + const QtColorPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + if (it.value() == val) + return; + + it.value() = val; + + d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToR[property], val.red()); + d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToG[property], val.green()); + d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToB[property], val.blue()); + d_ptr->m_intPropertyManager->setValue(d_ptr->m_propertyToA[property], val.alpha()); + + emit propertyChanged(property); + emit valueChanged(property, val); +} + +/*! + \reimp +*/ +void QtColorPropertyManager::initializeProperty(QtProperty *property) +{ + QColor val; + d_ptr->m_values[property] = val; + + QtProperty *rProp = d_ptr->m_intPropertyManager->addProperty(); + rProp->setPropertyName(tr("Red")); + d_ptr->m_intPropertyManager->setValue(rProp, val.red()); + d_ptr->m_intPropertyManager->setRange(rProp, 0, 0xFF); + d_ptr->m_propertyToR[property] = rProp; + d_ptr->m_rToProperty[rProp] = property; + property->addSubProperty(rProp); + + QtProperty *gProp = d_ptr->m_intPropertyManager->addProperty(); + gProp->setPropertyName(tr("Green")); + d_ptr->m_intPropertyManager->setValue(gProp, val.green()); + d_ptr->m_intPropertyManager->setRange(gProp, 0, 0xFF); + d_ptr->m_propertyToG[property] = gProp; + d_ptr->m_gToProperty[gProp] = property; + property->addSubProperty(gProp); + + QtProperty *bProp = d_ptr->m_intPropertyManager->addProperty(); + bProp->setPropertyName(tr("Blue")); + d_ptr->m_intPropertyManager->setValue(bProp, val.blue()); + d_ptr->m_intPropertyManager->setRange(bProp, 0, 0xFF); + d_ptr->m_propertyToB[property] = bProp; + d_ptr->m_bToProperty[bProp] = property; + property->addSubProperty(bProp); + + QtProperty *aProp = d_ptr->m_intPropertyManager->addProperty(); + aProp->setPropertyName(tr("Alpha")); + d_ptr->m_intPropertyManager->setValue(aProp, val.alpha()); + d_ptr->m_intPropertyManager->setRange(aProp, 0, 0xFF); + d_ptr->m_propertyToA[property] = aProp; + d_ptr->m_aToProperty[aProp] = property; + property->addSubProperty(aProp); +} + +/*! + \reimp +*/ +void QtColorPropertyManager::uninitializeProperty(QtProperty *property) +{ + QtProperty *rProp = d_ptr->m_propertyToR[property]; + if (rProp) { + d_ptr->m_rToProperty.remove(rProp); + delete rProp; + } + d_ptr->m_propertyToR.remove(property); + + QtProperty *gProp = d_ptr->m_propertyToG[property]; + if (gProp) { + d_ptr->m_gToProperty.remove(gProp); + delete gProp; + } + d_ptr->m_propertyToG.remove(property); + + QtProperty *bProp = d_ptr->m_propertyToB[property]; + if (bProp) { + d_ptr->m_bToProperty.remove(bProp); + delete bProp; + } + d_ptr->m_propertyToB.remove(property); + + QtProperty *aProp = d_ptr->m_propertyToA[property]; + if (aProp) { + d_ptr->m_aToProperty.remove(aProp); + delete aProp; + } + d_ptr->m_propertyToA.remove(property); + + d_ptr->m_values.remove(property); +} + +// QtCursorPropertyManager + +Q_GLOBAL_STATIC(QtCursorDatabase, cursorDatabase) + +class QtCursorPropertyManagerPrivate +{ + QtCursorPropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtCursorPropertyManager) +public: + typedef QMap PropertyValueMap; + PropertyValueMap m_values; +}; + +/*! + \class QtCursorPropertyManager + + \brief The QtCursorPropertyManager provides and manages QCursor properties. + + A cursor property has a current value which can be + retrieved using the value() function, and set using the setValue() + slot. In addition, QtCursorPropertyManager provides the + valueChanged() signal which is emitted whenever a property created + by this manager changes. + + \sa QtAbstractPropertyManager +*/ + +/*! + \fn void QtCursorPropertyManager::valueChanged(QtProperty *property, const QCursor &value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the new + \a value as parameters. + + \sa setValue() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtCursorPropertyManager::QtCursorPropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtCursorPropertyManagerPrivate; + d_ptr->q_ptr = this; +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtCursorPropertyManager::~QtCursorPropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the given \a property's value. + + If the given \a property is not managed by this manager, this + function returns a default QCursor object. + + \sa setValue() +*/ +#ifndef QT_NO_CURSOR +QCursor QtCursorPropertyManager::value(const QtProperty *property) const +{ + return d_ptr->m_values.value(property, QCursor()); +} +#endif + +/*! + \reimp +*/ +QString QtCursorPropertyManager::valueText(const QtProperty *property) const +{ + const QtCursorPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QString(); + + return cursorDatabase()->cursorToShapeName(it.value()); +} + +/*! + \reimp +*/ +QIcon QtCursorPropertyManager::valueIcon(const QtProperty *property) const +{ + const QtCursorPropertyManagerPrivate::PropertyValueMap::const_iterator it = d_ptr->m_values.constFind(property); + if (it == d_ptr->m_values.constEnd()) + return QIcon(); + + return cursorDatabase()->cursorToShapeIcon(it.value()); +} + +/*! + \fn void QtCursorPropertyManager::setValue(QtProperty *property, const QCursor &value) + + Sets the value of the given \a property to \a value. + + \sa value(), valueChanged() +*/ +void QtCursorPropertyManager::setValue(QtProperty *property, const QCursor &value) +{ +#ifndef QT_NO_CURSOR + const QtCursorPropertyManagerPrivate::PropertyValueMap::iterator it = d_ptr->m_values.find(property); + if (it == d_ptr->m_values.end()) + return; + + if (it.value().shape() == value.shape() && value.shape() != Qt::BitmapCursor) + return; + + it.value() = value; + + emit propertyChanged(property); + emit valueChanged(property, value); +#endif +} + +/*! + \reimp +*/ +void QtCursorPropertyManager::initializeProperty(QtProperty *property) +{ +#ifndef QT_NO_CURSOR + d_ptr->m_values[property] = QCursor(); +#endif +} + +/*! + \reimp +*/ +void QtCursorPropertyManager::uninitializeProperty(QtProperty *property) +{ + d_ptr->m_values.remove(property); +} + +#if QT_VERSION >= 0x040400 +QT_END_NAMESPACE +#endif + +#include "moc_qtpropertymanager.cxx" +#include "qtpropertymanager.moc" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertymanager.h b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertymanager.h new file mode 100644 index 000000000..709f2abf7 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtpropertymanager.h @@ -0,0 +1,796 @@ +/**************************************************************************** +** +** This file is part of a Qt Solutions component. +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QTPROPERTYMANAGER_H +#define QTPROPERTYMANAGER_H + +#include "qtpropertybrowser.h" + +#if QT_VERSION >= 0x040400 +QT_BEGIN_NAMESPACE +#endif + +class QDate; +class QTime; +class QDateTime; +class QLocale; + +class QT_QTPROPERTYBROWSER_EXPORT QtGroupPropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtGroupPropertyManager(QObject *parent = 0); + ~QtGroupPropertyManager(); + +protected: + virtual bool hasValue(const QtProperty *property) const; + + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +}; + +class QtIntPropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtIntPropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtIntPropertyManager(QObject *parent = 0); + ~QtIntPropertyManager(); + + int value(const QtProperty *property) const; + int minimum(const QtProperty *property) const; + int maximum(const QtProperty *property) const; + int singleStep(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, int val); + void setMinimum(QtProperty *property, int minVal); + void setMaximum(QtProperty *property, int maxVal); + void setRange(QtProperty *property, int minVal, int maxVal); + void setSingleStep(QtProperty *property, int step); +Q_SIGNALS: + void valueChanged(QtProperty *property, int val); + void rangeChanged(QtProperty *property, int minVal, int maxVal); + void singleStepChanged(QtProperty *property, int step); +protected: + QString valueText(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtIntPropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtIntPropertyManager) + Q_DISABLE_COPY(QtIntPropertyManager) +}; + +class QtBoolPropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtBoolPropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtBoolPropertyManager(QObject *parent = 0); + ~QtBoolPropertyManager(); + + bool value(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, bool val); +Q_SIGNALS: + void valueChanged(QtProperty *property, bool val); +protected: + QString valueText(const QtProperty *property) const; + QIcon valueIcon(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtBoolPropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtBoolPropertyManager) + Q_DISABLE_COPY(QtBoolPropertyManager) +}; + +class QtDoublePropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtDoublePropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtDoublePropertyManager(QObject *parent = 0); + ~QtDoublePropertyManager(); + + double value(const QtProperty *property) const; + double minimum(const QtProperty *property) const; + double maximum(const QtProperty *property) const; + double singleStep(const QtProperty *property) const; + int decimals(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, double val); + void setMinimum(QtProperty *property, double minVal); + void setMaximum(QtProperty *property, double maxVal); + void setRange(QtProperty *property, double minVal, double maxVal); + void setSingleStep(QtProperty *property, double step); + void setDecimals(QtProperty *property, int prec); +Q_SIGNALS: + void valueChanged(QtProperty *property, double val); + void rangeChanged(QtProperty *property, double minVal, double maxVal); + void singleStepChanged(QtProperty *property, double step); + void decimalsChanged(QtProperty *property, int prec); +protected: + QString valueText(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtDoublePropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtDoublePropertyManager) + Q_DISABLE_COPY(QtDoublePropertyManager) +}; + +class QtStringPropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtStringPropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtStringPropertyManager(QObject *parent = 0); + ~QtStringPropertyManager(); + + QString value(const QtProperty *property) const; + QRegExp regExp(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, const QString &val); + void setRegExp(QtProperty *property, const QRegExp ®Exp); +Q_SIGNALS: + void valueChanged(QtProperty *property, const QString &val); + void regExpChanged(QtProperty *property, const QRegExp ®Exp); +protected: + QString valueText(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtStringPropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtStringPropertyManager) + Q_DISABLE_COPY(QtStringPropertyManager) +}; + +class QtDatePropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtDatePropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtDatePropertyManager(QObject *parent = 0); + ~QtDatePropertyManager(); + + QDate value(const QtProperty *property) const; + QDate minimum(const QtProperty *property) const; + QDate maximum(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, const QDate &val); + void setMinimum(QtProperty *property, const QDate &minVal); + void setMaximum(QtProperty *property, const QDate &maxVal); + void setRange(QtProperty *property, const QDate &minVal, const QDate &maxVal); +Q_SIGNALS: + void valueChanged(QtProperty *property, const QDate &val); + void rangeChanged(QtProperty *property, const QDate &minVal, const QDate &maxVal); +protected: + QString valueText(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtDatePropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtDatePropertyManager) + Q_DISABLE_COPY(QtDatePropertyManager) +}; + +class QtTimePropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtTimePropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtTimePropertyManager(QObject *parent = 0); + ~QtTimePropertyManager(); + + QTime value(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, const QTime &val); +Q_SIGNALS: + void valueChanged(QtProperty *property, const QTime &val); +protected: + QString valueText(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtTimePropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtTimePropertyManager) + Q_DISABLE_COPY(QtTimePropertyManager) +}; + +class QtDateTimePropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtDateTimePropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtDateTimePropertyManager(QObject *parent = 0); + ~QtDateTimePropertyManager(); + + QDateTime value(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, const QDateTime &val); +Q_SIGNALS: + void valueChanged(QtProperty *property, const QDateTime &val); +protected: + QString valueText(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtDateTimePropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtDateTimePropertyManager) + Q_DISABLE_COPY(QtDateTimePropertyManager) +}; + +class QtKeySequencePropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtKeySequencePropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtKeySequencePropertyManager(QObject *parent = 0); + ~QtKeySequencePropertyManager(); + + QKeySequence value(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, const QKeySequence &val); +Q_SIGNALS: + void valueChanged(QtProperty *property, const QKeySequence &val); +protected: + QString valueText(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtKeySequencePropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtKeySequencePropertyManager) + Q_DISABLE_COPY(QtKeySequencePropertyManager) +}; + +class QtCharPropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtCharPropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtCharPropertyManager(QObject *parent = 0); + ~QtCharPropertyManager(); + + QChar value(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, const QChar &val); +Q_SIGNALS: + void valueChanged(QtProperty *property, const QChar &val); +protected: + QString valueText(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtCharPropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtCharPropertyManager) + Q_DISABLE_COPY(QtCharPropertyManager) +}; + +class QtEnumPropertyManager; +class QtLocalePropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtLocalePropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtLocalePropertyManager(QObject *parent = 0); + ~QtLocalePropertyManager(); + + QtEnumPropertyManager *subEnumPropertyManager() const; + + QLocale value(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, const QLocale &val); +Q_SIGNALS: + void valueChanged(QtProperty *property, const QLocale &val); +protected: + QString valueText(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtLocalePropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtLocalePropertyManager) + Q_DISABLE_COPY(QtLocalePropertyManager) + Q_PRIVATE_SLOT(d_func(), void slotEnumChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *)) +}; + +class QtPointPropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtPointPropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtPointPropertyManager(QObject *parent = 0); + ~QtPointPropertyManager(); + + QtIntPropertyManager *subIntPropertyManager() const; + + QPoint value(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, const QPoint &val); +Q_SIGNALS: + void valueChanged(QtProperty *property, const QPoint &val); +protected: + QString valueText(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtPointPropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtPointPropertyManager) + Q_DISABLE_COPY(QtPointPropertyManager) + Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *)) +}; + +class QtPointFPropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtPointFPropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtPointFPropertyManager(QObject *parent = 0); + ~QtPointFPropertyManager(); + + QtDoublePropertyManager *subDoublePropertyManager() const; + + QPointF value(const QtProperty *property) const; + int decimals(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, const QPointF &val); + void setDecimals(QtProperty *property, int prec); +Q_SIGNALS: + void valueChanged(QtProperty *property, const QPointF &val); + void decimalsChanged(QtProperty *property, int prec); +protected: + QString valueText(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtPointFPropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtPointFPropertyManager) + Q_DISABLE_COPY(QtPointFPropertyManager) + Q_PRIVATE_SLOT(d_func(), void slotDoubleChanged(QtProperty *, double)) + Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *)) +}; + +class QtSizePropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtSizePropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtSizePropertyManager(QObject *parent = 0); + ~QtSizePropertyManager(); + + QtIntPropertyManager *subIntPropertyManager() const; + + QSize value(const QtProperty *property) const; + QSize minimum(const QtProperty *property) const; + QSize maximum(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, const QSize &val); + void setMinimum(QtProperty *property, const QSize &minVal); + void setMaximum(QtProperty *property, const QSize &maxVal); + void setRange(QtProperty *property, const QSize &minVal, const QSize &maxVal); +Q_SIGNALS: + void valueChanged(QtProperty *property, const QSize &val); + void rangeChanged(QtProperty *property, const QSize &minVal, const QSize &maxVal); +protected: + QString valueText(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtSizePropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtSizePropertyManager) + Q_DISABLE_COPY(QtSizePropertyManager) + Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *)) +}; + +class QtSizeFPropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtSizeFPropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtSizeFPropertyManager(QObject *parent = 0); + ~QtSizeFPropertyManager(); + + QtDoublePropertyManager *subDoublePropertyManager() const; + + QSizeF value(const QtProperty *property) const; + QSizeF minimum(const QtProperty *property) const; + QSizeF maximum(const QtProperty *property) const; + int decimals(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, const QSizeF &val); + void setMinimum(QtProperty *property, const QSizeF &minVal); + void setMaximum(QtProperty *property, const QSizeF &maxVal); + void setRange(QtProperty *property, const QSizeF &minVal, const QSizeF &maxVal); + void setDecimals(QtProperty *property, int prec); +Q_SIGNALS: + void valueChanged(QtProperty *property, const QSizeF &val); + void rangeChanged(QtProperty *property, const QSizeF &minVal, const QSizeF &maxVal); + void decimalsChanged(QtProperty *property, int prec); +protected: + QString valueText(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtSizeFPropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtSizeFPropertyManager) + Q_DISABLE_COPY(QtSizeFPropertyManager) + Q_PRIVATE_SLOT(d_func(), void slotDoubleChanged(QtProperty *, double)) + Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *)) +}; + +class QtRectPropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtRectPropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtRectPropertyManager(QObject *parent = 0); + ~QtRectPropertyManager(); + + QtIntPropertyManager *subIntPropertyManager() const; + + QRect value(const QtProperty *property) const; + QRect constraint(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, const QRect &val); + void setConstraint(QtProperty *property, const QRect &constraint); +Q_SIGNALS: + void valueChanged(QtProperty *property, const QRect &val); + void constraintChanged(QtProperty *property, const QRect &constraint); +protected: + QString valueText(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtRectPropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtRectPropertyManager) + Q_DISABLE_COPY(QtRectPropertyManager) + Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *)) +}; + +class QtRectFPropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtRectFPropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtRectFPropertyManager(QObject *parent = 0); + ~QtRectFPropertyManager(); + + QtDoublePropertyManager *subDoublePropertyManager() const; + + QRectF value(const QtProperty *property) const; + QRectF constraint(const QtProperty *property) const; + int decimals(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, const QRectF &val); + void setConstraint(QtProperty *property, const QRectF &constraint); + void setDecimals(QtProperty *property, int prec); +Q_SIGNALS: + void valueChanged(QtProperty *property, const QRectF &val); + void constraintChanged(QtProperty *property, const QRectF &constraint); + void decimalsChanged(QtProperty *property, int prec); +protected: + QString valueText(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtRectFPropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtRectFPropertyManager) + Q_DISABLE_COPY(QtRectFPropertyManager) + Q_PRIVATE_SLOT(d_func(), void slotDoubleChanged(QtProperty *, double)) + Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *)) +}; + +class QtEnumPropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtEnumPropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtEnumPropertyManager(QObject *parent = 0); + ~QtEnumPropertyManager(); + + int value(const QtProperty *property) const; + QStringList enumNames(const QtProperty *property) const; + QMap enumIcons(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, int val); + void setEnumNames(QtProperty *property, const QStringList &names); + void setEnumIcons(QtProperty *property, const QMap &icons); +Q_SIGNALS: + void valueChanged(QtProperty *property, int val); + void enumNamesChanged(QtProperty *property, const QStringList &names); + void enumIconsChanged(QtProperty *property, const QMap &icons); +protected: + QString valueText(const QtProperty *property) const; + QIcon valueIcon(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtEnumPropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtEnumPropertyManager) + Q_DISABLE_COPY(QtEnumPropertyManager) +}; + +class QtFlagPropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtFlagPropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtFlagPropertyManager(QObject *parent = 0); + ~QtFlagPropertyManager(); + + QtBoolPropertyManager *subBoolPropertyManager() const; + + int value(const QtProperty *property) const; + QStringList flagNames(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, int val); + void setFlagNames(QtProperty *property, const QStringList &names); +Q_SIGNALS: + void valueChanged(QtProperty *property, int val); + void flagNamesChanged(QtProperty *property, const QStringList &names); +protected: + QString valueText(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtFlagPropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtFlagPropertyManager) + Q_DISABLE_COPY(QtFlagPropertyManager) + Q_PRIVATE_SLOT(d_func(), void slotBoolChanged(QtProperty *, bool)) + Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *)) +}; + +class QtSizePolicyPropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtSizePolicyPropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtSizePolicyPropertyManager(QObject *parent = 0); + ~QtSizePolicyPropertyManager(); + + QtIntPropertyManager *subIntPropertyManager() const; + QtEnumPropertyManager *subEnumPropertyManager() const; + + QSizePolicy value(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, const QSizePolicy &val); +Q_SIGNALS: + void valueChanged(QtProperty *property, const QSizePolicy &val); +protected: + QString valueText(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtSizePolicyPropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtSizePolicyPropertyManager) + Q_DISABLE_COPY(QtSizePolicyPropertyManager) + Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotEnumChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *)) +}; + +class QtFontPropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtFontPropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtFontPropertyManager(QObject *parent = 0); + ~QtFontPropertyManager(); + + QtIntPropertyManager *subIntPropertyManager() const; + QtEnumPropertyManager *subEnumPropertyManager() const; + QtBoolPropertyManager *subBoolPropertyManager() const; + + QFont value(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, const QFont &val); +Q_SIGNALS: + void valueChanged(QtProperty *property, const QFont &val); +protected: + QString valueText(const QtProperty *property) const; + QIcon valueIcon(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtFontPropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtFontPropertyManager) + Q_DISABLE_COPY(QtFontPropertyManager) + Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotEnumChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotBoolChanged(QtProperty *, bool)) + Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *)) + Q_PRIVATE_SLOT(d_func(), void slotFontDatabaseChanged()) + Q_PRIVATE_SLOT(d_func(), void slotFontDatabaseDelayedChange()) +}; + +class QtColorPropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtColorPropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtColorPropertyManager(QObject *parent = 0); + ~QtColorPropertyManager(); + + QtIntPropertyManager *subIntPropertyManager() const; + + QColor value(const QtProperty *property) const; + +public Q_SLOTS: + void setValue(QtProperty *property, const QColor &val); +Q_SIGNALS: + void valueChanged(QtProperty *property, const QColor &val); +protected: + QString valueText(const QtProperty *property) const; + QIcon valueIcon(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtColorPropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtColorPropertyManager) + Q_DISABLE_COPY(QtColorPropertyManager) + Q_PRIVATE_SLOT(d_func(), void slotIntChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotPropertyDestroyed(QtProperty *)) +}; + +class QtCursorPropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtCursorPropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtCursorPropertyManager(QObject *parent = 0); + ~QtCursorPropertyManager(); + +#ifndef QT_NO_CURSOR + QCursor value(const QtProperty *property) const; +#endif + +public Q_SLOTS: + void setValue(QtProperty *property, const QCursor &val); +Q_SIGNALS: + void valueChanged(QtProperty *property, const QCursor &val); +protected: + QString valueText(const QtProperty *property) const; + QIcon valueIcon(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); +private: + QtCursorPropertyManagerPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtCursorPropertyManager) + Q_DISABLE_COPY(QtCursorPropertyManager) +}; + +#if QT_VERSION >= 0x040400 +QT_END_NAMESPACE +#endif + +#endif diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qttreepropertybrowser.cpp b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qttreepropertybrowser.cpp new file mode 100644 index 000000000..eb9b37515 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qttreepropertybrowser.cpp @@ -0,0 +1,1095 @@ +/**************************************************************************** +** +** This file is part of a Qt Solutions component. +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qttreepropertybrowser.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if QT_VERSION >= 0x040400 +QT_BEGIN_NAMESPACE +#endif + +class QtPropertyEditorView; + +class QtTreePropertyBrowserPrivate +{ + QtTreePropertyBrowser *q_ptr; + Q_DECLARE_PUBLIC(QtTreePropertyBrowser) + +public: + QtTreePropertyBrowserPrivate(); + void init(QWidget *parent); + + void propertyInserted(QtBrowserItem *index, QtBrowserItem *afterIndex); + void propertyRemoved(QtBrowserItem *index); + void propertyChanged(QtBrowserItem *index); + QWidget *createEditor(QtProperty *property, QWidget *parent) const + { return q_ptr->createEditor(property, parent); } + QtProperty *indexToProperty(const QModelIndex &index) const; + QTreeWidgetItem *indexToItem(const QModelIndex &index) const; + QtBrowserItem *indexToBrowserItem(const QModelIndex &index) const; + bool lastColumn(int column) const; + void disableItem(QTreeWidgetItem *item) const; + void enableItem(QTreeWidgetItem *item) const; + bool hasValue(QTreeWidgetItem *item) const; + + void slotCollapsed(const QModelIndex &index); + void slotExpanded(const QModelIndex &index); + + QColor calculatedBackgroundColor(QtBrowserItem *item) const; + + QtPropertyEditorView *treeWidget() const { return m_treeWidget; } + bool markPropertiesWithoutValue() const { return m_markPropertiesWithoutValue; } + + QtBrowserItem *currentItem() const; + void setCurrentItem(QtBrowserItem *browserItem, bool block); + void editItem(QtBrowserItem *browserItem); + + void slotCurrentBrowserItemChanged(QtBrowserItem *item); + void slotCurrentTreeItemChanged(QTreeWidgetItem *newItem, QTreeWidgetItem *); + + QTreeWidgetItem *editedItem() const; + +private: + void updateItem(QTreeWidgetItem *item); + + QMap m_indexToItem; + QMap m_itemToIndex; + + QMap m_indexToBackgroundColor; + + QtPropertyEditorView *m_treeWidget; + + bool m_headerVisible; + QtTreePropertyBrowser::ResizeMode m_resizeMode; + class QtPropertyEditorDelegate *m_delegate; + bool m_markPropertiesWithoutValue; + bool m_browserChangedBlocked; + QIcon m_expandIcon; +}; + +// ------------ QtPropertyEditorView +class QtPropertyEditorView : public QTreeWidget +{ + Q_OBJECT +public: + QtPropertyEditorView(QWidget *parent = 0); + + void setEditorPrivate(QtTreePropertyBrowserPrivate *editorPrivate) + { m_editorPrivate = editorPrivate; } + + QTreeWidgetItem *indexToItem(const QModelIndex &index) const + { return itemFromIndex(index); } + +protected: + void keyPressEvent(QKeyEvent *event); + void mousePressEvent(QMouseEvent *event); + void drawRow(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; + +private: + QtTreePropertyBrowserPrivate *m_editorPrivate; +}; + +QtPropertyEditorView::QtPropertyEditorView(QWidget *parent) : + QTreeWidget(parent), + m_editorPrivate(0) +{ + connect(header(), SIGNAL(sectionDoubleClicked(int)), this, SLOT(resizeColumnToContents(int))); +} + +void QtPropertyEditorView::drawRow(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + QStyleOptionViewItemV3 opt = option; + bool hasValue = true; + if (m_editorPrivate) { + QtProperty *property = m_editorPrivate->indexToProperty(index); + if (property) + { + hasValue = property->hasValue(); + opt.font.setBold(property->isBold()); + } + } + if (!hasValue && m_editorPrivate->markPropertiesWithoutValue()) { + const QColor c = option.palette.color(QPalette::Dark); + painter->fillRect(option.rect, c); + opt.palette.setColor(QPalette::AlternateBase, c); + } else { + const QColor c = m_editorPrivate->calculatedBackgroundColor(m_editorPrivate->indexToBrowserItem(index)); + if (c.isValid()) { + painter->fillRect(option.rect, c); + opt.palette.setColor(QPalette::AlternateBase, c.lighter(112)); + } + } + + QTreeWidget::drawRow(painter, opt, index); + QColor color = static_cast(QApplication::style()->styleHint(QStyle::SH_Table_GridLineColor, &opt)); + painter->save(); + painter->setPen(QPen(color)); + painter->drawLine(opt.rect.x(), opt.rect.bottom(), opt.rect.right(), opt.rect.bottom()); + painter->restore(); +} + +void QtPropertyEditorView::keyPressEvent(QKeyEvent *event) +{ + switch (event->key()) { + case Qt::Key_Return: + case Qt::Key_Enter: + case Qt::Key_Space: // Trigger Edit + if (!m_editorPrivate->editedItem()) + if (const QTreeWidgetItem *item = currentItem()) + if (item->columnCount() >= 2 && ((item->flags() & (Qt::ItemIsEditable | Qt::ItemIsEnabled)) == (Qt::ItemIsEditable | Qt::ItemIsEnabled))) { + event->accept(); + // If the current position is at column 0, move to 1. + QModelIndex index = currentIndex(); + if (index.column() == 0) { + index = index.sibling(index.row(), 1); + setCurrentIndex(index); + } + edit(index); + return; + } + break; + default: + break; + } + QTreeWidget::keyPressEvent(event); +} + +void QtPropertyEditorView::mousePressEvent(QMouseEvent *event) +{ + QTreeWidget::mousePressEvent(event); + QTreeWidgetItem *item = itemAt(event->pos()); + + if (item) { + if ((item != m_editorPrivate->editedItem()) && (event->button() == Qt::LeftButton) + && (header()->logicalIndexAt(event->pos().x()) == 1) + && ((item->flags() & (Qt::ItemIsEditable | Qt::ItemIsEnabled)) == (Qt::ItemIsEditable | Qt::ItemIsEnabled))) { + editItem(item, 1); + } else if (!m_editorPrivate->hasValue(item) && m_editorPrivate->markPropertiesWithoutValue() && !rootIsDecorated()) { + if (event->pos().x() + header()->offset() < 20) + item->setExpanded(!item->isExpanded()); + } + } +} + +// ------------ QtPropertyEditorDelegate +class QtPropertyEditorDelegate : public QItemDelegate +{ + Q_OBJECT +public: + QtPropertyEditorDelegate(QObject *parent = 0) + : QItemDelegate(parent), m_editorPrivate(0), m_editedItem(0), m_editedWidget(0) + {} + + void setEditorPrivate(QtTreePropertyBrowserPrivate *editorPrivate) + { m_editorPrivate = editorPrivate; } + + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, + const QModelIndex &index) const; + + void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, + const QModelIndex &index) const; + + void paint(QPainter *painter, const QStyleOptionViewItem &option, + const QModelIndex &index) const; + + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; + + void setModelData(QWidget *, QAbstractItemModel *, + const QModelIndex &) const {} + + void setEditorData(QWidget *, const QModelIndex &) const {} + + bool eventFilter(QObject *object, QEvent *event); + void closeEditor(QtProperty *property); + + QTreeWidgetItem *editedItem() const { return m_editedItem; } + +private slots: + void slotEditorDestroyed(QObject *object); + +private: + int indentation(const QModelIndex &index) const; + + typedef QMap EditorToPropertyMap; + mutable EditorToPropertyMap m_editorToProperty; + + typedef QMap PropertyToEditorMap; + mutable PropertyToEditorMap m_propertyToEditor; + QtTreePropertyBrowserPrivate *m_editorPrivate; + mutable QTreeWidgetItem *m_editedItem; + mutable QWidget *m_editedWidget; +}; + +int QtPropertyEditorDelegate::indentation(const QModelIndex &index) const +{ + if (!m_editorPrivate) + return 0; + + QTreeWidgetItem *item = m_editorPrivate->indexToItem(index); + int indent = 0; + while (item->parent()) { + item = item->parent(); + ++indent; + } + if (m_editorPrivate->treeWidget()->rootIsDecorated()) + ++indent; + return indent * m_editorPrivate->treeWidget()->indentation(); +} + +void QtPropertyEditorDelegate::slotEditorDestroyed(QObject *object) +{ + if (QWidget *w = qobject_cast(object)) { + const EditorToPropertyMap::iterator it = m_editorToProperty.find(w); + if (it != m_editorToProperty.end()) { + m_propertyToEditor.remove(it.value()); + m_editorToProperty.erase(it); + } + if (m_editedWidget == w) { + m_editedWidget = 0; + m_editedItem = 0; + } + } +} + +void QtPropertyEditorDelegate::closeEditor(QtProperty *property) +{ + if (QWidget *w = m_propertyToEditor.value(property, 0)) + w->deleteLater(); +} + +QWidget *QtPropertyEditorDelegate::createEditor(QWidget *parent, + const QStyleOptionViewItem &, const QModelIndex &index) const +{ + if (index.column() == 1 && m_editorPrivate) { + QtProperty *property = m_editorPrivate->indexToProperty(index); + QTreeWidgetItem *item = m_editorPrivate->indexToItem(index); + if (property && item && (item->flags() & Qt::ItemIsEnabled)) { + QWidget *editor = m_editorPrivate->createEditor(property, parent); + if (editor) { + editor->setAutoFillBackground(true); + editor->installEventFilter(const_cast(this)); + connect(editor, SIGNAL(destroyed(QObject *)), this, SLOT(slotEditorDestroyed(QObject *))); + m_propertyToEditor[property] = editor; + m_editorToProperty[editor] = property; + m_editedItem = item; + m_editedWidget = editor; + } + return editor; + } + } + return 0; +} + +void QtPropertyEditorDelegate::updateEditorGeometry(QWidget *editor, + const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + Q_UNUSED(index) + editor->setGeometry(option.rect.adjusted(0, 0, 0, -1)); +} + +void QtPropertyEditorDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + bool hasValue = true; + if (m_editorPrivate) { + QtProperty *property = m_editorPrivate->indexToProperty(index); + if (property) + hasValue = property->hasValue(); + } + QStyleOptionViewItemV3 opt = option; + if ((m_editorPrivate && index.column() == 0) || !hasValue) { + QtProperty *property = m_editorPrivate->indexToProperty(index); + if (property && property->isModified()) { + opt.font.setBold(true); + opt.fontMetrics = QFontMetrics(opt.font); + } + } + QColor c; + if (!hasValue && m_editorPrivate->markPropertiesWithoutValue()) { + c = opt.palette.color(QPalette::Dark); + opt.palette.setColor(QPalette::Text, opt.palette.color(QPalette::BrightText)); + } else { + c = m_editorPrivate->calculatedBackgroundColor(m_editorPrivate->indexToBrowserItem(index)); + if (c.isValid() && (opt.features & QStyleOptionViewItemV2::Alternate)) + c = c.lighter(112); + } + if (c.isValid()) + painter->fillRect(option.rect, c); + opt.state &= ~QStyle::State_HasFocus; + QItemDelegate::paint(painter, opt, index); + + opt.palette.setCurrentColorGroup(QPalette::Active); + QColor color = static_cast(QApplication::style()->styleHint(QStyle::SH_Table_GridLineColor, &opt)); + painter->save(); + painter->setPen(QPen(color)); + if (!m_editorPrivate || (!m_editorPrivate->lastColumn(index.column()) && hasValue)) { + int right = (option.direction == Qt::LeftToRight) ? option.rect.right() : option.rect.left(); + painter->drawLine(right, option.rect.y(), right, option.rect.bottom()); + } + painter->restore(); +} + +QSize QtPropertyEditorDelegate::sizeHint(const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + return QItemDelegate::sizeHint(option, index) + QSize(3, 4); +} + +bool QtPropertyEditorDelegate::eventFilter(QObject *object, QEvent *event) +{ + if (event->type() == QEvent::FocusOut) { + QFocusEvent *fe = static_cast(event); + if (fe->reason() == Qt::ActiveWindowFocusReason) + return false; + } + return QItemDelegate::eventFilter(object, event); +} + +// -------- QtTreePropertyBrowserPrivate implementation +QtTreePropertyBrowserPrivate::QtTreePropertyBrowserPrivate() : + m_treeWidget(0), + m_headerVisible(true), + m_resizeMode(QtTreePropertyBrowser::Stretch), + m_delegate(0), + m_markPropertiesWithoutValue(false), + m_browserChangedBlocked(false) +{ +} + +// Draw an icon indicating opened/closing branches +static QIcon drawIndicatorIcon(const QPalette &palette, QStyle *style) +{ + QPixmap pix(14, 14); + pix.fill(Qt::transparent); + QStyleOption branchOption; + QRect r(QPoint(0, 0), pix.size()); + branchOption.rect = QRect(2, 2, 9, 9); // ### hardcoded in qcommonstyle.cpp + branchOption.palette = palette; + branchOption.state = QStyle::State_Children; + + QPainter p; + // Draw closed state + p.begin(&pix); + style->drawPrimitive(QStyle::PE_IndicatorBranch, &branchOption, &p); + p.end(); + QIcon rc = pix; + rc.addPixmap(pix, QIcon::Selected, QIcon::Off); + // Draw opened state + branchOption.state |= QStyle::State_Open; + pix.fill(Qt::transparent); + p.begin(&pix); + style->drawPrimitive(QStyle::PE_IndicatorBranch, &branchOption, &p); + p.end(); + + rc.addPixmap(pix, QIcon::Normal, QIcon::On); + rc.addPixmap(pix, QIcon::Selected, QIcon::On); + return rc; +} + +void QtTreePropertyBrowserPrivate::init(QWidget *parent) +{ + QHBoxLayout *layout = new QHBoxLayout(parent); + layout->setMargin(0); + m_treeWidget = new QtPropertyEditorView(parent); + m_treeWidget->setEditorPrivate(this); + m_treeWidget->setIconSize(QSize(18, 18)); + layout->addWidget(m_treeWidget); + + m_treeWidget->setColumnCount(2); + QStringList labels; + labels.append(QApplication::translate("QtTreePropertyBrowser", "Property", 0, QApplication::UnicodeUTF8)); + labels.append(QApplication::translate("QtTreePropertyBrowser", "Value", 0, QApplication::UnicodeUTF8)); + m_treeWidget->setHeaderLabels(labels); + m_treeWidget->setAlternatingRowColors(true); + m_treeWidget->setEditTriggers(QAbstractItemView::EditKeyPressed); + m_delegate = new QtPropertyEditorDelegate(parent); + m_delegate->setEditorPrivate(this); + m_treeWidget->setItemDelegate(m_delegate); + m_treeWidget->header()->setMovable(false); + m_treeWidget->header()->setResizeMode(QHeaderView::Stretch); + + m_expandIcon = drawIndicatorIcon(q_ptr->palette(), q_ptr->style()); + + QObject::connect(m_treeWidget, SIGNAL(collapsed(const QModelIndex &)), q_ptr, SLOT(slotCollapsed(const QModelIndex &))); + QObject::connect(m_treeWidget, SIGNAL(expanded(const QModelIndex &)), q_ptr, SLOT(slotExpanded(const QModelIndex &))); + QObject::connect(m_treeWidget, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), q_ptr, SLOT(slotCurrentTreeItemChanged(QTreeWidgetItem*,QTreeWidgetItem*))); +} + +QtBrowserItem *QtTreePropertyBrowserPrivate::currentItem() const +{ + if (QTreeWidgetItem *treeItem = m_treeWidget->currentItem()) + return m_itemToIndex.value(treeItem); + return 0; +} + +void QtTreePropertyBrowserPrivate::setCurrentItem(QtBrowserItem *browserItem, bool block) +{ + const bool blocked = block ? m_treeWidget->blockSignals(true) : false; + if (browserItem == 0) + m_treeWidget->setCurrentItem(0); + else + m_treeWidget->setCurrentItem(m_indexToItem.value(browserItem)); + if (block) + m_treeWidget->blockSignals(blocked); +} + +QtProperty *QtTreePropertyBrowserPrivate::indexToProperty(const QModelIndex &index) const +{ + QTreeWidgetItem *item = m_treeWidget->indexToItem(index); + QtBrowserItem *idx = m_itemToIndex.value(item); + if (idx) + return idx->property(); + return 0; +} + +QtBrowserItem *QtTreePropertyBrowserPrivate::indexToBrowserItem(const QModelIndex &index) const +{ + QTreeWidgetItem *item = m_treeWidget->indexToItem(index); + return m_itemToIndex.value(item); +} + +QTreeWidgetItem *QtTreePropertyBrowserPrivate::indexToItem(const QModelIndex &index) const +{ + return m_treeWidget->indexToItem(index); +} + +bool QtTreePropertyBrowserPrivate::lastColumn(int column) const +{ + return m_treeWidget->header()->visualIndex(column) == m_treeWidget->columnCount() - 1; +} + +void QtTreePropertyBrowserPrivate::disableItem(QTreeWidgetItem *item) const +{ + Qt::ItemFlags flags = item->flags(); + if (flags & Qt::ItemIsEnabled) { + flags &= ~Qt::ItemIsEnabled; + item->setFlags(flags); + m_delegate->closeEditor(m_itemToIndex[item]->property()); + const int childCount = item->childCount(); + for (int i = 0; i < childCount; i++) { + QTreeWidgetItem *child = item->child(i); + disableItem(child); + } + } +} + +void QtTreePropertyBrowserPrivate::enableItem(QTreeWidgetItem *item) const +{ + Qt::ItemFlags flags = item->flags(); + flags |= Qt::ItemIsEnabled; + item->setFlags(flags); + const int childCount = item->childCount(); + for (int i = 0; i < childCount; i++) { + QTreeWidgetItem *child = item->child(i); + QtProperty *property = m_itemToIndex[child]->property(); + if (property->isEnabled()) { + enableItem(child); + } + } +} + +bool QtTreePropertyBrowserPrivate::hasValue(QTreeWidgetItem *item) const +{ + QtBrowserItem *browserItem = m_itemToIndex.value(item); + if (browserItem) + return browserItem->property()->hasValue(); + return false; +} + +void QtTreePropertyBrowserPrivate::propertyInserted(QtBrowserItem *index, QtBrowserItem *afterIndex) +{ + QTreeWidgetItem *afterItem = m_indexToItem.value(afterIndex); + QTreeWidgetItem *parentItem = m_indexToItem.value(index->parent()); + + QTreeWidgetItem *newItem = 0; + if (parentItem) { + newItem = new QTreeWidgetItem(parentItem, afterItem); + } else { + newItem = new QTreeWidgetItem(m_treeWidget, afterItem); + } + m_itemToIndex[newItem] = index; + m_indexToItem[index] = newItem; + + newItem->setFlags(newItem->flags() | Qt::ItemIsEditable); + m_treeWidget->setItemExpanded(newItem, true); + + updateItem(newItem); +} + +void QtTreePropertyBrowserPrivate::propertyRemoved(QtBrowserItem *index) +{ + QTreeWidgetItem *item = m_indexToItem.value(index); + + if (m_treeWidget->currentItem() == item) { + m_treeWidget->setCurrentItem(0); + } + + delete item; + + m_indexToItem.remove(index); + m_itemToIndex.remove(item); + m_indexToBackgroundColor.remove(index); +} + +void QtTreePropertyBrowserPrivate::propertyChanged(QtBrowserItem *index) +{ + QTreeWidgetItem *item = m_indexToItem.value(index); + + updateItem(item); +} + +void QtTreePropertyBrowserPrivate::updateItem(QTreeWidgetItem *item) +{ + QtProperty *property = m_itemToIndex[item]->property(); + QIcon expandIcon; + if (property->hasValue()) { + QString toolTip = property->toolTip(); + if (toolTip.isEmpty()) + toolTip = property->valueText(); + item->setToolTip(1, toolTip); + item->setIcon(1, property->valueIcon()); + item->setText(1, property->valueText()); + } else if (markPropertiesWithoutValue() && !m_treeWidget->rootIsDecorated()) { + expandIcon = m_expandIcon; + } + item->setIcon(0, expandIcon); + item->setFirstColumnSpanned(!property->hasValue()); + item->setToolTip(0, property->propertyName()); + item->setStatusTip(0, property->statusTip()); + item->setWhatsThis(0, property->whatsThis()); + item->setText(0, property->propertyName()); + bool wasEnabled = item->flags() & Qt::ItemIsEnabled; + bool isEnabled = wasEnabled; + if (property->isEnabled()) { + QTreeWidgetItem *parent = item->parent(); + if (!parent || (parent->flags() & Qt::ItemIsEnabled)) + isEnabled = true; + else + isEnabled = false; + } else { + isEnabled = false; + } + if (wasEnabled != isEnabled) { + if (isEnabled) + enableItem(item); + else + disableItem(item); + } + m_treeWidget->viewport()->update(); +} + +QColor QtTreePropertyBrowserPrivate::calculatedBackgroundColor(QtBrowserItem *item) const +{ + QtBrowserItem *i = item; + const QMap::const_iterator itEnd = m_indexToBackgroundColor.constEnd(); + while (i) { + QMap::const_iterator it = m_indexToBackgroundColor.constFind(i); + if (it != itEnd) + return it.value(); + i = i->parent(); + } + return QColor(); +} + +void QtTreePropertyBrowserPrivate::slotCollapsed(const QModelIndex &index) +{ + QTreeWidgetItem *item = indexToItem(index); + QtBrowserItem *idx = m_itemToIndex.value(item); + if (item) + emit q_ptr->collapsed(idx); +} + +void QtTreePropertyBrowserPrivate::slotExpanded(const QModelIndex &index) +{ + QTreeWidgetItem *item = indexToItem(index); + QtBrowserItem *idx = m_itemToIndex.value(item); + if (item) + emit q_ptr->expanded(idx); +} + +void QtTreePropertyBrowserPrivate::slotCurrentBrowserItemChanged(QtBrowserItem *item) +{ + if (!m_browserChangedBlocked && item != currentItem()) + setCurrentItem(item, true); +} + +void QtTreePropertyBrowserPrivate::slotCurrentTreeItemChanged(QTreeWidgetItem *newItem, QTreeWidgetItem *) +{ + QtBrowserItem *browserItem = newItem ? m_itemToIndex.value(newItem) : 0; + m_browserChangedBlocked = true; + q_ptr->setCurrentItem(browserItem); + m_browserChangedBlocked = false; +} + +QTreeWidgetItem *QtTreePropertyBrowserPrivate::editedItem() const +{ + return m_delegate->editedItem(); +} + +void QtTreePropertyBrowserPrivate::editItem(QtBrowserItem *browserItem) +{ + if (QTreeWidgetItem *treeItem = m_indexToItem.value(browserItem, 0)) { + m_treeWidget->setCurrentItem (treeItem, 1); + m_treeWidget->editItem(treeItem, 1); + } +} + +/*! + \class QtTreePropertyBrowser + + \brief The QtTreePropertyBrowser class provides QTreeWidget based + property browser. + + A property browser is a widget that enables the user to edit a + given set of properties. Each property is represented by a label + specifying the property's name, and an editing widget (e.g. a line + edit or a combobox) holding its value. A property can have zero or + more subproperties. + + QtTreePropertyBrowser provides a tree based view for all nested + properties, i.e. properties that have subproperties can be in an + expanded (subproperties are visible) or collapsed (subproperties + are hidden) state. For example: + + \image qttreepropertybrowser.png + + Use the QtAbstractPropertyBrowser API to add, insert and remove + properties from an instance of the QtTreePropertyBrowser class. + The properties themselves are created and managed by + implementations of the QtAbstractPropertyManager class. + + \sa QtGroupBoxPropertyBrowser, QtAbstractPropertyBrowser +*/ + +/*! + \fn void QtTreePropertyBrowser::collapsed(QtBrowserItem *item) + + This signal is emitted when the \a item is collapsed. + + \sa expanded(), setExpanded() +*/ + +/*! + \fn void QtTreePropertyBrowser::expanded(QtBrowserItem *item) + + This signal is emitted when the \a item is expanded. + + \sa collapsed(), setExpanded() +*/ + +/*! + Creates a property browser with the given \a parent. +*/ +QtTreePropertyBrowser::QtTreePropertyBrowser(QWidget *parent) + : QtAbstractPropertyBrowser(parent) +{ + d_ptr = new QtTreePropertyBrowserPrivate; + d_ptr->q_ptr = this; + + d_ptr->init(this); + connect(this, SIGNAL(currentItemChanged(QtBrowserItem*)), this, SLOT(slotCurrentBrowserItemChanged(QtBrowserItem*))); +} + +/*! + Destroys this property browser. + + Note that the properties that were inserted into this browser are + \e not destroyed since they may still be used in other + browsers. The properties are owned by the manager that created + them. + + \sa QtProperty, QtAbstractPropertyManager +*/ +QtTreePropertyBrowser::~QtTreePropertyBrowser() +{ + delete d_ptr; +} + +/*! + \property QtTreePropertyBrowser::indentation + \brief indentation of the items in the tree view. +*/ +int QtTreePropertyBrowser::indentation() const +{ + return d_ptr->m_treeWidget->indentation(); +} + +void QtTreePropertyBrowser::setIndentation(int i) +{ + d_ptr->m_treeWidget->setIndentation(i); +} + +/*! + \property QtTreePropertyBrowser::rootIsDecorated + \brief whether to show controls for expanding and collapsing root items. +*/ +bool QtTreePropertyBrowser::rootIsDecorated() const +{ + return d_ptr->m_treeWidget->rootIsDecorated(); +} + +void QtTreePropertyBrowser::setRootIsDecorated(bool show) +{ + d_ptr->m_treeWidget->setRootIsDecorated(show); + QMapIterator it(d_ptr->m_itemToIndex); + while (it.hasNext()) { + QtProperty *property = it.next().value()->property(); + if (!property->hasValue()) + d_ptr->updateItem(it.key()); + } +} + +/*! + \property QtTreePropertyBrowser::alternatingRowColors + \brief whether to draw the background using alternating colors. + By default this property is set to true. +*/ +bool QtTreePropertyBrowser::alternatingRowColors() const +{ + return d_ptr->m_treeWidget->alternatingRowColors(); +} + +void QtTreePropertyBrowser::setAlternatingRowColors(bool enable) +{ + d_ptr->m_treeWidget->setAlternatingRowColors(enable); + QMapIterator it(d_ptr->m_itemToIndex); +} + +/*! + \property QtTreePropertyBrowser::headerVisible + \brief whether to show the header. +*/ +bool QtTreePropertyBrowser::isHeaderVisible() const +{ + return d_ptr->m_headerVisible; +} + +void QtTreePropertyBrowser::setHeaderVisible(bool visible) +{ + if (d_ptr->m_headerVisible == visible) + return; + + d_ptr->m_headerVisible = visible; + d_ptr->m_treeWidget->header()->setVisible(visible); +} + +/*! + \enum QtTreePropertyBrowser::ResizeMode + + The resize mode specifies the behavior of the header sections. + + \value Interactive The user can resize the sections. + The sections can also be resized programmatically using setSplitterPosition(). + + \value Fixed The user cannot resize the section. + The section can only be resized programmatically using setSplitterPosition(). + + \value Stretch QHeaderView will automatically resize the section to fill the available space. + The size cannot be changed by the user or programmatically. + + \value ResizeToContents QHeaderView will automatically resize the section to its optimal + size based on the contents of the entire column. + The size cannot be changed by the user or programmatically. + + \sa setResizeMode() +*/ + +/*! + \property QtTreePropertyBrowser::resizeMode + \brief the resize mode of setions in the header. +*/ + +QtTreePropertyBrowser::ResizeMode QtTreePropertyBrowser::resizeMode() const +{ + return d_ptr->m_resizeMode; +} + +void QtTreePropertyBrowser::setResizeMode(QtTreePropertyBrowser::ResizeMode mode) +{ + if (d_ptr->m_resizeMode == mode) + return; + + d_ptr->m_resizeMode = mode; + QHeaderView::ResizeMode m = QHeaderView::Stretch; + switch (mode) { + case QtTreePropertyBrowser::Interactive: m = QHeaderView::Interactive; break; + case QtTreePropertyBrowser::Fixed: m = QHeaderView::Fixed; break; + case QtTreePropertyBrowser::ResizeToContents: m = QHeaderView::ResizeToContents; break; + case QtTreePropertyBrowser::Stretch: + default: m = QHeaderView::Stretch; break; + } + d_ptr->m_treeWidget->header()->setResizeMode(m); +} + +/*! + \property QtTreePropertyBrowser::splitterPosition + \brief the position of the splitter between the colunms. +*/ + +int QtTreePropertyBrowser::splitterPosition() const +{ + return d_ptr->m_treeWidget->header()->sectionSize(0); +} + +void QtTreePropertyBrowser::setSplitterPosition(int position) +{ + d_ptr->m_treeWidget->header()->resizeSection(0, position); +} + +/*! + Sets the \a item to either collapse or expanded, depending on the value of \a expanded. + + \sa isExpanded(), expanded(), collapsed() +*/ + +void QtTreePropertyBrowser::setExpanded(QtBrowserItem *item, bool expanded) +{ + QTreeWidgetItem *treeItem = d_ptr->m_indexToItem.value(item); + if (treeItem) + treeItem->setExpanded(expanded); +} + +/*! + Returns true if the \a item is expanded; otherwise returns false. + + \sa setExpanded() +*/ + +bool QtTreePropertyBrowser::isExpanded(QtBrowserItem *item) const +{ + QTreeWidgetItem *treeItem = d_ptr->m_indexToItem.value(item); + if (treeItem) + return treeItem->isExpanded(); + return false; +} + +/*! + Returns true if the \a item is visible; otherwise returns false. + + \sa setItemVisible() + \since 4.5 +*/ + +bool QtTreePropertyBrowser::isItemVisible(QtBrowserItem *item) const +{ + if (const QTreeWidgetItem *treeItem = d_ptr->m_indexToItem.value(item)) + return !treeItem->isHidden(); + return false; +} + +/*! + Sets the \a item to be visible, depending on the value of \a visible. + + \sa isItemVisible() + \since 4.5 +*/ + +void QtTreePropertyBrowser::setItemVisible(QtBrowserItem *item, bool visible) +{ + if (QTreeWidgetItem *treeItem = d_ptr->m_indexToItem.value(item)) + treeItem->setHidden(!visible); +} + +/*! + Sets the \a item's background color to \a color. Note that while item's background + is rendered every second row is being drawn with alternate color (which is a bit lighter than items \a color) + + \sa backgroundColor(), calculatedBackgroundColor() +*/ + +void QtTreePropertyBrowser::setBackgroundColor(QtBrowserItem *item, const QColor &color) +{ + if (!d_ptr->m_indexToItem.contains(item)) + return; + if (color.isValid()) + d_ptr->m_indexToBackgroundColor[item] = color; + else + d_ptr->m_indexToBackgroundColor.remove(item); + d_ptr->m_treeWidget->viewport()->update(); +} + +/*! + Returns the \a item's color. If there is no color set for item it returns invalid color. + + \sa calculatedBackgroundColor(), setBackgroundColor() +*/ + +QColor QtTreePropertyBrowser::backgroundColor(QtBrowserItem *item) const +{ + return d_ptr->m_indexToBackgroundColor.value(item); +} + +/*! + Returns the \a item's color. If there is no color set for item it returns parent \a item's + color (if there is no color set for parent it returns grandparent's color and so on). In case + the color is not set for \a item and it's top level item it returns invalid color. + + \sa backgroundColor(), setBackgroundColor() +*/ + +QColor QtTreePropertyBrowser::calculatedBackgroundColor(QtBrowserItem *item) const +{ + return d_ptr->calculatedBackgroundColor(item); +} + +/*! + \property QtTreePropertyBrowser::propertiesWithoutValueMarked + \brief whether to enable or disable marking properties without value. + + When marking is enabled the item's background is rendered in dark color and item's + foreground is rendered with light color. + + \sa propertiesWithoutValueMarked() +*/ +void QtTreePropertyBrowser::setPropertiesWithoutValueMarked(bool mark) +{ + if (d_ptr->m_markPropertiesWithoutValue == mark) + return; + + d_ptr->m_markPropertiesWithoutValue = mark; + QMapIterator it(d_ptr->m_itemToIndex); + while (it.hasNext()) { + QtProperty *property = it.next().value()->property(); + if (!property->hasValue()) + d_ptr->updateItem(it.key()); + } + d_ptr->m_treeWidget->viewport()->update(); +} + +bool QtTreePropertyBrowser::propertiesWithoutValueMarked() const +{ + return d_ptr->m_markPropertiesWithoutValue; +} + +/*! + \reimp +*/ +void QtTreePropertyBrowser::itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem) +{ + d_ptr->propertyInserted(item, afterItem); +} + +/*! + \reimp +*/ +void QtTreePropertyBrowser::itemRemoved(QtBrowserItem *item) +{ + d_ptr->propertyRemoved(item); +} + +/*! + \reimp +*/ +void QtTreePropertyBrowser::itemChanged(QtBrowserItem *item) +{ + d_ptr->propertyChanged(item); +} + +/*! + Sets the current item to \a item and opens the relevant editor for it. +*/ +void QtTreePropertyBrowser::editItem(QtBrowserItem *item) +{ + d_ptr->editItem(item); +} + +#if QT_VERSION >= 0x040400 +QT_END_NAMESPACE +#endif + +#include "moc_qttreepropertybrowser.cxx" +#include "qttreepropertybrowser.moc" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qttreepropertybrowser.h b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qttreepropertybrowser.h new file mode 100644 index 000000000..f664609d7 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qttreepropertybrowser.h @@ -0,0 +1,184 @@ +/**************************************************************************** +** +** This file is part of a Qt Solutions component. +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QTTREEPROPERTYBROWSER_H +#define QTTREEPROPERTYBROWSER_H + +#include "qtpropertybrowser.h" + +#if QT_VERSION >= 0x040400 +QT_BEGIN_NAMESPACE +#endif + +class QTreeWidgetItem; +class QtTreePropertyBrowserPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtTreePropertyBrowser : public QtAbstractPropertyBrowser +{ + Q_OBJECT + Q_ENUMS(ResizeMode) + Q_PROPERTY(int indentation READ indentation WRITE setIndentation) + Q_PROPERTY(bool rootIsDecorated READ rootIsDecorated WRITE setRootIsDecorated) + Q_PROPERTY(bool alternatingRowColors READ alternatingRowColors WRITE setAlternatingRowColors) + Q_PROPERTY(bool headerVisible READ isHeaderVisible WRITE setHeaderVisible) + Q_PROPERTY(ResizeMode resizeMode READ resizeMode WRITE setResizeMode) + Q_PROPERTY(int splitterPosition READ splitterPosition WRITE setSplitterPosition) + Q_PROPERTY(bool propertiesWithoutValueMarked READ propertiesWithoutValueMarked WRITE setPropertiesWithoutValueMarked) +public: + + enum ResizeMode + { + Interactive, + Stretch, + Fixed, + ResizeToContents + }; + + QtTreePropertyBrowser(QWidget *parent = 0); + ~QtTreePropertyBrowser(); + + int indentation() const; + void setIndentation(int i); + + bool rootIsDecorated() const; + void setRootIsDecorated(bool show); + + bool alternatingRowColors() const; + void setAlternatingRowColors(bool enable); + + bool isHeaderVisible() const; + void setHeaderVisible(bool visible); + + ResizeMode resizeMode() const; + void setResizeMode(ResizeMode mode); + + int splitterPosition() const; + void setSplitterPosition(int position); + + void setExpanded(QtBrowserItem *item, bool expanded); + bool isExpanded(QtBrowserItem *item) const; + + bool isItemVisible(QtBrowserItem *item) const; + void setItemVisible(QtBrowserItem *item, bool visible); + + void setBackgroundColor(QtBrowserItem *item, const QColor &color); + QColor backgroundColor(QtBrowserItem *item) const; + QColor calculatedBackgroundColor(QtBrowserItem *item) const; + + void setPropertiesWithoutValueMarked(bool mark); + bool propertiesWithoutValueMarked() const; + + void editItem(QtBrowserItem *item); + +Q_SIGNALS: + + void collapsed(QtBrowserItem *item); + void expanded(QtBrowserItem *item); + +protected: + virtual void itemInserted(QtBrowserItem *item, QtBrowserItem *afterItem); + virtual void itemRemoved(QtBrowserItem *item); + virtual void itemChanged(QtBrowserItem *item); + +private: + + QtTreePropertyBrowserPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtTreePropertyBrowser) + Q_DISABLE_COPY(QtTreePropertyBrowser) + + Q_PRIVATE_SLOT(d_func(), void slotCollapsed(const QModelIndex &)) + Q_PRIVATE_SLOT(d_func(), void slotExpanded(const QModelIndex &)) + Q_PRIVATE_SLOT(d_func(), void slotCurrentBrowserItemChanged(QtBrowserItem *)) + Q_PRIVATE_SLOT(d_func(), void slotCurrentTreeItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)) + +}; + +#if QT_VERSION >= 0x040400 +QT_END_NAMESPACE +#endif + +#endif diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtvariantproperty.cpp b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtvariantproperty.cpp new file mode 100644 index 000000000..820e6e2f1 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtvariantproperty.cpp @@ -0,0 +1,2329 @@ +/**************************************************************************** +** +** This file is part of a Qt Solutions component. +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qtvariantproperty.h" +#include "qtpropertymanager.h" +#include "qteditorfactory.h" +#include +#include +#include +#include + +#if defined(Q_CC_MSVC) +# pragma warning(disable: 4786) /* MS VS 6: truncating debug info after 255 characters */ +#endif + +#if QT_VERSION >= 0x040400 +QT_BEGIN_NAMESPACE +#endif + +class QtEnumPropertyType +{ +}; + + +class QtFlagPropertyType +{ +}; + + +class QtGroupPropertyType +{ +}; + +#if QT_VERSION >= 0x040400 +QT_END_NAMESPACE +#endif + +Q_DECLARE_METATYPE(QtEnumPropertyType) +Q_DECLARE_METATYPE(QtFlagPropertyType) +Q_DECLARE_METATYPE(QtGroupPropertyType) + +#if QT_VERSION >= 0x040400 +QT_BEGIN_NAMESPACE +#endif + +/*! + Returns the type id for an enum property. + + Note that the property's value type can be retrieved using the + valueType() function (which is QVariant::Int for the enum property + type). + + \sa propertyType(), valueType() +*/ +int QtVariantPropertyManager::enumTypeId() +{ + return qMetaTypeId(); +} + +/*! + Returns the type id for a flag property. + + Note that the property's value type can be retrieved using the + valueType() function (which is QVariant::Int for the flag property + type). + + \sa propertyType(), valueType() +*/ +int QtVariantPropertyManager::flagTypeId() +{ + return qMetaTypeId(); +} + +/*! + Returns the type id for a group property. + + Note that the property's value type can be retrieved using the + valueType() function (which is QVariant::Invalid for the group + property type, since it doesn't provide any value). + + \sa propertyType(), valueType() +*/ +int QtVariantPropertyManager::groupTypeId() +{ + return qMetaTypeId(); +} + +/*! + Returns the type id for a icon map attribute. + + Note that the property's attribute type can be retrieved using the + attributeType() function. + + \sa attributeType(), QtEnumPropertyManager::enumIcons() +*/ +int QtVariantPropertyManager::iconMapTypeId() +{ + return qMetaTypeId(); +} + +typedef QMap PropertyMap; +Q_GLOBAL_STATIC(PropertyMap, propertyToWrappedProperty) + +static QtProperty *wrappedProperty(QtProperty *property) +{ + return propertyToWrappedProperty()->value(property, 0); +} + +class QtVariantPropertyPrivate +{ + QtVariantProperty *q_ptr; +public: + QtVariantPropertyPrivate(QtVariantPropertyManager *m) : manager(m) {} + + QtVariantPropertyManager *manager; +}; + +/*! + \class QtVariantProperty + + \brief The QtVariantProperty class is a convenience class handling + QVariant based properties. + + QtVariantProperty provides additional API: A property's type, + value type, attribute values and current value can easily be + retrieved using the propertyType(), valueType(), attributeValue() + and value() functions respectively. In addition, the attribute + values and the current value can be set using the corresponding + setValue() and setAttribute() functions. + + For example, instead of writing: + + \code + QtVariantPropertyManager *variantPropertyManager; + QtProperty *property; + + variantPropertyManager->setValue(property, 10); + \endcode + + you can write: + + \code + QtVariantPropertyManager *variantPropertyManager; + QtVariantProperty *property; + + property->setValue(10); + \endcode + + QtVariantProperty instances can only be created by the + QtVariantPropertyManager class. + + \sa QtProperty, QtVariantPropertyManager, QtVariantEditorFactory +*/ + +/*! + Creates a variant property using the given \a manager. + + Do not use this constructor to create variant property instances; + use the QtVariantPropertyManager::addProperty() function + instead. This constructor is used internally by the + QtVariantPropertyManager::createProperty() function. + + \sa QtVariantPropertyManager +*/ +QtVariantProperty::QtVariantProperty(QtVariantPropertyManager *manager) + : QtProperty(manager), d_ptr(new QtVariantPropertyPrivate(manager)) +{ + +} + +/*! + Destroys this property. + + \sa QtProperty::~QtProperty() +*/ +QtVariantProperty::~QtVariantProperty() +{ + delete d_ptr; +} + +/*! + Returns the property's current value. + + \sa valueType(), setValue() +*/ +QVariant QtVariantProperty::value() const +{ + return d_ptr->manager->value(this); +} + +/*! + Returns this property's value for the specified \a attribute. + + QtVariantPropertyManager provides a couple of related functions: + \l{QtVariantPropertyManager::attributes()}{attributes()} and + \l{QtVariantPropertyManager::attributeType()}{attributeType()}. + + \sa setAttribute() +*/ +QVariant QtVariantProperty::attributeValue(const QString &attribute) const +{ + return d_ptr->manager->attributeValue(this, attribute); +} + +/*! + Returns the type of this property's value. + + \sa propertyType() +*/ +int QtVariantProperty::valueType() const +{ + return d_ptr->manager->valueType(this); +} + +/*! + Returns this property's type. + + QtVariantPropertyManager provides several related functions: + \l{QtVariantPropertyManager::enumTypeId()}{enumTypeId()}, + \l{QtVariantPropertyManager::flagTypeId()}{flagTypeId()} and + \l{QtVariantPropertyManager::groupTypeId()}{groupTypeId()}. + + \sa valueType() +*/ +int QtVariantProperty::propertyType() const +{ + return d_ptr->manager->propertyType(this); +} + +/*! + Sets the value of this property to \a value. + + The specified \a value must be of the type returned by + valueType(), or of a type that can be converted to valueType() + using the QVariant::canConvert() function; otherwise this function + does nothing. + + \sa value() +*/ +void QtVariantProperty::setValue(const QVariant &value) +{ + d_ptr->manager->setValue(this, value); +} + +/*! + Sets the \a attribute of property to \a value. + + QtVariantPropertyManager provides the related + \l{QtVariantPropertyManager::setAttribute()}{setAttribute()} + function. + + \sa attributeValue() +*/ +void QtVariantProperty::setAttribute(const QString &attribute, const QVariant &value) +{ + d_ptr->manager->setAttribute(this, attribute, value); +} + +class QtVariantPropertyManagerPrivate +{ + QtVariantPropertyManager *q_ptr; + Q_DECLARE_PUBLIC(QtVariantPropertyManager) +public: + QtVariantPropertyManagerPrivate(); + + bool m_creatingProperty; + bool m_creatingSubProperties; + bool m_destroyingSubProperties; + int m_propertyType; + + void slotValueChanged(QtProperty *property, int val); + void slotRangeChanged(QtProperty *property, int min, int max); + void slotSingleStepChanged(QtProperty *property, int step); + void slotValueChanged(QtProperty *property, double val); + void slotRangeChanged(QtProperty *property, double min, double max); + void slotSingleStepChanged(QtProperty *property, double step); + void slotDecimalsChanged(QtProperty *property, int prec); + void slotValueChanged(QtProperty *property, bool val); + void slotValueChanged(QtProperty *property, const QString &val); + void slotRegExpChanged(QtProperty *property, const QRegExp ®Exp); + void slotValueChanged(QtProperty *property, const QDate &val); + void slotRangeChanged(QtProperty *property, const QDate &min, const QDate &max); + void slotValueChanged(QtProperty *property, const QTime &val); + void slotValueChanged(QtProperty *property, const QDateTime &val); + void slotValueChanged(QtProperty *property, const QKeySequence &val); + void slotValueChanged(QtProperty *property, const QChar &val); + void slotValueChanged(QtProperty *property, const QLocale &val); + void slotValueChanged(QtProperty *property, const QPoint &val); + void slotValueChanged(QtProperty *property, const QPointF &val); + void slotValueChanged(QtProperty *property, const QSize &val); + void slotRangeChanged(QtProperty *property, const QSize &min, const QSize &max); + void slotValueChanged(QtProperty *property, const QSizeF &val); + void slotRangeChanged(QtProperty *property, const QSizeF &min, const QSizeF &max); + void slotValueChanged(QtProperty *property, const QRect &val); + void slotConstraintChanged(QtProperty *property, const QRect &val); + void slotValueChanged(QtProperty *property, const QRectF &val); + void slotConstraintChanged(QtProperty *property, const QRectF &val); + void slotValueChanged(QtProperty *property, const QColor &val); + void slotEnumChanged(QtProperty *property, int val); + void slotEnumNamesChanged(QtProperty *property, const QStringList &enumNames); + void slotEnumIconsChanged(QtProperty *property, const QMap &enumIcons); + void slotValueChanged(QtProperty *property, const QSizePolicy &val); + void slotValueChanged(QtProperty *property, const QFont &val); + void slotValueChanged(QtProperty *property, const QCursor &val); + void slotFlagChanged(QtProperty *property, int val); + void slotFlagNamesChanged(QtProperty *property, const QStringList &flagNames); + void slotPropertyInserted(QtProperty *property, QtProperty *parent, QtProperty *after); + void slotPropertyRemoved(QtProperty *property, QtProperty *parent); + + void valueChanged(QtProperty *property, const QVariant &val); + + int internalPropertyToType(QtProperty *property) const; + QtVariantProperty *createSubProperty(QtVariantProperty *parent, QtVariantProperty *after, + QtProperty *internal); + void removeSubProperty(QtVariantProperty *property); + + QMap m_typeToPropertyManager; + QMap > m_typeToAttributeToAttributeType; + + QMap > m_propertyToType; + + QMap m_typeToValueType; + + + QMap m_internalToProperty; + + const QString m_constraintAttribute; + const QString m_singleStepAttribute; + const QString m_decimalsAttribute; + const QString m_enumIconsAttribute; + const QString m_enumNamesAttribute; + const QString m_flagNamesAttribute; + const QString m_maximumAttribute; + const QString m_minimumAttribute; + const QString m_regExpAttribute; +}; + +QtVariantPropertyManagerPrivate::QtVariantPropertyManagerPrivate() : + m_constraintAttribute(QLatin1String("constraint")), + m_singleStepAttribute(QLatin1String("singleStep")), + m_decimalsAttribute(QLatin1String("decimals")), + m_enumIconsAttribute(QLatin1String("enumIcons")), + m_enumNamesAttribute(QLatin1String("enumNames")), + m_flagNamesAttribute(QLatin1String("flagNames")), + m_maximumAttribute(QLatin1String("maximum")), + m_minimumAttribute(QLatin1String("minimum")), + m_regExpAttribute(QLatin1String("regExp")) +{ +} + +int QtVariantPropertyManagerPrivate::internalPropertyToType(QtProperty *property) const +{ + int type = 0; + QtAbstractPropertyManager *internPropertyManager = property->propertyManager(); + if (qobject_cast(internPropertyManager)) + type = QVariant::Int; + else if (qobject_cast(internPropertyManager)) + type = QtVariantPropertyManager::enumTypeId(); + else if (qobject_cast(internPropertyManager)) + type = QVariant::Bool; + else if (qobject_cast(internPropertyManager)) + type = QVariant::Double; + return type; +} + +QtVariantProperty *QtVariantPropertyManagerPrivate::createSubProperty(QtVariantProperty *parent, + QtVariantProperty *after, QtProperty *internal) +{ + int type = internalPropertyToType(internal); + if (!type) + return 0; + + bool wasCreatingSubProperties = m_creatingSubProperties; + m_creatingSubProperties = true; + + QtVariantProperty *varChild = q_ptr->addProperty(type, internal->propertyName()); + + m_creatingSubProperties = wasCreatingSubProperties; + + varChild->setPropertyName(internal->propertyName()); + varChild->setToolTip(internal->toolTip()); + varChild->setStatusTip(internal->statusTip()); + varChild->setWhatsThis(internal->whatsThis()); + + parent->insertSubProperty(varChild, after); + + m_internalToProperty[internal] = varChild; + propertyToWrappedProperty()->insert(varChild, internal); + return varChild; +} + +void QtVariantPropertyManagerPrivate::removeSubProperty(QtVariantProperty *property) +{ + QtProperty *internChild = wrappedProperty(property); + bool wasDestroyingSubProperties = m_destroyingSubProperties; + m_destroyingSubProperties = true; + delete property; + m_destroyingSubProperties = wasDestroyingSubProperties; + m_internalToProperty.remove(internChild); + propertyToWrappedProperty()->remove(property); +} + +void QtVariantPropertyManagerPrivate::slotPropertyInserted(QtProperty *property, + QtProperty *parent, QtProperty *after) +{ + if (m_creatingProperty) + return; + + QtVariantProperty *varParent = m_internalToProperty.value(parent, 0); + if (!varParent) + return; + + QtVariantProperty *varAfter = 0; + if (after) { + varAfter = m_internalToProperty.value(after, 0); + if (!varAfter) + return; + } + + createSubProperty(varParent, varAfter, property); +} + +void QtVariantPropertyManagerPrivate::slotPropertyRemoved(QtProperty *property, QtProperty *parent) +{ + Q_UNUSED(parent) + + QtVariantProperty *varProperty = m_internalToProperty.value(property, 0); + if (!varProperty) + return; + + removeSubProperty(varProperty); +} + +void QtVariantPropertyManagerPrivate::valueChanged(QtProperty *property, const QVariant &val) +{ + QtVariantProperty *varProp = m_internalToProperty.value(property, 0); + if (!varProp) + return; + emit q_ptr->valueChanged(varProp, val); + emit q_ptr->propertyChanged(varProp); +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, int val) +{ + valueChanged(property, QVariant(val)); +} + +void QtVariantPropertyManagerPrivate::slotRangeChanged(QtProperty *property, int min, int max) +{ + if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) { + emit q_ptr->attributeChanged(varProp, m_minimumAttribute, QVariant(min)); + emit q_ptr->attributeChanged(varProp, m_maximumAttribute, QVariant(max)); + } +} + +void QtVariantPropertyManagerPrivate::slotSingleStepChanged(QtProperty *property, int step) +{ + if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) + emit q_ptr->attributeChanged(varProp, m_singleStepAttribute, QVariant(step)); +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, double val) +{ + valueChanged(property, QVariant(val)); +} + +void QtVariantPropertyManagerPrivate::slotRangeChanged(QtProperty *property, double min, double max) +{ + if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) { + emit q_ptr->attributeChanged(varProp, m_minimumAttribute, QVariant(min)); + emit q_ptr->attributeChanged(varProp, m_maximumAttribute, QVariant(max)); + } +} + +void QtVariantPropertyManagerPrivate::slotSingleStepChanged(QtProperty *property, double step) +{ + if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) + emit q_ptr->attributeChanged(varProp, m_singleStepAttribute, QVariant(step)); +} + +void QtVariantPropertyManagerPrivate::slotDecimalsChanged(QtProperty *property, int prec) +{ + if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) + emit q_ptr->attributeChanged(varProp, m_decimalsAttribute, QVariant(prec)); +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, bool val) +{ + valueChanged(property, QVariant(val)); +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QString &val) +{ + valueChanged(property, QVariant(val)); +} + +void QtVariantPropertyManagerPrivate::slotRegExpChanged(QtProperty *property, const QRegExp ®Exp) +{ + if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) + emit q_ptr->attributeChanged(varProp, m_regExpAttribute, QVariant(regExp)); +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QDate &val) +{ + valueChanged(property, QVariant(val)); +} + +void QtVariantPropertyManagerPrivate::slotRangeChanged(QtProperty *property, const QDate &min, const QDate &max) +{ + if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) { + emit q_ptr->attributeChanged(varProp, m_minimumAttribute, QVariant(min)); + emit q_ptr->attributeChanged(varProp, m_maximumAttribute, QVariant(max)); + } +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QTime &val) +{ + valueChanged(property, QVariant(val)); +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QDateTime &val) +{ + valueChanged(property, QVariant(val)); +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QKeySequence &val) +{ + QVariant v; + qVariantSetValue(v, val); + valueChanged(property, v); +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QChar &val) +{ + valueChanged(property, QVariant(val)); +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QLocale &val) +{ + valueChanged(property, QVariant(val)); +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QPoint &val) +{ + valueChanged(property, QVariant(val)); +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QPointF &val) +{ + valueChanged(property, QVariant(val)); +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QSize &val) +{ + valueChanged(property, QVariant(val)); +} + +void QtVariantPropertyManagerPrivate::slotRangeChanged(QtProperty *property, const QSize &min, const QSize &max) +{ + if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) { + emit q_ptr->attributeChanged(varProp, m_minimumAttribute, QVariant(min)); + emit q_ptr->attributeChanged(varProp, m_maximumAttribute, QVariant(max)); + } +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QSizeF &val) +{ + valueChanged(property, QVariant(val)); +} + +void QtVariantPropertyManagerPrivate::slotRangeChanged(QtProperty *property, const QSizeF &min, const QSizeF &max) +{ + if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) { + emit q_ptr->attributeChanged(varProp, m_minimumAttribute, QVariant(min)); + emit q_ptr->attributeChanged(varProp, m_maximumAttribute, QVariant(max)); + } +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QRect &val) +{ + valueChanged(property, QVariant(val)); +} + +void QtVariantPropertyManagerPrivate::slotConstraintChanged(QtProperty *property, const QRect &constraint) +{ + if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) + emit q_ptr->attributeChanged(varProp, m_constraintAttribute, QVariant(constraint)); +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QRectF &val) +{ + valueChanged(property, QVariant(val)); +} + +void QtVariantPropertyManagerPrivate::slotConstraintChanged(QtProperty *property, const QRectF &constraint) +{ + if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) + emit q_ptr->attributeChanged(varProp, m_constraintAttribute, QVariant(constraint)); +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QColor &val) +{ + valueChanged(property, QVariant(val)); +} + +void QtVariantPropertyManagerPrivate::slotEnumNamesChanged(QtProperty *property, const QStringList &enumNames) +{ + if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) + emit q_ptr->attributeChanged(varProp, m_enumNamesAttribute, QVariant(enumNames)); +} + +void QtVariantPropertyManagerPrivate::slotEnumIconsChanged(QtProperty *property, const QMap &enumIcons) +{ + if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) { + QVariant v; + qVariantSetValue(v, enumIcons); + emit q_ptr->attributeChanged(varProp, m_enumIconsAttribute, v); + } +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QSizePolicy &val) +{ + valueChanged(property, QVariant(val)); +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QFont &val) +{ + valueChanged(property, QVariant(val)); +} + +void QtVariantPropertyManagerPrivate::slotValueChanged(QtProperty *property, const QCursor &val) +{ +#ifndef QT_NO_CURSOR + valueChanged(property, QVariant(val)); +#endif +} + +void QtVariantPropertyManagerPrivate::slotFlagNamesChanged(QtProperty *property, const QStringList &flagNames) +{ + if (QtVariantProperty *varProp = m_internalToProperty.value(property, 0)) + emit q_ptr->attributeChanged(varProp, m_flagNamesAttribute, QVariant(flagNames)); +} + +/*! + \class QtVariantPropertyManager + + \brief The QtVariantPropertyManager class provides and manages QVariant based properties. + + QtVariantPropertyManager provides the addProperty() function which + creates QtVariantProperty objects. The QtVariantProperty class is + a convenience class handling QVariant based properties inheriting + QtProperty. A QtProperty object created by a + QtVariantPropertyManager instance can be converted into a + QtVariantProperty object using the variantProperty() function. + + The property's value can be retrieved using the value(), and set + using the setValue() slot. In addition the property's type, and + the type of its value, can be retrieved using the propertyType() + and valueType() functions respectively. + + A property's type is a QVariant::Type enumerator value, and + usually a property's type is the same as its value type. But for + some properties the types differ, for example for enums, flags and + group types in which case QtVariantPropertyManager provides the + enumTypeId(), flagTypeId() and groupTypeId() functions, + respectively, to identify their property type (the value types are + QVariant::Int for the enum and flag types, and QVariant::Invalid + for the group type). + + Use the isPropertyTypeSupported() function to check if a particular + property type is supported. The currently supported property types + are: + + \table + \header + \o Property Type + \o Property Type Id + \row + \o int + \o QVariant::Int + \row + \o double + \o QVariant::Double + \row + \o bool + \o QVariant::Bool + \row + \o QString + \o QVariant::String + \row + \o QDate + \o QVariant::Date + \row + \o QTime + \o QVariant::Time + \row + \o QDateTime + \o QVariant::DateTime + \row + \o QKeySequence + \o QVariant::KeySequence + \row + \o QChar + \o QVariant::Char + \row + \o QLocale + \o QVariant::Locale + \row + \o QPoint + \o QVariant::Point + \row + \o QPointF + \o QVariant::PointF + \row + \o QSize + \o QVariant::Size + \row + \o QSizeF + \o QVariant::SizeF + \row + \o QRect + \o QVariant::Rect + \row + \o QRectF + \o QVariant::RectF + \row + \o QColor + \o QVariant::Color + \row + \o QSizePolicy + \o QVariant::SizePolicy + \row + \o QFont + \o QVariant::Font + \row + \o QCursor + \o QVariant::Cursor + \row + \o enum + \o enumTypeId() + \row + \o flag + \o flagTypeId() + \row + \o group + \o groupTypeId() + \endtable + + Each property type can provide additional attributes, + e.g. QVariant::Int and QVariant::Double provides minimum and + maximum values. The currently supported attributes are: + + \table + \header + \o Property Type + \o Attribute Name + \o Attribute Type + \row + \o \c int + \o minimum + \o QVariant::Int + \row + \o + \o maximum + \o QVariant::Int + \row + \o + \o singleStep + \o QVariant::Int + \row + \o \c double + \o minimum + \o QVariant::Double + \row + \o + \o maximum + \o QVariant::Double + \row + \o + \o singleStep + \o QVariant::Double + \row + \o + \o decimals + \o QVariant::Int + \row + \o QString + \o regExp + \o QVariant::RegExp + \row + \o QDate + \o minimum + \o QVariant::Date + \row + \o + \o maximum + \o QVariant::Date + \row + \o QPointF + \o decimals + \o QVariant::Int + \row + \o QSize + \o minimum + \o QVariant::Size + \row + \o + \o maximum + \o QVariant::Size + \row + \o QSizeF + \o minimum + \o QVariant::SizeF + \row + \o + \o maximum + \o QVariant::SizeF + \row + \o + \o decimals + \o QVariant::Int + \row + \o QRect + \o constraint + \o QVariant::Rect + \row + \o QRectF + \o constraint + \o QVariant::RectF + \row + \o + \o decimals + \o QVariant::Int + \row + \o \c enum + \o enumNames + \o QVariant::StringList + \row + \o + \o enumIcons + \o iconMapTypeId() + \row + \o \c flag + \o flagNames + \o QVariant::StringList + \endtable + + The attributes for a given property type can be retrieved using + the attributes() function. Each attribute has a value type which + can be retrieved using the attributeType() function, and a value + accessible through the attributeValue() function. In addition, the + value can be set using the setAttribute() slot. + + QtVariantManager also provides the valueChanged() signal which is + emitted whenever a property created by this manager change, and + the attributeChanged() signal which is emitted whenever an + attribute of such a property changes. + + \sa QtVariantProperty, QtVariantEditorFactory +*/ + +/*! + \fn void QtVariantPropertyManager::valueChanged(QtProperty *property, const QVariant &value) + + This signal is emitted whenever a property created by this manager + changes its value, passing a pointer to the \a property and the + new \a value as parameters. + + \sa setValue() +*/ + +/*! + \fn void QtVariantPropertyManager::attributeChanged(QtProperty *property, + const QString &attribute, const QVariant &value) + + This signal is emitted whenever an attribute of a property created + by this manager changes its value, passing a pointer to the \a + property, the \a attribute and the new \a value as parameters. + + \sa setAttribute() +*/ + +/*! + Creates a manager with the given \a parent. +*/ +QtVariantPropertyManager::QtVariantPropertyManager(QObject *parent) + : QtAbstractPropertyManager(parent) +{ + d_ptr = new QtVariantPropertyManagerPrivate; + d_ptr->q_ptr = this; + + d_ptr->m_creatingProperty = false; + d_ptr->m_creatingSubProperties = false; + d_ptr->m_destroyingSubProperties = false; + d_ptr->m_propertyType = 0; + + // IntPropertyManager + QtIntPropertyManager *intPropertyManager = new QtIntPropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::Int] = intPropertyManager; + d_ptr->m_typeToAttributeToAttributeType[QVariant::Int][d_ptr->m_minimumAttribute] = QVariant::Int; + d_ptr->m_typeToAttributeToAttributeType[QVariant::Int][d_ptr->m_maximumAttribute] = QVariant::Int; + d_ptr->m_typeToAttributeToAttributeType[QVariant::Int][d_ptr->m_singleStepAttribute] = QVariant::Int; + d_ptr->m_typeToValueType[QVariant::Int] = QVariant::Int; + connect(intPropertyManager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotValueChanged(QtProperty *, int))); + connect(intPropertyManager, SIGNAL(rangeChanged(QtProperty *, int, int)), + this, SLOT(slotRangeChanged(QtProperty *, int, int))); + connect(intPropertyManager, SIGNAL(singleStepChanged(QtProperty *, int)), + this, SLOT(slotSingleStepChanged(QtProperty *, int))); + // DoublePropertyManager + QtDoublePropertyManager *doublePropertyManager = new QtDoublePropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::Double] = doublePropertyManager; + d_ptr->m_typeToAttributeToAttributeType[QVariant::Double][d_ptr->m_minimumAttribute] = + QVariant::Double; + d_ptr->m_typeToAttributeToAttributeType[QVariant::Double][d_ptr->m_maximumAttribute] = + QVariant::Double; + d_ptr->m_typeToAttributeToAttributeType[QVariant::Double][d_ptr->m_singleStepAttribute] = + QVariant::Double; + d_ptr->m_typeToAttributeToAttributeType[QVariant::Double][d_ptr->m_decimalsAttribute] = + QVariant::Int; + d_ptr->m_typeToValueType[QVariant::Double] = QVariant::Double; + connect(doublePropertyManager, SIGNAL(valueChanged(QtProperty *, double)), + this, SLOT(slotValueChanged(QtProperty *, double))); + connect(doublePropertyManager, SIGNAL(rangeChanged(QtProperty *, double, double)), + this, SLOT(slotRangeChanged(QtProperty *, double, double))); + connect(doublePropertyManager, SIGNAL(singleStepChanged(QtProperty *, double)), + this, SLOT(slotSingleStepChanged(QtProperty *, double))); + connect(doublePropertyManager, SIGNAL(decimalsChanged(QtProperty *, int)), + this, SLOT(slotDecimalsChanged(QtProperty *, int))); + // BoolPropertyManager + QtBoolPropertyManager *boolPropertyManager = new QtBoolPropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::Bool] = boolPropertyManager; + d_ptr->m_typeToValueType[QVariant::Bool] = QVariant::Bool; + connect(boolPropertyManager, SIGNAL(valueChanged(QtProperty *, bool)), + this, SLOT(slotValueChanged(QtProperty *, bool))); + // StringPropertyManager + QtStringPropertyManager *stringPropertyManager = new QtStringPropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::String] = stringPropertyManager; + d_ptr->m_typeToValueType[QVariant::String] = QVariant::String; + d_ptr->m_typeToAttributeToAttributeType[QVariant::String][d_ptr->m_regExpAttribute] = + QVariant::RegExp; + connect(stringPropertyManager, SIGNAL(valueChanged(QtProperty *, const QString &)), + this, SLOT(slotValueChanged(QtProperty *, const QString &))); + connect(stringPropertyManager, SIGNAL(regExpChanged(QtProperty *, const QRegExp &)), + this, SLOT(slotRegExpChanged(QtProperty *, const QRegExp &))); + // DatePropertyManager + QtDatePropertyManager *datePropertyManager = new QtDatePropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::Date] = datePropertyManager; + d_ptr->m_typeToValueType[QVariant::Date] = QVariant::Date; + d_ptr->m_typeToAttributeToAttributeType[QVariant::Date][d_ptr->m_minimumAttribute] = + QVariant::Date; + d_ptr->m_typeToAttributeToAttributeType[QVariant::Date][d_ptr->m_maximumAttribute] = + QVariant::Date; + connect(datePropertyManager, SIGNAL(valueChanged(QtProperty *, const QDate &)), + this, SLOT(slotValueChanged(QtProperty *, const QDate &))); + connect(datePropertyManager, SIGNAL(rangeChanged(QtProperty *, const QDate &, const QDate &)), + this, SLOT(slotRangeChanged(QtProperty *, const QDate &, const QDate &))); + // TimePropertyManager + QtTimePropertyManager *timePropertyManager = new QtTimePropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::Time] = timePropertyManager; + d_ptr->m_typeToValueType[QVariant::Time] = QVariant::Time; + connect(timePropertyManager, SIGNAL(valueChanged(QtProperty *, const QTime &)), + this, SLOT(slotValueChanged(QtProperty *, const QTime &))); + // DateTimePropertyManager + QtDateTimePropertyManager *dateTimePropertyManager = new QtDateTimePropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::DateTime] = dateTimePropertyManager; + d_ptr->m_typeToValueType[QVariant::DateTime] = QVariant::DateTime; + connect(dateTimePropertyManager, SIGNAL(valueChanged(QtProperty *, const QDateTime &)), + this, SLOT(slotValueChanged(QtProperty *, const QDateTime &))); + // KeySequencePropertyManager + QtKeySequencePropertyManager *keySequencePropertyManager = new QtKeySequencePropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::KeySequence] = keySequencePropertyManager; + d_ptr->m_typeToValueType[QVariant::KeySequence] = QVariant::KeySequence; + connect(keySequencePropertyManager, SIGNAL(valueChanged(QtProperty *, const QKeySequence &)), + this, SLOT(slotValueChanged(QtProperty *, const QKeySequence &))); + // CharPropertyManager + QtCharPropertyManager *charPropertyManager = new QtCharPropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::Char] = charPropertyManager; + d_ptr->m_typeToValueType[QVariant::Char] = QVariant::Char; + connect(charPropertyManager, SIGNAL(valueChanged(QtProperty *, const QChar &)), + this, SLOT(slotValueChanged(QtProperty *, const QChar &))); + // LocalePropertyManager + QtLocalePropertyManager *localePropertyManager = new QtLocalePropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::Locale] = localePropertyManager; + d_ptr->m_typeToValueType[QVariant::Locale] = QVariant::Locale; + connect(localePropertyManager, SIGNAL(valueChanged(QtProperty *, const QLocale &)), + this, SLOT(slotValueChanged(QtProperty *, const QLocale &))); + connect(localePropertyManager->subEnumPropertyManager(), SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotValueChanged(QtProperty *, int))); + connect(localePropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)), + this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *))); + connect(localePropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)), + this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *))); + // PointPropertyManager + QtPointPropertyManager *pointPropertyManager = new QtPointPropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::Point] = pointPropertyManager; + d_ptr->m_typeToValueType[QVariant::Point] = QVariant::Point; + connect(pointPropertyManager, SIGNAL(valueChanged(QtProperty *, const QPoint &)), + this, SLOT(slotValueChanged(QtProperty *, const QPoint &))); + connect(pointPropertyManager->subIntPropertyManager(), SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotValueChanged(QtProperty *, int))); + connect(pointPropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)), + this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *))); + connect(pointPropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)), + this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *))); + // PointFPropertyManager + QtPointFPropertyManager *pointFPropertyManager = new QtPointFPropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::PointF] = pointFPropertyManager; + d_ptr->m_typeToValueType[QVariant::PointF] = QVariant::PointF; + d_ptr->m_typeToAttributeToAttributeType[QVariant::PointF][d_ptr->m_decimalsAttribute] = + QVariant::Int; + connect(pointFPropertyManager, SIGNAL(valueChanged(QtProperty *, const QPointF &)), + this, SLOT(slotValueChanged(QtProperty *, const QPointF &))); + connect(pointFPropertyManager, SIGNAL(decimalsChanged(QtProperty *, int)), + this, SLOT(slotDecimalsChanged(QtProperty *, int))); + connect(pointFPropertyManager->subDoublePropertyManager(), SIGNAL(valueChanged(QtProperty *, double)), + this, SLOT(slotValueChanged(QtProperty *, double))); + connect(pointFPropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)), + this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *))); + connect(pointFPropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)), + this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *))); + // SizePropertyManager + QtSizePropertyManager *sizePropertyManager = new QtSizePropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::Size] = sizePropertyManager; + d_ptr->m_typeToValueType[QVariant::Size] = QVariant::Size; + d_ptr->m_typeToAttributeToAttributeType[QVariant::Size][d_ptr->m_minimumAttribute] = + QVariant::Size; + d_ptr->m_typeToAttributeToAttributeType[QVariant::Size][d_ptr->m_maximumAttribute] = + QVariant::Size; + connect(sizePropertyManager, SIGNAL(valueChanged(QtProperty *, const QSize &)), + this, SLOT(slotValueChanged(QtProperty *, const QSize &))); + connect(sizePropertyManager, SIGNAL(rangeChanged(QtProperty *, const QSize &, const QSize &)), + this, SLOT(slotRangeChanged(QtProperty *, const QSize &, const QSize &))); + connect(sizePropertyManager->subIntPropertyManager(), SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotValueChanged(QtProperty *, int))); + connect(sizePropertyManager->subIntPropertyManager(), SIGNAL(rangeChanged(QtProperty *, int, int)), + this, SLOT(slotRangeChanged(QtProperty *, int, int))); + connect(sizePropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)), + this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *))); + connect(sizePropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)), + this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *))); + // SizeFPropertyManager + QtSizeFPropertyManager *sizeFPropertyManager = new QtSizeFPropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::SizeF] = sizeFPropertyManager; + d_ptr->m_typeToValueType[QVariant::SizeF] = QVariant::SizeF; + d_ptr->m_typeToAttributeToAttributeType[QVariant::SizeF][d_ptr->m_minimumAttribute] = + QVariant::SizeF; + d_ptr->m_typeToAttributeToAttributeType[QVariant::SizeF][d_ptr->m_maximumAttribute] = + QVariant::SizeF; + d_ptr->m_typeToAttributeToAttributeType[QVariant::SizeF][d_ptr->m_decimalsAttribute] = + QVariant::Int; + connect(sizeFPropertyManager, SIGNAL(valueChanged(QtProperty *, const QSizeF &)), + this, SLOT(slotValueChanged(QtProperty *, const QSizeF &))); + connect(sizeFPropertyManager, SIGNAL(rangeChanged(QtProperty *, const QSizeF &, const QSizeF &)), + this, SLOT(slotRangeChanged(QtProperty *, const QSizeF &, const QSizeF &))); + connect(sizeFPropertyManager, SIGNAL(decimalsChanged(QtProperty *, int)), + this, SLOT(slotDecimalsChanged(QtProperty *, int))); + connect(sizeFPropertyManager->subDoublePropertyManager(), SIGNAL(valueChanged(QtProperty *, double)), + this, SLOT(slotValueChanged(QtProperty *, double))); + connect(sizeFPropertyManager->subDoublePropertyManager(), SIGNAL(rangeChanged(QtProperty *, double, double)), + this, SLOT(slotRangeChanged(QtProperty *, double, double))); + connect(sizeFPropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)), + this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *))); + connect(sizeFPropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)), + this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *))); + // RectPropertyManager + QtRectPropertyManager *rectPropertyManager = new QtRectPropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::Rect] = rectPropertyManager; + d_ptr->m_typeToValueType[QVariant::Rect] = QVariant::Rect; + d_ptr->m_typeToAttributeToAttributeType[QVariant::Rect][d_ptr->m_constraintAttribute] = + QVariant::Rect; + connect(rectPropertyManager, SIGNAL(valueChanged(QtProperty *, const QRect &)), + this, SLOT(slotValueChanged(QtProperty *, const QRect &))); + connect(rectPropertyManager, SIGNAL(constraintChanged(QtProperty *, const QRect &)), + this, SLOT(slotConstraintChanged(QtProperty *, const QRect &))); + connect(rectPropertyManager->subIntPropertyManager(), SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotValueChanged(QtProperty *, int))); + connect(rectPropertyManager->subIntPropertyManager(), SIGNAL(rangeChanged(QtProperty *, int, int)), + this, SLOT(slotRangeChanged(QtProperty *, int, int))); + connect(rectPropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)), + this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *))); + connect(rectPropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)), + this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *))); + // RectFPropertyManager + QtRectFPropertyManager *rectFPropertyManager = new QtRectFPropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::RectF] = rectFPropertyManager; + d_ptr->m_typeToValueType[QVariant::RectF] = QVariant::RectF; + d_ptr->m_typeToAttributeToAttributeType[QVariant::RectF][d_ptr->m_constraintAttribute] = + QVariant::RectF; + d_ptr->m_typeToAttributeToAttributeType[QVariant::RectF][d_ptr->m_decimalsAttribute] = + QVariant::Int; + connect(rectFPropertyManager, SIGNAL(valueChanged(QtProperty *, const QRectF &)), + this, SLOT(slotValueChanged(QtProperty *, const QRectF &))); + connect(rectFPropertyManager, SIGNAL(constraintChanged(QtProperty *, const QRectF &)), + this, SLOT(slotConstraintChanged(QtProperty *, const QRectF &))); + connect(rectFPropertyManager, SIGNAL(decimalsChanged(QtProperty *, int)), + this, SLOT(slotDecimalsChanged(QtProperty *, int))); + connect(rectFPropertyManager->subDoublePropertyManager(), SIGNAL(valueChanged(QtProperty *, double)), + this, SLOT(slotValueChanged(QtProperty *, double))); + connect(rectFPropertyManager->subDoublePropertyManager(), SIGNAL(rangeChanged(QtProperty *, double, double)), + this, SLOT(slotRangeChanged(QtProperty *, double, double))); + connect(rectFPropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)), + this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *))); + connect(rectFPropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)), + this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *))); + // ColorPropertyManager + QtColorPropertyManager *colorPropertyManager = new QtColorPropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::Color] = colorPropertyManager; + d_ptr->m_typeToValueType[QVariant::Color] = QVariant::Color; + connect(colorPropertyManager, SIGNAL(valueChanged(QtProperty *, const QColor &)), + this, SLOT(slotValueChanged(QtProperty *, const QColor &))); + connect(colorPropertyManager->subIntPropertyManager(), SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotValueChanged(QtProperty *, int))); + connect(colorPropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)), + this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *))); + connect(colorPropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)), + this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *))); + // EnumPropertyManager + int enumId = enumTypeId(); + QtEnumPropertyManager *enumPropertyManager = new QtEnumPropertyManager(this); + d_ptr->m_typeToPropertyManager[enumId] = enumPropertyManager; + d_ptr->m_typeToValueType[enumId] = QVariant::Int; + d_ptr->m_typeToAttributeToAttributeType[enumId][d_ptr->m_enumNamesAttribute] = + QVariant::StringList; + d_ptr->m_typeToAttributeToAttributeType[enumId][d_ptr->m_enumIconsAttribute] = + iconMapTypeId(); + connect(enumPropertyManager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotValueChanged(QtProperty *, int))); + connect(enumPropertyManager, SIGNAL(enumNamesChanged(QtProperty *, const QStringList &)), + this, SLOT(slotEnumNamesChanged(QtProperty *, const QStringList &))); + connect(enumPropertyManager, SIGNAL(enumIconsChanged(QtProperty *, const QMap &)), + this, SLOT(slotEnumIconsChanged(QtProperty *, const QMap &))); + // SizePolicyPropertyManager + QtSizePolicyPropertyManager *sizePolicyPropertyManager = new QtSizePolicyPropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::SizePolicy] = sizePolicyPropertyManager; + d_ptr->m_typeToValueType[QVariant::SizePolicy] = QVariant::SizePolicy; + connect(sizePolicyPropertyManager, SIGNAL(valueChanged(QtProperty *, const QSizePolicy &)), + this, SLOT(slotValueChanged(QtProperty *, const QSizePolicy &))); + connect(sizePolicyPropertyManager->subIntPropertyManager(), SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotValueChanged(QtProperty *, int))); + connect(sizePolicyPropertyManager->subIntPropertyManager(), SIGNAL(rangeChanged(QtProperty *, int, int)), + this, SLOT(slotRangeChanged(QtProperty *, int, int))); + connect(sizePolicyPropertyManager->subEnumPropertyManager(), SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotValueChanged(QtProperty *, int))); + connect(sizePolicyPropertyManager->subEnumPropertyManager(), + SIGNAL(enumNamesChanged(QtProperty *, const QStringList &)), + this, SLOT(slotEnumNamesChanged(QtProperty *, const QStringList &))); + connect(sizePolicyPropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)), + this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *))); + connect(sizePolicyPropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)), + this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *))); + // FontPropertyManager + QtFontPropertyManager *fontPropertyManager = new QtFontPropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::Font] = fontPropertyManager; + d_ptr->m_typeToValueType[QVariant::Font] = QVariant::Font; + connect(fontPropertyManager, SIGNAL(valueChanged(QtProperty *, const QFont &)), + this, SLOT(slotValueChanged(QtProperty *, const QFont &))); + connect(fontPropertyManager->subIntPropertyManager(), SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotValueChanged(QtProperty *, int))); + connect(fontPropertyManager->subIntPropertyManager(), SIGNAL(rangeChanged(QtProperty *, int, int)), + this, SLOT(slotRangeChanged(QtProperty *, int, int))); + connect(fontPropertyManager->subEnumPropertyManager(), SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotValueChanged(QtProperty *, int))); + connect(fontPropertyManager->subEnumPropertyManager(), + SIGNAL(enumNamesChanged(QtProperty *, const QStringList &)), + this, SLOT(slotEnumNamesChanged(QtProperty *, const QStringList &))); + connect(fontPropertyManager->subBoolPropertyManager(), SIGNAL(valueChanged(QtProperty *, bool)), + this, SLOT(slotValueChanged(QtProperty *, bool))); + connect(fontPropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)), + this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *))); + connect(fontPropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)), + this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *))); + // CursorPropertyManager + QtCursorPropertyManager *cursorPropertyManager = new QtCursorPropertyManager(this); + d_ptr->m_typeToPropertyManager[QVariant::Cursor] = cursorPropertyManager; + d_ptr->m_typeToValueType[QVariant::Cursor] = QVariant::Cursor; + connect(cursorPropertyManager, SIGNAL(valueChanged(QtProperty *, const QCursor &)), + this, SLOT(slotValueChanged(QtProperty *, const QCursor &))); + // FlagPropertyManager + int flagId = flagTypeId(); + QtFlagPropertyManager *flagPropertyManager = new QtFlagPropertyManager(this); + d_ptr->m_typeToPropertyManager[flagId] = flagPropertyManager; + d_ptr->m_typeToValueType[flagId] = QVariant::Int; + d_ptr->m_typeToAttributeToAttributeType[flagId][d_ptr->m_flagNamesAttribute] = + QVariant::StringList; + connect(flagPropertyManager, SIGNAL(valueChanged(QtProperty *, int)), + this, SLOT(slotValueChanged(QtProperty *, int))); + connect(flagPropertyManager, SIGNAL(flagNamesChanged(QtProperty *, const QStringList &)), + this, SLOT(slotFlagNamesChanged(QtProperty *, const QStringList &))); + connect(flagPropertyManager->subBoolPropertyManager(), SIGNAL(valueChanged(QtProperty *, bool)), + this, SLOT(slotValueChanged(QtProperty *, bool))); + connect(flagPropertyManager, SIGNAL(propertyInserted(QtProperty *, QtProperty *, QtProperty *)), + this, SLOT(slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *))); + connect(flagPropertyManager, SIGNAL(propertyRemoved(QtProperty *, QtProperty *)), + this, SLOT(slotPropertyRemoved(QtProperty *, QtProperty *))); + // FlagPropertyManager + int groupId = groupTypeId(); + QtGroupPropertyManager *groupPropertyManager = new QtGroupPropertyManager(this); + d_ptr->m_typeToPropertyManager[groupId] = groupPropertyManager; + d_ptr->m_typeToValueType[groupId] = QVariant::Invalid; +} + +/*! + Destroys this manager, and all the properties it has created. +*/ +QtVariantPropertyManager::~QtVariantPropertyManager() +{ + clear(); + delete d_ptr; +} + +/*! + Returns the given \a property converted into a QtVariantProperty. + + If the \a property was not created by this variant manager, the + function returns 0. + + \sa createProperty() +*/ +QtVariantProperty *QtVariantPropertyManager::variantProperty(const QtProperty *property) const +{ + const QMap >::const_iterator it = d_ptr->m_propertyToType.constFind(property); + if (it == d_ptr->m_propertyToType.constEnd()) + return 0; + return it.value().first; +} + +/*! + Returns true if the given \a propertyType is supported by this + variant manager; otherwise false. + + \sa propertyType() +*/ +bool QtVariantPropertyManager::isPropertyTypeSupported(int propertyType) const +{ + if (d_ptr->m_typeToValueType.contains(propertyType)) + return true; + return false; +} + +/*! + Creates and returns a variant property of the given \a propertyType + with the given \a name. + + If the specified \a propertyType is not supported by this variant + manager, this function returns 0. + + Do not use the inherited + QtAbstractPropertyManager::addProperty() function to create a + variant property (that function will always return 0 since it will + not be clear what type the property should have). + + \sa isPropertyTypeSupported() +*/ +QtVariantProperty *QtVariantPropertyManager::addProperty(int propertyType, const QString &name) +{ + if (!isPropertyTypeSupported(propertyType)) + return 0; + + bool wasCreating = d_ptr->m_creatingProperty; + d_ptr->m_creatingProperty = true; + d_ptr->m_propertyType = propertyType; + QtProperty *property = QtAbstractPropertyManager::addProperty(name); + d_ptr->m_creatingProperty = wasCreating; + d_ptr->m_propertyType = 0; + + if (!property) + return 0; + + return variantProperty(property); +} + +/*! + Returns the given \a property's value. + + If the given \a property is not managed by this manager, this + function returns an invalid variant. + + \sa setValue() +*/ +QVariant QtVariantPropertyManager::value(const QtProperty *property) const +{ + QtProperty *internProp = propertyToWrappedProperty()->value(property, 0); + if (internProp == 0) + return QVariant(); + + QtAbstractPropertyManager *manager = internProp->propertyManager(); + if (QtIntPropertyManager *intManager = qobject_cast(manager)) { + return intManager->value(internProp); + } else if (QtDoublePropertyManager *doubleManager = qobject_cast(manager)) { + return doubleManager->value(internProp); + } else if (QtBoolPropertyManager *boolManager = qobject_cast(manager)) { + return boolManager->value(internProp); + } else if (QtStringPropertyManager *stringManager = qobject_cast(manager)) { + return stringManager->value(internProp); + } else if (QtDatePropertyManager *dateManager = qobject_cast(manager)) { + return dateManager->value(internProp); + } else if (QtTimePropertyManager *timeManager = qobject_cast(manager)) { + return timeManager->value(internProp); + } else if (QtDateTimePropertyManager *dateTimeManager = qobject_cast(manager)) { + return dateTimeManager->value(internProp); + } else if (QtKeySequencePropertyManager *keySequenceManager = qobject_cast(manager)) { + return keySequenceManager->value(internProp); + } else if (QtCharPropertyManager *charManager = qobject_cast(manager)) { + return charManager->value(internProp); + } else if (QtLocalePropertyManager *localeManager = qobject_cast(manager)) { + return localeManager->value(internProp); + } else if (QtPointPropertyManager *pointManager = qobject_cast(manager)) { + return pointManager->value(internProp); + } else if (QtPointFPropertyManager *pointFManager = qobject_cast(manager)) { + return pointFManager->value(internProp); + } else if (QtSizePropertyManager *sizeManager = qobject_cast(manager)) { + return sizeManager->value(internProp); + } else if (QtSizeFPropertyManager *sizeFManager = qobject_cast(manager)) { + return sizeFManager->value(internProp); + } else if (QtRectPropertyManager *rectManager = qobject_cast(manager)) { + return rectManager->value(internProp); + } else if (QtRectFPropertyManager *rectFManager = qobject_cast(manager)) { + return rectFManager->value(internProp); + } else if (QtColorPropertyManager *colorManager = qobject_cast(manager)) { + return colorManager->value(internProp); + } else if (QtEnumPropertyManager *enumManager = qobject_cast(manager)) { + return enumManager->value(internProp); + } else if (QtSizePolicyPropertyManager *sizePolicyManager = + qobject_cast(manager)) { + return sizePolicyManager->value(internProp); + } else if (QtFontPropertyManager *fontManager = qobject_cast(manager)) { + return fontManager->value(internProp); +#ifndef QT_NO_CURSOR + } else if (QtCursorPropertyManager *cursorManager = qobject_cast(manager)) { + return cursorManager->value(internProp); +#endif + } else if (QtFlagPropertyManager *flagManager = qobject_cast(manager)) { + return flagManager->value(internProp); + } + return QVariant(); +} + +/*! + Returns the given \a property's value type. + + \sa propertyType() +*/ +int QtVariantPropertyManager::valueType(const QtProperty *property) const +{ + int propType = propertyType(property); + return valueType(propType); +} + +/*! + \overload + + Returns the value type associated with the given \a propertyType. +*/ +int QtVariantPropertyManager::valueType(int propertyType) const +{ + if (d_ptr->m_typeToValueType.contains(propertyType)) + return d_ptr->m_typeToValueType[propertyType]; + return 0; +} + +/*! + Returns the given \a property's type. + + \sa valueType() +*/ +int QtVariantPropertyManager::propertyType(const QtProperty *property) const +{ + const QMap >::const_iterator it = d_ptr->m_propertyToType.constFind(property); + if (it == d_ptr->m_propertyToType.constEnd()) + return 0; + return it.value().second; +} + +/*! + Returns the given \a property's value for the specified \a + attribute + + If the given \a property was not created by \e this manager, or if + the specified \a attribute does not exist, this function returns + an invalid variant. + + \sa attributes(), attributeType(), setAttribute() +*/ +QVariant QtVariantPropertyManager::attributeValue(const QtProperty *property, const QString &attribute) const +{ + int propType = propertyType(property); + if (!propType) + return QVariant(); + + QMap >::ConstIterator it = + d_ptr->m_typeToAttributeToAttributeType.find(propType); + if (it == d_ptr->m_typeToAttributeToAttributeType.constEnd()) + return QVariant(); + + QMap attributes = it.value(); + QMap::ConstIterator itAttr = attributes.find(attribute); + if (itAttr == attributes.constEnd()) + return QVariant(); + + QtProperty *internProp = propertyToWrappedProperty()->value(property, 0); + if (internProp == 0) + return QVariant(); + + QtAbstractPropertyManager *manager = internProp->propertyManager(); + if (QtIntPropertyManager *intManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_maximumAttribute) + return intManager->maximum(internProp); + if (attribute == d_ptr->m_minimumAttribute) + return intManager->minimum(internProp); + if (attribute == d_ptr->m_singleStepAttribute) + return intManager->singleStep(internProp); + return QVariant(); + } else if (QtDoublePropertyManager *doubleManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_maximumAttribute) + return doubleManager->maximum(internProp); + if (attribute == d_ptr->m_minimumAttribute) + return doubleManager->minimum(internProp); + if (attribute == d_ptr->m_singleStepAttribute) + return doubleManager->singleStep(internProp); + if (attribute == d_ptr->m_decimalsAttribute) + return doubleManager->decimals(internProp); + return QVariant(); + } else if (QtStringPropertyManager *stringManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_regExpAttribute) + return stringManager->regExp(internProp); + return QVariant(); + } else if (QtDatePropertyManager *dateManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_maximumAttribute) + return dateManager->maximum(internProp); + if (attribute == d_ptr->m_minimumAttribute) + return dateManager->minimum(internProp); + return QVariant(); + } else if (QtPointFPropertyManager *pointFManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_decimalsAttribute) + return pointFManager->decimals(internProp); + return QVariant(); + } else if (QtSizePropertyManager *sizeManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_maximumAttribute) + return sizeManager->maximum(internProp); + if (attribute == d_ptr->m_minimumAttribute) + return sizeManager->minimum(internProp); + return QVariant(); + } else if (QtSizeFPropertyManager *sizeFManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_maximumAttribute) + return sizeFManager->maximum(internProp); + if (attribute == d_ptr->m_minimumAttribute) + return sizeFManager->minimum(internProp); + if (attribute == d_ptr->m_decimalsAttribute) + return sizeFManager->decimals(internProp); + return QVariant(); + } else if (QtRectPropertyManager *rectManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_constraintAttribute) + return rectManager->constraint(internProp); + return QVariant(); + } else if (QtRectFPropertyManager *rectFManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_constraintAttribute) + return rectFManager->constraint(internProp); + if (attribute == d_ptr->m_decimalsAttribute) + return rectFManager->decimals(internProp); + return QVariant(); + } else if (QtEnumPropertyManager *enumManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_enumNamesAttribute) + return enumManager->enumNames(internProp); + if (attribute == d_ptr->m_enumIconsAttribute) { + QVariant v; + qVariantSetValue(v, enumManager->enumIcons(internProp)); + return v; + } + return QVariant(); + } else if (QtFlagPropertyManager *flagManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_flagNamesAttribute) + return flagManager->flagNames(internProp); + return QVariant(); + } + return QVariant(); +} + +/*! + Returns a list of the given \a propertyType 's attributes. + + \sa attributeValue(), attributeType() +*/ +QStringList QtVariantPropertyManager::attributes(int propertyType) const +{ + QMap >::ConstIterator it = + d_ptr->m_typeToAttributeToAttributeType.find(propertyType); + if (it == d_ptr->m_typeToAttributeToAttributeType.constEnd()) + return QStringList(); + return it.value().keys(); +} + +/*! + Returns the type of the specified \a attribute of the given \a + propertyType. + + If the given \a propertyType is not supported by \e this manager, + or if the given \a propertyType does not possess the specified \a + attribute, this function returns QVariant::Invalid. + + \sa attributes(), valueType() +*/ +int QtVariantPropertyManager::attributeType(int propertyType, const QString &attribute) const +{ + QMap >::ConstIterator it = + d_ptr->m_typeToAttributeToAttributeType.find(propertyType); + if (it == d_ptr->m_typeToAttributeToAttributeType.constEnd()) + return 0; + + QMap attributes = it.value(); + QMap::ConstIterator itAttr = attributes.find(attribute); + if (itAttr == attributes.constEnd()) + return 0; + return itAttr.value(); +} + +/*! + \fn void QtVariantPropertyManager::setValue(QtProperty *property, const QVariant &value) + + Sets the value of the given \a property to \a value. + + The specified \a value must be of a type returned by valueType(), + or of type that can be converted to valueType() using the + QVariant::canConvert() function, otherwise this function does + nothing. + + \sa value(), QtVariantProperty::setValue(), valueChanged() +*/ +void QtVariantPropertyManager::setValue(QtProperty *property, const QVariant &val) +{ + int propType = val.userType(); + if (!propType) + return; + + int valType = valueType(property); + + if (propType != valType && !val.canConvert(static_cast(valType))) + return; + + QtProperty *internProp = propertyToWrappedProperty()->value(property, 0); + if (internProp == 0) + return; + + + QtAbstractPropertyManager *manager = internProp->propertyManager(); + if (QtIntPropertyManager *intManager = qobject_cast(manager)) { + intManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtDoublePropertyManager *doubleManager = qobject_cast(manager)) { + doubleManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtBoolPropertyManager *boolManager = qobject_cast(manager)) { + boolManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtStringPropertyManager *stringManager = qobject_cast(manager)) { + stringManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtDatePropertyManager *dateManager = qobject_cast(manager)) { + dateManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtTimePropertyManager *timeManager = qobject_cast(manager)) { + timeManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtDateTimePropertyManager *dateTimeManager = qobject_cast(manager)) { + dateTimeManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtKeySequencePropertyManager *keySequenceManager = qobject_cast(manager)) { + keySequenceManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtCharPropertyManager *charManager = qobject_cast(manager)) { + charManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtLocalePropertyManager *localeManager = qobject_cast(manager)) { + localeManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtPointPropertyManager *pointManager = qobject_cast(manager)) { + pointManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtPointFPropertyManager *pointFManager = qobject_cast(manager)) { + pointFManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtSizePropertyManager *sizeManager = qobject_cast(manager)) { + sizeManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtSizeFPropertyManager *sizeFManager = qobject_cast(manager)) { + sizeFManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtRectPropertyManager *rectManager = qobject_cast(manager)) { + rectManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtRectFPropertyManager *rectFManager = qobject_cast(manager)) { + rectFManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtColorPropertyManager *colorManager = qobject_cast(manager)) { + colorManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtEnumPropertyManager *enumManager = qobject_cast(manager)) { + enumManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtSizePolicyPropertyManager *sizePolicyManager = + qobject_cast(manager)) { + sizePolicyManager->setValue(internProp, qVariantValue(val)); + return; + } else if (QtFontPropertyManager *fontManager = qobject_cast(manager)) { + fontManager->setValue(internProp, qVariantValue(val)); + return; +#ifndef QT_NO_CURSOR + } else if (QtCursorPropertyManager *cursorManager = qobject_cast(manager)) { + cursorManager->setValue(internProp, qVariantValue(val)); + return; +#endif + } else if (QtFlagPropertyManager *flagManager = qobject_cast(manager)) { + flagManager->setValue(internProp, qVariantValue(val)); + return; + } +} + +/*! + Sets the value of the specified \a attribute of the given \a + property, to \a value. + + The new \a value's type must be of the type returned by + attributeType(), or of a type that can be converted to + attributeType() using the QVariant::canConvert() function, + otherwise this function does nothing. + + \sa attributeValue(), QtVariantProperty::setAttribute(), attributeChanged() +*/ +void QtVariantPropertyManager::setAttribute(QtProperty *property, + const QString &attribute, const QVariant &value) +{ + QVariant oldAttr = attributeValue(property, attribute); + if (!oldAttr.isValid()) + return; + + int attrType = value.userType(); + if (!attrType) + return; + + if (attrType != attributeType(propertyType(property), attribute) && + !value.canConvert((QVariant::Type)attrType)) + return; + + QtProperty *internProp = propertyToWrappedProperty()->value(property, 0); + if (internProp == 0) + return; + + QtAbstractPropertyManager *manager = internProp->propertyManager(); + if (QtIntPropertyManager *intManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_maximumAttribute) + intManager->setMaximum(internProp, qVariantValue(value)); + else if (attribute == d_ptr->m_minimumAttribute) + intManager->setMinimum(internProp, qVariantValue(value)); + else if (attribute == d_ptr->m_singleStepAttribute) + intManager->setSingleStep(internProp, qVariantValue(value)); + return; + } else if (QtDoublePropertyManager *doubleManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_maximumAttribute) + doubleManager->setMaximum(internProp, qVariantValue(value)); + if (attribute == d_ptr->m_minimumAttribute) + doubleManager->setMinimum(internProp, qVariantValue(value)); + if (attribute == d_ptr->m_singleStepAttribute) + doubleManager->setSingleStep(internProp, qVariantValue(value)); + if (attribute == d_ptr->m_decimalsAttribute) + doubleManager->setDecimals(internProp, qVariantValue(value)); + return; + } else if (QtStringPropertyManager *stringManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_regExpAttribute) + stringManager->setRegExp(internProp, qVariantValue(value)); + return; + } else if (QtDatePropertyManager *dateManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_maximumAttribute) + dateManager->setMaximum(internProp, qVariantValue(value)); + if (attribute == d_ptr->m_minimumAttribute) + dateManager->setMinimum(internProp, qVariantValue(value)); + return; + } else if (QtPointFPropertyManager *pointFManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_decimalsAttribute) + pointFManager->setDecimals(internProp, qVariantValue(value)); + return; + } else if (QtSizePropertyManager *sizeManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_maximumAttribute) + sizeManager->setMaximum(internProp, qVariantValue(value)); + if (attribute == d_ptr->m_minimumAttribute) + sizeManager->setMinimum(internProp, qVariantValue(value)); + return; + } else if (QtSizeFPropertyManager *sizeFManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_maximumAttribute) + sizeFManager->setMaximum(internProp, qVariantValue(value)); + if (attribute == d_ptr->m_minimumAttribute) + sizeFManager->setMinimum(internProp, qVariantValue(value)); + if (attribute == d_ptr->m_decimalsAttribute) + sizeFManager->setDecimals(internProp, qVariantValue(value)); + return; + } else if (QtRectPropertyManager *rectManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_constraintAttribute) + rectManager->setConstraint(internProp, qVariantValue(value)); + return; + } else if (QtRectFPropertyManager *rectFManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_constraintAttribute) + rectFManager->setConstraint(internProp, qVariantValue(value)); + if (attribute == d_ptr->m_decimalsAttribute) + rectFManager->setDecimals(internProp, qVariantValue(value)); + return; + } else if (QtEnumPropertyManager *enumManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_enumNamesAttribute) + enumManager->setEnumNames(internProp, qVariantValue(value)); + if (attribute == d_ptr->m_enumIconsAttribute) + enumManager->setEnumIcons(internProp, qVariantValue(value)); + return; + } else if (QtFlagPropertyManager *flagManager = qobject_cast(manager)) { + if (attribute == d_ptr->m_flagNamesAttribute) + flagManager->setFlagNames(internProp, qVariantValue(value)); + return; + } +} + +/*! + \reimp +*/ +bool QtVariantPropertyManager::hasValue(const QtProperty *property) const +{ + if (propertyType(property) == groupTypeId()) + return false; + return true; +} + +/*! + \reimp +*/ +QString QtVariantPropertyManager::valueText(const QtProperty *property) const +{ + const QtProperty *internProp = propertyToWrappedProperty()->value(property, 0); + return internProp ? internProp->valueText() : QString(); +} + +/*! + \reimp +*/ +QIcon QtVariantPropertyManager::valueIcon(const QtProperty *property) const +{ + const QtProperty *internProp = propertyToWrappedProperty()->value(property, 0); + return internProp ? internProp->valueIcon() : QIcon(); +} + +/*! + \reimp +*/ +void QtVariantPropertyManager::initializeProperty(QtProperty *property) +{ + QtVariantProperty *varProp = variantProperty(property); + if (!varProp) + return; + + QMap::ConstIterator it = + d_ptr->m_typeToPropertyManager.find(d_ptr->m_propertyType); + if (it != d_ptr->m_typeToPropertyManager.constEnd()) { + QtProperty *internProp = 0; + if (!d_ptr->m_creatingSubProperties) { + QtAbstractPropertyManager *manager = it.value(); + internProp = manager->addProperty(); + d_ptr->m_internalToProperty[internProp] = varProp; + } + propertyToWrappedProperty()->insert(varProp, internProp); + if (internProp) { + QList children = internProp->subProperties(); + QListIterator itChild(children); + QtVariantProperty *lastProperty = 0; + while (itChild.hasNext()) { + QtVariantProperty *prop = d_ptr->createSubProperty(varProp, lastProperty, itChild.next()); + lastProperty = prop ? prop : lastProperty; + } + } + } +} + +/*! + \reimp +*/ +void QtVariantPropertyManager::uninitializeProperty(QtProperty *property) +{ + const QMap >::iterator type_it = d_ptr->m_propertyToType.find(property); + if (type_it == d_ptr->m_propertyToType.end()) + return; + + PropertyMap::iterator it = propertyToWrappedProperty()->find(property); + if (it != propertyToWrappedProperty()->end()) { + QtProperty *internProp = it.value(); + if (internProp) { + d_ptr->m_internalToProperty.remove(internProp); + if (!d_ptr->m_destroyingSubProperties) { + delete internProp; + } + } + propertyToWrappedProperty()->erase(it); + } + d_ptr->m_propertyToType.erase(type_it); +} + +/*! + \reimp +*/ +QtProperty *QtVariantPropertyManager::createProperty() +{ + if (!d_ptr->m_creatingProperty) + return 0; + + QtVariantProperty *property = new QtVariantProperty(this); + d_ptr->m_propertyToType.insert(property, qMakePair(property, d_ptr->m_propertyType)); + + return property; +} + +///////////////////////////// + +class QtVariantEditorFactoryPrivate +{ + QtVariantEditorFactory *q_ptr; + Q_DECLARE_PUBLIC(QtVariantEditorFactory) +public: + + QtSpinBoxFactory *m_spinBoxFactory; + QtDoubleSpinBoxFactory *m_doubleSpinBoxFactory; + QtCheckBoxFactory *m_checkBoxFactory; + QtLineEditFactory *m_lineEditFactory; + QtDateEditFactory *m_dateEditFactory; + QtTimeEditFactory *m_timeEditFactory; + QtDateTimeEditFactory *m_dateTimeEditFactory; + QtKeySequenceEditorFactory *m_keySequenceEditorFactory; + QtCharEditorFactory *m_charEditorFactory; + QtEnumEditorFactory *m_comboBoxFactory; + QtCursorEditorFactory *m_cursorEditorFactory; + QtColorEditorFactory *m_colorEditorFactory; + QtFontEditorFactory *m_fontEditorFactory; + + QMap m_factoryToType; + QMap m_typeToFactory; +}; + +/*! + \class QtVariantEditorFactory + + \brief The QtVariantEditorFactory class provides widgets for properties + created by QtVariantPropertyManager objects. + + The variant factory provides the following widgets for the + specified property types: + + \table + \header + \o Property Type + \o Widget + \row + \o \c int + \o QSpinBox + \row + \o \c double + \o QDoubleSpinBox + \row + \o \c bool + \o QCheckBox + \row + \o QString + \o QLineEdit + \row + \o QDate + \o QDateEdit + \row + \o QTime + \o QTimeEdit + \row + \o QDateTime + \o QDateTimeEdit + \row + \o QKeySequence + \o customized editor + \row + \o QChar + \o customized editor + \row + \o \c enum + \o QComboBox + \row + \o QCursor + \o QComboBox + \endtable + + Note that QtVariantPropertyManager supports several additional property + types for which the QtVariantEditorFactory class does not provide + editing widgets, e.g. QPoint and QSize. To provide widgets for other + types using the variant approach, derive from the QtVariantEditorFactory + class. + + \sa QtAbstractEditorFactory, QtVariantPropertyManager +*/ + +/*! + Creates a factory with the given \a parent. +*/ +QtVariantEditorFactory::QtVariantEditorFactory(QObject *parent) + : QtAbstractEditorFactory(parent) +{ + d_ptr = new QtVariantEditorFactoryPrivate(); + d_ptr->q_ptr = this; + + d_ptr->m_spinBoxFactory = new QtSpinBoxFactory(this); + d_ptr->m_factoryToType[d_ptr->m_spinBoxFactory] = QVariant::Int; + d_ptr->m_typeToFactory[QVariant::Int] = d_ptr->m_spinBoxFactory; + + d_ptr->m_doubleSpinBoxFactory = new QtDoubleSpinBoxFactory(this); + d_ptr->m_factoryToType[d_ptr->m_doubleSpinBoxFactory] = QVariant::Double; + d_ptr->m_typeToFactory[QVariant::Double] = d_ptr->m_doubleSpinBoxFactory; + + d_ptr->m_checkBoxFactory = new QtCheckBoxFactory(this); + d_ptr->m_factoryToType[d_ptr->m_checkBoxFactory] = QVariant::Bool; + d_ptr->m_typeToFactory[QVariant::Bool] = d_ptr->m_checkBoxFactory; + + d_ptr->m_lineEditFactory = new QtLineEditFactory(this); + d_ptr->m_factoryToType[d_ptr->m_lineEditFactory] = QVariant::String; + d_ptr->m_typeToFactory[QVariant::String] = d_ptr->m_lineEditFactory; + + d_ptr->m_dateEditFactory = new QtDateEditFactory(this); + d_ptr->m_factoryToType[d_ptr->m_dateEditFactory] = QVariant::Date; + d_ptr->m_typeToFactory[QVariant::Date] = d_ptr->m_dateEditFactory; + + d_ptr->m_timeEditFactory = new QtTimeEditFactory(this); + d_ptr->m_factoryToType[d_ptr->m_timeEditFactory] = QVariant::Time; + d_ptr->m_typeToFactory[QVariant::Time] = d_ptr->m_timeEditFactory; + + d_ptr->m_dateTimeEditFactory = new QtDateTimeEditFactory(this); + d_ptr->m_factoryToType[d_ptr->m_dateTimeEditFactory] = QVariant::DateTime; + d_ptr->m_typeToFactory[QVariant::DateTime] = d_ptr->m_dateTimeEditFactory; + + d_ptr->m_keySequenceEditorFactory = new QtKeySequenceEditorFactory(this); + d_ptr->m_factoryToType[d_ptr->m_keySequenceEditorFactory] = QVariant::KeySequence; + d_ptr->m_typeToFactory[QVariant::KeySequence] = d_ptr->m_keySequenceEditorFactory; + + d_ptr->m_charEditorFactory = new QtCharEditorFactory(this); + d_ptr->m_factoryToType[d_ptr->m_charEditorFactory] = QVariant::Char; + d_ptr->m_typeToFactory[QVariant::Char] = d_ptr->m_charEditorFactory; + + d_ptr->m_cursorEditorFactory = new QtCursorEditorFactory(this); + d_ptr->m_factoryToType[d_ptr->m_cursorEditorFactory] = QVariant::Cursor; + d_ptr->m_typeToFactory[QVariant::Cursor] = d_ptr->m_cursorEditorFactory; + + d_ptr->m_colorEditorFactory = new QtColorEditorFactory(this); + d_ptr->m_factoryToType[d_ptr->m_colorEditorFactory] = QVariant::Color; + d_ptr->m_typeToFactory[QVariant::Color] = d_ptr->m_colorEditorFactory; + + d_ptr->m_fontEditorFactory = new QtFontEditorFactory(this); + d_ptr->m_factoryToType[d_ptr->m_fontEditorFactory] = QVariant::Font; + d_ptr->m_typeToFactory[QVariant::Font] = d_ptr->m_fontEditorFactory; + + d_ptr->m_comboBoxFactory = new QtEnumEditorFactory(this); + const int enumId = QtVariantPropertyManager::enumTypeId(); + d_ptr->m_factoryToType[d_ptr->m_comboBoxFactory] = enumId; + d_ptr->m_typeToFactory[enumId] = d_ptr->m_comboBoxFactory; +} + +/*! + Destroys this factory, and all the widgets it has created. +*/ +QtVariantEditorFactory::~QtVariantEditorFactory() +{ + delete d_ptr; +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtVariantEditorFactory::connectPropertyManager(QtVariantPropertyManager *manager) +{ + QList intPropertyManagers = qFindChildren(manager); + QListIterator itInt(intPropertyManagers); + while (itInt.hasNext()) + d_ptr->m_spinBoxFactory->addPropertyManager(itInt.next()); + + QList doublePropertyManagers = qFindChildren(manager); + QListIterator itDouble(doublePropertyManagers); + while (itDouble.hasNext()) + d_ptr->m_doubleSpinBoxFactory->addPropertyManager(itDouble.next()); + + QList boolPropertyManagers = qFindChildren(manager); + QListIterator itBool(boolPropertyManagers); + while (itBool.hasNext()) + d_ptr->m_checkBoxFactory->addPropertyManager(itBool.next()); + + QList stringPropertyManagers = qFindChildren(manager); + QListIterator itString(stringPropertyManagers); + while (itString.hasNext()) + d_ptr->m_lineEditFactory->addPropertyManager(itString.next()); + + QList datePropertyManagers = qFindChildren(manager); + QListIterator itDate(datePropertyManagers); + while (itDate.hasNext()) + d_ptr->m_dateEditFactory->addPropertyManager(itDate.next()); + + QList timePropertyManagers = qFindChildren(manager); + QListIterator itTime(timePropertyManagers); + while (itTime.hasNext()) + d_ptr->m_timeEditFactory->addPropertyManager(itTime.next()); + + QList dateTimePropertyManagers = qFindChildren(manager); + QListIterator itDateTime(dateTimePropertyManagers); + while (itDateTime.hasNext()) + d_ptr->m_dateTimeEditFactory->addPropertyManager(itDateTime.next()); + + QList keySequencePropertyManagers = qFindChildren(manager); + QListIterator itKeySequence(keySequencePropertyManagers); + while (itKeySequence.hasNext()) + d_ptr->m_keySequenceEditorFactory->addPropertyManager(itKeySequence.next()); + + QList charPropertyManagers = qFindChildren(manager); + QListIterator itChar(charPropertyManagers); + while (itChar.hasNext()) + d_ptr->m_charEditorFactory->addPropertyManager(itChar.next()); + + QList localePropertyManagers = qFindChildren(manager); + QListIterator itLocale(localePropertyManagers); + while (itLocale.hasNext()) + d_ptr->m_comboBoxFactory->addPropertyManager(itLocale.next()->subEnumPropertyManager()); + + QList pointPropertyManagers = qFindChildren(manager); + QListIterator itPoint(pointPropertyManagers); + while (itPoint.hasNext()) + d_ptr->m_spinBoxFactory->addPropertyManager(itPoint.next()->subIntPropertyManager()); + + QList pointFPropertyManagers = qFindChildren(manager); + QListIterator itPointF(pointFPropertyManagers); + while (itPointF.hasNext()) + d_ptr->m_doubleSpinBoxFactory->addPropertyManager(itPointF.next()->subDoublePropertyManager()); + + QList sizePropertyManagers = qFindChildren(manager); + QListIterator itSize(sizePropertyManagers); + while (itSize.hasNext()) + d_ptr->m_spinBoxFactory->addPropertyManager(itSize.next()->subIntPropertyManager()); + + QList sizeFPropertyManagers = qFindChildren(manager); + QListIterator itSizeF(sizeFPropertyManagers); + while (itSizeF.hasNext()) + d_ptr->m_doubleSpinBoxFactory->addPropertyManager(itSizeF.next()->subDoublePropertyManager()); + + QList rectPropertyManagers = qFindChildren(manager); + QListIterator itRect(rectPropertyManagers); + while (itRect.hasNext()) + d_ptr->m_spinBoxFactory->addPropertyManager(itRect.next()->subIntPropertyManager()); + + QList rectFPropertyManagers = qFindChildren(manager); + QListIterator itRectF(rectFPropertyManagers); + while (itRectF.hasNext()) + d_ptr->m_doubleSpinBoxFactory->addPropertyManager(itRectF.next()->subDoublePropertyManager()); + + QList colorPropertyManagers = qFindChildren(manager); + QListIterator itColor(colorPropertyManagers); + while (itColor.hasNext()) { + QtColorPropertyManager *manager = itColor.next(); + d_ptr->m_colorEditorFactory->addPropertyManager(manager); + d_ptr->m_spinBoxFactory->addPropertyManager(manager->subIntPropertyManager()); + } + + QList enumPropertyManagers = qFindChildren(manager); + QListIterator itEnum(enumPropertyManagers); + while (itEnum.hasNext()) + d_ptr->m_comboBoxFactory->addPropertyManager(itEnum.next()); + + QList sizePolicyPropertyManagers = qFindChildren(manager); + QListIterator itSizePolicy(sizePolicyPropertyManagers); + while (itSizePolicy.hasNext()) { + QtSizePolicyPropertyManager *manager = itSizePolicy.next(); + d_ptr->m_spinBoxFactory->addPropertyManager(manager->subIntPropertyManager()); + d_ptr->m_comboBoxFactory->addPropertyManager(manager->subEnumPropertyManager()); + } + + QList fontPropertyManagers = qFindChildren(manager); + QListIterator itFont(fontPropertyManagers); + while (itFont.hasNext()) { + QtFontPropertyManager *manager = itFont.next(); + d_ptr->m_fontEditorFactory->addPropertyManager(manager); + d_ptr->m_spinBoxFactory->addPropertyManager(manager->subIntPropertyManager()); + d_ptr->m_comboBoxFactory->addPropertyManager(manager->subEnumPropertyManager()); + d_ptr->m_checkBoxFactory->addPropertyManager(manager->subBoolPropertyManager()); + } + + QList cursorPropertyManagers = qFindChildren(manager); + QListIterator itCursor(cursorPropertyManagers); + while (itCursor.hasNext()) + d_ptr->m_cursorEditorFactory->addPropertyManager(itCursor.next()); + + QList flagPropertyManagers = qFindChildren(manager); + QListIterator itFlag(flagPropertyManagers); + while (itFlag.hasNext()) + d_ptr->m_checkBoxFactory->addPropertyManager(itFlag.next()->subBoolPropertyManager()); +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +QWidget *QtVariantEditorFactory::createEditor(QtVariantPropertyManager *manager, QtProperty *property, + QWidget *parent) +{ + const int propType = manager->propertyType(property); + QtAbstractEditorFactoryBase *factory = d_ptr->m_typeToFactory.value(propType, 0); + if (!factory) + return 0; + return factory->createEditor(wrappedProperty(property), parent); +} + +/*! + \internal + + Reimplemented from the QtAbstractEditorFactory class. +*/ +void QtVariantEditorFactory::disconnectPropertyManager(QtVariantPropertyManager *manager) +{ + QList intPropertyManagers = qFindChildren(manager); + QListIterator itInt(intPropertyManagers); + while (itInt.hasNext()) + d_ptr->m_spinBoxFactory->removePropertyManager(itInt.next()); + + QList doublePropertyManagers = qFindChildren(manager); + QListIterator itDouble(doublePropertyManagers); + while (itDouble.hasNext()) + d_ptr->m_doubleSpinBoxFactory->removePropertyManager(itDouble.next()); + + QList boolPropertyManagers = qFindChildren(manager); + QListIterator itBool(boolPropertyManagers); + while (itBool.hasNext()) + d_ptr->m_checkBoxFactory->removePropertyManager(itBool.next()); + + QList stringPropertyManagers = qFindChildren(manager); + QListIterator itString(stringPropertyManagers); + while (itString.hasNext()) + d_ptr->m_lineEditFactory->removePropertyManager(itString.next()); + + QList datePropertyManagers = qFindChildren(manager); + QListIterator itDate(datePropertyManagers); + while (itDate.hasNext()) + d_ptr->m_dateEditFactory->removePropertyManager(itDate.next()); + + QList timePropertyManagers = qFindChildren(manager); + QListIterator itTime(timePropertyManagers); + while (itTime.hasNext()) + d_ptr->m_timeEditFactory->removePropertyManager(itTime.next()); + + QList dateTimePropertyManagers = qFindChildren(manager); + QListIterator itDateTime(dateTimePropertyManagers); + while (itDateTime.hasNext()) + d_ptr->m_dateTimeEditFactory->removePropertyManager(itDateTime.next()); + + QList keySequencePropertyManagers = qFindChildren(manager); + QListIterator itKeySequence(keySequencePropertyManagers); + while (itKeySequence.hasNext()) + d_ptr->m_keySequenceEditorFactory->removePropertyManager(itKeySequence.next()); + + QList charPropertyManagers = qFindChildren(manager); + QListIterator itChar(charPropertyManagers); + while (itChar.hasNext()) + d_ptr->m_charEditorFactory->removePropertyManager(itChar.next()); + + QList localePropertyManagers = qFindChildren(manager); + QListIterator itLocale(localePropertyManagers); + while (itLocale.hasNext()) + d_ptr->m_comboBoxFactory->removePropertyManager(itLocale.next()->subEnumPropertyManager()); + + QList pointPropertyManagers = qFindChildren(manager); + QListIterator itPoint(pointPropertyManagers); + while (itPoint.hasNext()) + d_ptr->m_spinBoxFactory->removePropertyManager(itPoint.next()->subIntPropertyManager()); + + QList pointFPropertyManagers = qFindChildren(manager); + QListIterator itPointF(pointFPropertyManagers); + while (itPointF.hasNext()) + d_ptr->m_doubleSpinBoxFactory->removePropertyManager(itPointF.next()->subDoublePropertyManager()); + + QList sizePropertyManagers = qFindChildren(manager); + QListIterator itSize(sizePropertyManagers); + while (itSize.hasNext()) + d_ptr->m_spinBoxFactory->removePropertyManager(itSize.next()->subIntPropertyManager()); + + QList sizeFPropertyManagers = qFindChildren(manager); + QListIterator itSizeF(sizeFPropertyManagers); + while (itSizeF.hasNext()) + d_ptr->m_doubleSpinBoxFactory->removePropertyManager(itSizeF.next()->subDoublePropertyManager()); + + QList rectPropertyManagers = qFindChildren(manager); + QListIterator itRect(rectPropertyManagers); + while (itRect.hasNext()) + d_ptr->m_spinBoxFactory->removePropertyManager(itRect.next()->subIntPropertyManager()); + + QList rectFPropertyManagers = qFindChildren(manager); + QListIterator itRectF(rectFPropertyManagers); + while (itRectF.hasNext()) + d_ptr->m_doubleSpinBoxFactory->removePropertyManager(itRectF.next()->subDoublePropertyManager()); + + QList colorPropertyManagers = qFindChildren(manager); + QListIterator itColor(colorPropertyManagers); + while (itColor.hasNext()) { + QtColorPropertyManager *manager = itColor.next(); + d_ptr->m_colorEditorFactory->removePropertyManager(manager); + d_ptr->m_spinBoxFactory->removePropertyManager(manager->subIntPropertyManager()); + } + + QList enumPropertyManagers = qFindChildren(manager); + QListIterator itEnum(enumPropertyManagers); + while (itEnum.hasNext()) + d_ptr->m_comboBoxFactory->removePropertyManager(itEnum.next()); + + QList sizePolicyPropertyManagers = qFindChildren(manager); + QListIterator itSizePolicy(sizePolicyPropertyManagers); + while (itSizePolicy.hasNext()) { + QtSizePolicyPropertyManager *manager = itSizePolicy.next(); + d_ptr->m_spinBoxFactory->removePropertyManager(manager->subIntPropertyManager()); + d_ptr->m_comboBoxFactory->removePropertyManager(manager->subEnumPropertyManager()); + } + + QList fontPropertyManagers = qFindChildren(manager); + QListIterator itFont(fontPropertyManagers); + while (itFont.hasNext()) { + QtFontPropertyManager *manager = itFont.next(); + d_ptr->m_fontEditorFactory->removePropertyManager(manager); + d_ptr->m_spinBoxFactory->removePropertyManager(manager->subIntPropertyManager()); + d_ptr->m_comboBoxFactory->removePropertyManager(manager->subEnumPropertyManager()); + d_ptr->m_checkBoxFactory->removePropertyManager(manager->subBoolPropertyManager()); + } + + QList cursorPropertyManagers = qFindChildren(manager); + QListIterator itCursor(cursorPropertyManagers); + while (itCursor.hasNext()) + d_ptr->m_cursorEditorFactory->removePropertyManager(itCursor.next()); + + QList flagPropertyManagers = qFindChildren(manager); + QListIterator itFlag(flagPropertyManagers); + while (itFlag.hasNext()) + d_ptr->m_checkBoxFactory->removePropertyManager(itFlag.next()->subBoolPropertyManager()); +} + +#if QT_VERSION >= 0x040400 +QT_END_NAMESPACE +#endif + +#include "moc_qtvariantproperty.cxx" diff --git a/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtvariantproperty.h b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtvariantproperty.h new file mode 100644 index 000000000..9f20d3dd4 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/3rdparty/qtpropertybrowser/qtvariantproperty.h @@ -0,0 +1,232 @@ +/**************************************************************************** +** +** This file is part of a Qt Solutions component. +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Solutions Commercial License Agreement provided +** with the Software or, alternatively, in accordance with the terms +** contained in a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** Please note Third Party Software included with Qt Solutions may impose +** additional restrictions and it is the user's responsibility to ensure +** that they have met the licensing requirements of the GPL, LGPL, or Qt +** Solutions Commercial license and the relevant license of the Third +** Party Software they are using. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the tools applications of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QTVARIANTPROPERTY_H +#define QTVARIANTPROPERTY_H + +#include "qtpropertybrowser.h" +#include +#include + +#if QT_VERSION >= 0x040400 +QT_BEGIN_NAMESPACE +#endif + +typedef QMap QtIconMap; + +class QtVariantPropertyManager; +class QtVariantPropertyPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtVariantProperty : public QtProperty +{ +public: + ~QtVariantProperty(); + QVariant value() const; + QVariant attributeValue(const QString &attribute) const; + int valueType() const; + int propertyType() const; + + void setValue(const QVariant &value); + void setAttribute(const QString &attribute, const QVariant &value); +protected: + QtVariantProperty(QtVariantPropertyManager *manager); +private: + friend class QtVariantPropertyManager; + QtVariantPropertyPrivate *d_ptr; +}; + +class QtVariantPropertyManagerPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtVariantPropertyManager : public QtAbstractPropertyManager +{ + Q_OBJECT +public: + QtVariantPropertyManager(QObject *parent = 0); + ~QtVariantPropertyManager(); + + virtual QtVariantProperty *addProperty(int propertyType, const QString &name = QString()); + + int propertyType(const QtProperty *property) const; + int valueType(const QtProperty *property) const; + QtVariantProperty *variantProperty(const QtProperty *property) const; + + virtual bool isPropertyTypeSupported(int propertyType) const; + virtual int valueType(int propertyType) const; + virtual QStringList attributes(int propertyType) const; + virtual int attributeType(int propertyType, const QString &attribute) const; + + virtual QVariant value(const QtProperty *property) const; + virtual QVariant attributeValue(const QtProperty *property, const QString &attribute) const; + + static int enumTypeId(); + static int flagTypeId(); + static int groupTypeId(); + static int iconMapTypeId(); +public Q_SLOTS: + virtual void setValue(QtProperty *property, const QVariant &val); + virtual void setAttribute(QtProperty *property, + const QString &attribute, const QVariant &value); +Q_SIGNALS: + void valueChanged(QtProperty *property, const QVariant &val); + void attributeChanged(QtProperty *property, + const QString &attribute, const QVariant &val); +protected: + virtual bool hasValue(const QtProperty *property) const; + QString valueText(const QtProperty *property) const; + QIcon valueIcon(const QtProperty *property) const; + virtual void initializeProperty(QtProperty *property); + virtual void uninitializeProperty(QtProperty *property); + virtual QtProperty *createProperty(); +private: + QtVariantPropertyManagerPrivate *d_ptr; + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, int, int)) + Q_PRIVATE_SLOT(d_func(), void slotSingleStepChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, double)) + Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, double, double)) + Q_PRIVATE_SLOT(d_func(), void slotSingleStepChanged(QtProperty *, double)) + Q_PRIVATE_SLOT(d_func(), void slotDecimalsChanged(QtProperty *, int)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, bool)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QString &)) + Q_PRIVATE_SLOT(d_func(), void slotRegExpChanged(QtProperty *, const QRegExp &)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QDate &)) + Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, const QDate &, const QDate &)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QTime &)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QDateTime &)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QKeySequence &)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QChar &)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QLocale &)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QPoint &)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QPointF &)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QSize &)) + Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, const QSize &, const QSize &)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QSizeF &)) + Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty *, const QSizeF &, const QSizeF &)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QRect &)) + Q_PRIVATE_SLOT(d_func(), void slotConstraintChanged(QtProperty *, const QRect &)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QRectF &)) + Q_PRIVATE_SLOT(d_func(), void slotConstraintChanged(QtProperty *, const QRectF &)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QColor &)) + Q_PRIVATE_SLOT(d_func(), void slotEnumNamesChanged(QtProperty *, const QStringList &)) + Q_PRIVATE_SLOT(d_func(), void slotEnumIconsChanged(QtProperty *, const QMap &)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QSizePolicy &)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QFont &)) + Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty *, const QCursor &)) + Q_PRIVATE_SLOT(d_func(), void slotFlagNamesChanged(QtProperty *, const QStringList &)) + + Q_PRIVATE_SLOT(d_func(), void slotPropertyInserted(QtProperty *, QtProperty *, QtProperty *)) + Q_PRIVATE_SLOT(d_func(), void slotPropertyRemoved(QtProperty *, QtProperty *)) + Q_DECLARE_PRIVATE(QtVariantPropertyManager) + Q_DISABLE_COPY(QtVariantPropertyManager) +}; + +class QtVariantEditorFactoryPrivate; + +class QT_QTPROPERTYBROWSER_EXPORT QtVariantEditorFactory : public QtAbstractEditorFactory +{ + Q_OBJECT +public: + QtVariantEditorFactory(QObject *parent = 0); + ~QtVariantEditorFactory(); +protected: + void connectPropertyManager(QtVariantPropertyManager *manager); + QWidget *createEditor(QtVariantPropertyManager *manager, QtProperty *property, + QWidget *parent); + void disconnectPropertyManager(QtVariantPropertyManager *manager); +private: + QtVariantEditorFactoryPrivate *d_ptr; + Q_DECLARE_PRIVATE(QtVariantEditorFactory) + Q_DISABLE_COPY(QtVariantEditorFactory) +}; + +#if QT_VERSION >= 0x040400 +QT_END_NAMESPACE +#endif + +Q_DECLARE_METATYPE(QIcon) +Q_DECLARE_METATYPE(QtIconMap) +#endif diff --git a/code/nel/tools/3d/object_viewer_qt/src/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/src/CMakeLists.txt index 3cbe745af..7dc1445bb 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/CMakeLists.txt +++ b/code/nel/tools/3d/object_viewer_qt/src/CMakeLists.txt @@ -1,3 +1,5 @@ +ADD_SUBDIRECTORY(3rdparty) + INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${LIBXML2_INCLUDE_DIR} ${NEL_INCLUDE_DIR} ${QT_INCLUDES}) INCLUDE( ${QT_USE_FILE} ) diff --git a/code/nel/tools/3d/object_viewer_qt/src/extension_system/iplugin.h b/code/nel/tools/3d/object_viewer_qt/src/extension_system/iplugin.h index fc2e0736b..973f80e14 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/extension_system/iplugin.h +++ b/code/nel/tools/3d/object_viewer_qt/src/extension_system/iplugin.h @@ -95,16 +95,10 @@ public: @endcode */ virtual void setNelContext(NLMISC::INelContext *nelContext) = 0; - - virtual QString name() const = 0; - virtual QString version() const = 0; - virtual QString vendor() const = 0; - virtual QString description() const = 0; - virtual QStringList dependencies() const = 0; }; }; //namespace ExtensionSystem -Q_DECLARE_INTERFACE(ExtensionSystem::IPlugin, "dev.ryzom.com.ObjectViewerQt.IPlugin/0.9.1") +Q_DECLARE_INTERFACE(ExtensionSystem::IPlugin, "dev.ryzom.com.ObjectViewerQt.IPlugin/0.9.2") #endif // IPLUGIN_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/extension_system/iplugin_manager.h b/code/nel/tools/3d/object_viewer_qt/src/extension_system/iplugin_manager.h index 05d4b832c..e38748e77 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/extension_system/iplugin_manager.h +++ b/code/nel/tools/3d/object_viewer_qt/src/extension_system/iplugin_manager.h @@ -98,7 +98,7 @@ public: { QList all = allObjects(); QObject *result = 0; - Q_FOREACH (QObject *qobj, all) + Q_FOREACH(QObject *qobj, all) { if (qobj->objectName() == name) { diff --git a/code/nel/tools/3d/object_viewer_qt/src/extension_system/iplugin_spec.h b/code/nel/tools/3d/object_viewer_qt/src/extension_system/iplugin_spec.h index f0c62fec7..2aefbb894 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/extension_system/iplugin_spec.h +++ b/code/nel/tools/3d/object_viewer_qt/src/extension_system/iplugin_spec.h @@ -37,8 +37,8 @@ struct State { Invalid = 1, Read, - Loaded, Resolved, + Loaded, Initialized, Running, Stopped, @@ -71,9 +71,13 @@ public: virtual IPlugin *plugin() const = 0; // state - virtual int getState() const = 0; + virtual int state() const = 0; virtual bool hasError() const = 0; virtual QString errorString() const = 0; + + /// Enables/disables load this plugin after restart the program + virtual void setEnabled(bool enabled) = 0; + virtual bool isEnabled() const = 0; }; } // namespace ExtensionSystem diff --git a/code/nel/tools/3d/object_viewer_qt/src/extension_system/plugin_manager.cpp b/code/nel/tools/3d/object_viewer_qt/src/extension_system/plugin_manager.cpp index be5f18c74..8be6fcd93 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/extension_system/plugin_manager.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/extension_system/plugin_manager.cpp @@ -26,20 +26,22 @@ namespace ExtensionSystem { -CPluginManager::CPluginManager(QObject *parent) +PluginManager::PluginManager(QObject *parent) :IPluginManager(parent), - m_settings(0) + m_settings(0), + m_extension("xml") { } -CPluginManager::~CPluginManager() +PluginManager::~PluginManager() { + writeSettings(); stopAll(); deleteAll(); qDeleteAll(m_pluginSpecs); } -void CPluginManager::addObject(QObject *obj) +void PluginManager::addObject(QObject *obj) { QWriteLocker lock(&m_lock); if (obj == 0) @@ -59,7 +61,7 @@ void CPluginManager::addObject(QObject *obj) Q_EMIT objectAdded(obj); } -void CPluginManager::removeObject(QObject *obj) +void PluginManager::removeObject(QObject *obj) { if (obj == 0) { @@ -79,25 +81,25 @@ void CPluginManager::removeObject(QObject *obj) m_allObjects.removeAll(obj); } -QList CPluginManager::allObjects() const +QList PluginManager::allObjects() const { return m_allObjects; } -void CPluginManager::loadPlugins() +void PluginManager::loadPlugins() { - Q_FOREACH (CPluginSpec *spec, m_pluginSpecs) - setPluginState(spec, State::Loaded); - - Q_FOREACH (CPluginSpec *spec, m_pluginSpecs) + Q_FOREACH (PluginSpec *spec, m_pluginSpecs) setPluginState(spec, State::Resolved); - QList queue = loadQueue(); + QList queue = loadQueue(); - Q_FOREACH (CPluginSpec *spec, queue) + Q_FOREACH (PluginSpec *spec, queue) + setPluginState(spec, State::Loaded); + + Q_FOREACH (PluginSpec *spec, queue) setPluginState(spec, State::Initialized); - QListIterator it(queue); + QListIterator it(queue); it.toBack(); while (it.hasPrevious()) setPluginState(it.previous(), State::Running); @@ -105,41 +107,72 @@ void CPluginManager::loadPlugins() Q_EMIT pluginsChanged(); } -QStringList CPluginManager::getPluginPaths() const +QStringList PluginManager::getPluginPaths() const { return m_pluginPaths; } -void CPluginManager::setPluginPaths(const QStringList &paths) +void PluginManager::setPluginPaths(const QStringList &paths) { m_pluginPaths = paths; readPluginPaths(); + readSettings(); } -QList CPluginManager::plugins() const +QList PluginManager::plugins() const { return m_ipluginSpecs; } -void CPluginManager::setSettings(QSettings *settings) +void PluginManager::setSettings(QSettings *settings) { m_settings = settings; } -QSettings *CPluginManager::settings() const +QSettings *PluginManager::settings() const { return m_settings; } -void CPluginManager::readSettings() +void PluginManager::readSettings() { + if (m_settings) + { + QStringList blackList; + m_settings->beginGroup("PluginManager"); + blackList = m_settings->value("BlackList").toStringList(); + m_settings->endGroup(); + Q_FOREACH (PluginSpec *spec, m_pluginSpecs) + { + QString pluginName = spec->fileName(); + + if (blackList.contains(pluginName)) + { + spec->setEnabled(false); + spec->setEnabledStartup(false); + } + } + } } -void CPluginManager::writeSettings() +void PluginManager::writeSettings() { + if (m_settings) + { + QStringList blackList; + Q_FOREACH(PluginSpec *spec, m_pluginSpecs) + { + if (!spec->isEnabled()) + blackList.push_back(spec->fileName()); + } + m_settings->beginGroup("PluginManager"); + m_settings->setValue("BlackList", blackList); + m_settings->endGroup(); + m_settings->sync(); + } } -void CPluginManager::readPluginPaths() +void PluginManager::readPluginPaths() { qDeleteAll(m_pluginSpecs); m_pluginSpecs.clear(); @@ -150,11 +183,7 @@ void CPluginManager::readPluginPaths() while (!searchPaths.isEmpty()) { const QDir dir(searchPaths.takeFirst()); -#ifdef Q_OS_WIN - const QFileInfoList files = dir.entryInfoList(QStringList() << QString("ovqt_plugin_*.dll"), QDir::Files); -#else - const QFileInfoList files = dir.entryInfoList(QStringList() << QString("libovqt_plugin_*.so"), QDir::Files); -#endif + const QFileInfoList files = dir.entryInfoList(QStringList() << QString("ovqt_plugin_*.%1").arg(m_extension), QDir::Files); Q_FOREACH (const QFileInfo &file, files) pluginsList << file.absoluteFilePath(); const QFileInfoList dirs = dir.entryInfoList(QDir::Dirs|QDir::NoDotAndDotDot); @@ -164,9 +193,9 @@ void CPluginManager::readPluginPaths() Q_FOREACH (const QString &pluginFile, pluginsList) { - CPluginSpec *spec = new CPluginSpec; - spec->setFileName(pluginFile); + PluginSpec *spec = new PluginSpec; spec->m_pluginManager = this; + spec->setSpecFileName(pluginFile); m_pluginSpecs.append(spec); m_ipluginSpecs.append(spec); } @@ -174,16 +203,17 @@ void CPluginManager::readPluginPaths() Q_EMIT pluginsChanged(); } -void CPluginManager::setPluginState(CPluginSpec *spec, int destState) +void PluginManager::setPluginState(PluginSpec *spec, int destState) { - if (spec->hasError() || spec->getState() != destState-1) + if (spec->hasError() || spec->state() != destState-1) + return; + + // plugin in black list + if (!spec->isEnabledStartup()) return; switch (destState) { - case State::Loaded: - spec->loadLibrary(); - return; case State::Resolved: spec->resolveDependencies(m_pluginSpecs); return; @@ -196,18 +226,21 @@ void CPluginManager::setPluginState(CPluginSpec *spec, int destState) default: break; } - Q_FOREACH (const CPluginSpec *depSpec, spec->dependencySpecs()) + Q_FOREACH (const PluginSpec *depSpec, spec->dependencySpecs()) { - if (depSpec->getState() != destState) + if (depSpec->state() != destState) { spec->m_hasError = true; - spec->m_errorString = tr("Cannot initializing plugin because dependency failed to load: %1\nReason: %2") - .arg(depSpec->name()).arg(depSpec->errorString()); + spec->m_errorString = tr("Cannot load plugin because dependency failed to load: %1") + .arg(depSpec->name()); return; } } switch (destState) { + case State::Loaded: + spec->loadLibrary(); + return; case State::Initialized: spec->initializePlugin(); break; @@ -219,19 +252,19 @@ void CPluginManager::setPluginState(CPluginSpec *spec, int destState) } } -QList CPluginManager::loadQueue() +QList PluginManager::loadQueue() { - QList queue; - Q_FOREACH(CPluginSpec *spec, m_pluginSpecs) + QList queue; + Q_FOREACH(PluginSpec *spec, m_pluginSpecs) { - QList circularityCheckQueue; + QList circularityCheckQueue; loadQueue(spec, queue, circularityCheckQueue); } return queue; } -bool CPluginManager::loadQueue(CPluginSpec *spec, QList &queue, - QList &circularityCheckQueue) +bool PluginManager::loadQueue(PluginSpec *spec, QList &queue, + QList &circularityCheckQueue) { if (queue.contains(spec)) return true; @@ -251,14 +284,14 @@ bool CPluginManager::loadQueue(CPluginSpec *spec, QList &queue, } circularityCheckQueue.append(spec); // check if we have the dependencies - if (spec->getState() == State::Invalid || spec->getState() == State::Read) + if (spec->state() == State::Invalid || spec->state() == State::Read) { queue.append(spec); return false; } // add dependencies - Q_FOREACH (CPluginSpec *depSpec, spec->dependencySpecs()) + Q_FOREACH (PluginSpec *depSpec, spec->dependencySpecs()) { if (!loadQueue(depSpec, queue, circularityCheckQueue)) { @@ -274,17 +307,17 @@ bool CPluginManager::loadQueue(CPluginSpec *spec, QList &queue, return true; } -void CPluginManager::stopAll() +void PluginManager::stopAll() { - QList queue = loadQueue(); - Q_FOREACH (CPluginSpec *spec, queue) + QList queue = loadQueue(); + Q_FOREACH (PluginSpec *spec, queue) setPluginState(spec, State::Stopped); } -void CPluginManager::deleteAll() +void PluginManager::deleteAll() { - QList queue = loadQueue(); - QListIterator it(queue); + QList queue = loadQueue(); + QListIterator it(queue); it.toBack(); while (it.hasPrevious()) { diff --git a/code/nel/tools/3d/object_viewer_qt/src/extension_system/plugin_manager.h b/code/nel/tools/3d/object_viewer_qt/src/extension_system/plugin_manager.h index 4ef3b2208..9ab1ae135 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/extension_system/plugin_manager.h +++ b/code/nel/tools/3d/object_viewer_qt/src/extension_system/plugin_manager.h @@ -29,15 +29,15 @@ namespace ExtensionSystem { class IPlugin; -class CPluginSpec; +class PluginSpec; -class CPluginManager : public IPluginManager +class PluginManager : public IPluginManager { Q_OBJECT public: - CPluginManager(QObject *parent = 0); - ~CPluginManager(); + PluginManager(QObject *parent = 0); + ~PluginManager(); // Object pool operations virtual void addObject(QObject *obj); @@ -49,7 +49,7 @@ public: virtual QStringList getPluginPaths() const; virtual void setPluginPaths(const QStringList &paths); virtual QList plugins() const; - QList loadQueue(); + QList loadQueue(); // Settings virtual void setSettings(QSettings *settings); @@ -58,21 +58,22 @@ public: void writeSettings(); private: - void setPluginState(CPluginSpec *spec, int destState); + void setPluginState(PluginSpec *spec, int destState); void readPluginPaths(); - bool loadQueue(CPluginSpec *spec, QList &queue, QList &circularityCheckQueue); + bool loadQueue(PluginSpec *spec, QList &queue, QList &circularityCheckQueue); void stopAll(); void deleteAll(); mutable QReadWriteLock m_lock; QSettings *m_settings; - QList m_pluginSpecs; + QString m_extension; + QList m_pluginSpecs; QList m_ipluginSpecs; QStringList m_pluginPaths; QList m_allObjects; -}; // class CPluginManager +}; // class PluginManager } // namespace ExtensionSystem diff --git a/code/nel/tools/3d/object_viewer_qt/src/extension_system/plugin_spec.cpp b/code/nel/tools/3d/object_viewer_qt/src/extension_system/plugin_spec.cpp index d77d90962..1e3ec0182 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/extension_system/plugin_spec.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/extension_system/plugin_spec.cpp @@ -16,12 +16,15 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +// Project includes #include "plugin_spec.h" #include "iplugin.h" #include "iplugin_manager.h" #include "nel/misc/app_context.h" +#include "nel/misc/debug.h" +// Qt includes #include #include #include @@ -30,8 +33,17 @@ namespace ExtensionSystem { +const char *const PLUGIN_SPEC_NAME = "name"; +const char *const PLUGIN_SPEC_VENDOR = "vendor"; +const char *const PLUGIN_SPEC_VERSION = "version"; +const char *const PLUGIN_SPEC_LIBRARY_NAME = "library-name"; +const char *const PLUGIN_SPEC_DESCRIPTION = "description"; +const char *const PLUGIN_SPEC_DEPENDENCIES = "dependencies"; +const char *const PLUGIN_SPEC_DEPENDENCY = "dependency"; +const char *const PLUGIN_SPEC_DEPENDENCY_NAME = "plugin-name"; +const char *const PLUGIN_SPEC_DEPENDENCY_VERSION = "version"; -CPluginSpec::CPluginSpec() +PluginSpec::PluginSpec() : m_location(""), m_filePath(""), m_fileName(""), @@ -39,100 +51,210 @@ CPluginSpec::CPluginSpec() m_version(""), m_vendor(""), m_description(""), + m_nameSpecFile(""), + m_suffix(""), m_state(State::Invalid), + m_enabled(true), + m_enabledStartup(true), m_hasError(false), m_errorString(""), m_plugin(0), m_pluginManager(0) { +// Compilation mode specific suffixes +#ifdef NL_OS_WINDOWS +# if defined(NL_DEBUG) + m_suffix = "_d.dll"; +# elif defined(NL_RELEASE) + m_suffix = "_r.dll"; +# else +# error "Unknown compilation mode, can't build suffix" +# endif +#elif defined (NL_OS_UNIX) + m_suffix = ".so"; +#else +# error "You must define the lib suffix for your platform" +#endif } -QString CPluginSpec::name() const +QString PluginSpec::name() const { return m_name; } -QString CPluginSpec::version() const +QString PluginSpec::version() const { return m_version; } -QString CPluginSpec::vendor() const +QString PluginSpec::vendor() const { return m_vendor; } -QString CPluginSpec::description() const +QString PluginSpec::description() const { return m_description; } -QString CPluginSpec::location() const +QString PluginSpec::location() const { return m_location; } -QString CPluginSpec::filePath() const +QString PluginSpec::filePath() const { return m_filePath; } -QString CPluginSpec::fileName() const +QString PluginSpec::fileName() const { return m_fileName; } -IPlugin* CPluginSpec::plugin() const +IPlugin *PluginSpec::plugin() const { return m_plugin; } -int CPluginSpec::getState() const +int PluginSpec::state() const { return m_state; } -bool CPluginSpec::hasError() const +bool PluginSpec::hasError() const { return m_hasError; } -QString CPluginSpec::errorString() const +QString PluginSpec::errorString() const { return m_errorString; } -QList CPluginSpec::dependencySpecs() const +QList PluginSpec::dependencySpecs() const { return m_dependencySpecs; } -bool CPluginSpec::setFileName(const QString &fileName) +bool PluginSpec::setFileName(const QString &fileName) { - QFile file(fileName); + m_fileName = fileName + m_suffix; + m_filePath = m_location + "/" + m_fileName; + + nlinfo(m_filePath.toStdString().c_str()); + QFile file(m_filePath); if (!file.exists()) - return reportError(QCoreApplication::translate("CPluginSpec", "File does not exist: %1").arg(file.fileName())); + return reportError(QCoreApplication::translate("PluginSpec", "File does not exist: %1").arg(file.fileName())); if (!file.open(QIODevice::ReadOnly)) - return reportError(QCoreApplication::translate("CPluginSpec", "Could not open file for read: %1").arg(file.fileName())); + return reportError(QCoreApplication::translate("PluginSpec", "Could not open file for read: %1").arg(file.fileName())); + return true; +} + +bool PluginSpec::setSpecFileName(const QString &specFileName) +{ + m_nameSpecFile = specFileName; + + QFile file(specFileName); + if (!file.exists()) + return reportError(QCoreApplication::translate("PluginSpec", "Spec file does not exist: %1").arg(file.fileName())); QFileInfo fileInfo(file); m_location = fileInfo.absolutePath(); - m_filePath = fileInfo.absoluteFilePath(); - m_fileName = fileInfo.fileName(); + readSpec(); + return true; +} +bool PluginSpec::readSpec() +{ + QFile file(m_nameSpecFile); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + return reportError(QCoreApplication::translate("PluginSpec", "Could not open spec file for read: %1").arg(file.fileName())); + + QXmlStreamReader reader(&file); + while (!reader.atEnd()) + { + if (reader.isStartElement()) + parseSpec(reader); + reader.readNext(); + } + if (reader.hasError()) + return reportError(QCoreApplication::translate("PluginSpec", "Error parsing file %1: %2, at line %3, column %4") + .arg(file.fileName()) + .arg(reader.errorString()) + .arg(reader.lineNumber()) + .arg(reader.columnNumber())); m_state = State::Read; return true; } -bool CPluginSpec::loadLibrary() +void PluginSpec::parseSpec(QXmlStreamReader &reader) +{ + QString elemName = reader.name().toString(); + reader.readNext(); + if (reader.isCharacters()) + { + QString elemText = reader.text().toString(); + if (elemName == PLUGIN_SPEC_LIBRARY_NAME) + setFileName(elemText); + if (elemName == PLUGIN_SPEC_NAME) + m_name = elemText; + if (elemName == PLUGIN_SPEC_VERSION) + m_version = elemText; + if (elemName == PLUGIN_SPEC_VENDOR) + m_vendor = elemText; + if (elemName == PLUGIN_SPEC_DESCRIPTION) + m_description = elemText; + if (elemName == PLUGIN_SPEC_DEPENDENCIES) + parseDependency(reader); + } +} + +void PluginSpec::parseDependency(QXmlStreamReader &reader) +{ + QString elemName; + while (!reader.atEnd() && (elemName != PLUGIN_SPEC_DEPENDENCIES)) + { + reader.readNext(); + elemName = reader.name().toString(); + if (reader.isStartElement() && (elemName == PLUGIN_SPEC_DEPENDENCY)) + { + // Read name dependency plugin + QString dependencyName = reader.attributes().value(PLUGIN_SPEC_DEPENDENCY_NAME).toString(); + if (dependencyName.isEmpty()) + { + reader.raiseError(QCoreApplication::translate("CPluginSpec", "'%1' misses attribute '%2'") + .arg(PLUGIN_SPEC_DEPENDENCY) + .arg(PLUGIN_SPEC_DEPENDENCY_NAME)); + return; + } + // TODO: Read version dependency plugin + QString dependencyVersion = reader.attributes().value(PLUGIN_SPEC_DEPENDENCY_VERSION).toString(); + + m_dependencies.push_back(dependencyName); + } + } +} + +void PluginSpec::setEnabled(bool enabled) +{ + m_enabled = enabled; +} + +bool PluginSpec::isEnabled() const +{ + return m_enabled; +} + +bool PluginSpec::loadLibrary() { if (m_hasError) return false; - if (m_state != State::Read) + if (m_state != State::Resolved) { if (m_state == State::Loaded) return true; - return reportError(QCoreApplication::translate("CPluginSpec", "Loading the library failed because state != Resolved")); + return reportError(QCoreApplication::translate("PluginSpec", "Loading the library failed because state != Resolved")); } QPluginLoader loader(m_filePath); @@ -143,38 +265,32 @@ bool CPluginSpec::loadLibrary() if (!pluginObject) { loader.unload(); - return reportError(QCoreApplication::translate("CPluginSpec", "Plugin is not valid (does not derive from IPlugin)")); + return reportError(QCoreApplication::translate("PluginSpec", "Plugin is not valid (does not derive from IPlugin)")); } pluginObject->setNelContext(&NLMISC::INelContext::getInstance()); - m_name = pluginObject->name(); - m_version = pluginObject->version(); - m_vendor = pluginObject->vendor(); - m_description = pluginObject->description(); - m_state = State::Loaded; m_plugin = pluginObject; return true; } -bool CPluginSpec::resolveDependencies(const QList &specs) +bool PluginSpec::resolveDependencies(const QList &specs) { if (m_hasError) return false; - if (m_state != State::Loaded) + if (m_state != State::Read) { - m_errorString = QCoreApplication::translate("CPluginSpec", "Resolving dependencies failed because state != Read"); + m_errorString = QCoreApplication::translate("PluginSpec", "Resolving dependencies failed because state != Read"); m_hasError = true; return false; } - QList resolvedDependencies; - QStringList dependencies = m_plugin->dependencies(); - Q_FOREACH(const QString &dependency, dependencies) + QList resolvedDependencies; + Q_FOREACH(const QString &dependency, m_dependencies) { - CPluginSpec *found = 0; + PluginSpec *found = 0; - Q_FOREACH(CPluginSpec *spec, specs) + Q_FOREACH(PluginSpec *spec, specs) { if (QString::compare(dependency, spec->name(), Qt::CaseInsensitive) == 0) { @@ -187,7 +303,7 @@ bool CPluginSpec::resolveDependencies(const QList &specs) m_hasError = true; if (!m_errorString.isEmpty()) m_errorString.append(QLatin1Char('\n')); - m_errorString.append(QCoreApplication::translate("CPluginSpec", "Could not resolve dependency '%1'") + m_errorString.append(QCoreApplication::translate("PluginSpec", "Could not resolve dependency '%1'") .arg(dependency)); continue; } @@ -197,34 +313,32 @@ bool CPluginSpec::resolveDependencies(const QList &specs) return false; m_dependencySpecs = resolvedDependencies; - m_state = State::Resolved; - return true; } -bool CPluginSpec::initializePlugin() +bool PluginSpec::initializePlugin() { if (m_hasError) return false; - if (m_state != State::Resolved) + if (m_state != State::Loaded) { if (m_state == State::Initialized) return true; - return reportError(QCoreApplication::translate("CPluginSpec", "Initializing the plugin failed because state != Resolved)")); + return reportError(QCoreApplication::translate("PluginSpec", "Initializing the plugin failed because state != Loaded)")); } if (!m_plugin) - return reportError(QCoreApplication::translate("CPluginSpec", "Internal error: have no plugin instance to initialize")); + return reportError(QCoreApplication::translate("PluginSpec", "Internal error: have no plugin instance to initialize")); QString err; if (!m_plugin->initialize(m_pluginManager, &err)) - return reportError(QCoreApplication::translate("CPluginSpec", "Plugin initialization failed: %1").arg(err)); + return reportError(QCoreApplication::translate("PluginSpec", "Plugin initialization failed: %1").arg(err)); m_state = State::Initialized; return true; } -bool CPluginSpec::initializeExtensions() +bool PluginSpec::initializeExtensions() { if (m_hasError) return false; @@ -232,17 +346,17 @@ bool CPluginSpec::initializeExtensions() { if (m_state == State::Running) return true; - return reportError(QCoreApplication::translate("CPluginSpec", "Cannot perform extensionsInitialized because state != Initialized")); + return reportError(QCoreApplication::translate("PluginSpec", "Cannot perform extensionsInitialized because state != Initialized")); } if (!m_plugin) - return reportError(QCoreApplication::translate("CPluginSpec", "Internal error: have no plugin instance to perform extensionsInitialized")); + return reportError(QCoreApplication::translate("PluginSpec", "Internal error: have no plugin instance to perform extensionsInitialized")); m_plugin->extensionsInitialized(); m_state = State::Running; return true; } -void CPluginSpec::stop() +void PluginSpec::stop() { if (!m_plugin) return; @@ -250,7 +364,7 @@ void CPluginSpec::stop() m_state = State::Stopped; } -void CPluginSpec::kill() +void PluginSpec::kill() { if (!m_plugin) return; @@ -259,7 +373,17 @@ void CPluginSpec::kill() m_state = State::Deleted; } -bool CPluginSpec::reportError(const QString &err) +void PluginSpec::setEnabledStartup(bool enabled) +{ + m_enabledStartup = enabled; +} + +bool PluginSpec::isEnabledStartup() const +{ + return m_enabledStartup; +} + +bool PluginSpec::reportError(const QString &err) { m_errorString = err; m_hasError = true; diff --git a/code/nel/tools/3d/object_viewer_qt/src/extension_system/plugin_spec.h b/code/nel/tools/3d/object_viewer_qt/src/extension_system/plugin_spec.h index 0cc895ada..c28980d69 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/extension_system/plugin_spec.h +++ b/code/nel/tools/3d/object_viewer_qt/src/extension_system/plugin_spec.h @@ -21,12 +21,14 @@ #include "iplugin_spec.h" -#include "QtCore/QList" +#include +#include +#include namespace ExtensionSystem { -class CPluginSpec: public IPluginSpec +class PluginSpec: public IPluginSpec { public: virtual QString name() const; @@ -41,22 +43,35 @@ public: virtual IPlugin *plugin() const; // state - virtual int getState() const; + virtual int state() const; virtual bool hasError() const; virtual QString errorString() const; - QList dependencySpecs() const; + QList dependencySpecs() const; + + /// Enables/disables load this plugin after restart the program + virtual void setEnabled(bool enabled); + virtual bool isEnabled() const; private: - CPluginSpec(); + PluginSpec(); bool setFileName(const QString &fileName); + bool setSpecFileName(const QString &specFileName); + bool readSpec(); + void parseSpec(QXmlStreamReader &reader); + void parseDependency(QXmlStreamReader &reader); bool loadLibrary(); - bool resolveDependencies(const QList &specs); + bool resolveDependencies(const QList &specs); bool initializePlugin(); bool initializeExtensions(); void stop(); void kill(); + /// Enables/disables load this plugin on startup the program + /// Method is used for disabling startup plugin by pluginmanager + void setEnabledStartup(bool enabled); + bool isEnabledStartup() const; + bool reportError(const QString &err); QString m_location; @@ -68,15 +83,19 @@ private: QString m_vendor; QString m_description; + QString m_nameSpecFile; + QString m_suffix; int m_state; + bool m_enabled, m_enabledStartup; bool m_hasError; QString m_errorString; + QStringList m_dependencies; IPlugin *m_plugin; IPluginManager *m_pluginManager; - QList m_dependencySpecs; + QList m_dependencySpecs; - friend class CPluginManager; + friend class PluginManager; }; } // namespace ExtensionSystem diff --git a/code/nel/tools/3d/object_viewer_qt/src/main.cpp b/code/nel/tools/3d/object_viewer_qt/src/main.cpp index 050b7716c..4b904bdc6 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/main.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/main.cpp @@ -132,7 +132,7 @@ sint main(int argc, char **argv) QSettings::setDefaultFormat(QSettings::IniFormat); QSettings *settings = new QSettings(QSettings::IniFormat, QSettings::UserScope, - QLatin1String("RyzomCore"), QLatin1String(appNameC)); + QLatin1String("RyzomCore"), QLatin1String(appNameC)); QTranslator translator; QTranslator qtTranslator; @@ -148,7 +148,7 @@ sint main(int argc, char **argv) NLMISC::CLibrary::addLibPath((qApp->applicationDirPath() + QString("/../PlugIns/nel")).toStdString()); #endif - ExtensionSystem::CPluginManager pluginManager; + ExtensionSystem::PluginManager pluginManager; pluginManager.setSettings(settings); QStringList pluginPaths; #if !defined(NL_OS_MAC) @@ -162,17 +162,8 @@ sint main(int argc, char **argv) splash->hide(); - const QList plugins = pluginManager.plugins(); - ExtensionSystem::IPluginSpec *corePlugin = 0; - Q_FOREACH(ExtensionSystem::IPluginSpec *spec, plugins) - { - if (spec->name() == QLatin1String("Core")) - { - corePlugin = spec; - break; - } - } - + ExtensionSystem::IPluginSpec *corePlugin = pluginManager.pluginByName("Core"); + if (!corePlugin) { QDir absolutePluginPaths(pluginPaths.join(QLatin1String(","))); @@ -183,8 +174,8 @@ sint main(int argc, char **argv) QString newPath = QFileDialog::getExistingDirectory(0, QCoreApplication::translate("Application", "Change the plugins path"), QDir::homePath()); bool ok; QString text = QInputDialog::getText(0, QCoreApplication::translate("Application", "Enter the plugins path"), - QCoreApplication::translate("Application", "Plugin path:"), QLineEdit::Normal, - newPath, &ok); + QCoreApplication::translate("Application", "Plugin path:"), QLineEdit::Normal, + newPath, &ok); if (ok && !text.isEmpty()) settings->setValue("PluginPath", text); settings->sync(); @@ -203,7 +194,7 @@ sint main(int argc, char **argv) if (!errors.isEmpty()) QMessageBox::warning(0, QCoreApplication::translate("Application", "Object Viewer Qt - Plugin loader messages"), - errors.join(QString::fromLatin1("\n\n"))); + errors.join(QString::fromLatin1("\n\n"))); int result = app.exec(); return result; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/src/plugins/CMakeLists.txt index bec71cf94..467b00876 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/CMakeLists.txt +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/CMakeLists.txt @@ -1,9 +1,16 @@ ADD_SUBDIRECTORY(core) ADD_SUBDIRECTORY(example) ADD_SUBDIRECTORY(ovqt_sheet_builder) -ADD_SUBDIRECTORY(landscape_editor) +ADD_SUBDIRECTORY(landscape_editor) ADD_SUBDIRECTORY(log) ADD_SUBDIRECTORY(disp_sheet_id) ADD_SUBDIRECTORY(object_viewer) -ADD_SUBDIRECTORY(zone_painter) ADD_SUBDIRECTORY(georges_editor) +ADD_SUBDIRECTORY(translation_manager) +ADD_SUBDIRECTORY(bnp_manager) +# Note: Temporarily disabled until development continues. +#ADD_SUBDIRECTORY(zone_painter) +# Ryzom Specific Plugins +IF(WITH_RYZOM AND WITH_RYZOM_TOOLS) + ADD_SUBDIRECTORY(mission_compiler) +ENDIF(WITH_RYZOM AND WITH_RYZOM_TOOLS) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/CMakeLists.txt new file mode 100644 index 000000000..7ecfd7396 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/CMakeLists.txt @@ -0,0 +1,47 @@ +INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} + ${LIBXML2_INCLUDE_DIR} + ${QT_INCLUDES}) + +FILE(GLOB SRC *.cpp *.h) +SET(OVQT_EXT_SYS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin.h + ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_manager.h + ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_spec.h) + +SET(OVQT_PLUG_BNP_MANAGER_HDR bnp_manager_plugin.h + bnp_manager_window.h + bnp_dirtree_dialog.h + bnp_filesystem_model.h + bnp_file.h + bnp_filelist_dialog.h + bnp_proxy_model.h + ) +SET(OVQT_PLUG_BNP_MANAGER_UIS bnp_dirtree_form.ui + bnp_filelist_dialog.ui + ) + +SET(OVQT_PLUGIN_BNP_MANAGER_RCS bnp_manager.qrc) + +SET(QT_USE_QTGUI TRUE) + +QT4_ADD_RESOURCES(OVQT_PLUGIN_BNP_MANAGER_RC_SRCS ${OVQT_PLUGIN_BNP_MANAGER_RCS}) +QT4_WRAP_CPP(OVQT_PLUG_BNP_MANAGER_MOC_SRC ${OVQT_PLUG_BNP_MANAGER_HDR}) +QT4_WRAP_UI(OVQT_PLUG_BNP_MANAGER_UI_HDRS ${OVQT_PLUG_BNP_MANAGER_UIS}) + +SOURCE_GROUP(QtResources FILES ${OVQT_PLUG_BNP_MANAGER_UIS} ${OVQT_PLUGIN_BNP_MANAGER_RCS}) +SOURCE_GROUP(QtGeneratedUiHdr FILES ${OVQT_PLUG_BNP_MANAGER_UI_HDRS}) +SOURCE_GROUP(QtGeneratedMocSrc FILES ${OVQT_PLUG_BNP_MANAGER_MOC_SRC}) +SOURCE_GROUP("BNP Manager Plugin" FILES ${SRC}) +SOURCE_GROUP("OVQT Extension System" FILES ${OVQT_EXT_SYS_SRC}) + +ADD_LIBRARY(ovqt_plugin_bnp_manager MODULE ${SRC} ${OVQT_PLUG_BNP_MANAGER_MOC_SRC} ${OVQT_EXT_SYS_SRC} ${OVQT_PLUGIN_BNP_MANAGER_RC_SRCS} ${OVQT_PLUG_BNP_MANAGER_UI_HDRS}) + +TARGET_LINK_LIBRARIES(ovqt_plugin_bnp_manager ovqt_plugin_core nelmisc nelgeorges ${QT_LIBRARIES}) + +NL_DEFAULT_PROPS(ovqt_plugin_bnp_manager "NeL, Tools, 3D: Object Viewer Qt Plugin: BNP Manager") +NL_ADD_RUNTIME_FLAGS(ovqt_plugin_bnp_manager) +NL_ADD_LIB_SUFFIX(ovqt_plugin_bnp_manager) + +ADD_DEFINITIONS(${LIBXML2_DEFINITIONS} -DQT_PLUGIN -DQT_SHARED ${QT_DEFINITIONS}) + +INSTALL(TARGETS ovqt_plugin_bnp_manager LIBRARY DESTINATION lib RUNTIME DESTINATION bin ARCHIVE DESTINATION lib COMPONENT tools3d) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_dirtree_dialog.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_dirtree_dialog.cpp new file mode 100644 index 000000000..a19f4550e --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_dirtree_dialog.cpp @@ -0,0 +1,93 @@ +// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework +// Copyright (C) 2011 Roland Winklmeier +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Project includes +#include "bnp_dirtree_dialog.h" +#include "bnp_filesystem_model.h" +#include "bnp_proxy_model.h" + +// Qt includes +#include + +// NeL includes +#include + +namespace BNPManager +{ + +CBnpDirTreeDialog::CBnpDirTreeDialog(QString bnpPath, QWidget *parent) + : QDockWidget(parent), + m_DataPath(bnpPath) +{ + // Setup the dialog + m_ui.setupUi(this); + + // Filter settings to only display files with bnp extension. + // Could be changed to display all files and react according to the extension: + // Bnp file: opened and displayed + // all other files: added to the currently opened bnp file + QStringList filter; + filter << tr("*.bnp"); + + // Setup the directory tree model + m_dirModel= new BNPFileSystemModel(); + m_proxyModel = new BNPSortProxyModel(); + m_ui.dirTree->setSortingEnabled(true); + m_dirModel->setRootPath(m_DataPath); + m_dirModel->setFilter(QDir::AllDirs | QDir::NoDotAndDotDot | QDir::AllEntries); + m_dirModel->setNameFilters(filter); + m_dirModel->setNameFilterDisables(0); + + m_proxyModel->setSourceModel(m_dirModel); + + m_ui.dirTree->setModel(m_proxyModel); + + m_ui.dirTree->setRootIndex( m_proxyModel->mapFromSource (m_dirModel->index(m_DataPath) ) ); + + // Trigger if one filename is activated + // In future drag&drop should be also possible + connect(m_ui.dirTree, SIGNAL(activated(QModelIndex)), + this, SLOT(fileSelected(QModelIndex))); +} +// *************************************************************************** +CBnpDirTreeDialog::~CBnpDirTreeDialog() +{ + +} +// *************************************************************************** +void CBnpDirTreeDialog::fileSelected(QModelIndex index) +{ + QModelIndex source = m_proxyModel->mapToSource(index); + if (source.isValid() && !m_dirModel->isDir(source)) + { + // emit the according signal to BNPManagerWindow class + Q_EMIT selectedFile(m_dirModel->fileInfo(source).filePath()); + } +} +// *************************************************************************** +void CBnpDirTreeDialog::changeFile(QString file) +{ + +} +// *************************************************************************** +void CBnpDirTreeDialog::BnpPathChanged(QString path) +{ + +} +// *************************************************************************** +} + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_dirtree_dialog.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_dirtree_dialog.h new file mode 100644 index 000000000..737085185 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_dirtree_dialog.h @@ -0,0 +1,83 @@ +// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework +// Copyright (C) 2011 Roland Winklmeier +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef BNP_DIRTREE_DIALOG_H +#define BNP_DIRTREE_DIALOG_H + +// Qt includes +#include + +// STL includes + +// NeL includes + +// Project includes +#include "ui_bnp_dirtree_form.h" + +namespace BNPManager +{ + +class BNPFileSystemModel; +class BNPSortProxyModel; + +class CBnpDirTreeDialog : public QDockWidget +{ + Q_OBJECT +public: + + /** + * Constructor + * \param path to root directory, which should be displayed + */ + CBnpDirTreeDialog(QString bnpPath, QWidget *parent = 0); + + /** + * Destructor + */ + ~CBnpDirTreeDialog(); + + /** + * Change the root path for the dir tree view + * \param data path to the new directory + */ + void BnpPathChanged(QString); + +private: + + Ui::CBnpDirTreeDialog m_ui; + + // path ro data root directory + QString m_DataPath; + + BNPFileSystemModel *m_dirModel; + + BNPSortProxyModel *m_proxyModel; + +Q_SIGNALS: + void selectedFile(const QString); + +private Q_SLOTS: + /** + * Triggered if the user activates (double klick on windows) + * a file name in the dir tree view + * \param selected ModelIndex (filename) + */ + void fileSelected(QModelIndex index); + + void changeFile(QString file); +}; +} +#endif \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_dirtree_form.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_dirtree_form.ui new file mode 100644 index 000000000..44b39dc54 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_dirtree_form.ui @@ -0,0 +1,61 @@ + + + CBnpDirTreeDialog + + + + 0 + 0 + 400 + 300 + + + + + 0 + 0 + + + + + 200 + 141 + + + + QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable + + + BNP Datapath + + + + + 50 + 0 + + + + + + + + 0 + 0 + + + + true + + + + + + + + + + + + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_file.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_file.cpp new file mode 100644 index 000000000..e00f777ba --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_file.cpp @@ -0,0 +1,324 @@ +// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework +// Copyright (C) 2011 Roland Winklmeier +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Project includes +#include "bnp_file.h" + +// Nel includes +#include +#include +#include +#include +#include + +// Qt includes + +using namespace NLMISC; +using namespace std; + + +namespace BNPManager +{ + +PackedFile::PackedFile() +{ + m_size = 0; + m_pos = 0; +} + +NLMISC_SAFE_SINGLETON_IMPL(BNPFileHandle); + +BNPFileHandle::BNPFileHandle() +{ + m_offsetFromBeginning = 0; +} +// *************************************************************************** +BNPFileHandle::~BNPFileHandle() +{ + // Erase the list + m_packedFiles.clear(); +} +// *************************************************************************** +void BNPFileHandle::releaseInstance() +{ + if (_Instance) + { + NLMISC::INelContext::getInstance().releaseSingletonPointer("BNPFileHandle", _Instance); + delete _Instance; + _Instance = NULL; + } +} +// *************************************************************************** +void BNPFileHandle::createFile(string filePath) +{ + // Only set the filepath. Header will be created after files have been added + m_openedBNPFile = filePath; + m_packedFiles.clear(); + + nlinfo("Created file %s.", filePath.c_str() ); +} +// *************************************************************************** +bool BNPFileHandle::unpack(const string &dirName, const vector& fileList) +{ + CIFile bnp; + bnp.open(m_openedBNPFile); + + TPackedFilesList::iterator it_files = m_packedFiles.begin(); + + for (it_files; it_files != m_packedFiles.end(); it_files++) + { + // Check if the file should be unpacked or not + if (find(fileList.begin(), fileList.end(), it_files->m_name) != fileList.end()) + { + string filename = dirName + "/" + it_files->m_name; + + COFile out; + if ( out.open(filename) ) + { + bnp.seek(it_files->m_pos, IStream::begin); + uint8 *ptr = new uint8[it_files->m_size]; + bnp.serialBuffer(ptr,it_files->m_size); + out.serialBuffer(ptr,it_files->m_size); + delete [] ptr; + } + out.close(); + } + } + + bnp.close(); + return true; +} +// *************************************************************************** +// Read the header from a big file +bool BNPFileHandle::readHeader(const std::string &filePath) +{ + m_packedFiles.clear(); + + m_openedBNPFile = filePath; + + CIFile bnp; + bnp.open (filePath); + + bnp.seek(0, IStream::end); + uint32 nFileSize = bnp.getFileSize(); + bnp.seek(nFileSize-sizeof(uint32), IStream::begin); + + uint32 nOffsetFromBegining; + + bnp.serial(nOffsetFromBegining); + + if ( !bnp.seek (nOffsetFromBegining, IStream::begin) ) + { + nlwarning("Could not read offset from begining"); + bnp.close(); + return false; + } + + uint32 nNbFile; + bnp.serial(nNbFile); + + for (uint32 i = 0; i < nNbFile; ++i) + { + uint8 nStringSize; + char sName[256]; + + bnp.serial(nStringSize); + bnp.serialBuffer( (uint8*)sName, nStringSize); + sName[nStringSize] = 0; + + PackedFile tmpPackedFile; + tmpPackedFile.m_name = sName; + tmpPackedFile.m_path = m_openedBNPFile; + + bnp.serial(tmpPackedFile.m_size); + bnp.serial(tmpPackedFile.m_pos); + + m_packedFiles.push_back (tmpPackedFile); + } + + bnp.close(); + return true; +} +// *************************************************************************** +void BNPFileHandle::list(TPackedFilesList& FileList) +{ + PackedFile tmpFile; + TPackedFilesList::iterator it = m_packedFiles.begin(); + while (it != m_packedFiles.end() ) + { + tmpFile.m_name = it->m_name; + tmpFile.m_pos = it->m_pos; + tmpFile.m_size = it->m_size; + tmpFile.m_path = it->m_path; + FileList.push_back(tmpFile); + it++; + } +} +// *************************************************************************** +bool BNPFileHandle::writeHeader( const std::string &filePath, uint32 offset ) +{ + COFile bnp; + bnp.open(filePath, true); + if ( !bnp.isOpen() ) + return false; + + uint32 nNbFile = (uint32)m_packedFiles.size(); + bnp.serial(nNbFile); + + for (uint32 i = 0; i < nNbFile; ++i) + { + uint8 nStringSize = (uint8)m_packedFiles[i].m_name.size(); + bnp.serial( nStringSize ); + bnp.serialBuffer( (uint8*)m_packedFiles[i].m_name.c_str(), nStringSize ); + bnp.serial(m_packedFiles[i].m_size); + bnp.serial(m_packedFiles[i].m_pos); + } + + bnp.serial(offset); + + bnp.close(); + + return true; +} +// *************************************************************************** +void BNPFileHandle::fileNames(std::vector &fileNames) +{ + TPackedFilesList::iterator it = m_packedFiles.begin(); + while (it != m_packedFiles.end() ) + { + fileNames.push_back(it->m_name); + it++; + } +} +// *************************************************************************** +void BNPFileHandle::addFiles( const vector &filePathes) +{ + uint32 OffsetFromBegining = 0; + + // create packed files and add them to the private vector + vector::const_iterator it_vec = filePathes.begin(); + while (it_vec != filePathes.end() ) + { + PackedFile tmpFile; + tmpFile.m_name = CFile::getFilename (*it_vec); + // Leave position to 0 and set the value during the new bnp file is creating + // We need the position only for the header at the end + tmpFile.m_pos = 0; + tmpFile.m_size = CFile::getFileSize(*it_vec); + tmpFile.m_path = *it_vec; + m_packedFiles.push_back( tmpFile ); + + it_vec++; + } + + // sort packed files alphabetic + std::sort ( m_packedFiles.begin(), m_packedFiles.end(), compare ); + + // create a new temporary bnp file with extension *.tmp + TPackedFilesList::iterator it_packed = m_packedFiles.begin(); + while (it_packed != m_packedFiles.end() ) + { + append(m_openedBNPFile + ".tmp", *it_packed); + // Set now the new offset for the new header + it_packed->m_pos = OffsetFromBegining; + OffsetFromBegining += it_packed->m_size; + + it_packed++; + } + + writeHeader(m_openedBNPFile + ".tmp", OffsetFromBegining); + + // Delete any previous existing file + if (CFile::fileExists( m_openedBNPFile )) + CFile::deleteFile( m_openedBNPFile ); + string src = m_openedBNPFile + ".tmp"; + CFile::moveFile( m_openedBNPFile.c_str(), src.c_str() ); +} +// *************************************************************************** +void BNPFileHandle::deleteFiles( const vector& fileNames) +{ + vector::const_iterator it_vec; + TPackedFilesList::iterator it_packed; + uint32 OffsetFromBegining = 0; + string tmpFile = m_openedBNPFile + ".tmp"; + + // create a new temporary bnp file with extension *.tmp + it_packed = m_packedFiles.begin(); + while (it_packed != m_packedFiles.end() ) + { + // check each packed file if it should be deleted + it_vec = find (fileNames.begin(), fileNames.end(), it_packed->m_name ); + if ( it_vec != fileNames.end() ) + { + nlinfo("Deleting file %s.", it_packed->m_name.c_str() ); + it_packed = m_packedFiles.erase(it_packed); + } + else + { + append(tmpFile, *it_packed); + // Set now the new offset for the new header + it_packed->m_pos = OffsetFromBegining; + OffsetFromBegining += it_packed->m_size; + + it_packed++; + } + } + + writeHeader(tmpFile, OffsetFromBegining); + + CFile::deleteFile( m_openedBNPFile ); + string src = m_openedBNPFile + ".tmp"; + CFile::moveFile( m_openedBNPFile.c_str(), src.c_str() ); +} +// *************************************************************************** +void BNPFileHandle::append(const string &destination, const PackedFile &source) +{ + // check if the file exists and create one if not + if ( !CFile::fileExists(destination) ) + CFile::createEmptyFile( destination ); + + COFile bnpfile; + CIFile packedfile; + bnpfile.open(destination, true); + packedfile.open(source.m_path); + if ( !bnpfile.isOpen() ) return; + + + uint8 *ptr = new uint8[source.m_size]; + + // check if the source is a bnp file. + if ( nlstricmp( CFile::getExtension(source.m_path), "bnp" ) == 0 ) + { + // Jump to the file position inside the bnp + packedfile.seek(source.m_pos, IStream::begin); + } + // Read the source + packedfile.serialBuffer(ptr, source.m_size); + + // Append the data to the destination + bnpfile.serialBuffer(ptr, source.m_size); + + delete [] ptr; + + packedfile.close(); + bnpfile.close(); +} +// *************************************************************************** +bool BNPFileHandle::compare(const PackedFile &left, const PackedFile &right) +{ + return nlstricmp (left.m_name.c_str(), right.m_name.c_str()) < 0; +} +} // namespace BNPManager \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_file.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_file.h new file mode 100644 index 000000000..7527b5dbd --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_file.h @@ -0,0 +1,145 @@ +// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework +// Copyright (C) 2011 Roland Winklmeier +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef BNP_FILE_H +#define BNP_FILE_H + +// Project includes + +// Nel includes +#include "nel/misc/types_nl.h" +#include + +// Qt includes +#include + + +namespace BNPManager +{ + +struct PackedFile +{ + PackedFile(); + std::string m_name; + uint32 m_size; + uint32 m_pos; + std::string m_path; +}; + +typedef std::vector TPackedFilesList; + +class BNPFileHandle +{ + NLMISC_SAFE_SINGLETON_DECL(BNPFileHandle) + + /** + * Private constructor + */ + BNPFileHandle(); + + /** + * Private destructor + */ + ~BNPFileHandle(); + +public: + // release memory + static void releaseInstance(); + + /*void append (const QString destFilename, const QString origFilename, uint32 sizeToRead); + void packRecurse();*/ + + /** + * Read the header from the bnp file and create a filelist + * \param filename (consisting the whole path) + */ + bool readHeader (const std::string &filePath); + + bool writeHeader (const std::string &filePath, uint32 offset); + + /** + * Append the header to a created bnp file + * \param filename (consisting the whole path) + */ + void appendHeader (const std::string &filename) {}; + + /** + * Create a vector of all packed files inside the bnp file + * \param reference to the vector, which has to be filled + */ + void list (TPackedFilesList& FileList); + + /** + * Create a vector of all file names inside the bnp file + * \param reference to the vector, which has to be filled + */ + void fileNames( std::vector& fileNames ); + + /** + * Create a new bnp file + * \param string file path + */ + void createFile( std::string filePath ); + + /** + * Add files to the current aktive bnp file + * \param vector of file pathes to add + */ + void addFiles( const std::vector& filePathes ); + + /** + * Delete files from the current aktive bnp file + * \param vector of files names + */ + void deleteFiles (const std::vector& fileNames); + + /** + * Unpack the selected packed files into user defined dir + * \param directory path, where the files should be unpacked + * \param list of files, which has to be unpacked + */ + bool unpack (const std::string &dirName, const std::vector& fileList); + + /** + * Compares two filenames + * \param left: left packed file + * \param right: right packed file + * \return: TODO + */ + static bool compare(const PackedFile &left, const PackedFile &right); + +private: + + /** + * Append one file to an existing bnp file + * \param destination: the active bnp file to append the file + * \param source: the source file to pack + */ + void append( const std::string& destination, const PackedFile& source ); + + TPackedFilesList m_packedFiles; + + // currently opened and displayed bnp file + std::string m_openedBNPFile; + + // offset where the header of the bnp file begins + uint32 m_offsetFromBeginning; + +}; + +} + +#endif \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filelist_dialog.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filelist_dialog.cpp new file mode 100644 index 000000000..261175902 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filelist_dialog.cpp @@ -0,0 +1,132 @@ +// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework +// Copyright (C) 2011 Roland Winklmeier +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Project includes +#include "bnp_filelist_dialog.h" +#include "bnp_file.h" + +// Qt includes +#include + +// NeL includes +#include + +using namespace std; + +namespace BNPManager +{ + +BnpFileListDialog::BnpFileListDialog(QString bnpPath, QWidget *parent) + : QDockWidget(parent), + m_DataPath(bnpPath) +{ + m_ui.setupUi(this); +} +// *************************************************************************** +BnpFileListDialog::~BnpFileListDialog() +{ + +} +// *************************************************************************** +void BnpFileListDialog::setupTable(int nbrows) +{ + // delete all old entries + m_ui.tableWidget->clear(); + + // set 2 colums: filename and size + m_ui.tableWidget->setColumnCount(2); + + // set number of rows according to the number of files in the bnp file + m_ui.tableWidget->setRowCount(nbrows); + + // only entire rows can be selected + m_ui.tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); + + // set the horizontal headers + QStringList labels; + labels << tr("Filename") << tr("Size"); + m_ui.tableWidget->setHorizontalHeaderLabels(labels); + + m_ui.tableWidget->horizontalHeader()->setResizeMode(0, QHeaderView::Interactive); + m_ui.tableWidget->horizontalHeader()->setResizeMode(1, QHeaderView::Stretch ); + m_ui.tableWidget->verticalHeader()->hide(); + + // set vertical size a little bit smaller + m_ui.tableWidget->verticalHeader()->setDefaultSectionSize(15); + m_ui.tableWidget->setShowGrid(false); + m_ui.tableWidget->setObjectName("tablewidget"); +} +// *************************************************************************** +bool BnpFileListDialog::loadTable(const QString filePath) +{ + // reference to the BNPFileHandle singletone instance + BNPFileHandle& myBNPFileHandle = BNPFileHandle::getInstance(); + // string vector of all packed files inside a bnp + TPackedFilesList filelist; + int row = 0; + + // read the header from the bnp file + if (!myBNPFileHandle.readHeader( filePath.toStdString()) ) + { + return false; + } + myBNPFileHandle.list( filelist ); + + // create table with number of rows + setupTable(filelist.size()); + + // fill the table items + TPackedFilesList::iterator it = filelist.begin(); + while (it != filelist.end() ) + { + QTableWidgetItem *nameItem = new QTableWidgetItem (it->m_name.c_str() ); + QTableWidgetItem *sizeItem = new QTableWidgetItem (tr("%1 KB").arg(it->m_size)); + m_ui.tableWidget->setItem(row, 0, nameItem); + m_ui.tableWidget->setItem(row, 1, sizeItem); + it++; + row++; + } + + // Set the file path as the widgets title + setWindowTitle(filePath); + + return true; +} +// *************************************************************************** +void BnpFileListDialog::clearTable() +{ + // create emtpy table + setupTable(0); + + setWindowTitle("BNP File List"); +} +// *************************************************************************** +void BnpFileListDialog::getSelections(TSelectionList& SelectionList) +{ + QModelIndex index; + QAbstractItemModel *model = m_ui.tableWidget->model(); + QItemSelectionModel *selection = m_ui.tableWidget->selectionModel(); + QModelIndexList indexes = selection->selectedRows(); + + Q_FOREACH(index, indexes) + { + QVariant data = model->data(index); + QString filename = data.toString(); + SelectionList.push_back( filename.toStdString() ); + } +} + +} // namespace BNPManager \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filelist_dialog.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filelist_dialog.h new file mode 100644 index 000000000..dbf007fc2 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filelist_dialog.h @@ -0,0 +1,85 @@ +// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework +// Copyright (C) 2011 Roland Winklmeier +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef BNP_FILELIST_DIALOG_H +#define BNP_FILELIST_DIALOG_H + +// Qt includes +#include + +// STL includes +#include +#include + +// NeL includes + +// Project includes +#include "ui_bnp_filelist_dialog.h" + +namespace BNPManager +{ + +typedef std::vector TSelectionList; + +class BnpFileListDialog : public QDockWidget +{ + Q_OBJECT + +public: + + // Constructor + BnpFileListDialog(QString bnpPath, QWidget *parent = 0); + + // Destructor + ~BnpFileListDialog(); + + /** + * Load the bnp file and setup the table view + * \param Filename + * \return true if everything went well + */ + bool loadTable(const QString filePath); + + /** + * Set the dimension of the table + * \param number of rows + */ + void setupTable(int nbrows); + + /** + * When BNP files is closed, clear the filelist table + */ + void clearTable(); + + /** + * Fill the files selected in the table view to + * unpack them. + * \param reference to a vector of filenames. + * \return true if everything went well + */ + void getSelections(TSelectionList& SelectionList); + +private: + Ui::BnpFileListDialog m_ui; + + // common data path as root folder for the dirtree view + QString m_DataPath; + +}; + +} + +#endif diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filelist_dialog.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filelist_dialog.ui new file mode 100644 index 000000000..9f62ff7c0 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filelist_dialog.ui @@ -0,0 +1,70 @@ + + + BnpFileListDialog + + + + 0 + 0 + 400 + 300 + + + + + 0 + 0 + + + + + 200 + 141 + + + + true + + + QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable + + + BNP File List + + + + + 50 + 0 + + + + + + + true + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::SelectRows + + + false + + + 15 + + + + + + + + + + + + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filesystem_model.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filesystem_model.cpp new file mode 100644 index 000000000..75ef031ff --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filesystem_model.cpp @@ -0,0 +1,51 @@ +// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework +// Copyright (C) 2011 Roland Winklmeier +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see + +#include "bnp_filesystem_model.h" + +#include +#include + +namespace BNPManager +{ + +BNPFileSystemModel::BNPFileSystemModel(QObject *parent) + : QFileSystemModel(parent) +{ +} +// *************************************************************************** +BNPFileSystemModel::~BNPFileSystemModel() +{ + +} +// *************************************************************************** +int BNPFileSystemModel::columnCount(const QModelIndex &) const +{ + return 1; +} +// *************************************************************************** +QVariant BNPFileSystemModel::data(const QModelIndex& index, int role) const +{ + + if (role == Qt::DecorationRole) + { + if (isDir(index)) + return QApplication::style()->standardIcon(QStyle::SP_DirIcon); + } + return QFileSystemModel::data(index, role); +} +// *************************************************************************** +} // namespace BNPManager diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filesystem_model.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filesystem_model.h new file mode 100644 index 000000000..2ca086b39 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_filesystem_model.h @@ -0,0 +1,49 @@ +// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework +// Copyright (C) 2011 Roland Winklmeier +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see + +#ifndef BNP_FILESYSTEM_MODEL_H +#define BNP_FILESYSTEM_MODEL_H + +#include + +namespace BNPManager +{ + +class BNPFileSystemModel : public QFileSystemModel +{ + Q_OBJECT + +public: + + /** + * Constructor + */ + BNPFileSystemModel(QObject *parent = 0); + + /** + * Destructor + */ + ~BNPFileSystemModel(); + + int columnCount(const QModelIndex &) const; + + QVariant data(const QModelIndex& index, int role) const ; + +}; + +} + +#endif \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager.qrc b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager.qrc new file mode 100644 index 000000000..bf32595d6 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager.qrc @@ -0,0 +1,9 @@ + + + images/ic_nel_bnp_make.png + images/ic_nel_delete_item.png + images/ic_nel_add_item.png + images/ic_nel_export.png + images/ic_nel_reset_all.png + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_constants.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_constants.h new file mode 100644 index 000000000..609305b7e --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_constants.h @@ -0,0 +1,38 @@ +// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework +// Copyright (C) 2011 Roland Winklmeier +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef BNP_MANAGER_CONSTANTS_H +#define BNP_MANAGER_CONSTANTS_H + +namespace BNPManager +{ +namespace Constants +{ +//settings +const char * const BNP_MANAGER_SECTION = "BNPManager"; + +//resources +const char *const ICON_NEW = ":/images/ic_nel_new.png"; +const char *const ICON_ADD = ":/images/ic_nel_add_item.png"; +const char *const ICON_DELETE = ":/images/ic_nel_delete_item.png"; +const char *const ICON_UNPACK = ":/images/ic_nel_export.png"; +const char *const ICON_CLOSE = ":/images/ic_nel_reset_all.png"; + + +} // namespace Constants +} // namespace Plugin + +#endif diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_plugin.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_plugin.cpp new file mode 100644 index 000000000..70015773b --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_plugin.cpp @@ -0,0 +1,89 @@ +// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework +// Copyright (C) 2011 Roland Winklmeier +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Project includes +#include "bnp_manager_plugin.h" +#include "bnp_manager_window.h" + +#include "../core/icore.h" +#include "../core/core_constants.h" +#include "../core/menu_manager.h" + +// NeL includes +#include "nel/misc/debug.h" + +// Qt includes +#include +#include + +namespace BNPManager +{ + + BNPManagerPlugin::BNPManagerPlugin() + { + } + + BNPManagerPlugin::~BNPManagerPlugin() + { + Q_FOREACH(QObject *obj, m_autoReleaseObjects) + { + m_plugMan->removeObject(obj); + } + qDeleteAll(m_autoReleaseObjects); + m_autoReleaseObjects.clear(); + } + +bool BNPManagerPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString) +{ + Q_UNUSED(errorString); + m_plugMan = pluginManager; + + addAutoReleasedObject(new BNPManagerContext(this)); + return true; +} + +void BNPManagerPlugin::extensionsInitialized() +{ +} + +void BNPManagerPlugin::shutdown() +{ + +} + +void BNPManagerPlugin::setNelContext(NLMISC::INelContext *nelContext) +{ +#ifdef NL_OS_WINDOWS + // Ensure that a context doesn't exist yet. + // This only applies to platforms without PIC, e.g. Windows. + nlassert(!NLMISC::INelContext::isContextInitialised()); +#endif // NL_OS_WINDOWS + m_libContext = new NLMISC::CLibraryContext(*nelContext); +} + +void BNPManagerPlugin::addAutoReleasedObject(QObject *obj) +{ + m_plugMan->addObject(obj); + m_autoReleaseObjects.prepend(obj); +} + +/*void BNPManagerContext::open() +{ + m_BnpManagerWindow->open(); +}*/ +} + +Q_EXPORT_PLUGIN(BNPManager::BNPManagerPlugin) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_plugin.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_plugin.h new file mode 100644 index 000000000..55e2e8444 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_plugin.h @@ -0,0 +1,130 @@ +// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework +// Copyright (C) 2011 Roland Winklmeier +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef BNP_MANAGER_PLUGIN_H +#define BNP_MANAGER_PLUGIN_H + +// Project includes +#include "../../extension_system/iplugin.h" +#include "../core/icontext.h" +#include "bnp_manager_window.h" + +// NeL includes +#include "nel/misc/app_context.h" +#include + +// Qt includes +#include +#include + +namespace NLMISC +{ +class CLibraryContext; +} + +namespace ExtensionSystem +{ +class IPluginSpec; +} + +namespace BNPManager +{ +class m_BnpManagerWindow; + +class BNPManagerPlugin : public QObject, public ExtensionSystem::IPlugin +{ + Q_OBJECT + Q_INTERFACES(ExtensionSystem::IPlugin) + +public: + BNPManagerPlugin(); + virtual ~BNPManagerPlugin(); + + virtual bool initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString); + virtual void extensionsInitialized(); + virtual void shutdown(); + virtual void setNelContext(NLMISC::INelContext *nelContext); + + void addAutoReleasedObject(QObject *obj); + +protected: + + NLMISC::CLibraryContext *m_libContext; + +private: + + ExtensionSystem::IPluginManager *m_plugMan; + QList m_autoReleaseObjects; +}; + +/** + * Implementation of the IContext interface + * + * \date 2011 + */ + +class BNPManagerContext : public Core::IContext +{ + Q_OBJECT + +public: + // Constructor + BNPManagerContext(QObject *parent = 0) : IContext(parent) + { + // run new manager window app + m_BnpManagerWindow = new BNPManagerWindow(); + } + + // Destructor + virtual ~BNPManagerContext() {} + + virtual QString id() const + { + return QLatin1String("BNPManagerContext"); + } + virtual QString trName() const + { + return tr("BNP Manager"); + } + virtual QIcon icon() const + { + return QIcon(":/images/ic_nel_bnp_make.png"); + } + + virtual void open() + { + m_BnpManagerWindow->open(); + } + + virtual QUndoStack *undoStack() + { + return m_BnpManagerWindow->m_undoStack; + } + + virtual QWidget *widget() + { + return m_BnpManagerWindow; + } + + BNPManagerWindow *m_BnpManagerWindow; + +}; + +} // namespace Plugin + + + +#endif // BNP_MANAGER_PLUGIN_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_window.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_window.cpp new file mode 100644 index 000000000..3990e70ce --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_window.cpp @@ -0,0 +1,444 @@ +// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework +// Copyright (C) 2011 Roland Winklmeier +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Project includes +#include "bnp_manager_window.h" +#include "bnp_manager_constants.h" +#include "bnp_dirtree_dialog.h" +#include "bnp_filelist_dialog.h" +#include "bnp_file.h" + +#include "../core/icore.h" +#include "../core/menu_manager.h" +#include "../core/core_constants.h" +#include "../../extension_system/iplugin_spec.h" + +// NeL includes +#include +#include + +// STL includes +#include +#include + +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace NLMISC; + + +namespace BNPManager +{ + +BNPManagerWindow::BNPManagerWindow(QWidget *parent) + : QMainWindow(parent) +{ + // add new mainwindow for sheet dockwidgets + QTableWidget* hideWidget = new QTableWidget(0,0,this); + setCentralWidget(hideWidget); + hideWidget->hide(); + + setAcceptDrops(true); + + // Read the settings + readSettings(); + + // create main dialogs and display them + createDialogs(); + + // create actions like open, close, add etc. + createActions(); + + // create a toolbar with icons + createToolBars(); + + // this SLOT is triggered if the user activates a bnp files in the + // dirtree view + connect(m_BnpDirTreeDialog, SIGNAL(selectedFile(const QString)), + this, SLOT(loadFile(const QString))); + + // not used + m_undoStack = new QUndoStack(this); +} +// *************************************************************************** +BNPManagerWindow::~BNPManagerWindow() +{ + writeSettings(); +} +// *************************************************************************** +void BNPManagerWindow::createDialogs() +{ + // create dialog to list the contents of the specified + // bnp data file directory + m_BnpDirTreeDialog = new CBnpDirTreeDialog(tr(m_DataPath.toStdString().c_str()),this); + addDockWidget(Qt::LeftDockWidgetArea, m_BnpDirTreeDialog); + m_BnpDirTreeDialog->setVisible(true); + restoreDockWidget(m_BnpDirTreeDialog); + + // create dialog to list the packed file contents of bnp files on + // the right hand side + m_BnpFileListDialog = new BnpFileListDialog(m_DataPath,this); + addDockWidget(Qt::RightDockWidgetArea, m_BnpFileListDialog); + m_BnpFileListDialog->setVisible(true); + restoreDockWidget(m_BnpFileListDialog); +} +// *************************************************************************** +void BNPManagerWindow::createActions() +{ + // new action + m_newAction = new QAction(tr("&New..."), this); + m_newAction->setIcon(QIcon(Core::Constants::ICON_NEW)); + m_newAction->setStatusTip(tr("New file")); + connect(m_newAction, SIGNAL(triggered()), this, SLOT( newFile() )); + + // open action + m_openAction = new QAction(tr("&Open..."), this); + m_openAction->setIcon(QIcon(Core::Constants::ICON_OPEN)); + m_openAction->setStatusTip(tr("Open file")); + connect(m_openAction, SIGNAL(triggered()), this, SLOT( open() )); + + // close action + m_closeAction = new QAction(tr("&Close..."), this); + m_closeAction->setIcon(QIcon(Constants::ICON_CLOSE)); + m_closeAction->setStatusTip(tr("Close the BNP File")); + connect(m_closeAction, SIGNAL(triggered()), this, SLOT( close() )); + + // add files into the bnp file + m_addFilesAction = new QAction(tr("&Add..."), this); + m_addFilesAction->setIcon(QIcon(Constants::ICON_ADD)); + m_addFilesAction->setStatusTip(tr("Add Files to BNP")); + connect(m_addFilesAction, SIGNAL(triggered()), this, SLOT( addFiles() )); + + // delete files from the bnp file + m_deleteFilesAction = new QAction(tr("&Delete..."), this); + m_deleteFilesAction->setIcon(QIcon(Constants::ICON_DELETE)); + m_deleteFilesAction->setStatusTip(tr("Delete Files")); + connect(m_deleteFilesAction, SIGNAL(triggered()), this, SLOT( deleteFiles() )); + + // unpack selected files into user defined dir + m_unpackFilesAction = new QAction(tr("&Unpack..."), this); + m_unpackFilesAction->setIcon(QIcon(Constants::ICON_UNPACK)); + m_unpackFilesAction->setStatusTip(tr("Unpack Files")); + connect(m_unpackFilesAction, SIGNAL(triggered()), this, SLOT( unpackFiles() )); +} +// *************************************************************************** +void BNPManagerWindow::createToolBars() +{ + m_fileToolBar = addToolBar(tr("&File")); + m_fileToolBar->addAction(m_newAction); + m_fileToolBar->addAction(m_openAction); + m_fileToolBar->addAction(m_closeAction); + + m_toolsBar = addToolBar(tr("&Tools")); + m_toolsBar->addAction(m_addFilesAction); + m_toolsBar->addAction(m_deleteFilesAction); + m_toolsBar->addAction(m_unpackFilesAction); +} +// *************************************************************************** +bool BNPManagerWindow::loadFile(const QString fileName) +{ + // Store the filename for later use + m_openedBNPFile = fileName; + m_BnpFileListDialog->loadTable(fileName); + return true; +} +// *************************************************************************** +void BNPManagerWindow::newFile() +{ + // reference to the BNPFileHandle singletone instance + BNPFileHandle& myBNPFileHandle = BNPFileHandle::getInstance(); + + m_openedBNPFile = ""; + m_BnpFileListDialog->clearTable(); + + QString filePath = QFileDialog::getSaveFileName(this, tr("Create File"),QDir::currentPath(), + tr("BNP File (*.bnp)")); + + if (filePath.isEmpty() ) + return; + + if ( !filePath.endsWith(".bnp", Qt::CaseInsensitive) ) + filePath.append(".bnp"); + + m_openedBNPFile = filePath; + m_BnpFileListDialog->setWindowTitle (filePath); + + myBNPFileHandle.createFile ( filePath.toStdString() ); + +} +// *************************************************************************** +void BNPManagerWindow::open() +{ + QString fileName; + // file dialog to select with file should be opened + fileName = QFileDialog::getOpenFileName(this, + tr("Open BNP file"), tr(m_DataPath.toStdString().c_str()), tr("BNP Files (*.bnp)")); + + // Check if filename is empty + if (fileName.isNull()) + return; + + loadFile(fileName); +} +// *************************************************************************** +void BNPManagerWindow::close() +{ + m_openedBNPFile = ""; + m_BnpFileListDialog->clearTable(); +} +// *************************************************************************** +void BNPManagerWindow::addFiles() +{ + // reference to the BNPFileHandle singletone instance + BNPFileHandle& myBNPFileHandle = BNPFileHandle::getInstance(); + + // vector of all current packed filenames + vector currentFiles; + + // vector of files to add + vector addFiles; + + // open a file dialog and to add files + QStringList FileList; + + FileList = QFileDialog::getOpenFileNames(this,tr("Add Files..."), + QDir::currentPath(), tr("All Files (*.*)") ); + + // get all current filenames from the opened bnp file + myBNPFileHandle.fileNames(currentFiles); + + QStringList::iterator it_list = FileList.begin(); + while (it_list != FileList.end() ) + { + string fileName = CFile::getFilename (it_list->toStdString() ); + if ( std::find(currentFiles.begin(), currentFiles.end(), fileName ) != currentFiles.end() ) + { + // Ask the user if he wants to override the existing file + // atm only warn the user and do not override + QMessageBox::warning(this, tr("BNP Manager"), + tr("File is already in the list!"), + QMessageBox::Ok, + QMessageBox::Ok); + } + else + { + addFiles.push_back( it_list->toStdString() ); + // log it + nlinfo("Add file %s", fileName.c_str() ); + } + it_list++; + } + + if ( !addFiles.empty() ) + { + myBNPFileHandle.addFiles( addFiles ); + } + loadFile(m_openedBNPFile); +} +// *************************************************************************** +void BNPManagerWindow::addFiles( QStringList FileList ) +{ + // reference to the BNPFileHandle singletone instance + BNPFileHandle& myBNPFileHandle = BNPFileHandle::getInstance(); + + // vector of all current packed filenames + vector currentFiles; + + // vector of files to add + vector addFiles; + + // get all current filenames from the opened bnp file + myBNPFileHandle.fileNames(currentFiles); + + QStringList::iterator it_list = FileList.begin(); + while (it_list != FileList.end() ) + { + string fileName = CFile::getFilename (it_list->toStdString() ); + if ( std::find(currentFiles.begin(), currentFiles.end(), fileName ) != currentFiles.end() ) + { + // Ask the user if he wants to override the existing file + // atm only warn the user and do not override + QMessageBox::warning(this, tr("BNP Manager"), + tr("File is already in the list!"), + QMessageBox::Ok, + QMessageBox::Ok); + } + else + { + addFiles.push_back( it_list->toStdString() ); + // log it + nlinfo("Add file %s", fileName.c_str() ); + } + it_list++; + } + + if ( !addFiles.empty() ) + { + myBNPFileHandle.addFiles( addFiles ); + } + loadFile(m_openedBNPFile); +} +// *************************************************************************** +void BNPManagerWindow::deleteFiles() +{ + QFileDialog filedialog(this); + BNPFileHandle& myBNPFileHandle = BNPFileHandle::getInstance(); + vector selectedRows; + + m_BnpFileListDialog->getSelections(selectedRows); + + // Check if files were selected. If not, inform the user. + if (selectedRows.empty()) + { + QMessageBox::information(this, tr("BNP Manager"), + tr("No files selected!"), + QMessageBox::Ok, + QMessageBox::Ok); + return; + } + + myBNPFileHandle.deleteFiles(selectedRows); + loadFile(m_openedBNPFile); +} +// *************************************************************************** +void BNPManagerWindow::unpackFiles() +{ + QFileDialog filedialog(this); + BNPFileHandle& myBNPFileHandle = BNPFileHandle::getInstance(); + vector selectedrows; + + m_BnpFileListDialog->getSelections(selectedrows); + + // Check if files were selected. If not, inform the user. + // TODO: Ask the user if nothing was selected, if he wants to unpack all + // files. This is more like Winzip. + if (selectedrows.empty()) + { + QMessageBox::information(this, tr("BNP Manager"), + tr("No files selected!"), + QMessageBox::Ok, + QMessageBox::Ok); + return; + } + + QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"), + tr(m_DataPath.toStdString().c_str()), + QFileDialog::ShowDirsOnly + | QFileDialog::DontResolveSymlinks); + + // If anything went wrong or the user pressed "cancel" + if ( dir.isEmpty() ) + return; + + if (myBNPFileHandle.unpack(dir.toStdString(),selectedrows)) + { + QMessageBox::information(this, tr("BNP Manager"), + tr("All files has been exported successfully."), + QMessageBox::Ok, + QMessageBox::Ok); + } +} +// *************************************************************************** +void BNPManagerWindow::readSettings() +{ + QSettings *settings = Core::ICore::instance()->settings(); + + settings->beginGroup(Core::Constants::DATA_PATH_SECTION); + m_DataPath = settings->value(Core::Constants::ASSETS_PATH, "w:/database").toString(); + settings->endGroup(); +} +// *************************************************************************** +void BNPManagerWindow::writeSettings() +{ +} + +// *************************************************************************** +void BNPManagerWindow::dragEnterEvent(QDragEnterEvent *event) +{ + // Accept only one file + // In the future a tabbed FileListDialog would accept more + if ( event->mimeData()->hasUrls() ) + event->acceptProposedAction(); +} +// *************************************************************************** +void BNPManagerWindow::dropEvent(QDropEvent *event) +{ + // reference to the BNPFileHandle singletone instance + BNPFileHandle& myBNPFileHandle = BNPFileHandle::getInstance(); + + // Excraft the local file url from the drop object and fill the table + const QMimeData *mimeData = event->mimeData(); + QList urlList = mimeData->urls(); + QString filePath; + QStringList fileList; + + if ( urlList.count() == 1 ) + { + // If it is a bnp file, open it + // If it is not a bnp file add it + + filePath = urlList.first().toLocalFile(); + if ( filePath.endsWith(".bnp", Qt::CaseInsensitive) ) + { + loadFile(filePath); + } + else + { + if ( m_openedBNPFile == "") + newFile(); + // Create a QStringList and pass it to addfiles + fileList.push_back( filePath ); + addFiles( fileList ); + // Reload current bnp + loadFile(m_openedBNPFile); + } + } + else if ( urlList.count() > 1 ) + { + // Dont accept any bnp file + QList::iterator it = urlList.begin(); + while ( it != urlList.end() ) + { + filePath = it->toLocalFile(); + if ( filePath.endsWith(".bnp") ) + { + nlwarning("Could not add a bnp file!", filePath.toStdString().c_str() ); + } + else + { + fileList.push_back( filePath ); + } + ++it; + } + if ( m_openedBNPFile == "") + newFile(); + addFiles( fileList ); + // Reload current bnp + loadFile(m_openedBNPFile); + } +} +} // namespace BNPManager diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_window.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_window.h new file mode 100644 index 000000000..89bd68a16 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_window.h @@ -0,0 +1,156 @@ +// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework +// Copyright (C) 2011 Roland Winklmeier +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef BNP_MANAGER_WINDOW_H +#define BNP_MANAGER_WINDOW_H + +// Project includes +//#include "ui_bnp_manager_window.h" + +// Qt includes +#include +#include +#include +#include + + +namespace BNPManager +{ + +class CBnpDirTreeDialog; +class BnpFileListDialog; +class BNPFileHandle; + +/** + * Main window class. Derived from QMainWindow and implements + * the basic layout like menue, toolbars and dialogs. + * + * \date 2011 + */ + +class BNPManagerWindow : public QMainWindow +{ + Q_OBJECT + +public: + + // Constructor + BNPManagerWindow(QWidget *parent = 0); + + //Destructor + ~BNPManagerWindow(); + + + QUndoStack *m_undoStack; + +public Q_SLOTS: + + /** + * Create a new file + * \return Filename string + */ + void newFile(); + + /** + * Open a file dialog to choose which file should be opened. + */ + void open(); + + /** + * Load a certain bnp file into the manager + * \param Filename + * \return true if everything went well + */ + bool loadFile(const QString fileName); + + /** + * close an opened bnp file and reset all views + */ + void close(); + + /** + * Add files into an opened bnp file. + * \param Filelist + */ + void addFiles(); + void addFiles( QStringList FileList ); + + /** + * Unpack the files marked in the filelist dialog into user defined + * directory. + * \param TBD + * \return true if everything went well + */ + void unpackFiles(); + + /** + * Delete marked files from the bnp file + * \param TBD + */ + void deleteFiles(); + +protected: + void dragEnterEvent (QDragEnterEvent *event); + void dropEvent(QDropEvent *event); + +private: + + /** + * Read plugin settings and set the window accordingly + */ + void readSettings(); + + /** + * Write plugin settings + */ + void writeSettings(); + + /** + * Create all plugin dialogs + */ + void createDialogs(); + + /** + * Create all plugin actions + */ + void createActions(); + + /** + * Create the plugin toolbar + */ + void createToolBars(); + + QToolBar *m_fileToolBar; + QToolBar *m_toolsBar; + + QAction *m_newAction; + QAction *m_openAction; + QAction *m_closeAction; + QAction *m_addFilesAction; + QAction *m_unpackFilesAction; + QAction *m_deleteFilesAction; + + CBnpDirTreeDialog *m_BnpDirTreeDialog; + BnpFileListDialog *m_BnpFileListDialog; + + QString m_DataPath; + QString m_openedBNPFile; + +}; /* class BNPManagerWindow */ + +} /* namespace Plugin */ + +#endif diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_window.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_window.ui new file mode 100644 index 000000000..4e695f72c --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_manager_window.ui @@ -0,0 +1,50 @@ + + + BNPManagerWindow + + + + 0 + 0 + 800 + 600 + + + + BNP Manager + + + + + + + QWidget#centralwidget { + image: url(:/images/ic_nel_georges_editor.png); + } + + + + + + + + + + + + + toolBar + + + TopToolBarArea + + + false + + + + + + + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_proxy_model.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_proxy_model.cpp new file mode 100644 index 000000000..d3657d13b --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_proxy_model.cpp @@ -0,0 +1,56 @@ +// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework +// Copyright (C) 2011 Roland Winklmeier +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see + +// NeL includes +#include + +// project includes +#include "bnp_proxy_model.h" + +namespace BNPManager +{ + +bool BNPSortProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const +{ + if ( sourceModel()->hasChildren(left) ) + { + if ( !sourceModel()->hasChildren(right) ) + { + return true; + } + else + { + QString leftString = sourceModel()->data( left ).toString(); + QString rightString = sourceModel()->data( right ).toString(); + return QString::localeAwareCompare(leftString, rightString) < 0; + } + } + else + { + if ( sourceModel()->hasChildren(right) ) + return false; + else + { + QString leftString = sourceModel()->data( left ).toString(); + QString rightString = sourceModel()->data( right ).toString(); + return QString::localeAwareCompare(leftString, rightString) < 0; + } + } +} + +} /* namespace Plugin */ + +/* end of file */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_proxy_model.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_proxy_model.h new file mode 100644 index 000000000..ed2da5966 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/bnp_proxy_model.h @@ -0,0 +1,44 @@ +// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework +// Copyright (C) 2011 Roland Winklmeier +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see + +#ifndef BNP_PROXY_MODEL_H +#define BNP_PROXY_MODEL_H + +// Qt includes +#include + +namespace BNPManager +{ + + class BNPSortProxyModel : public QSortFilterProxyModel + { + + public: + BNPSortProxyModel(QObject *parent = 0): QSortFilterProxyModel(parent) + { + } + ~BNPSortProxyModel() + { + } + + protected: + virtual bool lessThan ( const QModelIndex & left, const QModelIndex & right ) const; + + };/* class BNPSortProxyModel */ + +} // BNPManager + +#endif // BNP_PROXY_MODEL_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/images/ic_nel_add_item.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/images/ic_nel_add_item.png new file mode 100644 index 0000000000000000000000000000000000000000..bde338f7851d2675b29272c7dcf9471196a8f6cc GIT binary patch literal 3270 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 Eg5p97)c^nh literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/images/ic_nel_bnp_make.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/images/ic_nel_bnp_make.png new file mode 100644 index 0000000000000000000000000000000000000000..19b749b1da76ec5ae8a7f063c7127f5672915ef6 GIT binary patch literal 25705 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 literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/images/ic_nel_delete_item.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/images/ic_nel_delete_item.png new file mode 100644 index 0000000000000000000000000000000000000000..a5a1787d593591f855be9a7eb8da271cc8d8f214 GIT binary patch literal 1496 zcmaKs{XY{30LC|C-c2!W(h#B2QhA@kOt{brn;~tK$;-mn#DM?-zdb>=i zu*@RTd8@_pvUxpuxyoG1>Bsxw?uX}jKHujL_-0@|T~w8{l>h*Ms+%k3&``sHb<81=-~(e+|N^9C&_KHVw5X^3IM3J{S1(sAHJ}8!egC%W4+FY#L`JIX8~B! zIZ7C+< z6bcMhk7Jz$z zt<~^Npzeyeat^;b(tkMW#bRkwb5S`|-P(cZ{!1geIKC7Tzpi^Q9XhN7r*| zh)Tmw?h}4)r(e%EPx*~jbiDn>W9k_F^gyx#1J1b!&uZuD!J$Duh_I|$-B|3)pjcABT`DZr@@$gnJ?g*7niqC zPg~-q=_uM61|+bWZC}wlE4;C-L;LVrU6J(R@D0Z4=p`kt`4==LnW(d8wXiBZND)3NugXyk}j`B>QSp`rx>7I47#1U z_C?Zqn_!w_iq*Q=7#33$KOO+R;CW!bcdn#k;~tqqg>*o8s|#;{%M1@^2B=`1X*QOW z`~~EL<8YMd;Wk~hP%ln9+T{3weTCGPC>#3IdbbgtfSL(^;<-$(&+()%CWY(ZY}rUs zYZ^=Sws7E+dDpj6e_>>!qz;jFg;SMzWx6GvaM=_CJv#h+^qF(IggsR{8BYMQlBT|c zLR(J;=NJUkn>YRLcdDtY?zXt@zIEUuTe=1hEndEU6|7%)i#=`5cs5S}P9Mh=PcJfo z{ZbSwueq|yZyG~GMGk&1;XI&33fgfyu~6eIQgk!Fkv4<^W8F=|9U5oXINb+#fCen_ z{sB?u3Xfi@SxqMAC%ZI%1BJIf0uMiCx!yXz62rndMv z$=6toP8$LinV$s7C|ZjMS5+@W1rn4NxN=o7bmp|tGx-1vXy7V6(LK7Owl1b<1|o_O z>bY9rcsZ;+(mT(U8Vqy|@K*SC7Xeg!@WG?ntw{ZC`G3Vh1-90Bf1vJ=9f)jI$P4Q6YBQ@Z8;^^H#>9pe+1$q6DXU$-5VbBeJ(3kUiuh943T}3C$!G=4Zw&rX zIZx;etQ%$b10W;H`0fD|-g&n~Eq? zJZ zC}pc4u@0qD`7mQX=zMD+8o3Hi#&31p7{mxJ*6-KkigeYIgt}@Xn1a05YyE6U8VHU~ z8PL=CTn*0W$(#-|89Sz`9P!(hY?pOfm^ZQVXfjUeBhD+B#yUg0vkok?_%`$Xq0`=> g{}tB1bjDO$2a)_&SEAML{IoE@&Dj&vfF`E?18{b*hyVZp literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/images/ic_nel_export.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/images/ic_nel_export.png new file mode 100644 index 0000000000000000000000000000000000000000..9fc71c09dab0615021bb5c813d47e3f5b2a72623 GIT binary patch literal 27878 zcmd3N^;Z<{7ys z0WyN%hU|jrKzzv=GlD{c;CTPv-gsb7(7KdorPuT77Iu55^M(5eBJES%_Xhm7$0=xvle_<3!QemzH!4%-**^)^{@c{w$FS=kIm?vk&z>7WP_iw+60@z z4*OI;YU9A*3lE>&G7egkY8e?A@(?q!CVbZMjn{R|)#k)<+vR#kA zmX9^wtb>&~Zo0lhKCH3|hxdNYoBgOw>iSe?pgcz5Y&r3K@7{KzYE^rau21&`t<5{ybDf^^=*0i~{rq(1)yJQ_t4}NYbDc!n%gU~cL#MEF|C^6d@g(Vp zFl_y^FUC&>l>AR7+a`>vkx#6Grhv}t1d)Qxc|DEi_lOS-6&*GQrG7Ap*qN>(wJO6>9^OEE0HeEJ_kZ75pfr+cHY_Y<| z78E(ZF3zi0~O^V{N;0Kf=#3xmP+LikFtNNb|3F6GQZw) z=u6P8NN+ad)JGwUP%2^q$1iOqP7`ZKt+3O=2Ddb#PFewL>6Vg!2HteNX@l8P1)?q2 zC|d*{?g=sh9l17ySsK=kvXeI!$xAf%`!4NzFbwzqVffEpC|f`OZdB67SV&ksUZB zxK+VlWqK{#YUsu}H!Nr4v4CteZ`#f^58h&L@Eg0QYkZ?y>cU~rmy~44bm(?d_4Uq; z4zH@U)2bp!kB=V`t%oFZH}|Ig&V)_8(%xF9Gp-&ic$(ai>*RP?2cvuLU+z4{s91+=${5xx6+T46kV*muFC5l%orC>wQ>Vk}bdCDX6-37rmGQIx?q6OjPGI`L_? zuT$wEDW9=I9EKNkEDus7)*C>MDeINST8A0QpKY~mZ8j;mh>A+2X$0Mfdm&5Mk-PGh zh4Z&3+FOl%ITPlj4Jq1QEv8o9x4TZ7CPLRt?<1BY}txKBAoR z*Ar{mHKp(cY`>$p2((#_k@exb!TYiZNRWJikvrLTUQ~htU%H5KwuEz0rdh2Sosb2c zCPXM1Dy{#=rVdNn;C}qV+;xl=YUe&1Xy!&GLG$p>xwZEzNw$ZFBj2u^Jf7&2Hs73G z!{VyH?Tc1&QcefTpXN<6$GDeh*2hTX4U0CU$fCm(uhlMCO0q5emb1-erTu0at^&~k zXR5?T&J$1#W$lw3WrqLYYB6dg8ahFt!P zf(p)bOd|K3p_gQ2M0-;ZU@1|~D~p8Sdp}fTJ=Y1~Vw`=3e?K&e=yiFO^o;A)KUaK{ z#u*jLLPgf<5e-Sm$Uj&X?C+>t?nq>evJHWz^YX%%dhwK=FSiw>65fH?p>NJiciIjf zazRaB=%>UCw`}o}zoe!D>2VMaY;0sxl$GxXt5_j%%UivKXq_Z#T}D^-yC0dV{K3t( zIZZHR*f@FocH~=;W<2x2^QMJj;&)Eu1Bo4Pd3B;F|DB6+%;8V)PY6-&A3c%BQb4>R z%$-rqdbvhN$QpRp2x6Qp33zx4x;pvNC`k!u+L9IEJ}B}rx=?o2c=Gi#SA?vL7^Nse zE*plXh~6nz-TM*S1MbshAVHzVcG4IVf(aV18zls7&DtvtqjD z%RC}ZrhcQ#uT)e$noBEVBgUqGLORSpm=>k_?;ek>;LMOQ=tyHHTZDHx(7uoL7e)On z$;1N(=_LB^%T=wV5b-%lCZTwvszk`u%Ic$7VQvG41JHzdN%faV>b{7l0~iTHdZ>(I z@m83li_j;V(jOsbC*}ygktR6r0NDve6$9pc_Dh)}UM@Z51C+m)eA#6CW!%41huKr- za@*cfg1lTbN+F8LVS+p6UVOSTr8du#;4o^0-l^;p2xkG;W&XQoL>;}^iSXj5?lYxp zQ<0D#X&AO8+znZM009Ak=?gHh6uMXC1qJrX2Mk!CmsZg#A{z-Q@8Jmb&*=mrq?DqJ zDAuS?nRJh$;dFT#bYJ_fo0l~SDtSOM&_F0*)Vt2)*{f}f>+19MYbM)>nL_*XVm7n6 zX-LVC2Lzk47@kMWBoK1sL`SPDQV&W39TPd}=+n>(8LGafM`?9;*xt}*1a$PCturDC zJ^r?-Hk{hv6NjOuy#9S*Aa#4H@XYet5$J12eoZS@(lg%m>4J%w5t71skpZ`(_z5Sn z0RM02TVK4Zsr)lbBbx&)*+yQrTCcdIE0>2Ni zCJ=~pZj39d`}v_V;uB~^{>FXQQoH98>szrH{`!fMx$kU*JfmI7Vn8c9nUC0(KB4AN z=R?R?QO2d&x4*`0871aTCb5LljO>+W4F(i%z)60Vj-89c?mEXT!5qd8-ndg?)k9HW|#1Cq94RPuIc!|{Z40VwW1=0+5AOG-`9 z+oVWs1F2c;JmX2~qRFIn-S!eHweqhoaGD4X`o=Le+Z$CdhYrGSHg#OFopv_io`zq> z;&QQ9`^eAjxOkjC96NzC!ksK4jd3?~@NzV+1HS1oz9hQl&F03D^26V1>hk+OHt(@J zHFQRVFba#RD=bGQBC(p4NZ^J}=8Wuw^qw0S@Q%&#)p7uvrB<_{?3_^FY~1j8QkXx* zM5ikQ5B?UscSUGMX0{dVHD}`Yb^Ag4)5S3bY`pvWT}Gt20f@@TXVDA`-my<^>;}=q z8VQHujW}Aq2WZ?p!^F1DjoayhRC}?))!t%hHFm>!YYunewH1rIvf0|lEeF2UP$uGH zn(1FREYsUuc#7-@SZ#(BAYiznu-HA{tjV{!Om7k=r3m$4)&wLHe zB64WFem&@lXoLGxa;aMCN0=C?A?WZ>ZY}7VXvfbbZ3KlWyc(G$=DiuMusxzMxf;1W zJ*VNeqrn@(w;*j^&q!-{(Rq8R{dC0T7H_F~wAMM-#=Gn>Nc~fX{MslDH2{iv0Z2ZY zj?q8t(G~STu*S$B0cJ%fIGv+jG&1)n<^^8;;j>(o7dZ)XPiQ#{w&V(UIWbMTL{}8< zVB7b!w^Z|qp%$aH9M;J5N_1pIrz_|yFY0g2pI5+B`Um5W4*(pemv5lajw%?jEs+!ybF?lX;F5QSx&00+pKQQ_4oo+u#Yg!| z+*N@5Rw-0NJNG!&>mH{-*iEll0YZ%Ixh(j3f5~H3E9-a3%O)iE+SQ_MSKB91t*~`= zFD38ypm5Sg0_gtcNs4a_ky#qXMXe&SD>Iz!`tNDr;uVtyDak9KepjK$6c1D(F~@jwy+J+c6(L9QCg?H?I5-V7@S>i( zy=(lxipr)7L2`{E`_4U}DA=mzePD(6<7d*)}D!>TWAs0|VDxI)q4OCrGA4Y+v8Yh_$5wju{v~#$5uF^K<`qO4(gRsG3GXcg#zp29kR1tE;oo z9{|f=z%Otf7yjFN5H+Gp0MYQbhwP)Z<&FetGL^EMF?KB{R4xv+I$*~PbibDbiDX<;N6gU;NFb{zB|6U+yiT;h?Vp<-h>r?i*ysX8*Z9Y3ef=mr z1t9J1KFKxDF+TTC-of@$FkON+DQA?~bdCBRtHdL#nSMCJ;$kMSgOXX>>xqmf~G0p(oMquWl95O*l0ZXF0{Xo; zJx;Crwrr8{U#G?Ohs8Bf<^<)0E&DXq`MJ?}h2It;I+kRa4+@P;^xttRfN1ev1z&a> zUpYSNDs?5kJhxmJO&ryMilxNyI+t`3v1B@dv_p|6KNlrx_u+3`6|!iths(HMm$)K_ zU#bw{cHAoOX9U)|QKTvH!Nv=4O;39D`cvZ*x9Y^gj%q#EyKUQMG*_6hI7;;kGf{4c zwIMko4$5~jWoT%2`Qujfi%J-E#e+C?0sHLuzbq(C#3IJ8!ihTvIk}EJF2?=VsC-g5 zF15p$c9~S>75RIX?wLrW;3;qh+qCqfBA81#X4eG783eU(1?)69`Cb3J@w^}cf3mYm z=TJOA?9|CxQ*S4Ozh~KIPpg{U!w57bs7Z-HKqOC7B(yHG85q)B-t0-B{EDmOc-=c~ z1Ufh@!4*dfKf49pG6)_0WqvCJwq;DhSL8+o$8W1OO!fUGy7C9u5@znmyL*# zMGG@fNPj&uU5w)fWQ43BO8;I`0j3Y_ z#i=5m8n)RF|35ZAe2>$E1N0;l-1?H*yTSV}?r@UmPYHH3h;&IxdaxY3Q;cQX(WZsN zi=IXsREJdxM&nO-+|N&>#5M17sG?{xXqLcY7SWsIf086O-NjrPAcr!R_JgVbSzw(N z6P&-o%4*b_LmO#xhs#_+yB1{4;tF{v@Nc8~qS}c-XB61+5<9{PqzpdkgR(IMP~3i8 zFq>c(dSmp9sEa$at{~62p2%8xO8De$7KGRr`UJe8`q)!JhK7Y3GyKgd20^cvis43!sl6VH-GWs=bwR zXQ2*HKj=Q^QoU4IfEw@r95O7%K%f_!gmK{2H$-?vN?lMi)i!vslKnH^~j zT!(3#Mgy1kfzu{YY>D{Qj$)Fd-7h`*TSS+XVSXW*84+iwaTk`snN>H^IC93&&_$E} zZ?dzek>bL15w{4n8?BC;S*=DrD5|f5v!?AxMf%iSi7c_>%$ggNKA`{ zlH|?I5+gU${87KSpgBu!%jS2>ENGd^+{G$+7qm}dyK@D7itM*(dkbPel zJv$vyw|)s}pjn(J*GvXe-|1D-*Rkir`Art@-A2qa3b8y`V0adoTf zW3MGhZd<~Dq1sg=O%g3NW}!+YoAb(`>z5UFj}y52%)tw!O%jC7=2WdzZ5k*l@FZnD zH*IEMQgFNI96Wf1@p;@KJd-tj zVIU)x_xqE?+J|BISNv-WA@A?Gxpn{p?+xA>+!`0Rn3WP`qBa><+!_~OPEgjz(CWnI zd>Wy2G}ac6`hyiZWAT0gSoS6iAY{nm=#pmPv@*Zh0!Vqm7lC*uNEfiB%(RI=;;7o>GupFMd#(FoFn!)j8AKNHadg)hk6xzK}T5#jrv-jm3@ou>}97xrr0v zSBcX9DstkT{cXAr85&^GNY(7$gWGW*9B6yN-ax({7JA7Lqqga-!$0Uiyuz=RRUF~Xv`FPfR8NF_rC8I8mp(BBh4GoAG$N$wr=F;K=zX_N{LP*B>D5`V z0hVyUIN=4jmaNy`OKx6YU&X@(vgS7X_@gv3f<_Rff;q9<6dPwfD5fSUNTr$_OWMYp zey5&^FGP;=2dGU@#NKMx_^Q_(U#gPMvi{Xx5I~JQvSrJtHbQrw6@n`!Sq53@t0tw= zh%V%d=xyB~`Jn|nhk88d4xV7hkS2TG7drn9>h{Q?X#$pVW=C0!zJ0AAZr~|{2Yhe>^>WLY)=R25)Q2fEjVWUf0yD5#|?2jCbnHI4fV^cIRlMX zw6@-M72eK2d(g9^=SJNgojEcsSNN?eIJSQBbE{)6T1-RgU`5)!(nDJ*$^du(d{IpG zUFSLY@4nHnB;Mfu>+?^xb%dekK17VGx4+l-4cAJ-_nv&W+Ye;B-^VL!Jq$}+-_CU2 z*9c>N>N1J8@-A9wMuK&^{_3aDp8QstA zdA``bkNXFwjxMlG?6|zF&fH0H2oegtd_@IxD8F0vf83=52t6N`u%iaT0I3F!^!h&8 zO?sWE9-RGs{rjYe@!pgdtvEJ^6T5}bvbFka#d~CjR0m)U@Cd&Cu`lRBljMOP`?nY1 z>1xG$lA{oJuo#W|TJ75UM4zXrT{Ke|Y@`R^@0M#MLC2C$!P1u6QZd&f_MFzC14fKj zvYtlTqNyBhMwMNRwQl6~s0G)93xSW>M!7HJ8A`w|;P24Le`Tw>^`N!wu}A8*5$9;E zRrtDdhr3wwBD>s^vu~HHUazPTtFwYvA#0Z$;ph9G29$3E6PSC#fYZQ6_38T9&@GZB zn>){Y1d1rRN|>R!Fdr(;A1MqmBGKEa_BhYGuJ(%((V?CN$nn?}O}zK%en9{wB0LUI zZ|y~?1-0^7VV%{<%1{|~^k*4xJ&8p`TDb1%i(d)_1X-_I1^Mf)Y_Z;;IM8xk!U} ziMp+6P*t2$<_RNi=&vS~uTN}FPj<^l7L|9^hX1?U~5a;M`qPR+rs1^kf?+I(6Utde|?_6rK8#Csg9gl78eyn zKWOn6WO~PK8sYaXFkCqCKC~R@NkKO&?}l7iHyjSkO&C%GDE_5}>b~1E+iFDU#&M0! zyHyy29Qb7yR+Vw$B8M*VPoAVgM4QZd>Gk;ZqZA2{PP&9<3NRF@l!O4)1JsdcqynC< z)H~8IGpzY`%HdZT0n|le>E9Wg2t?SX+tsFPxq(dXSFqFSdIq9~iR%qA;7=+b)$L|x zBK3D>-JXR^b_N=~?6ttgAoV_-*VYgunn;0X&u3_CN~lJOSoo8+xt*1};>O}9W-nqk}6JoGtTNr~W~yjBSno%5MEz z@x^|jD19+ABMQdc(TRDPGU1Is9wDSYC#z;c{+rfAX(~$)R=6thu8vA;Tra>h?ycEg z3lG3*I){#Ith?nDa`xt8B!UEVBl9vpdNr9W)yFRWDK@wg`p=g!{=tPmKKoA}5AV-% zY4W=&&jUcy_(jGAc4CyRDA~;|<@XSg^+r+{^tl8mQyENy5(0eDVZFOb39I@8Q+OBU z?5~Ut>@@ZWt4+RBSWaxnuC}$F6u_kP&_D%4dGy!{#f)A=|a z5&p0iCCUXX?mYbT^0LsI?5T@*E+sP}k{9)w-oc3+B!6bd4ZVIbX5=PPZI_IR7XJEc zh56XDBG8p=M;L(w6a9-m0}2`gDdeNcf-XCQ~Yt++xHRiz~l{!-XxR1q73{Asg58^2*DPdE8C@rCI+Hl zbL=}MGSJBjR8np1f7LQs3U%XXeNq{E;nc9cw>|OjF-R3}DS&!Gk3(K1^r?M3TyDS`cjj>6dcI*;iq7go3d zHP8i<4obL5{-FNUW}ZJC4}~iyz{Ls8c8@TAd(!k=rkXs0drzl*Z7}8}-q6bkU%#xc z1?2^Pc_z57P7Qn^@Bm(aW6_GzE z0d~q7OP|U;NqA5!9AR|>mnPedGQ>;2OcxB?JqT!)vOL(Hcx<1a6K_E;k=30PeG9qb zQZEkNyjp)w_FaX9Jvwyh|0~Mo#@w(#QBC~(l?8qnD9Jlj-Y?obbibkOIz|UZFo2-xOEgXC zefKsJIW1z64tqv7@~N1_SKGl(@d7wnW(J5+WzuQ4VxSQb>*=KB;f_7YVkSi;yGm5J z!W7^q4W1EBx&&Uq_&XLGf$>zNpzNmBfWXsV&w~<`(^h8_+fhZ^k8Xp?pkt^Z*eO@1v|C2O+8R?vtW=uXe9XZ0S-=l^=27=HiaYocj= z=LVNDT$nsgFgiLM@7=fK_g4q9@ZZV^Z8+*ObAQ)ortxepZvOZAMO$?LOH(QN=GA}$umHfAHV~^ihn#h(@B2v>C%IOva z|Cl4HGsLK1_?&_%kK{F(sVYrT=|Abw+1#r!>=X>_4Uk-9e8F8Y;LK|c^@uP8(u#xO zM=dR@e2PNqT<5>!M2J!AwQpOr@t`2@TjfvZ$Bp2;#w*!tu9o#|l|Nxtkpvx8BhE9G zu8+cs!w!A)MvYy_3!y1(rK)&$8M<9jtlN~AnT=(fd#MaA0 zOr+!f4l8GJShVrceiRexdW;)2RXCj*2|21(ggL6&P+|aB_!8pdTwpFAlbG>Goy?;D z*63YIZ7j)3M;xKbyNh3O?x(|3?d6?b)F^Vl%lU@q_Y+0HwoNwIvu;o3_PGIiyjos> z7t_&XV%zX)@sHqwzf@{#{BY~+g8F9Fp15-qI^M`#>Dh~UWx)VXKHD^hJVXjvKiG)@ z+RY719BMy}(g53@e|}i{b3{j9jV+7p;B39Z%uVs39~4UkXeaLaO6^FmaHFo#p}Mu-89$*on((0w-xsHelW|PsFN;pNs;WCjdf3(D zggq9`EBWG?Gs}kf`gri3`4)IhH&|jaUhY1755cH>cEpgUjM@Q`ip&HdSG;+zQyBlP zZ;W^nQZ31=W7*QmloIM>4Q`Ahol2Ek%j+ZLO`e?RxOQUvOk{jyFgB3V#JVNwk{ba6 zu8T*vcE=nFA?MQ6L8U&;hNJsu+{ ztGf~dFtOli z>U4`%m*Vm%1dkPTMofxxhDJmb zx(q3bSv+0&5hSR_0Bg`@fOSY2BXpI&;0j^uP#WyHK-!~_;tqJ(9@@0xGXeP3cVBn(N zm3gutz7DDT$TLb(D~|+`%tpie{5eugu6{`EY+#U z5ku}0?8UJUh9`b>^A-fCfrd!SBqjDiKnqvz;r}L-^;cy)-;Y{a>bIw?7;R*9FIYfaF(caU8Q z0YoX7`KIEZuSUe|u)*&ch%TRPfc%afG(gjz#<<8BR{fWY(5jRX9I@xzkh|T~QqV}+ zf97Lnn|2HNLUwHCi_CXO8Ym%NqIaP_^tcy?x=-P-#6FLHGP+ejaJE(S-^M|ff;wI2 zUsGcd_|t=Edkzqs)P34x{ZBRSEqf_o{qA`ThPCQA15T+1=$v%As!WV>qn=(I@CU3WqIXCJ*K#j*n)=A`*e;ar15wCH z+gR6Xny}`QBJv1{Uye?eT{DiaO3nZExIRMBxK?*7(h~&G#DSqzVt1g6!8hI9 zt;At8UkwmX0^Vs7ysXf`Nkai9X=tP!VXZke1A*>-Apyl+`BBn}k(~cKz8upsj|eSn z-lf3Nn@IHU52qKrfE9usL%K0^UbXxjoz(4yJbkMVw(aR`C-B9yoQNiSAg0+*gV=r+ z|3+bP!j=%@pE5izs@s{!g%(ZQ^O32@+wm|Wr3{_mAy)Nhf)S1N>J}+vVFF9Xg<$5@ zY?O9jZ=Sy*z+Cd5_K5M|BER+R8V9SsS|y*}x9fbKm%)wf3?(g$A8t0UrJ#Cv$w)I{ znBORLgU8b9C;{65t8Rrvy8m7-xQD^} zSQA>B_maZ59q#m``1oGIY>4IkXDuRZ@OPPUhA)?#m&>kjhkc!0*hJu5QB&vOxe}O{ zDxLezcWcP9|%x<>c>(u)H7jT)REf?D`qJYmet+u z%G}5(iG%AFVU}6M*;{qvjz3WEC}dD3vzT8}W}2uPUHlNm0mF+1=^&rm(-;0lkzR*A{S%P7#sj!SiGsAc zA>NVG{_jf9VzZTZdsxM*;HDkxEngmQNR5`^F3Uy&BqX1=N@CDCqDn)m(q5evEkviC zb0aUUY0tcWB}P5IXjwy(&I^r_l<1ba=eXrKP@}eCBg?Je-}*hO5X+;Va%ntWRm*0^ zDvS88pom3#GQVk>P{M84#iK*JWrC7jue_`L!8D3u!S5c4&DveFlGWilA7T;>ky-gd zb6bt%Dvb}c`EI4vUEDmQ4Nxw4GuV4m!9};8ixeYGBX)HYCoK223;6F*gNP9lDE8ui z3XJQqv+$4;7ns95#N=^k4j*u_dBE?e*U`Mv$HgquCafbfXE;xQq*aWGw5igZL-*-_ zPvin-&*Yw}nc+~|`$)@L&e8{{wK}tETSoR9+$06ubj^-&kZRAN0#4Fj8dB>)>?PBo zqZc4HH%nle{=?lyeVE4f@Y@sbyq<)*+f{K|cnfMqLq-k|9I+&f*V5$GkD!L2_%YseLh3)MU( zOm8Lz?Cz8J(jx6#TTc z`v>c1bLDx+Xfnq#H?7MHa!+rmkCI`{nX)hbOTAGQ*a2OT#&ce30{Yh(fBFcRg${nS zJ8rcF3q`u$%hJ#RNDo$nCJ#wL&3765gCi@s2NjY16X&)AzLY>_6!voqe zUBt#8j^@_$f1P!^Sdm9LWwcM$0N83eh8~RabGtN6ao0?&kOF|Tvuhzh zf;tnuZFJ?@MhNU_nbHevqka*D*SSrrbe;?Rd&322g-It$gQgbF(~a<;qBS9-G>9!f zNoor0{z>iH)>Cw6Rzpo28MD%=2|Xd_VM@AfA%3epAFG~5L@%CBDT=~BqAas!f-f11w) zO!U9~b^{*yAQqS8$%6zi1O6Ay9x6c1n~a_Nn!MFL6pI%Lg8FTO_N$dT8F^>$@6gK>&4{}gwU0^-;-{oW1?U3DVKVqu z?O^skCr&5|r@48#KT7y(TX_3uVx{NldP5TxKMRwy@K>o)5QLqHWV_K_*NuoJ#)u7RcF@wNotxU5LObT7)3 zeE#~!&*8`>^pG6ovJ|G{cC=+{^}M4Z((zuD7~OzJlvIYw`svPcetX&*c>@SyVnGgG z@hbfRYMg1eK;`pDO^W?i&7TgALvJ=4HFs$NwQMp>sZ6`OCWn8{^hjf+N3@2q>(jkL z+BvUxYA6ljDFTsLVt1DQBa0p1m2k#KaXsrkMm3g9iP{?2=dWsUGc{OOM(z&l?^1+A zvZZJFIcQCV4>y*5`w67NUf?hbE>bEYZx2i>z^XrN`B74wk2g=){$sLmLwF8z( z)53gY2LT*~j`zPlsk36-SyOJn^?#I-eBWyT-0?Uc<(a7Z*VlrDUWzJuS*NVmzIUbt ziIBPEbdNs&a2LVddX?#K#P#_{mEmfio^#&LG=F(>Linh;Ae8T2>sk!PvhQ{20e7lM zn*}C0c)*ix^phg5gCXVe0-m2#-izE@u;q86N9`dBF85U517Sor!y@FlJgC6;0K=oz z2#<3I{VT$WmRk0Rn#Syot0&+CzU+(xGXo`?a{|BW1eX!WK$S|p_F9GNQ2KACl1#s{eka+zfIigqc0M11NJ22*4_6)#T z7M!i!?-qu$uM4a4S7%Z3iGwx`r>s!*ovcMv&F|u6rc$q73KX`G-Zc1|W^b6SsV9eWRy4mvTLxaMTOCzeTUXhKL45j!kOTi3Z zSNtw!Tw4Tx>0(Hl2R&%}t@?^Xs)DWPp@mAoT0?hcoS0?*L!j!sFSRrO8ya>{5Y2qR z3IP=&zm8Q-f+^1&0?{HP;bp)7G|uS8S`~Ej$I$Nh5^=FL))zKudnDr7IA06KE+_1d z)%@qPztoy*AyPQdAt!i2zpms)kDV8=`oa%06Mzz)^u?bOu~z>B^Z4n4!9@4#6tg1=*^nQw#eE*g6d-BY(|HU= zc+wcFKynelI5Y|9jAj`c3Cn3YTZyT&5$nn@`c81kK&~Nh{DUdG5SiGQ;pX1xcFCb= z{INfac=nVBYNglU4H5gLb*|l2v-b5v2#!07fOwS0P_ zxV3I4P-#=06XVM26dV6m4@#VFnHw0H)%V5G^tCQnXzAy9bE90&Tg0;V6Vt=%*LefZ%28h=TYPX?6YP9WP0sql1^#%h8FeaPlSGH*Wd5{;IAv=@hyri6G-RLIPN-?k7JJe@dWcjgeUBS zq-~Bv2Ynk7EFo%@UI_bARdzjX;7VeD^CkZ0gr(!@s_lxM_s6@+X^Q=6xBZ@RZ1a{^ zbQXpf&p~XH1K%lPO^hc-V$he^QfTpebBA@eaC@Eic)(qcif)7yES4K`P+WjpzZZxI zN!;(_)_ed%HNyE92Yb**rJw1X0|wvCk2g_SdD{eSA8+w!xXAy@2@7Q*uutoenh3v^ zYg`Z6nF#b3$dSGj7?Q`e&W%4awXAL<-hCYQxv_gDBUb)uW-==~yj$*eKm%nJ;XxjA zizf#vxKSZgtbX5J7VT%;b{NSQYi>b&n(Am4FNz>+K5e>OBaZ6fZh-?ZZEZ~>G^KHNCy2U6+84CGB9rp1>BX?E9$=gJpknF9It`p zW)5$@72zVQgN1ptO{IQ;sh?nY__6b4IAo}dw7k4Le?La~`zN26>W~_f4=0y2vL<5W8u9@U@I+Jqj&v?UK&xfACapV%_0Rq1|PIvoL!3! za0G6NetzwLnvh}h@>qT=LA%<(QaRD;rP2HO0o0#QBPo$G6C4NUVH>pa>gN{_ow9+99^ zzY>TVld@uIfkjYEpo#m{z#&L5@7A;GlIWnYzQ+$Jq_GF=6Vn0L*C2tm!gj0 z!j4c2pDTl-L^;CB{&X+IfsuCf3OeC&N5BQuh53>4?i577wCR%6)nxDA^S21xGfq^h z%(Vv5$py#P71!_MHkl6-&W&c<2pTf=!6nw0Y2&z=-3twg7}hx?+0I6%e&V`QFSGiA z9X%n`rn@a?a3RoSfd?gI8AFM1+$v%EIVzgjJ z=iWstOs00Y1?xkD_*)K_NCWsy6{BuQ`#$46kfe?L4;i408g1cyh2#R(>KrS>P zeHLX>>mjACz=tKv%QSPce4+%tQDV&+am)T!3YXSrGu#OBP8vjVF`S=&dnY18BNGJj zn9H}6{;&}vf?vcACTI4agHmIsFiO~AF&wMY*CT8dyHCRJtDgS#9*c))D)UtZrMS=3|-~BQl-+)?qq>c7FdO9)In& zWcc?9$XontMQng;Q0eP!fV-C8aoDATbZkdtbqg$(RsHuNgfcQ}aBxs``Hm{Y`z63- z7WWk?nIvL*`GyAI@iq%&83@!X+AB6(vVT2Lg5CPCP@!PF%JTZp`#6llM-FZO7JGy9 zyM7LE$KQWDA4?*u=U(04aZUk_c_9~{l;1fntslymDjqRQTo9J|$c&qQE>w`m)?X5b z$Y4v3Xl_3ASXQRxg!isLGT4_t`!Dqa1iy3TD7~0OgJsaJvB?ct=WE0XrnvxL)Eqa% z+sT6NQ){Sz%1lGZf!{a*GF2Me8|#v+Zd@;=-h@t`aO?>t=Mk%ezr&K2pcnx)Yr zJYG36eg>839Xz{qkD$Zg8fu}a_cLS0lM$3Cx3}<>wz;hiwyePS2u9I#6OXDoGcBw@ z*)0v_eo+h^#^@-^Rg#B0bY7f6fqqUeryKbdNB-jQmEi`&uYglr^C1%`9qopDRd2P7 zvsdAO*$=bAWZAdIT;bfx^XAV0CC48FkeT7z71lU?J^7utIw z#o5~-N8$CCmsbN)3e^qFlEj4)aF)NrV155_qR%KrK*9b@tJ*R^4*39Y%;9nMAY? z6}9BCWAw=VsfDsLs~}_1p|tqm-x(SY9E?qKOTH^-Q370?k8tR@<;Wzgb23mTB59Mr z{?Z#P`5RcVQ_FDYyS%6}L-LhHcNVKf9l=`2x;LAdpPn*V1`Z#&SAg3k9Uu7YQOwRTrX|pLumK6<@fXn zo%?XhF&Hi&$U(=H1?Y+UUP~;T`7qYVXEN7^V4UNo(j#YO2AiY)Op@gIP0G_ zMto-H#Fx@`&jl^9)o)Ae++0;xboG)1sEwfOx`D_KbJAh^v&zUX4KDjFM8u3`e}kbn zl7|5z5-dY`Y`R$p)emB8UilS1x@vBJ{JrG@hNa$voWm4G(fr408Vc3^PYE228>SY@ z13Vm&dqoeb9#Sj&2We%dzxO&}9(H_6LEp^y+pjS7r)!hX@ha7+%zvo(yUi^nQQFdT zC$lOkY|VF6AH=t$Qz{d97BdQZJAs(}IYlr{$}OXDw9@&85*bxRf{C~$HNbd zHC$4bI0J+hR#z1hom3s7csi+chNW>1tO~~u0qdLr*zpPPP?(_PDlNq04r_mNgig0M zHq=QrLM;F2wP>ZzI~JTpwmf?@HoGe)WvEjakOdEk zL>2ppoJ4isHwRK!;9l%$PAcsm$CLzYqXYo;%W-u;(C9O&Dq7#Cs91N8<_+#+V1#d3 zoag2B(r|ZkMEDN|eVu8cU~*OHeCpYcLwzr8%e+QM$}`u{9N3`jL^&L|2S~il;Daib zijH1HbkO)*iLtAhLITc6ia^^qIr5N#Bf9gH^8k}1 zMuBo7%a!ER)rYxK$|!M-m;ywo)^NmH`@XctHEZX)Bd@58piBxu ze!>VGr#i5bgKo{xk0#-}&vhw$v#{WIoP@D)QQ7q`pUpqz?w!5MRYNM`jK*$1&%fE; zHYeVQy)|3^;D9xG_s>Ae663W`FDi^Ma!Wg@1u)DG7aZd@LWeKU7)H!4nJ;pvwJncR zW9vr>hqdJ{4bD^#+^JR*98cZFzF>TgHOU;Vi1d-koTX){RE4ES?e7d59RJej z+P7jjB#(ajRfGkF7?#U>+FosA88yD>v*u#`Q&gNS)8&e{35YqxzQzx{{Nlfs|E}cC zqE4?8h!C!xs0_NR`)Ha?gEN15x=)n+GFvks?~@}pT`6s)LkkCA`0L9O&*1<`K9^oc z`g6X}EyV@|X6v4HITMVGGgKQKq)3{eQlVYp%$7IqQ?a4h4BkB)o)o|lsz*YKn?G(2 zu!Ssd4UeO+!1Y_=RKl%m&o;H|ciRMN%0uzjqnZ0Z5<z>p*&YM#;&M62?I)*1+x*Apo$MsKZU)!(r zHHxCs68mB48Spue4Ey3ntuk$-io0x?g?6%i_sz_aA`SZ1!}OH%e>8s?G#?fHd%ZY4 ziE%Pa1+dk|D>H|AlYrr9oGWC)UMMHbDgHnD} z#|hV8`nqxI=ND8Z3a+d7BQv9P`W%7*7m`(xPn|iBluG^>3=|hk2Vb~SaW|HsPqrya zjLrr7Pt0cKjQ_nGX^A`P{8wr;lZmxI@c}md{SAErcP^J^em;@(zgF|zOK{zx*UVh{ zR$WPn@a47l3L59t2ixng1HwCcfky_$?I+T#G`al1XSTnZU^|^@_mrWUWGm%$vXV=4 zcOB{KjaL;M|1KsIBg`=9@BR8CuV?%@X*lGLlQlQpx(U9hFktmpoiW4xYx$3!3bD;u zb0E$~0{G)~hsi@WcU&rtv|@5fIubA+ujcQ?>SY{?jk-QqndU@4Djly*zL|gX4LqP^ zfiHB^(PB`YMc=3JN{(jV%F4-GA2g{5nhJj@k2}@6$`-6p?s*dHN6-l|{M|QUX@KPgAgGDGkFFqP18u))F26E&`n2~bsGiobtHK4h>+ zdhV}gNbO?PDK0;)#JRvGzO<#bVUxl+C~S>r&$Fhv-;WM9+>66;R_!e&aZ)3Vw$pzH z7QGs->VvU7c(x1~oKzKH8huvKsdufgPt!wRY0s}@!uzu-MCMYS@D^+TU7O1dd&L_2 zrq2Fk5!k&0?33J!eYaI`Dp&6L_FZTs#BEBAEsMgCog*K+4tt<$t4~UQ{ULRkSld>+;mOaI zWLE2@|M9DsyPLTFdxmo*XjbgY{>~wD2O-R3ZuOnmeYLLx)gQ#%_Bz{xb`FPoIFAm+ zH{bTy44s|{@Qv;X_;QKfHpC^+jG4qw|^lVxc0~B;$q+Bg_S5$)rK$;<}Gnx*|aq8N*D>l0uaPc3EGiolXfr-43Ye z{x>%Wn!I-?*I*Nu}WyN%}G7?stj`zA(&X_;>bt7)S&cs{@vqcpeV6fa zc1dK%HL5x?4LZvS24D^8njq=c3*dvo6DUSlo?hZ$^!ACKGb4Uw+4Uv&VI<)?k_EB@tF zasc!$jl>V#=>SQL!Up`tBUCt$Hk0&#TbpUeXW*=7{vrxqv2zY}RvBa3^uk*U@Wi`` zs4?6&$rbC2zX+I4)B0;H#(r05?I0lBTx8^#ec1O0XQREwj=#NG=`4*1%<O8QAtF&F0JJFBgfOFj(uV&dn8 z9Y{r?g;+VZ;cHwvnKhka#Rv73Q%4*OF^XOvDPCXw^|6tcwvj$(YMFohyzOaQog_r_ zzJ~C-orQ(>9RWqO)8j?^-zf}?Y`R6+w)Bmr_mK@$m&a?$k+Tx=yvkp!ObZ`PHydhU zU}L--V9MqW0Y*&7$!r3xePet-J=B6p?hUU=mB zb~7#SNL)2iKub?wOnmfHrCnws<`J2%6F>=#dhb>Wa;CP>^b%kYGA|nY z{J0|;$2m2-VT!G{@-P^%k||+P<7yJ6U=QO@(0%Ilb&gr$sh(*j7Kw(sxs!UHeUg7W z?2ehLseiCpVo~5g!&>0*nyt9t^-qK3d2ew^$b0JEsCUkv=gH;PMoa}D5qF%{O!s+k zo))GuAI5U>kTKxkP5IBNL``sAv7QBM%m1=5vck?9q&Wn7PrToondLe6@j3C~3Z@JG|_es7|LOb#`tLQ=j zd<|->$s%I?Bjwp|eod01LbA5O$BKhUUL0Kxt@SO6uu`H(Y3S>uOuXY0%04RoCvKYx z&le^Z{S47JkBoMHh?E!3`` zsL-~N2Xy3@AYLMqpo2GP$xXXXPXl~94abXQg_=z)Uh!XVdhl@cRc~bp$S1`K(_tf% zRTK)xG4AxZJQG}iu0@>g`R)iG)Da!hYM8si8_j+7R_1PFmOc}mjpQp13~F-Kgbk;@ zyt_r3X3bF4TpjW%B(x!%RFPgi>K>;3>Rr-KNOU9LI6okBLV$!kh7ZX&E@S= z+LfFo$RL?0t!Y>9FT0UG4?P6{^xMeV8__4DDRw;KG#J>NEwr4eF>a~9kT}>+)gRGk zl`0i5E;rWxY+6{SUH%<)fvY4onjNKG2dC{O>Zpz$fp~Sd<#XK-(y2De+mtfD&1t=L zuL=0*j^8QPE!4{T{8M|q;Ahi;&ItJfMN+sMpn`IQ(?QN?$jLPr{f4lQpwX9588+VVm+zZyIg|VWVi1auUho&` z*Ca}O-%zvUuJpDz*DVJGBCTuLP&q`4Be_&$k) zWqsuE^{>Q80SK1>ME$*uY-hA}$jX)}?~U&WH%tbRRI1K<4n_;Z3;IHLgOke~-Ivez zY95`xc`2j|dDoWsG2IU~iWVCQNuriaG*=P4(s-na$?;VP~(JF(y9*B5GD??EaOYQR%^p)|I0hJFAfAEHi?31kt!*Cg}NKWR+EJ^SBLp2@Nn?Ky? z2ITW)+WHh@gvwvS>JyHBercAH#IWwg(&t>ylqNI~cbg~_===+7ONA(pg!>$@aDi-e zkSIhbKNJD$#;E9kJh@ULRBys^kqpZfNuiOPlVd6r6~@iix^uVy1Dq&PAoufi@#(|A zqC^gcHa+p1lZrxgA#4b(fYydh-0agzjE!KVOT3fN1cg-)l{%XX4TsWirYOBZK!KmU z|GkX9MY>thsFnVMB+6%&=3laBy(=T%pJXBi8mQL|m!q8H0u zT5;hh&quyO-)CLNs-wsFMHoX(JCnGTN8c=X`q&wM39$cj>tN zpr_j()V%oSL`A*Dd()$d;!NQMUh`nKt*Tnh;?vCi>IoH;q7ZN>Y_4*=qzi=IStrcE!*;Dw)c>H~{MvLFF&B1!8_(*2pVQHOjcG>J? zrCCeVE;Tu3(IT;}$*ivQ2*KPoD zuBDk6yx;uN9UXMj>NwFTP?qtI?shVOutJCI6~}F?q&*$fI3r(fqc4{Ps$>ykUnycQ zVt)$b$Ei`bZwIL02cxgz4bulX=B(+LJ^rQ`-$wf*TXLW!Ygof5zw(J#GziEMHRCnXD2 zlzeQ7g{_@jwu;l)QGEakQn_d&Je{CjjoJp=PkD$ETLUNp-{XtVi>vgqAyoC5w4X!` zvb9;s2gV01EIb_bTH(+wXS@5bCA1!SoiP1;2TMk_yn+J0Ua+a-_h!`SCcbJVU}~Ly6aAvf0YIUntmnqu69bsIQLPND>0ISe0dv45bbT+7rX-kG zob@UBf{NW;H+uoVL}u!nEQy!D;JdmU3abo0gva%)yAVp{O)LUu&v((QL_0KpI=XIR zeu||YCAit2w)8+iKljf5h!KIECpxFZY$t4rTdOzbh6DzZG0aSm-*HMG2Qm)WPQs^& zfZ`JJQ?;x}P>OFF{P;;AU`+sW2_6HG0|inm&WJmARJhG53w2FPE4G4P!#)|_T{u+& z3Wf*9fG}n!;YT2D$aq7P>kuhVsM0}u49s4v=T{9FmS;aNFuItFnZDRY{nS5TjL|M0 z*i}Gj6E%!QBwh6ZryKWSI#F}C7yH}wYT&fg+JM`B=pnMnUmO4ksd_tEmGmQ2{;F^@ zlaa;Jm8B9IZDb-7CvM)CR6P{OIQqCNj1PBLPG($k4E$Lr#RIS&^O3Zi*GMp^!mMvI zuyI2MFLNR}V3Rw?ND%ZRR^sC}@y#R$gx?k^=S?+J1b-(045ABFC-NQ{lp@(BmZ^YT z=rd|M97BY(JVavq-aoavHfF%&Y*$eLVlLyB+Sr@)8g^(`)5A&+ymD0sYA;-!!PPR_ zVem#@F^To0%kW=!dSK3rx$@htiJJ)>hF_81dNtuW;jeLd+(Ux+h-}kQ=}{2`HRO_s zEIV|`%&A2h66#OOH_>;6529Vb(%X0ncp^~S&Plwor&1Wa6p(f&Wdg5)^&Go|y-qD> zTUPO)!}+q{bttgaAs={fh|mO*0TosRU78lS8qZA&NdkHS#+{c;VLvw_o!fPlS$Kdh zlC=08PW|{7ZE*Ez;$}KT<`eJiw>z}}Ef~-MSg>JiuOu?nyR&{}a$6fX;=}0coG-z1 z{Rfheja2;rs#yi)VY~+VAa+BBZ{APr#L!HmS7u?fY;37{a7^cwl8b`Oy(s#~Xn&!S1Hk_ zC7h|lrUQ=jIosBbxHm3oay`9z6m1byD3owP1fqlQ7uXvOd;JBfM1a!jg*RubrSu(=u}Yc7mae9w^X*gLv!Pcd7gtSLuh&%WXG_uFIJ0GhA(>Y zSw<$~1HhJ}x{gqXE02rPeCK{3AyNptIxu-7n1+P2^A zFH^V}wHvf$0XT=rHH+O_LlE2pBAhs1r@KTa6ziu)#EmG=ZyiFFIe1@=;l%EH~dE00Mo0q#s(&St%T$sW-EC*h! zE%;uBT@auxE59MeL0Vy+l)U1mLLvH#ocw{rUt?u;u$RL6m52t01#_E+Cr0V(%a}ou zhjCS~dPQiLirPY3BP(rB()A(S-)XFJYvvgZB?}7?IfrJy6c^Qm-u+^1r44X!Y@$hl z4|OCv?j8EAJdXhIHS5YB7w}j;p(P-YHR)yQ;@xpSpWpXu?r|uu_^eT82~sOMgA!!+ zqh`-3lPDvu;sH%gC6x6%+RD#8l3V~!j1<4-(MN*#y50Kk%EV=%3ti&#t8ir@dd!($FKf{a`xF#T zT_1?`DpF*6Zz3?*_kfONNQ1-`Xos9xv0*Y`xo}Oj6{|?#vFGhttlP6RVwYg$MOA^7 z7@_yeG5Ku!HYG1`N-qcT_VcSIz;Vi#ZecHT{mJxnalAlbP$A@DJwd|!u9pJ4~5O(te)=tL1O|zIW1*AAO3>X1S#&q!k zkn&?r%{5L{Ac+;FhluOst8UVztY&>5CjY;6a{S|@hgDxZ1=F16Av-rro$2?h3CQ+T zJI<-dm+1iK!d+(A)FU7U|6!^>X@00)Dlx{*>X<~PGPKM3c4W-R9MF%QwNq<{FzFN0 z$yMlyL=wZtZ7w*94fEkLc1hX|4cS{qP~kMGKcrf_i1PtP6rSiPH0m5yz0FKqv@mRs zh4O(LJtbdc;TsR-L3Dla3nlsq(9t{%ZY@J`a>{;};V5^Y6-ZIR*>clCN=Y4k)<69? z*ebsNiN+vYOzi^!efv_F8drP++OJ3jFbZ&orcudh9$1vQJBv_Ky`n*Rg09IJL$nY$ z!AiWrJi~5pmvsyP9G7zl372^bG&{9im?h~EvMK1=KOhmfDh;joDeeP#L?PZcpUHWm z5L@AD+2g!U`NN1{C||f(B8vKy(z8LdOvaTCClLX7=|XY7c0)g7xp5Eqwa2lW_asDG zuEqvUtpDfDFa@(NBo&|C<^i1VSwdHLcAN&PPSCIevsA%Ne#TK0d0n}j0T3Tp+f7;3f3q}hz0*mKr8iZLWn{7P`fPZCzzc$dfp|-a(iW0c<%Z0l#(stm{;t4=PI@H3DHVE_@JVR5b5^Q0)bo^J4 zj$TQ1aYERIk&pb=z9-y%#Sp}5?UHmip68sJ5fbe%_&ghiE@by4-Ps|eVhW_s^G|EE z$T9dBRfz4pJj0;GJ3v!RB=A7A&jjb5dXD`4fE`5~;qrAr3OghL-`>X94i{7Q3Oi!BBLxJ4l**!@^U(m|nB(UO& z_AS^>o0L8Ek4(=8s+J!EF8q4RGV_L}C;f)35}%_pVCH!yY?yMlsSk|ji3OZPCx!Vi z5BAh6FKBV;9wq_wx#6LCyt6{6OBXu8xIGW{$Avm92PF{w61dU5jr;l^8$38yOx5x1 z+Z#V&eh4lItDE|8Py-txb768JFpu0qv-!gVMsxhUwAT&>?p)9>yW8>Tq>$pgo{>N% zk2+L{8kSum&ZnlLLe}IccaG)5r_*-M_(8BvApfxj;9cE7j*8|rlDJyRIw*fy`xR;R zSuJM??^Rj@{%#T;Yu>v#aoBrbLJRb=p_?L{Yi3~_3ax&VkXt*1)9lslN?#X;n6tzo zfb!8c4l;BTyBjI6Z-uzwoz~Lw+=ZSVWq^LOE^RMOl8(tSONuzA__iy6Vx&Xd;Zg*j zdtq$4zH}Ya-@#cnM8R-cCa2AXJhMGJw-meGfoui0`GfWdYGK@*;Du}>HkHJ`sRzyES1Gp28r-ETeEjtv0vF_u?u^n5Up9o^EH;ZvL zAu%^V>xl3?<#LGkH-Wjis%(hdIr1t|bDDe88Z^ZTJIlK{=tC=FFmEF6+hF|)XJK%r zOTdgC(PXIknK_zsr51(c%$Uhff~@jKi?;dCelI%!`+V9 zXM->nO~|yaz+sCM$QND*Oh8S#l*v&jm(1Hz%oBQ61E?HrNnk35^elTMF1kNzx{fLiqCNCIy@g_6{KFn4T zc%V_FlZ;#5tc>7v0^+K{OE zPIhO~+{^!2`GqP$6xUl9!~(rZ_&yQ(c6IzMZ^}n6f!;=9 zbt!Hmkj-ixNoJR!7?kdA7dZK?xQ`#;hVdi(!JV|#L~#H#(RiB^-eWu58b1US!7Gd` z<11q@@4d}o)=}qt!N#xri?*72A>IELpHI;Mo$PR&<#vM0iRx3Jc3*nV>l&9f!2XX| z2*wSXHcXt4^LE6;rMk&6rRy1;Y4$i5(Q1Z#l8IQKu2-#mkazbIqe+=yTq-Ce&fiI& z;}0}3F((%0r@;P-_!}8ymMAfR133h7&Ih5N5fYfabC2W^n7C)6A+R#3f;TNLth@&l zTFHH{dqYG{F!gX0UMwMJNVb=ayXYfMI0Cm!Jgv(tEpEHB82W~Phvo7;X()dP6^X$F zLo8S@4GDZWUt1y2WAbc9AOq7Qfa=4H^RAxArdM43^EzeV+a%)?aHlQ++%Z|LAbyx* z?IhqjH+!fOdD#uj)#HlyzG8G->T3qg+_Gx&)z*~(uFq@ACLOConZq?%3-|<%;X193 zX>ao6%hXlGK6oXBkVxIG9FEt&juF{;csDVGX3zA9XD_h@3}&k6Q2Jo^`z}CG4a*i> zpbJt0W*UiCJL@hE_5#;2_Ar}}El?auQ?=QEt$}fU!^we+5D%-)0J`(vzFo|~;FiF| zBx54ATr#jBHOB{|1Frjc0kbo9@YY2|pxYUu4(glLWZQ4(WDa_{u>WMDH#n{Y+@EBc2iT2$f&2QVE7iWZWR*LN?I~QvGjZd(SWn>g8yO3FF$? z!HvjNYthj;Ht*Tzv|5=kO#xe%7%pZ=goPE**QIDeg>eGv{ty|E9g)>RaSu9jJX#%u zAvJJPkaoJj)rOVR02@B*Eq6FGU-G~1>Ueuv;`ywUKunQ&IcW4AK#*1kD7QuFaN}%4 zvpsKrx+H=5P9-XXYX%fhjPYR%t^}#m!G7~zGkg_+ zQER!-5ateX%!+B$4(1BK*%*j{>{U4JCK(lV6FF7$UVgYQfAFj5^jmo+Bx%!&g;LmzTo&k zi)~J;@5UvN24SPiX@i5h=^)yT4d%2ft6HN(AGvPrY~XxvZr;&)J6AFJJ7q3|$4!P+ zb=5!8vgcDir^O|NWwBY%w*rdfYjujgk}GnS1=L z-ihu9R6vy32C$~WH5_Ja~Nn6bqF686RMS>_65FIAW&FyafW34@x46uFOa z_t`hD@VyPwWV0pZ5MQ4#*{6^ZR=Y&f%iN5s%VF zY9*;31fH2dTK`rV)If-@L!8RAAP#VSA@gXZvcBl{&7y6FNtBYMllJz@!(_}{MJ?XF z_Z4E3Rdk`?gF1kg^1-!RvVQcb%!TMs`}UW2C)Q)(>It|RKQ_}J^oBJuicx~Jx@TPT zA`;zK=ZuZY$A5>{C+XU9rF44CK0MZRU+ml^wy6~YcQOvGueQlTn-a0BJM#cr^24|};*H#uSdO`K|X%+)tUP%6Hdp9F|$v59_K5EzWA z2&UggCTyxPS^fB1Zg+O)^)_T59eadqJLD7%3Eh2|wZ}PeG&ga{v6%4TM^jdu(5O{> zvQrq_aE49+q4Vtji=kE_{|}Ad3OW_vAwUML&BvJf5hujiWPpb1Bb72G>#+X=1rxIt literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/images/ic_nel_new.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/bnp_manager/images/ic_nel_new.png new file mode 100644 index 0000000000000000000000000000000000000000..d45dcb4674ac76de749509f45685a53954062ccf GIT binary patch literal 4035 zcmV;!4?OURP)N2bPDNB8 zb~7$DE;i7Ety%y84?syoK~#8N?OO>{mDLvhFM}Y$GjgiT0h_h*rIvFV^93$&MFvF? zWDpP#Q5aK3Nvv-cVPYZ(9j{j0zgsemQi@UmD9KO@YjY6KhZS0ssx9kjRAxT98bm7O={ z`5kSLH} zAM)#LnRUewx!8gFMOo(6&-5T8+@KaiucyAt!l_BWI>b|g0&=~7W-su+*zdli&$S4S zvb2e`TiQm(xiQ>#{x#ijS29G{s#BcWHpf~4%irAgU+*L3RHdqcaZ_Opljz&t7T=%$`9L1{(4e^Fhr$wj zOpHuUf0hS3hX=ce2f3_ApMk402MpWTd+3-QeI6LQzi{NkM~X&`|FQp=M^6tN`#9Y{ zev-oAho7K9<0jI8haRKi2PY7}PW?tdLVZU*OnF1cP_KaxP|u?KsasxuO6=8#I`zyY z{$G^VcQEld!mmqm+kABw4+_Zkr`g{Y(Cm{1G~;Lv)k*cG2032j7GWe+m;kMomenpOJnfFVyb#*LJCE7 z%On<0eXeV6Q3-%Ji>y8)u&3ql=i>+8oa%SjGt!_ti|Z@$z^rfcIVRL1|E}(IT}G7= z6(&I2h&WsJpb=^i?4oK=w(gl~&^d!gDhm#q@Dz=mGJ__*Fqfvye}iT%eurLpcP+iO zZZoaivWq_Y>;Qdo@ECn|^auL#``_rm55LpFAOCRR&`+lcK%ZVmd(W{SY3AbP)YjIC z+DFGxU|izbTT*?0FhULLIPM0A01%;ZzuG)4EOc8@wYNAmS}H_@HW8h|V0~C^-Ohcq z^PBG!fx|zaDFGR{x&Kny`@cIyZ*N&gy`IdZ>R~<#jT3LB2FW$Z2r(#cNl*y^+CS7t z1;%UBJ%9J<#3?bWN+|8`RCHLM=zt`nBb#+CMcLdiC*!xz+Z1#kx)9 z4B=BQL0EwH5THX$B7J`RC#Pg&@E1b%Lf!*Gb{;uF*V(Qn3lqONuNHYnxf5GcwHp^+ zLzDLOa0Ea-4m@)xod&J4QR0jD&^-^-Bj0#W@{BgPbfa5~s=-6z%OwD(u9n^Mi~q;b z-yy(1LD($JqV+4tJH$c(nKfwUu{=e%_}x%?a8qY`@n~{X%2Fg?hl$H|CHR3s57`o1Q(C^%r3wF6Fs2Se6iDHpMFe zu1Tvxe(}ceatYANYQLTH@t;Uv`V`Q;Kqs#gEXz~mGtNp(fhqGBQuPoYGJ*_hknT?j z(_2v9;!ySi8x3CMw|GQsl-^o)BeDUosDrf=_4nRr+kPZdA zk9yz}{!Z)e0wK;hNxhWBhKnBWl@U*&7{*pkNyf=kF8tA#OExB7QgcRvO z7}pu@yl%K5--md^)U{j!v<#085CJ~iwV!r;^(}2bd_v*VL&qIJo(HxaI9dW*zdS+! z`cZD#|4pgbyzgrgytjELMRxB=H-z6rUcu)?&;)=Gt%ld7M|UPT(71@x<2myFyi%-} z1yrR5z5IS}knMBAKgnYe2h!^06Cf<6ZgTH_XW#+LH+({yzWAyHKHhtnbZq?m5Sg)I z&p{GkQ6xa0-bQ`>?k^qqVEbNr?1kBMtFLmM8 zl}HOU%Bi~8xcef=I&+N{A-1b{qoV|vw``Rfd}#yK2aSOXR)4aG%EGE`pOG2wZ{6+a z!^R072sE{}BA<}6Q=(=UPa3hoN+Z@=Y4EBb^0T{B%_KLf-PP@>a=Cd~Z*CqGSuG)} z;560&Gv8S5AmVJ$(uctduot)xV9u9@DK9S~UXLg=jc84NA-pJJ0lYY{4O<&Z!`6jT zpQY`{o#+3xDc-zjGR9Px08LtldGZeLG**JoE?E3GGGz_?-Ay}4$BK`)lR*0QKGfgY z_^AWZhUdZh5TKd$KB^VU(fnLMOrPJJ?q3s3L5~EemE!g3UJxg%!UQmkn=CvB|G-Z0 zsX4DWB_x9uGI|?z1Wz-TeY8#W$?IrKAIi7aZ&hsou?Jgf2+-1Mqefx%$uGh~iEveC zFKRLP8uARcs69iy4DVAM_yQ_W0K?#Y_%DH-y3*q_UM^uFXQXr@AR$DgzVyQ_1UPHU zYf@r64ZQim$7%~M)1Yla2(`=)*mYx;-N?oGaS_lGK!JiaV8HT%2Z z&fRGIw3!a82vHExNtsEYEksaCd&$~OCHkd}5&&tbqr^dr2#{Quf1+N{bv_ zq)#t-EusWKEXXV#wz`Cs+jEX@Ww=$i<>d=)DOrbc5;S7sRAn`1M0Jbl12>Zr(r>KZ zK!Chg+Ioq(51db1=Cxl8PCM2ZI& zEJfMvHsT-S6u2zQp3jOPDTIWuxxH}32PD92s4sYDjfy`I07vdTmLV?n01kj_S#`?j zKeWVLbw*e$i^1zw1rgn%AO+|o(U$k2K7aXY^&a$%oBDzhfKxKxCuH<>sQ`S5u@cIs z77kLu2_$vbHj~wf>K2u{kT;hgERfgG#!~pv=Vm(u;5bm=QUQ1kunfxM_C~k5dEV-- z>&&uZRk5tz7UCf5439nkk`lnqTVrdNw0xHez^lN;xR&C}N{0Ztl_7-L(q&m!tO}w! z@wsomUxNJ0OIH$rek{YW2*NmcO7?cC0K5@-6^9b=0(gKY$kspmKMu8BMgEsz4e~5wA9g-KB-TdIbR6?L$C*AyHo&P ze$K>Z1UI^6xw`Jsx~0(%^14;^wvaTJbC$eI0Q#StwLsl0!w@V$FP93?Av*Cn%ztc& zON-<}SfAe#%*^C|hqDL~fDMu9QUUll>}lNB<4^=-bhp>%yG~f# z-8`4k)-9_Om%2_KbzHYU{nD%Iie7nQVoHWf1z_bT^1-OuiD5wI9IdA<^E@xjtxF>- zghd39$5|xK1w{Z(%jqr^fS>Uhj|U=fF8IQ0ZPjsZPgDgZ~{F<1n_0@Ghvq69E6R%D(_X^!k555l_TLDXz%A&pW81b_kfgt}4$ z7!Cmtgr?4YtyJ>PQdwzMFU`{EfARHY3J^f*&+=WN2*5$mwI0AzU=WU^Ai(6=3!Sdk zbn+6(;RWVsE^}OWbF;P00$|#~^ALmJ0WKGSr$8D!fQ6v^VGpXaL9ERYn4W+2t-mc= zB=Cvb>uzqgyiQ(->m|sG0LVhfMlKhCHzB^UX*t_*90d^s@Cd98a9V`NR7nw zJlpk`%;sA*9X^MV1J1y8D|WyUcMB#4G^B)PX4g z0g#Seo&_Ml?SVE6d%%3G#UTJ(5$AMBOK1alnCg6PuLn7Cb+NLPX7aE;1c0|89ao9~ z5P>b-FrinUlenhBJs|=gNZ_~(0>C=Xa(h|x+)N&AT>y~3Yy^M^f%dM&us)vmm0*X* zW+4E)!R+?V$V=aaSY8(Z!ovgD6J47I^;K6JtKEkWCAPupxGIAPI4qTAsuD?m}@3IH*fY#>|W4DJgbd}_Ly`(^=3%k5>&d!4+HmJ$z5K>(!V zO7#E;&??++;nX(=0TGK6tkAGd$4*TaI%Nr9p68{_d01cY%)HkLf@48e=>nYdg8J+Q z$B~*qUIZ}bcYQf4)^`@=rB8Q#ArI?gI}8ti0DLG~c`-nb2OJQKWS0mpKoBfzfn!c{ z;t6JV*Da4a1eh>=j!J{c{3D9XMu0Zqah`lcwG}Ht2!Il613c6;^wG)cHfQvc)6}H~ z2t4uPJaw`IYr>_m!$UfiKxZZ{jZmZ5AHfq>O$;_Vd7xrWFo4nOZR5`|i1Ye@f_<`b&&G?zb-K*{4(c4Ez%} zOZf3ck3NIcEfeY>jL43)1w?=tAPaG@_rP-r5KDe~(>;FxPNy#)4=|t1{5L4lqjgY( z@7?zX*SMo;)4ENXG-=eVRolkw8FzJvO>EsEHYu19!`_h0$l}Oe#1&d$#6{bgtO&g{Lr=brP*)L5U1ftLXQ05IJ%&@lr5fd8gI z0EF(}@FeiF+yAT}Gkq;U&FIywe+Jn7?t{AkKz#}$`6=x`8|rUh9RvVe{`$WT?DzZZ z0sw?8-_yDK=!N}mH+|ca>99RG8~>x!II!o&RsIwE)KnI`;7eM^%Mtr97FalIF(gjM zkF7h_Fmkn5<+*QQkl!Hu`O2|V|0_S=tNpV~+>RGGT;autbz{@e@I+d0N#lChOr!hh z@?=jpj!?O6n{hu<2m1eabGheOxg?oEp|`m4^>WptKB>=--1u$EcY^#s1-2Cm)?T>R z{ci5-p?`FvbN_L<(Oj7s&+S?>o?E46Kc!zQ-G|*T%Db-#Te@3R5N+@&@Liu7iYVoS z`E)3f?7+C=8uNwWMM-D27{J2>X!U5wa6^*!WeRC+sc%W@T*oUUj*am#M?QgWlx==3dzRpDetrBOpd zK}KOvZi__OzPiRmmG0Jt;0&OA&To33QrM>&9#vrQ6#Xn?&^S-?{h{PXured`cphVx zBk4m$_Bp&n(vLs(xVcomlDR+AudeX?b41k4EyAy5g++bR@Z#syg7)+!Npt=7GQIsj z0s`~1ON~b}dzn6xd%5o)!FUI*k(pU?s^a{%sp@6BXAzHYq$?*$vLjsHW9i;wEkV83 zpk6oxX1u`bKi*4Vo*%6)(CB!IMAXd&6P63jmlh(70{wP0mb>pbzp+)QUg}nCpH_!I z)zP{NAbfAJTU-^PZ_|%IF@*d^*|nJTY=8NpDq6HYSMe}5{m3Evmi*ZzNWxeYg3=Tp z&Ak7s(RaDjGvI2$U50ZEwd$~K1uD;W!`4spc7MuSwoOYm0MY%=IyD06hwtz0c|wDK znal4_)90%FJh*k=Dqwc2D@kc|>Xz~9f%x!I!<^>NfW@~mB}MC<0ZRS~(&JdRHlKw1 zS~nzZ>BZKL_PVZrr=oOVSz-$oV+4$T0};Vn%RaaG(QIqBy2g?$_YhZV>r-#nPVC4d^%ewUY8LFzF8u+(t`otbxq)~8_N2VY@i1~q$>Hb>{i%KBw zs_9{vgLPd3Y3VB=0E0M2?WLGdVo0af{q2}`JO^P(ax{Rtah|k1=lGm@Hj14rgei`DVIm`#SBZvGcGnxx8g?@3A z;_#Ll)=}(9Im!Zg?*e0@CJg+`%wTW1>Dey;#yMYlq)jcO)G4 zG_on6iC;dIdyQAUbaX)~AzcAH8mhilP8V0VzUu^%C6c#GEpO1=3Anyu`_E4m;FgJz z4y)1~2|9=(C1^Ea7MWtg%mV-jD)xe3L^6A zV@$ZHgg!%dFVHq{JD$1`+xF&aDsA~aC;qm(R&;9m&+T6yrYq*bq!UxFp?t-GKmHD0o7d<&CTIc>rUbH&V(AS?# z>?HYRcxcn51q{Hz8bDbx(NFqGYWdbtQ()mbb9Jn|Iqt2WhuHyQHgr^74tRQUzE7s! zlvfPI-hd$uBEiC%nJmzs^s4m#O`8S^Yy5K*3LJb?P;uz&>*8yr$Qc&&I%J^J+>U#B zZNo#bynf#<%$NTl32EiB7uuWwkb9q|#nb-Yn&B$-O9;0Zsz2fR()Xu8*EH1b$A&a3 zU=7d(nTPULC*Zd$O7iQWz9?db`a=-7#3iQ3RplB=mcbuD88V-LxA@|Pw)s!}Iz~kM z@V+#S<1$Hwljr?~AlyDxSD=e(>n@Nt#mK@jB0{sm&_>UtD0++GwkG(Q-M68^tC#j) z5nRY)eD^>k%Nz8D+f+W4t1qQ=YJeIlVlVGJSD1fbbpGZM_m)cMnW|UK2C8h>ZUE%r z4tnjHi=!fv!CZ}_C>SPuysI~t!S$KEt3dBcwdB1UtUu{>4qnxaEjh0ouP4VP3j9^7 z&KNwszpwt~0p#-`Ze&ct;q7w!ECp?V@& zsHz=;QtmU4c$SX;?&A>`Tjlz{*?_Z&muN&acWI?r4~}jpTyJ>4n28#LFY{C{@MvA5!Ii?|^wu7|zaTbFa&_3YjN*5Ud?F60ye*weV-Mq&HL>aS)C%2n=$4-D47va0CZEh+g4#weN}Z2U1CUryiOC*l}IVdjSh$!L}rTHCAJ=EJMp zH6`<+<&)F}MiaZT=RJ}lJIUFruF|>+rQr|tK0MUg^fbHH=t#6<0nS((fO|2!l(^eW;G<7X2KK@=(K_5GXwjb%1W zvXB?mh6jg0p&yHe8dzrZ4OQ3-uaSI`qY*jE(lmiQ(3+GJ7fkZ8kb+dBJl(MnR;;M# z+6V{P-rHk7mIvvUUm-xce6*YsnDpIb6tf-c!F-kl2Zm4iv122;4 z9^_c%me5yTSV$5r;W&HgU3^8yC_Gh3wv7I3kvk;>MK!P^qglVu6SK*~`phVkqLjRH z*4<3*Ij>%D3!x^3%X^&^l~tUEdwfdeQ<~;G%dZiRN3{Rx5*0~R;$bXyx2Ll#s5z72 zAX_BDG{R%R;ag5PD9QG^O!BQ)ya{-TIvtTWYW~XMlN;Y?c$3+Kxy>N=KC;TH-1sQ3 zQu2o5bu?cTUE+S+PY^?5B44W5c>S27qJyMHixt$U_R;gq?^H3j-w$uQaYiY29e??^ zy&4s3?7ruNrNkk8?8nNbczK2H0kb(4jF{-R;$a=0>%@L)e{t;aTCJVeO_~{fn6zU6 z%@Vy~ixuE_4KALJc#WkpPo>!M!%xmX%#W*NfO$*J`t|o=?S2MHbB<+Tv6mhMkLd=TS`>J%XCd zU&gwEKvAwLh@VWj3~6lvR#zZq;L|l46CUF0X#Jml)(-D(3~4Ajf0I>UpM-ava)bvs zjC*G^37Pje=lUzS1D;*5f~Z;TZJ8@y_a*8!Z~$V03vf_)Qy1&ki}stje@&!VFDBHr zWE^rZH2Q2URQa!MXG{rifDloj^jU(aW<0V+cTuG6r7%h%6x-aUt>i4sb&UrnwS+xq$^V2HPY06Rz zg-S=5p_{RKO#u&!nk#8)tT9<^zYcmduaBn&hmcZ5BZ}rGUXO4xt8az+iQsWXNhgN6 zLI3Rm&>So;HGb)q^6og)w!>PPqqz(QV~mmk#Xn&Vk7*iMN3Ir5PGf|?&qXo~MKI+G z(%}7is4hjl;aUj&=DvZWDPj6T9cq*}iCB70z5iR-u4q3Hczp+(LPOSho-@ZDBN%vX zGSzN(GOL}*Rpo_9sVZZFtUHBIpC3TS8seOluL~8a~=Ff>b&*sL!1hVBLD1S-xfu$qQDt7Q)6>!E`58Xz1lHv%74F7dt}RRaQ+xQt`r)mDaO; zS@43_uee`|Vq>ZnO{Som7^>c1i_S#ioC}-d-+1Z&EIO{h>ymUi1??P%asA$nD+0b& ze5u+wr#BRi_~d@^P0WPlRt{V(Wu>DYH5}_LnL4Tnr}YI5mK2?NifpU4U*>rH@VVi` z2al`0AFZ2l0ySi!Q}sVbay_t1WPB+KAeQt0f*1RXrrRm=0K$K8E10KDJB82)l=1mx z^f{by(>tJTqNU%WaGsbbymL=f0A@)cFNn*UCfTDw5AtPJF*&jnk?vIZcVWVKoAHGk z_U;>SyFv1b^e^EL6W8OvI0-Wt=W<}U4BK+xzncUT54^0C>8U4w zZfMUk`MMbWzFFkUo~0(#H!2{5RKVx9oH3|m%QJv^z8PXxjw6WK5n z3(l^tYeyH)MqWo~Q78?kON;7Koo%kp@$F^L(VOhBm+cR#!IJA8*Sff>AFw2kD!(Tz^4Z;818>hh|Fu=0Nw z@t17iT? zvX(qDJCVnVr9KUB=WbUnpSsZwq(o;v7^`4~U4yjW&qTiq-233adyc8*JGu`x_J6gw z6BZub(?`pz)_;?RV=?%tqs-KK7v0qlP#X@W%gsiQ)9z-T4*s?KNpD?X2a3G24Dhz( z?Zd@iwJrlx4rGcbtgyfkC3){ZH7;{#I*h+~;@Is_)NKvJn5{1U%ox0vdkL}j=KgP( zkBRvk*ZR}ynIjoba(f}Qti?F3)&)RpjKAzp*jMQ94*YMz_ps!2E&K}fO1;%0OcZqU zR>cA3>~ACEtl_}xX^yjf-Psmvt-Af5N{9X77l7B-#HLa@1fc3i>=BGjRFJ>i@5aBU zLVWJ1<}%^d&8R!i+Juu+T*3aS%q5AIgfZ^%9*Oa&lKMxm zC)esyb}DS4+eToy=cP_^jXI*8ULm5a+A9qCs!oZWe*5Z+oYkG;mPl)kbpc1tY*#$h zJ{o?#ueiv4qF%4MLJ#yZ3`cYCrR(Z7m~C@*gjwJ$?sdw^JFHsumK$F83R3(Z0iB zPdWevFB)eI^2Ow>MC6H=7=Klz#V%ctMjl|_GNKHDP$EqwjEuHYc;tM3h!Re=E8R*0 z;BtyYYTRGQIOWI}s7XmuEhT!naVv(Jxh`*^Iep1Zfu6m?gzo^Biy2fPP)k!MV8hWM-%7;4H&UP)GRYh(zq6A#YXuD7OK zhWe*Lb6||aughPiLLonLBnk>FxDQ0Cb&d0jvL38T{r#O3_|;X#kn1yF0G}2&YIgAv zc>gsvrBDCp<1THu>-LR>;Eg27Bs_0BbZ;COwe&-q*`EdE8^e@lDb?n&)hnxkZFc$O zI3VX`x|Q9Ec2>Uj=Q}Uuc5=QSI&Gc0orv68YXg-Rzf0f}EXYJQEqsEoJs_;_1iUIj zd+=DPsB@S0HA&n_+9xg~44YUkDLKynSV+ze`@oY!zsGc!L5B#1aiXZ<{1UG8tWN8p zHg$Yw$?2hsl&|Hg-m5jY$&Ri2sVLw1mhPosB}deiHEB_oBAD}vfTI|mElw0r4p$1F z6*VAsOOE+?m}0-;)hWcXp-~%mhnd^?+?T0pp1hG>lU3%W+2(PjUibEq#LX&ju*hPH z=_~)Q6_7mM)8ejx#&!ENy0IfZKDpnw%Mv4pg@45tpZ45r?hklvyo`&mF?%o4Xnikr zWK}Nu0N*IV^z&Om7qw^aznA(Q_h?A%*HsAtlg}4t9^gu|@~$Ir5+DP>zppIBWBMC8 z_8*=wJYQtckKotXcrimHC7Fa$22^Dh{q}`w-g8F$M+>9*=ylpWvdR!L=}^vx=LB~d z&{+PyZPRn}$3oRTG&c=l2Uz$M>jEe=CR; zZ5yN)T1WTS0NbEt6|I4MHuZ-&Ced0%O=de}nKWl|Pa(F*feVPwEUt6;HXxFiVr-}h zBJ--iVM2di*FiTko>@9*laM2z>l%XCrs{nWkR>0T&BBVC>@~;wUwNf&(QY}FS3jnf z8*STi7JM3-TXF6Q8(7}6;anW>&g7fF5OmhR>~Op0(>J>?%Gn-y(j;V6?~VVe{^iis z1m=)cbNO4IqkDUQoVhzD3E3HKbS^9qE+?h~Orwh~6GU22CspNARoFr?fifK?ahvZ~ z7$$cf}{-)#SRG1}?Z ziHq81BH(6w)@E+nt-R%*%xt6WrAwvV(-e66qw#RToj(iw(1(a`-k=C7`}OsQ-_t}A?`V}$a>KUOBy=rH0{DP6s2Tcl=6N-A?SOlev##5< z_6x;Zk2-UFoS4LA)@#S}v;Q-1T^M|@{Is)It*|RSz9s$K8}02rkkCW@FKB6X_Q|hx zX2J7|rx}AqCv3-bkw=>?E!=%g&FzyW8b8&8sTaQIYv13_rUDjh{kkTiPF9(h5F~so zFO)o*o3%9S5IIvlj_74Wf?=92oOJZb9NDMCi!qp6Bw~D@Lt#)%W7>%T^~#!4Y*0=Z zPmCbp%?^hzD*B^m!-{ja7;J`mBgQR07g~U{E_^P;x4}J>!So3>~E=iaK5AC;omFnK( zRjChILni{yYg)0LM4Ea1xB2R&-6Okl5t$J#XMv$>tom(oySu)}pC1Y%AMX7bk_mM< zJNO#hwI99RO;~*F3MHQ|_;u8FALf#l9@_`X;GQ?;VWReRj9o~8iIk^(?O`j9*)0XOX7Rl!?~sjjH2k(%&2_VYLm z|D?A8_Gx~bf(qvEa%maY?gFx#z#XN7kMnPNAVE&ri)~LkEr2rqDXaq%Z%eOFWPZnb z8>54~G3tci6d8wg=?p*h@ZLl})7*vRy-a&&8(XT!%3S^4TU);e*g~=dD`>S!!8pj_ zoajv8OqO{CzT%L{dGLvV3vpnBM(T~0?qfCXb+D*hlM%<;(twkw z*2FQhdozspE+t~ z)BdQ^OaZDM(=HHHGB zny|j2EWWqyTc>MHi) zG)OS&ppdkpFDSa|jG`t%iMUWfh2@vv3Y`PjZ?rvs&nx$)Ia4|=IAvh2kT9*{ustLz zF#Y+a(G+ALYCJ&)xve*04TMt@ z$yD{AUId}g`jCynu+j)}n*JiR|LQ8ZixAA(^5+NR#9BggYtz-wxbvU?#pMfxBnU?O zJN;E~Gs;<+={bH!GFaCTJ@}xgu`0r<35sTV8^s#qNE%h$bGD{&;9%`KSyb4=Zkb!a z>!R3XgnZ37xRH=+xy3TQD%{cr=fdZ!CdRkrbFQv4zvbhpL-Rx@Rg^|a{Yk-?FzfyS zG*Qj%oVPv`Hv^#tZ8BDuuzvtA9z?y!EHB`kd+PAe5puB3PoRP4JJ(LI=xVG{@BBIt zo#Q?yc~D-_oOhPXAIYc_o)Ai7>^ypUj~_I{YH`sQA)y!3k2|lki!18Tt*$)|qA;L* zex>PmoX(_q1+IC$Ji%D)y+WaJ-+P!pEv2W$pm*u_yFbqE zONa>3GmV}ZfDcf834RzU;TH?tXDdm2sp@VLUra@S=|K-|IET`%|1R0r62>dJ;F&!Y z&5*OMf~Iu47bv-4UYJo>}Zd+!Od4ncyET*gr3*F$blT_`{0_F=9d zH$DyE6{sdy5JKK(B=3i9^vE1M?$6tkvSvvb%}ICBPp$k$yB3=@W0_jX z093c_qiP%`y70)}IBT2L(rULPB_2BiH#;b%GYS8(9oBylg$cp?Uc$oPUUvig7ub`K zqclPG`2HC9uK>Y;FceHxLedIMjB3PzqSqSTcjU*HqAr@{pW)axapgcv>8{ys|A-&S zn>1Wuv6rZQ`MW48?rMoOv?|T1(-s@?NYo!m_SRicaWnPYepp@Yz*k#@lS<<5jL4J@ zF_$o|dPa5TmNo+BgRChRBwh>bWBOX3E{WTB0m{n{p!n|ACMr`qjZ8QG^5ett5)D;x zInGM%Ye|g6qWDYWYa7p4+#8-v3mpWAT>EOQ3Si$MZOomx$A0NqjSZ0#Y{ClqRKEeV zc_hbh!!OsZ>&9u1Cun@=URU`0wq9`euJ&bzqoe$vz6s@@f4kED(TF~JkkjNB;(^V* z{zNGXh%o`U-N@_f+OO%nS{kAsU-akkW0CFqwaEg%-A1y1?O_PZqPs1vD~!UZ8U}bRxD~qAIi`M?udQPi0NiHZ=ID3i5hoT$DGCUEyl??vk7Y+@ezGg z5zA_XI*>2(VyJ@?=NlfS`~1C~ln?hYFNL$mOz!*w6Nt_!?H^O_RP41bN>zT-WPX7& zZi)uD?J~Z?`#d9_e;{b_x~Z3l0$5qhZ#&_-)9>H=moC^}1AdTBaCl?&b+hwkp~!skuC^yz0r_Ywppl6uLMugvOG-Pbi~rm7y& z1bEKSP+9>EaM?o(@LI|ZxkvEyu~tI26c6U`zaZaVT|e)sAuH};z8F001`w`XhregA zwcqBYDDJj3QT}_49={Duj7m`e6>((WyXyut&EW*WO>Ft(%jr?`+ zmHjAxQ|)26HORAe?yO(Bb4NaS>hnWfo`lM(P&-fS>nD9Ff-;YFuEUv}SZWPK60j=c zG*9SIUtCHYl@HP>E~2&SUI5{LQKWh6b5Com>`X`NY*m1t+R+e7?=k0?0LjU3k{iH6dRH59QY5E0(KQ6SEF;Uee)jV>CnH%RcwsC zpRgOwy0lSP++JawdFPam^;`10`}@ZC#CyuU#9&f)Mj%K!-YV;jESCnXK3D3|a42<= zWmsced;CaUnM|mckz%k;fF$bef3Ts3mO$$PFl1=SNF+-rvC-neW2KPF+=sZ%p$W%KKY>kR8ysgGxJ1zI=ok}D$zX`hO~TXpcW(+}!BQ3HHG|q>6Q8d&PtX{I_95_q_oG1I*j0p9};NGJTCBA3?CQn>{kN z``ecHu!MvtVOgo%)+h_)?YCjTXW`>GX|ubRMg8l=w>+q|HVMqLV}6?xhImBKeABbN z!ic>9=4&GcH4ZbH@&M}f+*I&pG5~N~=|KoSKt~D>2-7ap6gfov&X@;~PjferORaQ7 za+dvzFH&=%I8jNhR-sZ0b7{2)ll|9wW5Cj^LTVCls_>W(`vHbc@|?GW!bcUo{d9p3 zZ@v3Ctm+QPu^P#8EcEY0p)+9`n}_=sv%i8!i`4qfBA4!%R4@$r%JXGZu92USxdC44 ztd`DGA%KbFY2A>~YOYK^8)zeE>na=4kI8@Muc6F{D9|h<73-SyE~ZJql3X}2`VLIaVVeXtT|nCa zYd^y_u{4)I&uEQ%>okf=c!VpNS4&jR;!!lu0}1>MwVm~@kl8Ksb{ZVZrr)IHB8%XX z4XDErtqC%0sl4S`AH|3aoBMFDu&ny_7~B%PSLMv2HG^MlGC}Y|uKGaGGtlyCvC@zf)^IAT|#LMs%ro$|+dZ~b9(Fc4?9 z`>u9zdWufrmD6hUZWIJjL((7N5TxDK&V&rh#fbgxZ7e+G&m%$;#ksh9@>eWQ0$8Zc zaY^t%h#1yw+2BOPBP^_$=@b}vWH7`o)wLqpkYv4gg;38D`RG}@rQ4pm(HqYs+OOj-Y%qH6E@SFT!7$A7&pg3 zFxqeV)cQa15r;qBC9oz&v&|Nu&p8d(St^QlWqnj5pB#m%8g0!6+kd{N&9sdX*T?kl z{M=3j`~(`{c|RTKfZ+Vf-r0XV{`@=Hb#@(?3NA8;ZPB*Q@h(46?jitsX-eau5rR6J z*`zAiry0!^?_NAD+1QVTMB-^EO1V4(kDR^awGJl5jgub-Ol54Kw~Z}c2d`iY1ZObw zCFUg}HLBNvz-?P(q1l4}2P0m2qNBG?WsrvE=;US#T$BL~Aa4xcII@l6VNDG$9^u}t zE0dI`R47_xfGc=MKz0^p2hAVe1{ur#iLn;|0*-I)J|n$>9HcQ%#ubmV6~zPCV5&tN z%ZTf;R*Z4Y9`@AUSM2c4t+Sm_@9t$1CpK*>owalf? zl8QU6M~BnXZRujEuPI{>h3n>xzBf&>h+;)c_-ec7`8#mYn5#-J>KghF>wn(YyqjCA z4Y&!piydhNNKa_s9*<4#JU3?DjN09!$>&UHpxZFL6=)PsWrn6cFNS@ZKXfnYv^Rem zKvRL;Kky6l;X>tf@#mVX*DTUuhkI^Ze+1-;(U>ZpKH47fJ}oF;7ZHMLUV3y%+7gU7 zpDL&RRQ8^GVNJtuFh;zs0msAd2gI_FlipiEP~Mt^*03T1VHSzby%1-l=|KsCURdX% zZ^b`&d1{;dFxEePu!K;kO6Zj8+*N+o*nPOlTzg;hOKvDYJfg2c(d@Jn=-ZPS7YX0d)>-a4$u-^vViba zL9{8QW+U=x&%2^1?n^~s=Z|)ISUtqis(9qZJN$Ai^Rf*3yoj0&M^Knw9XHA-l7v9~ zp)w4Ky7<1{F<#yMU!kDC;LY4k=dqt!psNxE&oE08sEek9f#lpkb?5n}{kK;Y4MyIr zIyYt^vB#H+W`!BQHyNP;R`NIB%;dd7yEnM!P&E#s#!2|H&4kfjYxC&Fb)YHKfR#ZK z|48+$r9)D>!ytMmNjN5p4RNZ(3AJcFbHU0vF#f%oy3mpcZfN=(#nnjrX_p<=JQPVc zRdTY|=KSoP&c_cclkT8-2R2Ta)On(4HZg{u}9*3=ma|!wT zLS9fW9N&Gn2ZKv~I1!QW-aP%nZ zil^fVa+{{-q1KCg@(1+jhwgi2(Qph^ahfNtQ9uZA2WD6PzN`u*_~xqGi{Rc-E>R#W zwwdnyCWz>P&S}>OFQo3#py@s;!)P)EK3*s&(QiE(e_{@2Bxh5Nz{RYP=1p_X&!X(9 zP3JSW^tM`?18HH%$Dfuewr;9txnhGvfC#Vawc~6MhlCQ-=NkR!Sr@U$vx?_gVyR7g zHC(508t__~cbv}uhzCR4Y9oSs8&94<5L2v)?Z7+q2kf1YFJoTfsttagvmMfDoZiWd~>HY-7N|dxx!in*5-=o`1_Awd(WZK0K5(dYBo_hK7k}WonBX; zI_voVJ?x)V>;ejyIUeM8sayEct;9jh8rvWT)*CPPR~vzpr1MBb9Xc5A&B=5os(BOn z$dPALHAt=L>W+f_xL^D6O420EwRt+nT7p!$j$RRSm5=_=ekp);REm@QjMx7SkkZ0` zqj~*}2Glgkq+E9Qzn^A;$lEv`K@G5K4xPBrFJW1cv{9X=w|zb@BG-^EZakl`kp%W! z`}4*8?|bzZ>m5VlDbu;nZN2ntYI{LfKI&?|JGGm^n2h;7DoVa{dSje6Qe9;Pm&RbO zsGb-vF|R82>c+z<{h=fKpuHsFE1H6y)U}Xv>-Q%DRoL7#z|jS;1U`rrD8%hV$fP@< zjpXk)a;#JLE9KX`n(1P&)XElC5f0y1DN=Tz1;~4}trC73MeC?Do)~8T+!*rw?*#`5 z?`Hb?O`pslUG|yD;NKt5*cTfVj04=SVKg3A0`3By0!QNlR^R!mTWds2BlZ9-Kn-AB zeD|mb{es^{H|$8A=TEMA*-4a2kz3fK*r2k)@CsE2apKXr2A{5`^3gIJzTf?8<6wUD zQ>UpXr3(+b0vb;N!Sr zDlP}b2%DtFtiBB}^y~OC@+h4_D#s$3<^_Lbj>QIPW*TPuhZK?K@35+Jyl6yzFKcu} z6K#MMR7!$11Bhf{CSS+qpvcB0`al8JxDu=vscQRC$y%qNUamr!NvKMtXxM9Uu@DQ} zMgd@<)Grf;IE+s-z+-ik1ql=YedxY&T^AeOjU2qMah32&3rTTLZbsU%M%}+3p(HW{ zwUPHE7XcAk*AF7krc}233d>v@qCj<1d_l(}^cLk|2fba|yWoCEV4lp?nC~Ok=)RFZo)+<%cK(#Br zyoZX-H_6kwTKp%ihtF*A#)Bopbt=O6-Pl-oSVgl#7I=-9<)<-H!jva53W1~VI6LZb zH9a~yq1*seVo!nlu}g*UGK)|jwb~XNT~Ry@)w*DtS#Zu8?AZU6AZ6Xqn{3heqw7DB zJC|CUo5}Sx6PNk^-uX7RSIWjRKu`iXGO5_Y;;zBX15&1~-qX=*BOKNa8G#psPd^3k zb`I(LEpQ+jT?bO1hb*6Mzv`H{-fY)dmCCf<6eH)GQHPWfB# zLFo5ObuA7a(HpdsVJF#YChT8q!KcHhVtkmBoK+u8tmu#XIt>m`pnvHqLa&$2GkTq4 zT=$mY5#p}cqzh~+;efk3H+NCp_bX9SIR~r*U}jvTR_)d{U0~)Z^?ebba|R&gMsn1n z$i`K15-J&SI8!YpWis(?J&>~_-+wV+yM(^XvxT4bc8?f7@3*xth!oif2P@a2qfWQx z2kzJ}aN7VuvY9}bGHe4?fO~a<4N!$IYJr1U{~-%Hh`WZg6(VVGI*I?J75|BjFV6(3 z2K}_w@cOWbs?$T3cQ7v_{t<)!MqYsZdGLg401Z`POwB?c#G+*Y)?)({9#*}M@h0y5 zTb@le@IDgVGX{w*7Ut6fH?f!XJ7%tzF{CBJGf^?o$D1ktSfx_tph0)|{j13EP*AJ} zG*!qkEv0jMN}&ln3@1F;FUA+vo(ZA+*U|u30+63AhM(X}rxD;{4Im^U1e@h)z^dmUM#)VM!f%NvEo#QQcxiSAiNyD&-6$YtoucdJIE)o1jEDt`x zk?Vysa7o=Lgst5-^-CYPZHEBCIgzG`G!7cpL^SLhcR#mZm znHtb59tN*IJe+L?S8!=&_Nn;z_BRZmf-aGN&9u_71wsb!~5U1JyHA zgz@l`_nP@~^3^C%!{;cvIHVZf^|FpY=4T2E%EvL0nuv%^9=e zsnBfzTPp2=AEg7Veyp5`=#(%l3OT?py=NkFyJ5u49fBBKKj&fA-X+bP%ywTx6w=Ai zVEmZkTvFYorn)7PY1G7o9jj)%=*Aw`JlWC;MP?*y-mXiDDQW`>12aN<_1|kUX8@9= z4WRFMUBbO*M0xV=y*QrGZ!>Feqf89QT)9u@9L|pcvi*!aIi_?|M+P{ z7t{-`NmS8(uW6EjZTYw`PvP1fi{nvrR)+?&07PZ2ne;vWY-l28;CD?gNr$ZV&p;Dw*tCmjw0%w zfdE*ym7_&S$t7}E!j(8C5u{BNvMG`aI;XJ$yyOKMq#j8DXXHdBh1rO^Uo!5aUySKM zkFP*COW`~qMU$Z-{!mb*^Oo|e)X`B!}iBO(FJ@kkSrTS3TUr=X$mwqAPjz;@7)JW|6m1# zuvztZ=csCCq`n(s)=$3jq51Ku$bHA5_nNg2eS9z}r3plADKmEo6m`!iw$WR=O>tn$suzmoDF#`L=FD^d%Mx0m*z;3iq{&0F7_+~Vz^KqKn&(0nfb?+i09HM(lMlQf^`T#|gOVK2B#SfN`dCBPich^wQ5A6)Ua zv^}Q?Ez3A2m%6NVW~;{ctB*vRw15vAgxl!u#TQlke3C}AZe3)DNDeyil$@`tPWSC0 zo{_&&G6qAZC;#q9t+ga0J|>CQWem^z36vHKDlSdfyjAtmgSk<;d;DLNDZ({R_0vuX zP@zZ%soks(XUPyPP~EJ?L!zjoG|B{!&j{Ta31?_{ePw|DF@R^OG;?J*pW|+1h~uXp zwMjMFSy99G8TXU0lr~N3y}2o6A8TrOR+KflXv7xeAFCf@?kk?z$Xx_Ky*tL6{@7DZCAux*`C^^R z$)A6Mw!oXA%)re>%;ui-aOpeu6rz33h5k50{u31y`Dnx(j02SY@ghaz+`nd>zAbFN z=bwEH1#wugReA{$pw&$^*b}_$b&>7`>e`XiD|0(_&n$)~Z=L3)!?}4{_`BMz0 zk(yq(KK+z*?B`!!%dQVn86&NIoyZGyy0>cECj{Sp&nuheOP=AT1v250J&#BqtIgSQ zEo6#3HsKH$A#+z4}Jafx7M>iF8u?y9H{N(>&#GCWI+b) z0klZ(YB|Oa%wj{+l`!^qte@YiNC2b}fblmn3a+{76;=2zEKwqc2W3+Qn;h>ZgJm!N6=LIT;*mkw zM(^FA(L%yj%HHaCE_;=?cbDv@+2kT4yZ#*|S$`{__0ZheJPv{{ zt-i5W{QgpKWcoMh@XLQY`r*5u?obJ1KXx=Uomr{l#~bnXRThE&y_>%Q4YmSU=fcMj zV+;o`H~!`tYb$@tmck@kywQ^7g~lzYZDSR0+d8ars}sJ*@7IsXvfUzLX|_AAnXC1J zg-H+Iv&h)AjX$)kq8=)Iqc5~*Ok)q-p44Z*bR@X8M@!V6BwyfoK2Pk-dUeT%yeB!< zZtcCwM7@$h(}yE4KwL}NcGS%pnUn7k2t?J+CV6yuHJQos2aLQwxreWi ze1t=fRx`J1K-Y38x-*&&{r8V2pZ!Q1Rh}But+IDnW%T_0GOU0;a&p`nY}$Cm%*W3L zK1C7Yi379rh|9kCTxyiCeLdCeWs^YLe$N`=-P2!6UNWLN;EUSt3#aF&0vUsOKlZ$6 zkFyjD**9^SnN$hEwu;-vF)vCEmJ3wGc>YOHXRZg%vK%xv!HXm~4W7fqkb+x%Nh2o8 z*Ups>6NYx+DZ!l8wX&5GMpq<2S29uoY0;gp+8s&snu#alGedSx1Mp&PqePAvOWNtAnI6KE?)BfO6cn& zC~sj2v9Er0e(8I+in@ukSfK;lh9Tw>oCO^+Xx zh5pu!5E>nwbmc=SUQD$1y`t_-{GfSsmlp6Jf|2LDP z;J-IGbN8M%KJDoRn<2_b(}S|Go!43({XCbc%~5*^aTuiX0sQ~Sh3@Oa=)iP&gKaTv z*7ZNk_ajw{Pp4aK-Uw@bww!Ra0@^QkbFCf4gwly(U+Wpo`_YOcetN}Zg;9F`ue$U8 zXY2jncoK=dwUnyZ+S;qB)(A!IRn%xvwY^cbSH!4M6s2kvwW_w-qeQj#YEfI#+LXi& ziR7ElpYeU1AI~rMeIEC@?{lu#^SWN{2wMK1zkon|dABiR{(HrLeuuQkRXho7G@=7I zilhjV%Zxx{i!dY6NXIuNiHTdQn_Q5iaQ3^#o2sfWkuegZD)oC|VMYOrX3?yD&$u;_ zp6VSkB1pwN+?^EruL8nFPmYP7GsH;$>}rnn;jiiMc$-9rYlFH(Yb?aGJ~z)-wv2vh zKeoJ&HLgCOE0W^FT-}L9H2UbF{brvI>3w&0I7_uv2puUYR7UI!Kw`)K1Q<~!t3WafPGQtxu^5>jR zNP-z>eElz9a$$R-a8Ydwf#FHv5@J`<8`ADMQ%`_>Vgr<-44=~AY)X3;bj5u3!)bv2 zR-ii%>ZBqIatYnkij7JvM3)b92g(kn!G51;#}oPi9-17vB0~+Ji(WvZLJu3jp&=o7>oovh&zs|SX&oXkn81+MJ}CF|s429B;OVVdxo)@^Z#!NR zV8sTkn0cEg;~1OQa{1ec8}Ml`@&Se>AHSPDh_^62_|3FCjC2k|fiv_Pr@Lq0 zwM_2>9WxLaJ{e@=w)YNeK4aBzfOoa@=GuUA-Oq<51Vc-%8>6IBdZ`m^Qt{c1foy$y z$#uh1$a+WfFI(U`oXyN~-nR`)3mM%vn|wJ>#Ud=l*i2_Vl6`&4==bgZfQ5Tvd#;#? zsS6Uxgs{m5AP9Wa0I|{;XOdIT>vlThXpwCwO2`0*%pzc#qO1V0g;+H;(RvUq-^zW5 z>v=cu_zeX4YzwVcUbYU7BKx7p*{F%>8QI|~`EXGE?H=%!`UAu2sCw|7>c%r6tbkIi zDMAf1uqmN@IB15meJp76cC0{A9C)=S$K(DW5+rK-<1U!@fU%mVdt{U>;RTKExrvVt zq`_E8kp=~+bVkUARyJLH1N>xkPhH*~1ducu86Ghl)`)uILbt{S_^gSh=f8{pTgu4* zCb_3lPi_z?lFgLZ$dztG4l}-)wGWr?@~Dqz@=S#>*1+l7+2#p7#cl{O8F1(_zyA9# zp%E`90dN_8=Z=Vu_FqyWPClqQIrj3ZYi5S38c$%S@k|3lRgauFEdO%j2L0=|TrGE` zkI$fN_1rnJm~)afI8BS1^-9fm$vKZ6I?y$>@V2}bFYI^X0QvDB<64Fy#Ph@K!3#?TpU(@q09}>?BL?Tnj)PM~5=kBea*$(-rIJm^{7yxwcj`F!k0gwI@~|kd z<&q8@DT_EYUC(hRT%hdp?%TE>&8Rmfb;R+2&wlZCLw`tn)IaN0Mc<|!!sJ%f-iD}U zc-D3i4}~Rf7F(IU0EQ-kYbTY|XdGNUCDkOTAu3<5h`EpNIP@ATgqxP4b$TU$RA03S z4<4!cL%t*+e>oQd`crwg%a7+9rire1>>uY6!!6zDV!Z(;;44gJCp7x7yu6-I^ZcA_UY#h4glDap}#x4bG_G3EP z_9m2!Q&yTcK!DKKsiTS}27iNw%b*i;rR;MSH(a$@uAlChpA+@hkEA0ps!@?fOhf^? z$tmVE)mu%1>z}AT5K4b(Yt*6SYXivOj*Qq_{GJZSyjjHnJy50 zaX)LS!aryBRdfC7x!5!<&?89y^>jI;Qi>?y$7=&G&3T>_;wuFMt-Q9+Rf<0O$8KrY83*^8qnMIO_C6 zV6Gfuu&5`eT%_IGKD;DMC)cY$0jjz&_xtxfcFaaz?cXbZK^8JqAH}HTp&B|5Ei=)l zGd%8-1^3<3OcjpChut>Q zU3!fx=YL`pE|24Z*OO3C>)2;lA+Pg<{+}-)qD=E5x|e?lC6^D-h34pm?GkxIva-x3 z|P^sAtzmhgSy9NJTcpbWI2>L4OGfU`7yu2X3WUEl+rtN}Nk++6t^X3bV zg{~>?pl#zA-RR^+!(*!-E?oEZj0c)fPP>~Yt zqc>CVqR_M z9SrZ-y$6f4gv+Lp@_4=v{t9bc*V(dv!;lY{14llpdDAmQoFts9!4I?$`4Y50r(W4Y{zDx=VfWxaF~0Ob!He@a8#g}+(>I$yt2zK`dy?}iM$!G|2)l#siwkJ1 zFlz@O=Qr{%fJIH>v3lQ%4=2){JYZghn^t@*d`?oHDhwfQ5Z>pUd=Nq6BD6tbG~R%o zS9BVJaadTyR6ne`2VA;M*w(fdg&xdi$4|eOce`>hNjh4(6ysfea}CyS$TK%#m}am0 zY^W`ZbAtX_+3UtTFx_sP+;X@!K${}7I;2QF66bHGW;eqvMc>9(Spt4j1Uvjb>Xz6C zb6SKbpJ{AqHDzL-w|pq9Z&E0K0vMtB1bIR5t_K=w-#!|+%HL;EBvbwdtQ>@iJ{lJXtKGV{;F59mn&QjS@*W@j zK&?&9Lt)$|Ao64A(bJ(^gxwR=>wq~kN?I4lK8ed31U}aQRX`XH$lK-NGtT=>>Jb^0 zJ@sqvceiQQa|NO$-~92o@2rWA|Bbgud~{Gsi;$7=B-l=hYYE;jQtM(08Gj_b2RlF8#?uZv0O? zk`MO))B=S8B%^OxH-kdmjY0~AzbZVN^VXFBfcUQkH>0wVYKrR-8Ql^mu3!@eR{AAm z{zQdX)Q%?z(bQwqx#D62a0}nq6|34w<|zyNZ%TPO<&1*97IN?k;~&bWORzgYlS=-w z<8OV{T>Z4&D+mfc{z$XD8npa}@80G2wF~ES(vwX&ob99(xZ&&gFZ{D2>D{ja){}Ch zI!Nu3Q3f6RNav|1pZRb#_{Sj9EF;DrAtD)ri@+@U5+8aC+vu<{=6{q8__XH)`Im2= zZFtQx0Fppcou*xRLA>#~yE?Pb8n|0q^Z4XU_RQ0!V1>|Iai{IcKhY4cdZOj?A;!Dz z%X!{yy{4Sv41YEZBiyfY-PIAsJs(cFWvqI#mf@$1yscUtMX`)8*e}L|1FMm_Klt~^ z*-hjUz035K#yDs<*?8^p&&P;e!NU+I2M4cM@Zq?mAJbpk?kP@mHuZHD5v1<3NIsI^}{ZgbJBdW;GZ>OUu^Tx?fV*) zpjaYEU1!dFt{;GCrlOf^2Xuo-k^at+fJJu1!0%sRmW7mh9Z>m+{8fk1@k5}o|D6$b z8F6GW`xD^35d*WZTXG;U*w|u%Jo9TM`8J(-OwgThfS5}}?t*ybI;Hwo75-e-bT>MW zmGV~4@H;jCxa)T&-L6y9y|`Go=gpOB5qf;R$9+Rpo;AlH^C9TpCy#?SW%?O*RLuem zMV!|sNnt)+D|0Mi&Sx14dMc|E|}- zUKLRN2k4E`u|uoPdZqENn~zjO-5{~R-WR{^+D0vdd5hswvQJw}nyvHzd~CeMIT5hi z%P^PYEot50ud}wu>l;)p76yNvQDaVmqLM$IN)y1e?2bRD698O*$MAz_znK)b(|UoS zSZK8Z3d#qkBKaGT5m&wJ zMGF1Pihte^uCJvC%~TI0?ODQ;ATkWz?a$egL(`@?PzAY}n&%CURODZjsvUA4@mb3$ z>0IrY*Qw0OU(H@;W0%i@uAwr<=L2777O=O>t7nFKNqKBUR$hK`mz@xSq1RlDK3vSlRUR&~ay=P)_~vT8+Q-Xl z!tjZ2%IsV9;gvPrqBoD^+*<{7m8thq1Nu+s=#c$+T0kXvbfW=5u$AAqG2T*hi*t@( zm%C*15O7oIO&J)+F?3&w`}aRXF|tp-H?jw?Cb9lqPqO+#OF1E%jd_r>P>#6;f zdJW$3&3g{pjrcZEva?PRWAUMsU%bGkXy;is_DR0ng~gV6L(ylztH28~>s+ZrqPc?( zhz@^sN!abKT`9~CVuge<{1><3j>$4@xe;BcrDiobB|S{1zUR5&A`z7a7$!#AYUkU< zD1RDj^8w=Wm4Ks6I@lTCu@$n)MR?Q^+?@oaLfoqrbnBll_&qRD{63EbVSjX;F4hUz z9{68q%pZFjFF-Be>qhzU;!neCZH=9T9r5KydJk*fM!ptFd&g8^0V!AiRt=G^6vich zLI-L}_U=nWRWiI7(&7^4{FZI%h4re1p|bzg`144+xo zoUsFthNvz&a$ZjHJ9?g6Wk)^e+&7;hrBHA3h%i7W1M8gG5{zX6`D|STrPdlq%7EOb757Nv|%> zQNA~=T4KALq3`2oyd0ET4Lkvvcp=k~#?-o6_BQLTuT=hku5DJnQB^qUoBfpUAAR4b zrgb{}7`jNqxYcuR*Sq!}TPi99r3x37G+o!hv0%hfRNQeNb=0)1rl!|o;1Y*4#H_Qk zh)7WTnC59jO2Oknj*A0pOL&$@S^(eL6?O`eK2};b1;@M|BZhis7NTuY_UfwdJZ>A@ z%zCbow!}!w9>qS-(u_#onDC=nDO8ixov|w8h83ox7_C8%g68^fh(?B=EC+SWyf&$` zgj`qewQ#p#4MORK^?{&;fWdUv^9xlVZ<7PL^nIbiX5CD_xpI@1a_DZPT6Djw-pSwH zx}YhA6CRwHOAkuz=_@NMyYJ6*&aL0uLy6fWgH9&Jm-3eI-|YgrSJ;sD#;i6BrA4~1 zcrY?r-M35%MV=F^-HN;5I6S}5yP z*xhsUZ(RUQMiF$qo4)kcc(b!ge@pXI{u=W3w%+A(^O_6Hwlo(^yx2FPQfuaZ5+k$s zP$mVUGJJRvg85%Y#mb|=VuR@GsS4WZ-Mfl+u`QxKb;_h30OD7G zTQI%2)qhb$)oycn6pK3F+h_>QIbT0bm|?)#=Pc9{U?Uj!(Djy}VLLA5;f;OEp{v1i zB0#fPFm=R~S`%pe{XBMJdm`z=KH!IQk*%Og? zAKn0P(wF7TEkstoySP|@PAy1}4kdki4{S;2xBuyy_Dg7ebSYBetpv(-ukYovG58I_ zSXQXl>~3V@`B~-*1ju$_RBGY2I(2FIP5dCJr*L2V@Z@L^d1l_LroydkU#27V-xyP( zB5F)mGk5S<0YWXU68O6qW_he31pRPpr$UbzA-PH9W}S=Qp9{ z?N61XLFT(?-L!~V{p@Apm{$yS%IxS!WY>Pvqot|Gb~|sDx`PBg6(X~DHx&;Gm8X_L zFG9KzeA$v7XxeAE<$Ry35h>9HM{TLs40P_pB8(nadLt6=>`!p47Tzw3)YB{&Rx$HW zI?kV_OZMb%?Lriw?KzJ}?t610y%OoVgd^X~JWU4wHxAebkape;R2ksM%Pc%Gq_7x; zk2cog&+B!T!vWoD;ao*L5NOGIhs#Ypgko>6eJc~RmhgNevf}x6k@ce23C$UAQ(dR4 zneEs=7CK~G>iP0BmB{R9Pw;4+Xo=N9~ z2l@SUUnTbMKj)Z&{xR)gVSP|fF=I?L9ulny8X%c5$~j$!o(+EVSxYpJH7%Mp89c~3 zI@uK^f4VrJ5m}F?&&;U};_k`zlpuf8}`f z8fxMYn?x(1zsj{ofTJ5qed>ha&ObDkP`WQngnSvMZIazir-7HtPBRV0de@T-Sk+Bd z=(+Kn!0+{SJL^8bi3k<4;$BM&#@2E7*5a{hkapRj${>f5)Q$T~Ut1>j_lW@FO|V&) z)@K!TG7IqO+7XO0#JyBS8%=-~s`Ys|^-PkJyg%9}@ZE=}fj)Y>#0aT9^YJy+$ zB&Tf@ugd(8;@DQq4&=#|m?GQ#VCAe|3)Ua$dn$_AKT-cGcCs6^)8rL;slv%&{Z2n< zWu->N;Z2y+Xua_3{fQ4WPEHZSC^YR>UryL5-+p6px)ys|6h-%?2`6#6doJ0~zDWjp zLdU!|tBiHabykMGaApTRF?cS?ETC)xBO>^)DxxP$I_h-yd(NtuB^nM$GR z{Qj?)8AhN~FApTPt!RV&#UuGq#Uf;d<^7_&z!|S8#r8qkXJ1^nHR#1WrBH7@YhONp zn2a~|B$I5Pm9?JTOlXQ?O~xX7@&Bta*u^7TpQe0cZF!u)E`uG5TYjK_1AHSB>G{wL=s>VAdWe5 zHCVB($$Gj$7BIK^GD<&KwJWU;jN4X4&z?O(S_}93g5Ex{vLbq=h`;L;^@6ZjrLk6_ zT&_BD!@-Pb3;y7QSGYlEuJ%6BWIv9e{i?(i+wtdrr8;?K%g{!V{pNOugopp;7MJBc z-`e_3h6mNWb~b~yF%#XaTmtTJ{O~zmk{c_0$mk+c)N4rCbPsP*`Faze+-Pp<_NSed zSGG12;Nq?HxQm0ViJGT`UBJ=+5rlA#BnMrKDc4Sr)(;iuc7z(bPzw-307Txcr{3S!P66!m@I`7g^5uoyAk%elp z82&CH2(j}lf7?#QF{;xV^5lx&D;uaoI*+HQ$m7zXyav`Us$%|3SxoZ{ti<0zAg03K zv_wtvfoT+3c$p<^dxih&WoCa*&P>tfC?w%gG$e~nFbexeT1CaX)v19w7F^_D`h?=R z(kDz*=FQrdZyzm16=&MJ?GQ96RAeMHfZS(h+%L86X}ik>(0BN#LFPINsE*b?5gcy*_K`na{yTA%E}4yv zcwgkL@d#MCR|qKbed-<{p=jafr}QNRr@Fu8QQo$_HmHqyS~@#qWXwB)nx9Ii*JG)H zoxj~xk--%9qt!n>%*TZ*v}(xK;>}wog7XruBcGL$*a^CK85Z_B%<)t>D81<(`R5vj zaH0GulQZpI&H=(>qB>T)`W1!iV|+atalaqyxODSOgoOw`dtv>{x)i&^le#im`|Rwz z{a3;iI1AcWkp>`TT7&Qg*ndh&4d5@Yg8_looTx)W3N?V~*aeaqrPf3}Zq(}okYR<> zA{s_6cl0#*&DU^Uwf(=BH(ysD>4zHDn3vyP4rzvywW3I$+7zth@XfPKD?=(Oky)Kz zy>uMu<|7%^Cw3bZD*la9`QDXmdZq)Ya@ZUFsT%?3o;$jIse$g6*({_cYG7P{&=CD3;5un( zS+e-AkFK&!wI;aOJ|pL7 z2oFmt-%df!y?bx8hBdA7jnH#^ z>ac61#pMaqT(?TmRMu?dqR=W}?PSE@vidH(qBrSR1meW5F$6&lCn5%KgVko^hLjET zrpUzL+}!;CFrHKLYId*{S$5o}6=f8hQR#qFCV=(cG$J*40$~tRy!1p_V z9|S7yf%; zjBk6PVvC?{lil$rjNN%?lwUPFf@+~I9s4KpqrlHhq-uUAI^n7V%IEi)Ps^*4<5pb6$HJj`C%F@!t2?Lat8s$~UuG3>c8FJ5jQDLFL&0j<bLPZi2!5~;ylT( z6_DSsv~=un)>dRuI72BL=7Cu_SLsh~N~}jnql1+E`OzD{8~?8T)}uv`xH5v)NJO)< zd`&j!bqkQ3sm}m$fE|_WvWrd|6{?`7z8@W#qr;AiXTjjsi&xfHan~ zf~+*SsjRW}j6L^UpM!n+guN3JP8F5fgJmIIx5)&Uvt5(b6`)>&J1~z$zUe>bv7$CF zk?mxEamZVRn$T8Y@Q(yBA}$@%rFxnx?i&l0BdiaMg`|*$E%H!RpX=Z4ls1CzY>l(cnVPc?=T=jLP$61X)- z_<~{qW>Ck1h4mBpRXbw9p+nTRV=1ri^eHfWaxLCo$(2`i-?6?iGashKfw=c*Yn21Z zf|HYz;iA-5G)-C{%Eu48yy7dhX)>==WCGjfSC?>L+zZ_VE(No)_s$ov;`Tlpqy*?D zftM;Yt6%yh&A)J+v9oglWl%)RXg;b=MnBwNobIM5P8b#_mt?a2xt@Fvc96@x_nAVk z$ke1!D4vqC?hlCj{+@)VFBD1>9V=&NKKo%8D-btPHYEoi? z8el*XX)rkUKqC7H|Ls}To}5?VY+w~*oAp4WnV)kZhesqS=KPq#H;FMSs3Fg2dd;It z-50DKU#EKC0$PK_1%SU?!2L4h2(S28s8`h;RHTZQ%hOdb^^OZeRBj?ZelyFRD0jv$ z%uslRxM{t+c2%-;yLFjfF-*vbHTP1rVx;nN7!({rS?N7c21+Ja1BZgzJc~6%zjHkW z8fhL6)&v;?LW^hbTpt-#I?b@_OOB}9V9vHR!SX0@;28+OE9Yk+;B?5ooW>y4UBZzB z&6`)tek1Vw87~+^TS(!Q&Xpd6DpxJS5sH#2A|uRcRw97ctzyUN>qkNp?=Bh$^F#N1 zQR9#Zou^Lw<~^#O-y8_gIcGv8Lz)xqs7S?Ib$QI$qu38KBxm@<6j2LoQhs@a%5|p8 zWYe@xs@0}L)zSZ>pXwQ0f`N*<-ghLj5=%7_#r~M>6j*=FS-LoI&85si_XFU0B5@(! zVvKVfQ(RHrJtB<}i&j&bw;bpgQ~h#kz1G9c?gqwNZx$`j(hyU!2_&TtvV@u~vFTsd zSuys9iw4u^R{DPt&gDIkyg_OH?zD*E{02T>5oeX!W8WIjQ|J-#JVumed3_@o>#$bbDqps@;EPWyZZ}+$Hei zK~vBTuMgkBUzVffcKLm%9e&+am?4g(!Arob?3y`o6GsFl)Q4NEW0Y+e%$|!=bsGsk zcNs<8JCC)2dQHTNnSHv2ht6quU*cf~AP-AfGcfKwa^+WS&?%Od`AcC^Wa>Q@S0K!v zF5L6uD3(R?Rk6Pvn?N=e>v^VK6D9NBUYmZ*XleVuq`k@GGqFFJ*1$k-Zgrf}w6+5< z4$~SI#ht|(^#;vh+W1P(;Y_cr=U1$KV;-Qs5jAR*K4lICm@xup6ldC3QnIj29d++p{(6`EsJq-T}>lzHjlT96qnNI!hNI8U(%6Y zwE;4e?I!)_78O46;cROFu>Kpld<3IhI+@7~k>H?}(vES}5Kg2q=)*Z-avI zE@Ox(l0d}~GQYLUvLrpSip5Q|60MWY0tU3@&Mt3-hT zjW_u9F%j@oa!@M~WpSH?dZNINx%L}q36hG^!c~DMuhC5>2tBX#$@y(xh_ZKO2Jh8PN0$*VD94Cpv%S!74Xa&yin)dULQ$V{%pA*&I$G&V9y1uL{f({L$!-Tw z42eStMRuI{#7#JJK@a(cqV|VtKE#_*_vmiw*Oxqr=8_Z%uHx}YV}e&%Atyn4nMtA< z-a8Ue|F!bh<+n0Urg#u>T`mA#k0ZIg!pFmT7SoTepsK`>p_B30BRT=FYPa%KKqGQO zwf4r|_$Yew!dqZhQv2BZCfy*c69TQ_;-QO0Yxb_j4TA9R~Ohhnx_V^hy5 zmllj4XN5P)U+&N$?=0V_>9{TsqfLd_y&(MBxS%Xxd!aLNUQ&33C{|`G`MX9#_USWk zwBx;?<0@)G{ZerErURiW(ha){c(VpE&@1uHIO0exCG z=_uIdD1eJ#!2EZ^wfOz)+^TDb-R*<_HL8$G11M4v9^amrducr?8U`0B|4yTG!zOLg zTkkJ~70B6puckw;k%l9qzigNJbThS5yUydND}AAGNb->=KI3fnZ>zoQ@6ETqnmZfea(2~G{C`xXb2@Dsz@jk=*usQPwZFRGG*0zr&uvX&^&?#MGKoy>v zSdi>LR3ivOJpoYl0I#FYi&*H2sGUGT1(uubIa}2GYmH54F{=A4-`0puyKI0uZt1G1 z&9ArDdShX`^f{n#`&F^5ES?VKl5#%F{+c61Nkh27nU$83hATrB+~;-t8YeNk0JK!p z23hLLWG;C}41s9VmsasTYD|0wCJNw6 zmVn=Tb;dM?=WT|d{SN8^V05Du=F}rR!9Q$LePisZ&Nr6+=_~dnf6J^#AZM-Um%2vP zWU7kTFq>niRMXSq=JB-ZtA^HBR55$JEhm_|T*7ySYl$1Po5B-QUVGVg*KY}Hva-e+ zbIv^H0AJjGmfcT-liqEd9W7Y1`_({*KQ(@G(|*x5>xUSiK>h<)3c11&bR3}LOb8SF zGrzpIlF;*sasqhw7D!ZiiK^LbYp++#ZfU~=>z`Z0PE@E`jgV*Mxv>DpmR;uai^Mz= zNXI%M!>a=u@U`wI-r&{^HCFewGD>awC-`M6&tOR} zHS(b?ghVle73Jx`HQ|H?wU$K9(y|I@upxif)2Q2^nDXsp*3qt43Vs9>i?sBVy6{?MsSn1XQd)|-497tDeRupxlYtr?u+$<@|dwD@9GSKmU9 zh)DYIi+d~D?SWlrO1~x=I@X)YTD86C#j(_uPc)Ytw?%Dgjxo-99C5Yk*+y%MSybCH zfRhA;ZGAU~D0yDGTM4{#EL&clU<{RNxHnG^HSyT*_m0&7k;#ZmjNwlO%8lZah{da7^rbRY#Zt*rOps8d|aa;|kP+~GOZOAeGo80+8l~}Wg zg91qAFv2TP9a3Tbb-lB>$# zd$7ewS&#y#{*r6(d!$KGsOCQ_5 zeYl+&;_!VuQTk1b-RGw3S%dWN##AfmMHau*5$Tb@DxYgp* znnvKAGcN0pET-)L| zi~@o_Q)6~yg_gD-T(tK&FI34*4DI<|*c*Wdj_kL|5fwFmbKljhF0+cTilhkuPXw=_ zC;)cdYg*C_?5hAZ^0nuS&l0g^xw*+BxN@C8mqMpOP~PssuuaU@B~QZMzMbXdzEatm z<>y+A>G|Tw+Adm%y*)q&8Z?F6TRNd%lg!F%aGLG*-o^px^_X9t-QEi(8StC0S$}&FB80$dgK=^FibZB`;;vO@ z`o5=6nALfNE|uu>qW`yC_Fr!dJxWEi^{=iqi}AQg)EgwCFyT+&jZR(77byvUia&(5 z`$3$dBM00~1{~1NqRKqWNVU3&Q}6L2p!b + ovqt_plugin_bnp_manager + BNPManager + 0.1 + Krolock + Edit BNP Files + + + + \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/CMakeLists.txt index 3140f02fb..927e35eaa 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/CMakeLists.txt +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/CMakeLists.txt @@ -11,7 +11,6 @@ SET(OVQT_EXT_SYS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin. SET(OVQT_CORE_PLUGIN_HDR icore.h icontext.h - imenu_manager.h icore_listener.h ioptions_page.h core_plugin.h diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.cpp index 68e28429d..d82cdb63b 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.cpp @@ -78,6 +78,18 @@ Core::IContext *ContextManager::context(const QString &id) const return 0; } +void ContextManager::registerUndoStack(QUndoStack *stack) +{ + nlassert(stack); + d->m_mainWindow->undoGroup()->addStack(stack); +} + +void ContextManager::unregisterUndoStack(QUndoStack *stack) +{ + nlassert(stack); + d->m_mainWindow->undoGroup()->removeStack(stack); +} + void ContextManager::activateContext(const QString &id) { const int index = indexOf(id); @@ -85,6 +97,11 @@ void ContextManager::activateContext(const QString &id) d->m_tabWidget->setCurrentIndex(index); } +void ContextManager::updateCurrentContext() +{ + d->m_mainWindow->updateContext(currentContext()); +} + void ContextManager::objectAdded(QObject *obj) { IContext *context = qobject_cast(obj); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.h index 7a3658fff..8151648e7 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.h @@ -26,6 +26,7 @@ QT_BEGIN_NAMESPACE class QTabWidget; +class QUndoStack; QT_END_NAMESPACE namespace Core @@ -45,12 +46,17 @@ public: Core::IContext *currentContext() const; Core::IContext *context(const QString &id) const; + // temporary solution for multiple undo stacks per context + void registerUndoStack(QUndoStack *stack); + void unregisterUndoStack(QUndoStack *stack); + Q_SIGNALS: // the default argument '=0' is important for connects without the oldContext argument. void currentContextChanged(Core::IContext *context, Core::IContext *oldContext = 0); public Q_SLOTS: void activateContext(const QString &id); + void updateCurrentContext(); private Q_SLOTS: void objectAdded(QObject *obj); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core.cpp index fa61b5700..b21d934c8 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core.cpp @@ -17,7 +17,6 @@ // along with this program. If not, see . #include "core.h" -#include "imenu_manager.h" #include "context_manager.h" #include "main_window.h" #include "../../extension_system/iplugin_manager.h" @@ -50,7 +49,7 @@ bool CoreImpl::showOptionsDialog(const QString &group, return m_mainWindow->showOptionsDialog(group, page, parent); } -IMenuManager *CoreImpl::menuManager() const +MenuManager *CoreImpl::menuManager() const { return m_mainWindow->menuManager(); } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core.h index 2613a06a5..f34dd6ae6 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core.h @@ -30,14 +30,14 @@ class CoreImpl : public ICore Q_OBJECT public: - CoreImpl(MainWindow *mainWindow); + explicit CoreImpl(MainWindow *mainWindow); virtual ~CoreImpl(); virtual bool showOptionsDialog(const QString &group = QString(), const QString &page = QString(), QWidget *parent = 0); - virtual IMenuManager *menuManager() const; + virtual MenuManager *menuManager() const; virtual ContextManager *contextManager() const; virtual QSettings *settings() const; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_constants.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_constants.h index be6e666a7..18f3690a0 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_constants.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_constants.h @@ -23,95 +23,97 @@ namespace Core namespace Constants { -const char * const OVQT_VERSION_LONG = "0.1"; -const char * const OVQT_VENDOR = "Ryzom Core"; -const char * const OVQT_YEAR = "2010, 2011"; -const char * const OVQT_CORE_PLUGIN = "Core"; +const char *const OVQT_VERSION_LONG = "0.8"; +const char *const OVQT_VENDOR = "Ryzom Core"; +const char *const OVQT_YEAR = "2010, 2011"; +const char *const OVQT_CORE_PLUGIN = "Core"; //mainwindow -const char * const MAIN_WINDOW = "ObjectViewerQt.MainWindow"; +const char *const MAIN_WINDOW = "ObjectViewerQt.MainWindow"; //menubar -const char * const MENU_BAR = "ObjectViewerQt.MenuBar"; +const char *const MENU_BAR = "ObjectViewerQt.MenuBar"; //menus -const char * const M_FILE = "ObjectViewerQt.Menu.File"; -const char * const M_EDIT = "ObjectViewerQt.Menu.Edit"; -const char * const M_VIEW = "ObjectViewerQt.Menu.View"; -const char * const M_SCENE = "ObjectViewerQt.Menu.Scene"; -const char * const M_TOOLS = "ObjectViewerQt.Menu.Tools"; -const char * const M_WINDOW = "ObjectViewerQt.Menu.Window"; -const char * const M_HELP = "ObjectViewerQt.Menu.Help"; +const char *const M_FILE = "ObjectViewerQt.Menu.File"; +const char *const M_EDIT = "ObjectViewerQt.Menu.Edit"; +const char *const M_VIEW = "ObjectViewerQt.Menu.View"; +const char *const M_SCENE = "ObjectViewerQt.Menu.Scene"; +const char *const M_TOOLS = "ObjectViewerQt.Menu.Tools"; +const char *const M_WINDOW = "ObjectViewerQt.Menu.Window"; +const char *const M_HELP = "ObjectViewerQt.Menu.Help"; -const char * const M_FILE_RECENTFILES = "ObjectViewerQt.Menu.File.RecentFiles"; -const char * const M_SHEET = "ObjectViewerQt.Menu.Sheet"; +const char *const M_FILE_RECENTFILES = "ObjectViewerQt.Menu.File.RecentFiles"; +const char *const M_SHEET = "ObjectViewerQt.Menu.Sheet"; //actions -const char * const NEW = "ObjectViewerQt.New"; -const char * const OPEN = "ObjectViewerQt.Open"; -const char * const SAVE = "ObjectViewerQt.Save"; -const char * const SAVE_AS = "ObjectViewerQt.SaveAs"; -const char * const SAVE_ALL = "ObjectViewerQt.SaveAll"; -const char * const EXIT = "ObjectViewerQt.Exit"; +const char *const NEW = "ObjectViewerQt.New"; +const char *const OPEN = "ObjectViewerQt.Open"; +const char *const SAVE = "ObjectViewerQt.Save"; +const char *const SAVE_AS = "ObjectViewerQt.SaveAs"; +const char *const SAVE_ALL = "ObjectViewerQt.SaveAll"; +const char *const EXIT = "ObjectViewerQt.Exit"; -const char * const UNDO = "ObjectViewerQt.Undo"; -const char * const REDO = "ObjectViewerQt.Redo"; -const char * const CUT = "ObjectViewerQt.Cut"; -const char * const COPY = "ObjectViewerQt.Copy"; -const char * const PASTE = "ObjectViewerQt.Paste"; -const char * const DEL = "ObjectViewerQt.Del"; -const char * const FIND = "ObjectViewerQt.Find"; -const char * const SELECT_ALL = "ObjectViewerQt.SelectAll"; -const char * const GOTO_POS = "ObjectViewerQt.Goto"; +const char *const UNDO = "ObjectViewerQt.Undo"; +const char *const REDO = "ObjectViewerQt.Redo"; +const char *const CUT = "ObjectViewerQt.Cut"; +const char *const COPY = "ObjectViewerQt.Copy"; +const char *const PASTE = "ObjectViewerQt.Paste"; +const char *const DEL = "ObjectViewerQt.Del"; +const char *const FIND = "ObjectViewerQt.Find"; +const char *const SELECT_ALL = "ObjectViewerQt.SelectAll"; +const char *const GOTO_POS = "ObjectViewerQt.Goto"; -const char * const SETTINGS = "ObjectViewerQt.Settings"; -const char * const TOGGLE_FULLSCREEN = "ObjectViewerQt.ToggleFullScreen"; +const char *const SETTINGS = "ObjectViewerQt.Settings"; +const char *const TOGGLE_FULLSCREEN = "ObjectViewerQt.ToggleFullScreen"; -const char * const CLOSE = "ObjectViewerQt.Close"; -const char * const CLOSEALL = "ObjectViewerQt.CloseAll"; -const char * const CLOSEOTHERS = "ObjectViewerQt.CloseOthers"; -const char * const ABOUT = "ObjectViewerQt.About"; -const char * const ABOUT_PLUGINS = "ObjectViewerQt.AboutPlugins"; -const char * const ABOUT_QT = "ObjectViewerQt.AboutQt"; +const char *const CLOSE = "ObjectViewerQt.Close"; +const char *const CLOSEALL = "ObjectViewerQt.CloseAll"; +const char *const CLOSEOTHERS = "ObjectViewerQt.CloseOthers"; +const char *const ABOUT = "ObjectViewerQt.About"; +const char *const ABOUT_PLUGINS = "ObjectViewerQt.AboutPlugins"; +const char *const ABOUT_QT = "ObjectViewerQt.AboutQt"; //settings -const char * const SETTINGS_CATEGORY_GENERAL = "general"; -const char * const SETTINGS_CATEGORY_GENERAL_ICON = ":/icons/ic_nel_generic_settings.png"; -const char * const SETTINGS_TR_CATEGORY_GENERAL = QT_TR_NOOP("General"); +const char *const SETTINGS_CATEGORY_GENERAL = "general"; +const char *const SETTINGS_CATEGORY_GENERAL_ICON = ":/icons/ic_nel_generic_settings.png"; +const char *const SETTINGS_TR_CATEGORY_GENERAL = QT_TR_NOOP("General"); -const char * const MAIN_WINDOW_SECTION = "MainWindow"; -const char * const MAIN_WINDOW_STATE = "WindowState"; -const char * const MAIN_WINDOW_GEOMETRY = "WindowGeometry"; -const char * const QT_STYLE = "QtStyle"; -const char * const QT_PALETTE = "QtPalette"; +const char *const MAIN_WINDOW_SECTION = "MainWindow"; +const char *const MAIN_WINDOW_STATE = "WindowState"; +const char *const MAIN_WINDOW_GEOMETRY = "WindowGeometry"; +const char *const QT_STYLE = "QtStyle"; +const char *const QT_PALETTE = "QtPalette"; -const char * const LANGUAGE = "Language"; -const char * const PLUGINS_PATH = "PluginPath"; -const char * const DATA_PATH_SECTION = "DataPath"; -const char * const SEARCH_PATHS = "SearchPaths"; -const char * const RECURSIVE_SEARCH_PATHS = "RecursiveSearchPathes"; -const char * const LEVELDESIGN_PATH = "LevelDesignPath"; -const char * const ASSETS_PATH = "AssetsPath"; -const char * const REMAP_EXTENSIONS = "RemapExtensions"; +const char *const LANGUAGE = "Language"; +const char *const PLUGINS_PATH = "PluginPath"; +const char *const DATA_PATH_SECTION = "DataPath"; +const char *const SEARCH_PATHS = "SearchPaths"; +const char *const RECURSIVE_SEARCH_PATHS = "RecursiveSearchPathes"; +const char *const LEVELDESIGN_PATH = "LevelDesignPath"; +const char *const PRIMITIVES_PATH = "PrimitivesPath"; +const char *const ASSETS_PATH = "AssetsPath"; +const char *const LIGOCONFIG_FILE = "LigoConfigFile"; +const char *const REMAP_EXTENSIONS = "RemapExtensions"; -const char * const LOG_SECTION = "LogSettings"; -const char * const LOG_ERROR = "LogError"; -const char * const LOG_WARNING = "LogWarning"; -const char * const LOG_DEBUG = "LogDebug"; -const char * const LOG_ASSERT = "LogAssert"; -const char * const LOG_INFO = "LogInfo"; +const char *const LOG_SECTION = "LogSettings"; +const char *const LOG_ERROR = "LogError"; +const char *const LOG_WARNING = "LogWarning"; +const char *const LOG_DEBUG = "LogDebug"; +const char *const LOG_ASSERT = "LogAssert"; +const char *const LOG_INFO = "LogInfo"; //resources -const char * const ICON_NEL = ":/core/images/nel.png"; -const char * const ICON_SETTINGS = ":/core/images/preferences.png"; -const char * const ICON_PILL = ":/core/icons/ic_nel_pill.png"; -const char * const ICON_OPEN = ":/core/icons/ic_nel_open.png"; -const char * const ICON_NEW = ":/core/icons/ic_nel_new.png"; -const char * const ICON_SAVE = ":/core/icons/ic_nel_save.png"; -const char * const ICON_SAVE_AS = ":/core/icons/ic_nel_save_as.png"; -const char * const ICON_CRASH = ":/core/icons/ic_nel_crash.png"; -const char * const ICON_UNDO = ":/core/icons/ic_nel_undo.png"; -const char * const ICON_REDO = ":/core/icons/ic_nel_redo.png"; +const char *const ICON_NEL = ":/core/images/nel.png"; +const char *const ICON_SETTINGS = ":/core/images/preferences.png"; +const char *const ICON_PILL = ":/core/icons/ic_nel_pill.png"; +const char *const ICON_OPEN = ":/core/icons/ic_nel_open.png"; +const char *const ICON_NEW = ":/core/icons/ic_nel_new.png"; +const char *const ICON_SAVE = ":/core/icons/ic_nel_save.png"; +const char *const ICON_SAVE_AS = ":/core/icons/ic_nel_save_as.png"; +const char *const ICON_CRASH = ":/core/icons/ic_nel_crash.png"; +const char *const ICON_UNDO = ":/core/icons/ic_nel_undo.png"; +const char *const ICON_REDO = ":/core/icons/ic_nel_redo.png"; } // namespace Constants } // namespace Core diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_plugin.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_plugin.cpp index 92e776068..55633feaf 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_plugin.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_plugin.cpp @@ -37,6 +37,8 @@ using namespace Core; CorePlugin::CorePlugin() + : m_plugMan(0), + m_mainWindow(0) { } @@ -49,7 +51,8 @@ CorePlugin::~CorePlugin() qDeleteAll(m_autoReleaseObjects); m_autoReleaseObjects.clear(); - delete m_mainWindow; + if (m_mainWindow) + delete m_mainWindow; } bool CorePlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString) @@ -61,8 +64,8 @@ bool CorePlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QStr bool success = m_mainWindow->initialize(errorString); GeneralSettingsPage *generalSettings = new GeneralSettingsPage(this); - CSearchPathsSettingsPage *searchPathPage = new CSearchPathsSettingsPage(false, this); - CSearchPathsSettingsPage *recureseSearchPathPage = new CSearchPathsSettingsPage(true, this); + SearchPathsSettingsPage *searchPathPage = new SearchPathsSettingsPage(false, this); + SearchPathsSettingsPage *recureseSearchPathPage = new SearchPathsSettingsPage(true, this); generalSettings->applyGeneralSettings(); searchPathPage->applySearchPaths(); @@ -92,31 +95,6 @@ void CorePlugin::setNelContext(NLMISC::INelContext *nelContext) m_libContext = new NLMISC::CLibraryContext(*nelContext); } -QString CorePlugin::name() const -{ - return QLatin1String(Constants::OVQT_CORE_PLUGIN); -} - -QString CorePlugin::version() const -{ - return Constants::OVQT_VERSION_LONG; -} - -QString CorePlugin::vendor() const -{ - return Constants::OVQT_VENDOR; -} - -QString CorePlugin::description() const -{ - return "Core plugin."; -} - -QStringList CorePlugin::dependencies() const -{ - return QStringList(); -} - void CorePlugin::addAutoReleasedObject(QObject *obj) { m_plugMan->addObject(obj); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_plugin.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_plugin.h index 5c95d22c9..5062227e3 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_plugin.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core_plugin.h @@ -53,12 +53,6 @@ public: void setNelContext(NLMISC::INelContext *nelContext); - QString name() const; - QString version() const; - QString vendor() const; - QString description() const; - QStringList dependencies() const; - void addAutoReleasedObject(QObject *obj); ExtensionSystem::IPluginManager *pluginManager() const diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/general_settings_page.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/general_settings_page.cpp index 51da80f67..b1ef3b659 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/general_settings_page.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/general_settings_page.cpp @@ -82,6 +82,17 @@ void GeneralSettingsPage::applyGeneralSettings() else QApplication::setPalette(m_originalPalette); settings->endGroup(); + + // Add primitives path and ligo config file to CPath + settings->beginGroup(Core::Constants::DATA_PATH_SECTION); + QString primitivePath = settings->value(Core::Constants::PRIMITIVES_PATH, "l:/primitives").toString(); + QString ligoConfigFile = settings->value(Core::Constants::LIGOCONFIG_FILE, "l:/leveldesign/world_editor_files/world_editor_classes.xml").toString(); + QString leveldesignPath = settings->value(Core::Constants::LEVELDESIGN_PATH, "l:/leveldesign").toString(); + NLMISC::CPath::addSearchPath(primitivePath.toStdString(), true, false); + NLMISC::CPath::display(); + NLMISC::CPath::addSearchFile(ligoConfigFile.toStdString()); + NLMISC::CPath::addSearchPath(leveldesignPath.toStdString(), true, false); + settings->endGroup(); } QWidget *GeneralSettingsPage::createPage(QWidget *parent) @@ -94,6 +105,8 @@ QWidget *GeneralSettingsPage::createPage(QWidget *parent) connect(m_ui.pluginsPathButton, SIGNAL(clicked()), this, SLOT(setPluginsPath())); connect(m_ui.leveldesignPathButton, SIGNAL(clicked()), this, SLOT(setLevelDesignPath())); connect(m_ui.assetsPathButton, SIGNAL(clicked()), this, SLOT(setAssetsPath())); + connect(m_ui.primitivesPathButton, SIGNAL(clicked()), this, SLOT(setPrimitivesPath())); + connect(m_ui.ligoConfigFileButton, SIGNAL(clicked()), this, SLOT(setLigoConfigFile())); return m_page; } @@ -135,6 +148,27 @@ void GeneralSettingsPage::setLevelDesignPath() } } +void GeneralSettingsPage::setPrimitivesPath() +{ + QString newPath = QFileDialog::getExistingDirectory(0, tr("Set the primitives path"), + m_ui.primitivesPathLineEdit->text()); + if (!newPath.isEmpty()) + { + m_ui.primitivesPathLineEdit->setText(newPath); + } +} + +void GeneralSettingsPage::setLigoConfigFile() +{ + QString newFile = QFileDialog::getOpenFileName(0, tr("Set the ligo config file"), + m_ui.ligoConfigFileLineEdit->text()); + if (!newFile.isEmpty()) + { + m_ui.ligoConfigFileLineEdit->setText(newFile); + } +} + + void GeneralSettingsPage::setAssetsPath() { QString newPath = QFileDialog::getExistingDirectory(0, tr("Set the assets path"), @@ -165,6 +199,8 @@ void GeneralSettingsPage::readSettings() settings->beginGroup(Core::Constants::DATA_PATH_SECTION); m_ui.leveldesignPathLineEdit->setText(settings->value(Core::Constants::LEVELDESIGN_PATH, "l:/leveldesign").toString()); m_ui.assetsPathLineEdit->setText(settings->value(Core::Constants::ASSETS_PATH, "w:/database").toString()); + m_ui.primitivesPathLineEdit->setText(settings->value(Core::Constants::PRIMITIVES_PATH, "l:/primitives").toString()); + m_ui.ligoConfigFileLineEdit->setText(settings->value(Core::Constants::LIGOCONFIG_FILE, "l:/leveldesign/world_editor_files/world_editor_classes.xml").toString()); settings->endGroup(); } @@ -185,6 +221,8 @@ void GeneralSettingsPage::writeSettings() settings->beginGroup(Core::Constants::DATA_PATH_SECTION); settings->setValue(Core::Constants::LEVELDESIGN_PATH, m_ui.leveldesignPathLineEdit->text()); settings->setValue(Core::Constants::ASSETS_PATH, m_ui.assetsPathLineEdit->text()); + settings->setValue(Core::Constants::PRIMITIVES_PATH, m_ui.primitivesPathLineEdit->text()); + settings->setValue(Core::Constants::LIGOCONFIG_FILE, m_ui.ligoConfigFileLineEdit->text()); settings->endGroup(); settings->sync(); } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/general_settings_page.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/general_settings_page.h index 2fbcb842a..66eacd189 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/general_settings_page.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/general_settings_page.h @@ -37,7 +37,7 @@ class GeneralSettingsPage : public Core::IOptionsPage Q_OBJECT public: - GeneralSettingsPage(QObject *parent = 0); + explicit GeneralSettingsPage(QObject *parent = 0); ~GeneralSettingsPage(); QString id() const; @@ -57,6 +57,8 @@ private Q_SLOTS: void setPluginsPath(); void setLevelDesignPath(); void setAssetsPath(); + void setPrimitivesPath(); + void setLigoConfigFile(); private: void readSettings(); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/general_settings_page.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/general_settings_page.ui index d2aa042e3..7d40b65df 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/general_settings_page.ui +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/general_settings_page.ui @@ -105,7 +105,7 @@ - Plugins path: + Plugins @@ -129,7 +129,7 @@ - Level design path: + Sheets @@ -153,7 +153,7 @@ - Assets path: + Assets Database: @@ -174,6 +174,40 @@ + + + + Primitives + + + + + + + + + + ... + + + + + + + + + + Ligo Config File + + + + + + + ... + + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icore.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icore.h index 13b22bfa5..4f1ee474f 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icore.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icore.h @@ -35,7 +35,7 @@ class IPluginManager; namespace Core { -class IMenuManager; +class MenuManager; class ContextManager; class CORE_EXPORT ICore : public QObject @@ -52,7 +52,7 @@ public: const QString &page = QString(), QWidget *parent = 0) = 0; - virtual IMenuManager *menuManager() const = 0; + virtual MenuManager *menuManager() const = 0; virtual ContextManager *contextManager() const = 0; virtual QSettings *settings() const = 0; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/imenu_manager.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/imenu_manager.h deleted file mode 100644 index be80dbbc4..000000000 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/imenu_manager.h +++ /dev/null @@ -1,62 +0,0 @@ -// Object Viewer Qt - MMORPG Framework -// Copyright (C) 2010 Winch Gate Property Limited -// Copyright (C) 2011 Dzmitry Kamiahin -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -#ifndef IMENU_MANAGER_H -#define IMENU_MANAGER_H - -#include "core_global.h" - -#include -#include - -QT_BEGIN_NAMESPACE -class QMenu; -class QAction; -class QString; -class QMenuBar; -QT_END_NAMESPACE - -namespace Core -{ -/* -@interface IMenuManager -@brief The IMenuManager is an interface for providing a registration of menus and menu item. -@details The IMenuManager provides centralized access to menus and menu items. -All menus and menu items should be registered in the IMenuManager. -*/ -class CORE_EXPORT IMenuManager : public QObject -{ - Q_OBJECT -public: - IMenuManager(QObject *parent = 0): QObject(parent) {} - virtual ~IMenuManager() {} - - virtual void registerMenu(QMenu *menu, const QString &id) = 0; - virtual void registerAction(QAction *action, const QString &id) = 0; - - virtual QMenu *menu(const QString &id) const = 0; - virtual QAction *action(const QString &id) const = 0; - - virtual void unregisterMenu(const QString &id) = 0; - virtual void unregisterAction(const QString &id) = 0; - - virtual QMenuBar *menuBar() const = 0; -}; - -} // namespace Core - -#endif // IMENU_MANAGER_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.cpp index caaeb4d5c..6e409e75d 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.cpp @@ -65,8 +65,7 @@ MainWindow::MainWindow(ExtensionSystem::IPluginManager *pluginManager, QWidget * setMenuBar(m_menuBar); #endif - m_menuManager = new MenuManager(this); - m_menuManager->setMenuBar(m_menuBar); + m_menuManager = new MenuManager(m_menuBar, this); m_tabWidget = new QTabWidget(this); m_tabWidget->setTabPosition(QTabWidget::South); @@ -107,14 +106,14 @@ bool MainWindow::initialize(QString *errorString) void MainWindow::extensionsInitialized() { readSettings(); - connect(m_contextManager, SIGNAL(currentContextChanged(Core::IContext*)), - this, SLOT(updateContext(Core::IContext*))); + connect(m_contextManager, SIGNAL(currentContextChanged(Core::IContext *)), + this, SLOT(updateContext(Core::IContext *))); if (m_contextManager->currentContext() != NULL) updateContext(m_contextManager->currentContext()); show(); } -IMenuManager *MainWindow::menuManager() const +MenuManager *MainWindow::menuManager() const { return m_menuManager; } @@ -129,6 +128,11 @@ QSettings *MainWindow::settings() const return m_settings; } +QUndoGroup *MainWindow::undoGroup() const +{ + return m_undoGroup; +} + ExtensionSystem::IPluginManager *MainWindow::pluginManager() const { return m_pluginManager; @@ -136,12 +140,16 @@ ExtensionSystem::IPluginManager *MainWindow::pluginManager() const void MainWindow::addContextObject(IContext *context) { - m_undoGroup->addStack(context->undoStack()); + QUndoStack *stack = context->undoStack(); + if (stack) + m_undoGroup->addStack(stack); } void MainWindow::removeContextObject(IContext *context) { - m_undoGroup->removeStack(context->undoStack()); + QUndoStack *stack = context->undoStack(); + if (stack) + m_undoGroup->removeStack(stack); } void MainWindow::open() @@ -205,7 +213,7 @@ bool MainWindow::showOptionsDialog(const QString &group, { if (!parent) parent = this; - CSettingsDialog settingsDialog(m_pluginManager, group, page, parent); + SettingsDialog settingsDialog(m_pluginManager, group, page, parent); settingsDialog.show(); bool ok = settingsDialog.execDialog(); if (ok) @@ -437,7 +445,7 @@ void MainWindow::createStatusBar() void MainWindow::createDialogs() { - m_pluginView = new ExtensionSystem::CPluginView(m_pluginManager, this); + m_pluginView = new PluginView(m_pluginManager, this); // Create undo/redo command list m_dockWidget = new QDockWidget("Command List", this); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.h index d594692ee..a75126823 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/main_window.h @@ -34,7 +34,6 @@ namespace Core class CSettingsDialog; class CorePlugin; class IContext; -class IMenuManager; class MenuManager; class ContextManager; class CoreImpl; @@ -50,9 +49,10 @@ public: bool initialize(QString *errorString); void extensionsInitialized(); - IMenuManager *menuManager() const; + MenuManager *menuManager() const; ContextManager *contextManager() const; QSettings *settings() const; + QUndoGroup *undoGroup() const; ExtensionSystem::IPluginManager *pluginManager() const; @@ -63,6 +63,7 @@ public Q_SLOTS: bool showOptionsDialog(const QString &group = QString(), const QString &page = QString(), QWidget *parent = 0); + void updateContext(Core::IContext *context); private Q_SLOTS: void open(); @@ -78,7 +79,6 @@ private Q_SLOTS: void gotoPos(); void setFullScreen(bool enabled); void about(); - void updateContext(Core::IContext *context); protected: virtual void closeEvent(QCloseEvent *event); @@ -93,7 +93,7 @@ private: void writeSettings(); ExtensionSystem::IPluginManager *m_pluginManager; - ExtensionSystem::CPluginView *m_pluginView; + PluginView *m_pluginView; MenuManager *m_menuManager; ContextManager *m_contextManager; CoreImpl *m_coreImpl; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/menu_manager.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/menu_manager.cpp index 4bd80a616..76a4d7d91 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/menu_manager.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/menu_manager.cpp @@ -21,74 +21,76 @@ // NeL includes #include -// Qt includes -#include -#include -#include - namespace Core { -MenuManager::MenuManager(QObject *parent) - : IMenuManager(parent), - _menuBar(0) +struct MenuManagerPrivate { + MenuManagerPrivate(): m_menuBar(0) {} + QMenuBar *m_menuBar; + typedef QHash IdMenuMap; + IdMenuMap m_menuMap; + typedef QHash IdActionMap; + IdActionMap m_actionMap; +}; + +MenuManager::MenuManager(QMenuBar *menuBar, QObject *parent) + : QObject(parent), + d(new MenuManagerPrivate()) +{ + d->m_menuBar = menuBar; } MenuManager::~MenuManager() { - _menuMap.clear(); + d->m_menuMap.clear(); + delete d; } void MenuManager::registerMenu(QMenu *menu, const QString &id) { menu->setObjectName(id); - _menuMap.insert(id, menu); + d->m_menuMap.insert(id, menu); } void MenuManager::registerAction(QAction *action, const QString &id) { action->setObjectName(id); - _actionMap.insert(id, action); + d->m_actionMap.insert(id, action); } QMenu *MenuManager::menu(const QString &id) const { QMenu *result = 0; - if (!_menuMap.contains(id)) + if (!d->m_menuMap.contains(id)) nlwarning("QMenu %s not found", id.toStdString().c_str()); else - result = _menuMap.value(id); + result = d->m_menuMap.value(id); return result; } QAction *MenuManager::action(const QString &id) const { QAction *result = 0; - if (!_actionMap.contains(id)) + if (!d->m_actionMap.contains(id)) nlwarning("QAction %s not found", id.toStdString().c_str()); else - result = _actionMap.value(id); + result = d->m_actionMap.value(id); return result; } void MenuManager::unregisterMenu(const QString &id) { - _menuMap.remove(id); + d->m_menuMap.remove(id); } void MenuManager::unregisterAction(const QString &id) { - _actionMap.remove(id); + d->m_actionMap.remove(id); } QMenuBar *MenuManager::menuBar() const { - return _menuBar; -} - -void MenuManager::setMenuBar(QMenuBar *menuBar) -{ - _menuBar = menuBar; + return d->m_menuBar; } } /* namespace Core */ \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/menu_manager.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/menu_manager.h index aab603355..fd6af8f3a 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/menu_manager.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/menu_manager.h @@ -19,39 +19,47 @@ #define MENU_MANAGER_H // Project includes -#include "imenu_manager.h" +#include "core_global.h" // Qt includes #include +#include +#include +#include +#include +#include namespace Core { +struct MenuManagerPrivate; -class MenuManager : public IMenuManager +/* +@interface MenuManager +@brief The MenuManager provide the interface for registration of menus and menu item. +@details The MenuManager provides centralized access to menus and menu items. +All menus and menu items should be registered in the MenuManager. +*/ +class CORE_EXPORT MenuManager: public QObject { Q_OBJECT public: - MenuManager(QObject *parent = 0); + MenuManager(QMenuBar *menuBar, QObject *parent = 0); virtual ~MenuManager(); - virtual void registerMenu(QMenu *menu, const QString &id); - virtual void registerAction(QAction *action, const QString &id); + void registerMenu(QMenu *menu, const QString &id); + void registerAction(QAction *action, const QString &id); - virtual QMenu *menu(const QString &id) const; - virtual QAction *action(const QString &id) const; + QMenu *menu(const QString &id) const; + QAction *action(const QString &id) const; - virtual void unregisterMenu(const QString &id); - virtual void unregisterAction(const QString &id); + void unregisterMenu(const QString &id); + void unregisterAction(const QString &id); - virtual QMenuBar *menuBar() const; - void setMenuBar(QMenuBar *menuBar); + QMenuBar *menuBar() const; private: - QMenuBar *_menuBar; - typedef QHash IdMenuMap; - IdMenuMap _menuMap; - typedef QHash IdActionMap; - IdActionMap _actionMap; + + MenuManagerPrivate *d; }; } // namespace Core diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/ovqt_plugin_core.xml b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/ovqt_plugin_core.xml new file mode 100644 index 000000000..c0d38aa75 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/ovqt_plugin_core.xml @@ -0,0 +1,7 @@ + + ovqt_plugin_core + Core + 0.8 + Ryzom Core + Core plugin. + \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/plugin_view_dialog.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/plugin_view_dialog.cpp index b45d46418..175902d39 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/plugin_view_dialog.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/plugin_view_dialog.cpp @@ -16,11 +16,12 @@ // along with this program. If not, see . #include "plugin_view_dialog.h" +#include "core_constants.h" + +#include "nel/misc/debug.h" // Qt includes #include -#include -#include #include #include #include @@ -29,45 +30,79 @@ #include "../../extension_system/iplugin_spec.h" #include "../../extension_system/iplugin_manager.h" -namespace ExtensionSystem +namespace Core { -CPluginView::CPluginView(IPluginManager *pluginManager, QWidget *parent) - : QDialog(parent) +PluginView::PluginView(ExtensionSystem::IPluginManager *pluginManager, QWidget *parent) + : QDialog(parent), + m_checkStateColumn(0) { - _ui.setupUi(this); - _pluginManager = pluginManager; + m_ui.setupUi(this); + m_pluginManager = pluginManager; - connect(_pluginManager, SIGNAL(pluginsChanged()), this, SLOT(updateList())); + connect(m_pluginManager, SIGNAL(pluginsChanged()), this, SLOT(updateList())); + connect(this, SIGNAL(accepted()), this, SLOT(updateSettings())); + // WhiteList is list of plugins which can not disable. + m_whiteList << Constants::OVQT_CORE_PLUGIN; updateList(); } -CPluginView::~CPluginView() +PluginView::~PluginView() { } -void CPluginView::updateList() +void PluginView::updateList() { static QIcon okIcon = QApplication::style()->standardIcon(QStyle::SP_DialogApplyButton); static QIcon errorIcon = QApplication::style()->standardIcon(QStyle::SP_DialogCancelButton); + static QIcon notLoadedIcon = QApplication::style()->standardIcon(QStyle::SP_DialogResetButton); + + m_specToItem.clear(); QList items; - Q_FOREACH (IPluginSpec *spec, _pluginManager->plugins()) + Q_FOREACH (ExtensionSystem::IPluginSpec *spec, m_pluginManager->plugins()) { QTreeWidgetItem *item = new QTreeWidgetItem(QStringList() - << "" << spec->name() << QString("%1").arg(spec->version()) << spec->vendor() << QDir::toNativeSeparators(spec->filePath())); - item->setIcon(0, spec->hasError() ? errorIcon : okIcon); + + bool ok = !spec->hasError(); + QIcon icon = ok ? okIcon : errorIcon; + if (ok && (spec->state() != ExtensionSystem::State::Running)) + icon = notLoadedIcon; + + item->setIcon(m_checkStateColumn, icon); + + if (!m_whiteList.contains(spec->name())) + item->setCheckState(m_checkStateColumn, spec->isEnabled() ? Qt::Checked : Qt::Unchecked); + items.append(item); + m_specToItem.insert(spec, item); } - _ui.pluginTreeWidget->clear(); + m_ui.pluginTreeWidget->clear(); if (!items.isEmpty()) - _ui.pluginTreeWidget->addTopLevelItems(items); + m_ui.pluginTreeWidget->addTopLevelItems(items); + + m_ui.pluginTreeWidget->resizeColumnToContents(m_checkStateColumn); } -} /* namespace NLQT */ \ No newline at end of file +void PluginView::updateSettings() +{ + Q_FOREACH (ExtensionSystem::IPluginSpec *spec, m_pluginManager->plugins()) + { + if (m_specToItem.contains(spec) && (!m_whiteList.contains(spec->name()))) + { + QTreeWidgetItem *item = m_specToItem.value(spec); + if (item->checkState(m_checkStateColumn) == Qt::Checked) + spec->setEnabled(true); + else + spec->setEnabled(false); + } + } +} + +} /* namespace Core */ \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/plugin_view_dialog.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/plugin_view_dialog.h index 0f12b64a3..aae16749d 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/plugin_view_dialog.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/plugin_view_dialog.h @@ -20,28 +20,39 @@ #include "ui_plugin_view_dialog.h" +#include +#include + namespace ExtensionSystem { - class IPluginManager; +class IPluginSpec; +} -class CPluginView: public QDialog +namespace Core +{ + +class PluginView: public QDialog { Q_OBJECT public: - CPluginView(IPluginManager *pluginManager, QWidget *parent = 0); - ~CPluginView(); + PluginView(ExtensionSystem::IPluginManager *pluginManager, QWidget *parent = 0); + ~PluginView(); private Q_SLOTS: void updateList(); + void updateSettings(); private: - IPluginManager *_pluginManager; - Ui::CPluginView _ui; -}; /* class CPluginView */ + const int m_checkStateColumn; + QMap m_specToItem; + QStringList m_whiteList; + ExtensionSystem::IPluginManager *m_pluginManager; + Ui::PluginView m_ui; +}; /* class PluginView */ -} /* namespace NLQT */ +} /* namespace Core */ #endif // PLUGIN_VIEW_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/plugin_view_dialog.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/plugin_view_dialog.ui index 2fb0f568e..9d7d395be 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/plugin_view_dialog.ui +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/plugin_view_dialog.ui @@ -1,13 +1,13 @@ - CPluginView - + PluginView + 0 0 - 691 - 249 + 756 + 296 @@ -37,14 +37,6 @@ true - - 100 - - - - State - - Name @@ -120,13 +112,13 @@ - + closePushButton clicked() - CPluginView + PluginView accept() diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/qtwin.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/qtwin.cpp index dc0fb6cf0..2ebb69134 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/qtwin.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/qtwin.cpp @@ -40,9 +40,9 @@ typedef struct _MARGINS int cyBottomHeight; } MARGINS, *PMARGINS; -typedef HRESULT (WINAPI *PtrDwmIsCompositionEnabled)(BOOL* pfEnabled); -typedef HRESULT (WINAPI *PtrDwmExtendFrameIntoClientArea)(HWND hWnd, const MARGINS* pMarInset); -typedef HRESULT (WINAPI *PtrDwmEnableBlurBehindWindow)(HWND hWnd, const DWM_BLURBEHIND* pBlurBehind); +typedef HRESULT (WINAPI *PtrDwmIsCompositionEnabled)(BOOL *pfEnabled); +typedef HRESULT (WINAPI *PtrDwmExtendFrameIntoClientArea)(HWND hWnd, const MARGINS *pMarInset); +typedef HRESULT (WINAPI *PtrDwmEnableBlurBehindWindow)(HWND hWnd, const DWM_BLURBEHIND *pBlurBehind); typedef HRESULT (WINAPI *PtrDwmGetColorizationColor)(DWORD *pcrColorization, BOOL *pfOpaqueBlend); static PtrDwmIsCompositionEnabled pDwmIsCompositionEnabled= 0; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/search_paths_settings_page.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/search_paths_settings_page.cpp index 355a9c0e3..7fca0f252 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/search_paths_settings_page.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/search_paths_settings_page.cpp @@ -33,18 +33,18 @@ namespace Core QString lastDir = "."; -CSearchPathsSettingsPage::CSearchPathsSettingsPage(bool recurse, QObject *parent) +SearchPathsSettingsPage::SearchPathsSettingsPage(bool recurse, QObject *parent) : IOptionsPage(parent), m_recurse(recurse), m_page(0) { } -CSearchPathsSettingsPage::~CSearchPathsSettingsPage() +SearchPathsSettingsPage::~SearchPathsSettingsPage() { } -QString CSearchPathsSettingsPage::id() const +QString SearchPathsSettingsPage::id() const { if (m_recurse) return QLatin1String("search_recurse_paths"); @@ -52,7 +52,7 @@ QString CSearchPathsSettingsPage::id() const return QLatin1String("search_paths"); } -QString CSearchPathsSettingsPage::trName() const +QString SearchPathsSettingsPage::trName() const { if (m_recurse) return tr("Search Recurse Paths"); @@ -60,22 +60,22 @@ QString CSearchPathsSettingsPage::trName() const return tr("Search Paths"); } -QString CSearchPathsSettingsPage::category() const +QString SearchPathsSettingsPage::category() const { return QLatin1String(Constants::SETTINGS_CATEGORY_GENERAL); } -QString CSearchPathsSettingsPage::trCategory() const +QString SearchPathsSettingsPage::trCategory() const { return tr(Constants::SETTINGS_TR_CATEGORY_GENERAL); } -QIcon CSearchPathsSettingsPage::categoryIcon() const +QIcon SearchPathsSettingsPage::categoryIcon() const { return QIcon(); } -QWidget *CSearchPathsSettingsPage::createPage(QWidget *parent) +QWidget *SearchPathsSettingsPage::createPage(QWidget *parent) { m_page = new QWidget(parent); m_ui.setupUi(m_page); @@ -90,19 +90,19 @@ QWidget *CSearchPathsSettingsPage::createPage(QWidget *parent) return m_page; } -void CSearchPathsSettingsPage::apply() +void SearchPathsSettingsPage::apply() { writeSettings(); applySearchPaths(); } -void CSearchPathsSettingsPage::finish() +void SearchPathsSettingsPage::finish() { delete m_page; m_page = 0; } -void CSearchPathsSettingsPage::applySearchPaths() +void SearchPathsSettingsPage::applySearchPaths() { QStringList paths, remapExt; QSettings *settings = Core::ICore::instance()->settings(); @@ -124,7 +124,7 @@ void CSearchPathsSettingsPage::applySearchPaths() } } -void CSearchPathsSettingsPage::addPath() +void SearchPathsSettingsPage::addPath() { QString newPath = QFileDialog::getExistingDirectory(m_page, "", lastDir); if (!newPath.isEmpty()) @@ -139,7 +139,7 @@ void CSearchPathsSettingsPage::addPath() checkEnabledButton(); } -void CSearchPathsSettingsPage::delPath() +void SearchPathsSettingsPage::delPath() { QListWidgetItem *removeItem = m_ui.pathsListWidget->takeItem(m_ui.pathsListWidget->currentRow()); if (!removeItem) @@ -148,7 +148,7 @@ void CSearchPathsSettingsPage::delPath() checkEnabledButton(); } -void CSearchPathsSettingsPage::upPath() +void SearchPathsSettingsPage::upPath() { int currentRow = m_ui.pathsListWidget->currentRow(); if (!(currentRow == 0)) @@ -159,7 +159,7 @@ void CSearchPathsSettingsPage::upPath() } } -void CSearchPathsSettingsPage::downPath() +void SearchPathsSettingsPage::downPath() { int currentRow = m_ui.pathsListWidget->currentRow(); if (!(currentRow == m_ui.pathsListWidget->count()-1)) @@ -170,7 +170,7 @@ void CSearchPathsSettingsPage::downPath() } } -void CSearchPathsSettingsPage::readSettings() +void SearchPathsSettingsPage::readSettings() { QStringList paths; QSettings *settings = Core::ICore::instance()->settings(); @@ -189,7 +189,7 @@ void CSearchPathsSettingsPage::readSettings() } } -void CSearchPathsSettingsPage::writeSettings() +void SearchPathsSettingsPage::writeSettings() { QStringList paths; for (int i = 0; i < m_ui.pathsListWidget->count(); ++i) @@ -205,7 +205,7 @@ void CSearchPathsSettingsPage::writeSettings() settings->sync(); } -void CSearchPathsSettingsPage::checkEnabledButton() +void SearchPathsSettingsPage::checkEnabledButton() { bool bEnabled = true; if (m_ui.pathsListWidget->count() == 0) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/search_paths_settings_page.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/search_paths_settings_page.h index c7d4c9734..c45b29571 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/search_paths_settings_page.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/search_paths_settings_page.h @@ -30,15 +30,15 @@ class QWidget; namespace Core { /** -@class CSearchPathsSettingsPage +@class SearchPathsSettingsPage */ -class CSearchPathsSettingsPage : public Core::IOptionsPage +class SearchPathsSettingsPage : public Core::IOptionsPage { Q_OBJECT public: - explicit CSearchPathsSettingsPage(bool recurse, QObject *parent = 0); - ~CSearchPathsSettingsPage(); + explicit SearchPathsSettingsPage(bool recurse, QObject *parent = 0); + ~SearchPathsSettingsPage(); QString id() const; QString trName() const; @@ -66,7 +66,7 @@ private: bool m_recurse; QWidget *m_page; - Ui::CSearchPathsSettingsPage m_ui; + Ui::SearchPathsSettingsPage m_ui; }; } // namespace Core diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/search_paths_settings_page.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/search_paths_settings_page.ui index 79a6b2141..cf47314b8 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/search_paths_settings_page.ui +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/search_paths_settings_page.ui @@ -1,7 +1,7 @@ - CSearchPathsSettingsPage - + SearchPathsSettingsPage + 0 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/settings_dialog.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/settings_dialog.cpp index 30fd7835e..960644599 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/settings_dialog.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/settings_dialog.cpp @@ -35,33 +35,33 @@ Q_DECLARE_METATYPE(PageData); namespace Core { -CSettingsDialog::CSettingsDialog(ExtensionSystem::IPluginManager *pluginManager, - const QString &categoryId, - const QString &pageId, - QWidget *parent) +SettingsDialog::SettingsDialog(ExtensionSystem::IPluginManager *pluginManager, + const QString &categoryId, + const QString &pageId, + QWidget *parent) : QDialog(parent), - _applied(false) + m_applied(false) { - _ui.setupUi(this); + m_ui.setupUi(this); - _plugMan = pluginManager; + m_plugMan = pluginManager; QString initialCategory = categoryId; QString initialPage = pageId; - _ui.buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); + m_ui.buttonBox->button(QDialogButtonBox::Ok)->setDefault(true); - connect(_ui.buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(apply())); + connect(m_ui.buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(apply())); - _ui.splitter->setCollapsible(1, false); - _ui.pageTree->header()->setVisible(false); + m_ui.splitter->setCollapsible(1, false); + m_ui.pageTree->header()->setVisible(false); - connect(_ui.pageTree, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), + connect(m_ui.pageTree, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), this, SLOT(pageSelected())); QMap categories; - QList pages = _plugMan->getObjects(); + QList pages = m_plugMan->getObjects(); int index = 0; Q_FOREACH(IOptionsPage *page, pages) @@ -82,7 +82,7 @@ CSettingsDialog::CSettingsDialog(ExtensionSystem::IPluginManager *pluginManager, QTreeWidgetItem *treeitem; if (!categories.contains(currentCategory)) { - treeitem = new QTreeWidgetItem(_ui.pageTree); + treeitem = new QTreeWidgetItem(m_ui.pageTree); treeitem->setText(0, trCategories.at(0)); treeitem->setData(0, Qt::UserRole, qVariantFromValue(pageData)); categories.insert(currentCategory, treeitem); @@ -108,13 +108,13 @@ CSettingsDialog::CSettingsDialog(ExtensionSystem::IPluginManager *pluginManager, categories.value(currentCategory)->addChild(item); - _pages.append(page); - _ui.stackedPages->addWidget(page->createPage(_ui.stackedPages)); + m_pages.append(page); + m_ui.stackedPages->addWidget(page->createPage(m_ui.stackedPages)); if (page->id() == initialPage && currentCategory == initialCategory) { - _ui.stackedPages->setCurrentIndex(_ui.stackedPages->count()); - _ui.pageTree->setCurrentItem(item); + m_ui.stackedPages->setCurrentIndex(m_ui.stackedPages->count()); + m_ui.pageTree->setCurrentItem(item); } index++; @@ -122,30 +122,30 @@ CSettingsDialog::CSettingsDialog(ExtensionSystem::IPluginManager *pluginManager, QList sizes; sizes << 150 << 300; - _ui.splitter->setSizes(sizes); + m_ui.splitter->setSizes(sizes); - _ui.splitter->setStretchFactor(_ui.splitter->indexOf(_ui.pageTree), 0); - _ui.splitter->setStretchFactor(_ui.splitter->indexOf(_ui.layoutWidget), 1); + m_ui.splitter->setStretchFactor(m_ui.splitter->indexOf(m_ui.pageTree), 0); + m_ui.splitter->setStretchFactor(m_ui.splitter->indexOf(m_ui.layoutWidget), 1); } -CSettingsDialog::~CSettingsDialog() +SettingsDialog::~SettingsDialog() { } -void CSettingsDialog::pageSelected() +void SettingsDialog::pageSelected() { - QTreeWidgetItem *item = _ui.pageTree->currentItem(); + QTreeWidgetItem *item = m_ui.pageTree->currentItem(); PageData data = item->data(0, Qt::UserRole).value(); int index = data.index; - _currentCategory = data.category; - _currentPage = data.id; - _ui.stackedPages->setCurrentIndex(index); + m_currentCategory = data.category; + m_currentPage = data.id; + m_ui.stackedPages->setCurrentIndex(index); } -void CSettingsDialog::accept() +void SettingsDialog::accept() { - _applied = true; - Q_FOREACH(IOptionsPage *page, _pages) + m_applied = true; + Q_FOREACH(IOptionsPage *page, m_pages) { page->apply(); page->finish(); @@ -153,28 +153,28 @@ void CSettingsDialog::accept() done(QDialog::Accepted); } -void CSettingsDialog::reject() +void SettingsDialog::reject() { - Q_FOREACH(IOptionsPage *page, _pages) + Q_FOREACH(IOptionsPage *page, m_pages) page->finish(); done(QDialog::Rejected); } -void CSettingsDialog::apply() +void SettingsDialog::apply() { - Q_FOREACH(IOptionsPage *page, _pages) + Q_FOREACH(IOptionsPage *page, m_pages) page->apply(); - _applied = true; + m_applied = true; } -bool CSettingsDialog::execDialog() +bool SettingsDialog::execDialog() { - _applied = false; + m_applied = false; exec(); - return _applied; + return m_applied; } -void CSettingsDialog::done(int val) +void SettingsDialog::done(int val) { QDialog::done(val); } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/settings_dialog.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/settings_dialog.h index 07adc7fee..9e1c86444 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/settings_dialog.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/settings_dialog.h @@ -35,17 +35,17 @@ class IOptionsPage; @class CSettingsDialog @brief Settings dialog */ -class CSettingsDialog: public QDialog +class SettingsDialog: public QDialog { Q_OBJECT public: - CSettingsDialog(ExtensionSystem::IPluginManager *pluginManager, - const QString &initialCategory = QString(), - const QString &initialPage = QString(), - QWidget *parent = 0); + SettingsDialog(ExtensionSystem::IPluginManager *pluginManager, + const QString &initialCategory = QString(), + const QString &initialPage = QString(), + QWidget *parent = 0); - ~CSettingsDialog(); + ~SettingsDialog(); /// Run the dialog and return true if 'Ok' was choosen or 'Apply' was invoked at least once bool execDialog(); @@ -60,14 +60,14 @@ private Q_SLOTS: void apply(); private: - QList _pages; - bool _applied; - QString _currentCategory; - QString _currentPage; + QList m_pages; + bool m_applied; + QString m_currentCategory; + QString m_currentPage; - ExtensionSystem::IPluginManager *_plugMan; + ExtensionSystem::IPluginManager *m_plugMan; - Ui::CSettingsDialog _ui; + Ui::SettingsDialog m_ui; }; /* class CSettingsDialog */ } /* namespace Core */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/settings_dialog.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/settings_dialog.ui index e536f0dc2..8e9780c9a 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/settings_dialog.ui +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/settings_dialog.ui @@ -1,7 +1,7 @@ - CSettingsDialog - + SettingsDialog + 0 @@ -93,7 +93,7 @@ buttonBox accepted() - CSettingsDialog + SettingsDialog accept() @@ -109,7 +109,7 @@ buttonBox rejected() - CSettingsDialog + SettingsDialog reject() diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/CMakeLists.txt index 34c65c178..6152b8fdd 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/CMakeLists.txt +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/CMakeLists.txt @@ -28,7 +28,7 @@ SOURCE_GROUP("OVQT Extension System" FILES ${OVQT_EXT_SYS_SRC}) ADD_LIBRARY(ovqt_plugin_disp_sheet_id MODULE ${SRC} ${OVQT_DISP_SHEET_ID_PLUGIN_MOC_SRC} ${OVQT_EXT_SYS_SRC} ${OVQT_DISP_SHEET_ID_PLUGIN_UI_HDRS}) -TARGET_LINK_LIBRARIES(ovqt_plugin_disp_sheet_id ovqt_plugin_core nelmisc nel3d ${QT_LIBRARIES}) +TARGET_LINK_LIBRARIES(ovqt_plugin_disp_sheet_id ovqt_plugin_core nelmisc ${QT_LIBRARIES}) IF(WITH_STLPORT) TARGET_LINK_LIBRARIES(ovqt_plugin_disp_sheet_id ${CMAKE_THREAD_LIBS_INIT}) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/disp_sheet_id_plugin.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/disp_sheet_id_plugin.cpp index 54cba53a6..9e37b803b 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/disp_sheet_id_plugin.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/disp_sheet_id_plugin.cpp @@ -18,7 +18,7 @@ #include "disp_sheet_id_plugin.h" #include "sheet_id_view.h" #include "../core/icore.h" -#include "../core/imenu_manager.h" +#include "../core/menu_manager.h" #include "../core/core_constants.h" // Qt includes @@ -37,13 +37,13 @@ using namespace SheetIdViewPlugin; bool DispSheetIdPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString) { Q_UNUSED(errorString); - _plugMan = pluginManager; + m_plugMan = pluginManager; return true; } void DispSheetIdPlugin::extensionsInitialized() { - Core::IMenuManager *menuManager = Core::ICore::instance()->menuManager(); + Core::MenuManager *menuManager = Core::ICore::instance()->menuManager(); QMenu *sheetMenu = menuManager->menu(Core::Constants::M_SHEET); QAction *sheetIdViewAction = sheetMenu->addAction(tr("Sheet id view")); @@ -67,34 +67,7 @@ void DispSheetIdPlugin::setNelContext(NLMISC::INelContext *nelContext) // This only applies to platforms without PIC, e.g. Windows. nlassert(!NLMISC::INelContext::isContextInitialised()); #endif // NL_OS_WINDOWS - _LibContext = new NLMISC::CLibraryContext(*nelContext); -} - -QString DispSheetIdPlugin::name() const -{ - return "Display sheet id"; -} - -QString DispSheetIdPlugin::version() const -{ - return "1.0"; -} - -QString DispSheetIdPlugin::vendor() const -{ - return "pemeon"; -} - -QString DispSheetIdPlugin::description() const -{ - return "Display sheet id"; -} - -QStringList DispSheetIdPlugin::dependencies() const -{ - QStringList list; - list.append(Core::Constants::OVQT_CORE_PLUGIN); - return list; + m_LibContext = new NLMISC::CLibraryContext(*nelContext); } Q_EXPORT_PLUGIN(DispSheetIdPlugin) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/disp_sheet_id_plugin.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/disp_sheet_id_plugin.h index 75a25b724..8eaf3ead9 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/disp_sheet_id_plugin.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/disp_sheet_id_plugin.h @@ -28,11 +28,6 @@ namespace NLMISC class CLibraryContext; } -namespace NLQT -{ -class IPluginSpec; -} - namespace SheetIdViewPlugin { @@ -44,23 +39,16 @@ public: bool initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString); void extensionsInitialized(); - void setNelContext(NLMISC::INelContext *nelContext); - QString name() const; - QString version() const; - QString vendor() const; - QString description() const; - QStringList dependencies() const; - private Q_SLOTS: void execMessageBox(); protected: - NLMISC::CLibraryContext *_LibContext; + NLMISC::CLibraryContext *m_LibContext; private: - ExtensionSystem::IPluginManager *_plugMan; + ExtensionSystem::IPluginManager *m_plugMan; }; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/ovqt_plugin_disp_sheet_id.xml b/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/ovqt_plugin_disp_sheet_id.xml new file mode 100644 index 000000000..012029810 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/ovqt_plugin_disp_sheet_id.xml @@ -0,0 +1,10 @@ + + ovqt_plugin_disp_sheet_id + DisplaySheetId + 1.0 + pemeon + Display sheet id. + + + + \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/sheet_id_view.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/sheet_id_view.cpp index 64fb05701..f05060a9c 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/sheet_id_view.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/disp_sheet_id/sheet_id_view.cpp @@ -65,8 +65,8 @@ void SheetIdView::pushToTable() m_ui.table->setColumnCount(2); for (size_t i = 0; i < m_sheetList.size(); i++) { - QTableWidgetItem* item1 = new QTableWidgetItem(QString(m_sheetList[i].toString().c_str())); - QTableWidgetItem* item2 = new QTableWidgetItem(QString("%1").arg(m_sheetList[i].asInt())); + QTableWidgetItem *item1 = new QTableWidgetItem(QString(m_sheetList[i].toString().c_str())); + QTableWidgetItem *item2 = new QTableWidgetItem(QString("%1").arg(m_sheetList[i].asInt())); m_ui.table->setItem(i,1,item1); m_ui.table->setItem(i,2,item2); } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/CMakeLists.txt index 41d22804c..fbe617c43 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/CMakeLists.txt +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/CMakeLists.txt @@ -9,10 +9,10 @@ SET(OVQT_EXT_SYS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin. ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_manager.h ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_spec.h) -SET(OVQT_PLUG_EXAMPLE_HDR plugin1.h - qnel_widget.h - simple_viewer.h - example_settings_page.h) +SET(OVQT_PLUG_EXAMPLE_HDR example_plugin.h + qnel_widget.h + simple_viewer.h + example_settings_page.h) SET(OVQT_PLUG_EXAMPLE_UIS example_settings_page.ui) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_plugin.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_plugin.cpp new file mode 100644 index 000000000..5e442a5ee --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_plugin.cpp @@ -0,0 +1,83 @@ +// Project includes +#include "example_plugin.h" +#include "example_settings_page.h" +#include "simple_viewer.h" + +#include "../core/icore.h" +#include "../core/core_constants.h" +#include "../core/menu_manager.h" + +#include "../../extension_system/iplugin_spec.h" + +// NeL includes +#include "nel/misc/debug.h" + +// Qt includes +#include +#include +#include +#include +#include +#include + +namespace Plugin +{ + +ExamplePlugin::ExamplePlugin() +{ +} + +ExamplePlugin::~ExamplePlugin() +{ + Q_FOREACH(QObject *obj, m_autoReleaseObjects) + { + m_plugMan->removeObject(obj); + } + qDeleteAll(m_autoReleaseObjects); + m_autoReleaseObjects.clear(); +} + +bool ExamplePlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString) +{ + Q_UNUSED(errorString); + m_plugMan = pluginManager; + + addAutoReleasedObject(new ExampleSettingsPage(this)); + addAutoReleasedObject(new ExampleContext(this)); + addAutoReleasedObject(new ExampleCoreListener(this)); + return true; +} + +void ExamplePlugin::extensionsInitialized() +{ + Core::ICore *core = Core::ICore::instance(); + Core::MenuManager *menuManager = core->menuManager(); + QAction *exampleAction1 = new QAction("Example1", this); + QAction *exampleAction2 = new QAction("Example2", this); + QAction *aboutQtAction = menuManager->action(Core::Constants::ABOUT_QT); + QMenu *helpMenu = menuManager->menu(Core::Constants::M_HELP); + helpMenu->insertAction(aboutQtAction, exampleAction1); + helpMenu->addSeparator(); + helpMenu->addAction(exampleAction2); + menuManager->menuBar()->addMenu("ExampleMenu"); +} + +void ExamplePlugin::setNelContext(NLMISC::INelContext *nelContext) +{ +#ifdef NL_OS_WINDOWS + // Ensure that a context doesn't exist yet. + // This only applies to platforms without PIC, e.g. Windows. + nlassert(!NLMISC::INelContext::isContextInitialised()); +#endif // NL_OS_WINDOWS + m_LibContext = new NLMISC::CLibraryContext(*nelContext); +} + +void ExamplePlugin::addAutoReleasedObject(QObject *obj) +{ + m_plugMan->addObject(obj); + m_autoReleaseObjects.prepend(obj); +} + +} + +Q_EXPORT_PLUGIN(Plugin::ExamplePlugin) \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/plugin1.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_plugin.h similarity index 59% rename from code/nel/tools/3d/object_viewer_qt/src/plugins/example/plugin1.h rename to code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_plugin.h index 5077ff59e..bfb400651 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/plugin1.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_plugin.h @@ -18,56 +18,41 @@ namespace NLMISC class CLibraryContext; } -namespace ExtensionSystem -{ -class IPluginSpec; -} - namespace Plugin { -class MyPlugin : public QObject, public ExtensionSystem::IPlugin +class ExamplePlugin : public QObject, public ExtensionSystem::IPlugin { Q_OBJECT Q_INTERFACES(ExtensionSystem::IPlugin) public: - - virtual ~MyPlugin(); + ExamplePlugin(); + virtual ~ExamplePlugin(); bool initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString); void extensionsInitialized(); - void setNelContext(NLMISC::INelContext *nelContext); - QString name() const; - QString version() const; - QString vendor() const; - QString description() const; - QStringList dependencies() const; - void addAutoReleasedObject(QObject *obj); - QObject *objectByName(const QString &name) const; - ExtensionSystem::IPluginSpec *pluginByName(const QString &name) const; - protected: - NLMISC::CLibraryContext *_LibContext; + NLMISC::CLibraryContext *m_LibContext; private: - ExtensionSystem::IPluginManager *_plugMan; - QList _autoReleaseObjects; + ExtensionSystem::IPluginManager *m_plugMan; + QList m_autoReleaseObjects; }; -class CExampleContext: public Core::IContext +class ExampleContext: public Core::IContext { Q_OBJECT public: - CExampleContext(QObject *parent = 0): IContext(parent) + ExampleContext(QObject *parent = 0): IContext(parent) { - m_simpleViewer = new CSimpleViewer(); + m_simpleViewer = new SimpleViewer(); } - virtual ~CExampleContext() {} + virtual ~ExampleContext() {} virtual QString id() const { @@ -95,7 +80,7 @@ public: { } - CSimpleViewer *m_simpleViewer; + SimpleViewer *m_simpleViewer; }; } // namespace Plugin diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_settings_page.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_settings_page.cpp index 50e7c9db5..6cea967db 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_settings_page.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_settings_page.cpp @@ -27,45 +27,45 @@ namespace Plugin { -CExampleSettingsPage::CExampleSettingsPage(QObject *parent) +ExampleSettingsPage::ExampleSettingsPage(QObject *parent) : IOptionsPage(parent), - _currentPage(NULL) + m_currentPage(0) { } -QString CExampleSettingsPage::id() const +QString ExampleSettingsPage::id() const { return QLatin1String("ExamplePage"); } -QString CExampleSettingsPage::trName() const +QString ExampleSettingsPage::trName() const { return tr("Example page"); } -QString CExampleSettingsPage::category() const +QString ExampleSettingsPage::category() const { - return QLatin1String("General"); + return QLatin1String("Example"); } -QString CExampleSettingsPage::trCategory() const +QString ExampleSettingsPage::trCategory() const { - return tr("General"); + return tr("Example"); } -QIcon CExampleSettingsPage::categoryIcon() const +QIcon ExampleSettingsPage::categoryIcon() const { return QIcon(); } -QWidget *CExampleSettingsPage::createPage(QWidget *parent) +QWidget *ExampleSettingsPage::createPage(QWidget *parent) { - _currentPage = new QWidget(parent); - _ui.setupUi(_currentPage); - return _currentPage; + m_currentPage = new QWidget(parent); + m_ui.setupUi(m_currentPage); + return m_currentPage; } -void CExampleSettingsPage::apply() +void ExampleSettingsPage::apply() { } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_settings_page.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_settings_page.h index 3475f843f..8a1a7cef1 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_settings_page.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_settings_page.h @@ -29,15 +29,13 @@ class QWidget; namespace Plugin { -/** -@class CExampleSettingsPage -*/ -class CExampleSettingsPage : public Core::IOptionsPage + +class ExampleSettingsPage : public Core::IOptionsPage { Q_OBJECT public: - CExampleSettingsPage(QObject *parent = 0); - virtual ~CExampleSettingsPage() {} + ExampleSettingsPage(QObject *parent = 0); + virtual ~ExampleSettingsPage() {} virtual QString id() const; virtual QString trName() const; @@ -50,8 +48,8 @@ public: virtual void finish() {} private: - QWidget *_currentPage; - Ui::CExampleSettingsPage _ui; + QWidget *m_currentPage; + Ui::ExampleSettingsPage m_ui; }; } // namespace Plugin diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_settings_page.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_settings_page.ui index b839d98ce..0d98ad6ab 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_settings_page.ui +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/example_settings_page.ui @@ -1,7 +1,7 @@ - CExampleSettingsPage - + ExampleSettingsPage + 0 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/ovqt_plugin_example.xml b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/ovqt_plugin_example.xml new file mode 100644 index 000000000..43656a87b --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/ovqt_plugin_example.xml @@ -0,0 +1,10 @@ + + ovqt_plugin_example + ExamplePlugin + 0.2 + dnk-88 + Example ovqt plugin. + + + + \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/plugin1.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/plugin1.cpp deleted file mode 100644 index f218c3230..000000000 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/plugin1.cpp +++ /dev/null @@ -1,120 +0,0 @@ -// Project includes -#include "plugin1.h" -#include "example_settings_page.h" -#include "simple_viewer.h" -#include "../core/icore.h" -#include "../core/core_constants.h" -#include "../core/imenu_manager.h" -#include "../../extension_system/iplugin_spec.h" - -// NeL includes -#include "nel/misc/debug.h" - -// Qt includes -#include -#include -#include -#include -#include -#include - -namespace Plugin -{ -MyPlugin::~MyPlugin() -{ - Q_FOREACH(QObject *obj, _autoReleaseObjects) - { - _plugMan->removeObject(obj); - } - qDeleteAll(_autoReleaseObjects); - _autoReleaseObjects.clear(); -} - -bool MyPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString) -{ - Q_UNUSED(errorString); - _plugMan = pluginManager; - - addAutoReleasedObject(new CExampleSettingsPage(this)); - addAutoReleasedObject(new CExampleContext(this)); - addAutoReleasedObject(new CCoreListener(this)); - return true; -} - -void MyPlugin::extensionsInitialized() -{ - Core::ICore *core = Core::ICore::instance(); - Core::IMenuManager *menuManager = core->menuManager(); - //menuManager = _plugMan->getObject(); - QAction *exampleAction1 = new QAction("Example1", this); - QAction *exampleAction2 = new QAction("Example2", this); - QAction *aboutQtAction = menuManager->action(Core::Constants::ABOUT_QT); - QMenu *helpMenu = menuManager->menu(Core::Constants::M_HELP); - helpMenu->insertAction(aboutQtAction, exampleAction1); - helpMenu->addSeparator(); - helpMenu->addAction(exampleAction2); - menuManager->menuBar()->addMenu("ExampleMenu"); -} - -void MyPlugin::setNelContext(NLMISC::INelContext *nelContext) -{ -#ifdef NL_OS_WINDOWS - // Ensure that a context doesn't exist yet. - // This only applies to platforms without PIC, e.g. Windows. - nlassert(!NLMISC::INelContext::isContextInitialised()); -#endif // NL_OS_WINDOWS - _LibContext = new NLMISC::CLibraryContext(*nelContext); -} - -QString MyPlugin::name() const -{ - return "ExamplePlugin"; -} - -QString MyPlugin::version() const -{ - return "0.2"; -} - -QString MyPlugin::vendor() const -{ - return "dnk-88"; -} - -QString MyPlugin::description() const -{ - return "Example ovqt plugin."; -} - -QStringList MyPlugin::dependencies() const -{ - QStringList list; - list.append(Core::Constants::OVQT_CORE_PLUGIN); - return list; -} - -void MyPlugin::addAutoReleasedObject(QObject *obj) -{ - _plugMan->addObject(obj); - _autoReleaseObjects.prepend(obj); -} - -QObject* MyPlugin::objectByName(const QString &name) const -{ - Q_FOREACH (QObject *qobj, _plugMan->allObjects()) - if (qobj->objectName() == name) - return qobj; - return 0; -} - -ExtensionSystem::IPluginSpec *MyPlugin::pluginByName(const QString &name) const -{ - Q_FOREACH (ExtensionSystem::IPluginSpec *spec, _plugMan->plugins()) - if (spec->name() == name) - return spec; - return 0; -} - -} - -Q_EXPORT_PLUGIN(Plugin::MyPlugin) \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/qnel_widget.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/qnel_widget.h index a54e6bb8a..59bb9ecda 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/qnel_widget.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/qnel_widget.h @@ -82,7 +82,7 @@ public: return m_driver; } - virtual QPaintEngine* paintEngine() const + virtual QPaintEngine *paintEngine() const { return NULL; } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/simple_viewer.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/simple_viewer.cpp index 1f6df9117..601909047 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/simple_viewer.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/simple_viewer.cpp @@ -29,19 +29,19 @@ namespace Plugin { -CSimpleViewer::CSimpleViewer(QWidget *parent) +SimpleViewer::SimpleViewer(QWidget *parent) : QWidget(parent) { QGridLayout *gridLayout = new QGridLayout(this); gridLayout->setObjectName(QString::fromUtf8("gridLayoutSimpleViewer")); gridLayout->setContentsMargins(0, 0, 0, 0); - NLQT::QNLWidget *_nelWidget = new NLQT::QNLWidget(this); - gridLayout->addWidget(_nelWidget, 0, 0, 1, 1); + NLQT::QNLWidget *m_nelWidget = new NLQT::QNLWidget(this); + gridLayout->addWidget(m_nelWidget, 0, 0, 1, 1); m_undoStack = new QUndoStack(this); } -bool CCoreListener::closeMainWindow() const +bool ExampleCoreListener::closeMainWindow() const { int ret = QMessageBox::question(0, tr("Example close event hook"), tr("Do you want to close window?"), diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/simple_viewer.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/simple_viewer.h index 14b782c22..793b0745e 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/simple_viewer.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/simple_viewer.h @@ -31,22 +31,22 @@ class QWidget; namespace Plugin { -class CSimpleViewer : public QWidget +class SimpleViewer : public QWidget { Q_OBJECT public: - CSimpleViewer(QWidget *parent = 0); - virtual ~CSimpleViewer() {} + SimpleViewer(QWidget *parent = 0); + virtual ~SimpleViewer() {} QUndoStack *m_undoStack; }; -class CCoreListener : public Core::ICoreListener +class ExampleCoreListener : public Core::ICoreListener { Q_OBJECT public: - CCoreListener(QObject *parent = 0): ICoreListener(parent) {} - virtual ~CCoreListener() {} + ExampleCoreListener(QObject *parent = 0): ICoreListener(parent) {} + virtual ~ExampleCoreListener() {} virtual bool closeMainWindow() const; }; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/CMakeLists.txt index d1dd346ba..b29f32152 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/CMakeLists.txt +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/CMakeLists.txt @@ -10,10 +10,14 @@ SET(OVQT_EXT_SYS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin SET(OVQT_PLUG_GEORGES_EDITOR_HDR georges_editor_plugin.h georges_editor_form.h - georges_dirtree_dialog.h) + georges_dirtree_dialog.h + georges_filesystem_model.h + georges_treeview_dialog.h + expandable_headerview.h) SET(OVQT_PLUG_GEORGES_EDITOR_UIS georges_editor_form.ui - georges_dirtree_form.ui) + georges_dirtree_form.ui + georges_treeview_form.ui) SET(OVQT_PLUGIN_GEORGES_EDITOR_RCS georges_editor.qrc) @@ -32,7 +36,7 @@ SOURCE_GROUP("OVQT Extension System" FILES ${OVQT_EXT_SYS_SRC}) ADD_LIBRARY(ovqt_plugin_georges_editor MODULE ${SRC} ${OVQT_PLUG_GEORGES_EDITOR_MOC_SRC} ${OVQT_EXT_SYS_SRC} ${OVQT_PLUG_GEORGES_EDITOR_UI_HDRS} ${OVQT_PLUGIN_GEORGES_EDITOR_RC_SRCS}) -TARGET_LINK_LIBRARIES(ovqt_plugin_georges_editor ovqt_plugin_core nelmisc ${QT_LIBRARIES}) +TARGET_LINK_LIBRARIES(ovqt_plugin_georges_editor ovqt_plugin_core nelmisc nelgeorges ${QT_LIBRARIES}) NL_DEFAULT_PROPS(ovqt_plugin_georges_editor "NeL, Tools, 3D: Object Viewer Qt Plugin: Georges Editor") NL_ADD_RUNTIME_FLAGS(ovqt_plugin_georges_editor) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/expandable_headerview.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/expandable_headerview.cpp new file mode 100644 index 000000000..7ae482824 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/expandable_headerview.cpp @@ -0,0 +1,143 @@ +// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework +// Copyright (C) 2011 Adrian Jaekel +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Project includes +#include "expandable_headerview.h" + +// Qt includes +#include +#include +#include + +namespace Plugin +{ + + ExpandableHeaderView::ExpandableHeaderView(Qt::Orientation orientation, QWidget * parent) + : QHeaderView(orientation, parent), + m_expanded(true), + m_inDecoration(false) + { + } + + void ExpandableHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const + { + painter->save(); + QHeaderView::paintSection(painter, rect, logicalIndex); + painter->restore(); + + if (logicalIndex == 0) + { + QRect sectionRect = this->orientation() == Qt::Horizontal ? + QRect(this->sectionPosition(logicalIndex), 0, + this->sectionSize(logicalIndex), this->height()): + QRect(0, this->sectionPosition(logicalIndex), + this->width(), this->sectionSize(logicalIndex)); + + QStyleOptionHeader opt; + initStyleOption(&opt); + opt.iconAlignment = Qt::AlignVCenter; + + QVariant variant = this->model()->headerData(logicalIndex, this->orientation(), + Qt::DecorationRole); + opt.icon = qvariant_cast(variant); + if (opt.icon.isNull()) + { + opt.icon = qvariant_cast(variant); + } + QRect headerLabelRect = this->style()->subElementRect(QStyle::SE_HeaderLabel, &opt, this); + + QPixmap pixmap + = opt.icon.pixmap(this->style()->pixelMetric(QStyle::PM_SmallIconSize), + (opt.state & QStyle::State_Enabled) ? QIcon::Normal : QIcon::Disabled); + QRect aligned = this->style()->alignedRect(opt.direction, QFlag(opt.iconAlignment), + pixmap.size(), headerLabelRect); + QRect inter = aligned.intersected(headerLabelRect); + + QStyleOption option; + option.rect = QRect(inter.x()-2,inter.y(),inter.width(),inter.height()); + if (m_expanded) + option.state = QStyle::State_Children | QStyle::State_Open; + else + option.state = QStyle::State_Children; + if (m_inDecoration) + option.state |= QStyle::State_MouseOver; + QApplication::style()->drawPrimitive(QStyle::PE_IndicatorBranch, &option, painter); + } + } + + void ExpandableHeaderView::mousePressEvent(QMouseEvent *e) + { + int section = logicalIndexAt(e->x()); + + if (section == 0 && m_inDecoration) { + if (m_expanded) + m_expanded = false; + else + m_expanded = true; + this->QHeaderView::mousePressEvent(e); + Q_EMIT headerClicked(section); + } + } + + void ExpandableHeaderView::mouseMoveEvent(QMouseEvent *e) + { + int section = this->logicalIndexAt(e->x()); + + if (section != 0) + return; + + bool tmp = m_inDecoration; + if (isPointInDecoration(section, e->pos())) + m_inDecoration = true; + else + m_inDecoration = false; + + if (m_inDecoration != tmp) + updateSection(0); + } + + bool ExpandableHeaderView::isPointInDecoration(int section, QPoint pos)const + { + QRect sectionRect = this->orientation() == Qt::Horizontal ? + QRect(this->sectionPosition(section), 0, + this->sectionSize(section), this->height()): + QRect(0, this->sectionPosition(section), + this->width(), this->sectionSize(section)); + QStyleOptionHeader opt; + this->initStyleOption(&opt); + opt.iconAlignment = Qt::AlignVCenter; + QVariant variant = this->model()->headerData(section, this->orientation(), + Qt::DecorationRole); + opt.icon = qvariant_cast(variant); + if (opt.icon.isNull()) + { + opt.icon = qvariant_cast(variant); + } + QRect headerLabelRect = this->style()->subElementRect(QStyle::SE_HeaderLabel, &opt, this); + // from qcommonstyle.cpp + if (opt.icon.isNull()) + { + return false; + } + QPixmap pixmap + = opt.icon.pixmap(this->style()->pixelMetric(QStyle::PM_SmallIconSize), + (opt.state & QStyle::State_Enabled) ? QIcon::Normal : QIcon::Disabled); + QRect aligned = this->style()->alignedRect(opt.direction, QFlag(opt.iconAlignment), + pixmap.size(), headerLabelRect); + QRect inter = aligned.intersected(headerLabelRect); + return inter.contains(pos); + } +} diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/expandable_headerview.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/expandable_headerview.h new file mode 100644 index 000000000..596bf5ba1 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/expandable_headerview.h @@ -0,0 +1,49 @@ +// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework +// Copyright (C) 2011 Adrian Jaekel +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef EXPANDABLE_HEADERVIEW_H +#define EXPANDABLE_HEADERVIEW_H + +// Qt includes +#include + +namespace Plugin +{ + class ExpandableHeaderView : public QHeaderView + { + Q_OBJECT + public: + ExpandableHeaderView(Qt::Orientation orientation, QWidget * parent = 0); + + bool* expanded() { return &m_expanded; } + + protected: + void paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const; + bool isPointInDecoration(int section, QPoint pos)const; + void mousePressEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + + private: + bool m_expanded; + bool m_inDecoration; + +Q_SIGNALS: + void headerClicked(int); + }; + +} /* namespace NLQT */ + +#endif // EXPANDABLE_HEADERVIEW_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.cpp new file mode 100644 index 000000000..4d04bc6b5 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.cpp @@ -0,0 +1,278 @@ +// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework +// Copyright (C) 2011 Adrian Jaekel +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#include "formdelegate.h" + +// NeL includes +#include +#include +#include + +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Project includes +#include "georgesform_model.h" +#include "georgesform_proxy_model.h" +#include "formitem.h" + +namespace Plugin +{ + + FormDelegate::FormDelegate(QObject *parent) + : QStyledItemDelegate(parent) + { + } + + QWidget *FormDelegate::createEditor(QWidget *parent, + const QStyleOptionViewItem & option , + const QModelIndex &index) const + { + const CGeorgesFormProxyModel * mp = dynamic_cast(index.model()); + const CGeorgesFormModel * m = dynamic_cast(mp->sourceModel()); + CFormItem *item = static_cast(mp->mapToSource(index).internalPointer()); + QString value = item->data(1).toString(); + + if (value.isEmpty() || !mp || !m) + return 0; + + CFormItem* curItem = m->getItem(mp->mapToSource(index)); + NLGEORGES::UFormElm *curElm = curItem->getFormElm(); + if (!curElm) { + // TODO: create new Element + return 0; + } + const NLGEORGES::UType *type = curElm->getType(); + if(type) + { + int numDefinitions = type->getNumDefinition(); + + if (numDefinitions) + { + std::string l, v; + QString label,value; + + QComboBox *editor = new QComboBox(parent); + for (int i = 0; i < numDefinitions; i++) + { + type->getDefinition(i,l,v); + label = l.c_str(); + value = v.c_str(); + editor->addItem(label); + } + return editor; + } + else + { + switch (type->getType()) + { + case NLGEORGES::UType::UnsignedInt: + case NLGEORGES::UType::SignedInt: + { + QSpinBox *editor = new QSpinBox(parent); + + //QString min = QString(type->getMin().c_str()); + //QString max = QString(type->getMax().c_str()); + //QString inc = QString(type->getIncrement().c_str()); + //nldebug(QString("min %1 max %2 inc %3").arg(min).arg(max).arg(inc).toStdString().c_str()); + + // TODO: use saved min/max values + editor->setMinimum(-99999); + editor->setMaximum(99999); + editor->setSingleStep(1); + return editor; + } + case NLGEORGES::UType::Double: + { + QDoubleSpinBox *editor = new QDoubleSpinBox(parent); + + //QString min = QString(type->getMin().c_str()); + //QString max = QString(type->getMax().c_str()); + //QString inc = QString(type->getIncrement().c_str()); + //nldebug(QString("min %1 max %2 inc %3").arg(min).arg(max).arg(inc).toStdString().c_str()); + + // TODO: use saved min/max values + editor->setMinimum(-99999); + editor->setMaximum(99999); + editor->setSingleStep(0.1); + editor->setDecimals(1); + return editor; + } + case NLGEORGES::UType::Color: + { + return new QColorDialog(); + } + default: // UType::String + { + QLineEdit *editor = new QLineEdit(parent); + return editor; + } + } + } + } + return 0; + } + + void FormDelegate::setEditorData(QWidget *editor, + const QModelIndex &index) const + { + const CGeorgesFormProxyModel * mp = dynamic_cast(index.model()); + const CGeorgesFormModel * m = dynamic_cast(mp->sourceModel()); + + const NLGEORGES::UType *type = m->getItem(mp->mapToSource(index))->getFormElm()->getType(); + int numDefinitions = type->getNumDefinition(); + QString value = index.model()->data(index, Qt::DisplayRole).toString(); + + if (numDefinitions) + { + QComboBox *cb = static_cast(editor); + cb->setCurrentIndex(cb->findText(value)); + } + else + { + switch (type->getType()) + { + case NLGEORGES::UType::UnsignedInt: + case NLGEORGES::UType::SignedInt: + { + QSpinBox *spinBox = static_cast(editor); + spinBox->setValue((int)value.toDouble()); + break; + } + case NLGEORGES::UType::Double: + { + QDoubleSpinBox *spinBox = static_cast(editor); + spinBox->setValue(value.toDouble()); + break; + } + case NLGEORGES::UType::Color: + { + break; + } + default: + { + QLineEdit *textEdit = static_cast(editor); + textEdit->setText(value); + break; + } + } + } + } + + void FormDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, + const QModelIndex &index) const + { + const CGeorgesFormProxyModel * mp = dynamic_cast(index.model()); + const CGeorgesFormModel * m = dynamic_cast(mp->sourceModel()); + + const NLGEORGES::UType *type = m->getItem(mp->mapToSource(index))->getFormElm()->getType(); + int numDefinitions = type->getNumDefinition(); + + if (numDefinitions) + { + QComboBox *comboBox = static_cast(editor); + QString value = comboBox->currentText(); + QString oldValue = index.model()->data(index, Qt::DisplayRole).toString(); + if (value == oldValue) + { + // nothing's changed + } + else + { + nldebug(QString("setModelData from %1 to %2") + .arg(oldValue).arg(value).toStdString().c_str()); + model->setData(index, value, Qt::EditRole); + } + } + else + { + switch (type->getType()) + { + case NLGEORGES::UType::UnsignedInt: + case NLGEORGES::UType::SignedInt: + { + QSpinBox *spinBox = static_cast(editor); + int value = spinBox->value(); + QString oldValue = index.model()->data(index, Qt::DisplayRole).toString(); + if (QString("%1").arg(value) == oldValue) + { + // nothing's changed + } + else + { + nldebug(QString("setModelData from %1 to %2") + .arg(oldValue).arg(value).toStdString().c_str()); + model->setData(index, value, Qt::EditRole); + } + break; + } + case NLGEORGES::UType::Double: + { + QDoubleSpinBox *spinBox = static_cast(editor); + double value = spinBox->value(); + QString oldValue = index.model()->data(index, Qt::DisplayRole).toString(); + if (QString("%1").arg(value) == oldValue) + { + // nothing's changed + } + else + { + nldebug(QString("setModelData from %1 to %2") + .arg(oldValue).arg(value).toStdString().c_str()); + model->setData(index, value, Qt::EditRole); + } + break; + } + case NLGEORGES::UType::Color: + { + break; // TODO + } + default: // UType::String + { + QLineEdit *textEdit = static_cast(editor); + QString value = textEdit->text(); + QString oldValue = index.model()->data(index, Qt::DisplayRole).toString(); + if (value == oldValue) + { + // nothing's changed + } + else + { + nldebug(QString("setModelData from %1 to %2") + .arg(oldValue).arg(value).toStdString().c_str()); + model->setData(index, value, Qt::EditRole); + } + break; + } + } + } + } + + void FormDelegate::updateEditorGeometry(QWidget *editor, + const QStyleOptionViewItem &option, const QModelIndex &index) const + { + QRect r = option.rect; + editor->setGeometry(r); + } +} /* namespace Plugin */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.h new file mode 100644 index 000000000..a309da1fc --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formdelegate.h @@ -0,0 +1,41 @@ +// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework +// Copyright (C) 2011 Adrian Jaekel +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef FORMDELEGATE_H +#define FORMDELEGATE_H + +#include + +namespace Plugin +{ + + class FormDelegate : public QStyledItemDelegate + { + + public: + FormDelegate(QObject *parent = 0); + + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, + const QModelIndex &index) const; + void setEditorData(QWidget *editor, const QModelIndex &index) const; + void setModelData(QWidget *editor, QAbstractItemModel *model, + const QModelIndex &index) const; + void updateEditorGeometry(QWidget *editor, + const QStyleOptionViewItem &option, const QModelIndex &index) const; + }; + +} +#endif // FORMDELEGATE_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formitem.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formitem.cpp new file mode 100644 index 000000000..205e18a52 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formitem.cpp @@ -0,0 +1,162 @@ +// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework +// Copyright (C) 2011 Adrian Jaekel +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#include "formitem.h" + +// Qt includes + +// NeL includes +#include +#include +#include + +namespace Plugin +{ + + CFormItem::CFormItem(NLGEORGES::UFormElm* elm, const QList &data, CFormItem *parent, + NLGEORGES::UFormElm::TWhereIsValue wV, NLGEORGES::UFormElm::TWhereIsNode wN) + { + parentItem = parent; + itemData = data; + formElm = elm; + whereV = wV; + whereN = wN; + } + + CFormItem::~CFormItem() + { + qDeleteAll(childItems); + } + + void CFormItem::appendChild(CFormItem *item) + { + childItems.append(item); + } + + CFormItem *CFormItem::child(int row) + { + return childItems.value(row); + } + + int CFormItem::childCount() const + { + return childItems.count(); + } + + int CFormItem::columnCount() const + { + //nlinfo("columnCount %d",itemData.count()); + return itemData.count(); + } + + QVariant CFormItem::data(int column) const + { + return itemData.value(column); + } + + CFormItem *CFormItem::parent() + { + return parentItem; + } + + int CFormItem::row() const + { + if (parentItem) + return parentItem->childItems.indexOf(const_cast(this)); + + return 0; + } + + bool CFormItem::setData(int column, const QVariant &value) + { + if (column < 0 || column >= itemData.size()) + return false; + + // TODO: default values + if (!formElm) + return false; + + itemData[column] = value; + if (formElm->isAtom()) + { + const NLGEORGES::UType *type = formElm->getType(); + if (type) + { + switch (type->getType()) + { + case NLGEORGES::UType::UnsignedInt: + case NLGEORGES::UType::SignedInt: + case NLGEORGES::UType::Double: + case NLGEORGES::UType::String: + if (parentItem->formElm->isArray()) + { + //((NLGEORGES::CFormElm*)parentItem->formElm);//->arrayInsertNodeByName( + //if(parentItem->formElm->getArrayNode(elmName, num)) + //{ + //} + + bool ok; + // TODO: the node can be renamed from eg "#0" to "foobar" + int arrayIndex = itemData[0].toString().remove("#").toInt(&ok); + if(ok) + { + NLGEORGES::UFormElm *elmt = 0; + if(parentItem->formElm->getArrayNode(&elmt, arrayIndex) && elmt) + { + if (elmt->isAtom()) + { + ((NLGEORGES::CFormElmAtom*)elmt)->setValue(value.toString().toStdString().c_str()); + nldebug(QString("array element string %1 %2") + .arg(itemData[0].toString()).arg(value.toString()) + .toStdString().c_str()); + } + } + } + } + else + { + if(parentItem->formElm->setValueByName( + value.toString().toStdString().c_str(), + itemData[0].toString().toStdString().c_str())) + { + nldebug(QString("string %1 %2") + .arg(itemData[0].toString()).arg(value.toString()) + .toStdString().c_str()); + } + else + { + nldebug(QString("FAILED string %1 %2") + .arg(itemData[0].toString()).arg(value.toString()) + .toStdString().c_str()); + } + } + break; + case NLGEORGES::UType::Color: + nldebug("Color is TODO"); + break; + default: + break; + } + } + } + else + { + nldebug("setting sth other than Atom"); + } + //formElm->setValueByName(); + return true; + } +} diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formitem.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formitem.h new file mode 100644 index 000000000..b85b12275 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/formitem.h @@ -0,0 +1,69 @@ +// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework +// Copyright (C) 2011 Adrian Jaekel +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef FORMITEM_H +#define FORMITEM_H + +// NeL includes +#include + +// Qt includes +#include +#include + +namespace Plugin +{ + + class CFormItem + + { + public: + CFormItem(NLGEORGES::UFormElm *elm, const QList &data, + CFormItem *parent = 0, + NLGEORGES::UFormElm::TWhereIsValue = NLGEORGES::UFormElm::ValueForm, + NLGEORGES::UFormElm::TWhereIsNode = NLGEORGES::UFormElm::NodeForm); + ~CFormItem(); + + void appendChild(CFormItem *child); + + CFormItem *child(int row); + int childCount() const; + int columnCount() const; + QVariant data(int column) const; + int row() const; + CFormItem *parent(); + bool setData(int column, const QVariant &value); + NLGEORGES::UFormElm* getFormElm() {return formElm;} + NLGEORGES::UFormElm::TWhereIsValue valueFrom() + { + return whereV; + } + NLGEORGES::UFormElm::TWhereIsNode nodeFrom() + { + return whereN; + } + + private: + QList childItems; + QList itemData; + CFormItem *parentItem; + NLGEORGES::UFormElm* formElm; + NLGEORGES::UFormElm::TWhereIsValue whereV; + NLGEORGES::UFormElm::TWhereIsNode whereN; + }; // CFormItem + +} +#endif // FORMITEM_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges.cpp new file mode 100644 index 000000000..b93f93ec4 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges.cpp @@ -0,0 +1,64 @@ +// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework +// Copyright (C) 2011 Adrian Jaekel +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#include "georges.h" +#include "nel/misc/o_xml.h" + +// STL includes + +// NeL includes +#include +#include +#include + +// Project includes + +using namespace NLGEORGES; + +namespace Plugin +{ + + CGeorges::CGeorges(): FormLoader(0) + { + FormLoader = UFormLoader::createLoader(); + } + + CGeorges::~CGeorges() + { + } + + UForm *CGeorges::loadForm(std::string formName) + { + UForm *form = FormLoader->loadForm(formName.c_str()); + + return form; + } + + UFormDfn *CGeorges::loadFormDfn(std::string formName) + { + UFormDfn *formdfn = FormLoader->loadFormDfn(formName.c_str()); + + return formdfn; + } + + UType *CGeorges::loadFormType(std::string formName) + { + UType *type = FormLoader->loadFormType(formName.c_str()); + + return type; + } + +} /* namespace Plugin */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges.h new file mode 100644 index 000000000..eb9a6b7da --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges.h @@ -0,0 +1,69 @@ +// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework +// Copyright (C) 2011 Adrian Jaekel +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef GEORGES_H +#define GEORGES_H + +// Misc + +// STL includes +#include + +// NeL includes + +// Qt includes + +// Project includes + +namespace NLGEORGES +{ + class UType; + class UForm; + class UFormDfn; + class UFormLoader; +} + +using namespace NLGEORGES; + +namespace Plugin +{ + + /** + @class CGeorges + A CGeorges class loading and viewing sheets. + */ + class CGeorges + { + public: + /// Default constructor. + CGeorges(); + virtual ~CGeorges(); + + // Load the given form root + UForm* loadForm(std::string formName); + // Load a dfn + UFormDfn* loadFormDfn(std::string formName); + // Load a type + UType *loadFormType (std::string formName); + + // A form loader + UFormLoader *FormLoader; + + };/* class CGeorges */ + +} /* namespace Plugin */ + +#endif // GEORGES_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_dirtree_dialog.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_dirtree_dialog.cpp index f7e250cce..de7a105ab 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_dirtree_dialog.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_dirtree_dialog.cpp @@ -23,20 +23,30 @@ // NeL includes -//using namespace NLMISC; - namespace Plugin { CGeorgesDirTreeDialog::CGeorgesDirTreeDialog(QString ldPath, QWidget *parent) - :QDockWidget(parent), m_ldPath(ldPath) + :QDockWidget(parent), + m_ldPath(ldPath) { m_ui.setupUi(this); + m_ui.filterResetButton->setIcon( + QApplication::style()->standardIcon(QStyle::SP_DialogCancelButton)); + m_dirModel = new CGeorgesFileSystemModel(m_ldPath); + //m_proxyModel = new CGeorgesFileSystemProxyModel(this); + + //m_proxyModel->setSourceModel(m_dirModel); m_ui.dirTree->setModel(m_dirModel); + // TODO: filtering in tree model is ... complicated - so hide it for now + m_ui.filterLineEdit->hide(); + m_ui.filterResetButton->hide(); + m_ui.label->hide(); + if (m_dirModel->isCorrectLDPath()) { m_dirModel->setRootPath(m_ldPath); @@ -61,7 +71,6 @@ CGeorgesDirTreeDialog::~CGeorgesDirTreeDialog() void CGeorgesDirTreeDialog::fileSelected(QModelIndex index) { - QString name; if (index.isValid() && !m_dirModel->isDir(index)) { Q_EMIT selectedForm(m_dirModel->fileName(index)); @@ -81,8 +90,12 @@ void CGeorgesDirTreeDialog::ldPathChanged(QString path) m_ldPath = path; delete m_dirModel; + //delete m_proxyModel; m_dirModel = new CGeorgesFileSystemModel(m_ldPath); + //m_proxyModel = new CGeorgesFileSystemProxyModel(this); + + //m_proxyModel->setSourceModel(m_dirModel); m_ui.dirTree->setModel(m_dirModel); if (m_dirModel->isCorrectLDPath()) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_dirtree_dialog.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_dirtree_dialog.h index 3079f76c2..fa783bca0 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_dirtree_dialog.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_dirtree_dialog.h @@ -45,6 +45,7 @@ private: Ui::CGeorgesDirTreeDialog m_ui; CGeorgesFileSystemModel *m_dirModel; + //CGeorgesFileSystemProxyModel *m_proxyModel; QString m_ldPath; Q_SIGNALS: @@ -54,7 +55,6 @@ private Q_SLOTS: void fileSelected(QModelIndex index); void changeFile(QString file); - friend class CMainWindow; }; /* CGEorgesDirTreeDialog */ } /* namespace NLQT */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_dirtree_form.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_dirtree_form.ui index 8731d1ca8..4a429af1f 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_dirtree_form.ui +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_dirtree_form.ui @@ -19,7 +19,7 @@ 200 - 111 + 141 @@ -36,7 +36,7 @@ - + @@ -46,9 +46,37 @@ + + + + + + + ... + + + + :/images/ic_nel_georges_editor.png:/images/ic_nel_georges_editor.png + + + true + + + + + + + Filter + + + - + + + + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.cpp index aa614a161..252d7fd7e 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.cpp @@ -18,9 +18,10 @@ #include "georges_editor_form.h" #include "georges_editor_constants.h" #include "georges_dirtree_dialog.h" +#include "georges_treeview_dialog.h" #include "../core/icore.h" -#include "../core/imenu_manager.h" +#include "../core/menu_manager.h" #include "../core/core_constants.h" // NeL includes @@ -30,110 +31,257 @@ #include #include #include +#include namespace Plugin { -GeorgesEditorForm::GeorgesEditorForm(QWidget *parent) - : QMainWindow(parent), - m_georgesDirTreeDialog(0) -{ - m_ui.setupUi(this); - - m_undoStack = new QUndoStack(this); - - _openAction = new QAction(tr("&Open..."), this); - _openAction->setIcon(QIcon(Core::Constants::ICON_OPEN)); - _openAction->setShortcut(QKeySequence::Open); - _openAction->setStatusTip(tr("Open an existing file")); - connect(_openAction, SIGNAL(triggered()), this, SLOT(open())); - - _newAction = new QAction(tr("&New..."), this); - _newAction->setIcon(QIcon(Core::Constants::ICON_NEW)); - _newAction->setShortcut(QKeySequence::New); - _newAction->setStatusTip(tr("Create a new file")); - connect(_newAction, SIGNAL(triggered()), this, SLOT(newFile())); - - _saveAction = new QAction(tr("&Save..."), this); - _saveAction->setIcon(QIcon(Core::Constants::ICON_SAVE)); - _saveAction->setShortcut(QKeySequence::Save); - _saveAction->setStatusTip(tr("Save the current file")); - connect(_saveAction, SIGNAL(triggered()), this, SLOT(save())); - - _fileToolBar = addToolBar(tr("&File")); - _fileToolBar->addAction(_openAction); - _fileToolBar->addAction(_newAction); - _fileToolBar->addAction(_saveAction); - - readSettings(); - - // create leveldesign directory tree dockwidget - m_georgesDirTreeDialog = new CGeorgesDirTreeDialog(m_leveldesignPath, this); - addDockWidget(Qt::LeftDockWidgetArea, m_georgesDirTreeDialog); - //m_georgesDirTreeDialog->setVisible(false); - connect(Core::ICore::instance(), SIGNAL(changeSettings()), - this, SLOT(settingsChanged())); -} - -GeorgesEditorForm::~GeorgesEditorForm() -{ - writeSettings(); -} - -QUndoStack *GeorgesEditorForm::undoStack() const -{ - return m_undoStack; -} - -void GeorgesEditorForm::open() -{ - // TODO: FileDialog & loadFile(); - //QString fileName = QFileDialog::getOpenFileName(); - //loadFile(fileName); -} - -void GeorgesEditorForm::newFile() -{ - -} - -void GeorgesEditorForm::save() -{ - -} - -void GeorgesEditorForm::readSettings() -{ - QSettings *settings = Core::ICore::instance()->settings(); - settings->beginGroup(Constants::GEORGES_EDITOR_SECTION); - settings->endGroup(); - - settings->beginGroup(Core::Constants::DATA_PATH_SECTION); - m_leveldesignPath = settings->value(Core::Constants::LEVELDESIGN_PATH, "l:/leveldesign").toString(); - settings->endGroup(); -} - -void GeorgesEditorForm::writeSettings() -{ - QSettings *settings = Core::ICore::instance()->settings(); - settings->beginGroup(Constants::GEORGES_EDITOR_SECTION); - settings->endGroup(); - settings->sync(); -} - -void GeorgesEditorForm::settingsChanged() -{ - QSettings *settings = Core::ICore::instance()->settings(); - - settings->beginGroup(Core::Constants::DATA_PATH_SECTION); - QString oldLDPath = m_leveldesignPath; - m_leveldesignPath = settings->value(Core::Constants::LEVELDESIGN_PATH, "l:/leveldesign").toString(); - settings->endGroup(); - - if (oldLDPath != m_leveldesignPath) + GeorgesEditorForm::GeorgesEditorForm(QWidget *parent) + : QMainWindow(parent), + m_georgesDirTreeDialog(0), + m_mainDock(0), + m_lastActiveDock(0) { - m_georgesDirTreeDialog->ldPathChanged(m_leveldesignPath); - } -} + m_ui.setupUi(this); + // background for the mainwindow + QString css = "QWidget#centralwidget {"; + css += "image: url(:/images/ic_nel_georges_editor.png);"; + css += "}"; + + // add new mainwindow for sheet dockwidgets + QWidget *widget = new QWidget(this); + widget->setObjectName("centralwidget"); + widget->setStyleSheet(css); + setCentralWidget(widget); + QGridLayout *layout = new QGridLayout(widget); + layout->setContentsMargins(0,0,0,0); + widget->setLayout(layout); + m_mainDock = new QMainWindow(this); + m_mainDock->setDockNestingEnabled(true); + layout->addWidget(m_mainDock); + + m_undoStack = new QUndoStack(this); + + Core::MenuManager *menuManager = Core::ICore::instance()->menuManager(); + m_openAction = menuManager->action(Core::Constants::OPEN); + + m_newAction = new QAction(tr("&New..."), this); + m_newAction->setIcon(QIcon(Core::Constants::ICON_NEW)); + m_newAction->setShortcut(QKeySequence::New); + m_newAction->setStatusTip(tr("Create a new file")); + connect(m_newAction, SIGNAL(triggered()), this, SLOT(newFile())); + + m_saveAction = new QAction(tr("&Save..."), this); + m_saveAction->setIcon(QIcon(Core::Constants::ICON_SAVE)); + m_saveAction->setShortcut(QKeySequence::Save); + m_saveAction->setStatusTip(tr("Save the current file")); + connect(m_saveAction, SIGNAL(triggered()), this, SLOT(save())); + + m_fileToolBar = addToolBar(tr("&File")); + m_fileToolBar->addAction(m_openAction); + m_fileToolBar->addAction(m_newAction); + m_fileToolBar->addAction(m_saveAction); + + m_saveAction->setEnabled(false); + + readSettings(); + + // create leveldesign directory tree dockwidget + m_georgesDirTreeDialog = new CGeorgesDirTreeDialog(m_leveldesignPath, this); + addDockWidget(Qt::LeftDockWidgetArea, m_georgesDirTreeDialog); + restoreDockWidget(m_georgesDirTreeDialog); + + connect(Core::ICore::instance(), SIGNAL(changeSettings()), + this, SLOT(settingsChanged())); + connect(m_georgesDirTreeDialog, SIGNAL(selectedForm(const QString)), + this, SLOT(loadFile(const QString))); + connect(qApp, SIGNAL(focusChanged(QWidget*, QWidget*)), + this, SLOT(focusChanged(QWidget*, QWidget*))); + } + + GeorgesEditorForm::~GeorgesEditorForm() + { + writeSettings(); + } + + QUndoStack *GeorgesEditorForm::undoStack() const + { + return m_undoStack; + } + + void GeorgesEditorForm::open() + { + /*qDebug() << "GeorgesEditorForm::open()"; + if (!m_dockedWidgets.size()) + { + m_dockedWidgets.append(new CGeorgesTreeViewDialog(m_mainDock)); + m_mainDock->addDockWidget(Qt::RightDockWidgetArea, m_dockedWidgets.last()); + } + else + { + m_dockedWidgets.append(new CGeorgesTreeViewDialog(m_mainDock)); + Q_ASSERT(m_dockedWidgets.size() > 1); + m_mainDock->tabifyDockWidget(m_dockedWidgets.at(m_dockedWidgets.size() - 2), m_dockedWidgets.last()); + }*/ + + // TODO: FileDialog & loadFile(); + //m_mainDock->addDockWidget(Qt::TopDockWidgetArea, new CGeorgesTreeViewDialog(m_mainDock, true)); + //m_mainDock->addDockWidget(Qt::LeftDockWidgetArea, new CGeorgesTreeViewDialog(m_mainDock, true)); + //QString fileName = QFileDialog::getOpenFileName(); + //loadFile(fileName); + } + + void GeorgesEditorForm::newFile() + { + + } + + void GeorgesEditorForm::save() + { + + } + + void GeorgesEditorForm::readSettings() + { + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(Constants::GEORGES_EDITOR_SECTION); + + restoreGeometry(settings->value("geometry").toByteArray()); + restoreState(settings->value("windowState").toByteArray()); + + settings->endGroup(); + + settings->beginGroup(Core::Constants::DATA_PATH_SECTION); + m_leveldesignPath = settings->value(Core::Constants::LEVELDESIGN_PATH, "l:/leveldesign").toString(); + settings->endGroup(); + } + + void GeorgesEditorForm::writeSettings() + { + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(Constants::GEORGES_EDITOR_SECTION); + + settings->setValue("geometry", saveGeometry()); + settings->setValue("windowState", saveState()); + + settings->endGroup(); + settings->sync(); + } + + void GeorgesEditorForm::settingsChanged() + { + QSettings *settings = Core::ICore::instance()->settings(); + + settings->beginGroup(Core::Constants::DATA_PATH_SECTION); + QString oldLDPath = m_leveldesignPath; + m_leveldesignPath = settings->value(Core::Constants::LEVELDESIGN_PATH, "l:/leveldesign").toString(); + settings->endGroup(); + + if (oldLDPath != m_leveldesignPath) + { + m_georgesDirTreeDialog->ldPathChanged(m_leveldesignPath); + } + } + + void GeorgesEditorForm::loadFile(const QString fileName) + { + QFileInfo info(fileName); + + if (!m_dockedWidgets.size()) + { + CGeorgesTreeViewDialog *dock = new CGeorgesTreeViewDialog(m_mainDock); + m_lastActiveDock = dock; + m_dockedWidgets.append(dock); + + m_mainDock->addDockWidget(Qt::RightDockWidgetArea, m_dockedWidgets.last()); + connect(m_dockedWidgets.last(), SIGNAL(closing()), + this, SLOT(closingTreeView())); + connect(m_dockedWidgets.last(), SIGNAL(visibilityChanged(bool)), + m_dockedWidgets.last(), SLOT(checkVisibility(bool))); + } + else + { + + Q_FOREACH(CGeorgesTreeViewDialog *wgt, m_dockedWidgets) + { + if (info.fileName() == wgt->loadedForm) + { + wgt->raise(); + return; + } + } + CGeorgesTreeViewDialog *dock = new CGeorgesTreeViewDialog(m_mainDock); + m_dockedWidgets.append(dock); + + connect(m_dockedWidgets.last(), SIGNAL(closing()), + this, SLOT(closingTreeView())); + connect(m_dockedWidgets.last(), SIGNAL(visibilityChanged(bool)), + m_dockedWidgets.last(), SLOT(checkVisibility(bool))); + Q_ASSERT(m_dockedWidgets.size() > 1); + m_mainDock->tabifyDockWidget(m_dockedWidgets.at(m_dockedWidgets.size() - 2), m_dockedWidgets.last()); + } + CForm *form = m_dockedWidgets.last()->getFormByName(info.fileName()); + if (form) + { + m_dockedWidgets.last()->setForm(form); + m_dockedWidgets.last()->loadFormIntoDialog(form); + QApplication::processEvents(); + connect(m_dockedWidgets.last(), SIGNAL(modified()), + this, SLOT(setModified())); + m_dockedWidgets.last()->raise(); + connect(m_dockedWidgets.last(), SIGNAL(changeFile(QString)), + m_georgesDirTreeDialog, SLOT(changeFile(QString))); + } + else + { + m_dockedWidgets.last()->close(); + } + } + + void GeorgesEditorForm::closingTreeView() + { + //qDebug() << "closingTreeView"; + m_dockedWidgets.removeAll(qobject_cast(sender())); + if (qobject_cast(sender()) == m_lastActiveDock) + m_lastActiveDock = 0; + } + + void GeorgesEditorForm::setModified () + { + qDebug() << "setModified"; + if (m_lastActiveDock) + m_saveAction->setEnabled(m_lastActiveDock->isModified()); + else + m_saveAction->setEnabled(false); + } + + void GeorgesEditorForm::focusChanged ( QWidget * old, QWidget * now ) + { + if (now) + { + // ugly, UGLY hack for compensating QDockWidgets failure in focus API + if (now->objectName() == "treeView" || + now->objectName() == "checkBoxDefaults" || + now->objectName() == "checkBoxParent" || + now->objectName() == "commentEdit") + { + QWidget *dlg = 0; + QApplication::focusWidget()? + QApplication::focusWidget()->parentWidget()? + QApplication::focusWidget()->parentWidget()->parentWidget()? + QApplication::focusWidget()->parentWidget()->parentWidget()->parentWidget()? + QApplication::focusWidget()->parentWidget()->parentWidget()->parentWidget()->parentWidget()? + QApplication::focusWidget()->parentWidget()->parentWidget()->parentWidget()->parentWidget()->parentWidget()? + dlg=QApplication::focusWidget()->parentWidget()->parentWidget()->parentWidget()->parentWidget()->parentWidget():dlg=0:dlg=0:dlg=0:dlg=0:dlg=0:dlg=0; + CGeorgesTreeViewDialog *active = qobject_cast(dlg); + if(active) + { + //qDebug() << "focusChanged" << active->loadedForm; + m_lastActiveDock = active; + m_saveAction->setEnabled(active->isModified()); + } + } + } + } } /* namespace Plugin */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.h index 96fceb4ed..6b270ca3d 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.h @@ -27,6 +27,7 @@ namespace Plugin { class CGeorgesDirTreeDialog; +class CGeorgesTreeViewDialog; class GeorgesEditorForm: public QMainWindow { Q_OBJECT @@ -39,9 +40,14 @@ public: public Q_SLOTS: void open(); + void loadFile(const QString fileName); void newFile(); void save(); void settingsChanged(); + void closingTreeView(); + void setModified(); + + void focusChanged(QWidget *old, QWidget *now); private: void readSettings(); @@ -51,12 +57,17 @@ private: Ui::GeorgesEditorForm m_ui; CGeorgesDirTreeDialog *m_georgesDirTreeDialog; - QToolBar *_fileToolBar; - QAction *_openAction; - QAction *_newAction; - QAction *_saveAction; + QToolBar *m_fileToolBar; + QAction *m_openAction; + QAction *m_newAction; + QAction *m_saveAction; QString m_leveldesignPath; + + QMainWindow *m_mainDock; + + QList m_dockedWidgets; + CGeorgesTreeViewDialog *m_lastActiveDock; }; /* class GeorgesEditorForm */ } /* namespace Plugin */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.ui index 905814cc7..3f8cde0f7 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.ui +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.ui @@ -13,12 +13,16 @@ Georges Editor + + + QWidget#centralwidget { image: url(:/images/ic_nel_georges_editor.png); } + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_plugin.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_plugin.cpp index a97188751..199bc20ca 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_plugin.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_plugin.cpp @@ -67,34 +67,6 @@ void GeorgesEditorPlugin::setNelContext(NLMISC::INelContext *nelContext) m_libContext = new NLMISC::CLibraryContext(*nelContext); } -QString GeorgesEditorPlugin::name() const -{ - return tr("Georges Editor"); -} - -QString GeorgesEditorPlugin::version() const -{ - return "0.2"; -} - -QString GeorgesEditorPlugin::vendor() const -{ - return "aquiles"; -} - -QString GeorgesEditorPlugin::description() const -{ - return tr("Tool to create & edit sheets or forms."); -} - -QStringList GeorgesEditorPlugin::dependencies() const -{ - QStringList list; - list.append(Core::Constants::OVQT_CORE_PLUGIN); - list.append("ObjectViewer"); // TODO - return list; -} - void GeorgesEditorPlugin::addAutoReleasedObject(QObject *obj) { m_plugMan->addObject(obj); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_plugin.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_plugin.h index 7cc93dfb4..fabdd600c 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_plugin.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_plugin.h @@ -52,15 +52,8 @@ public: bool initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString); void extensionsInitialized(); void shutdown(); - void setNelContext(NLMISC::INelContext *nelContext); - QString name() const; - QString version() const; - QString vendor() const; - QString description() const; - QStringList dependencies() const; - void addAutoReleasedObject(QObject *obj); protected: diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_filesystem_model.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_filesystem_model.cpp index 20cb30b33..4e021f681 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_filesystem_model.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_filesystem_model.cpp @@ -28,6 +28,10 @@ CGeorgesFileSystemModel::CGeorgesFileSystemModel(QString ldPath, QObject *parent m_correct(false) { checkLDPath(); + + // this yielded no relevant performance boost on my observations + //connect(this, SIGNAL(directoryLoaded(QString)), + // this, SLOT(dir(const QString))); } CGeorgesFileSystemModel::~CGeorgesFileSystemModel() @@ -35,6 +39,23 @@ CGeorgesFileSystemModel::~CGeorgesFileSystemModel() } +void CGeorgesFileSystemModel::dir(const QString &dir) +{ + // in theory this should prefetch all directory entries for the + // filesystem model to speed up later work + QModelIndex i = index(dir); + + if (hasChildren(i)) { + int childCount = rowCount(i); + for (int c=0; cnode(parent); +// return (!indexNode->populatedChildren);*/ +//} + +//CGeorgesFileSystemProxyModel::CGeorgesFileSystemProxyModel(QObject *parent) : QSortFilterProxyModel(parent) +//{ +// setFilterCaseSensitivity(Qt::CaseInsensitive); +//} + +//bool CGeorgesFileSystemProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const +//{ + // TODO this is not perfect as it could be + // eg it should filter all dirs which have no entry + //QModelIndex idx = sourceModel()->index(source_row, 0, source_parent); + //if (sourceModel()->hasChildren(idx)) + //{ + // QString d = sourceModel()->data(idx).toString(); + // //QModelIndex i = mapFromSource(source_parent); + // //if (hasChildren(i)) { + // int childCount = sourceModel()->rowCount(idx); + // for (int c=0; cindex(c, 0, idx); + // if (child.isValid()) { + // bool test = filterAcceptsRow(c, child); + // }*/ + // } + // return true; + //} + //return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent); +//} + +//QVariant CGeorgesFileSystemProxyModel::data ( const QModelIndex & index, int role ) const +//{ +// if (role == Qt::DisplayRole) +// { +// QString test = QSortFilterProxyModel::data(index, role).toString(); +// return test.append(QString(" (%1/%2)")). +// arg(rowCount(index)). +// arg(sourceModel()->rowCount(mapToSource(index))); +// } +// return QSortFilterProxyModel::data(index, role); +//} } /* namespace NLQT */ /* end of file */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_filesystem_model.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_filesystem_model.h index 775dcb18d..03eb5ecc2 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_filesystem_model.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_filesystem_model.h @@ -18,32 +18,61 @@ #define GEORGES_FILESYSTEM_MODEL_H #include +#include namespace Plugin { -class CGeorgesFileSystemModel : public QFileSystemModel -{ - QString m_ldPath; - -public: - CGeorgesFileSystemModel(QString ldPath, QObject *parent = 0); - ~CGeorgesFileSystemModel(); - - int columnCount(const QModelIndex &/*parent*/) const; - int rowCount(const QModelIndex &/*parent*/) const; - - QVariant data(const QModelIndex& index, int role) const ; - - bool isCorrectLDPath() + class CGeorgesFileSystemModel : public QFileSystemModel { - return m_correct; - } - void checkLDPath(); + Q_OBJECT -private: - bool m_correct; -};/* class CGeorgesFileSystemModel */ + public: + CGeorgesFileSystemModel(QString ldPath, QObject *parent = 0); + ~CGeorgesFileSystemModel(); + + int columnCount(const QModelIndex &/*parent*/) const; + int rowCount(const QModelIndex &/*parent*/) const; + + QVariant data(const QModelIndex& index, int role) const ; + + bool isCorrectLDPath() + { + return m_correct; + } + bool isInitialized() + { + return m_initialized; + } + void setInitialized( bool init) + { + m_initialized = init; + } + void checkLDPath(); + + private: + bool m_correct; + bool m_initialized; + QString m_ldPath; + +private Q_SLOTS: + void dir(const QString&); + };/* class CGeorgesFileSystemModel */ + + // A modified QSortFilterProxyModel that always accepts the root nodes in the tree + // so filtering is only done on the children. + //class CGeorgesFileSystemProxyModel : public QSortFilterProxyModel + //{ + // Q_OBJECT + + //public: + // CGeorgesFileSystemProxyModel(QObject *parent = 0); + + //QVariant data(const QModelIndex& index, int role) const ; + + //protected: + // bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const; + //}; } /* namespace NLQT */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.cpp new file mode 100644 index 000000000..13b0dab03 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.cpp @@ -0,0 +1,388 @@ +// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework +// Copyright (C) 2011 Adrian Jaekel +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#include "georges_treeview_dialog.h" + +// Qt includes +#include +#include +#include +#include + +// NeL includes +#include +#include +#include +#include + +// Project includes +#include "georges.h" +#include "georgesform_model.h" +#include "georgesform_proxy_model.h" +#include "formitem.h" +#include "formdelegate.h" +#include "expandable_headerview.h" + +using namespace NLMISC; +using namespace NLGEORGES; + +namespace Plugin +{ + + CGeorgesTreeViewDialog::CGeorgesTreeViewDialog(QWidget *parent /*= 0*/) + : QDockWidget(parent), + m_header(0), + m_modified(false) + { + m_georges = new CGeorges; + + loadedForm = ""; + + m_ui.setupUi(this); + m_header = new ExpandableHeaderView(Qt::Horizontal, m_ui.treeView); + m_ui.treeView->setHeader(m_header); + m_ui.treeView->header()->setResizeMode(QHeaderView::ResizeToContents); + m_ui.treeView->header()->setStretchLastSection(true); + m_ui.treeViewTabWidget->setTabEnabled (2,false); + + m_ui.checkBoxParent->setStyleSheet("background-color: rgba(0,255,0,30)"); + m_ui.checkBoxDefaults->setStyleSheet("background-color: rgba(255,0,0,30)"); + m_form = 0; + + FormDelegate *formdelegate = new FormDelegate(this); + m_ui.treeView->setItemDelegateForColumn(1, formdelegate); + + connect(m_ui.treeView, SIGNAL(doubleClicked (QModelIndex)), + this, SLOT(doubleClicked (QModelIndex))); + connect(m_ui.checkBoxParent, SIGNAL(toggled(bool)), + this, SLOT(filterRows())); + connect(m_ui.checkBoxDefaults, SIGNAL(toggled(bool)), + this, SLOT(filterRows())); + connect(m_header, SIGNAL(headerClicked(int)), + this, SLOT(headerClicked(int))); + } + + CGeorgesTreeViewDialog::~CGeorgesTreeViewDialog() + { + delete m_form; + qDebug() << "DTOR"; + } + + void CGeorgesTreeViewDialog::headerClicked(int section) + { + if (section == 0) + if (*(m_header->expanded())) + m_ui.treeView->expandAll(); + else + m_ui.treeView->collapseAll(); + } + + void CGeorgesTreeViewDialog::setForm(const CForm *form) + { + m_form = (UForm*)form; + } + + CForm* CGeorgesTreeViewDialog::getFormByName(const QString formName) + { + if(NLMISC::CPath::exists(formName.toStdString())) + { + return (CForm*)m_georges->loadForm(formName.toStdString()); + } + //else + //{ + // CForm *form = 0; + // // Load the DFN + // std::string extStr = NLMISC::CFile::getExtension( formName.toStdString() ); + // QString dfnName = QString("%1.dfn").arg(extStr.c_str()); + // UFormDfn *formdfn; + // if (NLMISC::CPath::exists(dfnName.toStdString())) + // { + // formdfn = _georges->loadFormDfn (dfnName.toStdString()); + // if (!formdfn) + // { + // nlwarning("Failed to load dfn: %s", dfnName.toStdString().c_str()); + // return 0; + // } + // } + // else + // { + // nlwarning("Cannot find dfn: %s", dfnName.toStdString().c_str()); + // return 0; + // } + + // form = new CForm; + + // // Build the root element + // ((CFormElmStruct*)&form->getRootNode())->build((CFormDfn*)formdfn); + + // uint i; + // for (i=0; iHeldElements[i]))->build ((CFormDfn*)formdfn); + // } + // return form; + //} + return 0; + } + + void CGeorgesTreeViewDialog::loadFormIntoDialog(CForm *form) + { + + if(form) + m_form = form; + else + return; + + UFormElm *root = 0; + root = &m_form->getRootNode(); + + QStringList parents; + for (uint i = 0; i < m_form->getNumParent(); i++) + { + UForm *u = m_form->getParentForm(i); + parents << u->getFilename().c_str(); + } + + QString comments; + comments = m_form->getComment().c_str(); + + if (!comments.isEmpty()) + { + m_ui.treeViewTabWidget->setTabEnabled (1,true); + m_ui.commentEdit->setPlainText(comments); + } + + QStringList strList; + std::set dependencies; + m_form->getDependencies(dependencies); + + QMap< QString, QStringList> deps; + Q_FOREACH(std::string str, dependencies) + { + QString file = str.c_str(); + if (str == m_form->getFilename()) continue; + deps[file.remove(0,file.indexOf(".")+1)] << str.c_str(); + } + nlinfo("typ's %d",deps["typ"].count()); + nlinfo("dfn's %d",deps["dfn"].count()); + + //nlwarning(strList.join(";").toStdString().c_str()); + if (root) + { + loadedForm = m_form->getFilename().c_str(); + + CGeorgesFormModel *model = new CGeorgesFormModel(root,deps,comments,parents,m_header->expanded()); + CGeorgesFormProxyModel *proxyModel = new CGeorgesFormProxyModel(); + proxyModel->setSourceModel(model); + m_ui.treeView->setModel(proxyModel); + m_ui.treeView->expandAll(); + // this is a debug output row + m_ui.treeView->hideColumn(3); + + filterRows(); + + // //_ui.treeView->setRowHidden(0,QModelIndex(),true); + connect(model, SIGNAL(dataChanged(const QModelIndex, const QModelIndex)), + this, SLOT(modifiedFile())); + + setWindowTitle(loadedForm); + // //Modules::mainWin().getTabBar(); + } + } + + void CGeorgesTreeViewDialog::addParentForm(CForm *form) + { + //((CForm*)_form)->insertParent(((CForm*)_form)->getParentCount(), form->getFilename().c_str(), form); + } + + void CGeorgesTreeViewDialog::modifiedFile( ) + { + if (!m_modified) + { + m_modified = true; + setWindowTitle(windowTitle() + "*"); + } + Q_EMIT modified(); + } + + void CGeorgesTreeViewDialog::write( ) + { + + //COFile file; + //std::string s = CPath::lookup(loadedForm.toStdString(), false); + //if (file.open (s)) + //{ + // try + // { + // if (loadedForm.contains(".typ")) + // { + // //nlassert (Type != NULL); + + // //// Write the file + // //// Modified ? + // //if (IsModified ()) + // //{ + // // Type->Header.MinorVersion++; + // // flushValueChange (); + // //} + // //Type->write (xmlStream.getDocument (), theApp.Georges4CVS); + // //modify (NULL, NULL, false); + // //flushValueChange (); + // //UpdateAllViews (NULL); + // //return TRUE; + // } + // else if (loadedForm.contains(".dfn")) + // { + // //nlassert (Dfn != NULL); + + // //// Write the file + // //if (IsModified ()) + // //{ + // // Dfn->Header.MinorVersion++; + // // flushValueChange (); + // //} + // //Dfn->write (xmlStream.getDocument (), lpszPathName, theApp.Georges4CVS); + // //modify (NULL, NULL, false); + // //UpdateAllViews (NULL); + // //return TRUE; + // } + // else + // { + // nlassert (_form != NULL); + + // // Write the file + // /*if (IsModified ()) + // { + // ((CForm*)(UForm*)Form)->Header.MinorVersion++; + // }*/ + // //((CForm*)(UForm*)Form)->write (xmlStream.getDocument (), lpszPathName, theApp.Georges4CVS); + // _form->write(file, false); + // setWindowTitle(windowTitle().remove("*")); + // _modified = false; + // //if (strcmp (xmlStream.getErrorString (), "") != 0) + // //{ + // // char message[512]; + // // smprintf (message, 512, "Error while saving file: %s", xmlStream.getErrorString ()); + // //theApp.outputError (message); + // //} + // //modify (NULL, NULL, false); + // //flushValueChange (); + // //UpdateAllViews (NULL); + + // // Get the left view + // //CView* pView = getLeftView (); + // } + // } + // catch (Exception &e) + // { + // nlerror("Error while loading file: %s", e.what()); + // } + //} + //else + //{ //if (!file.open()) + // nlerror("Can't open the file %s for writing.", s.c_str()); + //} + } + + void CGeorgesTreeViewDialog::doubleClicked ( const QModelIndex & index ) + { + // TODO: this is messy :( perhaps this can be done better + CGeorgesFormProxyModel * proxyModel = + dynamic_cast(m_ui.treeView->model()); + CGeorgesFormModel *model = + dynamic_cast(proxyModel->sourceModel()); + QModelIndex sourceIndex = proxyModel->mapToSource(index); + + CFormItem *item = model->getItem(sourceIndex); + + if (item->parent() && item->parent()->data(0) == "parents") + { + Q_EMIT changeFile(CPath::lookup(item->data(0).toString().toStdString(),false).c_str()); + } + + //// col containing additional stuff like icons + //if (index.column() == 2) + //{ + // QModelIndex in2 = m->index(in.row(),in.column()-1,in.parent()); + // CFormItem *item = m->getItem(in2); + // QString value = item->data(1).toString(); + + // QString path = CPath::lookup(value.toStdString(),false).c_str(); + + // if(value.contains(".tga") || value.contains(".png")) + // { + // QString file = QFileDialog::getOpenFileName( + // this, + // "Select a new image", + // path, + // "Images (*.png *.tga)" + // ); + // if (file.isNull()) + // return; + // QFileInfo info = QFileInfo(file); + + // // TODO? + // // right way would be another delegate but im too lazy :) + // // so for now i just call it directly + // m->setData(in2, info.fileName()); + // return; + // } + // else + // { + // if (path.contains(".shape") || path.contains(".ps")) + // { + // if (Modules::objViewInt()) + // { + // Modules::objViewInt()->resetScene(); + // //Modules::config().configRemapExtensions(); + // Modules::objViewInt()->loadMesh(path.toStdString(),""); + // } + // return; + // } + // } + + // // open eg parent files + // if (!path.isEmpty()) + // Q_EMIT changeFile(path); + + //} + } + + void CGeorgesTreeViewDialog::closeEvent(QCloseEvent *event) + { + Q_EMIT closing(); + deleteLater(); + } + + void CGeorgesTreeViewDialog::checkVisibility(bool visible) { + // this prevents invisible docks from getting tab focus + qDebug() << "checkVisibility" << visible; + setEnabled(visible); + //if (visible) + Q_EMIT modified(); + } + + void CGeorgesTreeViewDialog::filterRows() + { + CGeorgesFormProxyModel * mp = dynamic_cast(m_ui.treeView->model()); + CGeorgesFormModel *m = dynamic_cast(mp->sourceModel()); + if (m) { + m->setShowParents(m_ui.checkBoxParent->isChecked()); + m->setShowDefaults(m_ui.checkBoxDefaults->isChecked()); + } + } + +} /* namespace NLQT */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.h new file mode 100644 index 000000000..4992c9b23 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_dialog.h @@ -0,0 +1,96 @@ +// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework +// Copyright (C) 2011 Adrian Jaekel +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef GEORGES_TREEVIEWER_DIALOG_H +#define GEORGES_TREEVIEWER_DIALOG_H + +#include "ui_georges_treeview_form.h" +#include "expandable_headerview.h" + +// Qt includes +#include + +// STL includes + +// NeL includes + +// Project includes + +namespace NLGEORGES +{ + class UForm; + class CForm; +} + +using namespace NLGEORGES; + +namespace Plugin +{ + + class CGeorges; + + class CGeorgesTreeViewDialog: public QDockWidget + { + Q_OBJECT + + public: + CGeorgesTreeViewDialog(QWidget *parent = 0); + ~CGeorgesTreeViewDialog(); + + bool isModified() {return m_modified;} + void setModified(bool m) {m_modified = m;} + + CForm* getFormByName(const QString); + void addParentForm(CForm *form); + + void write ( ); + + QTabWidget* tabWidget() { return m_ui.treeViewTabWidget; } + + QString loadedForm; + + protected: + void closeEvent(QCloseEvent *event); + + Q_SIGNALS: + void changeFile(QString); + void modified(); + void closing(); + + public Q_SLOTS: + void setForm(const CForm*); + void loadFormIntoDialog(CForm *form = 0); + void modifiedFile( ); + void checkVisibility(bool); + + private Q_SLOTS: + void doubleClicked ( const QModelIndex & index ); + void filterRows(); + void headerClicked(int); + + private: + Ui::CGeorgesTreeViewDialog m_ui; + ExpandableHeaderView *m_header; + UForm *m_form; + CGeorges *m_georges; + + bool m_modified; + + }; /* CGeorgesTreeViewDialog */ + +} /* namespace NLQT */ + +#endif // GEORGES_TREEVIEWER_DIALOG_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_form.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_form.ui new file mode 100644 index 000000000..183b16118 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_treeview_form.ui @@ -0,0 +1,130 @@ + + + CGeorgesTreeViewDialog + + + + 0 + 0 + 400 + 300 + + + + + 0 + 0 + + + + + 199 + 165 + + + + Qt::NoFocus + + + + + + + + + + QTabWidget::West + + + 0 + + + + Qt::NoFocus + + + Form + + + + 0 + + + + + + 0 + 0 + + + + + 0 + 0 + + + + + + + + Parent + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Defaults + + + + + + + + Comment + + + + + + false + + + + + + + + Log + + + + + + + + + + + + + + + + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.cpp new file mode 100644 index 000000000..f6b9c441b --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.cpp @@ -0,0 +1,674 @@ +// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework +// Copyright (C) 2011 Adrian Jaekel +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#include "georgesform_model.h" + +// NeL includes +#include +#include +#include +#include +#include +#include + +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// project includes +#include "formitem.h" + +using namespace NLGEORGES; + +namespace Plugin +{ + + CGeorgesFormModel::CGeorgesFormModel(UFormElm *rootElm, QMap< QString, QStringList> deps, + QString comment, QStringList parents, bool *expanded, QObject *parent) : QAbstractItemModel(parent) + { + QList rootData; + rootData << "Value" << "Data" << "Extra";// << "Type"; + m_rootElm = rootElm; + m_rootItem = new CFormItem(m_rootElm, rootData); + m_dependencies = deps; + m_comments = comment; + m_parents = parents; + m_parentRows = new QList; + m_expanded = expanded; + + setupModelData(); + } + + CGeorgesFormModel::~CGeorgesFormModel() + { + delete m_rootItem; + } + + /******************************************************************************/ + + QVariant CGeorgesFormModel::data(const QModelIndex &p_index, int p_role) const + { + if (!p_index.isValid()) + return QVariant(); + + switch (p_role) + { + case Qt::DisplayRole: + { + return getItem(p_index)->data(p_index.column()); + } + case Qt::BackgroundRole: + { + QBrush defaultBrush = QBrush(QColor(255,0,0,30)); + QBrush parentBrush = QBrush(QColor(0,255,0,30)); + + // if elm not existing it must be some kind of default or type value + if(!getItem(p_index)->getFormElm()) + { + return defaultBrush; + } + + // else it might be some parent elm + switch (getItem(p_index)->nodeFrom()) + { + case NLGEORGES::UFormElm::NodeParentForm: + { + return parentBrush; + } + case NLGEORGES::UFormElm::NodeForm: + { + switch (getItem(p_index)->valueFrom()) + { + case NLGEORGES::UFormElm::ValueParentForm: + { + return parentBrush; + } + default: + { + // parent status test kindof ugly, testing only 2 steps deep + // only needed for colorization as treeview default hides childs + // when parent is hidden + CFormItem *parent = getItem(p_index)->parent(); + if (parent) + { + if (parent->nodeFrom() == NLGEORGES::UFormElm::NodeParentForm) + { + return parentBrush; + } + + CFormItem *parentParent = parent->parent(); + if (parentParent) + { + if (parentParent->nodeFrom() == NLGEORGES::UFormElm::NodeParentForm) + { + return parentBrush; + } + } // endif parentParent + } // endif parent + } // end default + } // end switch valueFrom + } // end case nodeForm + } // end switch nodeFrom + return QVariant(); + } + case Qt::DecorationRole: + { + if (p_index.column() == 2) + { + //p_index. + QModelIndex in = index(p_index.row(),p_index.column()-1,p_index.parent()); + CFormItem *item = getItem(in); + + QString value = item->data(1).toString(); + //QString path = NLMISC::CPath::lookup(value.toStdString(),false).c_str(); + + /*if (value.contains(".shape")) + { + if (Modules::objViewInt()) + { + QIcon *icon = Modules::objViewInt()->saveOneImage(value.toStdString()); + if (icon) + { + if(icon->isNull()) + return QIcon(":/images/pqrticles.png"); + else + return QIcon(*icon); + } + else + { + return QIcon(); + } + } + }*/ + if(value.contains(".tga") || value.contains(".png")) + { + QString path = NLMISC::CPath::lookup(value.toStdString(),false).c_str(); + if(path.isEmpty()) + { + path = ":/images/pqrticles.png"; + } + return QIcon(path); + } + } + return QVariant(); + break; + } + case Qt::ToolTipRole: + { + if (p_index.column() == 2) + { + QModelIndex in = index(p_index.row(),p_index.column()-1,p_index.parent()); + CFormItem *item = getItem(in); + QString value = item->data(1).toString(); + + /*if (value.contains(".shape")) + { + if (Modules::objViewInt()) + { + QIcon *icon = Modules::objViewInt()->saveOneImage(value.toStdString()); + if (icon) + { + if(icon->isNull()) + return QIcon(":/images/pqrticles.png"); + else + return QIcon(*icon); + } + else + { + return QIcon(); + } + } + }*/ + if(value.contains(".tga") || value.contains(".png")) + { + QString path = NLMISC::CPath::lookup(value.toStdString(),false).c_str(); + if(path.isEmpty()) + { + path = ":/images/pqrticles.png"; + } + + QString imageTooltip = QString("").arg(path); + + return imageTooltip; + } + } + return QVariant(); + break; + } + default: + return QVariant(); + } + } + + /******************************************************************************/ + + CFormItem *CGeorgesFormModel::getItem(const QModelIndex &index) const + { + if (index.isValid()) + { + CFormItem *item = static_cast(index.internalPointer()); + if (item) + return item; + } + return m_rootItem; + } + + /******************************************************************************/ + + bool CGeorgesFormModel::setData(const QModelIndex &index, const QVariant &value, + int role) + { + + if (role != Qt::EditRole) + return false; + + CFormItem *item = getItem(index); + bool result = item->setData(index.column(), value); + + Q_EMIT dataChanged(index, index); + + //setupModelData(); + return result; + } + + /******************************************************************************/ + + Qt::ItemFlags CGeorgesFormModel::flags(const QModelIndex& index) const { + + if (!index.isValid()) + return 0; + + Qt::ItemFlags returnValue = Qt::ItemIsSelectable | Qt::ItemIsEnabled; + + if(index.column() == 1) + returnValue |= Qt::ItemIsEditable; + + return returnValue; + + } + + /******************************************************************************/ + + QVariant CGeorgesFormModel::headerData(int section, + Qt::Orientation orientation, int role) const + { + if (orientation == Qt::Horizontal) + { + if (role == Qt::DisplayRole) + return m_rootItem->data(section); + if (role == Qt::TextAlignmentRole) + return Qt::AlignLeft; + if (section == 0 && role == Qt::DecorationRole) + { + // transparent pixmap as we paint it ourself with tree brach + // if we extend the HeaderView::paintSection for the CE_HeaderLabel + // we could drop this + QPixmap pixmap = QPixmap( + QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize), + QApplication::style()->pixelMetric(QStyle::PM_SmallIconSize)); + // Create new picture for transparent + QPixmap transparent(pixmap.size()); + + // Do transparency + transparent.fill(Qt::transparent); + QPainter p(&transparent); + p.setCompositionMode(QPainter::CompositionMode_Source); + p.drawPixmap(0, 0, pixmap); + p.setCompositionMode(QPainter::CompositionMode_DestinationIn); + // Set transparency level to 150 (possible values are 0-255) + // The alpha channel of a color specifies the transparency effect, + // 0 represents a fully transparent color, while 255 represents + // a fully opaque color. + p.fillRect(transparent.rect(), QColor(0, 0, 0, 0)); + p.end(); + + // Set original picture's reference to new transparent one + pixmap = transparent; + return pixmap; + } + } + return QVariant(); + } + + /******************************************************************************/ + + QModelIndex CGeorgesFormModel::index(int row, int column, const QModelIndex &parent) + const + { + if (!hasIndex(row, column, parent)) + return QModelIndex(); + + CFormItem *parentItem; + + if (!parent.isValid()) + parentItem = m_rootItem; + else + parentItem = static_cast(parent.internalPointer()); + + CFormItem *childItem = parentItem->child(row); + if (childItem) + return createIndex(row, column, childItem); + else + return QModelIndex(); + } + + /******************************************************************************/ + + QModelIndex CGeorgesFormModel::parent(const QModelIndex &index) const + { + if (!index.isValid()) + return QModelIndex(); + + CFormItem *childItem = static_cast(index.internalPointer()); + CFormItem *parentItem = childItem->parent(); + + if (parentItem == m_rootItem) + return QModelIndex(); + + return createIndex(parentItem->row(), 0, parentItem); + } + + /******************************************************************************/ + + int CGeorgesFormModel::rowCount(const QModelIndex &parent) const { + + CFormItem *parentItem; + if (parent.column() > 0) + return 0; + + if (!parent.isValid()) + parentItem = m_rootItem; + else + parentItem = static_cast(parent.internalPointer()); + + return parentItem->childCount(); + + } + + /******************************************************************************/ + + int CGeorgesFormModel::columnCount(const QModelIndex &parent) const { + + if (parent.isValid()) + return static_cast(parent.internalPointer())->columnCount(); + else + return m_rootItem->columnCount(); + + } + + /******************************************************************************/ + + void CGeorgesFormModel::loadFormData(UFormElm *root, CFormItem *parent) { + + if (!root) + return; + + uint num = 0; + + + if (root->isStruct()) + { + //((CFormElm*)root)->getForm()->getComment(); + uint structSize = 0; + root->getStructSize(structSize); + while (num < structSize) + { + UFormElm::TWhereIsNode *whereN = new UFormElm::TWhereIsNode; + UFormElm::TWhereIsValue *whereV = new UFormElm::TWhereIsValue; + // Append a new item to the current parent's list of children. + std::string elmName; + if(root->getStructNodeName(num, elmName)) + { + QList columnData; + //QVariant value; + std::string value; + //NLMISC::CRGBA value_color; + //uint value_uint; + //sint value_sint; + //double value_double; + QString elmtType = ""; + UFormElm *elmt = 0; + if(root->getNodeByName(&elmt, elmName.c_str(), whereN, true)) + { + if (elmt) + { + if (elmt->isArray()) + elmtType = "Array"; + if (elmt->isStruct()) + elmtType = "Struct"; + if (elmt->isAtom()) + { + elmtType = "Atom"; + uint numDefinitions = 0; + const UType *type = elmt->getType(); + if (type) + { + numDefinitions = type->getNumDefinition(); + root->getValueByName(value, elmName.c_str(),UFormElm::Eval,whereV); + switch (type->getType()) + { + case UType::UnsignedInt: + value = QString("%1").arg(QString("%1").arg(value.c_str()).toDouble()).toStdString(); + elmtType.append("_uint");break; + case UType::SignedInt: + value = QString("%1").arg(QString("%1").arg(value.c_str()).toDouble()).toStdString(); + elmtType.append("_sint");break; + case UType::Double: + value = QString("%1").arg(QString("%1").arg(value.c_str()).toDouble(),0,'f',1).toStdString(); + elmtType.append("_double");break; + case UType::String: + elmtType.append("_string");break; + case UType::Color: + elmtType.append("_color");break; + default: + elmtType.append("_unknownType"); + } + } + else + { + elmtType.append("_noType"); + } + + if (numDefinitions) + { + std::string l, v; + QString tmpLabel, tmpValue; + for (uint i = 0; i < numDefinitions; i++) + { + type->getDefinition(i,l,v); + tmpLabel = l.c_str(); + tmpValue = v.c_str(); + if (type->getType() == UType::SignedInt) + { + if (QString("%1").arg(value.c_str()).toDouble() == tmpValue.toDouble()) { + value = l; + break; + } + } + if (type->getType() == UType::String) + { + if (QString(value.c_str()) == tmpValue) + { + value = l; + break; + } + } + } + } + } + if (elmt->isVirtualStruct()) + { + root->getValueByName(value, elmName.c_str(),UFormElm::Eval,whereV); + elmtType = "VirtualStruct"; + } + switch (*whereN) + { + case UFormElm::NodeForm: + elmtType.append("_fromForm"); break; + case UFormElm::NodeParentForm: + elmtType.append("_fromParentForm"); break; + case UFormElm::NodeDfn: + elmtType.append("_isDFN"); break; + case UFormElm::NodeType: + elmtType.append("_isType"); break; + default: + elmtType.append("_noNode"); + } + switch (*whereV) + { + case UFormElm::ValueForm: + elmtType.append("_formValue"); break; + case UFormElm::ValueParentForm: + elmtType.append("_parentValue"); break; + case UFormElm::ValueDefaultDfn: + elmtType.append("_dfnValue"); break; + case UFormElm::ValueDefaultType: + elmtType.append("_typeValue"); break; + default: + elmtType.append("_noValue"); + } + columnData << QString(elmName.c_str()) << QString(value.c_str()) << "";// << elmtType; + parent->appendChild(new CFormItem(elmt, columnData, parent, *whereV, *whereN)); + //if (parents.last()->childCount() > 0) { + // parents << parents.last()->child(parents.last()->childCount()-1); + //} + loadFormData(elmt, parent->child(parent->childCount()-1)); + } + else + { + // add Defaults + // TODO: spams warnings for non ATOM values but i dont get type of non existing nodes + bool success = root->getValueByName(value, elmName.c_str(),UFormElm::Eval,whereV); + switch (*whereN) + { + case UFormElm::NodeForm: + elmtType.append("_fromForm"); break; + case UFormElm::NodeParentForm: + elmtType.append("_fromParentForm"); break; + case UFormElm::NodeDfn: + elmtType.append("_isDFN"); break; + case UFormElm::NodeType: + elmtType.append("_isType"); break; + default: + elmtType.append("_noNode"); + } + switch (*whereV) + { + case UFormElm::ValueForm: + elmtType.append("_formValue"); break; + case UFormElm::ValueParentForm: + elmtType.append("_parentValue"); break; + case UFormElm::ValueDefaultDfn: + elmtType.append("_dfnValue"); break; + case UFormElm::ValueDefaultType: + elmtType.append("_typeValue"); break; + default: + elmtType.append("_noValue"); + } + + columnData << QString(elmName.c_str()) << QString(value.c_str()) << "";// << elmtType; + parent->appendChild(new CFormItem(elmt, columnData, parent, *whereV, *whereN)); + } + } + else + { + nlinfo("getNodeByName returned false"); + } + } + num++; + } + } + if (root->isArray()) + { + uint arraySize = 0; + root->getArraySize(arraySize); + while (num < arraySize) + { + std::string elmName; + if(root->getArrayNodeName(elmName, num)) + { + QList columnData; + std::string value; + QString elmtType = ""; + + UFormElm *elmt = 0; + if(root->getArrayNode(&elmt,0) && elmt) + { + if (elmt->isArray()) + elmtType = "Array"; + if (elmt->isStruct()) { + elmtType = "Struct"; + } + if (elmt->isAtom()) + { + elmt->getValue(value); + elmtType = "Atom"; + } + if (elmt->isVirtualStruct()) + elmtType = "VirtualStruct"; + + elmtType.append("_arrayValue"); + columnData << QString(elmName.c_str()) << QString(value.c_str()) << "";// << elmtType; + parent->appendChild(new CFormItem(elmt, columnData, parent)); + loadFormData(elmt, parent->child(parent->childCount()-1)); + } + } + num++; + } + } + } + + /******************************************************************************/ + + void CGeorgesFormModel::loadFormHeader() + { + + if (m_parents.size()) + { + CFormItem *fi_pars = new CFormItem(m_rootElm, QList() << "parents" << "" << "", m_rootItem); + m_rootItem->appendChild(fi_pars); + + Q_FOREACH(QString str, m_parents) + { + fi_pars->appendChild(new CFormItem(m_rootElm, QList() << str << "" << "", fi_pars)); + } + } + + /*QStringList dfns = _dependencies["dfn"]; + QStringList typs = _dependencies["typ"]; + + _dependencies.remove("dfn"); + _dependencies.remove("typ"); + + CFormItem *fi_dep = new CFormItem(_rootElm, QList() << "dependencies", _rootItem); + _rootItem->appendChild(fi_dep); + + if (!dfns.isEmpty()) { + CFormItem *fi_dfn = new CFormItem(_rootElm, QList() << "dfn", fi_dep); + fi_dep->appendChild(fi_dfn); + foreach(QString str, dfns) { + fi_dfn->appendChild(new CFormItem(_rootElm, QList() << str, fi_dfn)); + } + } + if (!typs.isEmpty()) { + CFormItem *fi_typ = new CFormItem(_rootElm, QList() << "typ", fi_dep); + fi_dep->appendChild(fi_typ); + foreach(QString str, typs) { + fi_typ->appendChild(new CFormItem(_rootElm, QList() << str, fi_typ)); + } + } + if (!_dependencies.isEmpty()) { + CFormItem *fi_other = new CFormItem(_rootElm, QList() << "other", fi_dep); + fi_dep->appendChild(fi_other); + foreach(QStringList list, _dependencies) { + foreach(QString str, list) { + fi_other->appendChild(new CFormItem(_rootElm, QList() << str, fi_other)); + } + } + }*/ + } + + /******************************************************************************/ + + void CGeorgesFormModel::setupModelData() + { + loadFormHeader(); + loadFormData(m_rootElm, m_rootItem); + } + + /******************************************************************************/ + + void CGeorgesFormModel::setShowParents( bool show ) { + m_showParents = show; + Q_EMIT layoutAboutToBeChanged(); + Q_EMIT layoutChanged(); + } + void CGeorgesFormModel::setShowDefaults( bool show ) + { + m_showDefaults = show; + Q_EMIT layoutAboutToBeChanged(); + Q_EMIT layoutChanged(); + } +} /* namespace Plugin */ + +/* end of file */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.h new file mode 100644 index 000000000..0d8ce6e69 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_model.h @@ -0,0 +1,80 @@ +// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework +// Copyright (C) 2011 Adrian Jaekel +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef GEORGESFORM_MODEL_H +#define GEORGESFORM_MODEL_H + +// Qt includes +#include +#include +#include +#include + +// project includes + +namespace NLGEORGES { + class UFormElm; +} + +namespace Plugin +{ + + class CFormItem; + + class CGeorgesFormModel : public QAbstractItemModel + { + + public: + CGeorgesFormModel(NLGEORGES::UFormElm *root, QMap< QString, QStringList> deps, + QString comment, QStringList parents, bool* expanded, QObject *parent = 0); + ~CGeorgesFormModel(); + + QVariant data(const QModelIndex &index, int role) const; + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + Qt::ItemFlags flags(const QModelIndex &index) const; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; + QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; + QModelIndex parent(const QModelIndex &index) const; + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; + CFormItem *getItem(const QModelIndex &index) const; + CGeorgesFormModel *model() { return this; } + bool showParents() { return m_showParents;} + bool showDefaults() { return m_showDefaults;} + void setShowParents( bool show ); + void setShowDefaults( bool show ); + + private: + void setupModelData(); + void loadFormData(NLGEORGES::UFormElm *rootElm, CFormItem *parent); + void loadFormHeader(); + + CFormItem* m_rootItem; + NLGEORGES::UFormElm* m_rootElm; + QMap< QString, QStringList> m_dependencies; + QString m_comments; + QStringList m_parents; + QList* m_parentRows; + + bool m_showParents; + bool m_showDefaults; + bool *m_expanded; + + };/* class CGeorgesFormModel */ + +} /* namespace Plugin */ + +#endif // GEORGESFORM_MODEL_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.cpp new file mode 100644 index 000000000..ae3720a57 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.cpp @@ -0,0 +1,81 @@ +// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework +// Copyright (C) 2011 Adrian Jaekel +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// NeL includes +#include +#include + +// project includes +#include "formitem.h" +#include "georgesform_proxy_model.h" +#include "georgesform_model.h" + +namespace Plugin +{ + + bool CGeorgesFormProxyModel::filterAcceptsRow(int sourceRow, + const QModelIndex &sourceParent) const + { + // column doesnt matter for item + CGeorgesFormModel *smodel = dynamic_cast(sourceModel()); + QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent); + CFormItem *item = smodel->getItem(index); + + // if elm not existing it must be some kind of default or type value + if(!item->getFormElm()) + { + return smodel->showDefaults(); + } + + // else it might be some parent elm + switch (item->nodeFrom()) + { + case NLGEORGES::UFormElm::NodeParentForm: + { + return smodel->showParents(); + } + case NLGEORGES::UFormElm::NodeForm: + { + switch (item->valueFrom()) + { + case NLGEORGES::UFormElm::ValueParentForm: + { + return smodel->showParents(); + } + default: + { + CFormItem *parent = item->parent(); + if (parent && (parent->nodeFrom() == NLGEORGES::UFormElm::NodeParentForm)) + { + return smodel->showParents(); + } + } + } + } + } + return true; + } + +/******************************************************************************/ + + bool CGeorgesFormProxyModel::filterAcceptsColumn(int sourceRow, + const QModelIndex &sourceParent) const + { + return QSortFilterProxyModel::filterAcceptsColumn(sourceRow, sourceParent); + } +} /* namespace Plugin */ + +/* end of file */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.h new file mode 100644 index 000000000..570913dab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georgesform_proxy_model.h @@ -0,0 +1,45 @@ +// Object Viewer Qt - Georges Editor Plugin - MMORPG Framework +// Copyright (C) 2011 Adrian Jaekel +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef GEORGESFORM_PROXY_MODEL_H +#define GEORGESFORM_PROXY_MODEL_H + +// Qt includes +#include + +namespace Plugin +{ + + class CGeorgesFormProxyModel : public QSortFilterProxyModel + { + + public: + CGeorgesFormProxyModel(QObject *parent = 0): QSortFilterProxyModel(parent) + { + } + ~CGeorgesFormProxyModel() + { + } + + protected: + virtual bool filterAcceptsColumn ( int source_column, const QModelIndex & source_parent ) const ; + virtual bool filterAcceptsRow ( int source_row, const QModelIndex & source_parent ) const ; + + };/* class CGeorgesFormProxyModel */ + +} /* namespace NLQT */ + +#endif // GEORGESFORM_PROXY_MODEL_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/ovqt_plugin_georges_editor.xml b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/ovqt_plugin_georges_editor.xml new file mode 100644 index 000000000..2b9b163da --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/ovqt_plugin_georges_editor.xml @@ -0,0 +1,10 @@ + + ovqt_plugin_georges_editor + GeorgesEditor + 0.4 + aquiles + Tool to create and edit sheets or forms. + + + + \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_window.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_window.cpp index 4b075adfc..0bb482c72 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_window.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_window.cpp @@ -20,7 +20,6 @@ #include "landscape_editor_constants.h" #include "../core/icore.h" -#include "../core/imenu_manager.h" #include "../core/core_constants.h" // NeL includes @@ -72,7 +71,6 @@ void LandscapeEditorWindow::open() void LandscapeEditorWindow::createMenus() { - Core::IMenuManager *menuManager = Core::ICore::instance()->menuManager(); } void LandscapeEditorWindow::readSettings() diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/log/log_plugin.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/log/log_plugin.cpp index f31a63924..5a8c64f93 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/log/log_plugin.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/log/log_plugin.cpp @@ -21,7 +21,7 @@ #include "../core/icore.h" #include "../core/core_constants.h" -#include "../core/imenu_manager.h" +#include "../core/menu_manager.h" #include "../../extension_system/iplugin_spec.h" // Qt includes @@ -78,7 +78,7 @@ namespace Plugin setDisplayers(); Core::ICore *core = Core::ICore::instance(); - Core::IMenuManager *menuManager = core->menuManager(); + Core::MenuManager *menuManager = core->menuManager(); QMenu *viewMenu = menuManager->menu(Core::Constants::M_VIEW); QMainWindow *wnd = Core::ICore::instance()->mainWindow(); @@ -103,7 +103,7 @@ namespace Plugin QString CLogPlugin::name() const { - return "NeL Log"; + return "LogPlugin"; } QString CLogPlugin::version() const diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/log/ovqt_plugin_log.xml b/code/nel/tools/3d/object_viewer_qt/src/plugins/log/ovqt_plugin_log.xml new file mode 100644 index 000000000..f1fbd7ad0 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/log/ovqt_plugin_log.xml @@ -0,0 +1,10 @@ + + ovqt_plugin_log + LogPlugin + 1.1 + aquiles + DockWidget to display all log messages from NeL. + + + + \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/CMakeLists.txt new file mode 100644 index 000000000..f277a4b14 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/CMakeLists.txt @@ -0,0 +1,49 @@ +INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} + ${LIBXML2_INCLUDE_DIR} + ${QT_INCLUDES}) + +FILE(GLOB SRC *.cpp *.h) + +SET(OVQT_EXT_SYS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin.h + ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_manager.h + ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_spec.h) + +SET(OVQT_PLUG_MISSION_COMPILER_HDR mission_compiler_plugin.h + mission_compiler_main_window.h + mission_compiler_settings_page.h + server_entry_dialog.h) + +SET(OVQT_PLUG_MISSION_COMPILER_UIS mission_compiler_main_window.ui server_entry_dialog.ui mission_compiler_settings_page.ui) + +SET(OVQT_PLUG_MISSION_COMPILER_RCS mission_compiler.qrc) + +SET(QT_USE_QTGUI TRUE) + +QT4_WRAP_CPP(OVQT_PLUG_MISSION_COMPILER_MOC_SRC ${OVQT_PLUG_MISSION_COMPILER_HDR}) +QT4_ADD_RESOURCES( OVQT_PLUG_MISSION_COMPILER_RC_SRCS ${OVQT_PLUG_MISSION_COMPILER_RCS}) +QT4_WRAP_UI(OVQT_PLUG_MISSION_COMPILER_UI_HDRS ${OVQT_PLUG_MISSION_COMPILER_UIS}) + +SOURCE_GROUP(QtResources FILES ${OVQT_PLUG_MISSION_COMPILER_UIS} ${OVQT_PLUG_MISSION_COMPILER_RCS}) +SOURCE_GROUP(QtGeneratedUiHdr FILES ${OVQT_PLUG_MISSION_COMPILER_UI_HDRS}) +SOURCE_GROUP(QtGeneratedMocSrc FILES ${OVQT_PLUG_MISSION_COMPILER_MOC_SRC} ${OVQT_PLUG_MISSION_COMPILER_RC_SRCS}) +SOURCE_GROUP("Mission Compiler Plugin" FILES ${SRC}) +SOURCE_GROUP("OVQT Extension System" FILES ${OVQT_EXT_SYS_SRC}) + +# Mission Compiler Library +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/ryzom/tools/leveldesign/mission_compiler_lib) + +# Game Share Library +INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/common/src) + +ADD_LIBRARY(ovqt_plugin_mission_compiler MODULE ${SRC} ${OVQT_PLUG_MISSION_COMPILER_MOC_SRC} ${OVQT_PLUG_MISSION_COMPILER_RC_SRCS} ${OVQT_EXT_SYS_SRC} ${OVQT_PLUG_MISSION_COMPILER_UI_HDRS}) + +TARGET_LINK_LIBRARIES(ovqt_plugin_mission_compiler ovqt_plugin_core nelmisc nelligo ryzom_mission_compiler_lib ${QT_LIBRARIES} ${QT_QTOPENGL_LIBRARY}) + +NL_DEFAULT_PROPS(ovqt_plugin_mission_compiler "NeL, Tools, 3D: Object Viewer Qt Plugin: Mission Compiler") +NL_ADD_RUNTIME_FLAGS(ovqt_plugin_mission_compiler) +NL_ADD_LIB_SUFFIX(ovqt_plugin_mission_compiler) + +ADD_DEFINITIONS(${LIBXML2_DEFINITIONS} -DQT_PLUGIN -DQT_SHARED ${QT_DEFINITIONS}) + +INSTALL(TARGETS ovqt_plugin_mission_compiler LIBRARY DESTINATION lib RUNTIME DESTINATION bin ARCHIVE DESTINATION lib COMPONENT tools3d) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/arrow-left-2.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/arrow-left-2.png new file mode 100644 index 0000000000000000000000000000000000000000..8f153292c3c8f4e41e5ce87e5eb8e72fad7ba126 GIT binary patch literal 1512 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmUzPnffIy#(^vlDyqr zfHV;NblzPLq&N#aB8!2v2N=7Z%(epwmK8Xr18J~%3>7|0moYFfKk#&M4DmR=_3G{X z5LcN4AK#yuv-x?>cPD*s?+GQEsh$fWc5+S>*lFkRC@VvWtIPkGxT)5p2b1-WnHyd_ zvgBHey@RliNUvb>qKgp+JiJ4t8lw`TS1r|f8+R`CyyatNI{~e{wZFX8Ci^`5{yW8J z^3Q|+Ws>gAd|j=0Va@BfGnby`)_nQt+9dFz{*yg}*%!x!JZsCOJ91Bj%=D1FpP4yt z@&AN^-(ipC#rN;$*9o4qG5mPaG4Jf%w>~unbRLZFQfJnk&%Evo|BVlNKNMYVEqapY zzkKcV?fH54e;v73eRe&&x}?;~6wZ=Q=eF!*l>WUSidpsYkB9rN`8;aA6#h>v%6$ww|%^%?$keVOKjY3&Rt??x7=Dl zqG)AH`eyHFzGvm@vtoCu9XDs~E@thGpZDpc9+cr<`*MHLY zTcCO&A*#(Va`TU}2qP0dRsJQb1qF}zT>k8I_@J4x%jf%cPNvzZh4&cSy3J#MA9_); ze06e}b8;6)r+B1J+>~jjqmFFql3rI-`&Bwf^o5Na zZ_CRGj+-=DFD;O|Wn#KKGJes2wPj5Xuj>Vxa2b}m21 zw)MrP;8kS;Y~7Q%rCcn=&N(ZSk*1|tIlOI<@FT?2~{LnA9wV=F^rT?2C~1B3agXKY~_ zKq{>ux_}xC4Rj5Rbd3x`jEt>}%&ZJeAsX1MV;WI308-w%HO3D+9QW+dm@{>{(JaZG%Q-e|y zQz{EjrrH1%@j?`p7A2=L_?4FB=OnK2H~k2dFhNMfhX(n;oLpXBu9umdpQoFhnU}5y jbhv&&QGQlxa!Ij%9$346ne7%(SgTe~DWM4fC9QN+ literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/arrow-left-double-2.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/arrow-left-double-2.png new file mode 100644 index 0000000000000000000000000000000000000000..8b6d62c7a6cfa1ff82302ff120359a54b7af657d GIT binary patch literal 1893 zcmai#c|04~7RNJM#!`E=YORW;LskhDd#PB$SZfa&p+Uq%BvMPLdc;=KD%Az;h<#rN zWu~f$Wzas`Ywc=z9;H-c>#GUgeBS5%_3r0$&+p!I&-b2l|G9_hV2>6RmJ+U3dVATv8N0HCHvk3V&Vw->l!i?-k?Z|s@3Gk78tZsifdQ>)`? z*&AYf|`&e6;xmaP4WYNcQblEvhwnF&xLqG-XrQlCl-`#_Lftp7|Z0BTJK0TWguOve_Q)2TlBo zBD-4eMOx1-%V#7l*gBPk{Q+;E{)QG*W!)Pb%%N@+j?WsKPa(X0!Z{VSbLfj}OEHfi zGYq$bPNJ7^bdk$c&)tD{k*6<#tWgtVv;eM2+)m&0jf$2ucZ81*6ejS#PhC22qa<25 zT6x9iF(H_cW$7u_+|(1hq?z)A`&e5hm2~(^yKuo|8zHII8=at*dp`7=zLmxta4%*k zXRJgiuC$^TSpUbKR1tq>dk|q(^OKHKj&0@6Og_vZYn=c zjwJ1{n@ggj$7T5Rek?-_y$Nr6o+0RFDfo*xoxS&c=t_}-nA9o%v`?x8PswCow3%!PEn0l5%>x%7}Usr zU)Q=*ZeoAX<@BQEXsdV%SHV3*BM`DlhOqmVYWf5mNKKu410 zy!;{ILt>3<|F<-S-AT3l*i(&ztruv%L+s)XulBS&=?`F5f8@0CL#5WJGA>a%)$M20 zujKFfB&WyX%&CX5?FKEWGK%xGe?OXIh*{@}Vl>DqDm)`s zQ_78<=}N3jT;p67+HYL`aabqpbHLEY*Ylfo2+m+gxig+Yt-oc3UOEsgrqc%)_HoZr z({uWqn0ap=)Et^S$t9GNvYagYtao4NldNRU1#05u`{yEc}< zN4X;ze1)|oN*3v7GWJ7OfBk5$u65_>0$Y9b(uYD~H8S$=U*`syozl?&^?sxZI%t3> z1eqiF-?x1?)~BF1eo0^X&K6=KU;H266kZJPkjy5+aE)?e&!aRmyQ(R=t`1nSxd0b) zPs+%u88^g4(U55~G}XxVD;ZAh}xp!sE&y7SXG+%#v)#)laO)WyS(!V?|TN zWhY1c&a$P|&*%nhVV!;G-BeGt(2lkxj=jQaoOX%LKgZK;o{Hh*h+b5dAqRYLPRI=@ zdwF~;J@z{lTZPr(;7wPhzs)DgX?*cN%Z{+*JgyhT>N;EwRwo?9jYy*3ddwoiq=2rV zsRl=FFGck9JsXcPZ_Q2Bce3m*ovUAyaIp_qRr6CEQ)o@bt}DKrTxb|W?{Y@26^T^m za_ZCK7Z&YzzsN-uM}boo^-2P_3%VRuF;aKV@~L=!N7}<~FHiYxKN;If*112LxcKwt zJMT-s+me2DvW>3bt^gdX7uPs<(C?wPy=!w1@8|;}e-BH$a_wNJk?VCCHGL ze|qhjL`2eTke13rWNCMFlc|v&w%8=y^zt@ZIK<=S1`V9P(_x^1>OHT)u5fbaYGnQE z^wm|hwYw3YlCH3OR3nhsPv-e4NDT=Lq%kGr^(zhQC(4DLZ3f9%;ASJcCZ(-DyTbuv zf~ns#g2kL_-eP-~_u(*O`&5>&3Mk#>QyRCT!540u8#BAVa=5&EKDH2<)2)?f$NP2F zDA(L6I5OU!f(Hfg3;+&=>Vsf#5cG-*430wTppMphD4th}!~6?4ibS1IJOBm-LE#`c z)CI1Cg6pDS$P+-oz&qi803s=X5J>+I00Y5bE>L|G9EyU$P5_bTSS$}f9+iY4;P7D) zc)(2xB^(8T9OoiX@i-EZND7MplgL4k(36k|2nOwdfxy8qh{4Ooqb_p%rjum<=S_jX z)OGNH3r889Nr4oaKN$}&3n1OVU$iFr2jQLY{sHu#dhv$5AkmYcNHPu&u#cpYLj5a$ zL~im95dS^!b#=o0RWgl60~2thFi;2~EC|di91>0@1>Z^XY{{$yGPTv3k literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/arrow-right-2.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/arrow-right-2.png new file mode 100644 index 0000000000000000000000000000000000000000..d4016e2c72a2461b0722fc3aa38b48408a69c629 GIT binary patch literal 1478 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEa{HEjtmUzPnffIy#(^vlDyqr zfHV;NblzPLq&N#aB8!2v2N=7Z%(epwmK8Xr18J~%3>7|0moYFf@AGtV4DmR=_tNR? zm{f`5AKzD7razlA^Q6kd^L zo#?XOg-a9eC*RÅZ){re2Z8$Y+_3r~;@KCofaH$mZBs%z#hxKKQIE$feOM|qix zZYJd}7kl)!y4~8ZFXjC&i)Y90FaDb*ChGNV&R$st-JlEK6Si5`y?Nnrd*9x_=a)zS zoy_tsIO6rj@7fhbkK!2`M4Q?IQg)dYKM4qvuc`WQ(fYl|T!oU7g9;bf?e>eJ6>gqr@Z&u<$E|mPo9^(F~*@&(naUVL-WK>cS{+fzd3K+lkxcF=cTJO z<4%YE(&9BLeP|qfp<>?Y69GZXY_8VYo@buw5WQqq%hgc1DsDCR>kMh-E`eKFZp3m^S^D;N9L@3xa?3ODb}jX|+aD{Uq(E-Pht@Jig^ zx8;}pSB~WGlxX#tp1o{yOy;+%AD$kqJli`dA$*NZ z=t;kR9N6~dUDLfMXQn(>u{p6sC;S=D<^63(gRaio=rqr%YvPttf#Fe2;c~5=U-4l4sVd6MXo*NOu!lQ#Wg2mIC$SHKb7Ln1Y=(tqyYSzOk8*3V-#0$BqCUIKG#v22zDq&rjw$_mOYmjLMOWGkN z{{>$xHz+>Vea-cMX7o0hSr;?ZwU@|kbP}ETNqWzh_a>)4oILiZo;ik1Vdu)$6CSI+ zax7{3_@(Xf|I>dNcY3vT+@9EJ3Cz~2C9V-A$wjG&C8@e8K!U-@z`#=1&`8(7BE-CMA49&pOTqY z3DsbzYiJl^U}KKAFj>dBv#=86_nJR{Hv2yE4mClk;Bl$^@oS6Y^zleos;^dnHh1R)V08sr0Wa(Q{V uUS@KBo^Ez#Ub-I8;razd`B|ySCB^!AVD0*4wp&0YHG`+CpUXO@geCxCqjY!x literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/arrow-right-double-2.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/arrow-right-double-2.png new file mode 100644 index 0000000000000000000000000000000000000000..1fe9feb284002c2c194f74aeb4c1985e12e729d1 GIT binary patch literal 1899 zcmai#c{~*A8po$&--_fU6glM6WmelU(qyumOj)L}H^vy-%wWb?rZ|dg&30xaj@(RK zYa=vbBvM8=LY5@iKG9~2GPdas&iUNW{p-G;_kDlw@_gUtdH#8y)Qe8G3bJal002P2 z-p5?_0)V6F-?Wh~z1NJ157@Hn#ibr~jB-Z~O5`9Kicg+YIxI z{QQk_eTT>JMyhAiu`eU++E6~@bRovEMqk}JM;=a{L$)|x^!apQ|`hzd12n1 zVar8ls+{20(M!y)bBbGJNAq>Uo72rUrW&~ci%pC#jE%)Lb^}|xwKb~E;s+ngnrbD=AXBO})|Vzn9uh~F4^1rg91ETcVewU`kIcWs|wKyc4E}0!WwhSI~KE6h8}n(&fO9m_wVR zqdVtV1te-!mr9XW)SU__r?x=@+=Fz>r8 zLXTaik_Y8Z)iax*RgfpQaf9#s)9|aUCC6cmuVZROn+GxS)>o9mzZrQw3x&7z2h8BX zd7cMV`;I>`5R5iXXXV+vA>QC-76Pw%TD+KhS zIJQ!zc(JNDt9Qm-QtsQf=Gr@CYW0#k@^r|Zf!McPcLz8~K? zpUR|-K^J3?3--#1oK`-x|IBuX3NMzKro}D6{eiz;7q424QE$wr@SCv?qSdiWsyVat} zvaxAx30&8nNPNGcvO2K6U4a2!mGsQx^tKBd|5X~Qho3<77bBRTKB|Agy35|qcd8i- zb}i(WTttYu+8b3?NXmMDJpVaaQZu9ZpI&;i*%&u9IjUjYaJ+-9E{t^{n3Kil(xT`Qx8rEOLOYHRvj{XAXX41K+x#E>3g7;t%Ac%Gqh~Y z(}@^0w7_Vt@79gr*%Zq&=#pQA--ko$x;p44xnKQ3Vr3H$R{F!=ajFRGZu1Uh%?@f| zdxS*ZgyX46661s!?*d+ktnsM8-5!_z ztC7ZW@8?VfySktk&9oFm{K;})jfSK44mI~)r|-Jg@77fuJC9T*Qm^PYmd6%Kv0P8- zt4?4CRr&Gs7ZtjllvG}a6?#{%y~6q(<2R8De17h7(9q+6z$Q%R%~73}-?Zi$ zm5a-69aSjg_6k^=lRFNN@4{DbbCdb+*RtHJFcO)={oNV^cQeO1uz7pKZY|l%Y2VrZ z$ti&S;IRlew(HS_5MGyd%{uDogmOTkaBsddr{xRV%2xmk_3j0Qp5qJW?DUwbJ z#Z{w?S40;^|Gn^ab4L9ga#U0lC14DwyM35+Oa99K-n1H8I!Q?$0Ot)y*EvEo` MYbUGw$Sc?X1Hp?})c^nh literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/document-export-4.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/document-export-4.png new file mode 100644 index 0000000000000000000000000000000000000000..bc76888585fa83ffc6e6acc390fefdbb83ab4316 GIT binary patch literal 1604 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkEu-kbUIVD{!X-4)8V`{&-A`TqC4>dog(tgL=H+Q{u!UaBI{ z$k4#y!ou)%=iXwISproP ztvDo-Z`{9szs|t+uZ)9sAKa_+Q9y*z}F5A`2fMUxEZ%2S;rD7z$jqP5$a3HP7Z6gTnOFjvS2{CS5*ikLBg$`1<<$w+l7Ac(lOxl7f=Bg{6nZ zbB%fP7Oh{;Z)i{FPXUc2_J zxq*Set$X+W1*jgsUMXoIc+li*T33s}S(CzZic4Mc^Yxn!Dli-{=qWOq>GOKmzkpng z_V6y5iz`=g?Z1DYMa0R$i!=6mVNp@jzkhWM4oibpst9%7J$v?S`_ZJ2%ek3u?{1V$ zRF>e`_QuxQ+SzXY@dpnSm>L;YUCpYjt*y15>ScSWwANC9BZ5co>$_PNwTpK!Bt(jB zx~X&Mp@Gvv0j;U0Dvf6T(Vps6TU}AHLxhKI?aGy!SF#_xFrVJId+{b6?x#hP7c)fW z6u)`%CL}yOe16#KtE{eptAvGx%T{mb_K{PFdl2LmF^%<{<)1qHvhwncTfeHCnVAI@ z7k@rIYguSoTAJRjOz-wD9-X_z<`hrq5#sw?c_m9MWGk=q{{P#4pN@L;+UHs5vW0&Z z-Td2sQ9;n@fQj#(Yw?Ts#yYDMF}E&uscJ5T_ zj~cr@cW#|JXIJ;<>YX=lHm^(A@JzMuVVC}8-=s(}ucbmFt_S7yN8V+UVQZD&*$t}X`#NKU;Sd_5WL9Ca7y)9jxvMF zQk{kWj>j=8$Q+ARWAI3yB+77|;YZGUv-!Cx^6MB^Fj=rCSj}7gZ4X<+fA*QNm*!Rm zG4lgU4%HIZh?3-@)Wnih-4r0fU}RumscUGcYiJr`Xl`X-WMyowYXD>zwDV8thiL$* zw1VgYYA`g=H89dOG6*p;wlXraGBkx~V6%>CMA49&pOTqY3Dp3!!7#+Y5~RVz5Td~^ zMxhp{Asyr-pUmXcyy8@bjFOT9D}8;iU72O6$@#gt`FX{9`9=0i`}Mu~s?$I%44$rjF6*2UngH#hkgNaz literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/ic_nel_add_item.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/ic_nel_add_item.png new file mode 100644 index 0000000000000000000000000000000000000000..bde338f7851d2675b29272c7dcf9471196a8f6cc GIT binary patch literal 3270 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 Eg5p97)c^nh literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/ic_nel_delete_item.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/ic_nel_delete_item.png new file mode 100644 index 0000000000000000000000000000000000000000..a5a1787d593591f855be9a7eb8da271cc8d8f214 GIT binary patch literal 1496 zcmaKs{XY{30LC|C-c2!W(h#B2QhA@kOt{brn;~tK$;-mn#DM?-zdb>=i zu*@RTd8@_pvUxpuxyoG1>Bsxw?uX}jKHujL_-0@|T~w8{l>h*Ms+%k3&``sHb<81=-~(e+|N^9C&_KHVw5X^3IM3J{S1(sAHJ}8!egC%W4+FY#L`JIX8~B! zIZ7C+< z6bcMhk7Jz$z zt<~^Npzeyeat^;b(tkMW#bRkwb5S`|-P(cZ{!1geIKC7Tzpi^Q9XhN7r*| zh)Tmw?h}4)r(e%EPx*~jbiDn>W9k_F^gyx#1J1b!&uZuD!J$Duh_I|$-B|3)pjcABT`DZr@@$gnJ?g*7niqC zPg~-q=_uM61|+bWZC}wlE4;C-L;LVrU6J(R@D0Z4=p`kt`4==LnW(d8wXiBZND)3NugXyk}j`B>QSp`rx>7I47#1U z_C?Zqn_!w_iq*Q=7#33$KOO+R;CW!bcdn#k;~tqqg>*o8s|#;{%M1@^2B=`1X*QOW z`~~EL<8YMd;Wk~hP%ln9+T{3weTCGPC>#3IdbbgtfSL(^;<-$(&+()%CWY(ZY}rUs zYZ^=Sws7E+dDpj6e_>>!qz;jFg;SMzWx6GvaM=_CJv#h+^qF(IggsR{8BYMQlBT|c zLR(J;=NJUkn>YRLcdDtY?zXt@zIEUuTe=1hEndEU6|7%)i#=`5cs5S}P9Mh=PcJfo z{ZbSwueq|yZyG~GMGk&1;XI&33fgfyu~6eIQgk!Fkv4<^W8F=|9U5oXINb+#fCen_ z{sB?u3Xfi@SxqMAC%ZI%1BJIf0uMiCx!yXz62rndMv z$=6toP8$LinV$s7C|ZjMS5+@W1rn4NxN=o7bmp|tGx-1vXy7V6(LK7Owl1b<1|o_O z>bY9rcsZ;+(mT(U8Vqy|@K*SC7Xeg!@WG?ntw{ZC`G3Vh1-90Bf1vJ=9f)jI$P4Q6YBQ@Z8;^^H#>9pe+1$q6DXU$-5VbBeJ(3kUiuh943T}3C$!G=4Zw&rX zIZx;etQ%$b10W;H`0fD|-g&n~Eq? zJZ zC}pc4u@0qD`7mQX=zMD+8o3Hi#&31p7{mxJ*6-KkigeYIgt}@Xn1a05YyE6U8VHU~ z8PL=CTn*0W$(#-|89Sz`9P!(hY?pOfm^ZQVXfjUeBhD+B#yUg0vkok?_%`$Xq0`=> g{}tB1bjDO$2a)_&SEAML{IoE@&Dj&vfF`E?18{b*hyVZp literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/ic_nel_down_item.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/ic_nel_down_item.png new file mode 100644 index 0000000000000000000000000000000000000000..fc86c4f6db072ec99ee76b81b8ea21d607226dd7 GIT binary patch literal 3812 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 UsoZjLV*mgE07*qoM6N<$g2^9G?f?J) literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/ic_nel_up_item.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/ic_nel_up_item.png new file mode 100644 index 0000000000000000000000000000000000000000..ee471023e095a1ae11a0f614eb953b727b0b169d GIT binary patch literal 3304 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 F_a_&a9Pj`D literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/run-build-2.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/images/run-build-2.png new file mode 100644 index 0000000000000000000000000000000000000000..5fea6c540bc908826f0d875e9b490146fcddf973 GIT binary patch literal 2228 zcma);cU05K7RP^5Lz66m1PDbQ7(hb`)eu@j6In_C1qCS~uu%hnP{InK3kn-7VL>Sg zPlF^LnkWj0NHeR5EFA(+vJ2^F z0Qhx30HkIDz#2G|`WFDip#k9UU;w}s0e~vKq{#~pPDq6wadrSLSXPP6DWH*|yZAG} z&?DP*7r~&Ixjh(9w~qkrcOd}Njb8zxw8IYeJ}#o)e7(+iKT)wZ`8-+A)kLu8i}b=~ zf-`t&vif@ZF8c#JFPzf1S?h?GJ5ul|ZE*Q|f$pb)NZZQHwey48nVtvK&9bCk2*p(N z?Z+-x<%B6AsR}n_Mg^MbSN!TUtrlAn7kj>lU%pHdoPGF~{kH7vVo9G`Ix4L>VNpsv z%}&g&9x6u2Da;~FfA+rVuF~qZX+Cj3TAbt>(DJJaK!5v8EufXPq0w7reE@cDpL_?@ zgKHDm693`&;#hseF5q6&)H#llqP9&^wnw5B3=Z$CI&p8^#Kh#|*x1&PNj|K#N6hpShwmWS3ct)P&k7CwLWir>NEDxndO%3#OhN}tWfWUy!SI;NKd z$={Zf5ry3wtkBTcbE`=Y>F@gaAND{AV$S(m8?jrP8&fp`K_AY_D#g!0*@k-Rl5gy*p-cvV|+=H+3{PIk~02v2iu8 zf~r0TzgF?iDq&%e&v{isgruFiD@y=s79{oMIV63h^QKMJas#IO_&%pkpY9FAUbPil zkq1V@cex6@gMy|e`}=P@`}(><(l|;L)PH&!@JNDGsF*0u%c!RO6lW>`ody+appj{` z9yJXO4K+>84Vn!%NE&GJ=hf6ieO&!K*ZMrXUZZ+GoxyhHr^htPb9=L|T~n_V%KCau zkBBb`%?t{14UP>zYLx80U0Yl0Sz28DZRp*=P1SoR`+ABke)`R+Z(x9E9Q1JgZbilZ zR@yinE?q%wU;IjRJ%9I;lIxHopv3Z!xV!1Z^tF}0E}PvCR}eA2yIU)zA+;gDd-(>v>T2D*kUA{2PXe!{2t100>t-%BSI-9> zKmLMGe=eYn^J0%gp&vI?pr0AJi8=|?-R_PV90{LM-d<_*rvT)^NfeCys-z?@8QETC?R;<97YCn8dny`{MQA$(^5u+c1hlz)V(t4k;>O9 z2qP`yIU~cvVRe3{3LSnS3JMAbZr!>S^sKiR;p_Wy&+hCDfG0FM*qwe%E_9QsUcr=U zgIG$3^`(_gW)aW2mp|4{70rzOZByV%c`Op8U~Fw|i+aLE1-YuIa79hr7b`*zYq~v4 z6Fljg7~m;P+*=KQjm=&W6|s~Evt4jVfu}#bG-w05c=x>+zXri#=!eF~FDo9a4p`-L z`isiS&h-xsNdhiODr%5D7eo0@cD z1Eu-O;AZ7p^)Hp@}{d{xq?cC>8d=x%q{t3y+ zUgqTmi>`@Gj#3_GWrO8$;>7sZ8=MrWrF*oKcWP@dmX(#U9vxB@3ey?J{qOD=W?p=Q zB+is{#05h31^fSAQe13uYe)zH-M2dj2M062Ur6Gd^O5~ma;>ecxnjK1(o$_VcXu|Q zB(TlunEpp#V4$`Zo>^OPab)WXR4iZH_9XMmUwuJGj~zoO!Y!AoI+J0G1l`}ZT5V}F9^_s@cr2WuQdg_1=P>|Ue#X(b@LNx*Rl?q_poP|53EV^7wMLfP zx1D~hqhBmJh7uA>L56`1fJLJZAu$*v#>@v}fkR_)CKgCE_<_z=6bN9@ zNHi9SMf+e)a9DF3#&QRUcyA5ft2+_C1GK0xYIx#*05Af^2YqN8FvaWu?g2WYPUPdsKQ!*h`=2bJEsL5b8kOa_I$hgE~m0|4>g=^$T{+mBTwBqSI|efLIEx4pkFW6?s`4I;o{M|X#6 ILU8)O0m?46@c;k- literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler.qrc b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler.qrc new file mode 100644 index 000000000..eed07d969 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler.qrc @@ -0,0 +1,17 @@ + + + images/ic_nel_reset_all.png + images/ic_nel_add_item.png + images/ic_nel_delete_item.png + images/ic_nel_down_item.png + images/ic_nel_generic_settings.png + images/ic_nel_up_item.png + images/arrow-left-2.png + images/arrow-left-double-2.png + images/arrow-right-2.png + images/arrow-right-double-2.png + images/document-export-4.png + images/news-subscribe-2.png + images/run-build-2.png + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_main_window.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_main_window.cpp new file mode 100644 index 000000000..416a418f1 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_main_window.cpp @@ -0,0 +1,510 @@ +#include "mission_compiler_main_window.h" +#include "ui_mission_compiler_main_window.h" +#include "validation_file.h" +#include "mission_compiler.h" +#include "mission_compiler_plugin_constants.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../core/icore.h" +#include "../core/menu_manager.h" +#include "../core/core_constants.h" + +#include + +#include +#include +#include +#include + +#include + +using namespace MissionCompiler::Constants; + +MissionCompilerMainWindow::MissionCompilerMainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MissionCompilerMainWindow) +{ + ui->setupUi(this); + + m_lastDir = "."; + m_compileLog = ""; + updateCompileLog(); + + // Load the settings. + loadConfig(); + + m_undoStack = new QUndoStack(this); + + m_regexpFilter = new QRegExp(); + m_regexpFilter->setPatternSyntax(QRegExp::FixedString); + m_regexpFilter->setCaseSensitivity(Qt::CaseInsensitive); + + m_allPrimitivesModel = new QStringListModel(this); + m_filteredProxyModel = new QSortFilterProxyModel(this); + m_filteredProxyModel->setSourceModel(m_allPrimitivesModel); + m_filteredProxyModel->setDynamicSortFilter(true); + m_filteredProxyModel->setFilterRegExp(*m_regexpFilter); + ui->allPrimitivesList->setModel(m_filteredProxyModel); + m_selectedPrimitivesModel = new QStringListModel(this); + ui->selectedPrimitivesList->setModel(m_selectedPrimitivesModel); + + // Connections for toolbar buttons. + connect(ui->actionValidate, SIGNAL(triggered()), this, SLOT(handleValidation())); + connect(ui->actionCompile, SIGNAL(triggered()), this, SLOT(handleCompile())); + connect(ui->actionPublish, SIGNAL(triggered()), this, SLOT(handlePublish())); + + // Connections for selected item moves. + connect(ui->allPrimitivesList, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(handleAllDoubleClick(const QModelIndex &))); + connect(ui->selectedPrimitivesList, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(handleSelDoubleClick(const QModelIndex &))); + connect(ui->addSelectedButton, SIGNAL(clicked()), this, SLOT(handleMoveSelectedRight())); + connect(ui->removeSelectedButton, SIGNAL(clicked()), this, SLOT(handleMoveSelectedLeft())); + connect(ui->addAllButton, SIGNAL(clicked()), this, SLOT(handleMoveAllRight())); + connect(ui->removeAllButton, SIGNAL(clicked()), this, SLOT(handleMoveAllLeft())); + + // Connections for the filter group box. + connect(ui->dataDirButton, SIGNAL(clicked()), this, SLOT(handleDataDirButton())); + connect(ui->dataDirEdit, SIGNAL(textChanged(const QString &)), this, SLOT(handleDataDirChanged(const QString &))); + connect(ui->filterEdit, SIGNAL(textEdited(const QString&)), this, SLOT(handleFilterChanged(const QString&))); + connect(ui->resetFiltersButton, SIGNAL(clicked()), this, SLOT(handleResetFiltersButton())); + + // Connect for settings changes. + connect(Core::ICore::instance(), SIGNAL(changeSettings()), this, SLOT(handleChangedSettings())); + + // Set the default data dir to the primitives path. + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(Core::Constants::DATA_PATH_SECTION); + m_lastDir = settings->value(Core::Constants::PRIMITIVES_PATH).toString(); + ui->dataDirEdit->setText(m_lastDir); + populateAllPrimitives(m_lastDir); + settings->endGroup(); + + NLLIGO::Register(); + // TODO try/catch exception. Crashes if path invalid. + m_ligoConfig.readPrimitiveClass(NLMISC::CPath::lookup("world_editor_classes.xml").c_str(), false); + NLLIGO::CPrimitiveContext::instance().CurrentLigoConfig = &m_ligoConfig; +} + +void MissionCompilerMainWindow::populateAllPrimitives(const QString &dataDir) +{ + // First we need to clear out the models entirely. + QStringList emptyList; + m_selectedPrimitivesModel->setStringList(emptyList); + m_allPrimitivesModel->setStringList(emptyList); + + + // Populate the "all" primitives box. + QStringList list; + + // Filter for only primitive files. + QStringList filters; + filters << "*.primitive"; + + QDirIterator it(dataDir, filters, QDir::Files, QDirIterator::Subdirectories|QDirIterator::FollowSymlinks); + while(it.hasNext()) + { + it.next(); + list << it.fileName(); + } + + m_allPrimitivesModel->setStringList(list); +} + +void MissionCompilerMainWindow::handleResetFiltersButton() +{ + handleDataDirChanged(m_lastDir); + ui->filterEdit->setText(""); + handleFilterChanged(""); +} + +void MissionCompilerMainWindow::handleDataDirChanged(const QString &text) +{ + populateAllPrimitives(text); +} + +void MissionCompilerMainWindow::handleDataDirButton() +{ + QString newPath = QFileDialog::getExistingDirectory(this, "", m_lastDir); + if(!newPath.isEmpty()) + { + ui->dataDirEdit->setText(newPath); + m_lastDir = newPath; + populateAllPrimitives(newPath); + } +} + +void MissionCompilerMainWindow::handleFilterChanged(const QString &text) +{ + m_regexpFilter->setPattern(text); + m_filteredProxyModel->setFilterRegExp(*m_regexpFilter); +} + +void MissionCompilerMainWindow::handleCompile() +{ + compileMission(); +} + +void MissionCompilerMainWindow::handlePublish() +{ + compileMission(true); +} + +void MissionCompilerMainWindow::handleMoveSelectedRight() +{ + QModelIndexList indexes = ui->allPrimitivesList->selectionModel()->selectedIndexes(); + while(!indexes.isEmpty()) + { + const QModelIndex index = indexes.takeFirst(); + moveSelectedItem(index, m_allPrimitivesModel, m_selectedPrimitivesModel); + indexes = ui->allPrimitivesList->selectionModel()->selectedIndexes(); + } +} + +void MissionCompilerMainWindow::handleMoveAllRight() +{ + ui->allPrimitivesList->selectAll(); + handleMoveSelectedRight(); +} + +void MissionCompilerMainWindow::handleMoveSelectedLeft() +{ + QModelIndexList indexes = ui->selectedPrimitivesList->selectionModel()->selectedIndexes(); + while(!indexes.isEmpty()) + { + const QModelIndex index = indexes.takeFirst(); + moveSelectedItem(index, m_selectedPrimitivesModel, m_allPrimitivesModel); + indexes = ui->selectedPrimitivesList->selectionModel()->selectedIndexes(); + } +} + +void MissionCompilerMainWindow::handleMoveAllLeft() +{ + ui->selectedPrimitivesList->selectAll(); + handleMoveSelectedLeft(); +} + +void MissionCompilerMainWindow::moveSelectedItem(const QModelIndex &index, QStringListModel *from, QStringListModel *to) +{ + QString item = from->data(index, Qt::DisplayRole).toString(); + + from->removeRows(index.row(),1); + QStringList list = to->stringList(); + list << item; + to->setStringList(list); +} + +void MissionCompilerMainWindow::handleAllDoubleClick(const QModelIndex &index) +{ + moveSelectedItem(index, m_allPrimitivesModel, m_selectedPrimitivesModel); +} + +void MissionCompilerMainWindow::handleSelDoubleClick(const QModelIndex &index) +{ + moveSelectedItem(index, m_selectedPrimitivesModel, m_allPrimitivesModel); +} + +void MissionCompilerMainWindow::compileMission(bool publish) +{ + uint nbMission = 0; + + // First switch toolbox pages to show the compilation output. + ui->toolBox->setCurrentIndex(2); + + m_compileLog.append("Begin mission compilation.\n"); + updateCompileLog(); + + // Go through each file. + QStringList list = m_selectedPrimitivesModel->stringList(); + QStringListIterator itr(list); + while(itr.hasNext()) + { + QString filename = itr.next(); + m_compileLog.append("Compiling '"+filename+"'...\n"); + updateCompileLog(); + + NLLIGO::CPrimitives primDoc; + NLLIGO::CPrimitiveContext::instance().CurrentPrimitive = &primDoc; + NLLIGO::loadXmlPrimitiveFile(primDoc, NLMISC::CPath::lookup(filename.toAscii().data(), false), m_ligoConfig); + NLLIGO::CPrimitiveContext::instance().CurrentPrimitive = NULL; + + try + { + CMissionCompiler mc; + mc.compileMissions(primDoc.RootNode, filename.toStdString()); + m_compileLog.append("Found "+QString::number(mc.getMissionsCount())+" valid missions\n"); + updateCompileLog(); + + mc.installCompiledMission(m_ligoConfig, filename.toStdString()); + nbMission += mc.getMissionsCount(); + + // publish files to selected servers + if (publish) + { + m_compileLog.append("Begin publishing missions...\n"); + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(MISSION_COMPILER_SECTION); + + // Retrieve the local text path. + QString localPath = settings->value(SETTING_LOCAL_TEXT_PATH).toString(); + settings->endGroup(); + QStringList checkedServers; + for(int i = 0; ipublishServersList->count(); i++) + { + + // Retrieve each checked server. + QListWidgetItem *item = ui->publishServersList->item(i); + if(item->checkState() == Qt::Checked) + checkedServers << item->text(); + } + + Q_FOREACH(QString checkedServer, checkedServers) + { + m_compileLog.append("Processing publication configuration for '"+checkedServer+"'\n"); + QStringList items = settings->value(SETTING_SERVERS_TABLE_ITEMS).toStringList(); + int column = 0; + int row = 0; + QString servName; + QString primPath; + QString textPath; + Q_FOREACH(QString var, items) + { + // Check to see if we're starting a new row. + if(column > 2) + { + column = 0; + row++; + } + if(column == 0) + servName = var; + else if(column == 1) + textPath = var; + else if(column == 2) + { + primPath = var; + + m_compileLog.append("Publishing to "+servName+" ...\n"); + for (uint j=0 ; jtoolBox->setCurrentIndex(2); + + m_compileLog.append("Begin mission validation.\n"); + updateCompileLog(); + + // Load existing validation + CValidationFile validation; + validation.loadMissionValidationFile("mission_validation.cfg"); + + // Go through each file. + QStringList list = m_selectedPrimitivesModel->stringList(); + QStringListIterator itr(list); + while(itr.hasNext()) + { + QString filename = itr.next(); + m_compileLog.append("Parsing '"+filename+"'...\n"); + updateCompileLog(); + + TMissionContainer missions; + NLLIGO::CPrimitives primDoc; + NLLIGO::CPrimitiveContext::instance().CurrentPrimitive = &primDoc; + NLLIGO::loadXmlPrimitiveFile(primDoc, NLMISC::CPath::lookup(filename.toAscii().data(), false), m_ligoConfig); + parsePrimForMissions(primDoc.RootNode, missions); + + // Parse missions to check modification + std::map::iterator itMission, itMissionEnd = missions.end(); + for (itMission=missions.begin(); itMission!=itMissionEnd; ++itMission) + { + CValidationFile::TMissionStateContainer::iterator itMissionValidation = validation._MissionStates.find(itMission->first); + if (itMissionValidation!=validation._MissionStates.end()) + { + // Mission already registered, check hash key + if (itMissionValidation->second.hashKey!=itMission->second.hashKey) + { + itMissionValidation->second.hashKey = itMission->second.hashKey; + itMissionValidation->second.state = validation.defaultState(); + } + } + else + { + // New mission + validation.insertMission(itMission->first, itMission->second.hashKey); + } + m_compileLog.append("Mission: '"+QString(itMission->first.c_str())+"->"+QString(itMission->second.hashKey.c_str())+"\n"); + updateCompileLog(); + } + } + validation.saveMissionValidationFile("mission_validation.cfg"); + + m_compileLog.append("Validation finished"); + updateCompileLog(); +} + +bool MissionCompilerMainWindow::parsePrimForMissions(NLLIGO::IPrimitive const *prim, TMissionContainer &missions) +{ + std::string value; + // if the node is a mission parse it + if (prim->getPropertyByName("class",value) && !stricmp(value.c_str(),"mission") ) + { + std::string name; + prim->getPropertyByName("name",name); + + m_compileLog.append(" ** Parsing mission '"+QString(name.c_str())+"'\n"); + updateCompileLog(); + + // parse the mission and put it in our manager + CMission mission(value, ""); + if (!mission.parsePrim(prim) ) + { + m_compileLog.append(" ** Previous errors in mission '"+QString(name.c_str())+"'"); + updateCompileLog(); + return false; + } + missions.insert(make_pair(name, mission)); + return true; + } + else + { + //this is not a mission node, so lookup recursively in the children + bool ok = true; + for (uint i=0;igetNumChildren();++i) + { + const NLLIGO::IPrimitive *child; + if ( !prim->getChild(child,i) || !parsePrimForMissions(child, missions) ) + ok = false; + } + return ok; + } +} + +void MissionCompilerMainWindow::updateCompileLog() +{ + ui->compileOutputText->setPlainText(m_compileLog); + QCoreApplication::processEvents(); +} + +void MissionCompilerMainWindow::loadConfig() { + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(MISSION_COMPILER_SECTION); + + // Retrieve the local text path. + QString localPath = settings->value(SETTING_LOCAL_TEXT_PATH).toString(); + QListWidgetItem *item = new QListWidgetItem("Local"); + item->setForeground(Qt::blue); + item->setCheckState(Qt::Unchecked); + ui->publishServersList->addItem(item); + + QStringList items = settings->value(SETTING_SERVERS_TABLE_ITEMS).toStringList(); + int column = 0; + int row = 0; + Q_FOREACH(QString var, items) + { + // Check to see if we're starting a new row. + if(column > 2) + { + column = 0; + row++; + } + if(column == 0) + { + item = new QListWidgetItem(var); + item->setCheckState(Qt::Unchecked); + ui->publishServersList->addItem(item); + } + + column++; + } + + // Reapply the checkboxes for servers we had checked previously. + QStringList servers = settings->value(SETTING_PUBLISH_SERVER_CHECKS).toStringList(); + applyCheckboxes(servers); + + settings->endGroup(); +} + +void MissionCompilerMainWindow::saveConfig() { + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(MISSION_COMPILER_SECTION); + + QStringList servers; + for(int row = 0; row < ui->publishServersList->count(); row++) + { + QListWidgetItem *item = ui->publishServersList->item(row); + if(item->checkState() == Qt::Checked) + servers << item->text(); + } + + settings->setValue(SETTING_PUBLISH_SERVER_CHECKS, servers); + + settings->endGroup(); + settings->sync(); +} + +void MissionCompilerMainWindow::handleChangedSettings() +{ + QStringList servers; + for(int row = 0; row < ui->publishServersList->count(); row++) + { + QListWidgetItem *item = ui->publishServersList->item(row); + if(item->checkState() == Qt::Checked) + servers << item->text(); + } + ui->publishServersList->clear(); + loadConfig(); + + applyCheckboxes(servers); +} + +void MissionCompilerMainWindow::applyCheckboxes(const QStringList &servers) +{ + Q_FOREACH(QString server, servers) + { + QList items = ui->publishServersList->findItems(server, Qt::MatchExactly); + if(items.size() != 1) + continue; + items.at(0)->setCheckState(Qt::Checked); + } +} + +MissionCompilerMainWindow::~MissionCompilerMainWindow() +{ + saveConfig(); + delete ui; +} diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_main_window.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_main_window.h new file mode 100644 index 000000000..1dffea313 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_main_window.h @@ -0,0 +1,75 @@ +#ifndef MISSION_COMPILER_MAIN_WINDOW_H +#define MISSION_COMPILER_MAIN_WINDOW_H + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace Ui { + class MissionCompilerMainWindow; +} + +struct CMission; + +class MissionCompilerMainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MissionCompilerMainWindow(QWidget *parent = 0); + ~MissionCompilerMainWindow(); + + void loadConfig(); + void saveConfig(); + QUndoStack *getUndoStack() { return m_undoStack; } + + typedef std::map TMissionContainer; + +public Q_SLOTS: + void handleFilterChanged(const QString &text); + void handleValidation(); + void handleCompile(); + void handlePublish(); + void handleAllDoubleClick(const QModelIndex &index); + void handleSelDoubleClick(const QModelIndex &index); + void handleMoveSelectedRight(); + void handleMoveSelectedLeft(); + void handleMoveAllRight(); + void handleMoveAllLeft(); + void handleDataDirButton(); + void handleDataDirChanged(const QString &text); + void handleResetFiltersButton(); + void handleChangedSettings(); + +private: + Ui::MissionCompilerMainWindow *ui; + + void updateCompileLog(); + void populateAllPrimitives(const QString &dataDir = QString()); + bool parsePrimForMissions(NLLIGO::IPrimitive const *prim, TMissionContainer &missions); + void compileMission(bool publish=false); + void moveSelectedItem(const QModelIndex &index, QStringListModel *from, QStringListModel *to); + void applyCheckboxes(const QStringList &servers); + + + QMenu *_toolModeMenu; + QUndoStack *m_undoStack; + QStringListModel *m_allPrimitivesModel; + QStringListModel *m_selectedPrimitivesModel; + QSortFilterProxyModel *m_filteredProxyModel; + QRegExp *m_regexpFilter; + QString m_compileLog; + QString m_lastDir; + + NLLIGO::CLigoConfig m_ligoConfig; +}; + +#endif // MISSION_COMPILER_MAIN_WINDOW_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_main_window.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_main_window.ui new file mode 100644 index 000000000..dace315ab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_main_window.ui @@ -0,0 +1,374 @@ + + + MissionCompilerMainWindow + + + + 0 + 0 + 794 + 600 + + + + MainWindow + + + + + + + 0 + + + + + 0 + 0 + 776 + 426 + + + + Mission Compiler Options + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Add Selected + + + + + + + :/buttons/images/arrow-right-2.png:/buttons/images/arrow-right-2.png + + + + + + + Add All + + + + + + + :/buttons/images/arrow-right-double-2.png:/buttons/images/arrow-right-double-2.png + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Remove All + + + + + + + :/buttons/images/arrow-left-double-2.png:/buttons/images/arrow-left-double-2.png + + + + + + + Remove Selected + + + + + + + :/buttons/images/arrow-left-2.png:/buttons/images/arrow-left-2.png + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + true + + + QAbstractItemView::NoEditTriggers + + + true + + + QAbstractItemView::DragDrop + + + Qt::MoveAction + + + true + + + QAbstractItemView::ExtendedSelection + + + + + + + true + + + QAbstractItemView::NoEditTriggers + + + true + + + QAbstractItemView::DragDrop + + + Qt::MoveAction + + + true + + + QAbstractItemView::ExtendedSelection + + + + + + + All Primitives + + + + + + + Selected Primitives + + + + + + + Filter Criteria + + + + + + + + Data Directory + + + + + + + + + + ... + + + + + + + + + + + Filter + + + + + + + + + + + + Blanks out the filter and reloads all files from the data directory. + + + Reset + + + + + + + horizontalLayoutWidget + dataDirLabel + horizontalLayoutWidget + + + + + + + + + 0 + 0 + 776 + 426 + + + + Publish Options + + + + + + + + + + + 0 + 0 + 776 + 426 + + + + Compilation Output + + + + + + true + + + + + + + + + + + + + 0 + 0 + 794 + 21 + + + + + + + toolBar + + + TopToolBarArea + + + false + + + + + + + + + :/buttons/images/run-build-2.png:/buttons/images/run-build-2.png + + + Compile + + + Compile + + + + + + :/buttons/images/news-subscribe-2.png:/buttons/images/news-subscribe-2.png + + + Validate + + + Validate + + + + + + :/buttons/images/document-export-4.png:/buttons/images/document-export-4.png + + + Publish + + + Compile and Publish + + + + + + + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_plugin.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_plugin.cpp new file mode 100644 index 000000000..9e92cb90c --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_plugin.cpp @@ -0,0 +1,76 @@ +// Project includes +#include "mission_compiler_plugin.h" +#include "../core/icore.h" +#include "../core/core_constants.h" +#include "../core/menu_manager.h" +#include "../../extension_system/iplugin_spec.h" + +// NeL includes +#include +#include + +// Qt includes +#include +#include +#include +#include +#include +#include + +#include "mission_compiler_settings_page.h" + +namespace MissionCompiler +{ + +MissionCompilerPlugin::~MissionCompilerPlugin() +{ + Q_FOREACH(QObject *obj, m_autoReleaseObjects) + { + m_plugMan->removeObject(obj); + } + qDeleteAll(m_autoReleaseObjects); + m_autoReleaseObjects.clear(); +} + +bool MissionCompilerPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString) +{ + Q_UNUSED(errorString); + m_plugMan = pluginManager; + + addAutoReleasedObject(new MissionCompilerSettingsPage(this)); + addAutoReleasedObject(new CMissionCompilerContext(this)); + //addAutoReleasedObject(new CCoreListener(this)); + return true; +} + +void MissionCompilerPlugin::extensionsInitialized() +{ + Core::ICore *core = Core::ICore::instance(); + QSettings *settings = Core::ICore::instance()->settings(); + Core::MenuManager *menuManager = core->menuManager(); + + // Initialize Ligo. + //settings->beginGroup(Core::Constants::DATA_PATH_SECTION); + //QString ligoConfigFile = settings->value(Core::Constants::DATA_PATH_SECTION).toString(); + //settings->beginGroup(Core::Constants::DATA_PATH_SECTION); +} + +void MissionCompilerPlugin::setNelContext(NLMISC::INelContext *nelContext) +{ +#ifdef NL_OS_WINDOWS + // Ensure that a context doesn't exist yet. + // This only applies to platforms without PIC, e.g. Windows. + nlassert(!NLMISC::INelContext::isContextInitialised()); +#endif // NL_OS_WINDOWS + m_LibContext = new NLMISC::CLibraryContext(*nelContext); +} + +void MissionCompilerPlugin::addAutoReleasedObject(QObject *obj) +{ + m_plugMan->addObject(obj); + m_autoReleaseObjects.prepend(obj); +} + +} + +Q_EXPORT_PLUGIN(MissionCompiler::MissionCompilerPlugin) \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_plugin.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_plugin.h new file mode 100644 index 000000000..2ad92b40f --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_plugin.h @@ -0,0 +1,91 @@ +#ifndef MISSION_COMPILER_PLUGIN_H +#define MISSION_COMPILER_PLUGIN_H + +// Project includes +#include "../../extension_system/iplugin.h" +#include "../core/icontext.h" +#include "mission_compiler_main_window.h" + +// NeL includes +#include +#include + +// Qt includes +#include +#include + +namespace NLMISC +{ +class CLibraryContext; +} + +namespace ExtensionSystem +{ +class IPluginSpec; +} + +namespace MissionCompiler +{ + +class MissionCompilerPlugin : public QObject, public ExtensionSystem::IPlugin +{ + Q_OBJECT + Q_INTERFACES(ExtensionSystem::IPlugin) +public: + + virtual ~MissionCompilerPlugin(); + + bool initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString); + void extensionsInitialized(); + void setNelContext(NLMISC::INelContext *nelContext); + + void addAutoReleasedObject(QObject *obj); + +protected: + NLMISC::CLibraryContext *m_LibContext; + +private: + ExtensionSystem::IPluginManager *m_plugMan; + QList m_autoReleaseObjects; +}; + +class CMissionCompilerContext: public Core::IContext +{ + Q_OBJECT +public: + CMissionCompilerContext(QObject *parent = 0): IContext(parent) + { + m_missionCompilerMainWindow = new MissionCompilerMainWindow(); + } + virtual ~CMissionCompilerContext() {} + + virtual QString id() const + { + return QLatin1String("MissionCompilerContext"); + } + virtual QString trName() const + { + return tr("Mission Compiler"); + } + virtual QIcon icon() const + { + return QIcon(); + } + virtual QWidget *widget() + { + return m_missionCompilerMainWindow; + } + + virtual QUndoStack *undoStack() + { + return m_missionCompilerMainWindow->getUndoStack(); + } + virtual void open() {} + + + MissionCompilerMainWindow *m_missionCompilerMainWindow; +}; + +} // namespace MissionCompiler + +#endif // MISSION_COMPILER_PLUGIN_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_plugin_constants.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_plugin_constants.h new file mode 100644 index 000000000..bfa71ceb1 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_plugin_constants.h @@ -0,0 +1,17 @@ +#ifndef MISSION_COMPILER_PLUGIN_CONSTANTS_H +#define MISSION_COMPILER_PLUGIN_CONSTANTS_H + +namespace MissionCompiler +{ +namespace Constants +{ +//settings +const char * const MISSION_COMPILER_SECTION = "MissionCompiler"; +const char * const SETTING_LOCAL_TEXT_PATH = "LocalTextPath"; +const char * const SETTING_SERVERS_TABLE_ITEMS = "ServersTableItems"; +const char * const SETTING_PUBLISH_SERVER_CHECKS = "PublishServerChecks"; + +} // namespace Constants +} // namespace MissionCompiler + +#endif // MISSION_COMPILER_PLUGIN_CONSTANTS_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_settings_page.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_settings_page.cpp new file mode 100644 index 000000000..2f75aa4ab --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_settings_page.cpp @@ -0,0 +1,203 @@ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Dzmitry Kamiahin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Project includes +#include "mission_compiler_settings_page.h" +#include "mission_compiler_plugin_constants.h" +#include "../core/core_constants.h" +#include "../core/icore.h" + +#include "server_entry_dialog.h" + +// NeL includes +#include + +// Qt includes +#include +#include +#include +#include + +namespace MissionCompiler +{ + +QString lastDir = "."; + +MissionCompilerSettingsPage::MissionCompilerSettingsPage(QObject *parent) + : IOptionsPage(parent), + m_page(0) +{ +} + +MissionCompilerSettingsPage::~MissionCompilerSettingsPage() +{ +} + +QString MissionCompilerSettingsPage::id() const +{ + return QLatin1String("mission_compiler_settings"); +} + +QString MissionCompilerSettingsPage::trName() const +{ + return tr("Mission Compiler Settings"); +} + +QString MissionCompilerSettingsPage::category() const +{ + return QLatin1String("Mission Compiler"); +} + +QString MissionCompilerSettingsPage::trCategory() const +{ + return tr("Mission Compiler"); +} + +QIcon MissionCompilerSettingsPage::categoryIcon() const +{ + return QIcon(); +} + +QWidget *MissionCompilerSettingsPage::createPage(QWidget *parent) +{ + m_page = new QWidget(parent); + m_ui.setupUi(m_page); + + readSettings(); + connect(m_ui.addToolButton, SIGNAL(clicked()), this, SLOT(addServer())); + connect(m_ui.removeToolButton, SIGNAL(clicked()), this, SLOT(delServer())); + connect(m_ui.serversTableWidget, SIGNAL(cellDoubleClicked(int,int)), this, SLOT(editServer(int,int))); + return m_page; +} + +void MissionCompilerSettingsPage::apply() +{ + writeSettings(); +} + +void MissionCompilerSettingsPage::finish() +{ + delete m_page; + m_page = 0; +} + +void MissionCompilerSettingsPage::editServer(int row, int column) +{ + ServerEntryDialog serverEntryDialog; + serverEntryDialog.setModal(true); + serverEntryDialog.show(); + + // Copy the values from the row to the dialog. + QTableWidgetItem *item1 = m_ui.serversTableWidget->item(row,0); + QTableWidgetItem *item2 = m_ui.serversTableWidget->item(row,1); + QTableWidgetItem *item3 = m_ui.serversTableWidget->item(row,2); + serverEntryDialog.setServerName(item1->text()); + serverEntryDialog.setTextPath(item2->text()); + serverEntryDialog.setPrimPath(item3->text()); + + if(serverEntryDialog.exec()) + { + item1->setText(serverEntryDialog.getServerName()); + item2->setText(serverEntryDialog.getTextPath()); + item3->setText(serverEntryDialog.getPrimPath()); + } +} + +void MissionCompilerSettingsPage::addServer() +{ + ServerEntryDialog serverEntryDialog; + serverEntryDialog.setModal(true); + serverEntryDialog.show(); + + + if(serverEntryDialog.exec()) + { + int row = m_ui.serversTableWidget->rowCount(); + m_ui.serversTableWidget->insertRow(row); + QTableWidgetItem *item1 = new QTableWidgetItem(serverEntryDialog.getServerName()); + QTableWidgetItem *item2 = new QTableWidgetItem(serverEntryDialog.getTextPath()); + QTableWidgetItem *item3 = new QTableWidgetItem(serverEntryDialog.getPrimPath()); + + m_ui.serversTableWidget->setItem(row, 0, item1); + m_ui.serversTableWidget->setItem(row, 1, item2); + m_ui.serversTableWidget->setItem(row, 2, item3); + } +} + +void MissionCompilerSettingsPage::delServer() +{ + QList selectedItems = m_ui.serversTableWidget->selectedItems(); + while(selectedItems.size() > 0) + { + m_ui.serversTableWidget->removeRow(selectedItems.back()->row()); + selectedItems = m_ui.serversTableWidget->selectedItems(); + } +} + +void MissionCompilerSettingsPage::readSettings() +{ + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(Constants::MISSION_COMPILER_SECTION); + + // Retrieve the local text path. + m_ui.localPathEdit->setText(settings->value(Constants::SETTING_LOCAL_TEXT_PATH).toString()); + + QStringList items = settings->value(Constants::SETTING_SERVERS_TABLE_ITEMS).toStringList(); + int column = 0; + int row = 0; + m_ui.serversTableWidget->insertRow(row); + Q_FOREACH(QString var, items) + { + // Check to see if we're starting a new row. + if(column > 2) + { + column = 0; + row++; + m_ui.serversTableWidget->insertRow(row); + } + + QTableWidgetItem *item = new QTableWidgetItem(var); + m_ui.serversTableWidget->setItem(row, column, item); + + column++; + } + settings->endGroup(); +} + +void MissionCompilerSettingsPage::writeSettings() +{ + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(Constants::MISSION_COMPILER_SECTION); + + // Save the local text path. + settings->setValue(Constants::SETTING_LOCAL_TEXT_PATH, m_ui.localPathEdit->text()); + + QStringList items; + for(int row = 0; row < m_ui.serversTableWidget->rowCount(); row++) + { + for(int column = 0; column < m_ui.serversTableWidget->columnCount(); column++) + { + items << m_ui.serversTableWidget->item(row, column)->text(); + } + } + + settings->setValue(Constants::SETTING_SERVERS_TABLE_ITEMS, items); + settings->endGroup(); + settings->sync(); +} + +} /* namespace MissionCompiler */ \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_settings_page.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_settings_page.h new file mode 100644 index 000000000..71996e442 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_settings_page.h @@ -0,0 +1,68 @@ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Dzmitry Kamiahin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +#ifndef MISSION_COMPILER_SETTINGS_PAGE_H +#define MISSION_COMPILER_SETTINGS_PAGE_H + +#include + +#include "../core/ioptions_page.h" + +#include "ui_mission_compiler_settings_page.h" + +class QWidget; + +namespace MissionCompiler +{ +/** +@class MissionCompilerSettingsPage +*/ +class MissionCompilerSettingsPage : public Core::IOptionsPage +{ + Q_OBJECT + +public: + MissionCompilerSettingsPage(QObject *parent = 0); + ~MissionCompilerSettingsPage(); + + QString id() const; + QString trName() const; + QString category() const; + QString trCategory() const; + QIcon categoryIcon() const; + QWidget *createPage(QWidget *parent); + + void apply(); + void finish(); + +private Q_SLOTS: + void addServer(); + void delServer(); + void editServer(int row, int column); + +private: + void readSettings(); + void writeSettings(); + + QWidget *m_page; + Ui::MissionCompilerSettingsPage m_ui; +}; + +} // namespace MissionCompiler + +#endif // MISSION_COMPILER_SETTINGS_PAGE_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_settings_page.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_settings_page.ui new file mode 100644 index 000000000..2ee2c2bce --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/mission_compiler_settings_page.ui @@ -0,0 +1,210 @@ + + + MissionCompilerSettingsPage + + + + 0 + 0 + 496 + 544 + + + + Form + + + + 6 + + + 3 + + + + + Publication Servers + + + + + + + + + 0 + 0 + + + + Delete + + + + + + + :/buttons/images/ic_nel_delete_item.png:/buttons/images/ic_nel_delete_item.png + + + + 20 + 20 + + + + true + + + + + + + + 0 + 0 + + + + Add + + + + + + + :/buttons/images/ic_nel_add_item.png:/buttons/images/ic_nel_add_item.png + + + + 20 + 20 + + + + true + + + + + + + Reset + + + + + + + :/buttons/images/ic_nel_reset_all.png:/buttons/images/ic_nel_reset_all.png + + + + 20 + 20 + + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + QAbstractItemView::NoEditTriggers + + + true + + + 100 + + + true + + + + Server Name + + + + + Server Text Path + + + + + Server Primitive Path + + + + + + + + + + + General Settings + + + + + + Local Text Path + + + + + + + Local path for compiled mission texts. + + + + + + + ... + + + + + + + + + + + + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/ovqt_plugin_mission_compiler.xml b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/ovqt_plugin_mission_compiler.xml new file mode 100644 index 000000000..f6ef5b5c6 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/ovqt_plugin_mission_compiler.xml @@ -0,0 +1,10 @@ + + ovqt_plugin_mission_compiler + MissionCompiler + 0.1 + Ryzom Core + Mission Compiler Plugin + + + + \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/server_entry_dialog.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/server_entry_dialog.cpp new file mode 100644 index 000000000..a9ef08f50 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/server_entry_dialog.cpp @@ -0,0 +1,89 @@ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Dzmitry Kamiahin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Project includes +#include "server_entry_dialog.h" + +#include "ui_server_entry_dialog.h" + +// NeL includes + +// Qt includes +#include + +namespace MissionCompiler +{ + +ServerEntryDialog::ServerEntryDialog(QWidget *parent) + : QDialog(parent), + m_ui(new Ui::ServerEntryDialog) +{ + m_ui->setupUi(this); + + connect(m_ui->serverTextPathButton, SIGNAL(clicked()), this, SLOT(lookupTextPath())); + connect(m_ui->serverPrimPathButton, SIGNAL(clicked()), this, SLOT(lookupPrimPath())); +} + +ServerEntryDialog::~ServerEntryDialog() +{ + delete m_ui; +} + +QString ServerEntryDialog::getServerName() +{ + return m_ui->serverNameEdit->text(); +} + +QString ServerEntryDialog::getTextPath() +{ + return m_ui->serverTextPathEdit->text(); +} + +QString ServerEntryDialog::getPrimPath() +{ + return m_ui->serverPrimPathEdit->text(); +} + +void ServerEntryDialog::setServerName(QString name) +{ + m_ui->serverNameEdit->setText(name); +} + +void ServerEntryDialog::setTextPath(QString path) +{ + m_ui->serverTextPathEdit->setText(path); +} + +void ServerEntryDialog::setPrimPath(QString path) +{ + m_ui->serverPrimPathEdit->setText(path); +} + +void ServerEntryDialog::lookupTextPath() +{ + QString curPath = m_ui->serverTextPathEdit->text(); + QString path = QFileDialog::getExistingDirectory(this, "", curPath); + m_ui->serverTextPathEdit->setText(path); +} + +void ServerEntryDialog::lookupPrimPath() +{ + QString curPath = m_ui->serverPrimPathEdit->text(); + QString path = QFileDialog::getExistingDirectory(this, "", curPath); + m_ui->serverPrimPathEdit->setText(path); +} +} /* namespace MissionCompiler */ \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/server_entry_dialog.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/server_entry_dialog.h new file mode 100644 index 000000000..98a086cd0 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/server_entry_dialog.h @@ -0,0 +1,59 @@ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Dzmitry Kamiahin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + + +#ifndef SERVER_ENTRY_DIALOG_H +#define SERVER_ENTRY_DIALOG_H + +#include + +namespace Ui { + class ServerEntryDialog; +} + +namespace MissionCompiler +{ +/** +@class ServerEntryDialog +*/ +class ServerEntryDialog : public QDialog +{ + Q_OBJECT + +public: + explicit ServerEntryDialog(QWidget *parent = 0); + ~ServerEntryDialog(); + + QString getServerName(); + QString getTextPath(); + QString getPrimPath(); + + void setServerName(QString name); + void setTextPath(QString path); + void setPrimPath(QString path); + +public Q_SLOTS: + void lookupTextPath(); + void lookupPrimPath(); + +private: + Ui::ServerEntryDialog *m_ui; +}; + +} // namespace MissionCompiler + +#endif // SERVER_ENTRY_DIALOG_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/server_entry_dialog.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/server_entry_dialog.ui new file mode 100644 index 000000000..002af82eb --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/server_entry_dialog.ui @@ -0,0 +1,130 @@ + + + ServerEntryDialog + + + + 0 + 0 + 488 + 175 + + + + Dialog + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + Server Settings + + + + + + Server Name + + + + + + + + + + Server Text Path + + + + + + + + + + ... + + + + + + + Server Primitive Path + + + + + + + + + + ... + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + buttonBox + accepted() + ServerEntryDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ServerEntryDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/validation_file.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/validation_file.cpp new file mode 100644 index 000000000..3e166da6b --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/validation_file.cpp @@ -0,0 +1,133 @@ +#include "validation_file.h" + +#include +#include + +void CValidationFile::loadMissionValidationFile(std::string filename) +{ + // load the configuration file + NLMISC::CConfigFile cf; + std::string pathName = NLMISC::CPath::lookup(filename, false); + + if (pathName.empty()) + { + nlwarning("Can't find index file '%s' in search path, no mission will be valid", filename.c_str()); + return; + } + cf.load(pathName); + + // get the variable + NLMISC::CConfigFile::CVar* var = cf.getVarPtr("AuthorizedStates"); + if (var) + { + for (uint i=0; isize(); ++i) + _AuthorizedStates.push_back(var->asString(i)); + } + int missionStatesFields = 3; + var = cf.getVarPtr("MissionStatesFields"); + if (var) + missionStatesFields = var->asInt(); + else + nlwarning("Mission validation file does not contain MissionStatesFields variable. Parsing may fail and corrupt data."); + + var = cf.getVarPtr("MissionStates"); + if (var) + { + for (uint i=0; isize()/missionStatesFields; ++i) + { + std::string mission = var->asString(i*missionStatesFields); + std::string stateName = var->asString(i*missionStatesFields+1); + std::string hashKey = var->asString(i*missionStatesFields+2); + _MissionStates.insert(std::make_pair(mission, CMissionState(mission, stateName, hashKey))); + } + } +} + +void CValidationFile::saveMissionValidationFile(std::string filename) +{ + // load the configuration file + std::string pathName = NLMISC::CPath::lookup(filename, false); + + if (pathName.empty()) + { + nlwarning("Can't find index file '%s' in search path, no mission will be valid", filename.c_str()); + return; + } + FILE* file = fopen(pathName.c_str(), "w"); + nlassert(file!=NULL); + + // AuthorizedStates + fprintf(file, "%s", + "// AuthorizedStates contains the list of authorized states. EGS mission\n" + "// manager can accept any number of states. Default state is the first one.\n" + "AuthorizedStates = {\n"); + std::deque::iterator itAuth, itAuthEnd = _AuthorizedStates.end(); + for (itAuth=_AuthorizedStates.begin(); itAuth!=itAuthEnd; ++itAuth) + fprintf(file, "\t\"%s\",\n", itAuth->c_str()); + fprintf(file, "%s", "};\n\n"); + + // MissionStatesFields + fprintf(file, "%s", + "// MissionStatesFields contains the number of fields in MissionStates, for\n" + "// future compatibility purpose.\n" + "MissionStatesFields = "); + fprintf(file, "%d", 3); // 3 fields: name, state, hash key + fprintf(file, "%s", ";\n\n"); + + // MissionStates + fprintf(file, "%s", + "// MissionStates contains a list of mission with for each the state of the\n" + "// mission and its hash key. The tool will add new missions with the default\n" + "// state. It will flag missions with a modified hash key with default state to\n" + "// prevent untested modified missions to be published.\n" + "// :NOTE: You can add a field to this structure without the need to modify EGS\n" + "// code. Simply update MissionStatesFields.\n" + "MissionStates = {\n"); + TMissionStateContainer::iterator itMission, itMissionEnd = _MissionStates.end(); + for (itMission=_MissionStates.begin(); itMission!=itMissionEnd; ++itMission) + fprintf(file, "\t%-42s %-12s \"%s\",\n", ("\""+itMission->second.name+"\",").c_str(), ("\""+itMission->second.state+"\",").c_str(), itMission->second.hashKey.c_str()); + fprintf(file, "};\n\n"); + + fclose(file); +} + +// :NOTE: This function exists in mission_template.cpp. If you change it here modify the other file. +std::string buildHashKey(std::string const& content) +{ + uint32 sum = 0; + size_t size = content.length()/4; + for (size_t i=0; i>1 | 0x80000000; + else + sum = sum>>1; + } + return NLMISC::toString("0x%08X", sum); +} + +bool CMission::parsePrim(NLLIGO::IPrimitive const* prim) +{ + // init default values + std::vector* params; + // get the mission script + if (!prim->getPropertyByName("script", params) || !params) + { + nlwarning("ERROR : cant find mission script!!!!!!"); + return false; + } + + // parse them + std::string content; + std::vector::iterator itParam, itParamEnd = params->end(); + for (itParam=params->begin(); itParam!=itParamEnd; ++itParam) + { + content += *itParam + "\n"; + } + hashKey = buildHashKey(content); + return true; +} \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/validation_file.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/validation_file.h new file mode 100644 index 000000000..73d661a26 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/mission_compiler/validation_file.h @@ -0,0 +1,51 @@ +#ifndef VALIDATION_FILE_H +#define VALIDATION_FILE_H + +#include +#include +#include + +#include + +struct CMissionState +{ + std::string name; + std::string state; + std::string hashKey; + CMissionState(std::string _name, std::string _state, std::string _hashKey) + : name(_name), state(_state), hashKey(_hashKey) { } +}; + +struct CMission +{ + std::string name; + std::string hashKey; + CMission(std::string _name, std::string _hashKey) + : name(_name), hashKey(_hashKey) { } + bool parsePrim(NLLIGO::IPrimitive const* prim); +}; + +class CValidationFile +{ +public: + typedef std::map TMissionStateContainer; + std::deque _AuthorizedStates; + TMissionStateContainer _MissionStates; +public: + // CValidationFile() { } + void loadMissionValidationFile(std::string filename); + void saveMissionValidationFile(std::string filename); + void insertMission(std::string const& mission, std::string const& hashKey) + { + _MissionStates.insert(std::make_pair(mission, CMissionState(mission, defaultState(), hashKey))); + } + std::string defaultState() + { + if (!_AuthorizedStates.empty()) + return _AuthorizedStates.front(); + else + return ""; + } +}; + +#endif // VALIDATION_FILE_H \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/attrib_form.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/attrib_form.ui index 77c4b895f..404444fc0 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/attrib_form.ui +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/attrib_form.ui @@ -91,7 +91,7 @@ - false + true diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/attrib_widget.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/attrib_widget.cpp index 648e0e1a5..e00d07cec 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/attrib_widget.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/attrib_widget.cpp @@ -186,12 +186,11 @@ void CAttribWidget::changeUseScheme(int index) void CAttribWidget::openSchemeBankDialog() { - CSchemeBankDialog *dialog = new CSchemeBankDialog(this); - dialog->setModal(true); - dialog->show(); - dialog->exec(); - delete dialog; - //updateUi(); + CSchemeBankDialog dialog(this); + dialog.setModal(true); + dialog.show(); + dialog.exec(); + updateUi(); } void CAttribWidget::inputValueUpdate(void) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/attrib_widget.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/attrib_widget.h index 7bd929d72..da308aba7 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/attrib_widget.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/attrib_widget.h @@ -58,7 +58,7 @@ public: /// Force to update dialog content void updateUi(); - /// Сonnects all the slots with signals + /// Connects all the slots with signals void init(); /// Sets the pointer CWorkspaceNode* in the wrappers. @@ -192,6 +192,7 @@ protected: QDialog *_SchemeWidget; Ui::CAttribWidget _ui; + friend class CSchemeBankDialog; }; /* class CAttribWidget */ /** diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/bin_op_dialog.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/bin_op_dialog.h index 061edafd4..3180e5d84 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/bin_op_dialog.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/bin_op_dialog.h @@ -97,7 +97,7 @@ public: _AttrbDlg[k]->init(); } - static const char * const operators[] = + static const char *const operators[] = { QT_TR_NOOP("Select Arg1"), QT_TR_NOOP("Select Arg2"), diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/entity.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/entity.h index 88338f214..a322363be 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/entity.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/entity.h @@ -141,7 +141,7 @@ public: float getAnimLength(std::string name); /// Get slot infomation - void setSlotInfo(uint num, CSlotInfo& slotInfo) + void setSlotInfo(uint num, CSlotInfo &slotInfo) { _SlotInfo[num] = slotInfo; } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_viewport.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_viewport.cpp index 93bc1043e..d8e36e785 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_viewport.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_viewport.cpp @@ -135,7 +135,7 @@ bool CGraphicsViewport::winEvent(MSG *message, long *result) { winProc proc = (winProc)driver->getWindowProc(); - // TODO: shouldn't it return false like the others? + // TODO: shouldn't it return false like the others? // see macEvent() and x11Event() below return proc(driver, message->hwnd, message->message, message->wParam, message->lParam); } @@ -163,7 +163,7 @@ bool CGraphicsViewport::macEvent(EventHandlerCallRef caller, EventRef event) } } - // return false to let Qt handle the event as well, + // return false to let Qt handle the event as well, // else the widget would never get focus return false; } @@ -184,7 +184,7 @@ bool CGraphicsViewport::x11Event(XEvent *event) } } - // return false to let Qt handle the event as well, + // return false to let Qt handle the event as well, // else the widget would never get focus // TODO: test me please, i have no linux at hand (rti) return false; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_viewport.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_viewport.h index d810d8c01..0c01fa1ad 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_viewport.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_viewport.h @@ -59,7 +59,7 @@ public: CGraphicsViewport(QWidget *parent); virtual ~CGraphicsViewport(); - virtual QPaintEngine* paintEngine() const + virtual QPaintEngine *paintEngine() const { return NULL; } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/hoverpoints.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/hoverpoints.cpp index fe0751082..a2556c08d 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/hoverpoints.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/hoverpoints.cpp @@ -161,7 +161,7 @@ bool HoverPoints::eventFilter(QObject *object, QEvent *event) case QEvent::TouchBegin: case QEvent::TouchUpdate: { - const QTouchEvent *const touchEvent = static_cast(event); + const QTouchEvent *const touchEvent = static_cast(event); const QList points = touchEvent->touchPoints(); const qreal pointSize = qMax(m_pointSize.width(), m_pointSize.height()); Q_FOREACH (const QTouchEvent::TouchPoint &touchPoint, points) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/icons/ic_nel_pill.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/icons/ic_nel_pill.png new file mode 100644 index 0000000000000000000000000000000000000000..e748b8190c5dcc4e24d157fa45a71216d27ec7e7 GIT binary patch literal 9291 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 t_zc8nAU*@}8Hmq7dmenuManager(); + Core::MenuManager *menuManager = Core::ICore::instance()->menuManager(); _openAction = menuManager->action(Core::Constants::OPEN); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/morph_mesh_dialog.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/morph_mesh_dialog.cpp index d125277e4..de88d14c8 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/morph_mesh_dialog.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/morph_mesh_dialog.cpp @@ -91,7 +91,7 @@ QString CMorphMeshDialog::getShapeDescStr(uint shapeIndex, sint numVerts) const } else { - QString error = qobject_cast(QObject::parent())->getShapeErrorString(numVerts); + QString error = qobject_cast(QObject::parent())->getShapeErrorString(numVerts); QString result = _CM->getShape(shapeIndex).c_str() + QString(" (%1)").arg(error); return result; } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer.cpp index dc248e563..4b0509018 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer.cpp @@ -435,7 +435,7 @@ void CObjectViewer::setCurrentObject(const std::string &name) nlinfo("set current entity %s", _CurrentInstance.c_str()); } -CEntity& CObjectViewer::getEntity(const std::string &name) +CEntity &CObjectViewer::getEntity(const std::string &name) { if ( _Entities.count(name) == 0) nlerror("Entity %s not found", name.c_str()); EIT eit = _Entities.find (name); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer.h index dc96f5cdf..5e978d7e0 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer.h @@ -152,7 +152,7 @@ public: /// Get entity from the scene /// @return ref Entity - CEntity& getEntity(const std::string &name); + CEntity &getEntity(const std::string &name); /// Get full list instances from the scene /// @param listObj - ref of return list instances diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer.qrc b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer.qrc index ac9647047..b088a5e28 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer.qrc +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer.qrc @@ -33,6 +33,7 @@ icons/ic_nel_water.png icons/ic_nel_wind.png icons/ic_nel_workspace_item.png + icons/ic_nel_pill.png images/nel.png icons/particles_system_24/ic_nel_collision_zone_item_24.png icons/particles_system_24/ic_nel_emitter_item_24.png diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer_constants.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer_constants.h index 30a9b4c45..deb0c84ce 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer_constants.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer_constants.h @@ -22,76 +22,76 @@ namespace NLQT { namespace Constants { -const char * const OBJECT_VIEWER_PLUGIN = "ObjectViewer"; +const char *const OBJECT_VIEWER_PLUGIN = "ObjectViewer"; //mainwindow -const char * const MAIN_WINDOW = "ObjectViewer.MainWindow"; +const char *const MAIN_WINDOW = "ObjectViewer.MainWindow"; //settings -const char * const OBJECT_VIEWER_SECTION = "ObjectViewer"; -const char * const GRAPHICS_DRIVER = "GraphicsDriver"; -const char * const ENABLE_BLOOM = "EnableBloom"; -const char * const ENABLE_SQUARE_BLOOM = "EnableSquareBloom"; -const char * const BLOOM_DENSITY = "BloomDensity"; -const char * const QT_STYLE = "QtStyle"; -const char * const QT_PALETTE = "QtPalette"; -const char * const FONT = "Font"; +const char *const OBJECT_VIEWER_SECTION = "ObjectViewer"; +const char *const GRAPHICS_DRIVER = "GraphicsDriver"; +const char *const ENABLE_BLOOM = "EnableBloom"; +const char *const ENABLE_SQUARE_BLOOM = "EnableSquareBloom"; +const char *const BLOOM_DENSITY = "BloomDensity"; +const char *const QT_STYLE = "QtStyle"; +const char *const QT_PALETTE = "QtPalette"; +const char *const FONT = "Font"; -const char * const SOUND_ENABLE = "SoundEnable"; -const char * const SOUND_DRIVER = "SoundDriver"; -const char * const SOUND_DEVICE = "SoundDevice"; -const char * const SOUND_AUTO_LOAD_SAMPLE = "SoundAutoLoadSample"; -const char * const SOUND_ENABLE_OCCLUDE_OBSTRUCT = "SoundEnableOccludeObstruct"; -const char * const SOUND_ENABLE_REVERB = "SoundEnableReverb"; -const char * const SOUND_MANUAL_ROLL_OFF = "SoundManualRolloff"; -const char * const SOUND_FORCE_SOFTWARE = "SoundForceSoftware"; -const char * const SOUND_USE_ADCPM = "SoundUseADPCM"; -const char * const SOUND_MAX_TRACK = "SoundMaxTrack"; -const char * const SOUND_PACKED_SHEET_PATH = "SoundPackedSheetPath"; -const char * const SOUND_SAMPLE_PATH = "SoundSamplePath"; +const char *const SOUND_ENABLE = "SoundEnable"; +const char *const SOUND_DRIVER = "SoundDriver"; +const char *const SOUND_DEVICE = "SoundDevice"; +const char *const SOUND_AUTO_LOAD_SAMPLE = "SoundAutoLoadSample"; +const char *const SOUND_ENABLE_OCCLUDE_OBSTRUCT = "SoundEnableOccludeObstruct"; +const char *const SOUND_ENABLE_REVERB = "SoundEnableReverb"; +const char *const SOUND_MANUAL_ROLL_OFF = "SoundManualRolloff"; +const char *const SOUND_FORCE_SOFTWARE = "SoundForceSoftware"; +const char *const SOUND_USE_ADCPM = "SoundUseADPCM"; +const char *const SOUND_MAX_TRACK = "SoundMaxTrack"; +const char *const SOUND_PACKED_SHEET_PATH = "SoundPackedSheetPath"; +const char *const SOUND_SAMPLE_PATH = "SoundSamplePath"; -const char * const VEGET_TILE_BANK = "VegetTileBank"; -const char * const VEGET_TILE_FAR_BANK = "VegetTileFarBank"; -const char * const VEGET_TEXTURE = "VegetTexture"; -const char * const VEGET_LANDSCAPE_ZONES = "VegetLandscapeZones"; -const char * const COARSE_MESH_TEXTURE = "CoarseMeshTexture"; +const char *const VEGET_TILE_BANK = "VegetTileBank"; +const char *const VEGET_TILE_FAR_BANK = "VegetTileFarBank"; +const char *const VEGET_TEXTURE = "VegetTexture"; +const char *const VEGET_LANDSCAPE_ZONES = "VegetLandscapeZones"; +const char *const COARSE_MESH_TEXTURE = "CoarseMeshTexture"; -const char * const ICON_ADD_ITEM = ":/icons/ic_nel_add_item.png"; -const char * const ICON_INSERT_ITEM = ":/icons/ic_nel_insert_item.png"; -const char * const ICON_DELETE_ITEM = ":/icons/ic_nel_delete_item.png"; -const char * const ICON_DOWN_ITEM = ":/icons/ic_nel_down_item.png"; -const char * const ICON_UP_ITEM = ":/icons/ic_nel_up_item.png"; -const char * const ICON_CAMERA_ADD = ":/icons/ic_nel_camera_add.png"; -const char * const ICON_CAMERA_DEL = ":/icons/ic_nel_camera_del.png"; -const char * const ICON_CAMERA_3DEDIT = ":/icons/ic_nel_camera_3dedit.png"; -const char * const ICON_CAMERA_FPS = ":/icons/ic_nel_camera_fps.png"; -const char * const ICON_RESET_CAMERA = ":/icons/ic_nel_reset_camera.png"; -const char * const ICON_ANIM = ":/icons/ic_nel_anim.png"; -const char * const ICON_ANIMSET = ":/icons/ic_nel_animset.png"; -const char * const ICON_BGCOLOR = ":/icons/ic_nel_bgcolor.png"; -const char * const ICON_DAYNIGHT = ":/icons/ic_nel_daynight.png"; -const char * const ICON_FRAMEDELAY = ":/icons/ic_nel_framedelay.png"; -const char * const ICON_MIXER = ":/icons/ic_nel_mixer.png"; -const char * const ICON_MRM_MESH = ":/icons/ic_nel_mrm_mesh.png"; -const char * const ICON_PARTICLES = ":/icons/ic_nel_particles.png"; -const char * const ICON_SKELSCALE = ":/icons/ic_nel_skelscale.png"; -const char * const ICON_VEGET = ":/icons/ic_nel_veget.png"; -const char * const ICON_VEGETSET = ":/icons/ic_nel_vegetset.png"; -const char * const ICON_WATER = ":/icons/ic_nel_water.png"; -const char * const ICON_WIND = ":/icons/ic_nel_wind.png"; +const char *const ICON_ADD_ITEM = ":/icons/ic_nel_add_item.png"; +const char *const ICON_INSERT_ITEM = ":/icons/ic_nel_insert_item.png"; +const char *const ICON_DELETE_ITEM = ":/icons/ic_nel_delete_item.png"; +const char *const ICON_DOWN_ITEM = ":/icons/ic_nel_down_item.png"; +const char *const ICON_UP_ITEM = ":/icons/ic_nel_up_item.png"; +const char *const ICON_CAMERA_ADD = ":/icons/ic_nel_camera_add.png"; +const char *const ICON_CAMERA_DEL = ":/icons/ic_nel_camera_del.png"; +const char *const ICON_CAMERA_3DEDIT = ":/icons/ic_nel_camera_3dedit.png"; +const char *const ICON_CAMERA_FPS = ":/icons/ic_nel_camera_fps.png"; +const char *const ICON_RESET_CAMERA = ":/icons/ic_nel_reset_camera.png"; +const char *const ICON_ANIM = ":/icons/ic_nel_anim.png"; +const char *const ICON_ANIMSET = ":/icons/ic_nel_animset.png"; +const char *const ICON_BGCOLOR = ":/icons/ic_nel_bgcolor.png"; +const char *const ICON_DAYNIGHT = ":/icons/ic_nel_daynight.png"; +const char *const ICON_FRAMEDELAY = ":/icons/ic_nel_framedelay.png"; +const char *const ICON_MIXER = ":/icons/ic_nel_mixer.png"; +const char *const ICON_MRM_MESH = ":/icons/ic_nel_mrm_mesh.png"; +const char *const ICON_PARTICLES = ":/icons/ic_nel_particles.png"; +const char *const ICON_SKELSCALE = ":/icons/ic_nel_skelscale.png"; +const char *const ICON_VEGET = ":/icons/ic_nel_veget.png"; +const char *const ICON_VEGETSET = ":/icons/ic_nel_vegetset.png"; +const char *const ICON_WATER = ":/icons/ic_nel_water.png"; +const char *const ICON_WIND = ":/icons/ic_nel_wind.png"; -const char * const ICON_COLLISION_ZONE_ITEM_SMALL = ":/icons/particles_system_24/ic_nel_collision_zone_item_24.png"; -const char * const ICON_EMITTER_ITEM_SMALL = ":/icons/particles_system_24/ic_nel_emitter_item_24.png"; -const char * const ICON_FORCE_ITEM_SMALL = ":/icons/particles_system_24/ic_nel_force_item_24.png"; -const char * const ICON_INSTANCE_ITEM_SMALL = ":/icons/particles_system_24/ic_nel_instance_item_24.png"; -const char * const ICON_LIGHT_ITEM_SMALL = ":/icons/particles_system_24/ic_nel_light_item_24.png"; -const char * const ICON_LOCATED_ITEM_SMALL = ":/icons/particles_system_24/ic_nel_located_item_24.png"; -const char * const ICON_PARTICLE_ITEM_SMALL = ":/icons/particles_system_24/ic_nel_particle_item_24.png"; -const char * const ICON_PARTICLE_SYSTEM_SMALL = ":/icons/particles_system_24/ic_nel_particle_system_24.png"; -const char * const ICON_PARTICLE_SYSTEM_CLOSE_SMALL = ":/icons/particles_system_24/ic_nel_particle_system_close_24.png"; -const char * const ICON_PARTICLES_SMALL = ":/icons/particles_system_24/ic_nel_particles_24.png"; -const char * const ICON_SOUND_ITEM_SMALL = ":/icons/particles_system_24/ic_nel_sound_item_24.png"; -const char * const ICON_WORKSPACE_ITEM_SMALL = ":/icons/particles_system_24/ic_nel_workspace_item_24.png"; +const char *const ICON_COLLISION_ZONE_ITEM_SMALL = ":/icons/particles_system_24/ic_nel_collision_zone_item_24.png"; +const char *const ICON_EMITTER_ITEM_SMALL = ":/icons/particles_system_24/ic_nel_emitter_item_24.png"; +const char *const ICON_FORCE_ITEM_SMALL = ":/icons/particles_system_24/ic_nel_force_item_24.png"; +const char *const ICON_INSTANCE_ITEM_SMALL = ":/icons/particles_system_24/ic_nel_instance_item_24.png"; +const char *const ICON_LIGHT_ITEM_SMALL = ":/icons/particles_system_24/ic_nel_light_item_24.png"; +const char *const ICON_LOCATED_ITEM_SMALL = ":/icons/particles_system_24/ic_nel_located_item_24.png"; +const char *const ICON_PARTICLE_ITEM_SMALL = ":/icons/particles_system_24/ic_nel_particle_item_24.png"; +const char *const ICON_PARTICLE_SYSTEM_SMALL = ":/icons/particles_system_24/ic_nel_particle_system_24.png"; +const char *const ICON_PARTICLE_SYSTEM_CLOSE_SMALL = ":/icons/particles_system_24/ic_nel_particle_system_close_24.png"; +const char *const ICON_PARTICLES_SMALL = ":/icons/particles_system_24/ic_nel_particles_24.png"; +const char *const ICON_SOUND_ITEM_SMALL = ":/icons/particles_system_24/ic_nel_sound_item_24.png"; +const char *const ICON_WORKSPACE_ITEM_SMALL = ":/icons/particles_system_24/ic_nel_workspace_item_24.png"; } // namespace Constants } // namespace NLQT diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer_plugin.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer_plugin.cpp index f82789e66..ec21cef33 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer_plugin.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer_plugin.cpp @@ -56,33 +56,6 @@ void ObjectViewerPlugin::setNelContext(NLMISC::INelContext *nelContext) _LibContext = new NLMISC::CLibraryContext(*nelContext); } -QString ObjectViewerPlugin::name() const -{ - return "ObjectViewer"; -} - -QString ObjectViewerPlugin::version() const -{ - return "0.8"; -} - -QString ObjectViewerPlugin::vendor() const -{ - return Core::Constants::OVQT_VENDOR; -} - -QString ObjectViewerPlugin::description() const -{ - return "Object Viewer plugin."; -} - -QStringList ObjectViewerPlugin::dependencies() const -{ - QStringList list; - list.append(Core::Constants::OVQT_CORE_PLUGIN); - return list; -} - void ObjectViewerPlugin::addAutoReleasedObject(QObject *obj) { _plugMan->addObject(obj); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer_plugin.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer_plugin.h index b5f9c2881..5018501bf 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer_plugin.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/object_viewer_plugin.h @@ -36,15 +36,8 @@ public: bool initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString); void extensionsInitialized(); void shutdown(); - void setNelContext(NLMISC::INelContext *nelContext); - QString name() const; - QString version() const; - QString vendor() const; - QString description() const; - QStringList dependencies() const; - void addAutoReleasedObject(QObject *obj); protected: @@ -74,7 +67,7 @@ public: virtual QIcon icon() const { - return QIcon(); + return QIcon(":/icons/ic_nel_pill.png"); } virtual QUndoStack *undoStack(); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/ovqt_plugin_object_viewer.xml b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/ovqt_plugin_object_viewer.xml new file mode 100644 index 000000000..cc951cdcb --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/ovqt_plugin_object_viewer.xml @@ -0,0 +1,10 @@ + + ovqt_plugin_object_viewer + ObjectViewer + 0.8 + Ryzom Core + Object Viewer plugin. + + + + \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_editor.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_editor.cpp index d03cdab3d..12ea96c8a 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_editor.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_editor.cpp @@ -73,11 +73,14 @@ void CParticleEditor::release() { stop(); closeWorkspace(); + delete _SchemeManager; } void CParticleEditor::setActiveNode(CWorkspaceNode *node) { if (node == _ActiveNode) return; + if (node == 0) + _ActiveNode->getPSModel()->hide(); _ActiveNode = node; bool wasRunning = _State == State::RunningSingle; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_force_page.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_force_page.h index 1bc23224f..1518bdd63 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_force_page.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_force_page.h @@ -43,7 +43,7 @@ namespace NLQT class CLocatedItem: public QListWidgetItem { public: - CLocatedItem ( const QString & text, QListWidget *parent = 0, int type = UserType ): + CLocatedItem ( const QString &text, QListWidget *parent = 0, int type = UserType ): QListWidgetItem(text, parent, type), _loc(NULL) {} void setUserData(NL3D::CPSLocated *loc) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_node.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_node.cpp index 3dfc1ce2c..15761c505 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_node.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_node.cpp @@ -378,6 +378,7 @@ void CParticleWorkspace::removeNode(uint index) { nlassert(index < _Nodes.size()); _Nodes[index] = NULL; // delete the smart-ptr target + delete _Nodes[index]; _Nodes.erase(_Nodes.begin() + index); touch(); } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_node.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_node.h index acf7dfcd6..e9da65b5c 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_node.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_node.h @@ -332,7 +332,7 @@ public: /// Restick all objects, useful after loading void restickAllObjects(); - TNodeVect& getNodeList() + TNodeVect &getNodeList() { return _Nodes; } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_tree_model.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_tree_model.cpp index 77286ed32..2daebd6e4 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_tree_model.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_tree_model.cpp @@ -404,7 +404,7 @@ bool CParticleTreeModel::insertRows(NL3D::CPSLocated *loc, int position, const Q bool CParticleTreeModel::insertRow(NL3D::CPSLocated *loc, uint32 index, int position, const QModelIndex &parent) { beginInsertRows(parent, position, position); - createItemFromLocatedInstance(loc, index, static_cast(parent.internalPointer())); + createItemFromLocatedInstance(loc, index, static_cast(parent.internalPointer())); endInsertRows(); return true; } @@ -424,7 +424,7 @@ bool CParticleTreeModel::removeRows(int position, const QModelIndex &parent) removeRows(0, parent.child(position, 0)); beginRemoveRows(parent, position, position); - static_cast(parent.internalPointer())->deleteChild(position); + static_cast(parent.internalPointer())->deleteChild(position); endRemoveRows(); return false; } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_workspace_dialog.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_workspace_dialog.cpp index 858922af1..74182120c 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_workspace_dialog.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_workspace_dialog.cpp @@ -46,7 +46,7 @@ namespace NLQT { -static const char * const LocatedBindable[] = +static const char *const LocatedBindable[] = { QT_TR_NOOP("Point"), QT_TR_NOOP("LookAt"), @@ -220,7 +220,7 @@ void CParticleWorkspaceDialog::touchPSState(CParticleTreeItem *item) } } -void CParticleWorkspaceDialog::clickedItem(const QModelIndex & index) +void CParticleWorkspaceDialog::clickedItem(const QModelIndex &index) { if (_currentItem != 0) _treeModel->getOwnerNode(_currentItem)->getPSPointer()->setCurrentEditedElement(NULL); @@ -305,6 +305,8 @@ void CParticleWorkspaceDialog::customContextMenu() _instanciateAction->setEnabled(stopped); _savePSAction->setEnabled(stopped); _saveAsPSAction->setEnabled(stopped); + _removeFromWSAction->setEnabled(stopped); + _clearContentAction->setEnabled(stopped); popurMenu->exec(QCursor::pos()); delete popurMenu; @@ -369,13 +371,14 @@ void CParticleWorkspaceDialog::clearContent() void CParticleWorkspaceDialog::removePS() { - if (_treeModel->getOwnerNode(_currentItem) == Modules::psEdit().getActiveNode()) + CWorkspaceNode *node = _currentItem->getNode(); + if (node == Modules::psEdit().getActiveNode()) Modules::psEdit().setActiveNode(NULL); QModelIndex index = _ui.treeView->currentIndex(); _ui.treeView->setCurrentIndex(index.parent()); clickedItem(index.parent()); - Modules::psEdit().getParticleWorkspace()->removeNode(static_cast(index.internalPointer())->getNode()); + Modules::psEdit().getParticleWorkspace()->removeNode(node); _treeModel->removeRows(index.row(), index.parent()); } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_workspace_dialog.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_workspace_dialog.h index 3a317adc7..c7aa0e52b 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_workspace_dialog.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_workspace_dialog.h @@ -59,7 +59,7 @@ Q_SIGNALS: void changeActiveNode(); private Q_SLOTS: - void clickedItem(const QModelIndex & index); + void clickedItem(const QModelIndex &index); void customContextMenu(); void setActiveNode(); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/ps_mover_page.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/ps_mover_page.h index a548b789a..74caadc5c 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/ps_mover_page.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/ps_mover_page.h @@ -44,7 +44,7 @@ namespace NLQT class CLocatedBindableItem: public QListWidgetItem { public: - CLocatedBindableItem ( const QString & text, QListWidget * parent = 0, int type = UserType ): + CLocatedBindableItem ( const QString &text, QListWidget *parent = 0, int type = UserType ): QListWidgetItem(text, parent, type), _lb(NULL) {} void setUserData(NL3D::CPSLocatedBindable *loc) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_bank_dialog.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_bank_dialog.cpp index 66deb2a17..bca0f4879 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_bank_dialog.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_bank_dialog.cpp @@ -1,24 +1,33 @@ -// NeL - MMORPG Framework -// Copyright (C) 2010 Winch Gate Property Limited -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License +// NeL - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // Project includes #include "stdpch.h" #include "scheme_bank_dialog.h" +#include "scheme_manager.h" #include "modules.h" +// NeL includes +#include + +// Qt includes +#include +#include +#include + namespace NLQT { @@ -27,6 +36,16 @@ CSchemeBankDialog::CSchemeBankDialog(CAttribWidget *attribWidget, QWidget *paren { _ui.setupUi(this); _attribWidget = attribWidget; + + connect(_ui.createButton, SIGNAL(clicked()), this, SLOT(createScheme())); + connect(_ui.currentButton, SIGNAL(clicked()), this, SLOT(setCurrentScheme())); + connect(_ui.removeButton, SIGNAL(clicked()), this, SLOT(removeScheme())); + connect(_ui.loadButton, SIGNAL(clicked()), this, SLOT(loadBank())); + connect(_ui.saveButton, SIGNAL(clicked()), this, SLOT(saveBank())); + connect(_ui.listWidget, SIGNAL(itemSelectionChanged()), this, SLOT(enableButtons())); + connect(_ui.listWidget, SIGNAL(itemChanged(QListWidgetItem *)), this, SLOT(changeNameScheme(QListWidgetItem *))); + + buildList(); } CSchemeBankDialog::~CSchemeBankDialog() @@ -35,27 +54,125 @@ CSchemeBankDialog::~CSchemeBankDialog() void CSchemeBankDialog::createScheme() { + bool ok; + QString text = QInputDialog::getText(this, tr("Insert new scheme"), + tr("Set name:"), QLineEdit::Normal, + "new scheme", &ok); + if (ok && !text.isEmpty()) + { + NL3D::CPSAttribMakerBase *attribMakerBase = _attribWidget->getCurrentSchemePtr()->clone(); + Modules::psEdit().getSchemeManager()->insertScheme(text.toStdString(), attribMakerBase); + + CSchemeItem *item = new CSchemeItem(text, _ui.listWidget); + item->setUserData(attribMakerBase); + item->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled); + } } void CSchemeBankDialog::setCurrentScheme() { - //SchemeManager.insertScheme(cn.getName(), getCurrentSchemePtr()->clone()); + CSchemeItem *item = dynamic_cast(_ui.listWidget->currentItem()); + + NL3D::CPSAttribMakerBase *attrib = item->getUserData(); + nlassert(attrib); + + _attribWidget->setCurrentSchemePtr(attrib->clone()); + _attribWidget->updateUi(); } void CSchemeBankDialog::removeScheme() { + CSchemeItem *item = dynamic_cast(_ui.listWidget->currentItem()); + + NL3D::CPSAttribMakerBase *attrib = item->getUserData(); + nlassert(attrib); + Modules::psEdit().getSchemeManager()->remove(attrib); + _ui.listWidget->removeItemWidget(item); + delete item; + + if (_ui.listWidget->count() == 0) + { + _ui.currentButton->setEnabled(false); + _ui.removeButton->setEnabled(false); + } } void CSchemeBankDialog::saveBank() { + QString fileName = QFileDialog::getSaveFileName(this, + tr("Save scheme bank file"), ".", + tr("Scheme bank files (*.scb)")); + + if (!fileName.isEmpty()) + { + try + { + NLMISC::COFile iF; + iF.open(fileName.toStdString()); + NLQT::CSchemeManager *schemeManager = Modules::psEdit().getSchemeManager(); + iF.serial(*schemeManager); + } + catch (std::exception &e) + { + QMessageBox::critical(this, "Scheme manager", tr("Error saving scheme bank : %1").arg(e.what())); + return; + } + } } void CSchemeBankDialog::loadBank() { + QString fileName = QFileDialog::getOpenFileName(this, + tr("Open scheme bank file"), ".", + tr("Scheme bank files (*.scb)")); + + if (!fileName.isEmpty()) + { + NLQT::CSchemeManager sm; + try + { + NLMISC::CIFile iF; + iF.open(fileName.toStdString()); + iF.serial(sm); + Modules::psEdit().getSchemeManager()->swap(sm); + } + catch (std::exception &e) + { + QMessageBox::critical(this, "Scheme manager", tr("Error loading scheme bank : %1").arg(e.what())); + return; + } + buildList(); + } } -void CSchemeBankDialog::buildList() +void CSchemeBankDialog::changeNameScheme(QListWidgetItem *item) { + CSchemeItem *schemeItem = dynamic_cast(item); + + NL3D::CPSAttribMakerBase *attrib = schemeItem->getUserData(); + nlassert(attrib); + + Modules::psEdit().getSchemeManager()->rename(attrib, item->text().toStdString()); +} + +void CSchemeBankDialog::enableButtons() +{ + _ui.currentButton->setEnabled(true); + _ui.removeButton->setEnabled(true); +} + +void CSchemeBankDialog::buildList() +{ + _ui.listWidget->clear(); + typedef std::vector TSchemeVect; + static TSchemeVect schemes; + Modules::psEdit().getSchemeManager()->getSchemes(_attribWidget->getCurrentSchemePtr()->getType(), schemes); + for (TSchemeVect::const_iterator it = schemes.begin(); it != schemes.end(); ++it) + { + CSchemeItem *item = new CSchemeItem(it->first.c_str(), _ui.listWidget); + item->setUserData(it->second); + item->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled); + } } } /* namespace NLQT */ \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_bank_dialog.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_bank_dialog.h index a02406468..8f9f300b8 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_bank_dialog.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_bank_dialog.h @@ -1,17 +1,17 @@ -// NeL - MMORPG Framework -// Copyright (C) 2010 Winch Gate Property Limited -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License +// NeL - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #ifndef SCHEME_BANK_DIALOG_H @@ -27,12 +27,37 @@ #include "nel/3d/particle_system.h" // Project includes +#include "attrib_widget.h" #include "ps_wrapper.h" namespace NLQT { class CAttribWidget; +/** +@class CSchemeItem +@brief Contain pointer to NL3D::CPSAttribMakerBase. +*/ +class CSchemeItem: public QListWidgetItem +{ +public: + CSchemeItem(const QString &text, QListWidget *parent = 0, int type = UserType ): + QListWidgetItem(text, parent, type), _attrib(NULL) {} + + void setUserData(NL3D::CPSAttribMakerBase *attrib) + { + _attrib = attrib; + } + NL3D::CPSAttribMakerBase *getUserData() const + { + return _attrib; + } + +private: + + NL3D::CPSAttribMakerBase *_attrib; +}; /* class CSchemeItem */ + class CSchemeBankDialog: public QDialog { Q_OBJECT @@ -47,9 +72,11 @@ private Q_SLOTS: void removeScheme(); void saveBank(); void loadBank(); + void enableButtons(); + void changeNameScheme(QListWidgetItem *item); private: - void buildList(); + void buildList(); CAttribWidget *_attribWidget; Ui::CSchemeBankDialog _ui; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_bank_form.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_bank_form.ui index e7dd281f8..f8fa10865 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_bank_form.ui +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_bank_form.ui @@ -14,31 +14,27 @@ Sceme bank - + - Create + Put current - - - Rename - - - - + + false + Remove - + Qt::Vertical @@ -51,24 +47,33 @@ - + + + true + Load bank - + + + true + Save bank - + + + false + 0 @@ -105,7 +110,10 @@ - + + + false + Set current diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_manager.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_manager.cpp index 62e847a73..c00422af5 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_manager.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_manager.cpp @@ -18,7 +18,7 @@ #include "scheme_manager.h" #include "nel/3d/ps_attrib_maker.h" -namespace NLQT +namespace NLQT { CSchemeManager::~CSchemeManager() @@ -34,7 +34,7 @@ void CSchemeManager::insertScheme(const std::string &name, NL3D::CPSAttribMakerB { nlassert(scheme); TSchemeInfo si(std::string(name), scheme); - _SchemeMap.insert(TSchemeMap::value_type(std::string(scheme->getType()), si)); + _SchemeMap.insert(TSchemeMap::value_type(std::string(scheme->getType()), si)); } void CSchemeManager::getSchemes(const std::string &type, std::vector &dest) @@ -49,30 +49,30 @@ void CSchemeManager::getSchemes(const std::string &type, std::vectorsecond.first); // name f.serialPolyPtr(smIt->second.second); // scheme - } + } } else { _SchemeMap.clear(); - + std::string name; NL3D::CPSAttribMakerBase *scheme = NULL; sint32 size; f.serial(size); for (sint32 k = 0; k < size; ++k) - { + { f.serial(name); f.serialPolyPtr(scheme); insertScheme(name, scheme); @@ -80,12 +80,12 @@ void CSchemeManager::serial(NLMISC::IStream &f) throw(NLMISC::EStream) } } -void CSchemeManager::swap(CSchemeManager &other) +void CSchemeManager::swap(CSchemeManager &other) { this->_SchemeMap.swap(other._SchemeMap); } -void CSchemeManager::remove(NL3D::CPSAttribMakerBase *am) +void CSchemeManager::remove(NL3D::CPSAttribMakerBase *am) { TSchemeMap::iterator smIt; for (smIt = _SchemeMap.begin(); smIt != _SchemeMap.end(); ++smIt) @@ -101,7 +101,7 @@ void CSchemeManager::remove(NL3D::CPSAttribMakerBase *am) } // rename a scheme, given a pointer on it -void CSchemeManager::rename(NL3D::CPSAttribMakerBase *am, const std::string &newName) +void CSchemeManager::rename(NL3D::CPSAttribMakerBase *am, const std::string &newName) { TSchemeMap::iterator smIt; for (smIt = _SchemeMap.begin(); smIt != _SchemeMap.end(); ++smIt) @@ -110,7 +110,7 @@ void CSchemeManager::rename(NL3D::CPSAttribMakerBase *am, const std::string &ne } if (smIt != _SchemeMap.end()) { - smIt->second.first = newName; + smIt->second.first = newName; } } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_manager.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_manager.h index 8348fae0c..7b06734f2 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_manager.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/scheme_manager.h @@ -25,7 +25,7 @@ namespace NL3D { -class CPSAttribMakerBase; + class CPSAttribMakerBase; } namespace NLQT @@ -50,11 +50,12 @@ public: void remove(NL3D::CPSAttribMakerBase *am); // rename a scheme, given a pointer on it void rename(NL3D::CPSAttribMakerBase *am, const std::string &newName); -protected: +protected: + // typedef std::pair TSchemeInfo; typedef std::multimap TSchemeMap; - TSchemeMap _SchemeMap; + TSchemeMap _SchemeMap; }; } /* namespace NLQT */ -#endif \ No newline at end of file +#endif diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/sound_system.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/sound_system.cpp index ba64d834e..a8a204c96 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/sound_system.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/sound_system.cpp @@ -107,6 +107,9 @@ void CSoundSystem::init() std::string mess = std::string("Unable to init sound :") + e.what(); nlwarning ("Init sound: %s", mess.c_str()); _AudioMixer = NULL; + QSettings *settings = Core::ICore::instance()->settings(); + if (settings->group() == Constants::OBJECT_VIEWER_SECTION) + settings->endGroup(); return; } @@ -187,7 +190,7 @@ NLSOUND::USource *CSoundSystem::create(const std::string &soundName) return NULL; } -void CSoundSystem::playAnimation(std::string& name, float lastTime, float curTime, NLSOUND::CSoundContext &context) +void CSoundSystem::playAnimation(std::string &name, float lastTime, float curTime, NLSOUND::CSoundContext &context) { if (_AnimManager == NULL) { diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/sound_system.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/sound_system.h index 4add4b9db..79ea68a46 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/sound_system.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/sound_system.h @@ -61,13 +61,13 @@ public: } /// Sets the path which contains samples - void setSamplePath(std::string& path) + void setSamplePath(std::string &path) { _SamplePath = NLMISC::CPath::standardizePath(path, true); } /// Sets the path which contains packed sheet - void setPackedSheetPath(std::string& path) + void setPackedSheetPath(std::string &path) { _PackedSheetPath = NLMISC::CPath::standardizePath(path, true); } @@ -88,13 +88,13 @@ public: NLSOUND::USource *create(const std::string &soundName); /// Load the sound animation with the specified name - void loadAnimation(std::string& name) + void loadAnimation(std::string &name) { _AnimManager->loadAnimation(name); } /// Start playing a sound animation. - void playAnimation(std::string& name, float lastTime, float curTime, NLSOUND::CSoundContext &context); + void playAnimation(std::string &name, float lastTime, float curTime, NLSOUND::CSoundContext &context); // Update the sound animations. //static void updateAnimations(float lastTime, float curTime) { _AnimManager->update(lastTime, curTime); }; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_appearance_page.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_appearance_page.cpp index 9c49871b3..0366bc11f 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_appearance_page.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_appearance_page.cpp @@ -60,7 +60,7 @@ CVegetableApperancePage::CVegetableApperancePage(QWidget *parent) connect(_ui.removePushButton, SIGNAL(clicked()), this, SLOT(removeColor())); connect(_ui.getListPushButton, SIGNAL(clicked()), this, SLOT(getFromListColors())); - connect(_ui.listWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(browseColor(QListWidgetItem*))); + connect(_ui.listWidget, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(browseColor(QListWidgetItem *))); setEnabled(false); } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/workspace_form.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/workspace_form.ui index 28705f097..b8bec17b7 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/workspace_form.ui +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/workspace_form.ui @@ -6,8 +6,8 @@ 0 0 - 337 - 232 + 235 + 293 @@ -130,7 +130,51 @@ - + + + + false + + + + 0 + 0 + + + + + 55 + 0 + + + + + 16777215 + 16777215 + + + + Unload + + + + :/icons/ic_nel_particle_system_close.png:/icons/ic_nel_particle_system_close.png + + + + 32 + 32 + + + + Qt::ToolButtonTextUnderIcon + + + true + + + + false @@ -177,7 +221,7 @@ - + false @@ -221,50 +265,6 @@ - - - - false - - - - 0 - 0 - - - - - 55 - 0 - - - - - 16777215 - 16777215 - - - - Unload - - - - :/icons/ic_nel_particle_system_close.png:/icons/ic_nel_particle_system_close.png - - - - 32 - 32 - - - - Qt::ToolButtonTextUnderIcon - - - true - - - diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/ovqt_sheet_builder/ovqt_plugin_sheet_builder.xml b/code/nel/tools/3d/object_viewer_qt/src/plugins/ovqt_sheet_builder/ovqt_plugin_sheet_builder.xml new file mode 100644 index 000000000..14965e86e --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/ovqt_sheet_builder/ovqt_plugin_sheet_builder.xml @@ -0,0 +1,10 @@ + + ovqt_plugin_sheet_builder + SheetBuilder + 1.0 + kharvd + make_sheet_id equivalent + + + + \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/ovqt_sheet_builder/ovqt_sheet_builder.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/ovqt_sheet_builder/ovqt_sheet_builder.cpp index 18e77fbcc..4fd7dfb11 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/ovqt_sheet_builder/ovqt_sheet_builder.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/ovqt_sheet_builder/ovqt_sheet_builder.cpp @@ -19,7 +19,7 @@ #include "sheetbuilderdialog.h" #include "sheetbuilderconfgdialog.h" #include "../core/icore.h" -#include "../core/imenu_manager.h" +#include "../core/menu_manager.h" #include "../core/core_constants.h" // NeL includes @@ -38,14 +38,14 @@ using namespace Plugin; bool SheetBuilderPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString) { Q_UNUSED(errorString); - _plugMan = pluginManager; + m_plugMan = pluginManager; return true; } void SheetBuilderPlugin::extensionsInitialized() { - Core::IMenuManager *menuManager = Core::ICore::instance()->menuManager(); + Core::MenuManager *menuManager = Core::ICore::instance()->menuManager(); QMenu *sheetMenu = menuManager->menu(Core::Constants::M_SHEET); QAction *sheetBuilderAction = sheetMenu->addAction(tr("Sheet builder")); @@ -69,34 +69,7 @@ void SheetBuilderPlugin::setNelContext(NLMISC::INelContext *nelContext) // This only applies to platforms without PIC, e.g. Windows. nlassert(!NLMISC::INelContext::isContextInitialised()); #endif // NL_OS_WINDOWS - _LibContext = new NLMISC::CLibraryContext(*nelContext); -} - -QString SheetBuilderPlugin::name() const -{ - return "Sheet builder"; -} - -QString SheetBuilderPlugin::version() const -{ - return "1.0"; -} - -QString SheetBuilderPlugin::vendor() const -{ - return "kharvd"; -} - -QString SheetBuilderPlugin::description() const -{ - return "make_sheet_id equivalent"; -} - -QStringList SheetBuilderPlugin::dependencies() const -{ - QStringList list; - list.append(Core::Constants::OVQT_CORE_PLUGIN); - return list; + m_LibContext = new NLMISC::CLibraryContext(*nelContext); } Q_EXPORT_PLUGIN(SheetBuilderPlugin) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/ovqt_sheet_builder/ovqt_sheet_builder.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/ovqt_sheet_builder/ovqt_sheet_builder.h index f1299dfba..504d0914d 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/ovqt_sheet_builder/ovqt_sheet_builder.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/ovqt_sheet_builder/ovqt_sheet_builder.h @@ -28,11 +28,6 @@ namespace NLMISC class CLibraryContext; } -namespace ExtensionSystem -{ -class IPluginSpec; -} - namespace Plugin { @@ -43,25 +38,18 @@ class SheetBuilderPlugin : public QObject, public ExtensionSystem::IPlugin public: bool initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString); void extensionsInitialized(); - void setNelContext(NLMISC::INelContext *nelContext); - QString name() const; - QString version() const; - QString vendor() const; - QString description() const; - QStringList dependencies() const; - void buildSheet(bool clean); private Q_SLOTS: void execBuilderDialog(); protected: - NLMISC::CLibraryContext *_LibContext; + NLMISC::CLibraryContext *m_LibContext; private: - ExtensionSystem::IPluginManager *_plugMan; + ExtensionSystem::IPluginManager *m_plugMan; }; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/ovqt_sheet_builder/sheetbuilder.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/ovqt_sheet_builder/sheetbuilder.h index aac097c9b..eb9b3bc22 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/ovqt_sheet_builder/sheetbuilder.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/ovqt_sheet_builder/sheetbuilder.h @@ -54,7 +54,7 @@ union TFormId } }; -bool operator<(const TFormId& fid1, const TFormId& fid2) +bool operator<(const TFormId &fid1, const TFormId &fid2) { return fid1.Id(outputLine.data())),(uint)outputLine.size()); + output.serialBuffer((uint8 *)(const_cast(outputLine.data())),(uint)outputLine.size()); } displayInfo (tr("------------- results ----------------")); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/CMakeLists.txt new file mode 100644 index 000000000..272c7b962 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/CMakeLists.txt @@ -0,0 +1,51 @@ +INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} + ${LIBXML2_INCLUDE_DIR} + ${QT_INCLUDES}) + +FILE(GLOB SRC *.cpp *.h) + +SET(OVQT_EXT_SYS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin.h + ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_manager.h + ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_spec.h) + +SET(OVQT_PLUG_TRANSLATION_MANAGER_HDR translation_manager_plugin.h + translation_manager_main_window.h + translation_manager_settings_page.h + translation_manager_editor.h + source_selection.h + ftp_selection.h + editor_worksheet.h + editor_phrase.h +) + +SET(OVQT_PLUG_TRANSLATION_MANAGER_UIS translation_manager_settings_page.ui + translation_manager_main_window.ui + source_selection.ui + ftp_selection.ui) + +SET(OVQT_PLUG_TRANSLATION_MANAGER_RCS ftp_selection.qrc) + +SET(QT_USE_QTGUI TRUE) +SET(QT_USE_QTNETWORK TRUE) + +QT4_WRAP_CPP(OVQT_PLUG_TRANSLATION_MANAGER_MOC_SRC ${OVQT_PLUG_TRANSLATION_MANAGER_HDR}) +QT4_WRAP_UI(OVQT_PLUG_TRANSLATION_MANAGER_UI_HDRS ${OVQT_PLUG_TRANSLATION_MANAGER_UIS}) + +SOURCE_GROUP(QtResources FILES ${OVQT_PLUG_TRANSLATION_MANAGER_UIS}) +SOURCE_GROUP(QtGeneratedUiHdr FILES ${OVQT_PLUG_TRANSLATION_MANAGER_UI_HDRS}) +SOURCE_GROUP(QtGeneratedMocSrc FILES ${OVQT_PLUG_TRANSLATION_MANAGER_MOC_SRC}) +SOURCE_GROUP("Translation Manager Plugin" FILES ${SRC}) +SOURCE_GROUP("OVQT Extension System" FILES ${OVQT_EXT_SYS_SRC}) + +ADD_LIBRARY(ovqt_plugin_translation_manager MODULE ${SRC} ${OVQT_PLUG_TRANSLATION_MANAGER_MOC_SRC} ${OVQT_EXT_SYS_SRC} ${OVQT_PLUG_TRANSLATION_MANAGER_UI_HDRS}) + +TARGET_LINK_LIBRARIES(ovqt_plugin_translation_manager ovqt_plugin_core nelmisc nelligo nelgeorges ${QT_LIBRARIES} ${QT_QTOPENGL_LIBRARY} ${QT_QTNETWORK_LIBRARY} ) + +NL_DEFAULT_PROPS(ovqt_plugin_translation_manager "NeL, Tools, 3D: Object Viewer Qt Plugin: Translation Manager") +NL_ADD_RUNTIME_FLAGS(ovqt_plugin_translation_manager) +NL_ADD_LIB_SUFFIX(ovqt_plugin_translation_manager) + +ADD_DEFINITIONS(${LIBXML2_DEFINITIONS} -DQT_PLUGIN -DQT_SHARED ${QT_DEFINITIONS}) + +INSTALL(TARGETS ovqt_plugin_translation_manager LIBRARY DESTINATION lib RUNTIME DESTINATION bin ARCHIVE DESTINATION lib COMPONENT tools3d) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/README b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/README index c5c895519..b182bfdcf 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/README +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/README @@ -1,3 +1,5 @@ -OVQT Translation Manager plugin --------------------------------- +Translation Manager Plugin +-------------------------- +GSoC 2011 Project http://dev.ryzom.com/wiki/ryzom/OVQTTranslationPluginGSoc2011 + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/editor_phrase.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/editor_phrase.cpp new file mode 100644 index 000000000..a1c59a11f --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/editor_phrase.cpp @@ -0,0 +1,134 @@ +// Translation Manager Plugin - OVQT Plugin +// Copyright (C) 2011 Emanuel Costea +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Project includes +#include "editor_phrase.h" +#include "translation_manager_constants.h" + +// Nel includes +#include "nel/misc/path.h" +#include "nel/misc/diff_tool.h" + +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +namespace TranslationManager +{ + +void CEditorPhrase::open(QString filename) +{ + std::vector phrases; + if(readPhraseFile(filename.toStdString(), phrases, false)) + { + text_edit = new CTextEdit(this); + text_edit->setUndoStack(current_stack); + SyntaxHighlighter *highlighter = new SyntaxHighlighter(text_edit); + text_edit->setUndoRedoEnabled(true); + text_edit->document()->setUndoRedoEnabled(true); + setWidget(text_edit); + // read the file content + QFile file(filename); + file.open(QIODevice::ReadOnly | QIODevice::Text); + QTextStream in(&file); + // set the file content to the text edit + QString data = in.readAll(); + text_edit->append(data); + // window settings + setCurrentFile(filename); + setAttribute(Qt::WA_DeleteOnClose); + editor_type = Constants::ED_PHRASE; + current_file = filename; + connect(text_edit->document(), SIGNAL(contentsChanged()), this, SLOT(docContentsChanged())); + connect(text_edit->document(), SIGNAL(undoCommandAdded()), this, SLOT(newUndoCommandAdded())); + } + else + { + QErrorMessage error; + error.showMessage("This file is not a phrase file."); + error.exec(); + } +} + +void CEditorPhrase::newUndoCommandAdded() +{ + current_stack->push(new CUndoPhraseNewCommand(text_edit)); +} + +void CEditorPhrase::docContentsChanged() +{ + setWindowModified(true); +} + +void CEditorPhrase::activateWindow() +{ + showMaximized(); +} + +void CEditorPhrase::save() +{ + saveAs(current_file); +} + +void CEditorPhrase::saveAs(QString filename) +{ + QFile file(filename); + file.open(QIODevice::WriteOnly | QIODevice::Text); + QTextStream out(&file); + out.setCodec("UTF-8"); + out.setGenerateByteOrderMark(true); + out << text_edit->toPlainText(); + current_file = filename; + setCurrentFile(current_file); +} + +void CEditorPhrase::closeEvent(QCloseEvent *event) +{ + if(isWindowModified()) + { + QMessageBox msgBox; + msgBox.setIcon(QMessageBox::Question); + msgBox.setText(tr("The document has been modified.")); + msgBox.setInformativeText(tr("Do you want to save your changes?")); + msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Save); + + int ret = msgBox.exec(); + switch (ret) + { + case QMessageBox::Save: + save(); + break; + case QMessageBox::Discard: + break; + case QMessageBox::Cancel: + event->ignore(); + return; + } + } + event->accept(); + close(); +} + +} \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/editor_phrase.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/editor_phrase.h new file mode 100644 index 000000000..b9955fa48 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/editor_phrase.h @@ -0,0 +1,200 @@ +// Translation Manager Plugin - OVQT Plugin +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Emanuel Costea +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef EDITOR_PHRASE_H +#define EDITOR_PHRASE_H + +// Project includes +#include "translation_manager_editor.h" + +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace TranslationManager +{ + +class CTextEdit : public QTextEdit +{ + Q_OBJECT + +private: + QUndoStack *m_undoStack; + +public: + CTextEdit(QWidget *parent = 0) : QTextEdit(parent) + { + setUndoRedoEnabled(true); + } + //void keyPressEvent(QKeyEvent *event); + void setUndoStack(QUndoStack *undoStack) + { + m_undoStack = undoStack; + } +}; + +class CEditorPhrase : public CEditor +{ + Q_OBJECT + +public: + CEditorPhrase(QMdiArea *parent) : CEditor(parent) {} + CEditorPhrase() : CEditor() {} + void open(QString filename); + void save(); + void saveAs(QString filename); + void activateWindow(); + void closeEvent(QCloseEvent *event); + +public Q_SLOTS: + void docContentsChanged(); + void newUndoCommandAdded(); + +private: + CTextEdit *text_edit; +}; + +class CUndoPhraseNewCommand : public QUndoCommand +{ +public: + CUndoPhraseNewCommand(CTextEdit *textEdit, QUndoCommand *parent = 0) + : QUndoCommand("Inserting/Removing characters", parent), + m_textEdit(textEdit) + {} + + ~CUndoPhraseNewCommand() {} + + void undo() + { + m_textEdit->undo(); + } + + void redo() + { + m_textEdit->redo(); + } + +private: + CTextEdit *m_textEdit; +}; + +class SyntaxHighlighter : public QSyntaxHighlighter +{ +public: + SyntaxHighlighter(QTextEdit *parent) : QSyntaxHighlighter(parent) + { + HighlightingRule rule; + + translateStringFormat.setFontWeight(QFont::Bold); + translateStringFormat.setForeground(Qt::darkMagenta); + rule.pattern = QRegExp("\\[.+\\]"); + rule.format = translateStringFormat; + highlightingRules.append(rule); + + singleLineCommentFormat.setForeground(Qt::red); + rule.pattern = QRegExp("//[^\n]*"); + rule.format = singleLineCommentFormat; + highlightingRules.append(rule); + + multiLineCommentFormat.setForeground(Qt::red); + + quotationFormat.setForeground(Qt::darkGreen); + rule.pattern = QRegExp("\".*\""); + rule.format = quotationFormat; + highlightingRules.append(rule); + + functionFormat.setFontItalic(true); + functionFormat.setForeground(Qt::blue); + rule.pattern = QRegExp("\\(.+\\)"); + rule.format = functionFormat; + highlightingRules.append(rule); + + commentStartExpression = QRegExp("/\\*"); + commentEndExpression = QRegExp("\\*/"); + } + + void highlightBlock(const QString &text) + { + Q_FOREACH(const HighlightingRule &rule, highlightingRules) + { + QRegExp expression(rule.pattern); + int index = expression.indexIn(text); + while (index >= 0) + { + int length = expression.matchedLength(); + setFormat(index, length, rule.format); + index = expression.indexIn(text, index + length); + } + } + setCurrentBlockState(0); + + int startIndex = 0; + if (previousBlockState() != 1) + startIndex = commentStartExpression.indexIn(text); + + while (startIndex >= 0) + { + int endIndex = commentEndExpression.indexIn(text, startIndex); + int commentLength; + if (endIndex == -1) + { + setCurrentBlockState(1); + commentLength = text.length() - startIndex; + } + else + { + commentLength = endIndex - startIndex + + commentEndExpression.matchedLength(); + } + setFormat(startIndex, commentLength, multiLineCommentFormat); + startIndex = commentStartExpression.indexIn(text, startIndex + commentLength); + } + } + +private: + struct HighlightingRule + { + QRegExp pattern; + QTextCharFormat format; + }; + QVector highlightingRules; + + QRegExp commentStartExpression; + QRegExp commentEndExpression; + + QTextCharFormat keywordFormat; + QTextCharFormat classFormat; + QTextCharFormat singleLineCommentFormat; + QTextCharFormat multiLineCommentFormat; + QTextCharFormat quotationFormat; + QTextCharFormat functionFormat; + QTextCharFormat translateStringFormat; +}; + +} + +#endif /* EDITOR_PHRASE_H */ \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/editor_worksheet.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/editor_worksheet.cpp new file mode 100644 index 000000000..7041a5178 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/editor_worksheet.cpp @@ -0,0 +1,526 @@ +// Translation Manager Plugin - OVQT Plugin +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Emanuel Costea +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Project includes +#include "editor_worksheet.h" +#include "extract_bot_names.h" +#include "translation_manager_constants.h" + +// Qt includes +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +namespace TranslationManager +{ + +void CEditorWorksheet::open(QString filename) +{ + STRING_MANAGER::TWorksheet wk_file; + if(loadExcelSheet(filename.toStdString(), wk_file, true) == true) + { + bool hasHashValue = false; + table_editor = new QTableWidget(); + if(wk_file.getData(0, 0) == ucstring("*HASH_VALUE")) + { + table_editor->setColumnCount(wk_file.ColCount - 1); + hasHashValue = true; + } + else + { + table_editor->setColumnCount(wk_file.ColCount); + } + table_editor->setRowCount(wk_file.size() - 1); + + // read columns name + for(uint i = 0; i < wk_file.ColCount; i++) + { + if(hasHashValue && i == 0) + { + // we don't show the column with hash value + } + else + { + QTableWidgetItem *col = new QTableWidgetItem(); + ucstring col_name = wk_file.getData(0, i); + col->setText(QString(col_name.toString().c_str())); + if(hasHashValue) + { + table_editor->setHorizontalHeaderItem(i - 1, col); + } + else + { + table_editor->setHorizontalHeaderItem(i, col); + } + } + } + + // read rows + for(unsigned int i = 1; i < wk_file.size(); i++) + { + for(unsigned int j = 0; j < wk_file.ColCount; j++) + { + if(hasHashValue && j == 0) + { + // we don't show the column with hash value + } + else + { + QTableWidgetItem *row = new QTableWidgetItem(); + ucstring row_value = wk_file.getData(i, j); + row->setText(QString::fromUtf8(row_value.toUtf8().c_str())); + if(hasHashValue) + { + table_editor->setItem(i - 1, j - 1, row); + } + else + { + table_editor->setItem(i - 1, j, row); + } + } + } + } + setCurrentFile(filename); + setAttribute(Qt::WA_DeleteOnClose); + setWidget(table_editor); + editor_type = Constants::ED_SHEET; + table_editor->resizeColumnsToContents(); + table_editor->resizeRowsToContents(); + // set editor signals + connect(table_editor, SIGNAL(itemChanged(QTableWidgetItem *) ), this, SLOT(worksheetEditorChanged(QTableWidgetItem *))); + connect(table_editor, SIGNAL(itemDoubleClicked(QTableWidgetItem *) ), this, SLOT(worksheetEditorCellEntered(QTableWidgetItem *))); + connect(table_editor,SIGNAL(customContextMenuRequested(const QPoint &)), this,SLOT(contextMenuEvent(QContextMenuEvent *))); + } + else + { + QErrorMessage error; + error.showMessage(tr("This file is not a worksheet file.")); + error.exec(); + } +} + + +void CEditorWorksheet::contextMenuEvent(QContextMenuEvent *e) +{ + QAction *insertRowAct = new QAction(tr("Insert new row"), this); + connect(insertRowAct, SIGNAL(triggered()), this, SLOT(insertRow())); + QAction *deleteRowAct = new QAction(tr("Delete row"), this); + connect(deleteRowAct, SIGNAL(triggered()), this, SLOT(deleteRow())); + + QMenu *contextMenu = new QMenu(this); + contextMenu->addAction(insertRowAct); + contextMenu->addAction(deleteRowAct); + contextMenu->exec( e->globalPos() ); + delete contextMenu; + contextMenu = NULL; +} + + +void CEditorWorksheet::activateWindow() +{ + showMaximized(); +} + +void CEditorWorksheet::save() +{ + saveAs(current_file); +} + +void CEditorWorksheet::saveAs(QString filename) +{ + STRING_MANAGER::TWorksheet new_file, wk_file; + loadExcelSheet(current_file.toStdString(), wk_file, true); + // set columns + new_file.resize(new_file.size() + 1); + for(unsigned int i = 0; i < wk_file.ColCount; i++) + { + ucstring col_name = wk_file.getData(0, i); + new_file.insertColumn(new_file.ColCount); + new_file.setData(0, new_file.ColCount - 1, col_name); + } + // read all the rows from table + uint rowIdx; + uint colIdx = 0; + bool hasHashValue = false; + if(wk_file.getData(0, 0) == ucstring("*HASH_VALUE")) + { + hasHashValue = true; + colIdx = 1; + } + for(int i = 0; i < table_editor->rowCount(); i++) + { + rowIdx = new_file.size(); + new_file.resize(new_file.size() + 1); + ucstring tvalue; + for(int j = 0; j < table_editor->columnCount(); j++) + { + QTableWidgetItem *item = table_editor->item(i, j); + tvalue.fromUtf8(std::string(item->text().toUtf8())); + new_file.setData(rowIdx, j + colIdx, tvalue); + } + } + if(hasHashValue) + { + // rewrite the hash codes + makeHashCode(wk_file, true); + } + ucstring s = prepareExcelSheet(new_file); + NLMISC::CI18N::writeTextFile(filename.toStdString(), s, false); + current_file = filename; + setCurrentFile(filename); +} + +void CEditorWorksheet::insertRow() +{ + int last_row = table_editor->rowCount(); + current_stack->push(new CUndoWorksheetNewCommand(table_editor, last_row)); +} + +void CEditorWorksheet::deleteRow() +{ + int selected_row = table_editor->currentRow(); + QMessageBox msgBox; + msgBox.setIcon(QMessageBox::Question); + msgBox.setText(tr("The row will be deleted.")); + msgBox.setInformativeText(tr("Do you want to delete the selected row ?")); + msgBox.setStandardButtons(QMessageBox::No | QMessageBox::Yes); + msgBox.setDefaultButton(QMessageBox::No); + + int ret = msgBox.exec(); + if(ret == QMessageBox::Yes) + { + current_stack->push(new CUndoWorksheetDeleteCommand(table_editor, selected_row)); + } + table_editor->clearFocus(); + table_editor->clearSelection(); + return; +} + +void CEditorWorksheet::worksheetEditorCellEntered(QTableWidgetItem *item) +{ + temp_content = item->text(); + current_stack->push(new CUndoWorksheetCommand(table_editor, item, temp_content)); +} + +void CEditorWorksheet::worksheetEditorChanged(QTableWidgetItem *item) +{ + if(temp_content != item->text()) + { + //current_stack->push(new CUndoWorksheetCommand(table_editor, item, temp_content)); + } + + if(!isWindowModified()) + setWindowModified(true); +} + + +void CEditorWorksheet::extractBotNames(list filters, string level_design_path, NLLIGO::CLigoConfig ligoConfig) +{ + bool modified = false; + QList new_items; + + ExtractBotNames ebn; + ebn.setRequiredSettings(filters, level_design_path); + ebn.extractBotNamesFromPrimitives(ligoConfig); + // get SimpleNames + { + map SimpleNames = ebn.getSimpleNames(); + map::iterator it(SimpleNames.begin()), last(SimpleNames.end()); + + for (; it != last; ++it) + { + QList search_results = table_editor->findItems(QString(it->first.c_str()), Qt::MatchExactly); + if(search_results.size() == 0) + { + QList records; + records.push_back(QString(it->first.c_str())); + records.push_back(QString(it->first.c_str())); + records.push_back(QString(it->second.SheetName.c_str())); + insertTableRecords(records, new_items); + if(!modified) modified = true; + } + } + ebn.cleanSimpleNames(); + } + // get GenericNames + { + set GenericNames = ebn.getGenericNames(); + set::iterator it(GenericNames.begin()), last(GenericNames.end()); + for (; it != last; ++it) + { + string gnName = "gn_" + ebn.cleanupName(*it); + QList search_results = table_editor->findItems(QString((*it).c_str()), Qt::MatchExactly); + if(search_results.size() == 0) + { + QList records; + records.push_back(QString((*it).c_str())); + records.push_back(QString(gnName.c_str())); + records.push_back(" "); + insertTableRecords(records, new_items); + if(!modified) modified = true; + } + } + ebn.cleanGenericNames(); + } + + current_stack->push(new CUndoWorksheetExtraction(new_items, table_editor)); + if(modified) + { + setWindowModified(true); + table_editor->scrollToBottom(); + } + +} + +void CEditorWorksheet::extractWords(QString filename, QString columnId, IWordListBuilder &wordListBuilder) +{ + uint i; + + // **** Load the excel sheet + // load + STRING_MANAGER::TWorksheet workSheet; + if(!loadExcelSheet(filename.toStdString(), workSheet, true)) + { + nlwarning("Error reading '%s'. Aborted", filename.toStdString().c_str()); + return; + } + // get the key column index + uint keyColIndex = 0; + if(!workSheet.findCol(columnId.toStdString(), keyColIndex)) + { + nlwarning("Error: Don't find the column '%s'. '%s' Aborted", columnId.toStdString().c_str(), filename.toStdString().c_str()); + return; + } + // get the name column index + uint nameColIndex; + if(!workSheet.findCol(ucstring("name"), nameColIndex)) + { + nlwarning("Error: Don't find the column 'name'. '%s' Aborted", filename.toStdString().c_str()); + return; + } + + // **** List all words with the builder given + std::vector allWords; + if(!wordListBuilder.buildWordList(allWords, filename.toStdString())) + { + return; + } + bool modified = false; + QList new_items; + for(i = 0; i < allWords.size(); i++) + { + string keyName = allWords[i]; + QList search_results = table_editor->findItems(QString(keyName.c_str()), Qt::MatchExactly); + if(search_results.size() == 0) + { + int knPos = 0, nPos = 0; + if(workSheet.getData(0, 0) == ucstring("*HASH_VALUE")) + { + knPos = keyColIndex - 1; + nPos = nameColIndex - 1; + } + else + { + knPos = keyColIndex; + nPos = nameColIndex; + } + + QList records; + records.push_back(QString(keyName.c_str())); + records.push_back(QString("") + QString(keyName.c_str())); + insertTableRecords(records, new_items); + if(!modified) modified = true; + } + } + current_stack->push(new CUndoWorksheetExtraction(new_items, table_editor)); + if(modified) + { + setWindowModified(true); + table_editor->scrollToBottom(); + } +} + +void CEditorWorksheet::insertTableRecords(QList records, QList new_items) +{ + const int currentRow = table_editor->rowCount(); + table_editor->setRowCount(currentRow + 1); + int n = 0; + Q_FOREACH(QString record, records) + { + QTableWidgetItem *rec = new QTableWidgetItem(); + rec->setBackgroundColor(QColor("#F75D59")); + table_editor ->setItem(currentRow, n, rec); + CTableWidgetItemStore rec_s(rec, currentRow, n); + new_items.push_back(rec_s); + n++; + } +} + +bool CEditorWorksheet::compareWorksheetFile(QString filename) +{ + STRING_MANAGER::TWorksheet wk_file; + int colIndex = 0; + if(loadExcelSheet(filename.toStdString(), wk_file, true) == true) + { + if(wk_file.getData(0, 0) == ucstring("*HASH_VALUE")) + { + colIndex = 1; + } + if(wk_file.ColCount - colIndex != table_editor->columnCount()) + { + return false; + } + for(int i = 0; i < table_editor->columnCount(); i++) + { + QString item = table_editor->horizontalHeaderItem(i)->text(); + ucstring itemC = wk_file.getData(0, i+ colIndex); + if(item.toStdString() != itemC.toString()) + { + nlwarning(item.toStdString().c_str()); + nlwarning(itemC.toString().c_str()); + return false; + } + } + } + else + { + return false; + } + return true; +} + +void CEditorWorksheet::mergeWorksheetFile(QString filename) +{ + STRING_MANAGER::TWorksheet wk_file; + if(loadExcelSheet(filename.toStdString(), wk_file, true) == true) + { + bool hasHashValue = false; + int colIndex = 0; + if(wk_file.getData(0, 0) == ucstring("*HASH_VALUE")) + { + hasHashValue = true; + colIndex = 1; + } + // read rows + for(unsigned int i = 1; i < wk_file.size(); i++) + { + // search with the first column + ucstring rowId = wk_file.getData(i,colIndex); + QList search_results = table_editor->findItems(QString(rowId.toString().c_str()), Qt::MatchExactly); + if(search_results.size() == 0) + { + const int lastRow = table_editor->rowCount(); + table_editor->setRowCount(lastRow + 1); + for(int j = 0; j < table_editor->columnCount(); j++) + { + ucstring rowValue = wk_file.getData(i, j + colIndex); // get the value + QTableWidgetItem *row = new QTableWidgetItem(); + row->setText(QString(rowValue.toString().c_str())); // set the value in table item + table_editor->setItem(lastRow, j, row); + } + } + } + } + else + { + QErrorMessage error; + error.showMessage(tr("This file is not a worksheet file.")); + error.exec(); + } +} + +void CEditorWorksheet::closeEvent(QCloseEvent *event) +{ + if(isWindowModified()) + { + QMessageBox msgBox; + msgBox.setIcon(QMessageBox::Question); + msgBox.setText(tr("The document has been modified.")); + msgBox.setInformativeText(tr("Do you want to save your changes?")); + msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Save); + int ret = msgBox.exec(); + switch (ret) + { + case QMessageBox::Save: + save(); + break; + case QMessageBox::Discard: + break; + case QMessageBox::Cancel: + event->ignore(); + return; + } + } + event->accept(); + close(); +} + + +bool CEditorWorksheet::isBotNamesTable() +{ + bool status = true; + if(table_editor->horizontalHeaderItem(0)->text() != "bot name" + || table_editor->horizontalHeaderItem(1)->text() != "translated name" + || table_editor->horizontalHeaderItem(2)->text() != "sheet_name") + { + status = false; + } + return status; +} + +bool CEditorWorksheet::isSheetTable(QString type) +{ + QString column_name; + if(type.toAscii() == Constants::WK_ITEM) + { + column_name = "item ID"; + } + else if(type.toAscii() == Constants::WK_CREATURE) + { + column_name = "creature ID"; + } + else if(type.toAscii() == Constants::WK_SBRICK) + { + column_name = "sbrick ID"; + } + else if(type.toAscii() == Constants::WK_SPHRASE) + { + column_name = "sphrase ID"; + } + else if(type.toAscii() == Constants::WK_PLACE) + { + column_name = "placeId"; + } + bool status = true; + if(table_editor->horizontalHeaderItem(0)->text() != column_name + || table_editor->horizontalHeaderItem(1)->text() != "name") + { + status = false; + } + return status; +} + +} + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/editor_worksheet.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/editor_worksheet.h new file mode 100644 index 000000000..b60c7a534 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/editor_worksheet.h @@ -0,0 +1,216 @@ +// Translation Manager Plugin - OVQT Plugin +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Emanuel Costea +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef EDITOR_WORKSHEET_H +#define EDITOR_WORKSHEET_H + +// Project includes +#include "translation_manager_editor.h" +#include "extract_new_sheet_names.h" + +// Nel includes +#include "nel/misc/types_nl.h" +#include "nel/misc/sheet_id.h" +#include "nel/misc/path.h" +#include "nel/misc/diff_tool.h" +#include "nel/ligo/ligo_config.h" + +// Qt includes +#include +#include +#include +#include +#include +#include +#include + + +namespace TranslationManager +{ + +struct CTableWidgetItemStore +{ +public: + CTableWidgetItemStore(QTableWidgetItem *item, int row, int column) : + m_item(item), + m_row(row), + m_column(column) { } + + QTableWidgetItem *m_item; + int m_row; + int m_column; +}; + +class CEditorWorksheet : public CEditor +{ + Q_OBJECT + +public: + CEditorWorksheet(QMdiArea *parent) : CEditor(parent) {} + CEditorWorksheet() : CEditor() {} + QTableWidget *table_editor; + void open(QString filename); + void save(); + void saveAs(QString filename); + void activateWindow(); + void mergeWorksheetFile(QString filename); + bool compareWorksheetFile(QString filename); + void extractBotNames(std::list filters, std::string level_design_path, NLLIGO::CLigoConfig ligoConfig); + void extractWords(QString filename, QString columnId, IWordListBuilder &wordListBuilder); + void insertTableRecords(QList records, QList new_items); + bool isBotNamesTable(); + bool isSheetTable(QString type); + void closeEvent(QCloseEvent *event); + +private Q_SLOTS: + void worksheetEditorCellEntered(QTableWidgetItem *item); + void worksheetEditorChanged(QTableWidgetItem *item); + void insertRow(); + void deleteRow(); + void contextMenuEvent(QContextMenuEvent *e); + +private: + QString temp_content; +}; + +class CUndoWorksheetCommand : public QUndoCommand +{ +public: + CUndoWorksheetCommand(QTableWidget *table, QTableWidgetItem *item, const QString &ocontent, QUndoCommand *parent = 0) : QUndoCommand("Insert characters in cells", parent), m_table(table), m_item(item), m_ocontent(ocontent) + { + m_ccontent = m_ocontent; + } + + void redo() + { + if(m_item->text() == m_ocontent) + { + m_item->setText(m_ccontent); + } + } + void undo() + { + if(m_item->text() != m_ocontent) + { + m_ccontent = m_item->text(); + } + m_item->setText(m_ocontent); + } +private: + QTableWidget *m_table; + QTableWidgetItem *m_item; + QString m_ocontent; + QString m_ccontent; +}; + +class CUndoWorksheetNewCommand : public QUndoCommand +{ +public: + CUndoWorksheetNewCommand(QTableWidget *table, int rowID, QUndoCommand *parent = 0) : QUndoCommand("Insert a new row", parent), m_table(table), m_rowID(rowID) + { } + + void redo() + { + m_table->setRowCount(m_rowID + 1); + for(int j = 0; j < m_table->columnCount(); j++) + { + QTableWidgetItem *item = new QTableWidgetItem(); + m_table->setItem(m_rowID, j, item); + m_table->scrollToBottom(); + } + } + + void undo() + { + m_table->removeRow(m_rowID); + } + +private: + QTableWidget *m_table; + int m_rowID; +}; + +class CUndoWorksheetExtraction : public QUndoCommand +{ +public: + CUndoWorksheetExtraction(QList items, QTableWidget *table, QUndoCommand *parent = 0) : QUndoCommand("Word extraction", parent), + m_items(items), + m_table(table) + { } + + void redo() + { + Q_FOREACH(CTableWidgetItemStore is, m_items) + { + m_table->setItem(is.m_row, is.m_column, is.m_item); + } + } + + void undo() + { + Q_FOREACH(CTableWidgetItemStore is, m_items) + { + m_table->setItem(is.m_row, is.m_column, is.m_item); + m_table->takeItem(is.m_row, is.m_column); + } + } + +private: + QList m_items; + QTableWidget *m_table; +}; + +class CUndoWorksheetDeleteCommand : public QUndoCommand +{ +public: + CUndoWorksheetDeleteCommand(QTableWidget *table, int rowID, QUndoCommand *parent = 0) : QUndoCommand("Delete row", parent), m_table(table), m_rowID(rowID) + { } + + void redo() + { + for(int i = 0; i < m_table->columnCount(); i++) + { + QTableWidgetItem *item = new QTableWidgetItem(); + QTableWidgetItem *table_item = m_table->item(m_rowID, i); + item->setText(table_item->text()); + m_deletedItems.push_back(item); + } + m_table->removeRow(m_rowID); + } + + void undo() + { + int lastRow = m_table->rowCount(); + m_table->setRowCount(m_table->rowCount() + 1); + int i = 0; + Q_FOREACH(QTableWidgetItem* item, m_deletedItems) + { + m_table->setItem(lastRow, i, item); + i++; + } + m_deletedItems.clear(); + } + +private: + QList m_deletedItems; + QTableWidget *m_table; + int m_rowID; +}; + +} +#endif /* EDITOR_WORKSHEET_H */ + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/extract_bot_names.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/extract_bot_names.cpp new file mode 100644 index 000000000..ee65ca73c --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/extract_bot_names.cpp @@ -0,0 +1,366 @@ +// Translation Manager Plugin - OVQT Plugin +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Emanuel Costea +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#include "extract_bot_names.h" + +static bool RemoveOlds = false; + +namespace TranslationManager +{ + +TCreatureInfo *ExtractBotNames::getCreature(const std::string &sheetName) +{ + NLMISC::CSheetId id(sheetName+".creature"); + + if (Creatures.find(id) != Creatures.end()) + return &(Creatures.find(id)->second); + else + return NULL; +} + +std::string ExtractBotNames::cleanupName(const std::string &name) +{ + std::string ret; + + for (size_t i = 0; i < name.size(); ++i) + { + if (name[i] != ' ') + ret += name[i]; + else + ret += '_'; + } + return ret; +} + +ucstring ExtractBotNames::cleanupUcName(const ucstring &name) +{ + ucstring ret; + + for (size_t i = 0; i < name.size(); ++i) + { + if (name[i] != ' ') + ret += name[i]; + else + ret += '_'; + } + return ret; +} + + +/* + Removes first and last '$' +*/ +ucstring ExtractBotNames::makeGroupName(const ucstring &translationName) +{ + ucstring ret = translationName; + if (ret.size() >= 2) + { + if (*ret.begin() == ucchar('$')) + { + ret=ret.substr(1); + } + if (*ret.rbegin() == ucchar('$')) + { + ret = ret.substr(0, ret.size() - 1); + } + } + ret = cleanupUcName(ret); + return ret; +} + +std::set ExtractBotNames::getGenericNames() +{ + return GenericNames; +} + +std::map ExtractBotNames::getSimpleNames() +{ + return SimpleNames; +} + +void ExtractBotNames::cleanSimpleNames() +{ + SimpleNames.clear(); +} + +void ExtractBotNames::cleanGenericNames() +{ + GenericNames.clear(); +} + +std::string ExtractBotNames::removeAndStoreFunction(const std::string &fullName) +{ + std::string::size_type pos = fullName.find("$"); + if (pos == std::string::npos) + { + return fullName; + } + else + { + // extract and store the function name + std::string ret; + + ret = fullName.substr(0, pos); + std::string::size_type pos2 = fullName.find("$", pos+1); + + std::string fct = fullName.substr(pos + 1, pos2 - (pos + 1)); + + ret += fullName.substr(pos2 + 1); + + if (Functions.find(fct) == Functions.end()) + { + nldebug("Adding function '%s'", fct.c_str()); + Functions.insert(fct); + } + return ret; + } +} + +void ExtractBotNames::addGenericName(const std::string &name, const std::string &sheetName) +{ + TCreatureInfo *c = getCreature(sheetName); + if (!c || c->ForceSheetName || !c->DisplayName) + return; + + if (SimpleNames.find(name) != SimpleNames.end()) + { + nldebug("Name '%s' is now a generic name", name.c_str()); + GenericNames.insert(name); + SimpleNames.erase(name); + + } + else if (GenericNames.find(name) == GenericNames.end()) + { + nldebug("Adding generic name '%s'", name.c_str()); + GenericNames.insert(name); + } +} + +void ExtractBotNames::addSimpleName(const std::string &name, const std::string &sheetName) +{ + TCreatureInfo *c = getCreature(sheetName); + if (!c || c->ForceSheetName || !c->DisplayName) + return; + + if (SimpleNames.find(name) != SimpleNames.end()) + { + addGenericName(name, sheetName); + } + else if (GenericNames.find(name) != GenericNames.end()) + { + return; + } + else + { + nldebug("Adding simple name '%s'", name.c_str()); + + TEntryInfo ei; + ei.SheetName = sheetName; + + SimpleNames.insert(make_pair(name, ei)); + } +} + +void ExtractBotNames::setRequiredSettings(std::list filters, std::string level_design_path) +{ + for (std::list::iterator it = filters.begin(); it != filters.end(); ++it) + { + Filters.push_back(*it); + } + + //------------------------------------------------------------------- + // init the sheets + NLMISC::CSheetId::init(false); + const std::string PACKED_SHEETS_NAME = "bin/translation_tools_creature.packed_sheets"; + loadForm("creature", PACKED_SHEETS_NAME, Creatures, false, false); + + if (Creatures.empty()) + { + loadForm("creature", PACKED_SHEETS_NAME, Creatures, true); + } +} + +void ExtractBotNames::extractBotNamesFromPrimitives(NLLIGO::CLigoConfig ligoConfig) +{ + //------------------------------------------------------------------- + // ok, ready for the real work, + // first, read the primitives files and parse the primitives + std::vector files; + NLMISC::CPath::getFileList("primitive", files); + + for (uint i=0; i ps; + ps.buildSet(primDoc.RootNode, pred, result); + + for (uint i = 0; i < result.size(); ++i) + { + std::string name; + std::string countStr; + std::string sheetStr; + result[i]->getPropertyByName("name", name); + result[i]->getPropertyByName("count", countStr); + result[i]->getPropertyByName("bot_sheet_look", sheetStr); + + uint32 count; + NLMISC::fromString(countStr, count); + + if (count != 0) + { + if (sheetStr.empty()) + { + nlwarning("In '%s', empty sheet !", buildPrimPath(result[i]).c_str()); + } + else + { + addGenericName(removeAndStoreFunction(name), sheetStr); + } + } + } + } + // look for bot template + { + NLLIGO::TPrimitiveClassPredicate pred("bot_template_npc"); + NLLIGO::TPrimitiveSet result; + + NLLIGO::CPrimitiveSet ps; + ps.buildSet(primDoc.RootNode, pred, result); + + for (size_t i = 0; i < result.size(); ++i) + { + std::string name; + std::string sheetStr; + result[i]->getPropertyByName("name", name); + result[i]->getPropertyByName("sheet_look", sheetStr); + + if (sheetStr.empty()) + { + // take the sheet in the parent + result[i]->getParent()->getPropertyByName("bot_sheet_look", sheetStr); + } + + if (sheetStr.empty()) + { + nlwarning("In '%s', empty sheet !", buildPrimPath(result[i]).c_str()); + } + else + { + addGenericName(removeAndStoreFunction(name), sheetStr); + } + } + } + // look for npc_group + { + NLLIGO::TPrimitiveClassPredicate pred("npc_group"); + NLLIGO::TPrimitiveSet result; + + NLLIGO::CPrimitiveSet ps; + ps.buildSet(primDoc.RootNode, pred, result); + + for (size_t i = 0; i < result.size(); ++i) + { + std::string name; + std::string countStr; + std::string sheetStr; + result[i]->getPropertyByName("name", name); + result[i]->getPropertyByName("count", countStr); + result[i]->getPropertyByName("bot_sheet_client", sheetStr); + + uint32 count; + NLMISC::fromString(countStr, count); + + if (count > 0 && sheetStr.empty()) + { + nlwarning("In '%s', empty sheet !", buildPrimPath(result[i]).c_str()); + } + else + { + if (count == 1) + { + addSimpleName(removeAndStoreFunction(name), sheetStr); + } + else if (count > 1) + { + addGenericName(removeAndStoreFunction(name), sheetStr); + } + } + } + } + // look for bot + { + NLLIGO::TPrimitiveClassPredicate pred("npc_bot"); + NLLIGO::TPrimitiveSet result; + + NLLIGO::CPrimitiveSet ps; + ps.buildSet(primDoc.RootNode, pred, result); + + for (size_t i = 0; i < result.size(); ++i) + { + std::string name; + std::string sheetStr; + result[i]->getPropertyByName("name", name); + result[i]->getPropertyByName("sheet_client", sheetStr); + + if (sheetStr.empty()) + { + // take the sheet in the parent + result[i]->getParent()->getPropertyByName("bot_sheet_client", sheetStr); + } + + if (sheetStr.empty()) + { + nlwarning("In '%s', empty sheet !", buildPrimPath(result[i]).c_str()); + } + else + { + addSimpleName(removeAndStoreFunction(name), sheetStr); + } + } + } + } +} + +} \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/extract_bot_names.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/extract_bot_names.h new file mode 100644 index 000000000..208b4db5c --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/extract_bot_names.h @@ -0,0 +1,99 @@ +// Translation Manager Plugin - OVQT Plugin +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Emanuel Costea +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef EXTRACT_BOT_NAMES_H +#define EXTRACT_BOT_NAMES_H + +#include "nel/misc/types_nl.h" +#include "nel/misc/config_file.h" +#include "nel/misc/sheet_id.h" +#include "nel/misc/path.h" +#include "nel/misc/diff_tool.h" +#include "nel/georges/u_form.h" +#include "nel/georges/u_form_elm.h" +#include "nel/georges/load_form.h" +#include "nel/ligo/ligo_config.h" +#include "nel/ligo/primitive.h" +#include "nel/ligo/primitive_utils.h" + +namespace TranslationManager +{ + +struct TCreatureInfo +{ + NLMISC::CSheetId SheetId; + bool ForceSheetName; + bool DisplayName; + + void readGeorges(const NLMISC::CSmartPtr &form, const NLMISC::CSheetId &sheetId) + { + const NLGEORGES::UFormElm &item=form->getRootNode(); + + SheetId=sheetId; + item.getValueByName(ForceSheetName, "3d data.ForceDisplayCreatureName"); + item.getValueByName(DisplayName, "3d data.DisplayName"); + } + + void serial(NLMISC::IStream &f) + { + f.serial(SheetId); + f.serial(ForceSheetName); + f.serial(DisplayName); + } + + static uint getVersion () + { + return 1; + } + + void removed() + { + } +}; + +struct TEntryInfo +{ + std::string SheetName; +}; + +struct ExtractBotNames +{ +private: + std::vector Filters; + std::map Creatures; + std::set GenericNames; + std::map SimpleNames; + std::set Functions; +private: + TCreatureInfo *getCreature(const std::string &sheetName); + ucstring makeGroupName(const ucstring &translationName); + std::string removeAndStoreFunction(const std::string &fullName); + void addGenericName(const std::string &name, const std::string &sheetName); + void addSimpleName(const std::string &name, const std::string &sheetName); +public: + void extractBotNamesFromPrimitives(NLLIGO::CLigoConfig ligoConfig); + void setRequiredSettings(std::list filters, std::string level_design_path); + std::set getGenericNames(); + std::map getSimpleNames(); + std::string cleanupName(const std::string &name); + ucstring cleanupUcName(const ucstring &name); + void cleanSimpleNames(); + void cleanGenericNames(); +}; +} + +#endif /* EXTRACT_BOT_NAMES_H */ \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/extract_new_sheet_names.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/extract_new_sheet_names.cpp new file mode 100644 index 000000000..984f86d17 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/extract_new_sheet_names.cpp @@ -0,0 +1,150 @@ +// Ryzom - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#include "extract_new_sheet_names.h" + +namespace TranslationManager +{ + +// *************************************************************************** +/* + * Specialisation of IWordListBuilder to list sheets in a directory + */ + +bool CSheetWordListBuilder::buildWordList(std::vector &allWords, std::string workSheetFileName) +{ + SheetExt = NLMISC::toLower(SheetExt); + // verify the directory is correct + if(!NLMISC::CFile::isDirectory(SheetPath)) + { + nlwarning("Error: Directory '%s' not found. '%s' Aborted", SheetPath.c_str(), workSheetFileName.c_str()); + return false; + } + + // list all files. + std::vector allFiles; + allFiles.reserve(100000); + NLMISC::CPath::getPathContent(SheetPath, true, false, true, allFiles, NULL); + + // Keep only the extension we want, and remove "_" (parent) + allWords.clear(); + allWords.reserve(allFiles.size()); + for(size_t i = 0; i < allFiles.size(); i++) + { + std::string fileNameWithoutExt = NLMISC::CFile::getFilenameWithoutExtension(allFiles[i]); + std::string extension = NLMISC::toLower(NLMISC::CFile::getExtension(allFiles[i])); + + // bad extension? + if(extension!=SheetExt) + continue; + + // parent? + if(fileNameWithoutExt.empty() || fileNameWithoutExt[0] == '_') + continue; + + // ok, add + allWords.push_back(NLMISC::toLower(fileNameWithoutExt)); + } + return true; +} + +// *************************************************************************** +/* + * Specialisation of IWordListBuilder to list new region/place name from .primitive + */ +bool CRegionPrimWordListBuilder::buildWordList(std::vector &allWords, std::string workSheetFileName) +{ + // verify the directory is correct + if(!NLMISC::CFile::isDirectory(PrimPath)) + { + nlwarning("Error: Directory '%s' not found. '%s' Aborted", PrimPath.c_str(), workSheetFileName.c_str()); + return false; + } + + // list all files. + std::vector allFiles; + allFiles.reserve(100000); + NLMISC::CPath::getPathContent(PrimPath, true, false, true, allFiles, NULL); + + // parse all primitive that match the filter + allWords.clear(); + allWords.reserve(100000); + // to avoid duplicate + std::set allWordSet; + for(size_t i = 0; i < allFiles.size(); i++) + { + std::string fileName = NLMISC::CFile::getFilename(allFiles[i]); + // filter don't match? + bool oneMatch= false; + for(size_t filter = 0; filter < PrimFilter.size(); filter++) + { + if(NLMISC::testWildCard(fileName, PrimFilter[filter])) + oneMatch= true; + } + if(!oneMatch) + continue; + + // ok, read the file + NLLIGO::CPrimitives PrimDoc; + NLLIGO::CPrimitiveContext::instance().CurrentPrimitive = &PrimDoc; + if (!NLLIGO::loadXmlPrimitiveFile(PrimDoc, allFiles[i], LigoConfig)) + { + nlwarning("Error: cannot open file '%s'. '%s' Aborted", allFiles[i].c_str(), workSheetFileName.c_str()); + NLLIGO::CPrimitiveContext::instance().CurrentPrimitive = NULL; + return false; + } + NLLIGO::CPrimitiveContext::instance().CurrentPrimitive = NULL; + + // For all primitives of interest + const char *listClass[] = {"continent", "region", "place", "stable", + "teleport_destination", "room_template" + }; + + const char *listProp[] = {"name", "name", "name", "name", + "place_name", "place_name" + }; + + const uint numListClass= sizeof(listClass)/sizeof(listClass[0]); + const uint numListProp= sizeof(listProp)/sizeof(listProp[0]); + nlctassert(numListProp == numListClass); + for(uint cid = 0; cid < numListClass; cid++) + { + // parse the whole hierarchy + NLLIGO::TPrimitiveClassPredicate predCont(listClass[cid]); + NLLIGO::CPrimitiveSet setPlace; + NLLIGO::TPrimitiveSet placeRes; + setPlace.buildSet(PrimDoc.RootNode, predCont, placeRes); + + // for all found + for (size_t placeId = 0; placeId < placeRes.size(); ++placeId) + { + std::string primName; + if(placeRes[placeId]->getPropertyByName(listProp[cid], primName) && !primName.empty()) + { + primName = NLMISC::toLower(primName); + // avoid duplicate + if(allWordSet.insert(primName).second) + { + allWords.push_back(primName); + } + } + } + } + } + return true; +} + +} \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/extract_new_sheet_names.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/extract_new_sheet_names.h new file mode 100644 index 000000000..01d0f1a0a --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/extract_new_sheet_names.h @@ -0,0 +1,63 @@ +// Ryzom - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef EXTRACT_NEW_SHEET_NAMES_H +#define EXTRACT_NEW_SHEET_NAMES_H + +#include "nel/misc/types_nl.h" +#include "nel/misc/config_file.h" +#include "nel/misc/sheet_id.h" +#include "nel/misc/path.h" +#include "nel/misc/diff_tool.h" +#include "nel/misc/algo.h" +#include "nel/georges/u_form.h" +#include "nel/georges/u_form_elm.h" +#include "nel/georges/load_form.h" +#include "nel/ligo/ligo_config.h" +#include "nel/ligo/primitive.h" +#include "nel/ligo/primitive_utils.h" + +namespace TranslationManager +{ + +// *************************************************************************** +/* + * Interface to build the whole list of words (key id) for a specific worksheet + */ +struct IWordListBuilder +{ + virtual bool buildWordList(std::vector &allWords, std::string workSheetFileName) =0; +}; + +struct CSheetWordListBuilder : public IWordListBuilder +{ + std::string SheetExt; + std::string SheetPath; + + virtual bool buildWordList(std::vector &allWords, std::string workSheetFileName); +}; + +struct CRegionPrimWordListBuilder : public IWordListBuilder +{ + std::string PrimPath; + std::vector PrimFilter; + NLLIGO::CLigoConfig LigoConfig; + virtual bool buildWordList(std::vector &allWords, std::string workSheetFileName); +}; + +} + +#endif /* EXTRACT_NEW_SHEET_NAMES_H */ \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/ftp_selection.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/ftp_selection.cpp new file mode 100644 index 000000000..876599b61 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/ftp_selection.cpp @@ -0,0 +1,216 @@ +// Translation Manager Plugin - OVQT Plugin +// Copyright (C) 2011 Emanuel Costea +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#include "ftp_selection.h" + +#include +#include + +namespace TranslationManager +{ +CFtpSelection::CFtpSelection(QWidget *parent): QDialog(parent) +{ + _ui.setupUi(this); + connect(_ui.connectButton, SIGNAL(clicked()), this, SLOT(ConnectButtonClicked())); + connect(_ui.doneButton, SIGNAL(clicked()), this, SLOT(DoneButtonClicked())); + connect(_ui.cdToParrent, SIGNAL(clicked()), this, SLOT(cdToParent())); + connect(_ui.cancelButton, SIGNAL(clicked()), this, SLOT(reject())); + + // file list + connect(_ui.fileList, SIGNAL(itemActivated(QTreeWidgetItem *,int)),this, SLOT(processItem(QTreeWidgetItem *,int))); + _ui.fileList->setEnabled(false); + _ui.fileList->setRootIsDecorated(false); + _ui.fileList->setHeaderLabels(QStringList() << tr("Name") << tr("Size") << tr("Owner") << tr("Group") << tr("Time")); + _ui.fileList->header()->setStretchLastSection(false); + + // buttons + _ui.cdToParrent->setEnabled(false); + _ui.doneButton->setEnabled(false); + + status = false; +} + +// Connection with the FTP Server. We retrieve the file list. +void CFtpSelection::ConnectButtonClicked() +{ + conn = new QFtp(this); + connect(conn, SIGNAL(commandFinished(int,bool)), this, SLOT(FtpCommandFinished(int,bool))); + connect(conn, SIGNAL(listInfo(QUrlInfo)), this, SLOT(AddToList(QUrlInfo))); + + setCursor(Qt::WaitCursor); + + QUrl url(_ui.url->text()); + if (!url.isValid() || url.scheme().toLower() != QLatin1String("ftp")) + { + conn->connectToHost(_ui.url->text(), 21); + conn->login(); + } + else + { + conn->connectToHost(url.host(), url.port(21)); + + if (!url.userName().isEmpty()) + conn->login(QUrl::fromPercentEncoding(url.userName().toLatin1()), url.password()); + else + conn->login(); + if (!url.path().isEmpty()) + conn->cd(url.path()); + } +} + +// Get the user action. +void CFtpSelection::FtpCommandFinished(int, bool error) +{ + setCursor(Qt::ArrowCursor); + + if (conn->currentCommand() == QFtp::ConnectToHost) + { + if (error) + { + QMessageBox::information(this, tr("FTP"), + tr("Unable to connect to the FTP server " + "at %1. Please check that the host " + "name is correct.") + .arg(_ui.url->text())); + return; + } + + return; + } + + if (conn->currentCommand() == QFtp::Login) + { + conn->list(); + } + + if (conn->currentCommand() == QFtp::Get) + { + if(error) + { + status = false; + file->close(); + file->remove(); + } + else + { + file->close(); + status = true; + } + _ui.cancelButton->setEnabled(true); + } + + if (conn->currentCommand() == QFtp::List) + { + if (isDirectory.isEmpty()) + { + _ui.fileList->addTopLevelItem(new QTreeWidgetItem(QStringList() << tr(""))); + _ui.fileList->setEnabled(false); + } + } +} +// Make the file list with directories and files +void CFtpSelection::AddToList(const QUrlInfo &urlInfo) +{ + QTreeWidgetItem *item = new QTreeWidgetItem; + item->setText(0, urlInfo.name()); + item->setText(1, QString::number(urlInfo.size())); + item->setText(2, urlInfo.owner()); + item->setText(3, urlInfo.group()); + item->setText(4, urlInfo.lastModified().toString("MMM dd yyyy")); + + QPixmap pixmap(urlInfo.isDir() ? ":/translationManager/images/dir.png" : ":/translationManager/images/file.png"); + item->setIcon(0, pixmap); + + isDirectory[urlInfo.name()] = urlInfo.isDir(); + _ui.fileList->addTopLevelItem(item); + if (!_ui.fileList->currentItem()) + { + _ui.fileList->setCurrentItem(_ui.fileList->topLevelItem(0)); + _ui.fileList->setEnabled(true); + } +} + +void CFtpSelection::processItem(QTreeWidgetItem *item, int) +{ + QString name = item->text(0); + if (isDirectory.value(name)) + { + _ui.fileList->clear(); + isDirectory.clear(); + currentPath += '/'; + currentPath += name; + conn->cd(name); + conn->list(); + + setCursor(Qt::WaitCursor); + return; + } + _ui.doneButton->setEnabled(true); +} + +// Exit from a directory +void CFtpSelection::cdToParent() +{ + setCursor(Qt::WaitCursor); + + _ui.fileList->clear(); + isDirectory.clear(); + currentPath = currentPath.left(currentPath.lastIndexOf('/')); + if (currentPath.isEmpty()) + { + _ui.cdToParrent->setEnabled(false); + conn->cd("/"); + } + else + { + conn->cd(currentPath); + } + conn->list(); +} + +// Done action +void CFtpSelection::DoneButtonClicked() +{ + QString fileName = _ui.fileList->currentItem()->text(0); + + if (QFile::exists(fileName)) + { + QMessageBox::information(this, tr("FTP"), + tr("There already exists a file called %1 in " + "the current directory.") + .arg(fileName)); + return; + } + + file = new QFile(fileName); + + setCursor(Qt::WaitCursor); + + if (!file->open(QIODevice::WriteOnly)) + { + QMessageBox::information(this, tr("FTP"), + tr("Unable to save the file %1: %2.") + .arg(fileName).arg(file->errorString())); + delete file; + return; + } + _ui.cancelButton->setEnabled(false); + conn->get(_ui.fileList->currentItem()->text(0), file); + + reject(); +} + +} diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/ftp_selection.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/ftp_selection.h new file mode 100644 index 000000000..9f8af85dd --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/ftp_selection.h @@ -0,0 +1,50 @@ +/* + * File: ftp_selection.h + * Author: cemycc + * + * Created on July 8, 2011, 4:03 PM + */ + +#ifndef FTP_SELECTION_H +#define FTP_SELECTION_H + +#include "ui_ftp_selection.h" + +#include +#include +#include +#include +#include +#include +#include + +namespace TranslationManager +{ + +class CFtpSelection : public QDialog +{ + Q_OBJECT + +public: + CFtpSelection(QWidget *parent = 0); + ~CFtpSelection() {} + bool status; + QFile *file; + +private Q_SLOTS: + void cdToParent(); + void processItem(QTreeWidgetItem *,int); + void ConnectButtonClicked(); + void DoneButtonClicked(); + void FtpCommandFinished(int, bool error); + void AddToList(const QUrlInfo &urlInfo); + +private: + Ui::FtpSelectionDialog _ui; + QFtp *conn; + QHash isDirectory; + QString currentPath; +}; +} + +#endif /* FTP_SELECTION_H */ \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/ftp_selection.qrc b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/ftp_selection.qrc new file mode 100644 index 000000000..bd54366ed --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/ftp_selection.qrc @@ -0,0 +1,7 @@ + + + images/cdtoparent.png + images/dir.png + images/file.png + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/ftp_selection.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/ftp_selection.ui new file mode 100644 index 000000000..7b3041c04 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/ftp_selection.ui @@ -0,0 +1,120 @@ + + + FtpSelectionDialog + + + + 0 + 0 + 640 + 576 + + + + Dialog + + + + + + FTP Server informations + + + + + + + + Ftp server + + + + + + + + + + + + + + :/translationManager/images/cdtoparent.png:/translationManager/images/cdtoparent.png + + + + + + + Connect + + + + + + + + + Content + + + + + + Please select the file + + + + + + + + 1 + + + + + + + + Qt::Vertical + + + + 20 + 378 + + + + + + + + + + + + + Done + + + + + + + Cancel + + + + + + + + + + + + + + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/images/cdtoparent.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/images/cdtoparent.png new file mode 100644 index 0000000000000000000000000000000000000000..24b618082900a68c531862777d8b95d6e55d4e7f GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^{2(?58;~rMGjRk`oCO|{#X#BvjNMLV+W{H2o-U3d z8t0P}92)*d7z94}|Npn+a literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/images/dir.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/images/dir.png new file mode 100644 index 0000000000000000000000000000000000000000..0ce5ae75fcfd96151c964bf48165b31556295312 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#X#BvjNMLV+W{Fqo-U3d z7QM*{5+(`H&dmIO(a>|&`8k%K|NpON6PcyqT#)Hz#Tve vk7T)V%?=a~xXSt@VFzQthxtA}mJAF%>wkJ2U`u`rG?&5C)z4*}Q$iB}ZY?ls literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/images/file.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/images/file.png new file mode 100644 index 0000000000000000000000000000000000000000..be6c53089ab9e9eba8477b56acbf44df81220934 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6I14-?i-EKU7`vU!wgWPZJzX3_ zG|nd{D6qWxpX_A9`Xa%8l~4}XKV|KMAqN + ovqt_plugin_translation_manager + TranslationManager + 0.8 + Ryzom Core + Translation Manager plugin. + + + + \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/source_selection.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/source_selection.cpp new file mode 100644 index 000000000..518906db0 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/source_selection.cpp @@ -0,0 +1,60 @@ +// Translation Manager Plugin - OVQT Plugin +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Emanuel Costea +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#include "source_selection.h" + +#include + +namespace TranslationManager +{ + +CSourceDialog::CSourceDialog(QWidget *parent): QDialog(parent) +{ + _ui.setupUi(this); + + connect(_ui.ok_button, SIGNAL(clicked()), this, SLOT(OkButtonClicked())); + connect(_ui.cancel_button, SIGNAL(clicked()), this, SLOT(reject())); + + _ui.sourceSelectionListWidget->setSortingEnabled(false); + connect(_ui.sourceSelectionListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem *)), + this, SLOT(itemDoubleClicked(QListWidgetItem *))); +} + +// Insert options in the source dialog. Options like: from FTP Server, from Local directory etc. +void CSourceDialog::setSourceOptions(std::map &options) +{ + std::map::iterator it; + + for(it = options.begin(); it != options.end(); ++it) + { + _ui.sourceSelectionListWidget->addItem((*it).first); + } +} + +void CSourceDialog::OkButtonClicked() +{ + selected_item = _ui.sourceSelectionListWidget->currentItem(); + accept(); +} + +void CSourceDialog::itemDoubleClicked(QListWidgetItem *item) +{ + selected_item = item; + accept(); +} + +} \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/source_selection.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/source_selection.h new file mode 100644 index 000000000..7b6fc2cb9 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/source_selection.h @@ -0,0 +1,54 @@ +// Translation Manager Plugin - OVQT Plugin +// Copyright (C) 2011 Emanuel Costea +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef SOURCE_SELECTION_H +#define SOURCE_SELECTION_H + +#include "ui_source_selection.h" + +#include +#include +#include +#include + +#include + +namespace TranslationManager +{ + +class CSourceDialog : public QDialog +{ + Q_OBJECT + +public: + CSourceDialog(QWidget *parent = 0); + ~CSourceDialog() {} + void setSourceOptions(std::map &options); + QListWidgetItem *selected_item; + +private Q_SLOTS: + void OkButtonClicked(); + void itemDoubleClicked(QListWidgetItem *item); + +private: + Ui::SourceSelectionDialog _ui; +}; + +} + + +#endif /* SOURCE_SELECTION_H */ + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/source_selection.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/source_selection.ui new file mode 100644 index 000000000..e64ba78c4 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/source_selection.ui @@ -0,0 +1,60 @@ + + + SourceSelectionDialog + + + Qt::WindowModal + + + true + + + + 0 + 0 + 316 + 155 + + + + Dialog + + + true + + + + + + Select source for merge operation + + + + + + + + + + + OK + + + + + + + Cancel + + + + + + + + + + + + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_constants.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_constants.h new file mode 100644 index 000000000..d72a2b223 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_constants.h @@ -0,0 +1,39 @@ +// Translation Manager Plugin - OVQT Plugin +// Copyright (C) 2011 Emanuel Costea +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef TRANSLATION_MANAGER_CONSTANTS_H +#define TRANSLATION_MANAGER_CONSTANTS_H + +namespace TranslationManager +{ +namespace Constants +{ +const int ED_SHEET = 1; +const int ED_PHRASE = 2; + +const char *const WK_BOTNAMES = "bot_names_wk.txt"; +const char *const WK_ITEM = "item_words_wk.txt"; +const char *const WK_CREATURE = "creature_words_wk.txt"; +const char *const WK_SBRICK = "sbrick_words_wk.txt"; +const char *const WK_SPHRASE = "sphrase_words_wk.txt"; +const char *const WK_PLACE = "place_words_wk.txt"; +const char *const WK_CONTINENT = "place_words_wk.txt"; +const char *const WK_STABLE = "place_words_wk.txt"; +} +} + +#endif /* TRANSLATION_MANAGER_CONSTANTS_H */ + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_editor.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_editor.h new file mode 100644 index 000000000..fd53ba863 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_editor.h @@ -0,0 +1,71 @@ +// Translation Manager Plugin - OVQT Plugin +// Copyright (C) 2011 Emanuel Costea +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef TRANSLATION_MANAGER_EDITOR_H +#define TRANSLATION_MANAGER_EDITOR_H + +#include +#include +#include +#include +#include +#include + +namespace TranslationManager +{ + +class CEditor : public QMdiSubWindow +{ + Q_OBJECT + +public: + CEditor(QMdiArea *parent) : QMdiSubWindow(parent) {} + CEditor() : QMdiSubWindow() {} + virtual void open(QString filename) =0; + virtual void save() =0; + virtual void saveAs(QString filename) =0; + virtual void activateWindow() =0; + + int eType() + { + return editor_type; + } + QString subWindowFilePath() + { + return current_file; + } + void setUndoStack(QUndoStack *stack) + { + current_stack = stack; + } + void setCurrentFile(QString filename) + { + QFileInfo *file = new QFileInfo(filename); + current_file = file->canonicalFilePath(); + setWindowModified(false); + setWindowTitle(file->fileName() + "[*]"); + setWindowFilePath(current_file); + } + +protected: + QUndoStack *current_stack; + QString current_file; + int editor_type; +}; + +} + +#endif /* TRANSLATION_MANAGER_EDITOR_H */ \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_main_window.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_main_window.cpp new file mode 100644 index 000000000..46a0dd99f --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_main_window.cpp @@ -0,0 +1,654 @@ +// Translation Manager Plugin - OVQT Plugin +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Emanuel Costea +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Plugin includes +#include "translation_manager_main_window.h" +#include "translation_manager_constants.h" +#include "ftp_selection.h" + +// Core includes +#include "../core/icore.h" +#include "../core/core_constants.h" +#include "../core/menu_manager.h" +#include "../../extension_system/iplugin_spec.h" + +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace TranslationManager +{ + +CMainWindow::CMainWindow(QWidget *parent) + : QMainWindow(parent) +{ + _ui.setupUi(this); + + _ui.mdiArea->closeAllSubWindows(); + windowMapper = new QSignalMapper(this); + connect(windowMapper, SIGNAL(mapped(QWidget *)), this, SLOT(setActiveSubWindow(QWidget *))); + + initialize_settings["georges"] = false; + initialize_settings["ligo"] = false; + + connect(Core::ICore::instance(), SIGNAL(changeSettings()), this, SLOT(readSettings())); + readSettings(); + createToolbar(); + m_undoStack = new QUndoStack(this); + +} + +// Functions that will insert the plugin buttons +void CMainWindow::createToolbar() +{ + // File menu + openAct = new QAction(QIcon(Core::Constants::ICON_OPEN), "&Open file(s)...", this); + _ui.toolBar->addAction(openAct); + connect(openAct, SIGNAL(triggered()), this, SLOT(open())); + saveAct = new QAction(QIcon(Core::Constants::ICON_SAVE), "&Save...", this); + _ui.toolBar->addAction(saveAct); + connect(saveAct, SIGNAL(triggered()), this, SLOT(save())); + saveAsAct = new QAction(QIcon(Core::Constants::ICON_SAVE_AS), "&Save as...", this); + _ui.toolBar->addAction(saveAsAct); + connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs())); + + // Tools menu + QMenu *wordsExtractionMenu = new QMenu("&Words extraction..."); + wordsExtractionMenu->setIcon(QIcon(Core::Constants::ICON_SETTINGS)); + _ui.toolBar->addAction(wordsExtractionMenu->menuAction()); + + // extract bot names + QAction *extractBotNamesAct = wordsExtractionMenu->addAction("&Extract bot names..."); + extractBotNamesAct->setStatusTip(tr("Extract bot names from primitives.")); + connect(extractBotNamesAct, SIGNAL(triggered()), this, SLOT(extractBotNames())); + + // Words extraction + QSignalMapper *wordsExtractionMapper = new QSignalMapper(this); + connect(wordsExtractionMapper, SIGNAL(mapped(QString)), this, SLOT(extractWords(QString))); + // extract item words + + QAction *extractItemWordsAct = wordsExtractionMenu->addAction("&Extract item words..."); + extractItemWordsAct->setStatusTip(tr("Extract item words")); + connect(extractItemWordsAct, SIGNAL(triggered()), wordsExtractionMapper, SLOT(map())); + wordsExtractionMapper->setMapping(extractItemWordsAct, QString(Constants::WK_ITEM)); + + // extract creature words + QAction *extractCreatureWordsAct = wordsExtractionMenu->addAction(tr("&Extract creature words...")); + extractCreatureWordsAct->setStatusTip(tr("Extract creature words")); + connect(extractCreatureWordsAct, SIGNAL(triggered()), wordsExtractionMapper, SLOT(map())); + wordsExtractionMapper->setMapping(extractCreatureWordsAct, QString(Constants::WK_CREATURE)); + + // extract sbrick words + QAction *extractSbrickWordsAct = wordsExtractionMenu->addAction("&Extract sbrick words..."); + extractSbrickWordsAct->setStatusTip(tr("Extract sbrick words")); + connect(extractSbrickWordsAct, SIGNAL(triggered()), wordsExtractionMapper, SLOT(map())); + wordsExtractionMapper->setMapping(extractSbrickWordsAct, QString(Constants::WK_SBRICK)); + + // extract sphrase words + QAction *extractSphraseWordsAct = wordsExtractionMenu->addAction("&Extract sphrase words..."); + extractSphraseWordsAct->setStatusTip(tr("Extract sphrase words")); + connect(extractSphraseWordsAct, SIGNAL(triggered()), wordsExtractionMapper, SLOT(map())); + wordsExtractionMapper->setMapping(extractSphraseWordsAct, QString(Constants::WK_SPHRASE)); + + // extract place and region names + QAction *extractPlaceNamesAct = wordsExtractionMenu->addAction("&Extract place names..."); + extractPlaceNamesAct->setStatusTip(tr("Extract place names from primitives")); + connect(extractPlaceNamesAct, SIGNAL(triggered()), wordsExtractionMapper, SLOT(map())); + wordsExtractionMapper->setMapping(extractPlaceNamesAct, QString(Constants::WK_PLACE)); + + // Merge options + QAction *mergeSingleFileAct = wordsExtractionMenu->addAction("&Merge worksheet file..."); + mergeSingleFileAct->setStatusTip(tr("Merge worksheet file from local or remote directory")); + connect(mergeSingleFileAct, SIGNAL(triggered()), this, SLOT(mergeSingleFile())); + + // Windows menu + Core::ICore *core = Core::ICore::instance(); + Core::MenuManager *menuManager = core->menuManager(); + windowMenu = menuManager->menuBar()->addMenu("Window"); + updateWindowsList(); + connect(windowMenu, SIGNAL(aboutToShow()), this, SLOT(updateWindowsList())); + + // Undo, Redo actions + QAction *undoAction = menuManager->action(Core::Constants::UNDO); + if (undoAction != 0) + _ui.toolBar->addAction(undoAction); + + QAction *redoAction = menuManager->action(Core::Constants::REDO); + if (redoAction != 0) + _ui.toolBar->addAction(redoAction); +} + +// Update the toolbar if the editor is worksheet +void CMainWindow::updateToolbar(QMdiSubWindow *window) +{ + if(_ui.mdiArea->subWindowList().size() > 0) + if(QString(window->widget()->metaObject()->className()) == "QTableWidget") // Sheet Editor + { + QAction *insertRowAct = new QAction(tr("Insert new row"), this); + connect(insertRowAct, SIGNAL(triggered()), window, SLOT(insertRow())); + windowMenu->addAction(insertRowAct); + QAction *deleteRowAct = new QAction(tr("Delete row"), this); + connect(deleteRowAct, SIGNAL(triggered()), window, SLOT(deleteRow())); + windowMenu->addAction(deleteRowAct); + } +} + +// Set the active subwindow +void CMainWindow::setActiveSubWindow(QWidget *window) +{ + if (!window) + return; + + QMdiSubWindow *mdiWindow = qobject_cast(window); + if (mdiWindow != 0) + _ui.mdiArea->setActiveSubWindow(mdiWindow); +} + +// Functions for updating the windows list +void CMainWindow::updateWindowsList() +{ + if(_ui.mdiArea->activeSubWindow()) + { + windowMenu->clear(); + QMdiSubWindow *current_window = _ui.mdiArea->activeSubWindow(); + QList subWindows = _ui.mdiArea->subWindowList(); + + updateToolbar(current_window); + + for(int i = 0; i < subWindows.size(); ++i) + { + QString window_file = QFileInfo(subWindows.at(i)->windowFilePath()).fileName(); + QString action_text; + if (i < 9) + { + action_text = QString("&%1 %2").arg(i + 1).arg(window_file); + } + else + { + action_text = QString("%1 %2").arg(i + 1).arg(window_file); + } + QAction *action = new QAction(action_text, this); + action->setCheckable(true); + action->setChecked(subWindows.at(i) == current_window); + connect(action, SIGNAL(triggered()), windowMapper, SLOT(map())); + windowMenu->addAction(action); + windowMapper->setMapping(action, subWindows.at(i)); + } + } + else + { + windowMenu->clear(); + } +} + +// Open signal +void CMainWindow::open() +{ + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup("translationmanager"); + QString lastOpenLocation = settings->value("lastOpenLocation").toString(); + QString file_name = QFileDialog::getOpenFileName(this, tr("Open translation file"), lastOpenLocation, tr("Translation files (*txt)")); + QFileInfo *file_info = new QFileInfo(file_name); + settings->setValue("lastOpenLocation", file_info->absolutePath()); + settings->endGroup(); + + if(!file_name.isEmpty()) + { + CEditor *editor = getEditorByWindowFilePath(file_name); + if(editor != NULL) + { + editor->activateWindow(); + return; + } + QApplication::setOverrideCursor(Qt::WaitCursor); + + // sheet editor + if(isWorksheetEditor(file_name)) + { + CEditorWorksheet *new_window = new CEditorWorksheet(_ui.mdiArea); + new_window->setUndoStack(m_undoStack); + new_window->open(file_name); + new_window->activateWindow(); + } + // phrase editor + if(isPhraseEditor(file_name)) + { + CEditorPhrase *new_window = new CEditorPhrase(_ui.mdiArea); + new_window->setUndoStack(m_undoStack); + new_window->open(file_name); + new_window->activateWindow(); + } + QApplication::restoreOverrideCursor(); + } +} + +// Open a work file. You can set the directory for work file in the settings dialog +void CMainWindow::openWorkFile(QString file) +{ + QFileInfo *file_path = new QFileInfo(QString("%1/%2").arg(work_path).arg(file)); + if(file_path->exists()) + { + if(isWorksheetEditor(file_path->filePath())) + { + CEditorWorksheet *new_window = new CEditorWorksheet(_ui.mdiArea); + new_window->open(file_path->filePath()); + new_window->activateWindow(); + } + } + else + { + QErrorMessage error; + error.showMessage(tr("The %1 file don't exists.").arg(file_path->fileName())); + error.exec(); + } +} + +void CMainWindow::save() +{ + if(_ui.mdiArea->subWindowList().size() > 0) + { + CEditor *current_window = qobject_cast(_ui.mdiArea->currentSubWindow()); + QApplication::setOverrideCursor(Qt::WaitCursor); + current_window->save(); + QApplication::restoreOverrideCursor(); + } +} + +void CMainWindow::saveAs() +{ + QString file_name; + if (_ui.mdiArea->isActiveWindow()) + { + file_name = QFileDialog::getSaveFileName(this); + } + if (!file_name.isEmpty()) + { + CEditor *current_window = qobject_cast(_ui.mdiArea->currentSubWindow()); + QApplication::setOverrideCursor(Qt::WaitCursor); + current_window->saveAs(file_name); + QApplication::restoreOverrideCursor(); + } +} + +// This function is needed by extraction. +void CMainWindow::initializeSettings(bool georges = false) +{ + if(georges == true && initialize_settings["georges"] == false) + { + NLMISC::CPath::addSearchPath(level_design_path.toStdString() + "/DFN", true, false); + NLMISC::CPath::addSearchPath(level_design_path.toStdString() + "/Game_elem/Creature", true, false); + initialize_settings["georges"] = true; + } + + if(initialize_settings["ligo"] == false) + { + try + { + // Search path of file world_editor_classes.xml + std::string ligoPath = NLMISC::CPath::lookup("world_editor_classes.xml"); + // Init LIGO + ligoConfig.readPrimitiveClass(ligoPath.c_str(), true); + NLLIGO::Register(); + NLLIGO::CPrimitiveContext::instance().CurrentLigoConfig = &ligoConfig; + initialize_settings["ligo"] = true; + } + catch (NLMISC::Exception &e) + { + nlerror("Can't found path to world_editor_classes.xml"); + } + } +} + +// Extracting words +void CMainWindow::extractWords(QString typeq) +{ + if(verifySettings() == true) + { + CEditorWorksheet *editor_window = getEditorByWorksheetType(typeq); + if(editor_window != NULL) + { + editor_window->activateWindow(); + QString file_path = editor_window->windowFilePath(); + } + else + { + openWorkFile(typeq); + editor_window = getEditorByWorksheetType(typeq); + if(editor_window != NULL) + { + editor_window->activateWindow(); + QString file_path = editor_window->windowFilePath(); + } + else return; + } + + QString column_name; + // Sheet extraction + CSheetWordListBuilder builderS; + // Primitives extraction + CRegionPrimWordListBuilder builderP; + bool isSheet = false; + if(typeq.toAscii() == Constants::WK_ITEM) + { + column_name = "item ID"; + builderS.SheetExt = "sitem"; + builderS.SheetPath = level_design_path.append("/game_element/sitem").toStdString(); + isSheet = true; + } + else if(typeq.toAscii() == Constants::WK_CREATURE) + { + column_name = "creature ID"; + builderS.SheetExt = "creature"; + builderS.SheetPath = level_design_path.append("/Game_elem/Creature/fauna").toStdString(); + isSheet = true; + } + else if(typeq.toAscii() == Constants::WK_SBRICK) + { + column_name = "sbrick ID"; + builderS.SheetExt = "sbrick"; + builderS.SheetPath = level_design_path.append("/game_element/sbrick").toStdString(); + isSheet = true; + } + else if(typeq.toAscii() == Constants::WK_SPHRASE) + { + column_name = "sphrase ID"; + builderS.SheetExt = "sphrase"; + builderS.SheetPath = level_design_path.append("/game_element/sphrase").toStdString(); + isSheet = true; + } + else if(typeq.toAscii() == Constants::WK_PLACE) + { + column_name = "placeId"; + builderP.PrimPath = primitives_path.toStdString(); + builderP.PrimFilter.push_back("region_*.primitive"); + builderP.PrimFilter.push_back("indoors_*.primitive"); + isSheet = false; + } + QApplication::setOverrideCursor(Qt::WaitCursor); + if(isSheet) + { + editor_window->extractWords(editor_window->windowFilePath(), column_name, builderS); + } + else + { + initializeSettings(false); + editor_window->extractWords(editor_window->windowFilePath(), column_name, builderP); + } + QApplication::restoreOverrideCursor(); + } +} + +// Extract bot names from primitives +void CMainWindow::extractBotNames() +{ + if(verifySettings() == true) + { + CEditorWorksheet *editor_window = getEditorByWorksheetType(NULL); + if(editor_window != NULL) + { + editor_window->activateWindow(); + QString file_path = editor_window->windowFilePath(); + } + else + { + openWorkFile(Constants::WK_BOTNAMES); + editor_window = getEditorByWorksheetType(NULL); + if(editor_window != NULL) + { + editor_window->activateWindow(); + QString file_path = editor_window->windowFilePath(); + } + else return; + } + + QApplication::setOverrideCursor(Qt::WaitCursor); + initializeSettings(true); + editor_window->extractBotNames(convertQStringList(filters), level_design_path.toStdString(), ligoConfig); + QApplication::restoreOverrideCursor(); + } +} + +// Merge the content for 2 worksheet files +void CMainWindow::mergeSingleFile() +{ + CEditor *editor_window = qobject_cast(_ui.mdiArea->currentSubWindow()); + CSourceDialog *dialog = new CSourceDialog(this); + CFtpSelection *ftp_dialog; + map methods; + QString file_name; + + if (_ui.mdiArea->subWindowList().size() == 0) + { + QErrorMessage error; + error.showMessage(tr("Open a work file in editor for merge operation.")); + error.exec(); + return; + } + + if(editor_window->eType() != Constants::ED_SHEET) // Sheet Editor + { + QErrorMessage error; + error.showMessage(tr("Please open or activate the window with a sheet file.")); + error.exec(); + return; + } + + // create items + QListWidgetItem *local_item = new QListWidgetItem(); + local_item->setText("Local directory"); + methods[local_item] = 0; + QListWidgetItem *ftp_item = new QListWidgetItem(); + ftp_item->setText("From a FTP server"); + methods[ftp_item] = 1; + + dialog->setSourceOptions(methods); + dialog->show(); + dialog->exec(); + // get the file for merge + if(dialog->selected_item == local_item) // Local directory + { + file_name = QFileDialog::getOpenFileName(this); + } + else if(dialog->selected_item == ftp_item) // Ftp directory + { + CFtpSelection *ftp_dialog = new CFtpSelection(this); + ftp_dialog->show(); + + if(ftp_dialog->exec() && ftp_dialog->status == true) + file_name = ftp_dialog->file->fileName(); + + delete ftp_dialog; + } + else + return; + + // Make sure we retrieved a file name + if(file_name.isEmpty()) + return; + + editor_window->activateWindow(); + CEditorWorksheet *current_window = qobject_cast(editor_window); + if(current_window->windowFilePath() == file_name) + return; + if(current_window->compareWorksheetFile(file_name)) + { + current_window->mergeWorksheetFile(file_name); + } + else + { + QErrorMessage error; + error.showMessage(tr("The file: %1 has different columns from the current file in editor.").arg(file_name)); + error.exec(); + } + if(dialog->selected_item == ftp_item) + { + /* + // TODO: uninit ftp_dialog????? + if(!ftp_dialog->file->remove()) + { + QErrorMessage error; + error.showMessage(tr("Please remove the file from ftp server manually. The file is located on the same directory with OVQT application.")); + error.exec(); + } + */ + } +} + +// Read the settings from QSettings +void CMainWindow::readSettings() +{ + QSettings *settings = Core::ICore::instance()->settings(); + // translation manager settings + settings->beginGroup("translationmanager"); + filters = settings->value("filters").toStringList(); + languages = settings->value("trlanguages").toStringList(); + translation_path = settings->value("translation").toString(); + work_path = settings->value("work").toString(); + settings->endGroup(); + // core settings + settings->beginGroup(Core::Constants::DATA_PATH_SECTION); + level_design_path = settings->value(Core::Constants::LEVELDESIGN_PATH).toString(); + primitives_path = QString(Core::Constants::PRIMITIVES_PATH); //TODO + settings->endGroup(); +} + +// Verify the settings +bool CMainWindow::verifySettings() +{ + bool count_errors = false; + + if(level_design_path.isNull() || primitives_path.isNull() || work_path.isNull()) + { + QErrorMessage error_settings; + error_settings.showMessage(tr("Please write all the paths on the settings dialog.")); + error_settings.exec(); + count_errors = true; + } + return !count_errors; +} + +bool CCoreListener::closeMainWindow() const +{ + bool okToClose = true; + Q_FOREACH(QMdiSubWindow *subWindow, m_MainWindow->_ui.mdiArea->subWindowList()) + { + CEditor *currentEditor = qobject_cast(subWindow); + if(subWindow->isWindowModified()) + { + QMessageBox msgBox; + msgBox.setIcon(QMessageBox::Question); + msgBox.setText(tr("The document has been modified ( %1 ).").arg(currentEditor->windowFilePath())); + msgBox.setInformativeText(tr("Do you want to save your changes?")); + msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); + msgBox.setDefaultButton(QMessageBox::Save); + int ret = msgBox.exec(); + if(ret == QMessageBox::Save) + { + currentEditor->save(); + } + else if(ret == QMessageBox::Cancel) + { + okToClose = false; + break; + } + } + } + return okToClose; +} + + +// Helper functions +CEditor *CMainWindow::getEditorByWindowFilePath(const QString &fileName) +{ + Q_FOREACH(QMdiSubWindow *subWindow, _ui.mdiArea->subWindowList()) + { + CEditor *currentEditor = qobject_cast(subWindow); + if(currentEditor->subWindowFilePath() == fileName) + return currentEditor; + } + return NULL; +} + +CEditorWorksheet *CMainWindow::getEditorByWorksheetType(const QString &type) +{ + Q_FOREACH(QMdiSubWindow *subWindow, _ui.mdiArea->subWindowList()) + { + CEditor *currentEditor = qobject_cast(subWindow); + if(currentEditor->eType() == Constants::ED_SHEET) + { + CEditorWorksheet *editor = qobject_cast(currentEditor); + if(type != NULL) + { + if(editor->isSheetTable(type)) + { + return editor; + } + } + else + { + if(editor->isBotNamesTable()) + { + return editor; + } + } + } + } + return NULL; +} + +std::list CMainWindow::convertQStringList(QStringList listq) +{ + std::list stdlist; + + Q_FOREACH(QString text, listq) + { + stdlist.push_back(text.toStdString()); + } + return stdlist; +} + +bool CMainWindow::isWorksheetEditor(QString filename) +{ + STRING_MANAGER::TWorksheet wk_file; + if(loadExcelSheet(filename.toStdString(), wk_file, true) == true) + { + if(wk_file.ColCount > 1) + return true; + } + return false; +} + +bool CMainWindow::isPhraseEditor(QString filename) +{ + vector phrases; + return readPhraseFile(filename.toStdString(), phrases, false); +} + +} /* namespace TranslationManager */ + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_main_window.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_main_window.h new file mode 100644 index 000000000..c67f282e0 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_main_window.h @@ -0,0 +1,129 @@ +// Translation Manager Plugin - OVQT Plugin +// Copyright (C) 2011 Emanuel Costea +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef MAIN_WINDOW_H +#define MAIN_WINDOW_H + +// Project includes +#include "ui_translation_manager_main_window.h" +#include "translation_manager_editor.h" +#include "source_selection.h" +#include "editor_worksheet.h" +#include "editor_phrase.h" + +// Project system includes +#include "../core/icore_listener.h" + +// Qt includes +#include +#include +#include +#include +#include +#include +#include +#include + +// STL includes +#include + +// Nel includes +#include "nel/misc/types_nl.h" +#include "nel/misc/sheet_id.h" +#include "nel/misc/path.h" +#include "nel/misc/diff_tool.h" +#include "nel/ligo/ligo_config.h" + +using namespace std; + +namespace TranslationManager +{ + +class CMainWindow : public QMainWindow +{ + Q_OBJECT + +public: + CMainWindow(QWidget *parent = 0); + virtual ~CMainWindow() {} + QUndoStack *m_undoStack; + +public: + Ui::CMainWindow _ui; + +private: + // actions + QAction *openAct; + QAction *saveAct; + QAction *saveAsAct; + QMenu *windowMenu; + QSignalMapper *windowMapper; + // config + QMap initialize_settings; + QList filters; + QList languages; + QString level_design_path; + QString primitives_path; + QString translation_path; + QString work_path; + NLLIGO::CLigoConfig ligoConfig; + +private Q_SLOTS: + void extractBotNames(); + void extractWords(QString typeq); + void open(); + void save(); + void saveAs(); + void setActiveSubWindow(QWidget *window); + void updateWindowsList(); + void mergeSingleFile(); + +private: + void openWorkFile(QString file); + void updateToolbar(QMdiSubWindow *window); + bool verifySettings(); + void readSettings(); + void createMenus(); + void createToolbar(); + void initializeSettings(bool georges); + std::list convertQStringList(QStringList listq); + CEditor *getEditorByWindowFilePath(const QString &fileName); + // Worksheet specific functions + CEditorWorksheet *getEditorByWorksheetType(const QString &type); + bool isWorksheetEditor(QString filename); + bool isPhraseEditor(QString filename); +}; + +class CCoreListener : public Core::ICoreListener +{ + Q_OBJECT + +public: + CCoreListener(CMainWindow *mainWindow, QObject *parent = 0): ICoreListener(parent) + { + m_MainWindow = mainWindow; + } + + virtual ~CCoreListener() {} + virtual bool closeMainWindow() const; + +public: + CMainWindow *m_MainWindow; +}; + +} // namespace TranslationManager + +#endif diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_main_window.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_main_window.ui new file mode 100644 index 000000000..6f2cd2815 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_main_window.ui @@ -0,0 +1,48 @@ + + + CMainWindow + + + + 0 + 0 + 883 + 576 + + + + MainWindow + + + + + + + + + QMdiArea::TabbedView + + + true + + + + + + + + + + toolBar + + + TopToolBarArea + + + false + + + + + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_plugin.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_plugin.cpp new file mode 100644 index 000000000..03aa06c87 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_plugin.cpp @@ -0,0 +1,89 @@ +// Translation Manager Plugin - OVQT Plugin +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Emanuel Costea +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Project includes +#include "translation_manager_plugin.h" +#include "translation_manager_settings_page.h" +#include "translation_manager_main_window.h" + +// Core includes +#include "../core/icore.h" +#include "../core/core_constants.h" +#include "../core/menu_manager.h" +#include "../../extension_system/iplugin_spec.h" + +// NeL includes +#include "nel/misc/debug.h" + +// Qt includes +#include +#include +#include +#include +#include +#include +#include + +namespace TranslationManager +{ +TranslationManagerPlugin::~TranslationManagerPlugin() +{ + Q_FOREACH(QObject *obj, _autoReleaseObjects) + { + _plugMan->removeObject(obj); + } + qDeleteAll(_autoReleaseObjects); + _autoReleaseObjects.clear(); +} + +bool TranslationManagerPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString) +{ + Q_UNUSED(errorString); + _plugMan = pluginManager; + // create the mainwindow + CMainWindow *mainWindow = new CMainWindow(); + + addAutoReleasedObject(new CTranslationManagerSettingsPage(this)); + addAutoReleasedObject(new CTranslationManagerContext(mainWindow, this)); + addAutoReleasedObject(new CCoreListener(mainWindow, this)); + + return true; +} + +void TranslationManagerPlugin::extensionsInitialized() +{ +} + +void TranslationManagerPlugin::setNelContext(NLMISC::INelContext *nelContext) +{ +#ifdef NL_OS_WINDOWS + // Ensure that a context doesn't exist yet. + // This only applies to platforms without PIC, e.g. Windows. + nlassert(!NLMISC::INelContext::isContextInitialised()); +#endif // NL_OS_WINDOWS + _LibContext = new NLMISC::CLibraryContext(*nelContext); +} + +void TranslationManagerPlugin::addAutoReleasedObject(QObject *obj) +{ + _plugMan->addObject(obj); + _autoReleaseObjects.prepend(obj); +} + +} + +Q_EXPORT_PLUGIN(TranslationManager::TranslationManagerPlugin) \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_plugin.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_plugin.h new file mode 100644 index 000000000..fb03a49f1 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_plugin.h @@ -0,0 +1,113 @@ +// Translation Manager Plugin - OVQT Plugin +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Emanuel Costea +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef TRANSLATION_MANAGER_PLUGIN_H +#define TRANSLATION_MANAGER_PLUGIN_H + +// Project includes +#include "../../extension_system/iplugin.h" +#include "../core/icontext.h" +#include "translation_manager_main_window.h" + +// NeL includes +#include "nel/misc/app_context.h" + +// Qt includes +#include +#include + +using namespace std; + +namespace NLMISC +{ +class CLibraryContext; +} + +namespace ExtensionSystem +{ +class IPluginSpec; +} + +namespace TranslationManager +{ + +class CTranslationManagerContext; + +class TranslationManagerPlugin : public QObject, public ExtensionSystem::IPlugin +{ + Q_OBJECT + Q_INTERFACES(ExtensionSystem::IPlugin) +public: + virtual ~TranslationManagerPlugin(); + + bool initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString); + void extensionsInitialized(); + + void setNelContext(NLMISC::INelContext *nelContext); + void addAutoReleasedObject(QObject *obj); + +protected: + NLMISC::CLibraryContext *_LibContext; + +private: + ExtensionSystem::IPluginManager *_plugMan; + QList _autoReleaseObjects; +}; + +class CTranslationManagerContext: public Core::IContext +{ + Q_OBJECT + +public: + CTranslationManagerContext(CMainWindow *mainWindow, QObject *parent = 0): IContext(parent) + { + m_MainWindow = mainWindow; + } + + virtual ~CTranslationManagerContext() {} + + virtual QString id() const + { + return QLatin1String("TranslationManagerContext"); + } + virtual QString trName() const + { + return tr("Translation Manager"); + } + virtual QIcon icon() const + { + return QIcon(); + } + virtual QWidget *widget() + { + return m_MainWindow; + } + virtual QUndoStack *undoStack() + { + return m_MainWindow->m_undoStack; + } + virtual void open() + { + + } + + CMainWindow *m_MainWindow; +}; + +} + +#endif // TRANSLATION_MANAGER_PLUGIN_H \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_settings_page.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_settings_page.cpp new file mode 100644 index 000000000..e3dbd92df --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_settings_page.cpp @@ -0,0 +1,203 @@ +// Translation Manager Plugin - OVQT Plugin +// Copyright (C) 2011 Emanuel Costea +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#include "translation_manager_settings_page.h" + +// Core includes +#include "../core/icore.h" + +// Qt includes +#include +#include +#include +#include + +namespace TranslationManager +{ + +QString lastDir = "."; + +CTranslationManagerSettingsPage::CTranslationManagerSettingsPage(QObject *parent) + : IOptionsPage(parent), + _currentPage(NULL) +{ +} + +QString CTranslationManagerSettingsPage::id() const +{ + return QLatin1String("TranslationManagerPage"); +} + +QString CTranslationManagerSettingsPage::trName() const +{ + return tr("Translation Manager"); +} + +QString CTranslationManagerSettingsPage::category() const +{ + return QLatin1String("Translation Manager"); +} + +QString CTranslationManagerSettingsPage::trCategory() const +{ + return tr("Translation Manager"); +} + +QIcon CTranslationManagerSettingsPage::categoryIcon() const +{ + return QIcon(); +} + +QWidget *CTranslationManagerSettingsPage::createPage(QWidget *parent) +{ + _currentPage = new QWidget(parent); + _ui.setupUi(_currentPage); + readSettings(); + connect(_ui.filter_add, SIGNAL(clicked()), this, SLOT(filterAdd())); + connect(_ui.filter_del, SIGNAL(clicked()), this, SLOT(filterDel())); + connect(_ui.lang_add, SIGNAL(clicked()), this, SLOT(languageAdd())); + connect(_ui.lang_del, SIGNAL(clicked()), this, SLOT(languageDel())); + connect(_ui.translation_add, SIGNAL(clicked()), this, SLOT(translationAdd())); + connect(_ui.work_add, SIGNAL(clicked()), this, SLOT(workAdd())); + + return _currentPage; +} + +void CTranslationManagerSettingsPage::filterAdd() +{ + QString newValue = _ui.filter_edit->text(); + if (!newValue.isEmpty()) + { + QListWidgetItem *newItem = new QListWidgetItem; + newItem->setText(newValue); + newItem->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); + _ui.filter_list->addItem(newItem); + } +} + +void CTranslationManagerSettingsPage::filterDel() +{ + QListWidgetItem *removeItem = _ui.filter_list->takeItem(_ui.filter_list->currentRow()); + if (!removeItem) + delete removeItem; +} + +void CTranslationManagerSettingsPage::languageAdd() +{ + QString newValue = _ui.lang_edit->text(); + if (!newValue.isEmpty()) + { + QListWidgetItem *newItem = new QListWidgetItem; + newItem->setText(newValue); + newItem->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); + _ui.lang_list->addItem(newItem); + } +} + +void CTranslationManagerSettingsPage::languageDel() +{ + QListWidgetItem *removeItem = _ui.lang_list->takeItem(_ui.lang_list->currentRow()); + if (!removeItem) + delete removeItem; +} + +void CTranslationManagerSettingsPage::translationAdd() +{ + QString newPath = QFileDialog::getExistingDirectory(_currentPage, ""); + if (!newPath.isEmpty()) + { + _ui.translation_edit->setText(newPath); + } +} + +void CTranslationManagerSettingsPage::workAdd() +{ + QString newPath = QFileDialog::getExistingDirectory(_currentPage, ""); + if (!newPath.isEmpty()) + { + _ui.work_edit->setText(newPath); + } +} + +void CTranslationManagerSettingsPage::apply() +{ + writeSettings(); +} + +void CTranslationManagerSettingsPage::readSettings() +{ + QStringList filters, languages; + QString ligo, translation, work; + + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup("translationmanager"); + + filters = settings->value("filters").toStringList(); /* filters */ + languages = settings->value("trlanguages").toStringList(); /* languages */ + ligo = settings->value("ligo").toString(); + translation = settings->value("translation").toString(); + work = settings->value("work").toString(); + + settings->endGroup(); + // filter + Q_FOREACH(QString filter, filters) + { + QListWidgetItem *newItem = new QListWidgetItem; + newItem->setText(filter); + newItem->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); + _ui.filter_list->addItem(newItem); + } + // languages + Q_FOREACH(QString lang, languages) + { + QListWidgetItem *newItem = new QListWidgetItem; + newItem->setText(lang); + newItem->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); + _ui.lang_list->addItem(newItem); + } + // translation + _ui.translation_edit->setText(translation); + // work + _ui.work_edit->setText(work); + +} + +void CTranslationManagerSettingsPage::writeSettings() +{ + QStringList filters, languages; + QString ligo, translation, work; + // filters + for (int i = 0; i < _ui.filter_list->count(); ++i) + filters << _ui.filter_list->item(i)->text(); + // languages + for (int i = 0; i < _ui.lang_list->count(); ++i) + languages << _ui.lang_list->item(i)->text(); + // translations path + translation = _ui.translation_edit->text(); + // work path + work = _ui.work_edit->text(); + + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup("translationmanager"); + settings->setValue("filters", filters); + settings->setValue("trlanguages", languages); + settings->setValue("translation", translation); + settings->setValue("work", work); + settings->endGroup(); + settings->sync(); +} + +} \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_settings_page.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_settings_page.h new file mode 100644 index 000000000..9b34d87ba --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_settings_page.h @@ -0,0 +1,62 @@ +// Translation Manager Plugin - OVQT Plugin +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Emanuel Costea +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef TRANSLATION_MANAGER_SETTINGS_PAGE_H +#define TRANSLATION_MANAGER_SETTINGS_PAGE_H + +#include + +#include "../core/ioptions_page.h" + +#include "ui_translation_manager_settings_page.h" + +namespace TranslationManager +{ + +class CTranslationManagerSettingsPage : public Core::IOptionsPage +{ + Q_OBJECT +public: + CTranslationManagerSettingsPage(QObject *parent = 0); + virtual ~CTranslationManagerSettingsPage() {} + + virtual QString id() const; + virtual QString trName() const; + virtual QString category() const; + virtual QString trCategory() const; + virtual QIcon categoryIcon() const; + virtual QWidget *createPage(QWidget *parent); + + virtual void apply(); + virtual void finish() {} +private Q_SLOTS: + void filterAdd(); + void filterDel(); + void languageAdd(); + void languageDel(); + void translationAdd(); + void workAdd(); +private: + QWidget *_currentPage; + Ui::CTranslationManagerSettingsPage _ui; + void writeSettings(); + void readSettings(); +}; + +} + +#endif // TRANSLATION_MANAGER_SETTINGS_H \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_settings_page.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_settings_page.ui new file mode 100644 index 000000000..bd377b6b9 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/translation_manager_settings_page.ui @@ -0,0 +1,160 @@ + + + CTranslationManagerSettingsPage + + + + 0 + 0 + 589 + 490 + + + + Form + + + + + + Translation Manager Plugin + + + + + + + + Filters + + + + + + + + + + + + + + :/core/icons/ic_nel_add_item.png:/core/icons/ic_nel_add_item.png + + + true + + + + + + + + + + + :/core/icons/ic_nel_delete_item.png:/core/icons/ic_nel_delete_item.png + + + true + + + + + + + Languages + + + + + + + + + + + + + + :/core/icons/ic_nel_add_item.png:/core/icons/ic_nel_add_item.png + + + true + + + + + + + + + + + :/core/icons/ic_nel_delete_item.png:/core/icons/ic_nel_delete_item.png + + + true + + + + + + + + + + + + + + + + + Work directory + + + + + + + + + + ... + + + + + + + + + + + Translation directory + + + + + + + + + + ... + + + + + + + + + + + + + + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/ovqt_plugin_zone_painter.xml b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/ovqt_plugin_zone_painter.xml new file mode 100644 index 000000000..cf9e8afde --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/ovqt_plugin_zone_painter.xml @@ -0,0 +1,10 @@ + + ovqt_plugin_zone_painter + ZonePainter + 0.0 + Ryzom Core + Zone Painter Plugin + + + + \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.cpp index 01086f231..e0c2dab0c 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.cpp @@ -11,7 +11,7 @@ #include "painter_dock_widget.h" #include "../core/icore.h" -#include "../core/imenu_manager.h" +#include "../core/menu_manager.h" #include "../core/core_constants.h" ZonePainterMainWindow::ZonePainterMainWindow(QWidget *parent) : @@ -145,6 +145,7 @@ void ZonePainterMainWindow::loadConfig() { QColor color; color = settings->value("BackgroundColor", QColor(80, 80, 80)).value(); + settings->endGroup(); m_nelWidget->setBackgroundColor(NLMISC::CRGBA(color.red(), color.green(), color.blue(), color.alpha())); } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_model.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_model.cpp new file mode 100644 index 000000000..4ab93d62d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_model.cpp @@ -0,0 +1,40 @@ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Dzmitry Kamiahin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#include "zone_painter_model.h" + +// STL includes + +// Qt includes + +// NeL includes + +namespace Plugin +{ + +CZonePainterModel::CZonePainterModel() +{ + +} + +CZonePainterModel::~CZonePainterModel() +{ + +} + +} /* namespace Plugin */ + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_model.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_model.h new file mode 100644 index 000000000..259634b63 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_model.h @@ -0,0 +1,42 @@ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Dzmitry Kamiahin +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#ifndef ZONE_PAINTER_MODEL_H +#define ZONE_PAINTER_MODEL_H + +// NeL includes +#include +#include +#include + +// Qt includes + +namespace Plugin +{ + +class CZonePainterModel +{ +public: + CZonePainterModel(); + virtual ~CZonePainterModel(); + +}; /* class CZonePainterModel */ + +} /* namespace Plugin */ + + +#endif // ZONE_PAINTER_MODEL_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.cpp index 9ccfb9053..37222cef2 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.cpp @@ -3,7 +3,7 @@ #include "zone_painter_settings_page.h" #include "../core/icore.h" #include "../core/core_constants.h" -#include "../core/imenu_manager.h" +#include "../core/menu_manager.h" #include "../../extension_system/iplugin_spec.h" // NeL includes @@ -16,50 +16,58 @@ #include #include #include +#include namespace Plugin { - NLMISC_SAFE_SINGLETON_IMPL(CZoneManager) +// NLMISC_SAFE_SINGLETON_IMPL(CZoneManager) ZonePainterPlugin::~ZonePainterPlugin() { - Q_FOREACH(QObject *obj, _autoReleaseObjects) + Q_FOREACH(QObject *obj, m_autoReleaseObjects) { - _plugMan->removeObject(obj); + m_plugMan->removeObject(obj); } - qDeleteAll(_autoReleaseObjects); - _autoReleaseObjects.clear(); + qDeleteAll(m_autoReleaseObjects); + m_autoReleaseObjects.clear(); } bool ZonePainterPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString) { Q_UNUSED(errorString); - _plugMan = pluginManager; + m_plugMan = pluginManager; addAutoReleasedObject(new CZonePainterSettingsPage(this)); addAutoReleasedObject(new CZonePainterContext(this)); //addAutoReleasedObject(new CCoreListener(this)); + return true; } void ZonePainterPlugin::extensionsInitialized() { Core::ICore *core = Core::ICore::instance(); - Core::IMenuManager *menuManager = core->menuManager(); - //menuManager = _plugMan->getObject(); - QAction *exampleAction1 = new QAction("Zone1", this); - QAction *exampleAction2 = new QAction("Zone2", this); - QAction *aboutQtAction = menuManager->action(Core::Constants::ABOUT_QT); - QMenu *helpMenu = menuManager->menu(Core::Constants::M_HELP); - helpMenu->insertAction(aboutQtAction, exampleAction1); - helpMenu->addSeparator(); - helpMenu->addAction(exampleAction2); - QMenu *zoneMenu = menuManager->menuBar()->addMenu("ZoneMenu"); - zoneMenu->insertAction(aboutQtAction, exampleAction1); - zoneMenu->addSeparator(); - zoneMenu->addAction(exampleAction2); + Core::MenuManager *menuManager = core->menuManager(); + QAction *loadZoneAction = new QAction("Load Zone", this); + QAction *saveZoneAction = new QAction("Save Zone", this); + + QMenu *toolsMenu = menuManager->menu(Core::Constants::M_TOOLS); + QMenu *zoneMenu = toolsMenu->addMenu("Zone Painter"); + zoneMenu->addAction(loadZoneAction); + connect(loadZoneAction, SIGNAL(triggered()), this, SLOT(clickLoadZoneAction())); + zoneMenu->addAction(saveZoneAction); } +/****** SLOTS ******/ +void ZonePainterPlugin::clickLoadZoneAction() { + QString zoneFile = QFileDialog::getOpenFileName(NULL, tr("Open Zone File"), ".", tr("Zone Files (*.zone);;")); +} + +void ZonePainterPlugin::clickSaveZoneAction() { + +} +/****** END SLOTS ******/ + void ZonePainterPlugin::setNelContext(NLMISC::INelContext *nelContext) { #ifdef NL_OS_WINDOWS @@ -67,57 +75,13 @@ void ZonePainterPlugin::setNelContext(NLMISC::INelContext *nelContext) // This only applies to platforms without PIC, e.g. Windows. nlassert(!NLMISC::INelContext::isContextInitialised()); #endif // NL_OS_WINDOWS - _LibContext = new NLMISC::CLibraryContext(*nelContext); -} - -QString ZonePainterPlugin::name() const -{ - return "ZonePainterPlugin"; -} - -QString ZonePainterPlugin::version() const -{ - return "0.2"; -} - -QString ZonePainterPlugin::vendor() const -{ - return "Ryzom Core"; -} - -QString ZonePainterPlugin::description() const -{ - return "Zone Painter Plugin"; -} - -QStringList ZonePainterPlugin::dependencies() const -{ - QStringList list; - list.append(Core::Constants::OVQT_CORE_PLUGIN); - //list.append("ObjectViewer"); - return list; + m_LibContext = new NLMISC::CLibraryContext(*nelContext); } void ZonePainterPlugin::addAutoReleasedObject(QObject *obj) { - _plugMan->addObject(obj); - _autoReleaseObjects.prepend(obj); -} - -QObject* ZonePainterPlugin::objectByName(const QString &name) const -{ - Q_FOREACH (QObject *qobj, _plugMan->allObjects()) - if (qobj->objectName() == name) - return qobj; - return 0; -} - -ExtensionSystem::IPluginSpec *ZonePainterPlugin::pluginByName(const QString &name) const -{ - Q_FOREACH (ExtensionSystem::IPluginSpec *spec, _plugMan->plugins()) - if (spec->name() == name) - return spec; - return 0; + m_plugMan->addObject(obj); + m_autoReleaseObjects.prepend(obj); } } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.h index 2c1dff53e..a3def41ba 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_plugin.h @@ -31,7 +31,7 @@ class IPluginSpec; namespace Plugin { - class CZoneManager +/* class CZoneManager { NLMISC_SAFE_SINGLETON_DECL(CZoneManager) public: @@ -41,7 +41,7 @@ namespace Plugin NL3D::CLandscapeModel *m_painterLandscape; NL3D::CZone *m_currentZone; }; - +*/ class ZonePainterPlugin : public QObject, public ExtensionSystem::IPlugin { Q_OBJECT @@ -52,28 +52,21 @@ public: bool initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString); void extensionsInitialized(); - void setNelContext(NLMISC::INelContext *nelContext); - QString name() const; - QString version() const; - QString vendor() const; - QString description() const; - QStringList dependencies() const; - void addAutoReleasedObject(QObject *obj); - QObject *objectByName(const QString &name) const; - ExtensionSystem::IPluginSpec *pluginByName(const QString &name) const; - - - +public Q_SLOTS: + void clickLoadZoneAction(); + void clickSaveZoneAction(); protected: - NLMISC::CLibraryContext *_LibContext; + NLMISC::CLibraryContext *m_LibContext; private: - ExtensionSystem::IPluginManager *_plugMan; - QList _autoReleaseObjects; + ExtensionSystem::IPluginManager *m_plugMan; + QList m_autoReleaseObjects; + + NL3D::CLandscapeModel *m_Landscape; }; class CZonePainterContext: public Core::IContext diff --git a/code/nel/tools/3d/panoply_maker/Makefile.am b/code/nel/tools/3d/panoply_maker/Makefile.am deleted file mode 100644 index d821ed109..000000000 --- a/code/nel/tools/3d/panoply_maker/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2002/05/13 15:44:57 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = panoply.cfg \ - panoply_maker.dsp - -bin_PROGRAMS = panoply_maker - -panoply_maker_SOURCES = color_modifier.cpp hls_bank_texture_info.cpp \ - panoply_maker.cpp - -noinst_HEADERS = color_mask.h \ - color_modifier.h - -AM_CXXFLAGS = -I$(top_srcdir)/src - -panoply_maker_LDADD = ../../../src/misc/libnelmisc.la - - -# End of Makefile.am - diff --git a/code/nel/tools/3d/plugin_max/nel_export/DllEntry.cpp b/code/nel/tools/3d/plugin_max/nel_export/DllEntry.cpp index 61337b328..7e6ded529 100644 --- a/code/nel/tools/3d/plugin_max/nel_export/DllEntry.cpp +++ b/code/nel/tools/3d/plugin_max/nel_export/DllEntry.cpp @@ -19,7 +19,7 @@ #include "nel/3d/register_3d.h" #include "nel/misc/app_context.h" #include "../nel_3dsmax_shared/nel_3dsmax_shared.h" - +#include extern ClassDesc2* GetCNelExportDesc(); @@ -42,7 +42,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL,ULONG fdwReason,LPVOID lpvReserved) if (!controlsInit) { controlsInit = TRUE; +#if MAX_VERSION_MAJOR < 14 InitCustomControls(hInstance); // Initialize MAX's custom controls +#endif InitCommonControls(); // Initialize Win95 controls } diff --git a/code/nel/tools/3d/plugin_max/nel_export/nel_export_script.cpp b/code/nel/tools/3d/plugin_max/nel_export/nel_export_script.cpp index 9218e73ce..d26af56ca 100644 --- a/code/nel/tools/3d/plugin_max/nel_export/nel_export_script.cpp +++ b/code/nel/tools/3d/plugin_max/nel_export/nel_export_script.cpp @@ -16,7 +16,12 @@ #include "std_afx.h" #include "nel_export.h" -#include +#include +#if MAX_VERSION_MAJOR >= 14 +# include +#else +# include +#endif #include "../nel_mesh_lib/export_nel.h" #include "../nel_mesh_lib/export_appdata.h" diff --git a/code/nel/tools/3d/plugin_max/nel_export/std_afx.h b/code/nel/tools/3d/plugin_max/nel_export/std_afx.h index 326c0b9c1..7d0ef0b2a 100644 --- a/code/nel/tools/3d/plugin_max/nel_export/std_afx.h +++ b/code/nel/tools/3d/plugin_max/nel_export/std_afx.h @@ -26,16 +26,29 @@ #include #include #undef STRICT -#include -#include -#include -#include -#include -#include -#include -#include +#include +#if MAX_VERSION_MAJOR >= 14 +# include +# include +# include +# include +# include +# include +# include +# include +# include +#else +# include +# include +# include +# include +# include +# include +# include +# include +# include +#endif #include -#include #include #ifdef min #undef min diff --git a/code/nel/tools/3d/plugin_max/nel_mesh_lib/StdAfx.h b/code/nel/tools/3d/plugin_max/nel_mesh_lib/StdAfx.h index 65b65651e..b3626b896 100644 --- a/code/nel/tools/3d/plugin_max/nel_mesh_lib/StdAfx.h +++ b/code/nel/tools/3d/plugin_max/nel_mesh_lib/StdAfx.h @@ -32,7 +32,12 @@ #include #include #include -#include +#include +#if MAX_VERSION_MAJOR >= 14 +# include +#else +# include +#endif //#include // Character Studio SDK include diff --git a/code/nel/tools/3d/plugin_max/nel_mesh_lib/calc_lm.cpp b/code/nel/tools/3d/plugin_max/nel_mesh_lib/calc_lm.cpp index e65b4ea56..e4bc7006a 100644 --- a/code/nel/tools/3d/plugin_max/nel_mesh_lib/calc_lm.cpp +++ b/code/nel/tools/3d/plugin_max/nel_mesh_lib/calc_lm.cpp @@ -281,13 +281,21 @@ void SLightBuild::convertFromMaxLight (INode *node,TimeValue tvTime) } #if (MAX_RELEASE < 4000) - // Convert exclusion list - NameTab& ntExclu = maxLight->GetExclusionList(); - for( sint i = 0; i < ntExclu.Count(); ++i ) - { - string tmp = *ntExclu.Addr(i); - this->setExclusion.insert( tmp ); - } + // Convert exclusion list + NameTab& ntExclu = maxLight->GetExclusionList(); + for (sint i = 0; i < ntExclu.Count(); ++i) + { + string tmp = *ntExclu.Addr(i); + this->setExclusion.insert(tmp); + } +#else // (MAX_RELEASE < 4000) + ExclList& exclusionList = maxLight->GetExclusionList(); + for (sint i = 0; i < exclusionList.Count(); ++i) + { + INode *exclNode = exclusionList[i]; + string tmp = exclNode->GetName(); + this->setExclusion.insert(tmp); + } #endif // (MAX_RELEASE < 4000) // Get Soft Shadow informations @@ -1999,11 +2007,12 @@ void CExportNel::deleteLM(INode& ZeNode) sprintf( tmp, "%d", i ); sSaveName += tmp; sSaveName += ".tga"; - FILE *file; - if( file = fopen(sSaveName.c_str(),"rb") ) + if (CFile::fileExists(sSaveName)) { - fclose( file ); - DeleteFile( sSaveName.c_str() ); + if (!CFile::deleteFile(sSaveName)) + { + nlwarning("Failed to delete file %s.", sSaveName.c_str()); + } } } } @@ -2576,11 +2585,13 @@ bool CExportNel::calculateLM( CMesh::CMeshBuild *pZeMeshBuild, CMeshBase::CMeshB for (i = 0; i < 256; ++i) { string sLMName = sBaseName + NLMISC::toString(i) + ".tga"; - CIFile ifi; - if (ifi.open(sLMName)) + if (CFile::fileExists(sLMName)) { - ifi.close (); - DeleteFile (sLMName.c_str()); + nlinfo("DELETE %s", sLMName.c_str()); + if (!CFile::deleteFile(sLMName)) + { + nlwarning("Failed to delete file %s", sLMName.c_str()); + } } } } @@ -2598,6 +2609,7 @@ bool CExportNel::calculateLM( CMesh::CMeshBuild *pZeMeshBuild, CMeshBase::CMeshB COFile f( sSaveName ); try { + nlinfo("SAVE %s", sSaveName.c_str()); if (lmcEnabled) { // In fact the output is 32 bits because we need the alpha channel diff --git a/code/nel/tools/3d/plugin_max/nel_mesh_lib/export_misc.cpp b/code/nel/tools/3d/plugin_max/nel_mesh_lib/export_misc.cpp index 0b2426758..a03beb000 100644 --- a/code/nel/tools/3d/plugin_max/nel_mesh_lib/export_misc.cpp +++ b/code/nel/tools/3d/plugin_max/nel_mesh_lib/export_misc.cpp @@ -260,7 +260,11 @@ Control* CExportNel::getControlerByName (Animatable& node, const char* sName) if (strcmp (paramDef.int_name, sName)==0) { // ok, return this subanim +#if MAX_VERSION_MAJOR >= 14 + return param->GetControllerByID(id); +#else return param->GetController(id); +#endif } } } diff --git a/code/nel/tools/3d/plugin_max/nel_mesh_lib/export_particle_system.cpp b/code/nel/tools/3d/plugin_max/nel_mesh_lib/export_particle_system.cpp index 4c6b6bc8b..e3504b324 100644 --- a/code/nel/tools/3d/plugin_max/nel_mesh_lib/export_particle_system.cpp +++ b/code/nel/tools/3d/plugin_max/nel_mesh_lib/export_particle_system.cpp @@ -36,7 +36,7 @@ IShape* CExportNel::buildParticleSystem(INode& node, TimeValue time) // if not found, get from the APP_DATAS shapeName = CExportNel::getNelObjectName(node); if (shapeName.empty()) return NULL; - shapeName = NLMISC::CPath::lookup("shapeName", false); + shapeName = NLMISC::CPath::lookup(shapeName, false); if (shapeName.empty()) return NULL; } diff --git a/code/nel/tools/3d/plugin_max/nel_mesh_lib/export_scene.cpp b/code/nel/tools/3d/plugin_max/nel_mesh_lib/export_scene.cpp index 4e7edea8a..2d0268a74 100644 --- a/code/nel/tools/3d/plugin_max/nel_mesh_lib/export_scene.cpp +++ b/code/nel/tools/3d/plugin_max/nel_mesh_lib/export_scene.cpp @@ -24,6 +24,7 @@ #include "../nel_patch_lib/rpo.h" #include "../../ig_lighter_lib/ig_lighter_lib.h" +#include "nel/misc/path.h" #include "nel/3d/scene_group.h" #include "nel/3d/scene.h" #include "nel/3d/shape_bank.h" @@ -418,12 +419,21 @@ CInstanceGroup* CExportNel::buildInstanceGroup(const vector& vectNode, v if (clid.PartA() == NEL_PARTICLE_SYSTEM_CLASS_ID) { // build the shape from the file name - std::string objName = CExportNel::getNelObjectName(*pNode); - if (!objName.empty()) + // std::string objName = CExportNel::getNelObjectName(*pNode); + std::string psFilePath; + // try to get the complete path + if (!CExportNel::getValueByNameUsingParamBlock2(*pNode, "ps_file_name", (ParamType2) TYPE_STRING, &psFilePath, 0)) + { + // if not found, get from the APP_DATAS + psFilePath = CExportNel::getNelObjectName(*pNode); + if (!psFilePath.empty()) + psFilePath = CPath::lookup(psFilePath, false); + } + if (!psFilePath.empty()) { NL3D::CShapeStream ss; NLMISC::CIFile iF; - if (iF.open(objName.c_str())) + if (iF.open(psFilePath.c_str())) { try { diff --git a/code/nel/tools/3d/plugin_max/nel_mesh_lib/export_script.cpp b/code/nel/tools/3d/plugin_max/nel_mesh_lib/export_script.cpp index 6f1713683..7fd0ad150 100644 --- a/code/nel/tools/3d/plugin_max/nel_mesh_lib/export_script.cpp +++ b/code/nel/tools/3d/plugin_max/nel_mesh_lib/export_script.cpp @@ -15,8 +15,14 @@ // along with this program. If not, see . #include "stdafx.h" -#include -#include +#include +#if MAX_VERSION_MAJOR >= 14 +# include +# include +#else +# include +# include +#endif #include "export_nel.h" #include "export_appdata.h" diff --git a/code/nel/tools/3d/plugin_max/nel_patch_converter/DllEntry.cpp b/code/nel/tools/3d/plugin_max/nel_patch_converter/DllEntry.cpp index 22ae76790..50f249c31 100644 --- a/code/nel/tools/3d/plugin_max/nel_patch_converter/DllEntry.cpp +++ b/code/nel/tools/3d/plugin_max/nel_patch_converter/DllEntry.cpp @@ -20,6 +20,7 @@ #include "nel/misc/debug.h" #include "nel/misc/app_context.h" #include "../nel_3dsmax_shared/nel_3dsmax_shared.h" +#include extern ClassDesc2* GetPO2RPODesc(); extern ClassDesc* GetRPODesc(); @@ -58,7 +59,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL,ULONG fdwReason,LPVOID lpvReserved) { // This method has been deprecated. controlsInit = TRUE; +#if MAX_VERSION_MAJOR < 14 InitCustomControls(hInstance); // Initialize MAX's custom controls +#endif InitCommonControls(); // Initialize Win95 controls } return (TRUE); diff --git a/code/nel/tools/3d/plugin_max/nel_patch_converter/script.cpp b/code/nel/tools/3d/plugin_max/nel_patch_converter/script.cpp index b324c2cc6..8433e5001 100644 --- a/code/nel/tools/3d/plugin_max/nel_patch_converter/script.cpp +++ b/code/nel/tools/3d/plugin_max/nel_patch_converter/script.cpp @@ -22,24 +22,38 @@ #define _CRT_SECURE_NO_DEPRECATE #include -#include -#include -// Various MAX and MXS includes -#include -#include -#include -#include -#include -#include +#include +#if MAX_VERSION_MAJOR >= 14 +# include +# include +# include +# include +# include +# include +# include +# include +# include +#else +# include +# include +// Various MAX and MXS includes +# include +# include +# include +# include +# include +# include +// define the new primitives using macros from SDK +# include +#endif + #include #include #include #include -// define the new primitives using macros from SDK -#include #undef _CRT_SECURE_NO_DEPRECATE @@ -109,9 +123,9 @@ def_visible_primitive( set_tile_bank, "NelSetTileBank"); def_visible_primitive( export_zone, "ExportRykolZone"); def_visible_primitive( import_zone, "NeLImportZone"); -/* permettre l'acces à auto/manual intrior edges +/* permettre l'acces Eauto/manual intrior edges faire une methode pour interfacer la fonction compute interior edge -donner un acces à tiledmode/patchmode (on/off) +donner un acces Etiledmode/patchmode (on/off) faire un getselectedvertex faire un getselectedpatch faire un getselectedtile */ diff --git a/code/nel/tools/3d/plugin_max/nel_patch_edit/np_mods.cpp b/code/nel/tools/3d/plugin_max/nel_patch_edit/np_mods.cpp index c2696674a..8d7467a62 100644 --- a/code/nel/tools/3d/plugin_max/nel_patch_edit/np_mods.cpp +++ b/code/nel/tools/3d/plugin_max/nel_patch_edit/np_mods.cpp @@ -17,6 +17,8 @@ #include #include "../nel_3dsmax_shared/nel_3dsmax_shared.h" +#include + HINSTANCE hInstance; int controlsInit = FALSE; @@ -42,7 +44,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL,ULONG fdwReason,LPVOID lpvReserved) controlsInit = TRUE; // jaguar controls +#if MAX_VERSION_MAJOR < 14 InitCustomControls(hInstance); +#endif #ifdef OLD3DCONTROLS // initialize 3D controls diff --git a/code/nel/tools/3d/plugin_max/nel_patch_lib/rpo2nel.cpp b/code/nel/tools/3d/plugin_max/nel_patch_lib/rpo2nel.cpp index edf2f77e6..d99dc0f98 100644 --- a/code/nel/tools/3d/plugin_max/nel_patch_lib/rpo2nel.cpp +++ b/code/nel/tools/3d/plugin_max/nel_patch_lib/rpo2nel.cpp @@ -18,7 +18,12 @@ // For MAX_RELEASE #include -#include +#include +#if MAX_VERSION_MAJOR >= 14 +# include +#else +# include +#endif #include "rpo.h" #include "nel/3d/zone.h" diff --git a/code/nel/tools/3d/plugin_max/nel_patch_paint/DllEntry.cpp b/code/nel/tools/3d/plugin_max/nel_patch_paint/DllEntry.cpp index a3578a0bc..b4b79da80 100644 --- a/code/nel/tools/3d/plugin_max/nel_patch_paint/DllEntry.cpp +++ b/code/nel/tools/3d/plugin_max/nel_patch_paint/DllEntry.cpp @@ -3,6 +3,7 @@ #include "nel/misc/debug.h" #include "nel/misc/app_context.h" #include "../nel_3dsmax_shared/nel_3dsmax_shared.h" +#include HINSTANCE hInstance; int controlsInit = FALSE; @@ -26,7 +27,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL,ULONG fdwReason,LPVOID lpvReserved) controlsInit = TRUE; // jaguar controls +#if MAX_VERSION_MAJOR < 14 InitCustomControls(hInstance); +#endif #ifdef OLD3DCONTROLS // initialize 3D controls diff --git a/code/nel/tools/3d/plugin_max/nel_patch_paint/nel_patch_paint.h b/code/nel/tools/3d/plugin_max/nel_patch_paint/nel_patch_paint.h index 944807aca..3563b4712 100644 --- a/code/nel/tools/3d/plugin_max/nel_patch_paint/nel_patch_paint.h +++ b/code/nel/tools/3d/plugin_max/nel_patch_paint/nel_patch_paint.h @@ -3,7 +3,12 @@ #include "resource.h" #include -#include +#include +#if MAX_VERSION_MAJOR >= 14 +# include +#else +# include +#endif #include "namesel.h" #include "nsclip.h" #include "sbmtlapi.h" diff --git a/code/nel/tools/3d/plugin_max/nel_vertex_tree_paint/dllmain.cpp b/code/nel/tools/3d/plugin_max/nel_vertex_tree_paint/dllmain.cpp index 4dc068eea..1f04fe088 100644 --- a/code/nel/tools/3d/plugin_max/nel_vertex_tree_paint/dllmain.cpp +++ b/code/nel/tools/3d/plugin_max/nel_vertex_tree_paint/dllmain.cpp @@ -1,6 +1,6 @@ #include "vertex_tree_paint.h" #include "../nel_3dsmax_shared/nel_3dsmax_shared.h" - +#include HINSTANCE hInstance; @@ -18,7 +18,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL,ULONG fdwReason,LPVOID lpvReserved) switch (fdwReason) { case DLL_PROCESS_ATTACH: +#if MAX_VERSION_MAJOR < 14 InitCustomControls(hInstance); // Initialize MAX's custom controls +#endif InitCommonControls(); // Initialize Win95 controls break; } diff --git a/code/nel/tools/3d/plugin_max/tile_utility/DllEntry.cpp b/code/nel/tools/3d/plugin_max/tile_utility/DllEntry.cpp index d1c6c7d6b..26e2d14f8 100644 --- a/code/nel/tools/3d/plugin_max/tile_utility/DllEntry.cpp +++ b/code/nel/tools/3d/plugin_max/tile_utility/DllEntry.cpp @@ -20,6 +20,7 @@ #include "nel/misc/app_context.h" #include "../nel_3dsmax_shared/nel_3dsmax_shared.h" #include +#include extern ClassDesc2* GetTile_utilityDesc(); extern ClassDesc* GetRGBAddDesc(); @@ -46,7 +47,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL,ULONG fdwReason,LPVOID lpvReserved) if (!controlsInit) { controlsInit = TRUE; +#if MAX_VERSION_MAJOR < 14 InitCustomControls(hInstance); // Initialize MAX's custom controls +#endif InitCommonControls(); // Initialize Win95 controls } diff --git a/code/nel/tools/3d/zone_dependencies/Makefile.am b/code/nel/tools/3d/zone_dependencies/Makefile.am deleted file mode 100644 index 6563d9011..000000000 --- a/code/nel/tools/3d/zone_dependencies/Makefile.am +++ /dev/null @@ -1,22 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2002/05/13 15:44:57 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = zone_dependencies.dsp - -bin_PROGRAMS = zone_dependencies - -zone_dependencies_SOURCES = zone_dependencies.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src - -zone_dependencies_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/3d/libnel3d.la \ - ../../../src/georges/libnelgeorges.la \ - ../zone_lib/libzone.la - - -# End of Makefile.am - diff --git a/code/nel/tools/3d/zone_ig_lighter/Makefile.am b/code/nel/tools/3d/zone_ig_lighter/Makefile.am deleted file mode 100644 index 79d13da15..000000000 --- a/code/nel/tools/3d/zone_ig_lighter/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2002/05/13 15:44:57 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = zone_ig_lighter.dsp - -bin_PROGRAMS = zone_ig_lighter - -zone_ig_lighter_SOURCES = zone_ig_lighter.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src - -zone_ig_lighter_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/3d/libnel3d.la \ - ../zone_lib/libzone.la - - -# End of Makefile.am - diff --git a/code/nel/tools/3d/zone_lib/Makefile.am b/code/nel/tools/3d/zone_lib/Makefile.am deleted file mode 100644 index e3e6927a2..000000000 --- a/code/nel/tools/3d/zone_lib/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2002/05/13 15:44:57 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -noinst_LTLIBRARIES = libzone.la - -libzone_la_SOURCES = zone_utility.cpp - -noinst_HEADERS = zone_utility.h - -AM_CXXFLAGS = -I$(top_srcdir)/src - -libzone_la_LIBADD = ../../../src/misc/libnelmisc.la \ - ../../../src/3d/libnel3d.la - - -# End of Makefile.am - diff --git a/code/nel/tools/3d/zone_lighter/Makefile.am b/code/nel/tools/3d/zone_lighter/Makefile.am deleted file mode 100644 index 3d70c71b4..000000000 --- a/code/nel/tools/3d/zone_lighter/Makefile.am +++ /dev/null @@ -1,22 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2002/05/13 15:44:57 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = zone_lighter.dsp - -bin_PROGRAMS = zone_lighter - -zone_lighter_SOURCES = zone_lighter.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src - -zone_lighter_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/3d/libnel3d.la \ - ../../../src/georges/libnelgeorges.la \ - ../zone_lib/libzone.la - - -# End of Makefile.am - diff --git a/code/nel/tools/3d/zone_welder/Makefile.am b/code/nel/tools/3d/zone_welder/Makefile.am deleted file mode 100644 index c405a7fa5..000000000 --- a/code/nel/tools/3d/zone_welder/Makefile.am +++ /dev/null @@ -1,22 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2002/05/13 15:44:58 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = zwelder.cfg \ - zone_welder.dsp - -bin_PROGRAMS = zone_welder - -zone_welder_SOURCES = internal_weld.cpp zone_welder.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src - -zone_welder_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/3d/libnel3d.la \ - ../zone_lib/libzone.la - - -# End of Makefile.am - diff --git a/code/nel/tools/Makefile.am b/code/nel/tools/Makefile.am deleted file mode 100644 index 1dba72e96..000000000 --- a/code/nel/tools/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -# -# $Id: Makefile.am,v 1.2 2002/05/14 13:33:59 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -SUBDIRS = 3d misc pacs - - -# End of Makefile.am - diff --git a/code/nel/tools/build_gamedata/0_setup.py b/code/nel/tools/build_gamedata/0_setup.py index d921d03f4..1fe084407 100644 --- a/code/nel/tools/build_gamedata/0_setup.py +++ b/code/nel/tools/build_gamedata/0_setup.py @@ -24,9 +24,27 @@ # along with this program. If not, see . # -import time, sys, os, shutil, subprocess, distutils.dir_util +import time, sys, os, shutil, subprocess, distutils.dir_util, argparse sys.path.append("configuration") +parser = argparse.ArgumentParser(description='Ryzom Core - Build Gamedata - Setup') +parser.add_argument('--noconf', '-nc', action='store_true') +parser.add_argument('--noverify', '-nv', action='store_true') +# parser.add_argument('--haltonerror', '-eh', action='store_true') +parser.add_argument('--includeproject', '-ipj', nargs='+') +parser.add_argument('--excludeproject', '-epj', nargs='+') +parser.add_argument('--includeprocess', '-ipc', nargs='+') +parser.add_argument('--excludeprocess', '-epc', nargs='+') +args = parser.parse_args() + +if not args.includeproject == None and not args.excludeproject == None: + print "ERROR --includeproject cannot be combined with --excludeproject, exit." + exit() + +if not args.includeprocess == None and not args.excludeprocess == None: + print "ERROR --includeprocess cannot be combined with --excludeprocess, exit." + exit() + if os.path.isfile("log.log"): os.remove("log.log") log = open("log.log", "w") @@ -35,221 +53,225 @@ try: from buildsite import * except ImportError: printLog(log, "*** FIRST RUN ***") + if args.noconf: + printLog(log, "ERROR --noconf is invalid on first run, exit.") + exit() from tools import * -try: - BuildQuality -except NameError: - BuildQuality = 1 -try: - ToolDirectories -except NameError: - ToolDirectories = [ 'R:/code/nel', 'R:/code/ryzom/tools' ] -try: - ToolSuffix -except NameError: - ToolSuffix = "_r.exe" -try: - ScriptDirectory -except NameError: - ScriptDirectory = "R:/code/nel/tools/build_gamedata" -try: - WorkspaceDirectory -except NameError: - WorkspaceDirectory = "R:/code/ryzom/tools/build_gamedata/workspace" -try: - DatabaseDirectory -except NameError: - DatabaseDirectory = "W:/database" -try: - ExportBuildDirectory -except NameError: - ExportBuildDirectory = "W:/export" -try: - InstallDirectory -except NameError: - InstallDirectory = "W:/install" -try: - DataShardDirectory -except NameError: - DataShardDirectory = "R:/code/ryzom/server/data_shard" -try: - ClientDevDirectory -except NameError: - ClientDevDirectory = "W:/client_dev" -try: - ClientPatchDirectory -except NameError: - ClientPatchDirectory = "W:/client_patch" -try: - ClientInstallDirectory -except NameError: - ClientInstallDirectory = "W:/client_install" -try: - LeveldesignDirectory -except NameError: - LeveldesignDirectory = "L:/leveldesign" -try: - LeveldesignDfnDirectory -except NameError: - LeveldesignDfnDirectory = "L:/leveldesign/dfn" -try: - LeveldesignWorldDirectory -except NameError: - LeveldesignWorldDirectory = "L:/leveldesign/world" -try: - PrimitivesDirectory -except NameError: - PrimitivesDirectory = "L:/primitives" -try: - GamedevDirectory -except NameError: - GamedevDirectory = "R:/code/ryzom/client/data/gamedev" -try: - DataCommonDirectory -except NameError: - DataCommonDirectory = "R:/code/ryzom/common/data_common" -try: - WindowsExeDllCfgDirectories -except NameError: - WindowsExeDllCfgDirectories = [ 'C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/redist/x86', 'D:/source/external_local/bin/x86', 'D:/source/external_shared/bin/x86', 'R:/code/nel/lib', 'R:/code/ryzom/bin', 'R:/code/ryzom/client', 'R:/code/ryzom/tools/client/client_config/bin' ] -try: - MaxAvailable -except NameError: - MaxAvailable = 1 -try: - MaxDirectory -except NameError: - MaxDirectory = "C:/Program Files (x86)/Autodesk/3ds Max 2010" -try: - MaxUserDirectory -except NameError: - MaxUserDirectory = "C:/Users/Kaetemi/AppData/Local/Autodesk/3dsMax/2010 - 32bit/enu" -try: - MaxExecutable -except NameError: - MaxExecutable = "3dsmax.exe" +if not args.noconf: + try: + BuildQuality + except NameError: + BuildQuality = 1 + try: + ToolDirectories + except NameError: + ToolDirectories = [ 'R:/build/dev/bin/Release', 'D:/libraries/external/bin' ] + try: + ToolSuffix + except NameError: + ToolSuffix = ".exe" + try: + ScriptDirectory + except NameError: + ScriptDirectory = "R:/code/nel/tools/build_gamedata" + try: + WorkspaceDirectory + except NameError: + WorkspaceDirectory = "R:/code/ryzom/tools/build_gamedata/workspace" + try: + DatabaseDirectory + except NameError: + DatabaseDirectory = "W:/database" + try: + ExportBuildDirectory + except NameError: + ExportBuildDirectory = "W:/export" + try: + InstallDirectory + except NameError: + InstallDirectory = "W:/install" + try: + DataShardDirectory + except NameError: + DataShardDirectory = "R:/code/ryzom/server/data_shard" + try: + ClientDevDirectory + except NameError: + ClientDevDirectory = "W:/client_dev" + try: + ClientPatchDirectory + except NameError: + ClientPatchDirectory = "W:/client_patch" + try: + ClientInstallDirectory + except NameError: + ClientInstallDirectory = "W:/client_install" + try: + LeveldesignDirectory + except NameError: + LeveldesignDirectory = "L:/leveldesign" + try: + LeveldesignDfnDirectory + except NameError: + LeveldesignDfnDirectory = "L:/leveldesign/dfn" + try: + LeveldesignWorldDirectory + except NameError: + LeveldesignWorldDirectory = "L:/leveldesign/world" + try: + PrimitivesDirectory + except NameError: + PrimitivesDirectory = "L:/primitives" + try: + GamedevDirectory + except NameError: + GamedevDirectory = "R:/code/ryzom/client/data/gamedev" + try: + DataCommonDirectory + except NameError: + DataCommonDirectory = "R:/code/ryzom/common/data_common" + try: + WindowsExeDllCfgDirectories + except NameError: + WindowsExeDllCfgDirectories = [ 'C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/redist/x86', 'D:/libraries/external/bin', 'R:/build/dev/bin/Release', 'R:/code/ryzom/client', 'R:/code/nel/lib', 'R:/code/ryzom/bin', 'R:/code/ryzom/tools/client/client_config/bin' ] + try: + MaxAvailable + except NameError: + MaxAvailable = 1 + try: + MaxDirectory + except NameError: + MaxDirectory = "C:/Program Files (x86)/Autodesk/3ds Max 2010" + try: + MaxUserDirectory + except NameError: + MaxUserDirectory = "C:/Users/Kaetemi/AppData/Local/Autodesk/3dsMax/2010 - 32bit/enu" + try: + MaxExecutable + except NameError: + MaxExecutable = "3dsmax.exe" -printLog(log, "") -printLog(log, "-------") -printLog(log, "--- Setup build site") -printLog(log, "-------") -printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) -printLog(log, "") -printLog(log, "This script will set up the buildsite configuration, and create needed directories.") -printLog(log, "To use the defaults, simply hit ENTER, else type in the new value.") -printLog(log, "Use -- if you need to insert an empty value.") -printLog(log, "") -BuildQuality = int(askVar(log, "Build Quality", str(BuildQuality))) -ToolDirectories[0] = askVar(log, "Primary Tool Directory", ToolDirectories[0]).replace("\\", "/") -ToolDirectories[1] = askVar(log, "Secondary Tool Directory", ToolDirectories[1]).replace("\\", "/") -ToolSuffix = askVar(log, "Tool Suffix", ToolSuffix) -ScriptDirectory = askVar(log, "Script Directory", os.getcwd().replace("\\", "/")).replace("\\", "/") -WorkspaceDirectory = askVar(log, "Workspace Directory", WorkspaceDirectory).replace("\\", "/") -DatabaseDirectory = askVar(log, "Database Directory", DatabaseDirectory).replace("\\", "/") -ExportBuildDirectory = askVar(log, "Export Build Directory", ExportBuildDirectory).replace("\\", "/") -InstallDirectory = askVar(log, "Install Directory", InstallDirectory).replace("\\", "/") -DataShardDirectory = askVar(log, "Data Shard Directory", DataShardDirectory).replace("\\", "/") -ClientDevDirectory = askVar(log, "Client Dev Directory", ClientDevDirectory).replace("\\", "/") -ClientPatchDirectory = askVar(log, "Client Patch Directory", ClientPatchDirectory).replace("\\", "/") -ClientInstallDirectory = askVar(log, "Client Install Directory", ClientInstallDirectory).replace("\\", "/") -LeveldesignDirectory = askVar(log, "Leveldesign Directory", LeveldesignDirectory).replace("\\", "/") -LeveldesignDfnDirectory = askVar(log, "Leveldesign DFN Directory", LeveldesignDfnDirectory).replace("\\", "/") -LeveldesignWorldDirectory = askVar(log, "Leveldesign World Directory", LeveldesignWorldDirectory).replace("\\", "/") -PrimitivesDirectory = askVar(log, "Primitives Directory", PrimitivesDirectory).replace("\\", "/") -GamedevDirectory = askVar(log, "Gamedev Directory", GamedevDirectory).replace("\\", "/") -DataCommonDirectory = askVar(log, "Data Common Directory", DataCommonDirectory).replace("\\", "/") -WindowsExeDllCfgDirectories[0] = askVar(log, "Primary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[0]).replace("\\", "/") -WindowsExeDllCfgDirectories[1] = askVar(log, "Secondary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[1]).replace("\\", "/") -WindowsExeDllCfgDirectories[2] = askVar(log, "Tertiary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[2]).replace("\\", "/") -WindowsExeDllCfgDirectories[3] = askVar(log, "Quaternary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[3]).replace("\\", "/") -WindowsExeDllCfgDirectories[4] = askVar(log, "Quinary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[4]).replace("\\", "/") -WindowsExeDllCfgDirectories[5] = askVar(log, "Senary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[5]).replace("\\", "/") -WindowsExeDllCfgDirectories[6] = askVar(log, "Septenary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[6]).replace("\\", "/") -MaxAvailable = int(askVar(log, "3dsMax Available", str(MaxAvailable))) -if MaxAvailable: - MaxDirectory = askVar(log, "3dsMax Directory", MaxDirectory).replace("\\", "/") - MaxUserDirectory = askVar(log, "3dsMax User Directory", MaxUserDirectory).replace("\\", "/") - MaxExecutable = askVar(log, "3dsMax Executable", MaxExecutable) -if os.path.isfile("configuration/buildsite.py"): - os.remove("configuration/buildsite.py") -sf = open("configuration/buildsite.py", "w") -sf.write("#!/usr/bin/python\n") -sf.write("# \n") -sf.write("# \\file site.py\n") -sf.write("# \\brief Site configuration\n") -sf.write("# \\date " + time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "\n") -sf.write("# \\author Jan Boon (Kaetemi)\n") -sf.write("# Python port of game data build pipeline.\n") -sf.write("# Site configuration.\n") -sf.write("# \n") -sf.write("# NeL - MMORPG Framework \n") -sf.write("# Copyright (C) 2010 Winch Gate Property Limited\n") -sf.write("# \n") -sf.write("# This program is free software: you can redistribute it and/or modify\n") -sf.write("# it under the terms of the GNU Affero General Public License as\n") -sf.write("# published by the Free Software Foundation, either version 3 of the\n") -sf.write("# License, or (at your option) any later version.\n") -sf.write("# \n") -sf.write("# This program is distributed in the hope that it will be useful,\n") -sf.write("# but WITHOUT ANY WARRANTY; without even the implied warranty of\n") -sf.write("# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n") -sf.write("# GNU Affero General Public License for more details.\n") -sf.write("# \n") -sf.write("# You should have received a copy of the GNU Affero General Public License\n") -sf.write("# along with this program. If not, see .\n") -sf.write("# \n") -sf.write("\n") -sf.write("\n") -sf.write("# *** SITE INSTALLATION ***\n") -sf.write("\n") -sf.write("# Use '/' in path name, not '\'\n") -sf.write("# Don't put '/' at the end of a directory name\n") -sf.write("\n") -sf.write("\n") -sf.write("# Quality option for this site (1 for BEST, 0 for DRAFT)\n") -sf.write("BuildQuality = " + str(BuildQuality) + "\n") -sf.write("\n") -sf.write("ToolDirectories = " + str(ToolDirectories) + "\n") -sf.write("ToolSuffix = \"" + str(ToolSuffix) + "\"\n") -sf.write("\n") -sf.write("# Build script directory\n") -sf.write("ScriptDirectory = \"" + str(ScriptDirectory) + "\"\n") -sf.write("WorkspaceDirectory = \"" + str(WorkspaceDirectory) + "\"\n") -sf.write("\n") -sf.write("# Data build directories\n") -sf.write("DatabaseDirectory = \"" + str(DatabaseDirectory) + "\"\n") -sf.write("ExportBuildDirectory = \"" + str(ExportBuildDirectory) + "\"\n") -sf.write("\n") -sf.write("# Install directories\n") -sf.write("InstallDirectory = \"" + str(InstallDirectory) + "\"\n") -sf.write("DataShardDirectory = \"" + str(DataShardDirectory) + "\"\n") -sf.write("ClientDevDirectory = \"" + str(ClientDevDirectory) + "\"\n") -sf.write("ClientPatchDirectory = \"" + str(ClientPatchDirectory) + "\"\n") -sf.write("ClientInstallDirectory = \"" + str(ClientInstallDirectory) + "\"\n") -sf.write("\n") -sf.write("# TODO: NETWORK RECONNECT NOT IMPLEMENTED :)\n") -sf.write("\n") -sf.write("# Leveldesign directories\n") -sf.write("LeveldesignDirectory = \"" + str(LeveldesignDirectory) + "\"\n") -sf.write("LeveldesignDfnDirectory = \"" + str(LeveldesignDfnDirectory) + "\"\n") -sf.write("LeveldesignWorldDirectory = \"" + str(LeveldesignWorldDirectory) + "\"\n") -sf.write("PrimitivesDirectory = \"" + str(PrimitivesDirectory) + "\"\n") -sf.write("\n") -sf.write("# Misc data directories\n") -sf.write("GamedevDirectory = \"" + str(GamedevDirectory) + "\"\n") -sf.write("DataCommonDirectory = \"" + str(DataCommonDirectory) + "\"\n") -sf.write("WindowsExeDllCfgDirectories = " + str(WindowsExeDllCfgDirectories) + "\n") -sf.write("\n") -sf.write("# 3dsMax directives\n") -sf.write("MaxAvailable = " + str(MaxAvailable) + "\n") -sf.write("MaxDirectory = \"" + str(MaxDirectory) + "\"\n") -sf.write("MaxUserDirectory = \"" + str(MaxUserDirectory) + "\"\n") -sf.write("MaxExecutable = \"" + str(MaxExecutable) + "\"\n") -sf.write("\n") -sf.write("\n") -sf.write("# end of file\n") -sf.close() + printLog(log, "") + printLog(log, "-------") + printLog(log, "--- Setup build site") + printLog(log, "-------") + printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) + printLog(log, "") + printLog(log, "This script will set up the buildsite configuration, and create needed directories.") + printLog(log, "To use the defaults, simply hit ENTER, else type in the new value.") + printLog(log, "Use -- if you need to insert an empty value.") + printLog(log, "") + BuildQuality = int(askVar(log, "Build Quality", str(BuildQuality))) + ToolDirectories[0] = askVar(log, "Primary Tool Directory", ToolDirectories[0]).replace("\\", "/") + ToolDirectories[1] = askVar(log, "Secondary Tool Directory", ToolDirectories[1]).replace("\\", "/") + ToolSuffix = askVar(log, "Tool Suffix", ToolSuffix) + ScriptDirectory = askVar(log, "Script Directory", os.getcwd().replace("\\", "/")).replace("\\", "/") + WorkspaceDirectory = askVar(log, "Workspace Directory", WorkspaceDirectory).replace("\\", "/") + DatabaseDirectory = askVar(log, "Database Directory", DatabaseDirectory).replace("\\", "/") + ExportBuildDirectory = askVar(log, "Export Build Directory", ExportBuildDirectory).replace("\\", "/") + InstallDirectory = askVar(log, "Install Directory", InstallDirectory).replace("\\", "/") + DataShardDirectory = askVar(log, "Data Shard Directory", DataShardDirectory).replace("\\", "/") + ClientDevDirectory = askVar(log, "Client Dev Directory", ClientDevDirectory).replace("\\", "/") + ClientPatchDirectory = askVar(log, "Client Patch Directory", ClientPatchDirectory).replace("\\", "/") + ClientInstallDirectory = askVar(log, "Client Install Directory", ClientInstallDirectory).replace("\\", "/") + LeveldesignDirectory = askVar(log, "Leveldesign Directory", LeveldesignDirectory).replace("\\", "/") + LeveldesignDfnDirectory = askVar(log, "Leveldesign DFN Directory", LeveldesignDfnDirectory).replace("\\", "/") + LeveldesignWorldDirectory = askVar(log, "Leveldesign World Directory", LeveldesignWorldDirectory).replace("\\", "/") + PrimitivesDirectory = askVar(log, "Primitives Directory", PrimitivesDirectory).replace("\\", "/") + GamedevDirectory = askVar(log, "Gamedev Directory", GamedevDirectory).replace("\\", "/") + DataCommonDirectory = askVar(log, "Data Common Directory", DataCommonDirectory).replace("\\", "/") + WindowsExeDllCfgDirectories[0] = askVar(log, "Primary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[0]).replace("\\", "/") + WindowsExeDllCfgDirectories[1] = askVar(log, "Secondary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[1]).replace("\\", "/") + WindowsExeDllCfgDirectories[2] = askVar(log, "Tertiary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[2]).replace("\\", "/") + WindowsExeDllCfgDirectories[3] = askVar(log, "Quaternary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[3]).replace("\\", "/") + WindowsExeDllCfgDirectories[4] = askVar(log, "Quinary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[4]).replace("\\", "/") + WindowsExeDllCfgDirectories[5] = askVar(log, "Senary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[5]).replace("\\", "/") + WindowsExeDllCfgDirectories[6] = askVar(log, "Septenary Windows exe/dll/cfg Directory", WindowsExeDllCfgDirectories[6]).replace("\\", "/") + MaxAvailable = int(askVar(log, "3dsMax Available", str(MaxAvailable))) + if MaxAvailable: + MaxDirectory = askVar(log, "3dsMax Directory", MaxDirectory).replace("\\", "/") + MaxUserDirectory = askVar(log, "3dsMax User Directory", MaxUserDirectory).replace("\\", "/") + MaxExecutable = askVar(log, "3dsMax Executable", MaxExecutable) + if os.path.isfile("configuration/buildsite.py"): + os.remove("configuration/buildsite.py") + sf = open("configuration/buildsite.py", "w") + sf.write("#!/usr/bin/python\n") + sf.write("# \n") + sf.write("# \\file site.py\n") + sf.write("# \\brief Site configuration\n") + sf.write("# \\date " + time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "\n") + sf.write("# \\author Jan Boon (Kaetemi)\n") + sf.write("# Python port of game data build pipeline.\n") + sf.write("# Site configuration.\n") + sf.write("# \n") + sf.write("# NeL - MMORPG Framework \n") + sf.write("# Copyright (C) 2010 Winch Gate Property Limited\n") + sf.write("# \n") + sf.write("# This program is free software: you can redistribute it and/or modify\n") + sf.write("# it under the terms of the GNU Affero General Public License as\n") + sf.write("# published by the Free Software Foundation, either version 3 of the\n") + sf.write("# License, or (at your option) any later version.\n") + sf.write("# \n") + sf.write("# This program is distributed in the hope that it will be useful,\n") + sf.write("# but WITHOUT ANY WARRANTY; without even the implied warranty of\n") + sf.write("# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n") + sf.write("# GNU Affero General Public License for more details.\n") + sf.write("# \n") + sf.write("# You should have received a copy of the GNU Affero General Public License\n") + sf.write("# along with this program. If not, see .\n") + sf.write("# \n") + sf.write("\n") + sf.write("\n") + sf.write("# *** SITE INSTALLATION ***\n") + sf.write("\n") + sf.write("# Use '/' in path name, not '\'\n") + sf.write("# Don't put '/' at the end of a directory name\n") + sf.write("\n") + sf.write("\n") + sf.write("# Quality option for this site (1 for BEST, 0 for DRAFT)\n") + sf.write("BuildQuality = " + str(BuildQuality) + "\n") + sf.write("\n") + sf.write("ToolDirectories = " + str(ToolDirectories) + "\n") + sf.write("ToolSuffix = \"" + str(ToolSuffix) + "\"\n") + sf.write("\n") + sf.write("# Build script directory\n") + sf.write("ScriptDirectory = \"" + str(ScriptDirectory) + "\"\n") + sf.write("WorkspaceDirectory = \"" + str(WorkspaceDirectory) + "\"\n") + sf.write("\n") + sf.write("# Data build directories\n") + sf.write("DatabaseDirectory = \"" + str(DatabaseDirectory) + "\"\n") + sf.write("ExportBuildDirectory = \"" + str(ExportBuildDirectory) + "\"\n") + sf.write("\n") + sf.write("# Install directories\n") + sf.write("InstallDirectory = \"" + str(InstallDirectory) + "\"\n") + sf.write("DataShardDirectory = \"" + str(DataShardDirectory) + "\"\n") + sf.write("ClientDevDirectory = \"" + str(ClientDevDirectory) + "\"\n") + sf.write("ClientPatchDirectory = \"" + str(ClientPatchDirectory) + "\"\n") + sf.write("ClientInstallDirectory = \"" + str(ClientInstallDirectory) + "\"\n") + sf.write("\n") + sf.write("# TODO: NETWORK RECONNECT NOT IMPLEMENTED :)\n") + sf.write("\n") + sf.write("# Leveldesign directories\n") + sf.write("LeveldesignDirectory = \"" + str(LeveldesignDirectory) + "\"\n") + sf.write("LeveldesignDfnDirectory = \"" + str(LeveldesignDfnDirectory) + "\"\n") + sf.write("LeveldesignWorldDirectory = \"" + str(LeveldesignWorldDirectory) + "\"\n") + sf.write("PrimitivesDirectory = \"" + str(PrimitivesDirectory) + "\"\n") + sf.write("\n") + sf.write("# Misc data directories\n") + sf.write("GamedevDirectory = \"" + str(GamedevDirectory) + "\"\n") + sf.write("DataCommonDirectory = \"" + str(DataCommonDirectory) + "\"\n") + sf.write("WindowsExeDllCfgDirectories = " + str(WindowsExeDllCfgDirectories) + "\n") + sf.write("\n") + sf.write("# 3dsMax directives\n") + sf.write("MaxAvailable = " + str(MaxAvailable) + "\n") + sf.write("MaxDirectory = \"" + str(MaxDirectory) + "\"\n") + sf.write("MaxUserDirectory = \"" + str(MaxUserDirectory) + "\"\n") + sf.write("MaxExecutable = \"" + str(MaxExecutable) + "\"\n") + sf.write("\n") + sf.write("\n") + sf.write("# end of file\n") + sf.close() sys.path.append(WorkspaceDirectory) from projects import * @@ -262,22 +284,83 @@ printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) printLog(log, "") # For each project for projectName in ProjectsToProcess: - os.putenv("NELBUILDACTIVEPROJECT", os.path.abspath(WorkspaceDirectory + "/" + projectName)) - os.chdir("processes") - try: - subprocess.call([ "python", "0_setup.py" ]) - except Exception, e: - printLog(log, "<" + projectName + "> " + str(e)) - os.chdir("..") - try: - projectLog = open("processes/log.log", "r") - projectLogData = projectLog.read() - projectLog.close() - log.write(projectLogData) - except Exception, e: - printLog(log, "<" + projectName + "> " + str(e)) + if ((args.includeproject == None or projectName in args.includeproject) and (args.excludeproject == None or not projectName in args.excludeproject)): + printLog(log, "PROJECT " + projectName) + os.putenv("NELBUILDACTIVEPROJECT", os.path.abspath(WorkspaceDirectory + "/" + projectName)) + os.chdir("processes") + try: + if not args.includeprocess == None: + subprocess.call([ "python", "0_setup.py", "--includeprocess" ] + args.includeprocess) + elif not args.excludeprocess == None: + subprocess.call([ "python", "0_setup.py", "--excludeprocess" ] + args.excludeprocess) + else: + subprocess.call([ "python", "0_setup.py" ]) + except Exception, e: + printLog(log, "<" + projectName + "> " + str(e)) + os.chdir("..") + try: + projectLog = open("processes/log.log", "r") + projectLogData = projectLog.read() + projectLog.close() + log.write(projectLogData) + except Exception, e: + printLog(log, "<" + projectName + "> " + str(e)) + else: + printLog(log, "IGNORE PROJECT " + projectName) printLog(log, "") +# Additional directories +printLog(log, ">>> Setup additional directories <<<") +mkPath(log, ClientDevDirectory) +mkPath(log, ClientPatchDirectory) +mkPath(log, ClientInstallDirectory) + +if not args.noverify: + printLog(log, "") + printLog(log, "-------") + printLog(log, "--- Verify tool paths") + printLog(log, "-------") + printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) + printLog(log, "") + if MaxAvailable: + findMax(log, MaxDirectory, MaxExecutable) + findTool(log, ToolDirectories, TgaToDdsTool, ToolSuffix) + findTool(log, ToolDirectories, BuildInterfaceTool, ToolSuffix) + findTool(log, ToolDirectories, ExecTimeoutTool, ToolSuffix) + findTool(log, ToolDirectories, BuildSmallbankTool, ToolSuffix) + findTool(log, ToolDirectories, BuildFarbankTool, ToolSuffix) + findTool(log, ToolDirectories, ZoneDependenciesTool, ToolSuffix) + findTool(log, ToolDirectories, ZoneWelderTool, ToolSuffix) + findTool(log, ToolDirectories, BuildRbankTool, ToolSuffix) + findTool(log, ToolDirectories, BuildIndoorRbankTool, ToolSuffix) + findTool(log, ToolDirectories, BuildIgBoxesTool, ToolSuffix) + findTool(log, ToolDirectories, GetNeighborsTool, ToolSuffix) + findTool(log, ToolDirectories, ZoneLighterTool, ToolSuffix) + findTool(log, ToolDirectories, ZoneIgLighterTool, ToolSuffix) + findTool(log, ToolDirectories, IgLighterTool, ToolSuffix) + findTool(log, ToolDirectories, AnimBuilderTool, ToolSuffix) + findTool(log, ToolDirectories, TileEditTool, ToolSuffix) + # findTool(log, ToolDirectories, BuildImagesetTool, ToolSuffix) # kaetemi stuff, ignore this + findTool(log, ToolDirectories, MakeSheetIdTool, ToolSuffix) + # findTool(log, ToolDirectories, BuildSheetsTool, ToolSuffix) # kaetemi stuff, ignore this + # findTool(log, ToolDirectories, BuildSoundTool, ToolSuffix) # kaetemi stuff, ignore this + findTool(log, ToolDirectories, BuildCoarseMeshTool, ToolSuffix) + findTool(log, ToolDirectories, LightmapOptimizerTool, ToolSuffix) + findTool(log, ToolDirectories, BuildClodtexTool, ToolSuffix) + findTool(log, ToolDirectories, BuildShadowSkinTool, ToolSuffix) + findTool(log, ToolDirectories, PanoplyMakerTool, ToolSuffix) + findTool(log, ToolDirectories, HlsBankMakerTool, ToolSuffix) + findTool(log, ToolDirectories, LandExportTool, ToolSuffix) + findTool(log, ToolDirectories, PrimExportTool, ToolSuffix) + findTool(log, ToolDirectories, IgElevationTool, ToolSuffix) + findTool(log, ToolDirectories, IgAddTool, ToolSuffix) + findTool(log, ToolDirectories, BuildClodBankTool, ToolSuffix) + findTool(log, ToolDirectories, SheetsPackerTool, ToolSuffix) + findTool(log, ToolDirectories, BnpMakeTool, ToolSuffix) + findTool(log, ToolDirectories, AiBuildWmapTool, ToolSuffix) + findTool(log, ToolDirectories, TgaCutTool, ToolSuffix) + findTool(log, ToolDirectories, PatchGenTool, ToolSuffix) + log.close() if os.path.isfile("0_setup.log"): os.remove("0_setup.log") diff --git a/code/nel/tools/build_gamedata/1_export.py b/code/nel/tools/build_gamedata/1_export.py index 0fb684592..6abe0a3a5 100644 --- a/code/nel/tools/build_gamedata/1_export.py +++ b/code/nel/tools/build_gamedata/1_export.py @@ -24,9 +24,25 @@ # along with this program. If not, see . # -import time, sys, os, shutil, subprocess, distutils.dir_util +import time, sys, os, shutil, subprocess, distutils.dir_util, argparse sys.path.append("configuration") +parser = argparse.ArgumentParser(description='Ryzom Core - Build Gamedata - Export') +# parser.add_argument('--haltonerror', '-eh', action='store_true') +parser.add_argument('--includeproject', '-ipj', nargs='+') +parser.add_argument('--excludeproject', '-epj', nargs='+') +parser.add_argument('--includeprocess', '-ipc', nargs='+') +parser.add_argument('--excludeprocess', '-epc', nargs='+') +args = parser.parse_args() + +if not args.includeproject == None and not args.excludeproject == None: + print "ERROR --includeproject cannot be combined with --excludeproject, exit." + exit() + +if not args.includeprocess == None and not args.excludeprocess == None: + print "ERROR --includeprocess cannot be combined with --excludeprocess, exit." + exit() + if os.path.isfile("log.log"): os.remove("log.log") log = open("log.log", "w") @@ -46,20 +62,29 @@ printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) printLog(log, "") # For each project for projectName in ProjectsToProcess: - os.putenv("NELBUILDACTIVEPROJECT", os.path.abspath(WorkspaceDirectory + "/" + projectName)) - os.chdir("processes") - try: - subprocess.call([ "python", "1_export.py" ]) - except Exception, e: - printLog(log, "<" + projectName + "> " + str(e)) - os.chdir("..") - try: - projectLog = open("processes/log.log", "r") - projectLogData = projectLog.read() - projectLog.close() - log.write(projectLogData) - except Exception, e: - printLog(log, "<" + projectName + "> " + str(e)) + if ((args.includeproject == None or projectName in args.includeproject) and (args.excludeproject == None or not projectName in args.excludeproject)): + printLog(log, "PROJECT " + projectName) + os.putenv("NELBUILDACTIVEPROJECT", os.path.abspath(WorkspaceDirectory + "/" + projectName)) + os.chdir("processes") + try: + if not args.includeprocess == None: + subprocess.call([ "python", "1_export.py", "--includeprocess" ] + args.includeprocess) + elif not args.excludeprocess == None: + subprocess.call([ "python", "1_export.py", "--excludeprocess" ] + args.excludeprocess) + else: + subprocess.call([ "python", "1_export.py" ]) + except Exception, e: + printLog(log, "<" + projectName + "> " + str(e)) + os.chdir("..") + try: + projectLog = open("processes/log.log", "r") + projectLogData = projectLog.read() + projectLog.close() + log.write(projectLogData) + except Exception, e: + printLog(log, "<" + projectName + "> " + str(e)) + else: + printLog(log, "IGNORE PROJECT " + projectName) printLog(log, "") log.close() diff --git a/code/nel/tools/build_gamedata/2_build.py b/code/nel/tools/build_gamedata/2_build.py index a6229c29c..36a171161 100644 --- a/code/nel/tools/build_gamedata/2_build.py +++ b/code/nel/tools/build_gamedata/2_build.py @@ -24,9 +24,25 @@ # along with this program. If not, see . # -import time, sys, os, shutil, subprocess, distutils.dir_util +import time, sys, os, shutil, subprocess, distutils.dir_util, argparse sys.path.append("configuration") +parser = argparse.ArgumentParser(description='Ryzom Core - Build Gamedata - Build') +# parser.add_argument('--haltonerror', '-eh', action='store_true') +parser.add_argument('--includeproject', '-ipj', nargs='+') +parser.add_argument('--excludeproject', '-epj', nargs='+') +parser.add_argument('--includeprocess', '-ipc', nargs='+') +parser.add_argument('--excludeprocess', '-epc', nargs='+') +args = parser.parse_args() + +if not args.includeproject == None and not args.excludeproject == None: + print "ERROR --includeproject cannot be combined with --excludeproject, exit." + exit() + +if not args.includeprocess == None and not args.excludeprocess == None: + print "ERROR --includeprocess cannot be combined with --excludeprocess, exit." + exit() + if os.path.isfile("log.log"): os.remove("log.log") log = open("log.log", "w") @@ -46,20 +62,29 @@ printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) printLog(log, "") # For each project for projectName in ProjectsToProcess: - os.putenv("NELBUILDACTIVEPROJECT", os.path.abspath(WorkspaceDirectory + "/" + projectName)) - os.chdir("processes") - try: - subprocess.call([ "python", "2_build.py" ]) - except Exception, e: - printLog(log, "<" + projectName + "> " + str(e)) - os.chdir("..") - try: - projectLog = open("processes/log.log", "r") - projectLogData = projectLog.read() - projectLog.close() - log.write(projectLogData) - except Exception, e: - printLog(log, "<" + projectName + "> " + str(e)) + if ((args.includeproject == None or projectName in args.includeproject) and (args.excludeproject == None or not projectName in args.excludeproject)): + printLog(log, "PROJECT " + projectName) + os.putenv("NELBUILDACTIVEPROJECT", os.path.abspath(WorkspaceDirectory + "/" + projectName)) + os.chdir("processes") + try: + if not args.includeprocess == None: + subprocess.call([ "python", "2_build.py", "--includeprocess" ] + args.includeprocess) + elif not args.excludeprocess == None: + subprocess.call([ "python", "2_build.py", "--excludeprocess" ] + args.excludeprocess) + else: + subprocess.call([ "python", "2_build.py" ]) + except Exception, e: + printLog(log, "<" + projectName + "> " + str(e)) + os.chdir("..") + try: + projectLog = open("processes/log.log", "r") + projectLogData = projectLog.read() + projectLog.close() + log.write(projectLogData) + except Exception, e: + printLog(log, "<" + projectName + "> " + str(e)) + else: + printLog(log, "IGNORE PROJECT " + projectName) printLog(log, "") log.close() diff --git a/code/nel/tools/build_gamedata/3_install.py b/code/nel/tools/build_gamedata/3_install.py index 70ece522b..39a19dea3 100644 --- a/code/nel/tools/build_gamedata/3_install.py +++ b/code/nel/tools/build_gamedata/3_install.py @@ -24,9 +24,25 @@ # along with this program. If not, see . # -import time, sys, os, shutil, subprocess, distutils.dir_util +import time, sys, os, shutil, subprocess, distutils.dir_util, argparse sys.path.append("configuration") +parser = argparse.ArgumentParser(description='Ryzom Core - Build Gamedata - Install') +# parser.add_argument('--haltonerror', '-eh', action='store_true') +parser.add_argument('--includeproject', '-ipj', nargs='+') +parser.add_argument('--excludeproject', '-epj', nargs='+') +parser.add_argument('--includeprocess', '-ipc', nargs='+') +parser.add_argument('--excludeprocess', '-epc', nargs='+') +args = parser.parse_args() + +if not args.includeproject == None and not args.excludeproject == None: + print "ERROR --includeproject cannot be combined with --excludeproject, exit." + exit() + +if not args.includeprocess == None and not args.excludeprocess == None: + print "ERROR --includeprocess cannot be combined with --excludeprocess, exit." + exit() + if os.path.isfile("log.log"): os.remove("log.log") log = open("log.log", "w") @@ -46,20 +62,29 @@ printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) printLog(log, "") # For each project for projectName in ProjectsToProcess: - os.putenv("NELBUILDACTIVEPROJECT", os.path.abspath(WorkspaceDirectory + "/" + projectName)) - os.chdir("processes") - try: - subprocess.call([ "python", "3_install.py" ]) - except Exception, e: - printLog(log, "<" + projectName + "> " + str(e)) - os.chdir("..") - try: - projectLog = open("processes/log.log", "r") - projectLogData = projectLog.read() - projectLog.close() - log.write(projectLogData) - except Exception, e: - printLog(log, "<" + projectName + "> " + str(e)) + if ((args.includeproject == None or projectName in args.includeproject) and (args.excludeproject == None or not projectName in args.excludeproject)): + printLog(log, "PROJECT " + projectName) + os.putenv("NELBUILDACTIVEPROJECT", os.path.abspath(WorkspaceDirectory + "/" + projectName)) + os.chdir("processes") + try: + if not args.includeprocess == None: + subprocess.call([ "python", "3_install.py", "--includeprocess" ] + args.includeprocess) + elif not args.excludeprocess == None: + subprocess.call([ "python", "3_install.py", "--excludeprocess" ] + args.excludeprocess) + else: + subprocess.call([ "python", "3_install.py" ]) + except Exception, e: + printLog(log, "<" + projectName + "> " + str(e)) + os.chdir("..") + try: + projectLog = open("processes/log.log", "r") + projectLogData = projectLog.read() + projectLog.close() + log.write(projectLogData) + except Exception, e: + printLog(log, "<" + projectName + "> " + str(e)) + else: + printLog(log, "IGNORE PROJECT " + projectName) printLog(log, "") log.close() diff --git a/code/nel/tools/build_gamedata/6_client_patch.py b/code/nel/tools/build_gamedata/6_client_patch.py index 7689cc404..c41312df3 100644 --- a/code/nel/tools/build_gamedata/6_client_patch.py +++ b/code/nel/tools/build_gamedata/6_client_patch.py @@ -24,9 +24,13 @@ # along with this program. If not, see . # -import time, sys, os, shutil, subprocess, distutils.dir_util +import time, sys, os, shutil, subprocess, distutils.dir_util, argparse sys.path.append("configuration") +parser = argparse.ArgumentParser(description='Ryzom Core - Build Gamedata - Client Patch') +parser.add_argument('--bnponly', '-bo', action='store_true') +args = parser.parse_args() + if os.path.isfile("log.log"): os.remove("log.log") log = open("log.log", "w") @@ -59,56 +63,57 @@ printLog(log, "") if BnpMake == "": toolLogFail(log, BnpMakeTool, ToolSuffix) -elif PatchGen == "": +elif PatchGen == "" and not args.bnponly: toolLogFail(log, PatchGenTool, ToolSuffix) -elif Lzma == "": +elif Lzma == "" and not args.bnponly: toolLogFail(log, "LZMA", ToolSuffix) -elif XDelta == "": +elif XDelta == "" and not args.bnponly: toolLogFail(log, "XDELTA", ToolSuffix) elif os.path.dirname(Lzma) != os.path.dirname(XDelta): printLog(log, "FAIL lzma.exe and xdelta.exe must be in the same directory") else: mkPath(log, ClientPatchDirectory) - productXml = ClientPatchDirectory + "/" + ProductName + ".xml" - if not os.path.isfile(productXml): - printLog(log, ">>> Create new product <<<") - subprocess.call([ PatchGen, "createNewProduct", productXml ]) - printLog(log, "") - printLog(log, ">>> Rewrite " + ProductName + ".xml <<<") # because we know better. - shutil.move(productXml, productXml + ".old") - oldCfg = open(productXml + ".old", "r") - cfg = open(productXml, "w") - inCategories = 0 - for line in oldCfg: - if not inCategories: - if line.strip() == "<_Categories>": - inCategories = 1 - cfg.write("\t<_Categories>\n") - for category in InstallClientData: - cfg.write("\t\t<_Category>\n") - cfg.write("\t\t\t<_Name type=\"STRING\" value=\"" + category["Name"] + "\"/>\n") - if category["UnpackTo"] != None: - if category["UnpackTo"] != "": - cfg.write("\t\t\t<_UnpackTo type=\"STRING\" value=\"./" + category["UnpackTo"] + "/\"/>\n") - else: - cfg.write("\t\t\t<_UnpackTo type=\"SINT32\" value=\"./\"/>\n") - cfg.write("\t\t\t<_IsOptional type=\"SINT32\" value=\"" + str(category["IsOptional"]) + "\"/>\n") - cfg.write("\t\t\t<_IsIncremental type=\"SINT32\" value=\"" + str(category["IsIncremental"]) + "\"/>\n") - for package in category["Packages"]: - if (len(package[1]) > 0): - cfg.write("\t\t\t<_Files type=\"STRING\" value=\"" + package[1][0] + "\"/>\n") - else: - cfg.write("\t\t\t<_Files type=\"STRING\" value=\"" + package[0] + ".bnp\"/>\n") - cfg.write("\t\t\n") - cfg.write("\t\n") + if not args.bnponly: + productXml = ClientPatchDirectory + "/" + ProductName + ".xml" + if not os.path.isfile(productXml): + printLog(log, ">>> Create new product <<<") + subprocess.call([ PatchGen, "createNewProduct", productXml ]) + printLog(log, "") + printLog(log, ">>> Rewrite " + ProductName + ".xml <<<") # because we know better. + shutil.move(productXml, productXml + ".old") + oldCfg = open(productXml + ".old", "r") + cfg = open(productXml, "w") + inCategories = 0 + for line in oldCfg: + if not inCategories: + if line.strip() == "<_Categories>": + inCategories = 1 + cfg.write("\t<_Categories>\n") + for category in InstallClientData: + cfg.write("\t\t<_Category>\n") + cfg.write("\t\t\t<_Name type=\"STRING\" value=\"" + category["Name"] + "\"/>\n") + if category["UnpackTo"] != None: + if category["UnpackTo"] != "": + cfg.write("\t\t\t<_UnpackTo type=\"STRING\" value=\"./" + category["UnpackTo"] + "/\"/>\n") + else: + cfg.write("\t\t\t<_UnpackTo type=\"SINT32\" value=\"./\"/>\n") + cfg.write("\t\t\t<_IsOptional type=\"SINT32\" value=\"" + str(category["IsOptional"]) + "\"/>\n") + cfg.write("\t\t\t<_IsIncremental type=\"SINT32\" value=\"" + str(category["IsIncremental"]) + "\"/>\n") + for package in category["Packages"]: + if (len(package[1]) > 0): + cfg.write("\t\t\t<_Files type=\"STRING\" value=\"" + package[1][0] + "\"/>\n") + else: + cfg.write("\t\t\t<_Files type=\"STRING\" value=\"" + package[0] + ".bnp\"/>\n") + cfg.write("\t\t\n") + cfg.write("\t\n") + else: + cfg.write(line) else: - cfg.write(line) - else: - if line.strip() == "": - inCategories = 0 - oldCfg.close() - cfg.close() - os.remove(productXml + ".old") + if line.strip() == "": + inCategories = 0 + oldCfg.close() + cfg.close() + os.remove(productXml + ".old") printLog(log, "") printLog(log, ">>> Make bnp <<<") targetPath = ClientPatchDirectory + "/bnp" @@ -133,13 +138,14 @@ else: else: printLog(log, "SKIP " + targetBnp) printLog(log, "") - printLog(log, ">>> Update product <<<") - cwDir = os.getcwd().replace("\\", "/") - toolDir = os.path.dirname(Lzma).replace("\\", "/") - os.chdir(toolDir) - subprocess.call([ PatchGen, "updateProduct", productXml ]) - os.chdir(cwDir) - printLog(log, "") + if not args.bnponly: + printLog(log, ">>> Update product <<<") + cwDir = os.getcwd().replace("\\", "/") + toolDir = os.path.dirname(Lzma).replace("\\", "/") + os.chdir(toolDir) + subprocess.call([ PatchGen, "updateProduct", productXml ]) + os.chdir(cwDir) + printLog(log, "") log.close() diff --git a/code/nel/tools/build_gamedata/7_client_install.py b/code/nel/tools/build_gamedata/7_client_install.py index b5a5bab1f..c4c1ab03c 100644 --- a/code/nel/tools/build_gamedata/7_client_install.py +++ b/code/nel/tools/build_gamedata/7_client_install.py @@ -45,45 +45,30 @@ printLog(log, "-------") printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) printLog(log, "") -# Find tools -BnpMake = findTool(log, ToolDirectories, BnpMakeTool, ToolSuffix) -printLog(log, "") - -if BnpMake == "": - toolLogFail(log, BnpMakeTool, ToolSuffix) -else: - for category in InstallClientData: - printLog(log, "CATEGORY " + category["Name"]) - if (category["UnpackTo"] != None): - targetPath = ClientInstallDirectory - if (category["UnpackTo"] != ""): - targetPath += "/" + category["UnpackTo"] - mkPath(log, targetPath) - for package in category["Packages"]: - printLog(log, "PACKAGE " + package[0]) - mkPath(log, InstallDirectory + "/" + package[0]) - copyFilesNoTreeIfNeeded(log, InstallDirectory + "/" + package[0], targetPath) - else: - targetPath = ClientInstallDirectory + "/data" - mkPath(log, targetPath) - for package in category["Packages"]: - printLog(log, "PACKAGE " + package[0]) - sourcePath = InstallDirectory + "/" + package[0] - mkPath(log, sourcePath) - targetBnp = targetPath + "/" + package[0] + ".bnp" - if (len(package[1]) > 0): - targetBnp = targetPath + "/" + package[1][0] - printLog(log, "TARGET " + package[1][0]) - needUpdateBnp = 1 - if (len(package) > 2): - needUpdateBnp = needUpdate(log, sourcePath + "/" + package[2], targetBnp) - else: - needUpdateBnp = needUpdateDirNoSubdirFile(log, sourcePath, targetBnp) - if (needUpdateBnp): - printLog(log, "BNP " + targetBnp) - subprocess.call([ BnpMake, "/p", sourcePath, targetPath ] + package[1]) - else: - printLog(log, "SKIP " + targetBnp) +for category in InstallClientData: + printLog(log, "CATEGORY " + category["Name"]) + if (category["UnpackTo"] != None): + targetPath = ClientInstallDirectory + if (category["UnpackTo"] != ""): + targetPath += "/" + category["UnpackTo"] + mkPath(log, targetPath) + for package in category["Packages"]: + printLog(log, "PACKAGE " + package[0]) + mkPath(log, InstallDirectory + "/" + package[0]) + copyFilesNoTreeIfNeeded(log, InstallDirectory + "/" + package[0], targetPath) + else: + sourcePath = ClientPatchDirectory + "/bnp" + targetPath = ClientInstallDirectory + "/data" + mkPath(log, targetPath) + for package in category["Packages"]: + printLog(log, "PACKAGE " + package[0]) + sourceBnp = sourcePath + "/" + package[0] + ".bnp" + targetBnp = targetPath + "/" + package[0] + ".bnp" + if (len(package[1]) > 0): + sourceBnp = sourcePath + "/" + package[1][0] + targetBnp = targetPath + "/" + package[1][0] + printLog(log, "TARGET " + package[1][0]) + copyFileIfNeeded(log, sourceBnp, targetBnp) printLog(log, "") log.close() diff --git a/code/nel/tools/build_gamedata/8_upload.py b/code/nel/tools/build_gamedata/8_upload.py new file mode 100644 index 000000000..1b60aad68 --- /dev/null +++ b/code/nel/tools/build_gamedata/8_upload.py @@ -0,0 +1,181 @@ +#!/usr/bin/python +# +# \file 8_upload.py +# \brief Upload data to servers +# \date 2009-02-18 16:19GMT +# \author Jan Boon (Kaetemi) +# Game data build pipeline. +# Upload data to servers +# +# NeL - MMORPG Framework +# Copyright (C) 2011 Kaetemi +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import time, sys, os, shutil, subprocess, distutils.dir_util +sys.path.append("configuration") + +if os.path.isfile("log.log"): + os.remove("log.log") +log = open("log.log", "w") +from scripts import * +from buildsite import * +from tools import * + +try: + from upload import * +except ImportError: + # Not documenting this. Because we can. + printLog(log, "ERROR Upload not configured, bye.") + exit() + +sys.path.append(WorkspaceDirectory) +from projects import * + +# Log error +printLog(log, "") +printLog(log, "-------") +printLog(log, "--- Upload data to servers") +printLog(log, "-------") +printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) +printLog(log, "") + +# Find tools +# Not documenting this. Because we can. +Psftp = findFileMultiDir(log, ToolDirectories + WindowsExeDllCfgDirectories, UploadPsftpTool) +printLog(log, "PSFTP " + Psftp) + +def downloadVersionTag(server, user, sshkey, dir): + if os.path.isfile("upload.tag"): + os.remove("upload.tag") + if os.path.isfile("upload.batch"): + os.remove("upload.batch") + ub = open("upload.batch", "w") + ub.write("cd " + dir + "\n") + ub.write("get upload.tag upload.tag\n") + ub.write("quit\n") + ub.close() + subprocess.call([ Psftp, "-b", "upload.batch", "-i", sshkey, user + "@" + server ]) + os.remove("upload.batch") + if os.path.isfile("upload.tag"): + ft = open("upload.tag") + result = float(ft.read()) # float, really + ft.close() + os.remove("upload.tag") + printLog(log, "INFO Upload tag is " + str(result)) + return result + else: + printLog(log, "WARNING Upload tag not found, uploading everything") + return 0 + +def isDirectoryNeeded(ft, dir): + files = os.listdir(dir) + for fileName in files: + if isLegalFileName(fileName): + fileFull = dir + "/" + fileName + if os.path.isfile(fileFull): + nftf = os.stat(fileFull).st_mtime + if nftf > ft: + return True + elif os.path.isdir(fileFull): + if isDirectoryNeeded(ft, fileFull): + return True + elif not os.path.isdir(fileFull): + printLog(log, "isDirectoryNeeded: file not dir or file?!" + fileFull) + return False + +def listDirectoryUpload(ft, ub, udb, dir): + nft = 0 + files = os.listdir(dir) + for fileName in files: + if isLegalFileName(fileName): + fileFull = dir + "/" + fileName + if os.path.isfile(fileFull): + nftf = os.stat(fileFull).st_mtime + if nftf > ft: + ub.write("put " + fileFull + " " + fileName + "\n") + if nftf > nft: + nft = nftf + elif os.path.isdir(fileFull): + if isDirectoryNeeded(ft, fileFull): + udb.write("mkdir " + fileName + "\n") + ub.write("cd " + fileName + "\n") + udb.write("cd " + fileName + "\n") + nft2 = listDirectoryUpload(ft, ub, udb, fileFull) + if (nft2 > nft): + nft = nft2 + ub.write("cd ..\n") + udb.write("cd ..\n") + elif not os.path.isdir(fileFull): + printLog(log, "listDirectoryUpload: file not dir or file?!" + fileFull) + return nft + +def uploadSftp(server, user, sshkey, dir_to, dir_from, addcmd): + ft = downloadVersionTag(server, user, sshkey, dir_to) + if isDirectoryNeeded(ft, dir_from): + if os.path.isfile("upload_dir.batch"): + os.remove("upload_dir.batch") + if os.path.isfile("upload.batch"): + os.remove("upload.batch") + udb = open("upload_dir.batch", "w") + udb.write("cd " + dir_to + "\n") + ub = open("upload.batch", "w") + ub.write("cd " + dir_to + "\n") + for ac in addcmd: + ub.write(ac + "\n") + ftn = listDirectoryUpload(ft, ub, udb, dir_from) + if (ft > ftn): + ftn = ft + nft = open("upload.tag", "w") + nft.write(str(ftn)) + nft.close() + ub.write("put upload.tag upload.tag\n") + ub.write("quit\n") + ub.close() + udb.write("quit\n") + udb.close() + subprocess.call([ Psftp, "-be", "-b", "upload_dir.batch", "-i", sshkey, user + "@" + server ]) + subprocess.call([ Psftp, "-b", "upload.batch", "-i", sshkey, user + "@" + server ]) + os.remove("upload_dir.batch") + os.remove("upload.batch") + os.remove("upload.tag") + else: + printLog(log, "SKIP " + dir_to) + +printLog(log, ">>> Upload patch <<<") +for target in UploadPatch: + uploadSftp(target[0], target[1], target[2], target[3], ClientPatchDirectory + "/patch", [ ]) + +printLog(log, ">>> Upload data_shard <<<") +for target in UploadShard: + uploadSftp(target[0], target[1], target[2], target[3], DataShardDirectory, [ "rm *.packed_sheets", "rm primitive_cache/*.binprim" ]) + +printLog(log, ">>> Upload data_common <<<") +for target in UploadCommon: + uploadSftp(target[0], target[1], target[2], target[3], DataCommonDirectory, [ ]) + +printLog(log, ">>> Upload data_leveldesign/leveldesign <<<") +for target in UploadLeveldesign: + uploadSftp(target[0], target[1], target[2], target[3], LeveldesignDirectory, [ ]) + +printLog(log, ">>> Upload data_leveldesign/primitives <<<") +for target in UploadPrimitives: + uploadSftp(target[0], target[1], target[2], target[3], PrimitivesDirectory, [ ]) + +log.close() +if os.path.isfile("8_upload.log"): + os.remove("8_upload.log") +shutil.copy("log.log", time.strftime("%Y-%m-%d-%H-%M-GMT", time.gmtime(time.time())) + "_upload.log") +shutil.move("log.log", "8_upload.log") diff --git a/code/nel/tools/build_gamedata/configuration/tools.py b/code/nel/tools/build_gamedata/configuration/tools.py index e533270c1..5eff45977 100644 --- a/code/nel/tools/build_gamedata/configuration/tools.py +++ b/code/nel/tools/build_gamedata/configuration/tools.py @@ -69,10 +69,10 @@ ZoneIgLighterTool = "zone_ig_lighter" IgLighterTool = "ig_lighter" AnimBuilderTool = "anim_builder" TileEditTool = "tile_edit" -BuildImagesetTool = "th_build_imageset" +# BuildImagesetTool = "th_build_imageset" # kaetemi stuff, ignore this MakeSheetIdTool = "make_sheet_id" -BuildSheetsTool = "th_build_sheets" -BuildSoundTool = "th_build_sound" +# BuildSheetsTool = "th_build_sheets" # kaetemi stuff, ignore this +# BuildSoundTool = "th_build_sound" # kaetemi stuff, ignore this BuildCoarseMeshTool = "build_coarse_mesh" LightmapOptimizerTool = "lightmap_optimizer" BuildClodtexTool = "build_clodtex" diff --git a/code/nel/tools/build_gamedata/generators/max_exporter_scripts/pacs_prim.py b/code/nel/tools/build_gamedata/generators/max_exporter_scripts/pacs_prim.py index b1c3e5966..2e3f07ec9 100644 --- a/code/nel/tools/build_gamedata/generators/max_exporter_scripts/pacs_prim.py +++ b/code/nel/tools/build_gamedata/generators/max_exporter_scripts/pacs_prim.py @@ -1,16 +1,7 @@ -printLog(log, ">>> List %PreGenFileExtension% <<<") -outDirPacsPrim = ExportBuildDirectory + "/" + %PreGenExportDirectoryVariable% -mkPath(log, outDirPacsPrim) +# Remove bad file from previous script version listPath = ExportBuildDirectory + "/" + %PreGenExportDirectoryVariable% + "/landscape_col_prim_pacs_list.txt" if os.path.isfile(listPath): os.remove(listPath) -if WantLandscapeColPrimPacsList: - exportedPacsPrims = findFiles(log, outDirPacsPrim, "", ".%PreGenFileExtension%") - printLog(log, "WRITE " + listPath) - listFile = open(listPath, "w") - for exported in exportedPacsPrims: - listFile.write(exported + "\n") - listFile.close() diff --git a/code/nel/tools/build_gamedata/generators/max_exporter_scripts/shape.ms b/code/nel/tools/build_gamedata/generators/max_exporter_scripts/shape.ms index 0f8af5276..c1f4761ff 100644 --- a/code/nel/tools/build_gamedata/generators/max_exporter_scripts/shape.ms +++ b/code/nel/tools/build_gamedata/generators/max_exporter_scripts/shape.ms @@ -187,7 +187,7 @@ fn haveCoarseMesh node = return false ) -fn runNelMaxExport inputMaxFile = +fn runNelMaxExportSub inputMaxFile retryCount = ( tagThisFile = false @@ -354,8 +354,39 @@ fn runNelMaxExport inputMaxFile = ( -- Error nlerror("WARNING no shape exported from the file " + inputMaxFile) + if tagThisFile then + ( + if retryCount < 2 then + ( + nlerror("INFO retry this file") + + -- Free memory and file handles + gc() + heapfree + + -- Reset 3dsmax + resetMAXFile #noprompt + + if (loadMaxFile inputMaxFile quiet:true) == true then + ( + tagThisFile = runNelMaxExportSub inputMaxFile (retryCount + 1) + ) + else + ( + -- Error + nlerror("ERROR exporting '%PreGenFileExtension%': can't open the file " + inputMaxFile) + nlerror("FAIL Mysterious error occured") + NelForceQuitRightNow() + ) + ) + ) ) return tagThisFile ) +fn runNelMaxExport inputMaxFile = +( + return runNelMaxExportSub inputMaxFile 0 +) + diff --git a/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/export_footer.ms b/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/export_footer.ms index 5facf07e7..2db696b7f 100644 --- a/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/export_footer.ms +++ b/code/nel/tools/build_gamedata/generators/tagged_max_exporter_template/export_footer.ms @@ -90,7 +90,9 @@ try catch ( -- Error - nlerror("ERROR fatal error exporting '%PreGenFileExtension%' in folder %MaxSourceDirectory%") + nlerror("ERROR Fatal error exporting '%PreGenFileExtension%' in folder %MaxSourceDirectory%") + nlerror("FAIL Fatal error occured") + NelForceQuitRightNow() removeRunningTag = false ) diff --git a/code/nel/tools/build_gamedata/interface_dev.bat b/code/nel/tools/build_gamedata/interface_dev.bat new file mode 100644 index 000000000..1c5fa04eb --- /dev/null +++ b/code/nel/tools/build_gamedata/interface_dev.bat @@ -0,0 +1,4 @@ +1_export.py -ipj common/gamedev common/data_common common/exedll common/cfg common/interface common/sfx common/fonts common/outgame +2_build.py -ipj common/gamedev common/data_common common/exedll common/cfg common/interface common/sfx common/fonts common/outgame +3_install.py -ipj common/gamedev common/data_common common/exedll common/cfg common/interface common/sfx common/fonts common/outgame +5_client_dev.py diff --git a/code/nel/tools/build_gamedata/leveldesign_dev.bat b/code/nel/tools/build_gamedata/leveldesign_dev.bat new file mode 100644 index 000000000..fca3c1561 --- /dev/null +++ b/code/nel/tools/build_gamedata/leveldesign_dev.bat @@ -0,0 +1,4 @@ +1_export.py -ipj common/gamedev common/data_common common/leveldesign common/exedll common/cfg +2_build.py -ipj common/gamedev common/data_common common/leveldesign common/exedll common/cfg +3_install.py -ipj common/gamedev common/data_common common/leveldesign common/exedll common/cfg +5_client_dev.py diff --git a/code/nel/tools/build_gamedata/processes/0_setup.py b/code/nel/tools/build_gamedata/processes/0_setup.py index cb6de2abb..213158c92 100644 --- a/code/nel/tools/build_gamedata/processes/0_setup.py +++ b/code/nel/tools/build_gamedata/processes/0_setup.py @@ -24,8 +24,14 @@ # along with this program. If not, see . # -import time, sys, os, shutil, subprocess, distutils.dir_util +import time, sys, os, shutil, subprocess, distutils.dir_util, argparse sys.path.append("../configuration") + +parser = argparse.ArgumentParser() +parser.add_argument('--includeprocess', '-ipc', nargs='+') +parser.add_argument('--excludeprocess', '-epc', nargs='+') +args = parser.parse_args() + if os.path.isfile("log.log"): os.remove("log.log") log = open("log.log", "w") @@ -60,20 +66,24 @@ printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) printLog(log, "") # For each process for processName in ProcessToComplete: - os.chdir(processName) - try: - subprocess.call([ "python", "0_setup.py" ]) - except Exception, e: - printLog(log, "<" + processName + "> " + str(e)) - os.chdir("..") - try: - processLog = open(processName + "/log.log", "r") - processLogData = processLog.read() - processLog.close() - log.write(processLogData) - except Exception, e: - printLog(log, "<" + processName + "> " + str(e)) - # subprocess.call("idle.bat") + if ((args.includeprocess == None or processName in args.includeprocess) and (args.excludeprocess == None or not processName in args.excludeprocess)): + printLog(log, "PROCESS " + processName) + os.chdir(processName) + try: + subprocess.call([ "python", "0_setup.py" ]) + except Exception, e: + printLog(log, "<" + processName + "> " + str(e)) + os.chdir("..") + try: + processLog = open(processName + "/log.log", "r") + processLogData = processLog.read() + processLog.close() + log.write(processLogData) + except Exception, e: + printLog(log, "<" + processName + "> " + str(e)) + # subprocess.call("idle.bat") + else: + printLog(log, "IGNORE PROCESS " + processName) printLog(log, "") log.close() diff --git a/code/nel/tools/build_gamedata/processes/1_export.py b/code/nel/tools/build_gamedata/processes/1_export.py index fdd497720..766639f17 100644 --- a/code/nel/tools/build_gamedata/processes/1_export.py +++ b/code/nel/tools/build_gamedata/processes/1_export.py @@ -24,9 +24,14 @@ # along with this program. If not, see . # -import time, sys, os, shutil, subprocess, distutils.dir_util +import time, sys, os, shutil, subprocess, distutils.dir_util, argparse sys.path.append("../configuration") +parser = argparse.ArgumentParser() +parser.add_argument('--includeprocess', '-ipc', nargs='+') +parser.add_argument('--excludeprocess', '-epc', nargs='+') +args = parser.parse_args() + if os.path.isfile("log.log"): os.remove("log.log") log = open("log.log", "w") @@ -45,20 +50,24 @@ printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) printLog(log, "") # For each process for processName in ProcessToComplete: - os.chdir(processName) - try: - subprocess.call([ "python", "1_export.py" ]) - except Exception, e: - printLog(log, "<" + processName + "> " + str(e)) - os.chdir("..") - try: - processLog = open(processName + "/log.log", "r") - processLogData = processLog.read() - processLog.close() - log.write(processLogData) - except Exception, e: - printLog(log, "<" + processName + "> " + str(e)) - # subprocess.call("idle.bat") + if ((args.includeprocess == None or processName in args.includeprocess) and (args.excludeprocess == None or not processName in args.excludeprocess)): + printLog(log, "PROCESS " + processName) + os.chdir(processName) + try: + subprocess.call([ "python", "1_export.py" ]) + except Exception, e: + printLog(log, "<" + processName + "> " + str(e)) + os.chdir("..") + try: + processLog = open(processName + "/log.log", "r") + processLogData = processLog.read() + processLog.close() + log.write(processLogData) + except Exception, e: + printLog(log, "<" + processName + "> " + str(e)) + # subprocess.call("idle.bat") + else: + printLog(log, "IGNORE PROCESS " + processName) printLog(log, "") log.close() diff --git a/code/nel/tools/build_gamedata/processes/2_build.py b/code/nel/tools/build_gamedata/processes/2_build.py index 28ee3147c..4ad70b2f4 100644 --- a/code/nel/tools/build_gamedata/processes/2_build.py +++ b/code/nel/tools/build_gamedata/processes/2_build.py @@ -24,9 +24,14 @@ # along with this program. If not, see . # -import time, sys, os, shutil, subprocess, distutils.dir_util +import time, sys, os, shutil, subprocess, distutils.dir_util, argparse sys.path.append("../configuration") +parser = argparse.ArgumentParser() +parser.add_argument('--includeprocess', '-ipc', nargs='+') +parser.add_argument('--excludeprocess', '-epc', nargs='+') +args = parser.parse_args() + if os.path.isfile("log.log"): os.remove("log.log") log = open("log.log", "w") @@ -45,20 +50,24 @@ printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) printLog(log, "") # For each process for processName in ProcessToComplete: - os.chdir(processName) - try: - subprocess.call([ "python", "2_build.py" ]) - except Exception, e: - printLog(log, "<" + processName + "> " + str(e)) - os.chdir("..") - try: - processLog = open(processName + "/log.log", "r") - processLogData = processLog.read() - processLog.close() - log.write(processLogData) - except Exception, e: - printLog(log, "<" + processName + "> " + str(e)) - # subprocess.call("idle.bat") + if ((args.includeprocess == None or processName in args.includeprocess) and (args.excludeprocess == None or not processName in args.excludeprocess)): + printLog(log, "PROCESS " + processName) + os.chdir(processName) + try: + subprocess.call([ "python", "2_build.py" ]) + except Exception, e: + printLog(log, "<" + processName + "> " + str(e)) + os.chdir("..") + try: + processLog = open(processName + "/log.log", "r") + processLogData = processLog.read() + processLog.close() + log.write(processLogData) + except Exception, e: + printLog(log, "<" + processName + "> " + str(e)) + # subprocess.call("idle.bat") + else: + printLog(log, "IGNORE PROCESS " + processName) printLog(log, "") log.close() diff --git a/code/nel/tools/build_gamedata/processes/3_install.py b/code/nel/tools/build_gamedata/processes/3_install.py index fe51c0772..89bf53660 100644 --- a/code/nel/tools/build_gamedata/processes/3_install.py +++ b/code/nel/tools/build_gamedata/processes/3_install.py @@ -24,9 +24,14 @@ # along with this program. If not, see . # -import time, sys, os, shutil, subprocess, distutils.dir_util +import time, sys, os, shutil, subprocess, distutils.dir_util, argparse sys.path.append("../configuration") +parser = argparse.ArgumentParser() +parser.add_argument('--includeprocess', '-ipc', nargs='+') +parser.add_argument('--excludeprocess', '-epc', nargs='+') +args = parser.parse_args() + if os.path.isfile("log.log"): os.remove("log.log") log = open("log.log", "w") @@ -44,20 +49,24 @@ printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) printLog(log, "") # For each process for processName in ProcessToComplete: - os.chdir(processName) - try: - subprocess.call([ "python", "3_install.py" ]) - except Exception, e: - printLog(log, "<" + processName + "> " + str(e)) - os.chdir("..") - try: - processLog = open(processName + "/log.log", "r") - processLogData = processLog.read() - processLog.close() - log.write(processLogData) - except Exception, e: - printLog(log, "<" + processName + "> " + str(e)) - # subprocess.call("idle.bat") + if ((args.includeprocess == None or processName in args.includeprocess) and (args.excludeprocess == None or not processName in args.excludeprocess)): + printLog(log, "PROCESS " + processName) + os.chdir(processName) + try: + subprocess.call([ "python", "3_install.py" ]) + except Exception, e: + printLog(log, "<" + processName + "> " + str(e)) + os.chdir("..") + try: + processLog = open(processName + "/log.log", "r") + processLogData = processLog.read() + processLog.close() + log.write(processLogData) + except Exception, e: + printLog(log, "<" + processName + "> " + str(e)) + # subprocess.call("idle.bat") + else: + printLog(log, "IGNORE PROCESS " + processName) printLog(log, "") log.close() diff --git a/code/nel/tools/build_gamedata/processes/anim/1_export.py b/code/nel/tools/build_gamedata/processes/anim/1_export.py index 3bdd5e028..5d5fe4b84 100644 --- a/code/nel/tools/build_gamedata/processes/anim/1_export.py +++ b/code/nel/tools/build_gamedata/processes/anim/1_export.py @@ -6,7 +6,7 @@ # # \file 1_export.py # \brief Export anim -# \date 2010-09-26-08-38-GMT +# \date 2011-09-21-20-51-GMT # \author Jan Boon (Kaetemi) # Python port of game data build pipeline. # Export anim diff --git a/code/nel/tools/build_gamedata/processes/anim/maxscript/anim_export.ms b/code/nel/tools/build_gamedata/processes/anim/maxscript/anim_export.ms index 86d02fd15..7121e16d5 100644 --- a/code/nel/tools/build_gamedata/processes/anim/maxscript/anim_export.ms +++ b/code/nel/tools/build_gamedata/processes/anim/maxscript/anim_export.ms @@ -224,7 +224,9 @@ try catch ( -- Error - nlerror("ERROR fatal error exporting 'anim' in folder %MaxSourceDirectory%") + nlerror("ERROR Fatal error exporting 'anim' in folder %MaxSourceDirectory%") + nlerror("FAIL Fatal error occured") + NelForceQuitRightNow() removeRunningTag = false ) diff --git a/code/nel/tools/build_gamedata/processes/clodbank/1_export.py b/code/nel/tools/build_gamedata/processes/clodbank/1_export.py index a9f6cf7c1..183307e30 100644 --- a/code/nel/tools/build_gamedata/processes/clodbank/1_export.py +++ b/code/nel/tools/build_gamedata/processes/clodbank/1_export.py @@ -6,7 +6,7 @@ # # \file 1_export.py # \brief Export clodbank -# \date 2010-09-26-08-38-GMT +# \date 2011-09-21-20-51-GMT # \author Jan Boon (Kaetemi) # Python port of game data build pipeline. # Export clodbank diff --git a/code/nel/tools/build_gamedata/processes/clodbank/maxscript/clod_export.ms b/code/nel/tools/build_gamedata/processes/clodbank/maxscript/clod_export.ms index 1ab3ce7e2..f01a973e4 100644 --- a/code/nel/tools/build_gamedata/processes/clodbank/maxscript/clod_export.ms +++ b/code/nel/tools/build_gamedata/processes/clodbank/maxscript/clod_export.ms @@ -279,7 +279,9 @@ try catch ( -- Error - nlerror("ERROR fatal error exporting 'clod' in folder %MaxSourceDirectory%") + nlerror("ERROR Fatal error exporting 'clod' in folder %MaxSourceDirectory%") + nlerror("FAIL Fatal error occured") + NelForceQuitRightNow() removeRunningTag = false ) diff --git a/code/nel/tools/build_gamedata/processes/ig/maxscript/ig_export.ms b/code/nel/tools/build_gamedata/processes/ig/maxscript/ig_export.ms index 5618a68d9..526d06dc8 100644 --- a/code/nel/tools/build_gamedata/processes/ig/maxscript/ig_export.ms +++ b/code/nel/tools/build_gamedata/processes/ig/maxscript/ig_export.ms @@ -328,7 +328,9 @@ try catch ( -- Error - nlerror("ERROR fatal error exporting 'ig' in folder %MaxSourceDirectory%") + nlerror("ERROR Fatal error exporting 'ig' in folder %MaxSourceDirectory%") + nlerror("FAIL Fatal error occured") + NelForceQuitRightNow() removeRunningTag = false ) diff --git a/code/nel/tools/build_gamedata/processes/pacs_prim/1_export.py b/code/nel/tools/build_gamedata/processes/pacs_prim/1_export.py index 5779a8cd7..e21fb4fde 100644 --- a/code/nel/tools/build_gamedata/processes/pacs_prim/1_export.py +++ b/code/nel/tools/build_gamedata/processes/pacs_prim/1_export.py @@ -6,7 +6,7 @@ # # \file 1_export.py # \brief Export pacs_prim -# \date 2010-09-19-14-19-GMT +# \date 2011-09-28-07-42-GMT # \author Jan Boon (Kaetemi) # Python port of game data build pipeline. # Export pacs_prim @@ -92,19 +92,10 @@ if MaxAvailable: -printLog(log, ">>> List pacs_prim <<<") -outDirPacsPrim = ExportBuildDirectory + "/" + PacsPrimExportDirectory -mkPath(log, outDirPacsPrim) +# Remove bad file from previous script version listPath = ExportBuildDirectory + "/" + PacsPrimExportDirectory + "/landscape_col_prim_pacs_list.txt" if os.path.isfile(listPath): os.remove(listPath) -if WantLandscapeColPrimPacsList: - exportedPacsPrims = findFiles(log, outDirPacsPrim, "", ".pacs_prim") - printLog(log, "WRITE " + listPath) - listFile = open(listPath, "w") - for exported in exportedPacsPrims: - listFile.write(exported + "\n") - listFile.close() diff --git a/code/nel/tools/build_gamedata/processes/pacs_prim_list/0_setup.py b/code/nel/tools/build_gamedata/processes/pacs_prim_list/0_setup.py new file mode 100644 index 000000000..0fad037bb --- /dev/null +++ b/code/nel/tools/build_gamedata/processes/pacs_prim_list/0_setup.py @@ -0,0 +1,58 @@ +#!/usr/bin/python +# +# \file 0_setup.py +# \brief setup pacs_prim_list +# \date 2011-09-28 7:22GMT +# \author Jan Boon (Kaetemi) +# Python port of game data build pipeline. +# Setup pacs_prim_list +# +# NeL - MMORPG Framework +# Copyright (C) 2010 Winch Gate Property Limited +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import time, sys, os, shutil, subprocess, distutils.dir_util +sys.path.append("../../configuration") + +if os.path.isfile("log.log"): + os.remove("log.log") +log = open("log.log", "w") +from scripts import * +from buildsite import * +from process import * +from tools import * +from directories import * + +printLog(log, "") +printLog(log, "-------") +printLog(log, "--- Setup pacs_prim_list") +printLog(log, "-------") +printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) +printLog(log, "") + +# Setup source directories +printLog(log, ">>> Setup source directories <<<") +for dir in PacsPrimExportSourceDirectories: + mkPath(log, ExportBuildDirectory + "/" + dir) + +# Setup build directories +printLog(log, ">>> Setup build directories <<<") +mkPath(log, DataCommonDirectory) # no choice + +log.close() + + +# end of file diff --git a/code/nel/tools/build_gamedata/processes/pacs_prim_list/1_export.py b/code/nel/tools/build_gamedata/processes/pacs_prim_list/1_export.py new file mode 100644 index 000000000..1126f23a1 --- /dev/null +++ b/code/nel/tools/build_gamedata/processes/pacs_prim_list/1_export.py @@ -0,0 +1,53 @@ +#!/usr/bin/python +# +# \file 1_export.py +# \brief Export pacs_prim_list +# \date 2011-09-28 7:22GMT +# \author Jan Boon (Kaetemi) +# Python port of game data build pipeline. +# Export pacs_prim_list +# +# NeL - MMORPG Framework +# Copyright (C) 2010 Winch Gate Property Limited +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import time, sys, os, shutil, subprocess, distutils.dir_util +sys.path.append("../../configuration") + +if os.path.isfile("log.log"): + os.remove("log.log") +log = open("log.log", "w") +from scripts import * +from buildsite import * +from process import * +from tools import * +from directories import * + +printLog(log, "") +printLog(log, "-------") +printLog(log, "--- Export pacs_prim_list") +printLog(log, "-------") +printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) +printLog(log, "") + +printLog(log, ">>> Nothing to do! <<<") + +printLog(log, "") + +log.close() + + +# end of file diff --git a/code/nel/tools/build_gamedata/processes/pacs_prim_list/2_build.py b/code/nel/tools/build_gamedata/processes/pacs_prim_list/2_build.py new file mode 100644 index 000000000..9b5d52541 --- /dev/null +++ b/code/nel/tools/build_gamedata/processes/pacs_prim_list/2_build.py @@ -0,0 +1,63 @@ +#!/usr/bin/python +# +# \file 2_build.py +# \brief Build pacs_prim_list +# \date 2011-09-28 7:22GMT +# \author Jan Boon (Kaetemi) +# Python port of game data build pipeline. +# Build pacs_prim_list +# +# NeL - MMORPG Framework +# Copyright (C) 2010 Winch Gate Property Limited +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import time, sys, os, shutil, subprocess, distutils.dir_util +sys.path.append("../../configuration") + +if os.path.isfile("log.log"): + os.remove("log.log") +log = open("log.log", "w") +from scripts import * +from buildsite import * +from process import * +from tools import * +from directories import * + +printLog(log, "") +printLog(log, "-------") +printLog(log, "--- Build pacs_prim_list") +printLog(log, "-------") +printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) +printLog(log, "") + +printLog(log, ">>> List pacs_prim <<<") +listPath = DataCommonDirectory + "/landscape_col_prim_pacs_list.txt" +if os.path.isfile(listPath): + os.remove(listPath) +listFile = open(listPath, "w") +printLog(log, "WRITE " + listPath) +for dir in PacsPrimExportSourceDirectories: + outDirPacsPrim = ExportBuildDirectory + "/" + dir + mkPath(log, outDirPacsPrim) + exportedPacsPrims = findFiles(log, outDirPacsPrim, "", ".pacs_prim") + for exported in exportedPacsPrims: + listFile.write(exported + "\n") +listFile.close() + +log.close() + + +# end of file diff --git a/code/nel/tools/build_gamedata/processes/pacs_prim_list/3_install.py b/code/nel/tools/build_gamedata/processes/pacs_prim_list/3_install.py new file mode 100644 index 000000000..076f92efa --- /dev/null +++ b/code/nel/tools/build_gamedata/processes/pacs_prim_list/3_install.py @@ -0,0 +1,52 @@ +#!/usr/bin/python +# +# \file 3_install.py +# \brief Install pacs_prim_list +# \date 2011-09-28 7:22GMT +# \author Jan Boon (Kaetemi) +# Python port of game data build pipeline. +# Install pacs_prim_list +# +# NeL - MMORPG Framework +# Copyright (C) 2010 Winch Gate Property Limited +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# + +import time, sys, os, shutil, subprocess, distutils.dir_util +sys.path.append("../../configuration") + +if os.path.isfile("log.log"): + os.remove("log.log") +log = open("log.log", "w") +from scripts import * +from buildsite import * +from process import * +from tools import * +from directories import * + +printLog(log, "") +printLog(log, "-------") +printLog(log, "--- Install pacs_prim_list") +printLog(log, "-------") +printLog(log, time.strftime("%Y-%m-%d %H:%MGMT", time.gmtime(time.time()))) +printLog(log, "") + +printLog(log, ">>> Nothing to do! <<<") + +printLog(log, "") +log.close() + + +# end of file diff --git a/code/nel/tools/build_gamedata/processes/rbank/1_export.py b/code/nel/tools/build_gamedata/processes/rbank/1_export.py index de32ae841..20c7aa54d 100644 --- a/code/nel/tools/build_gamedata/processes/rbank/1_export.py +++ b/code/nel/tools/build_gamedata/processes/rbank/1_export.py @@ -6,7 +6,7 @@ # # \file 1_export.py # \brief Export rbank -# \date 2010-09-26-08-38-GMT +# \date 2011-09-21-20-51-GMT # \author Jan Boon (Kaetemi) # Python port of game data build pipeline. # Export rbank diff --git a/code/nel/tools/build_gamedata/processes/rbank/maxscript/cmb_export.ms b/code/nel/tools/build_gamedata/processes/rbank/maxscript/cmb_export.ms index c60a675d0..74cf3a8dd 100644 --- a/code/nel/tools/build_gamedata/processes/rbank/maxscript/cmb_export.ms +++ b/code/nel/tools/build_gamedata/processes/rbank/maxscript/cmb_export.ms @@ -215,7 +215,9 @@ try catch ( -- Error - nlerror("ERROR fatal error exporting 'cmb' in folder %MaxSourceDirectory%") + nlerror("ERROR Fatal error exporting 'cmb' in folder %MaxSourceDirectory%") + nlerror("FAIL Fatal error occured") + NelForceQuitRightNow() removeRunningTag = false ) diff --git a/code/nel/tools/build_gamedata/processes/shape/maxscript/shape_export.ms b/code/nel/tools/build_gamedata/processes/shape/maxscript/shape_export.ms index 06a02bcbb..e979f6b0d 100644 --- a/code/nel/tools/build_gamedata/processes/shape/maxscript/shape_export.ms +++ b/code/nel/tools/build_gamedata/processes/shape/maxscript/shape_export.ms @@ -253,7 +253,7 @@ fn haveCoarseMesh node = return false ) -fn runNelMaxExport inputMaxFile = +fn runNelMaxExportSub inputMaxFile retryCount = ( tagThisFile = false @@ -420,11 +420,42 @@ fn runNelMaxExport inputMaxFile = ( -- Error nlerror("WARNING no shape exported from the file " + inputMaxFile) + if tagThisFile then + ( + if retryCount < 2 then + ( + nlerror("INFO retry this file") + + -- Free memory and file handles + gc() + heapfree + + -- Reset 3dsmax + resetMAXFile #noprompt + + if (loadMaxFile inputMaxFile quiet:true) == true then + ( + tagThisFile = runNelMaxExportSub inputMaxFile (retryCount + 1) + ) + else + ( + -- Error + nlerror("ERROR exporting 'shape': can't open the file " + inputMaxFile) + nlerror("FAIL Mysterious error occured") + NelForceQuitRightNow() + ) + ) + ) ) return tagThisFile ) +fn runNelMaxExport inputMaxFile = +( + return runNelMaxExportSub inputMaxFile 0 +) + removeRunningTag = true @@ -517,7 +548,9 @@ try catch ( -- Error - nlerror("ERROR fatal error exporting 'shape' in folder %MaxSourceDirectory%") + nlerror("ERROR Fatal error exporting 'shape' in folder %MaxSourceDirectory%") + nlerror("FAIL Fatal error occured") + NelForceQuitRightNow() removeRunningTag = false ) diff --git a/code/nel/tools/build_gamedata/processes/sheet_id/2_build.py b/code/nel/tools/build_gamedata/processes/sheet_id/2_build.py index f935a4500..64b46c91f 100644 --- a/code/nel/tools/build_gamedata/processes/sheet_id/2_build.py +++ b/code/nel/tools/build_gamedata/processes/sheet_id/2_build.py @@ -54,7 +54,7 @@ if MakeSheetId == "": else: mkPath(log, LeveldesignDirectory) mkPath(log, LeveldesignWorldDirectory) - subprocess.call([ MakeSheetId, "-o" + LeveldesignDirectory + "/game_elem/sheet_id.bin", LeveldesignDirectory + "/game_elem", LeveldesignDirectory + "/game_element", LeveldesignWorldDirectory ]) + subprocess.call([ MakeSheetId, "-o" + LeveldesignDirectory + "/game_elem/sheet_id.bin", LeveldesignDirectory + "/game_elem", LeveldesignDirectory + "/game_element", LeveldesignWorldDirectory, DataShardDirectory + "mirror_sheets" ]) printLog(log, "") log.close() diff --git a/code/nel/tools/build_gamedata/processes/sheets/2_build.py b/code/nel/tools/build_gamedata/processes/sheets/2_build.py index 511b05004..40d7774c3 100644 --- a/code/nel/tools/build_gamedata/processes/sheets/2_build.py +++ b/code/nel/tools/build_gamedata/processes/sheets/2_build.py @@ -77,6 +77,8 @@ else: cf.write("\n") cf.close() subprocess.call([ SheetsPacker ]) + copyFileIfNeeded(log, "visual_slot.tab", DataCommonDirectory + "/visual_slot.tab") + os.remove("visual_slot.tab") printLog(log, "") log.close() diff --git a/code/nel/tools/build_gamedata/processes/sheets/3_install.py b/code/nel/tools/build_gamedata/processes/sheets/3_install.py index 98b5cb825..f4093b12e 100644 --- a/code/nel/tools/build_gamedata/processes/sheets/3_install.py +++ b/code/nel/tools/build_gamedata/processes/sheets/3_install.py @@ -49,6 +49,7 @@ mkPath(log, installPath) printLog(log, ">>> Install sheets <<<") mkPath(log, ExportBuildDirectory + "/" + SheetsBuildDirectory) copyFilesExtNoTreeIfNeeded(log, ExportBuildDirectory + "/" + SheetsBuildDirectory, installPath, ".packed_sheets") +copyFilesExtNoTreeIfNeeded(log, ExportBuildDirectory + "/" + SheetsBuildDirectory, installPath, ".packed") printLog(log, "") log.close() diff --git a/code/nel/tools/build_gamedata/processes/skel/1_export.py b/code/nel/tools/build_gamedata/processes/skel/1_export.py index af73024c5..84e9ce931 100644 --- a/code/nel/tools/build_gamedata/processes/skel/1_export.py +++ b/code/nel/tools/build_gamedata/processes/skel/1_export.py @@ -6,7 +6,7 @@ # # \file 1_export.py # \brief Export skel -# \date 2010-09-19-14-19-GMT +# \date 2011-09-28-07-42-GMT # \author Jan Boon (Kaetemi) # Python port of game data build pipeline. # Export skel diff --git a/code/nel/tools/build_gamedata/processes/swt/1_export.py b/code/nel/tools/build_gamedata/processes/swt/1_export.py index 3b8da1d0f..6ad3c8f13 100644 --- a/code/nel/tools/build_gamedata/processes/swt/1_export.py +++ b/code/nel/tools/build_gamedata/processes/swt/1_export.py @@ -6,7 +6,7 @@ # # \file 1_export.py # \brief Export swt -# \date 2010-09-19-14-19-GMT +# \date 2011-09-28-07-42-GMT # \author Jan Boon (Kaetemi) # Python port of game data build pipeline. # Export swt diff --git a/code/nel/tools/build_gamedata/processes/veget/1_export.py b/code/nel/tools/build_gamedata/processes/veget/1_export.py index 61e33ea74..e6d2c53cc 100644 --- a/code/nel/tools/build_gamedata/processes/veget/1_export.py +++ b/code/nel/tools/build_gamedata/processes/veget/1_export.py @@ -6,7 +6,7 @@ # # \file 1_export.py # \brief Export veget -# \date 2010-09-26-08-38-GMT +# \date 2011-09-21-20-51-GMT # \author Jan Boon (Kaetemi) # Python port of game data build pipeline. # Export veget diff --git a/code/nel/tools/build_gamedata/processes/veget/maxscript/veget_export.ms b/code/nel/tools/build_gamedata/processes/veget/maxscript/veget_export.ms index 4390e5cca..828a78d42 100644 --- a/code/nel/tools/build_gamedata/processes/veget/maxscript/veget_export.ms +++ b/code/nel/tools/build_gamedata/processes/veget/maxscript/veget_export.ms @@ -269,7 +269,9 @@ try catch ( -- Error - nlerror("ERROR fatal error exporting 'veget' in folder %MaxSourceDirectory%") + nlerror("ERROR Fatal error exporting 'veget' in folder %MaxSourceDirectory%") + nlerror("FAIL Fatal error occured") + NelForceQuitRightNow() removeRunningTag = false ) diff --git a/code/nel/tools/build_gamedata/processes/zone/1_export.py b/code/nel/tools/build_gamedata/processes/zone/1_export.py index 8b34753c9..d464e3f31 100644 --- a/code/nel/tools/build_gamedata/processes/zone/1_export.py +++ b/code/nel/tools/build_gamedata/processes/zone/1_export.py @@ -6,7 +6,7 @@ # # \file 1_export.py # \brief Export zone -# \date 2010-09-19-14-19-GMT +# \date 2011-09-28-07-42-GMT # \author Jan Boon (Kaetemi) # Python port of game data build pipeline. # Export zone diff --git a/code/nel/tools/misc/Makefile.am b/code/nel/tools/misc/Makefile.am deleted file mode 100644 index deb976b76..000000000 --- a/code/nel/tools/misc/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ -# -# $Id: Makefile.am,v 1.2 2002-05-14 13:33:59 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -SUBDIRS = bnp_make \ - disp_sheet_id \ - make_sheet_id \ - xml_packer - -# End of Makefile.am - diff --git a/code/nel/tools/misc/bnp_make/Makefile.am b/code/nel/tools/misc/bnp_make/Makefile.am deleted file mode 100644 index bdd7c4ad0..000000000 --- a/code/nel/tools/misc/bnp_make/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2002-05-13 15:44:57 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = bnp_make.dsw bnp_make.dsp bnp_make_8.vcproj - -bin_PROGRAMS = bnp_make - -bnp_make_SOURCES = main.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src - -bnp_make_LDADD = ../../../src/misc/libnelmisc.la - - -# End of Makefile.am - diff --git a/code/nel/tools/misc/disp_sheet_id/Makefile.am b/code/nel/tools/misc/disp_sheet_id/Makefile.am deleted file mode 100644 index 10fa02c10..000000000 --- a/code/nel/tools/misc/disp_sheet_id/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2002-05-13 15:44:57 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = disp_sheet_id.dsp disp_sheet_id_8.vcproj disp_sheet_id.dsw disp_sheet_id.sln disp_sheet_id.vcproj - -bin_PROGRAMS = disp_sheet_id - -disp_sheet_id_SOURCES = main.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src - -disp_sheet_id_LDADD = ../../../src/misc/libnelmisc.la - - -# End of Makefile.am - diff --git a/code/nel/tools/misc/make_sheet_id/Makefile.am b/code/nel/tools/misc/make_sheet_id/Makefile.am deleted file mode 100644 index 37e8c7ee7..000000000 --- a/code/nel/tools/misc/make_sheet_id/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2002-05-13 15:44:57 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = make_sheet_id.dsp make_sheet_id.dsw - -bin_PROGRAMS = make_sheet_id - -make_sheet_id_SOURCES = make_sheet_id.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src - -make_sheet_id_LDADD = ../../../src/misc/libnelmisc.la - - -# End of Makefile.am - diff --git a/code/nel/tools/misc/xml_packer/Makefile.am b/code/nel/tools/misc/xml_packer/Makefile.am deleted file mode 100644 index 80c40b6ea..000000000 --- a/code/nel/tools/misc/xml_packer/Makefile.am +++ /dev/null @@ -1,18 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2002-05-13 15:44:57 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = xml_packer.dsp - -bin_PROGRAMS = xml_packer - -xml_packer_SOURCES = xml_packer.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src - -xml_packer_LDADD = ../../../src/misc/libnelmisc.la - -# End of Makefile.am - diff --git a/code/nel/tools/pacs/Makefile.am b/code/nel/tools/pacs/Makefile.am deleted file mode 100644 index e987c21e2..000000000 --- a/code/nel/tools/pacs/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -# -# $Id: Makefile.am,v 1.2 2002-05-14 13:33:59 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -SUBDIRS = build_ig_boxes build_indoor_rbank build_rbank - -# End of Makefile.am - diff --git a/code/nel/tools/pacs/build_ig_boxes/Makefile.am b/code/nel/tools/pacs/build_ig_boxes/Makefile.am deleted file mode 100644 index e10aa1312..000000000 --- a/code/nel/tools/pacs/build_ig_boxes/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2002-05-13 15:44:57 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = build_ig_boxes.dsp - -bin_PROGRAMS = build_ig_boxes - -build_ig_boxes_SOURCES = main.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src - -build_ig_boxes_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/3d/libnel3d.la \ - ../../../src/pacs/libnelpacs.la - - -# End of Makefile.am - diff --git a/code/nel/tools/pacs/build_indoor_rbank/Makefile.am b/code/nel/tools/pacs/build_indoor_rbank/Makefile.am deleted file mode 100644 index cc116a336..000000000 --- a/code/nel/tools/pacs/build_indoor_rbank/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2002-05-13 15:44:57 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = build_indoor_rbank.dsp - -bin_PROGRAMS = build_indoor_rbank - -build_indoor_rbank_SOURCES = build_surfaces.cpp main.cpp mouline.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src - -build_indoor_rbank_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/pacs/libnelpacs.la - - -# End of Makefile.am - diff --git a/code/nel/tools/pacs/build_rbank/Makefile.am b/code/nel/tools/pacs/build_rbank/Makefile.am deleted file mode 100644 index 17b299997..000000000 --- a/code/nel/tools/pacs/build_rbank/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -# -# $Id: Makefile.am,v 1.1 2002-05-13 15:44:57 valignat Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = build_rbank.dsp - -bin_PROGRAMS = build_rbank - -build_rbank_SOURCES = build_rbank.cpp build_surf.cpp main.cpp prim_checker.cpp \ - surface_splitter.cpp - -AM_CXXFLAGS = -I$(top_srcdir)/src - -build_rbank_LDADD = ../../../src/misc/libnelmisc.la \ - ../../../src/pacs/libnelpacs.la \ - ../../../src/ligo/libnelligo.la \ - ../../../src/3d/libnel3d.la - - -# End of Makefile.am - diff --git a/code/nel/tools/sound/CMakeLists.txt b/code/nel/tools/sound/CMakeLists.txt index d3f5a12fa..a5d44bb50 100644 --- a/code/nel/tools/sound/CMakeLists.txt +++ b/code/nel/tools/sound/CMakeLists.txt @@ -1 +1,6 @@ +ADD_SUBDIRECTORY(build_samplebank) +ADD_SUBDIRECTORY(build_sound) +ADD_SUBDIRECTORY(build_soundbank) +# Deprecated tool - no longer useful, valid or buildable. +#ADD_SUBDIRECTORY(source_sounds_builder) diff --git a/code/nel/tools/sound/build_samplebank/CMakeLists.txt b/code/nel/tools/sound/build_samplebank/CMakeLists.txt new file mode 100644 index 000000000..b94d4d1bf --- /dev/null +++ b/code/nel/tools/sound/build_samplebank/CMakeLists.txt @@ -0,0 +1,13 @@ +FILE(GLOB SRC *.cpp *.h) + +ADD_EXECUTABLE(build_samplebank ${SRC}) + +ADD_DEFINITIONS( ${LIBXML2_DEFINITIONS}) + +INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR}) + +TARGET_LINK_LIBRARIES(build_samplebank nelmisc nelsound) +NL_DEFAULT_PROPS(build_samplebank "NeL, Tools, Sound: build_samplebank") +NL_ADD_RUNTIME_FLAGS(build_samplebank) + +INSTALL(TARGETS build_samplebank RUNTIME DESTINATION bin COMPONENT toolssound) diff --git a/code/nel/tools/sound/build_sound/CMakeLists.txt b/code/nel/tools/sound/build_sound/CMakeLists.txt new file mode 100644 index 000000000..5cf651e42 --- /dev/null +++ b/code/nel/tools/sound/build_sound/CMakeLists.txt @@ -0,0 +1,13 @@ +FILE(GLOB SRC *.cpp *.h) + +ADD_EXECUTABLE(build_sound ${SRC}) + +ADD_DEFINITIONS( ${LIBXML2_DEFINITIONS}) + +INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR}) + +TARGET_LINK_LIBRARIES(build_sound nelmisc nelsound) +NL_DEFAULT_PROPS(build_sound "NeL, Tools, Sound: build_sound") +NL_ADD_RUNTIME_FLAGS(build_sound) + +INSTALL(TARGETS build_sound RUNTIME DESTINATION bin COMPONENT toolssound) diff --git a/code/nel/tools/sound/build_soundbank/CMakeLists.txt b/code/nel/tools/sound/build_soundbank/CMakeLists.txt new file mode 100644 index 000000000..a9f556280 --- /dev/null +++ b/code/nel/tools/sound/build_soundbank/CMakeLists.txt @@ -0,0 +1,13 @@ +FILE(GLOB SRC *.cpp *.h) + +ADD_EXECUTABLE(build_soundbank ${SRC}) + +ADD_DEFINITIONS( ${LIBXML2_DEFINITIONS}) + +INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR}) + +TARGET_LINK_LIBRARIES(build_soundbank nelmisc nelsound) +NL_DEFAULT_PROPS(build_soundbank "NeL, Tools, Sound: build_soundbank") +NL_ADD_RUNTIME_FLAGS(build_soundbank) + +INSTALL(TARGETS build_soundbank RUNTIME DESTINATION bin COMPONENT toolssound) diff --git a/code/nelns/CMakeLists.txt b/code/nelns/CMakeLists.txt index 9a8402fac..63916ba08 100644 --- a/code/nelns/CMakeLists.txt +++ b/code/nelns/CMakeLists.txt @@ -1,14 +1,14 @@ -FIND_PACKAGE(MySQL) -FIND_PACKAGE(CURL) - -IF(BUILD_SERVICES) - ADD_SUBDIRECTORY(admin_executor_service) - ADD_SUBDIRECTORY(admin_service) - ADD_SUBDIRECTORY(naming_service) - ADD_SUBDIRECTORY(login_service) - ADD_SUBDIRECTORY(welcome_service) -ENDIF(BUILD_SERVICES) - -IF(BUILD_LOGIN_SYSTEM) - ADD_SUBDIRECTORY(login_system) -ENDIF(BUILD_LOGIN_SYSTEM) +FIND_PACKAGE(MySQL) +FIND_PACKAGE(CURL) + +IF(WITH_NELNS_SERVER) + ADD_SUBDIRECTORY(admin_executor_service) + ADD_SUBDIRECTORY(admin_service) + ADD_SUBDIRECTORY(naming_service) + ADD_SUBDIRECTORY(login_service) + ADD_SUBDIRECTORY(welcome_service) +ENDIF(WITH_NELNS_SERVER) + +IF(WITH_NELNS_LOGIN_SYSTEM) + ADD_SUBDIRECTORY(login_system) +ENDIF(WITH_NELNS_LOGIN_SYSTEM) diff --git a/code/nelns/Makefile.am b/code/nelns/Makefile.am deleted file mode 100644 index 0bf41acd3..000000000 --- a/code/nelns/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -# -# $Id: Makefile.am,v 1.9 2002/10/21 10:19:03 lecroart Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in configure config.guess missing \ - config.sub ltconfig aclocal.m4 config.h.in \ - install-sh mkinstalldirs depcomp $(DISTCLEANFILES) - -DISTCLEANFILES = stamp-h.in config.cache config.log config.status - -EXTRA_DIST = acconfig.h services.dsw bootstrap doc - -SUBDIRS = login_service \ - naming_service \ - admin_executor_service \ - admin_service \ - welcome_service - -dist-hook: - find $(distdir) -name CVS -print | xargs rm -fr - find $(distdir) -name .svn -print | xargs rm -fr - -# End of Makefile.am diff --git a/code/nelns/acinclude.m4 b/code/nelns/acinclude.m4 deleted file mode 100644 index 3c49b8f0b..000000000 --- a/code/nelns/acinclude.m4 +++ /dev/null @@ -1,1217 +0,0 @@ -# ========================================================================= -# -# Macros used by Nevrax in configure.in files. -# -# $Id: acinclude.m4,v 1.20 2005/04/04 10:07:29 cado Exp $ -# -# ========================================================================= - -# ========================================================================= -# WARNING: The original version of this file is placed in the $CVSROOT/code -# directory. -# There is links in the $CVSROOT/code sub-directories to that file -# (ex: $CVSROOT/code/nel), so be careful of the consequences of -# any modification of that file. -# ========================================================================= - -# ========================================================================= -# Macros available in that file. -# -# -# AM_NEL_DEBUG -# -# Option: none. -# Description: manage the different debug and the release mode by setting -# correctly the CFLAGS and CXXFLAGS variables. -# -# -# AM_PATH_NEL -# -# Option: none. -# Description: check the instalation of the NeL library and set the -# CXXFLAGS and LIBS variables to use it. -# -# -# AM_PATH_OPENGL -# -# Option: "yes" if the use of the OpenGL library is mandatory. -# Description: check the instalation of the OpenGL library and set the -# OPENGL_CFLAGS and OPENGL_LIBS variables to use it. -# -# -# AM_PATH_FREETYPE -# -# Option: "yes" if the use of the Freetype library is mandatory. -# Description: check the instalation of the OpenGL library and set the -# FREETYPE_CFLAGS and FREETYPE_LIBS variables to use it. -# -# -# AM_PATH_XF86VIDMODE -# -# Option: none. -# Description: check the instalation of the OpenGL library and set the -# XF86VIDMODE_CFLAGS and XF86VIDMODE_LIBS variables to use it. -# -# -# AM_PATH_OPENAL -# -# Option: "yes" if the use of the OpenAL library is mandatory. -# Description: check the instalation of the OpenGL library and set the -# OPENAL_CFLAGS and OPENAL_LIBS variables to use it. -# -# -# AM_PATH_PYTHON -# -# Option: "yes" if the use of the Python library is mandatory. -# Description: check the instalation of the OpenGL library and set the -# PYTHON_CFLAGS and PYTHON_LIBS variables to use it. -# -# ========================================================================= - - -# ========================================================================= -# AM_NEL_DEBUG - -AC_DEFUN([AM_NEL_DEBUG], -[ - -MAX_C_OPTIMIZE="-O6" - -STL_DEBUG="-D__STL_DEBUG" - -NL_DEBUG="-DNL_DEBUG" -NL_RELEASE="-DNL_RELEASE" - -AC_ARG_WITH(debug, - [ --with-debug[=full|medium|fast] - Build a debug version (huge libraries). - Full mode set only NeL and STL debug flags. - Medium mode set NeL debug flags with inline - optimization (default mode). - Fast mode is like the Medium mode with some basic - optimization. - --without-debug Build without debugging code (default)], - [with_debug=$withval], - [with_debug=no]) - -# Build optimized or debug version ? -# First check for gcc and g++ -if test "$ac_cv_prog_gcc" = "yes" -then - DEBUG_CFLAGS="-g" - DEBUG_OPTIMIZE_CC="-O" - OPTIMIZE_CFLAGS="$MAX_C_OPTIMIZE" -else - DEBUG_CFLAGS="-g" - DEBUG_OPTIMIZE_CC="" - OPTIMIZE_CFLAGS="" -fi - -if test "$ac_cv_prog_cxx_g" = "yes" -then - DEBUG_CXXFLAGS="-g" - DEBUG_OPTIMIZE_CXX="-O" - OPTIMIZE_CXXFLAGS="-O3" - OPTIMIZE_INLINE_CXXFLAGS="-finline-functions" -else - DEBUG_CXXFLAGS="-g" - DEBUG_OPTIMIZE_CXX="" - OPTIMIZE_CXXFLAGS="" - OPTIMIZE_INLINE_CXXFLAGS="" -fi - -if test "$with_debug" = "yes" -o "$with_debug" = "medium" -then - # Medium debug. Inline optimization - CFLAGS="$DEBUG_CFLAGS $OPTIMIZE_INLINE_CFLAGS $NL_DEBUG $CFLAGS" - CXXFLAGS="$DEBUG_CXXFLAGS $OPTIMIZE_INLINE_CXXFLAGS $NL_DEBUG $CXXFLAGS" -else - if test "$with_debug" = "full" - then - # Full debug. Very slow in some cases - CFLAGS="$DEBUG_CFLAGS $NL_DEBUG $STL_DEBUG $CFLAGS" - CXXFLAGS="$DEBUG_CXXFLAGS $NL_DEBUG $STL_DEBUG $CXXFLAGS" - else - if test "$with_debug" = "fast" - then - # Fast debug. - CFLAGS="$DEBUG_CFLAGS $DEBUG_OPTIMIZE_CC $OPTIMIZE_INLINE_CFLAGS $NL_DEBUG $CFLAGS" - CXXFLAGS="$DEBUG_CXXFLAGS $DEBUG_OPTIMIZE_CXX $OPTIMIZE_INLINE_CXXFLAGS $NL_DEBUG $CXXFLAGS" - else - # Optimized version. No debug - CFLAGS="$OPTIMIZE_CFLAGS $NL_RELEASE $CFLAGS" - CXXFLAGS="$OPTIMIZE_CXXFLAGS $NL_RELEASE $CXXFLAGS" - fi - fi -fi - -# AC_MSG_RESULT([CFLAGS = $CFLAGS]) -# AC_MSG_RESULT([CXXGLAGS = $CXXFLAGS]) - -]) - - -# ========================================================================= -# MY_NEL_HEADER_CHK : NeL header files checking macros - -AC_DEFUN([MY_NEL_HEADER_CHK], -[ AC_REQUIRE_CPP() - -chk_message_obj="$1" -header="$2" -macro="$3" -is_mandatory="$4" - -if test $is_mandatory = "yes" -then - - _CPPFLAGS="$CPPFLAGS" - - CPPFLAGS="$CXXFLAGS $NEL_CFLAGS" - - AC_MSG_CHECKING(for $header) - - AC_EGREP_CPP( yo_header, -[#include <$header> -#ifdef $macro - yo_header -#endif], - have_header="yes", - have_header="no") - - CPPFLAGS="$_CPPFLAGS" - - if test "$have_header" = "yes" - then - AC_MSG_RESULT(yes) - else - if test "$is_mandatory" = "yes" - then - AC_MSG_ERROR([$chk_message_obj must be installed (http://www.nevrax.org).]) - else - AC_MSG_RESULT(no) - fi - fi -fi - - -]) - - -# ========================================================================= -# MY_NEL_LIB_CHK : NeL library checking macros - -AC_DEFUN([MY_NEL_LIB_CHK], -[ AC_REQUIRE_CPP() - -chk_message_obj="$1" -nel_test_lib="$2" -is_mandatory="$3" - -if test $is_mandatory = "yes" -then - - AC_CHECK_LIB($nel_test_lib, main,,[AC_MSG_ERROR([$chk_message_obj must be installed (http://www.nevrax.org).])]) -fi -]) - - -# ========================================================================= -# AM_PATH_NEL : NeL checking macros -AC_DEFUN([AM_PATH_NEL], -[ AC_REQUIRE_CPP() - -AC_ARG_WITH( nel, - [ --with-nel= path to the NeL install files directory. - e.g. /usr/local/nel]) - -AC_ARG_WITH( nel-include, - [ --with-nel-include= - path to the NeL header files directory. - e.g. /usr/local/nel/include]) - -AC_ARG_WITH( nel-lib, - [ --with-nel-lib= - path to the NeL library files directory. - e.g. /usr/local/nel/lib]) - - -nelmisc_is_mandatory="$1" -nelnet_is_mandatory="$2" -nel3d_is_mandatory="$3" -nelpacs_is_mandatory="$4" -nelsound_is_mandatory="$5" -nelai_is_mandatory="$6" -nelgeorges_is_mandatory="$7" - -# Check for nel-config -AC_PATH_PROG(NEL_CONFIG, nel-config, no) - -# -# Configure options (--with-nel*) have precendence -# over nel-config only set variables if they are not -# specified -# -if test "$NEL_CONFIG" != "no" -then - if test -z "$with_nel" -a -z "$with_nel_include" - then - CXXFLAGS="$CXXFLAGS `nel-config --cflags`" - fi - - if test -z "$with_nel" -a -z "$with_nel_lib" - then - LDFLAGS="`nel-config --ldflags` $LDFLAGS" - fi -fi - -# -# Set nel_libraries and nel_includes according to -# user specification (--with-nel*) if any. -# --with-nel-include and --with-nel-lib have precendence -# over --with-nel -# -if test "$with_nel" = "no" -then - # The user explicitly disabled the use of the NeL - AC_MSG_ERROR([NeL is mandatory: do not specify --without-nel]) -else - if test "$with_nel" -a "$with_nel" != "yes" - then - nel_includes="$with_nel/include" - nel_libraries="$with_nel/lib" - fi -fi - -if test "$with_nel_include" -then - nel_includes="$with_nel_include" -fi - -if test "$with_nel_lib" -then - nel_libraries="$with_nel_lib" -fi - -# -# Set compilation variables -# -if test "$nel_includes" -then - CXXFLAGS="$CXXFLAGS -I$nel_includes" -fi - -if test "$nel_libraries" -then - LDFLAGS="-L$nel_libraries $LDFLAGS" -fi - -# -# Collect headers information and bark if missing and -# mandatory -# - -MY_NEL_HEADER_CHK([NeL Misc], [nel/misc/types_nl.h], [NL_TYPES_H], $nelmisc_is_mandatory) -MY_NEL_HEADER_CHK([NeL Network], [nel/net/sock.h], [NL_SOCK_H], $nelnet_is_mandatory) -MY_NEL_HEADER_CHK([NeL 3D], [nel/3d/u_camera.h], [NL_U_CAMERA_H], $nel3d_is_mandatory) -MY_NEL_HEADER_CHK([NeL PACS], [nel/pacs/u_global_position.h], [NL_U_GLOBAL_POSITION_H], $nelpacs_is_mandatory) -MY_NEL_HEADER_CHK([NeL Sound], [nel/sound/u_source.h], [NL_U_SOURCE_H], $nelsound_is_mandatory) -MY_NEL_HEADER_CHK([NeL AI], [nel/ai/nl_ai.h], [_IA_NEL_H], $nelai_is_mandatory) -MY_NEL_HEADER_CHK([NeL Georges], [nel/georges/common.h], [NLGEORGES_COMMON_H], $nelgeorges_is_mandatory) - -# -# Collect libraries information and bark if missing and -# mandatory -# - -MY_NEL_LIB_CHK([NeL Misc], [nelmisc], $nelmisc_is_mandatory) -MY_NEL_LIB_CHK([NeL Network], [nelnet], $nelnet_is_mandatory) -MY_NEL_LIB_CHK([NeL 3D], [nel3d], $nel3d_is_mandatory) -MY_NEL_LIB_CHK([NeL PACS], [nelpacs], $nelpacs_is_mandatory) -MY_NEL_LIB_CHK([NeL Sound], [nelsnd], $nelsound_is_mandatory) -MY_NEL_LIB_CHK([NeL AI], [nelai], $nelai_is_mandatory) -MY_NEL_LIB_CHK([NeL Georges], [nelgeorges], $nelgeorges_is_mandatory) - -]) - -# ========================================================================= -# AM_PATH_OPENGL : OpenGL checking macros - -AC_DEFUN([AM_PATH_OPENGL], -[ AC_MSG_CHECKING(for OpenGL headers and GL Version >= 1.2) - -is_mandatory="$1" - -AC_REQUIRE_CPP() - -AC_ARG_WITH( opengl, - [ --with-opengl= path to the OpenGL install files directory. - e.g. /usr/local]) - -AC_ARG_WITH( opengl-include, - [ --with-opengl-include= - path to the OpenGL header files directory. - e.g. /usr/local/include]) - -AC_ARG_WITH( opengl-lib, - [ --with-opengl-lib= - path to the OpenGL library files directory. - e.g. /usr/local/lib]) - -opengl_lib="GL" - -if test "$with_opengl" -then - opengl_includes="$with_opengl/include" - opengl_libraries="$with_opengl/lib" -fi - -if test "$with_opengl_include" -then - opengl_includes="$with_opengl_include" -fi - -if test "$with_opengl_lib" -then - opengl_libraries="$with_opengl_lib" -fi - -# Set OPENGL_CFLAGS -if test "$opengl_includes" -then - OPENGL_CFLAGS="-I$opengl_includes" -fi - -# Set OPENGL_LIBS -if test "$opengl_libraries" -then - OPENGL_LIBS="-L$opengl_libraries" -fi -OPENGL_LIBS="$OPENGL_LIBS -l$opengl_lib" - -# Test the headers -_CPPFLAGS="$CPPFLAGS" - -CPPFLAGS="$CXXFLAGS $OPENGL_CFLAGS" - -AC_EGREP_CPP( yo_opengl, -[#include -#if defined(GL_VERSION_1_2) - yo_opengl -#endif], - have_opengl_headers="yes", - have_opengl_headers="no" ) - -if test "$have_opengl_headers" = "yes" -then - if test "$opengl_includes" - then - AC_MSG_RESULT([$opengl_includes]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -# Checking the GLEXT version >= 7 -AC_MSG_CHECKING(for and GLEXT version >= 7) - -AC_EGREP_CPP( yo_glext_version, -[#include -#ifdef GL_GLEXT_VERSION -#if GL_GLEXT_VERSION >= 7 - yo_glext_version -#endif -#endif], - have_glext="yes", - have_glext="no" ) - -if test "$have_glext" = "yes" -then - AC_MSG_RESULT(yes) -else - AC_MSG_RESULT([no, can be downloaded from http://oss.sgi.com/projects/ogl-sample/ABI/]) -fi - -# Test the libraries -AC_MSG_CHECKING(for OpenGL libraries) - -CPPFLAGS="$CXXFLAGS $OPENGL_LIBS" - -AC_TRY_LINK( , , have_opengl_libraries="yes", have_opengl_libraries="no") - -CPPFLAGS="$_CPPFLAGS" - -if test "$have_opengl_libraries" = "yes" -then - if test "$opengl_libraries" - then - AC_MSG_RESULT([$opengl_libraries]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -opengl_libraries="$opengl_libraries" - -if test "$have_opengl_headers" = "yes" \ - -a "$have_glext" = "yes" \ - -a "$have_opengl_libraries" = "yes" -then - have_opengl="yes" -else - have_opengl="no" -fi - -if test "$have_opengl" = "no" -a "$is_mandatory" = "yes" -then - AC_MSG_ERROR([OpenGL >= 1.2 must be installed (http://www.mesa3d.org)]) -fi - -AC_SUBST(OPENGL_CFLAGS) -AC_SUBST(OPENGL_LIBS) - -]) - - -# ========================================================================= -# AM_PATH_FREETYPE : FreeType checking macros - -AC_DEFUN([AM_PATH_FREETYPE], -[ is_mandatory="$1" - -AC_REQUIRE_CPP() - -AC_ARG_WITH( freetype, - [ --with-freetype= path to the FreeType install files directory. - e.g. /usr/local/freetype]) - -AC_ARG_WITH( freetype-include, - [ --with-freetype-include= - path to the FreeType header files directory. - e.g. /usr/local/freetype/include]) - -AC_ARG_WITH( freetype-lib, - [ --with-freetype-lib= - path to the FreeType library files directory. - e.g. /usr/local/freetype/lib]) - -freetype_lib="freetype" - - -AC_PATH_PROG(FREETYPE_CONFIG, freetype-config, no) - -if test "$FREETYPE_CONFIG" = "no" -then - have_freetype_config="no" -else - FREETYPE_CFLAGS=`freetype-config --cflags` - FREETYPE_LIBS=`freetype-config --libs` - have_freetype_config="yes" -fi - -if test "$with_freetype" -then - freetype_includes="$with_freetype/include" - freetype_libraries="$with_freetype/lib" -fi - -if test "$with_freetype_include" -then - freetype_includes="$with_freetype_include" -fi - -if test "$with_freetype_lib" -then - freetype_libraries="$with_freetype_lib" -fi - -if test "$freetype_includes" -then - FREETYPE_CFLAGS="-I$freetype_includes" -fi - -# Checking the FreeType 2 instalation -_CPPFLAGS="$CPPFLAGS" -CPPFLAGS=" $FREETYPE_CFLAGS $CXXFLAGS" - -AC_MSG_CHECKING(for FreeType version = 2) - -AC_EGREP_CPP( yo_freetype2, -[#include -#if FREETYPE_MAJOR == 2 - yo_freetype2 -#endif], - have_freetype2="yes", - have_freetype2="no") - -if test "$have_freetype2" = "yes" -then - AC_MSG_RESULT(yes) -else - AC_MSG_RESULT(no) -fi - -# Test the libraries -AC_MSG_CHECKING(for FreeType libraries) - -if test $freetype_libraries -then - FREETYPE_LIBS="-L$freetype_libraries -l$freetype_lib" -fi - -CPPFLAGS="$FREETYPE_LIBS $CXXFLAGS" - -AC_TRY_LINK( , , have_freetype_libraries="yes", have_freetype_libraries="no") - -CPPFLAGS="$_CPPFLAGS" - -if test "$have_freetype_libraries" = "yes" -then - if test "$freetype_libraries" - then - AC_MSG_RESULT([$freetype_libraries]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -if test "$have_freetype2" = "yes" && test "$have_freetype_libraries" = "yes" -then - have_freetype="yes" -else - have_freetype="no" -fi - -if test "$have_freetype" = "no" && test "$is_mandatory" = "yes" -then - AC_MSG_ERROR([FreeType 2 must be installed (http://freetype.sourceforge.net)]) -fi - -AC_SUBST(FREETYPE_CFLAGS) -AC_SUBST(FREETYPE_LIBS) - -]) - - -# ========================================================================= -# AM_PATH_XF86VIDMODE : XF86VidMode checking macros - -AC_DEFUN([AM_PATH_XF86VIDMODE], -[ AC_MSG_CHECKING(for XF86VidMode extension) - -AC_REQUIRE_CPP() - -AC_ARG_WITH( xf86vidmode-lib, - [ --with-xf86vidmode-lib= - path to the XF86VidMode library. - e.g. /usr/X11R6/lib] ) - -xf86vidmode_lib="Xxf86vm" - -if test "$with_xf86vidmode_lib" = no -then - # The user explicitly disabled the use of XF86VidMode - have_xf86vidmode="disabled" - AC_MSG_RESULT(disabled) -else - if test "$with_xf86vidmode_lib" - then - xf86vidmode_libraries="$with_xf86vidmode_lib" - fi - - XF86VIDMODE_CFLAGS="-DXF86VIDMODE" -fi - -if test -z "$have_xf86vidmode" -# -a "$with_xf86vidmode_lib" -then - if test "$xf86vidmode_libraries" - then - XF86VIDMODE_LIBS="-L$xf86vidmode_libraries" - fi - - XF86VIDMODE_LIBS="$XF86VIDMODE_LIBS -l$xf86vidmode_lib" - - _CPPFLAGS="$CPPFLAGS" - - CPPFLAGS="$CXXFLAGS $XF86VIDMODE_LIBS" - - AC_TRY_LINK( , , have_xf86vidmode_libraries="yes", have_xf86vidmode_libraries="no") - - CPPFLAGS="$_CPPFLAGS" - - if test "$have_xf86vidmode_libraries" = "yes" - then - have_xf86vidmode="yes" - if test "$xf86vidmode_libraries" - then - AC_MSG_RESULT($xf86vidmode_libraries) - else - AC_MSG_RESULT(yes) - fi - else - have_xf86vidmode="no" - AC_MSG_RESULT(no, no fullscreen support available.) - fi - - xf86vidmode_libraries="$xf86vidmode_libraries" - -fi - -AC_SUBST(XF86VIDMODE_CFLAGS) -AC_SUBST(XF86VIDMODE_LIBS) - -]) - - -# ========================================================================= -# AM_PATH_OPENAL : OpenAL checking macros - -AC_DEFUN([AM_PATH_OPENAL], -[ is_mandatory="$1" - -AC_REQUIRE_CPP() - -# Get from the user option the path to the OpenAL files location -AC_ARG_WITH( openal, - [ --with-openal= path to the OpenAL install files directory. - e.g. /usr/local]) - -AC_ARG_WITH( openal-include, - [ --with-openal-include= - path to the OpenAL header files directory. - e.g. /usr/local/include]) - -AC_ARG_WITH( openal-lib, - [ --with-openal-lib= - path to the OpenAL library files directory. - e.g. /usr/local/lib]) - -openal_lib="openal" -alut_lib="alut" - -if test $with_openal -then - openal_includes="$with_openal/include" - openal_libraries="$with_openal/lib" -fi - -if test "$with_openal_include" -then - openal_includes="$with_openal_include" -fi - -if test "$with_openal_lib" -then - openal_libraries="$with_openal_lib" -fi - - -# Set OPENAL_CFLAGS -if test "$openal_includes" -then - OPENAL_CFLAGS="-I$openal_includes" -fi - -# Set OPENAL_LIBS -if test "$openal_libraries" -then - OPENAL_LIBS="-L$openal_libraries" -fi -OPENAL_LIBS="$OPENAL_LIBS -l$openal_lib -l$alut_lib" - -_CPPFLAGS="$CPPFLAGS" -CPPFLAGS="$CXXFLAGS $OPENAL_CFLAGS" - -AC_MSG_CHECKING(for OpenAL headers) -AC_EGREP_CPP( yo_openal, -[#include -#include -#ifdef AL_VERSION - yo_openal -#endif], - have_openal_headers="yes", - have_openal_headers="no" ) - -if test "$have_openal_headers" = "yes" -then - if test "$openal_includes" - then - AC_MSG_RESULT([$openal_includes]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -# Test the libraries -AC_MSG_CHECKING(for OpenAL libraries) - -CPPFLAGS="$CXXFLAGS $OPENAL_LIBS" - -AC_TRY_LINK( , , have_openal_libraries="yes", have_openal_libraries="no") - -CPPFLAGS="$_CPPFLAGS" - -if test "$have_openal_libraries" = "yes" -then - if test "$openal_libraries" - then - AC_MSG_RESULT([$openal_libraries]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -openal_libraries="$openal_libraries" - -if test "$have_openal_headers" = "yes" \ - && test "$have_openal_libraries" = "yes" -then - have_openal="yes" -else - have_openal="no" -fi - -if test "$have_openal" = "no" -a "$is_mandatory" = "yes" -then - AC_MSG_ERROR([OpenAL is needed to compile NeL (http://www.openal.org).]) -fi - -AC_SUBST(OPENAL_CFLAGS) -AC_SUBST(OPENAL_LIBS) -AC_SUBST([have_openal]) - -]) - - -# ========================================================================= -# AM_PATH_PYTHON : Python checking macros - -AC_DEFUN([AM_PATH_PYTHON], -[ python_version_required="$1" - -is_mandatory="$2" - -AC_REQUIRE_CPP() - -# Get from the user option the path to the Python files location -AC_ARG_WITH( python, - [ --with-python= path to the Python prefix installation directory. - e.g. /usr/local], - [ PYTHON_PREFIX=$with_python ] -) - -AC_ARG_WITH( python-version, - [ --with-python-version= - Python version to use, e.g. 1.5], - [ PYTHON_VERSION=$with_python_version ] -) - -if test ! "$PYTHON_PREFIX" = "" -then - PATH="$PYTHON_PREFIX/bin:$PATH" -fi - -if test ! "$PYTHON_VERSION" = "" -then - PYTHON_EXEC="python$PYTHON_VERSION" -else - PYTHON_EXEC="python python2.1 python2.0 python1.5" -fi - -AC_PATH_PROGS(PYTHON, $PYTHON_EXEC, no, $PATH) - -if test "$PYTHON" != "no" -then - PYTHON_PREFIX=`$PYTHON -c 'import sys; print "%s" % (sys.prefix)'` - PYTHON_VERSION=`$PYTHON -c 'import sys; print "%s" % (sys.version[[:3]])'` - - is_python_version_enough=`expr $python_version_required \<= $PYTHON_VERSION` -fi - - -if test "$PYTHON" = "no" || test "$is_python_version_enough" != "1" -then - - if test "$is_mandatory" = "yes" - then - AC_MSG_ERROR([Python $python_version_required must be installed (http://www.python.org)]) - else - have_python="no" - fi - -else - - python_includes="$PYTHON_PREFIX/include/python$PYTHON_VERSION" - python_libraries="$PYTHON_PREFIX/lib/python$PYTHON_VERSION/config" - python_lib="python$PYTHON_VERSION" - - PYTHON_CFLAGS="-I$python_includes" - PYTHON_LIBS="-L$python_libraries -l$python_lib" - - _CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$CXXFLAGS ${PYTHON_CFLAGS}" - - # Test the headers - AC_MSG_CHECKING(for Python headers) - - AC_EGREP_CPP( yo_python, - [#include - yo_python - ], - have_python_headers="yes", - have_python_headers="no" ) - - if test "$have_python_headers" = "yes" - then - AC_MSG_RESULT([$python_includes]) - else - AC_MSG_RESULT(no) - fi - - # Test the libraries - AC_MSG_CHECKING(for Python libraries) - - CPPFLAGS="$CXXFLAGS $PYTHON_CFLAGS" - - AC_TRY_LINK( , , have_python_libraries="yes", have_python_libraries="no") - - CPPFLAGS="$_CPPFLAGS" - - if test "$have_python_libraries" = "yes" - then - if test "$python_libraries" - then - AC_MSG_RESULT([$python_libraries]) - else - AC_MSG_RESULT(yes) - fi - else - AC_MSG_RESULT(no) - fi - - if test "$have_python_headers" = "yes" \ - && test "$have_python_libraries" = "yes" - then - have_python="yes" - else - have_python="no" - fi - - if test "$have_python" = "no" -a "$is_mandatory" = "yes" - then - AC_MSG_ERROR([Python is needed to compile NeL (http://www.python.org).]) - fi - - AC_SUBST(PYTHON_CFLAGS) - AC_SUBST(PYTHON_LIBS) - -fi - -]) - -# ========================================================================= -# AM_PATH_MYSQL : MySQL library - -# AM_PATH_MYSQL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) -# Test for MYSQL, and define MYSQL_CFLAGS and MYSQL_LIBS -# -AC_DEFUN([AM_PATH_MYSQL], -[# -# Get the cflags and libraries from the mysql_config script -# -AC_ARG_WITH(mysql-prefix,[ --with-mysql-prefix=PFX Prefix where MYSQL is installed (optional)], - mysql_prefix="$withval", mysql_prefix="") -AC_ARG_WITH(mysql-exec-prefix,[ --with-mysql-exec-prefix=PFX Exec prefix where MYSQL is installed (optional)], - mysql_exec_prefix="$withval", mysql_exec_prefix="") -AC_ARG_ENABLE(mysqltest, [ --disable-mysqltest Do not try to compile and run a test MYSQL program], - , enable_mysqltest=yes) - - if test x$mysql_exec_prefix != x ; then - mysql_args="$mysql_args --exec-prefix=$mysql_exec_prefix" - if test x${MYSQL_CONFIG+set} != xset ; then - MYSQL_CONFIG=$mysql_exec_prefix/bin/mysql_config - fi - fi - if test x$mysql_prefix != x ; then - mysql_args="$mysql_args --prefix=$mysql_prefix" - if test x${MYSQL_CONFIG+set} != xset ; then - MYSQL_CONFIG=$mysql_prefix/bin/mysql_config - fi - fi - - AC_REQUIRE([AC_CANONICAL_TARGET]) - AC_PATH_PROG(MYSQL_CONFIG, mysql_config, no) - min_mysql_version=ifelse([$1], ,0.11.0,$1) - AC_MSG_CHECKING(for MYSQL - version >= $min_mysql_version) - no_mysql="" - if test "$MYSQL_CONFIG" = "no" ; then - no_mysql=yes - else - MYSQL_CFLAGS=`$MYSQL_CONFIG $mysqlconf_args --cflags | sed -e "s/'//g"` - MYSQL_LIBS=`$MYSQL_CONFIG $mysqlconf_args --libs | sed -e "s/'//g"` - - mysql_major_version=`$MYSQL_CONFIG $mysql_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - mysql_minor_version=`$MYSQL_CONFIG $mysql_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - mysql_micro_version=`$MYSQL_CONFIG $mysql_config_args --version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - if test "x$enable_mysqltest" = "xyes" ; then - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $MYSQL_CFLAGS" - LIBS="$LIBS $MYSQL_LIBS" -# -# Now check if the installed MYSQL is sufficiently new. (Also sanity -# checks the results of mysql_config to some extent -# - rm -f conf.mysqltest - AC_TRY_RUN([ -#include -#include -#include -#include - -char* -my_strdup (char *str) -{ - char *new_str; - - if (str) - { - new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); - strcpy (new_str, str); - } - else - new_str = NULL; - - return new_str; -} - -int main (int argc, char *argv[]) -{ - int major, minor, micro; - char *tmp_version; - - /* This hangs on some systems (?) - system ("touch conf.mysqltest"); - */ - { FILE *fp = fopen("conf.mysqltest", "a"); if ( fp ) fclose(fp); } - - /* HP/UX 9 (%@#!) writes to sscanf strings */ - tmp_version = my_strdup("$min_mysql_version"); - if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { - printf("%s, bad version string\n", "$min_mysql_version"); - exit(1); - } - - if (($mysql_major_version > major) || - (($mysql_major_version == major) && ($mysql_minor_version > minor)) || - (($mysql_major_version == major) && ($mysql_minor_version == minor) && ($mysql_micro_version >= micro))) - { - return 0; - } - else - { - printf("\n*** 'mysql_config --version' returned %d.%d.%d, but the minimum version\n", $mysql_major_version, $mysql_minor_version, $mysql_micro_version); - printf("*** of MYSQL required is %d.%d.%d. If mysql_config is correct, then it is\n", major, minor, micro); - printf("*** best to upgrade to the required version.\n"); - printf("*** If mysql_config was wrong, set the environment variable MYSQL_CONFIG\n"); - printf("*** to point to the correct copy of mysql_config, and remove the file\n"); - printf("*** config.cache before re-running configure\n"); - return 1; - } -} - -],, no_mysql=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - if test "x$no_mysql" = x ; then - AC_MSG_RESULT(yes) - ifelse([$2], , :, [$2]) - else - AC_MSG_RESULT(no) - if test "$MYSQL_CONFIG" = "no" ; then - echo "*** The mysql_config script installed by MYSQL could not be found" - echo "*** If MYSQL was installed in PREFIX, make sure PREFIX/bin is in" - echo "*** your path, or set the MYSQL_CONFIG environment variable to the" - echo "*** full path to mysql_config." - else - if test -f conf.mysqltest ; then - : - else - echo "*** Could not run MYSQL test program, checking why..." - CFLAGS="$CFLAGS $MYSQL_CFLAGS" - LIBS="$LIBS $MYSQL_LIBS" - AC_TRY_LINK([ -#include -#include - -int main(int argc, char *argv[]) -{ return 0; } -#undef main -#define main K_and_R_C_main -], [ return 0; ], - [ echo "*** The test program compiled, but did not run. This usually means" - echo "*** that the run-time linker is not finding MYSQL or finding the wrong" - echo "*** version of MYSQL. If it is not finding MYSQL, you'll need to set your" - echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" - echo "*** to the installed location Also, make sure you have run ldconfig if that" - echo "*** is required on your system" - echo "***" - echo "*** If you have an old version installed, it is best to remove it, although" - echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], - [ echo "*** The test program failed to compile or link. See the file config.log for the" - echo "*** exact error that occured. This usually means MYSQL was incorrectly installed" - echo "*** or that you have moved MYSQL since it was installed. In the latter case, you" - echo "*** may want to edit the mysql_config script: $MYSQL_CONFIG" ]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - fi - MYSQL_CFLAGS="" - MYSQL_LIBS="" - ifelse([$3], , :, [$3]) - fi - AC_SUBST(MYSQL_CFLAGS) - AC_SUBST(MYSQL_LIBS) - rm -f conf.mysqltest -]) - -# ========================================================================= -# AM_PATH_FMOD : FMOD checking macros - -AC_DEFUN([AM_PATH_FMOD], -[ is_mandatory="$1" - -AC_REQUIRE_CPP() - -# Get from the user option the path to the FMOD files location -AC_ARG_WITH( fmod, - [ --with-fmod= path to the FMOD install files directory. - e.g. /usr/local]) - -AC_ARG_WITH( fmod-include, - [ --with-fmod-include= - path to the FMOD header files directory. - e.g. /usr/local/include]) - -AC_ARG_WITH( fmod-lib, - [ --with-fmod-lib= - path to the FMOD library files directory. - e.g. /usr/local/lib]) - -fmod_lib="fmod" - -if test $with_fmod -then - fmod_includes="$with_fmod/include" - fmod_libraries="$with_fmod/lib" -fi - -if test "$with_fmod_include" -then - fmod_includes="$with_fmod_include" -fi - -if test "$with_fmod_lib" -then - fmod_libraries="$with_fmod_lib" -fi - - -# Set FMOD_CFLAGS -if test "$fmod_includes" -then - FMOD_CFLAGS="-I$fmod_includes" -fi - -# Set FMOD_LIBS -if test "$fmod_libraries" -then - FMOD_LIBS="-L$fmod_libraries" -fi -FMOD_LIBS="$FMOD_LIBS -l$fmod_lib" - -_CPPFLAGS="$CPPFLAGS" -CPPFLAGS="$CXXFLAGS $FMOD_CFLAGS" - -AC_MSG_CHECKING(for FMOD headers) -AC_EGREP_CPP( yo_fmod, -[#include -#ifdef FMOD_VERSION - yo_fmod -#endif], - have_fmod_headers="yes", - have_fmod_headers="no" ) - -if test "$have_fmod_headers" = "yes" -then - if test "$fmod_includes" - then - AC_MSG_RESULT([$fmod_includes]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -# Test the libraries -AC_MSG_CHECKING(for FMOD libraries) - -CPPFLAGS="$CXXFLAGS $FMOD_LIBS" - -AC_TRY_LINK( , , have_fmod_libraries="yes", have_fmod_libraries="no") - -CPPFLAGS="$_CPPFLAGS" - -if test "$have_fmod_libraries" = "yes" -then - if test "$fmod_libraries" - then - AC_MSG_RESULT([$fmod_libraries]) - else - AC_MSG_RESULT(yes) - fi -else - AC_MSG_RESULT(no) -fi - -fmod_libraries="$fmod_libraries" - -if test "$have_fmod_headers" = "yes" \ - && test "$have_fmod_libraries" = "yes" -then - have_fmod="yes" -else - have_fmod="no" -fi - -if test "$have_fmod" = "no" -a "$is_mandatory" = "yes" -then - AC_MSG_ERROR([FMOD is needed to compile NeL (http://www.fmod.org).]) -fi - -AC_SUBST(FMOD_CFLAGS) -AC_SUBST(FMOD_LIBS) -AC_SUBST([have_fmod]) - -]) - -# ========================================================================= -# End of file - diff --git a/code/nelns/admin_executor_service/Makefile.am b/code/nelns/admin_executor_service/Makefile.am deleted file mode 100644 index aafee52b1..000000000 --- a/code/nelns/admin_executor_service/Makefile.am +++ /dev/null @@ -1,25 +0,0 @@ -# -# $Id: Makefile.am,v 1.8 2004/03/02 09:10:50 cado Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = admin_executor_service.cfg \ - admin_executor_service.dsp \ - admin_executor_service_8.vcproj \ - admin_executor_service.vcproj \ - log_report.h \ - common.cfg - -sbin_PROGRAMS = admin_executor_service - -admin_executor_servicedir = ${pkgsysconfdir} -admin_executor_service_DATA = admin_executor_service.cfg common.cfg - -AM_CXXFLAGS = -DNELNS_CONFIG="\"${pkgsysconfdir}\"" -DNELNS_STATE="\"${pkglocalstatedir}\"" -DNELNS_LOGS="\"${logdir}\"" - -admin_executor_service_SOURCES = admin_executor_service.cpp \ - log_report.cpp - -# End of Makefile.am - diff --git a/code/nelns/admin_executor_service/log_report.cpp b/code/nelns/admin_executor_service/log_report.cpp index eac5f83c3..7106fb9d1 100644 --- a/code/nelns/admin_executor_service/log_report.cpp +++ b/code/nelns/admin_executor_service/log_report.cpp @@ -1,580 +1,581 @@ -// NeLNS - MMORPG Framework -// Copyright (C) 2010 Winch Gate Property Limited -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -#include "log_report.h" -#include -#include "nel/misc/common.h" -#include "nel/misc/displayer.h" -#include "nel/misc/file.h" -#include "nel/misc/path.h" -#include "nel/misc/variable.h" - -using namespace NLMISC; -using namespace std; - - -CVariable LogPath( "LogReport","LogPath", "Path of the log files", ".", 0, true ); - -const uint MAX_LOG_LINE_SIZE = 1024; -//nlctassert(MAX_LOG_LINE_SIZE>0); - -enum TLogLineHeader { LHDate, LHTime, LHType, LHThread, LHService, LHCodeFile, LHCodeLine, LHSeparator, LH_NB_FIELDS }; - - -/// -bool isLogFile( const std::string& filename ) -{ - uint len = (uint)filename.size(); - return (len >= 4 ) && (filename.substr( len-4 ) == ".log"); -} - -/// -inline bool isNumberChar( char c ) -{ - return (c >= '0') && (c <= '9'); -} - -/// -void sortLogFiles( vector& filenames ) -{ - uint i; - for ( i=0; i!=filenames.size(); ++i ) - { - // Ensure that a log file without number comes *after* the ones with a number - string name = string(filenames[i]); - string::size_type dotpos = name.find_last_of('.'); - if ( (dotpos!=string::npos) && (dotpos > 2) ) - { - if ( ! (isNumberChar(name[dotpos-1]) && isNumberChar(name[dotpos-2]) && isNumberChar(name[dotpos-3])) ) - { - name = name.substr( 0, dotpos ) + "ZZZ" + name.substr( dotpos ); - filenames[i] = name.c_str(); - } - } - } - sort( filenames.begin(), filenames.end() ); - for ( i=0; i!=filenames.size(); ++i ) - { - // Set the original names back - string name = filenames[i]; - string::size_type tokenpos = name.find( "ZZZ." ); - if ( tokenpos != string::npos ) - { - name = name.substr( 0, tokenpos ) + name.substr( tokenpos + 3 ); - filenames[i] = name.c_str(); - } - } -} - -void CMakeLogTask::setLogPath(const std::string & logPath) -{ - _LogPaths.resize( 1 ); - _LogPaths[0] = logPath; -} - -void CMakeLogTask::setLogPaths(const std::vector& logPaths) -{ - _LogPaths = logPaths; -} - -void CMakeLogTask::setLogPathToDefault() -{ - setLogPath( LogPath.get() ); -} - -/* - * - */ -CMakeLogTask::~CMakeLogTask() -{ - if ( _Thread ) // implies && _OutputLogReport - { - if ( ! _Complete ) - { - pleaseStop(); - _Thread->wait(); - } - clear(); - } -} - - -/* - * - */ -void CMakeLogTask::start() -{ - if ( _Thread ) - { - if ( _Complete ) - clear(); - else - return; - } - _Stopping = false; - _Complete = false; - _Thread = NLMISC::IThread::create( this ); - _OutputLogReport = new CLogReport(); - _Thread->start(); -} - - -/* - * - */ -void CMakeLogTask::clear() -{ - if (_Thread) - { - delete _Thread; - _Thread = NULL; - } - if (_OutputLogReport) - { - delete _OutputLogReport; - _OutputLogReport = NULL; - } -} - -/* - * - */ -void CMakeLogTask::terminateTask() -{ - if (!_Thread) // _Thread _implies _OutputLogReport - return; - - pleaseStop(); - _Thread->wait(); - - clear(); -} - -// -bool isOfLogDotLogFamily( const std::string& filename ) -{ - return ((filename == "log.log") || - ((filename.size() == 10) && - (filename.substr( 0, 3 ) == "log") && - isNumberChar(filename[3]) && isNumberChar(filename[4]) && isNumberChar(filename[5]) && - (filename.substr( 6, 4 ) == ".log")) ); -} - - -enum TVersionTargetMode { TTMAll, TTMMatchAllV, TTMMatchExactV, TTMMatchGreaterV, TTMMatchLowerV } targetMode; -const uint CurrentVersion = std::numeric_limits::max(); - -// Return true and logVersion, or false if not a log with version -bool getLogVersion( const std::string& filename, uint& logVersion ) -{ - uint len = (uint)filename.size(); - if ( (len > 4) && (filename.substr( len-4 ) == ".log") ) - { - if ( filename.substr(0, 3) == "log" ) - { - if ( (len == 7) || - ((len == 10) && (isNumberChar(filename[3]) && isNumberChar(filename[4]) && isNumberChar(filename[5]))) ) - { - logVersion = CurrentVersion; - return true; - } - } - else if ( filename[0] == 'v' ) - { - string::size_type p = filename.find( "_", 1 ); - if ( p != string::npos ) - { - if ( (len == p + 8) || - ((len == p + 11) && (isNumberChar(filename[p+4]) && isNumberChar(filename[p+5]) && isNumberChar(filename[p+6]))) ) - { - NLMISC::fromString( filename.substr( 1, p-1 ), logVersion ); - return true; - } - } - } - } - return false; -} - -// Assumes filename is .log file -bool matchLogTarget( const std::string& filename, TVersionTargetMode targetMode, uint targetVersion ) -{ - if ( targetMode == TTMAll ) - return true; - - uint version; - - // Get version or exclude non-standard log files - if ( ! getLogVersion( filename, version ) ) - return false; - - // Exclude non-matching version - switch ( targetMode ) - { - case TTMMatchExactV: - return (version == targetVersion); // break; - case TTMMatchGreaterV: - return (version >= targetVersion); // break; - case TTMMatchLowerV: - return (version <= targetVersion); // break; - default: // TTMMatchAllV - return true; - } -} - -/* - * - */ -void CMakeLogTask::run() -{ - // Parse log target - uint targetVersion = CurrentVersion; - uint lts = (uint)_LogTarget.size(); - if ( _LogTarget.empty() || (_LogTarget == "v") ) - { - targetMode = TTMMatchExactV; - } - else if ( _LogTarget == "v*" ) - { - targetMode = TTMMatchAllV; - } - else if ( _LogTarget == "*" ) - { - targetMode = TTMAll; - } - else if ( (lts > 1) && (_LogTarget[0] == 'v') ) - { - uint additionalChars = 1; - if ( _LogTarget[lts-1] == '+' ) - targetMode = TTMMatchGreaterV; - else if ( _LogTarget[lts-1] == '-' ) - targetMode = TTMMatchLowerV; - else - { - targetMode = TTMMatchExactV; - additionalChars = 0; - } - - NLMISC::fromString( _LogTarget.substr( 1, lts-additionalChars-1 ), targetVersion ); - } - else - { - nlwarning( "Invalid log target argument: %s", _LogTarget.c_str() ); - _Complete = true; - return; - } - - // Get log files and sort them - vector filenames; - vector filenamesOfPath; - for ( vector::const_iterator ilf=_LogPaths.begin(); ilf!=_LogPaths.end(); ++ilf ) - { - string path = (*ilf); - if ( (! path.empty()) && (path[path.size()-1]!='/') ) - path += "/"; - filenamesOfPath.clear(); - CPath::getPathContent( path, false, false, true, filenamesOfPath, NULL, true ); - vector::iterator ilf2 = partition( filenamesOfPath.begin(), filenamesOfPath.end(), isLogFile ); - filenamesOfPath.erase( ilf2, filenamesOfPath.end() ); - sortLogFiles( filenamesOfPath ); - filenames.insert( filenames.end(), filenamesOfPath.begin(), filenamesOfPath.end() ); - } - - // Analyse log files - _OutputLogReport->reset(); - uint nbLines = 0; - char line [MAX_LOG_LINE_SIZE]; - - uint nbSkippedFiles = 0; - for ( vector::const_iterator ilf=filenames.begin(); ilf!=filenames.end(); ++ilf ) - { - string shortname = CFile::getFilename( *ilf ); - - // Filter log files based on filename before opening them - if ( ! matchLogTarget( shortname, targetMode, targetVersion ) ) - { - ++nbSkippedFiles; - continue; - } - - nlinfo( "Processing %s (%u/%u)", (*ilf).c_str(), ilf-filenames.begin(), filenames.size() ); - CIFile logfile; - if ( logfile.open( *ilf, true ) ) - { - _OutputLogReport->setProgress( (uint)(ilf-filenames.begin()), (uint)filenames.size() ); - while ( ! logfile.eof() ) - { - logfile.getline( line, MAX_LOG_LINE_SIZE ); - line[MAX_LOG_LINE_SIZE-1] = '\0'; // force valid end of line - _OutputLogReport->pushLine( line ); - ++nbLines; - - if ( isStopping() ) - return; - } - } - } - nlinfo( "%u lines processed", nbLines ); - if ( nbSkippedFiles != 0 ) - nlinfo( "%u log files skipped, not matching target %s", nbSkippedFiles, _LogTarget.c_str() ); - _Complete = true; -} - - -/* - * Add a log line to the report tree - */ -void CLogReport::pushLine( const std::string& line, NLMISC::CLog::TLogType onlyType, bool countOtherTypes ) -{ - // Ignore session title - if ( (line.size() > 14) && (line.substr( 0, 14 ) == "Log Starting [") ) - return; - - // Decode standard log line - vector lineTokens; - explode( line, string(" "), lineTokens ); - - if ( lineTokens.size() < LH_NB_FIELDS ) - return; - - // Filter log type - if ( onlyType != CLog::LOG_UNKNOWN ) - { - if ( lineTokens[LHType] != IDisplayer::logTypeToString( onlyType ) ) - { - if ( countOtherTypes ) - storeLine( lineTokens, true ); - return; - } - } - - // Store - storeLine( lineTokens, false ); -} - - -/* - * - */ -void CLogReportNode::storeLine( const std::vector& lineTokens, bool mainCountOnly ) -{ - // Get service name from "[machine/]serviceName-serviceId" - string service = lineTokens[LHService]; - string::size_type p = service.find( '/' ); - if ( p != string::npos ) - service = service.substr( p+1 ); - p = service.find( '-' ); - if ( p != string::npos ) - service = service.substr( 0, p ); - - // Store to appropriate child - CLogReportLeaf *child = getChild( service ); - if ( ! child ) - child = addChild( service ); - child->storeLine( lineTokens, mainCountOnly ); -} - - -/* - * - */ -void CLogReportLeaf::storeLine( const std::vector& lineTokens, bool mainCountOnly ) -{ - if ( ! mainCountOnly ) - { - // Build key from "codeFile codeLine" - string key = lineTokens[LHCodeFile] + ":" + lineTokens[LHCodeLine]; - _LogLineInfo[key].addAnOccurence( lineTokens ); - } - ++_Counts[lineTokens[LHType]]; - ++_TotalLines; -} - - -/* - * - */ -void CLogLineInfo::addAnOccurence( const std::vector& lineTokens ) -{ - if ( NbOccurences == 0 ) - { - for ( uint i=LH_NB_FIELDS; ireport( targetLog, true ); - } - else - { - targetLog->displayNL( "Nothing found for service %s", service.c_str() ); - } -} - - -/* - * Get results for a service (all distinct lines, sorted by occurence) - */ -void CLogReportLeaf::report( NLMISC::CLog *targetLog, bool ) -{ - // Sort it - typedef multimap< uint, pair< string, const CLogLineInfo * >, std::greater > CSortedByOccurenceLogLineInfoMap; - CSortedByOccurenceLogLineInfoMap sortedByOccurence; - for ( CLogLineInfoMap::const_iterator it=_LogLineInfo.begin(); it!=_LogLineInfo.end(); ++it ) - { - const string &key = (*it).first; - const CLogLineInfo& info = (*it).second; - sortedByOccurence.insert( make_pair( info.NbOccurences, make_pair( key, &info ) ) ); - } - - // Display it - for ( CSortedByOccurenceLogLineInfoMap::const_iterator iso=sortedByOccurence.begin(); iso!=sortedByOccurence.end(); ++iso ) - { - const string &key = (*iso).second.first; - const CLogLineInfo& info = *((*iso).second.second); - targetLog->displayRawNL( "%s %6u %s : %s", _Service.c_str(), info.NbOccurences, key.c_str(), info.SampleLogText.c_str() ); - } -} - - -/* - * Return the number of lines displayed - */ -uint CLogReportLeaf::reportPart( uint beginIndex, uint maxNbLines, NLMISC::CLog *targetLog ) -{ - uint i = 0; - CLogLineInfoMap::const_iterator it; - for ( it=_LogLineInfo.begin(); it!=_LogLineInfo.end(); ++it ) - { - if ( i >= beginIndex ) - { - if ( i >= maxNbLines ) - return i - beginIndex; - - const string &key = (*it).first; - const CLogLineInfo& info = (*it).second; - targetLog->displayRawNL( "%s %6u %s : %s", _Service.c_str(), info.NbOccurences, key.c_str(), info.SampleLogText.c_str() ); - } - ++i; - } - return i - beginIndex; -} - - -/* - * Get summary of results - */ -void CLogReportNode::report( NLMISC::CLog *targetLog, bool displayDetailsPerService ) -{ - uint nb1Sum=0, nb2Sum=0; - for ( std::vector::const_iterator it=_Children.begin(); it!=_Children.end(); ++it ) - { - CLogReportLeaf *pt = (*it); - - // Get distinct warnings - uint nb1 = pt->getNbDistinctLines(); - nb1Sum += nb1; - - // Get total warnings, info... but filter out lines with no header - uint sumTotalLinesNotUnknown = 0; - uint nbTotalLines [CLog::LOG_UNKNOWN]; - for ( uint i=CLog::LOG_ERROR; i!=CLog::LOG_UNKNOWN; ++i ) - { - nbTotalLines[i] = pt->getNbTotalLines( (CLog::TLogType)i ); - sumTotalLinesNotUnknown += nbTotalLines[i]; - } - if ( sumTotalLinesNotUnknown != 0 ) - { - targetLog->displayRawNL( "%s: \t%u distinct WRN, %u total WRN, %u INF, %u DBG, %u STT, %u AST, %u ERR, %u TOTAL", - pt->service().c_str(), nb1, nbTotalLines[CLog::LOG_WARNING], - nbTotalLines[CLog::LOG_INFO], nbTotalLines[CLog::LOG_DEBUG], - nbTotalLines[CLog::LOG_STAT], nbTotalLines[CLog::LOG_ASSERT], - nbTotalLines[CLog::LOG_ERROR], pt->getNbTotalLines( CLog::LOG_UNKNOWN ) ); - nb2Sum += nbTotalLines[CLog::LOG_WARNING]; - } - } - targetLog->displayRawNL( "=> %u distinct, %u total WRN (%u pages)", nb1Sum, nb2Sum, nb1Sum / NB_LINES_PER_PAGE + 1 ); - - if ( displayDetailsPerService ) - { - for ( std::vector::const_iterator it=_Children.begin(); it!=_Children.end(); ++it ) - { - (*it)->report( targetLog, true ); - } - } -} - - -/* - * Get partial results (pageNum>=1) - */ -void CLogReportNode::reportPage( uint pageNum, NLMISC::CLog *targetLog ) -{ - if ( _Children.empty() ) - { - targetLog->displayRawNL( "[END OF LOG]" ); - return; - } - - uint beginIndex = pageNum * NB_LINES_PER_PAGE; - uint lineCounter = 0, prevLineCounter; - for ( std::vector::const_iterator it=_Children.begin(); it!=_Children.end(); ++it ) - { - CLogReportLeaf *pt = (*it); - prevLineCounter = lineCounter; - lineCounter += pt->getNbDistinctLines(); - if ( lineCounter >= beginIndex ) - { - uint remainingLines = pageNum - (lineCounter - beginIndex ); - pt->reportPart( beginIndex - prevLineCounter, remainingLines, targetLog ); // - while ( remainingLines != 0 ) - { - ++it; - if ( it == _Children.end() ) - { - targetLog->displayRawNL( "[END OF LOG]" ); - return; - } - pt = (*it); - remainingLines -= pt->reportPart( 0, remainingLines, targetLog ); - } - return; - } - } -} +// NeLNS - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +#include "log_report.h" +#include +#include +#include "nel/misc/common.h" +#include "nel/misc/displayer.h" +#include "nel/misc/file.h" +#include "nel/misc/path.h" +#include "nel/misc/variable.h" + +using namespace NLMISC; +using namespace std; + + +CVariable LogPath( "LogReport","LogPath", "Path of the log files", ".", 0, true ); + +const uint MAX_LOG_LINE_SIZE = 1024; +//nlctassert(MAX_LOG_LINE_SIZE>0); + +enum TLogLineHeader { LHDate, LHTime, LHType, LHThread, LHService, LHCodeFile, LHCodeLine, LHSeparator, LH_NB_FIELDS }; + + +/// +bool isLogFile( const std::string& filename ) +{ + uint len = (uint)filename.size(); + return (len >= 4 ) && (filename.substr( len-4 ) == ".log"); +} + +/// +inline bool isNumberChar( char c ) +{ + return (c >= '0') && (c <= '9'); +} + +/// +void sortLogFiles( vector& filenames ) +{ + uint i; + for ( i=0; i!=filenames.size(); ++i ) + { + // Ensure that a log file without number comes *after* the ones with a number + string name = string(filenames[i]); + string::size_type dotpos = name.find_last_of('.'); + if ( (dotpos!=string::npos) && (dotpos > 2) ) + { + if ( ! (isNumberChar(name[dotpos-1]) && isNumberChar(name[dotpos-2]) && isNumberChar(name[dotpos-3])) ) + { + name = name.substr( 0, dotpos ) + "ZZZ" + name.substr( dotpos ); + filenames[i] = name.c_str(); + } + } + } + sort( filenames.begin(), filenames.end() ); + for ( i=0; i!=filenames.size(); ++i ) + { + // Set the original names back + string name = filenames[i]; + string::size_type tokenpos = name.find( "ZZZ." ); + if ( tokenpos != string::npos ) + { + name = name.substr( 0, tokenpos ) + name.substr( tokenpos + 3 ); + filenames[i] = name.c_str(); + } + } +} + +void CMakeLogTask::setLogPath(const std::string & logPath) +{ + _LogPaths.resize( 1 ); + _LogPaths[0] = logPath; +} + +void CMakeLogTask::setLogPaths(const std::vector& logPaths) +{ + _LogPaths = logPaths; +} + +void CMakeLogTask::setLogPathToDefault() +{ + setLogPath( LogPath.get() ); +} + +/* + * + */ +CMakeLogTask::~CMakeLogTask() +{ + if ( _Thread ) // implies && _OutputLogReport + { + if ( ! _Complete ) + { + pleaseStop(); + _Thread->wait(); + } + clear(); + } +} + + +/* + * + */ +void CMakeLogTask::start() +{ + if ( _Thread ) + { + if ( _Complete ) + clear(); + else + return; + } + _Stopping = false; + _Complete = false; + _Thread = NLMISC::IThread::create( this ); + _OutputLogReport = new CLogReport(); + _Thread->start(); +} + + +/* + * + */ +void CMakeLogTask::clear() +{ + if (_Thread) + { + delete _Thread; + _Thread = NULL; + } + if (_OutputLogReport) + { + delete _OutputLogReport; + _OutputLogReport = NULL; + } +} + +/* + * + */ +void CMakeLogTask::terminateTask() +{ + if (!_Thread) // _Thread _implies _OutputLogReport + return; + + pleaseStop(); + _Thread->wait(); + + clear(); +} + +// +bool isOfLogDotLogFamily( const std::string& filename ) +{ + return ((filename == "log.log") || + ((filename.size() == 10) && + (filename.substr( 0, 3 ) == "log") && + isNumberChar(filename[3]) && isNumberChar(filename[4]) && isNumberChar(filename[5]) && + (filename.substr( 6, 4 ) == ".log")) ); +} + + +enum TVersionTargetMode { TTMAll, TTMMatchAllV, TTMMatchExactV, TTMMatchGreaterV, TTMMatchLowerV } targetMode; +const uint CurrentVersion = std::numeric_limits::max(); + +// Return true and logVersion, or false if not a log with version +bool getLogVersion( const std::string& filename, uint& logVersion ) +{ + uint len = (uint)filename.size(); + if ( (len > 4) && (filename.substr( len-4 ) == ".log") ) + { + if ( filename.substr(0, 3) == "log" ) + { + if ( (len == 7) || + ((len == 10) && (isNumberChar(filename[3]) && isNumberChar(filename[4]) && isNumberChar(filename[5]))) ) + { + logVersion = CurrentVersion; + return true; + } + } + else if ( filename[0] == 'v' ) + { + string::size_type p = filename.find( "_", 1 ); + if ( p != string::npos ) + { + if ( (len == p + 8) || + ((len == p + 11) && (isNumberChar(filename[p+4]) && isNumberChar(filename[p+5]) && isNumberChar(filename[p+6]))) ) + { + NLMISC::fromString( filename.substr( 1, p-1 ), logVersion ); + return true; + } + } + } + } + return false; +} + +// Assumes filename is .log file +bool matchLogTarget( const std::string& filename, TVersionTargetMode targetMode, uint targetVersion ) +{ + if ( targetMode == TTMAll ) + return true; + + uint version; + + // Get version or exclude non-standard log files + if ( ! getLogVersion( filename, version ) ) + return false; + + // Exclude non-matching version + switch ( targetMode ) + { + case TTMMatchExactV: + return (version == targetVersion); // break; + case TTMMatchGreaterV: + return (version >= targetVersion); // break; + case TTMMatchLowerV: + return (version <= targetVersion); // break; + default: // TTMMatchAllV + return true; + } +} + +/* + * + */ +void CMakeLogTask::run() +{ + // Parse log target + uint targetVersion = CurrentVersion; + uint lts = (uint)_LogTarget.size(); + if ( _LogTarget.empty() || (_LogTarget == "v") ) + { + targetMode = TTMMatchExactV; + } + else if ( _LogTarget == "v*" ) + { + targetMode = TTMMatchAllV; + } + else if ( _LogTarget == "*" ) + { + targetMode = TTMAll; + } + else if ( (lts > 1) && (_LogTarget[0] == 'v') ) + { + uint additionalChars = 1; + if ( _LogTarget[lts-1] == '+' ) + targetMode = TTMMatchGreaterV; + else if ( _LogTarget[lts-1] == '-' ) + targetMode = TTMMatchLowerV; + else + { + targetMode = TTMMatchExactV; + additionalChars = 0; + } + + NLMISC::fromString( _LogTarget.substr( 1, lts-additionalChars-1 ), targetVersion ); + } + else + { + nlwarning( "Invalid log target argument: %s", _LogTarget.c_str() ); + _Complete = true; + return; + } + + // Get log files and sort them + vector filenames; + vector filenamesOfPath; + for ( vector::const_iterator ilf=_LogPaths.begin(); ilf!=_LogPaths.end(); ++ilf ) + { + string path = (*ilf); + if ( (! path.empty()) && (path[path.size()-1]!='/') ) + path += "/"; + filenamesOfPath.clear(); + CPath::getPathContent( path, false, false, true, filenamesOfPath, NULL, true ); + vector::iterator ilf2 = partition( filenamesOfPath.begin(), filenamesOfPath.end(), isLogFile ); + filenamesOfPath.erase( ilf2, filenamesOfPath.end() ); + sortLogFiles( filenamesOfPath ); + filenames.insert( filenames.end(), filenamesOfPath.begin(), filenamesOfPath.end() ); + } + + // Analyse log files + _OutputLogReport->reset(); + uint nbLines = 0; + char line [MAX_LOG_LINE_SIZE]; + + uint nbSkippedFiles = 0; + for ( vector::const_iterator ilf=filenames.begin(); ilf!=filenames.end(); ++ilf ) + { + string shortname = CFile::getFilename( *ilf ); + + // Filter log files based on filename before opening them + if ( ! matchLogTarget( shortname, targetMode, targetVersion ) ) + { + ++nbSkippedFiles; + continue; + } + + nlinfo( "Processing %s (%u/%u)", (*ilf).c_str(), ilf-filenames.begin(), filenames.size() ); + CIFile logfile; + if ( logfile.open( *ilf, true ) ) + { + _OutputLogReport->setProgress( (uint)(ilf-filenames.begin()), (uint)filenames.size() ); + while ( ! logfile.eof() ) + { + logfile.getline( line, MAX_LOG_LINE_SIZE ); + line[MAX_LOG_LINE_SIZE-1] = '\0'; // force valid end of line + _OutputLogReport->pushLine( line ); + ++nbLines; + + if ( isStopping() ) + return; + } + } + } + nlinfo( "%u lines processed", nbLines ); + if ( nbSkippedFiles != 0 ) + nlinfo( "%u log files skipped, not matching target %s", nbSkippedFiles, _LogTarget.c_str() ); + _Complete = true; +} + + +/* + * Add a log line to the report tree + */ +void CLogReport::pushLine( const std::string& line, NLMISC::CLog::TLogType onlyType, bool countOtherTypes ) +{ + // Ignore session title + if ( (line.size() > 14) && (line.substr( 0, 14 ) == "Log Starting [") ) + return; + + // Decode standard log line + vector lineTokens; + explode( line, string(" "), lineTokens ); + + if ( lineTokens.size() < LH_NB_FIELDS ) + return; + + // Filter log type + if ( onlyType != CLog::LOG_UNKNOWN ) + { + if ( lineTokens[LHType] != IDisplayer::logTypeToString( onlyType ) ) + { + if ( countOtherTypes ) + storeLine( lineTokens, true ); + return; + } + } + + // Store + storeLine( lineTokens, false ); +} + + +/* + * + */ +void CLogReportNode::storeLine( const std::vector& lineTokens, bool mainCountOnly ) +{ + // Get service name from "[machine/]serviceName-serviceId" + string service = lineTokens[LHService]; + string::size_type p = service.find( '/' ); + if ( p != string::npos ) + service = service.substr( p+1 ); + p = service.find( '-' ); + if ( p != string::npos ) + service = service.substr( 0, p ); + + // Store to appropriate child + CLogReportLeaf *child = getChild( service ); + if ( ! child ) + child = addChild( service ); + child->storeLine( lineTokens, mainCountOnly ); +} + + +/* + * + */ +void CLogReportLeaf::storeLine( const std::vector& lineTokens, bool mainCountOnly ) +{ + if ( ! mainCountOnly ) + { + // Build key from "codeFile codeLine" + string key = lineTokens[LHCodeFile] + ":" + lineTokens[LHCodeLine]; + _LogLineInfo[key].addAnOccurence( lineTokens ); + } + ++_Counts[lineTokens[LHType]]; + ++_TotalLines; +} + + +/* + * + */ +void CLogLineInfo::addAnOccurence( const std::vector& lineTokens ) +{ + if ( NbOccurences == 0 ) + { + for ( uint i=LH_NB_FIELDS; ireport( targetLog, true ); + } + else + { + targetLog->displayNL( "Nothing found for service %s", service.c_str() ); + } +} + + +/* + * Get results for a service (all distinct lines, sorted by occurence) + */ +void CLogReportLeaf::report( NLMISC::CLog *targetLog, bool ) +{ + // Sort it + typedef multimap< uint, pair< string, const CLogLineInfo * >, std::greater > CSortedByOccurenceLogLineInfoMap; + CSortedByOccurenceLogLineInfoMap sortedByOccurence; + for ( CLogLineInfoMap::const_iterator it=_LogLineInfo.begin(); it!=_LogLineInfo.end(); ++it ) + { + const string &key = (*it).first; + const CLogLineInfo& info = (*it).second; + sortedByOccurence.insert( make_pair( info.NbOccurences, make_pair( key, &info ) ) ); + } + + // Display it + for ( CSortedByOccurenceLogLineInfoMap::const_iterator iso=sortedByOccurence.begin(); iso!=sortedByOccurence.end(); ++iso ) + { + const string &key = (*iso).second.first; + const CLogLineInfo& info = *((*iso).second.second); + targetLog->displayRawNL( "%s %6u %s : %s", _Service.c_str(), info.NbOccurences, key.c_str(), info.SampleLogText.c_str() ); + } +} + + +/* + * Return the number of lines displayed + */ +uint CLogReportLeaf::reportPart( uint beginIndex, uint maxNbLines, NLMISC::CLog *targetLog ) +{ + uint i = 0; + CLogLineInfoMap::const_iterator it; + for ( it=_LogLineInfo.begin(); it!=_LogLineInfo.end(); ++it ) + { + if ( i >= beginIndex ) + { + if ( i >= maxNbLines ) + return i - beginIndex; + + const string &key = (*it).first; + const CLogLineInfo& info = (*it).second; + targetLog->displayRawNL( "%s %6u %s : %s", _Service.c_str(), info.NbOccurences, key.c_str(), info.SampleLogText.c_str() ); + } + ++i; + } + return i - beginIndex; +} + + +/* + * Get summary of results + */ +void CLogReportNode::report( NLMISC::CLog *targetLog, bool displayDetailsPerService ) +{ + uint nb1Sum=0, nb2Sum=0; + for ( std::vector::const_iterator it=_Children.begin(); it!=_Children.end(); ++it ) + { + CLogReportLeaf *pt = (*it); + + // Get distinct warnings + uint nb1 = pt->getNbDistinctLines(); + nb1Sum += nb1; + + // Get total warnings, info... but filter out lines with no header + uint sumTotalLinesNotUnknown = 0; + uint nbTotalLines [CLog::LOG_UNKNOWN]; + for ( uint i=CLog::LOG_ERROR; i!=CLog::LOG_UNKNOWN; ++i ) + { + nbTotalLines[i] = pt->getNbTotalLines( (CLog::TLogType)i ); + sumTotalLinesNotUnknown += nbTotalLines[i]; + } + if ( sumTotalLinesNotUnknown != 0 ) + { + targetLog->displayRawNL( "%s: \t%u distinct WRN, %u total WRN, %u INF, %u DBG, %u STT, %u AST, %u ERR, %u TOTAL", + pt->service().c_str(), nb1, nbTotalLines[CLog::LOG_WARNING], + nbTotalLines[CLog::LOG_INFO], nbTotalLines[CLog::LOG_DEBUG], + nbTotalLines[CLog::LOG_STAT], nbTotalLines[CLog::LOG_ASSERT], + nbTotalLines[CLog::LOG_ERROR], pt->getNbTotalLines( CLog::LOG_UNKNOWN ) ); + nb2Sum += nbTotalLines[CLog::LOG_WARNING]; + } + } + targetLog->displayRawNL( "=> %u distinct, %u total WRN (%u pages)", nb1Sum, nb2Sum, nb1Sum / NB_LINES_PER_PAGE + 1 ); + + if ( displayDetailsPerService ) + { + for ( std::vector::const_iterator it=_Children.begin(); it!=_Children.end(); ++it ) + { + (*it)->report( targetLog, true ); + } + } +} + + +/* + * Get partial results (pageNum>=1) + */ +void CLogReportNode::reportPage( uint pageNum, NLMISC::CLog *targetLog ) +{ + if ( _Children.empty() ) + { + targetLog->displayRawNL( "[END OF LOG]" ); + return; + } + + uint beginIndex = pageNum * NB_LINES_PER_PAGE; + uint lineCounter = 0, prevLineCounter; + for ( std::vector::const_iterator it=_Children.begin(); it!=_Children.end(); ++it ) + { + CLogReportLeaf *pt = (*it); + prevLineCounter = lineCounter; + lineCounter += pt->getNbDistinctLines(); + if ( lineCounter >= beginIndex ) + { + uint remainingLines = pageNum - (lineCounter - beginIndex ); + pt->reportPart( beginIndex - prevLineCounter, remainingLines, targetLog ); // + while ( remainingLines != 0 ) + { + ++it; + if ( it == _Children.end() ) + { + targetLog->displayRawNL( "[END OF LOG]" ); + return; + } + pt = (*it); + remainingLines -= pt->reportPart( 0, remainingLines, targetLog ); + } + return; + } + } +} diff --git a/code/nelns/admin_service/Makefile.am b/code/nelns/admin_service/Makefile.am deleted file mode 100644 index 0513d968c..000000000 --- a/code/nelns/admin_service/Makefile.am +++ /dev/null @@ -1,24 +0,0 @@ -# -# $Id: Makefile.am,v 1.7 2002/11/13 16:59:55 coutelas Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = common.cfg \ - admin_service.cfg \ - admin_service.dsp \ - admin_service_8.vcproj \ - admin_service.vcproj - -sbin_PROGRAMS = admin_service - -admin_servicedir = ${pkgsysconfdir} -admin_service_DATA = admin_service.cfg common.cfg -admin_service_LDADD = @MYSQL_LDFLAGS@ - -AM_CXXFLAGS = -DNELNS_CONFIG="\"${pkgsysconfdir}\"" -DNELNS_STATE="\"${pkglocalstatedir}\"" -DNELNS_LOGS="\"${logdir}\"" @MYSQL_CFLAGS@ - -admin_service_SOURCES = admin_service.cpp connection_web.cpp - -# End of Makefile.am - diff --git a/code/nelns/autogen.sh b/code/nelns/autogen.sh deleted file mode 100755 index 426af8b39..000000000 --- a/code/nelns/autogen.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/sh - - -WANT_AUTOMAKE="1.6" - -echo "Creating macros..." && \ -aclocal -I automacros/ && \ -echo "Creating library tools..." && \ -libtoolize --force && \ -echo "Creating header templates..." && \ -autoheader && \ -echo "Creating Makefile templates..." && \ -automake --gnu --add-missing && \ -echo "Creating 'configure'..." && \ -autoconf && \ -echo -e "\nRun: ./configure; make; make install\n" diff --git a/code/nelns/automacros/mysql.m4 b/code/nelns/automacros/mysql.m4 deleted file mode 100644 index 4d5adf3cd..000000000 --- a/code/nelns/automacros/mysql.m4 +++ /dev/null @@ -1,101 +0,0 @@ -AC_DEFUN([AX_LIB_MYSQL], -[ - AC_ARG_WITH([mysql], - AC_HELP_STRING([--with-mysql=@<:@ARG@:>@], - [use MySQL client library @<:@default=yes@:>@, optionally specify path to mysql_config] - ), - [ - if test "$withval" = "no"; then - want_mysql="no" - elif test "$withval" = "yes"; then - want_mysql="yes" - else - want_mysql="yes" - MYSQL_CONFIG="$withval" - fi - ], - [want_mysql="yes"] - ) - - MYSQL_CFLAGS="" - MYSQL_LDFLAGS="" - MYSQL_VERSION="" - - dnl - dnl Check MySQL libraries (libpq) - dnl - - if test "$want_mysql" = "yes"; then - - if test -z "$MYSQL_CONFIG" -o test; then - AC_PATH_PROG([MYSQL_CONFIG], [mysql_config], [no]) - fi - - if test "$MYSQL_CONFIG" != "no"; then - AC_MSG_CHECKING([for MySQL libraries]) - - MYSQL_CFLAGS="`$MYSQL_CONFIG --cflags`" - MYSQL_LDFLAGS="`$MYSQL_CONFIG --libs`" - - MYSQL_VERSION=`$MYSQL_CONFIG --version` - - AC_DEFINE([HAVE_MYSQL], [1], - [Define to 1 if MySQL libraries are available]) - - found_mysql="yes" - AC_MSG_RESULT([yes]) - else - found_mysql="no" - AC_MSG_RESULT([no]) - fi - fi - - dnl - dnl Check if required version of MySQL is available - dnl - - - mysql_version_req=ifelse([$1], [], [], [$1]) - - if test "$found_mysql" = "yes" -a -n "$mysql_version_req"; then - - AC_MSG_CHECKING([if MySQL version is >= $mysql_version_req]) - - dnl Decompose required version string of MySQL - dnl and calculate its number representation - mysql_version_req_major=`expr $mysql_version_req : '\([[0-9]]*\)'` - mysql_version_req_minor=`expr $mysql_version_req : '[[0-9]]*\.\([[0-9]]*\)'` - mysql_version_req_micro=`expr $mysql_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` - if test "x$mysql_version_req_micro" = "x"; then - mysql_version_req_micro="0" - fi - - mysql_version_req_number=`expr $mysql_version_req_major \* 1000000 \ - \+ $mysql_version_req_minor \* 1000 \ - \+ $mysql_version_req_micro` - - dnl Decompose version string of installed MySQL - dnl and calculate its number representation - mysql_version_major=`expr $MYSQL_VERSION : '\([[0-9]]*\)'` - mysql_version_minor=`expr $MYSQL_VERSION : '[[0-9]]*\.\([[0-9]]*\)'` - mysql_version_micro=`expr $MYSQL_VERSION : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` - if test "x$mysql_version_micro" = "x"; then - mysql_version_micro="0" - fi - - mysql_version_number=`expr $mysql_version_major \* 1000000 \ - \+ $mysql_version_minor \* 1000 \ - \+ $mysql_version_micro` - - mysql_version_check=`expr $mysql_version_number \>\= $mysql_version_req_number` - if test "$mysql_version_check" = "1"; then - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - fi - fi - - AC_SUBST([MYSQL_VERSION]) - AC_SUBST([MYSQL_CFLAGS]) - AC_SUBST([MYSQL_LDFLAGS]) -]) diff --git a/code/nelns/configure.ac b/code/nelns/configure.ac deleted file mode 100644 index ef7f65029..000000000 --- a/code/nelns/configure.ac +++ /dev/null @@ -1,186 +0,0 @@ -# ==================================================================== -# Configuration script for NeLNS -# ==================================================================== -# -# $Id: configure.ac,v 1.4 2005/01/07 18:29:56 distrib Exp $ -# - -# ==================================================================== -# Process this file with autoconf to produce a configure script. -# ==================================================================== - -# If you want to change the version, must must change AC_INIT -# *and* AC_SUBST(LIBTOOL_VERSION) - -AC_PREREQ(2.57) -AC_INIT([nelns],[0.5.0],[nel-all@nevrax.org]) - -AC_CANONICAL_TARGET - -AM_INIT_AUTOMAKE([tar-ustar]) - -AM_CONFIG_HEADER(config.h) - -AC_SUBST(LIBTOOL_VERSION, [0:5:0]) - -# ==================================================================== -# Checks for programs. -# ==================================================================== - - -AC_PROG_CXX -AC_PROG_CPP -AC_PROG_INSTALL -AC_PROG_LN_S -AC_PROG_MAKE_SET -AC_PROG_LIBTOOL -AM_PROG_LIBTOOL -AM_SANITY_CHECK - -AC_SYS_LARGEFILE - -AM_MAINTAINER_MODE - -# The following hack should ensure that configure doesn't add optimizing -# or debugging flags to CFLAGS or CXXFLAGS -CFLAGS="$CFLAGS " -CXXFLAGS="$CXXFLAGS " - -# Template needed to generate the config.h.in -#AH_TEMPLATE([NELNS_CONFIG],[Configuration files directory path]) -#AH_TEMPLATE([NELNS_LOGS],[Log files directory path]) -#AH_TEMPLATE([NELNS_STATE],[Local state files directory path]) -AH_TEMPLATE([HAVE_MYSQL],[Define to 1 if mysql was found]) - - -AX_LIB_MYSQL([3.23.40]) -#dnl AM_PATH_MYSQL(3.23.40,,AC_MSG_ERROR([MySQL 3.23.40 or higher must be installed])) - -AC_DEFINE(HAVE_MYSQL) - -CFLAGS="$CFLAGS $MYSQL_CFLAGS" -CXXFLAGS="$CXXFLAGS $MYSQL_CFLAGS" - -# prevent using GLIBC2.4 stuffs -CFLAGS="$CFLAGS -fno-stack-protector" -CXXFLAGS="$CXXFLAGS -fno-stack-protector" - -LIBS="$LIBS -lrt $MYSQL_LIBS" - - -# ==================================================================== -# Configure Settings -# ==================================================================== - -AC_LANG([C++]) - - -# ==================================================================== -# Debug/optimized compilation mode -# ==================================================================== - -AM_NEL_DEBUG - -# Set the gcc specific warning level -if test "X$CC" = "Xgcc"; -then - if test "$with_debug" != "no" - then - # - # When debugging variables are declared for the sole purpose of - # inspecting their content with a debugger. They are not used - # in the code itself and this is legitimate, hence the -Wno-unused - # - CXXFLAGS="$CXXFLAGS -Wall -Wno-multichar -Wno-unused" - else - CXXFLAGS="$CXXFLAGS -Wall -Wno-multichar" - fi -fi - -# ==================================================================== -# Checks for typedefs, structures, and compiler characteristics. -# ==================================================================== - -# Add the define _REENTRANT for a correct use of the threads -if test "X$CC" = "Xgcc"; -then - CXXFLAGS="$CXXFLAGS -D_REENTRANT" -fi - - -# ==================================================================== -# Checks for header files. -# ==================================================================== - -AC_HEADER_STDC([]) -AC_CHECK_HEADERS(fcntl.h unistd.h) - - -# ==================================================================== -# Checks for libraries. -# ==================================================================== - -AC_CHECK_LIB(crypt, crypt) - - -# ==================================================================== -# NeL - -# misc net 3d pacs sound ai georges -AM_PATH_NEL("yes", "yes", "no", "no", "no", "no", "no") - -# ==================================================================== -# Checks for library functions. -# ==================================================================== - -# ==================================================================== -# nelns configuration and logs file location -# ==================================================================== - -test "x$prefix" = xNONE && prefix=$ac_default_prefix - -AC_ARG_WITH(sysconfdir, - [ --with-sysconfdir[=DIR] - use DIR instead of the default sysconfdir/nelns], - [pkgsysconfdir=$withval], - [pkgsysconfdir='${sysconfdir}/nelns']) -AC_SUBST(pkgsysconfdir) - -#eval eval NELNS_CONFIG=\"$pkgsysconfdir/\" -#AC_DEFINE_UNQUOTED(NELNS_CONFIG, "$NELNS_CONFIG") - -AC_ARG_WITH(localstatedir, - [ --with-localstatedir[=DIR] - use DIR instead of the default localstatedir/game/nelns], - [pkglocalstatedir=$withval], - [pkglocalstatedir=${localstatedir}/game/nelns]) -AC_SUBST(pkglocalstatedir) - -#eval eval NELNS_STATE=\"$pkglocalstatedir/\" -#AC_DEFINE_UNQUOTED(NELNS_STATE, "$NELNS_STATE") - -AC_ARG_WITH(logdir, - [ --with-logdir[=DIR] - use DIR instead of the default localstatedir/log/nelns], - [logdir=$withval], - [logdir='${localstatedir}/log/nelns']) -AC_SUBST(logdir) - -#eval eval NELNS_LOGS=\"$logdir/\" -#AC_DEFINE_UNQUOTED(NELNS_LOGS, "$NELNS_LOGS") - -# ==================================================================== -# Output files to generate. -# ==================================================================== - -AC_CONFIG_FILES([Makefile \ - login_service/Makefile \ - naming_service/Makefile \ - admin_executor_service/Makefile \ - admin_service/Makefile \ - welcome_service/Makefile \ -]) -AC_OUTPUT - - -# End of configure.ac diff --git a/code/nelns/login_service/Makefile.am b/code/nelns/login_service/Makefile.am deleted file mode 100644 index 15a9eae6c..000000000 --- a/code/nelns/login_service/Makefile.am +++ /dev/null @@ -1,33 +0,0 @@ -# -# $Id: Makefile.am,v 1.8 2002-09-16 14:50:07 lecroart Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = login_service.cfg \ - login_service.dsp \ - login_service.vcproj \ - login_service_8.vcproj \ - common.cfg - -sbin_PROGRAMS = login_service - -login_servicedir = ${pkgsysconfdir} -login_service_DATA = login_service.cfg common.cfg -login_service_LDADD = @MYSQL_LDFLAGS@ - -AM_CXXFLAGS = -DNELNS_CONFIG="\"${pkgsysconfdir}\"" -DNELNS_STATE="\"${pkglocalstatedir}\"" -DNELNS_LOGS="\"${logdir}\"" @MYSQL_CFLAGS@ - -login_service_SOURCES = mysql_helper.cpp \ - mysql_helper.h \ - connection_client.cpp \ - connection_client.h \ - connection_web.cpp \ - connection_web.h \ - connection_ws.cpp \ - connection_ws.h \ - login_service.cpp \ - login_service.h - -# End of Makefile.am - diff --git a/code/nelns/login_system/nel_launcher_qt/CMakeLists.txt b/code/nelns/login_system/nel_launcher_qt/CMakeLists.txt index bf2096b9a..3bd503eef 100644 --- a/code/nelns/login_system/nel_launcher_qt/CMakeLists.txt +++ b/code/nelns/login_system/nel_launcher_qt/CMakeLists.txt @@ -1,37 +1,41 @@ -INCLUDE_DIRECTORIES( ${CMAKE_BINARY_DIR}/login_system/nel_launcher_qt/ ) -INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/login_system/nel_launcher_qt/ ) -INCLUDE( ${QT_USE_FILE} ) - -FILE(GLOB NEL_LAUNCHER_SRC *.cpp) -SET(NEL_LAUNCHER_HDR nel_launcher_dlg.h) -SET(NEL_LAUNCHER_UIS nel_launcher_dlg.ui) -SET(NEL_LAUNCHER_RCS ) - -SET( QT_USE_QT3SUPPORT TRUE) -SET( QT_USE_QTXML TRUE) - -QT4_ADD_RESOURCES( NEL_LAUNCHER_RC_SRCS ${NEL_LAUNCHER_RCS} ) -QT4_WRAP_UI( NEL_LAUNCHER_UI_HDRS ${NEL_LAUNCHER_UIS} ) -QT4_WRAP_CPP( NEL_LAUNCHER_MOC_SRCS ${NEL_LAUNCHER_HDR}) - -ADD_EXECUTABLE(nel_launcher_qt WIN32 ${NEL_LAUNCHER_SRC} ${NEL_LAUNCHER_MOC_SRCS} ${NEL_LAUNCHER_RC_SRCS} ${NEL_LAUNCHER_UI_HDRS}) - -INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR} ${QT_INCLUDES}) - -TARGET_LINK_LIBRARIES(nel_launcher_qt - ${LIBXML2_LIBRARIES} - ${QT_LIBRARIES} - nelmisc - nelnet) - -NL_DEFAULT_PROPS(nel_launcher_qt "NelNS, Launcher: NeL Launcher Qt") -NL_ADD_RUNTIME_FLAGS(nel_launcher_qt) - -ADD_DEFINITIONS(${LIBXML2_DEFINITIONS} ${QT_DEFINITIONS}) - -INSTALL(TARGETS nel_launcher_qt RUNTIME DESTINATION bin COMPONENT launcher) -IF(WIN32) - INSTALL(FILES nel_launcher.cfg DESTINATION bin COMPONENT launcher) -ELSE(WIN32) - INSTALL(FILES nel_launcher.cfg DESTINATION etc/nel/nelns COMPONENT launcher) -ENDIF(WIN32) \ No newline at end of file +INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR} + ${LIBXML2_INCLUDE_DIR} + ${QT_INCLUDES}) + +INCLUDE( ${QT_USE_FILE} ) + +FILE(GLOB NEL_LAUNCHER_SRC *.cpp) +SET(NEL_LAUNCHER_HDR nel_launcher_dlg.h) +SET(NEL_LAUNCHER_UIS nel_launcher_dlg.ui) +SET(NEL_LAUNCHER_RCS ) + +SET( QT_USE_QT3SUPPORT TRUE) +SET( QT_USE_QTXML TRUE) + +QT4_ADD_RESOURCES( NEL_LAUNCHER_RC_SRCS ${NEL_LAUNCHER_RCS} ) +QT4_WRAP_UI( NEL_LAUNCHER_UI_HDRS ${NEL_LAUNCHER_UIS} ) +QT4_WRAP_CPP( NEL_LAUNCHER_MOC_SRCS ${NEL_LAUNCHER_HDR}) + +ADD_EXECUTABLE(nel_launcher_qt WIN32 ${NEL_LAUNCHER_SRC} ${NEL_LAUNCHER_MOC_SRCS} ${NEL_LAUNCHER_RC_SRCS} ${NEL_LAUNCHER_UI_HDRS}) + +INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR} ${QT_INCLUDES}) + +TARGET_LINK_LIBRARIES(nel_launcher_qt + ${LIBXML2_LIBRARIES} + ${QT_LIBRARIES} + ${QT_QTMAIN_LIBRARY} + nelmisc + nelnet) + +NL_DEFAULT_PROPS(nel_launcher_qt "NelNS, Launcher: NeL Launcher Qt") +NL_ADD_RUNTIME_FLAGS(nel_launcher_qt) + +ADD_DEFINITIONS(${LIBXML2_DEFINITIONS} ${QT_DEFINITIONS}) + +INSTALL(TARGETS nel_launcher_qt RUNTIME DESTINATION bin COMPONENT launcher) +IF(WIN32) + INSTALL(FILES nel_launcher.cfg DESTINATION bin COMPONENT launcher) +ELSE(WIN32) + INSTALL(FILES nel_launcher.cfg DESTINATION etc/nel/nelns COMPONENT launcher) +ENDIF(WIN32) diff --git a/code/nelns/naming_service/Makefile.am b/code/nelns/naming_service/Makefile.am deleted file mode 100644 index 95e510f7f..000000000 --- a/code/nelns/naming_service/Makefile.am +++ /dev/null @@ -1,22 +0,0 @@ -# -# $Id: Makefile.am,v 1.5 2002/06/12 10:22:28 lecroart Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = naming_service.cfg \ - naming_service.dsp \ - naming_service.vcproj \ - naming_service_8.vcproj \ - common.cfg - -sbin_PROGRAMS = naming_service - -naming_servicedir = ${pkgsysconfdir} -naming_service_DATA = naming_service.cfg common.cfg - -AM_CXXFLAGS = -DNELNS_CONFIG="\"${pkgsysconfdir}\"" -DNELNS_STATE="\"${pkglocalstatedir}\"" -DNELNS_LOGS="\"${logdir}\"" - -naming_service_SOURCES = naming_service.cpp - -# End of Makefile.am diff --git a/code/nelns/welcome_service/Makefile.am b/code/nelns/welcome_service/Makefile.am deleted file mode 100644 index 35b7d6eb5..000000000 --- a/code/nelns/welcome_service/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ -# -# $Id: Makefile.am,v 1.7 2006/05/31 12:14:16 boucher Exp $ -# - -MAINTAINERCLEANFILES = Makefile.in - -EXTRA_DIST = welcome_service.cfg \ - welcome_service.dsp \ - welcome_service.vcproj \ - welcome_service_8.vcproj \ - common.cfg - -sbin_PROGRAMS = welcome_service - -welcome_servicedir = ${pkgsysconfdir} -welcome_service_DATA = welcome_service.cfg common.cfg - -AM_CXXFLAGS = -DNELNS_CONFIG="\"${pkgsysconfdir}\"" -DNELNS_STATE="\"${pkglocalstatedir}\"" -DNELNS_LOGS="\"${logdir}\"" - -welcome_service_SOURCES = welcome_service.cpp \ - welcome_service_itf.cpp - -# End of Makefile.am diff --git a/code/revision.h.in b/code/revision.h.in new file mode 100644 index 000000000..6c5e9b8b1 --- /dev/null +++ b/code/revision.h.in @@ -0,0 +1,7 @@ +#ifndef REVISION_H +#define REVISION_H + +#cmakedefine REVISION "${REVISION}" +#cmakedefine BUILD_DATE "${BUILD_DATE}" + +#endif diff --git a/code/ryzom/Makefile b/code/ryzom/Makefile deleted file mode 100644 index 2a1850c35..000000000 --- a/code/ryzom/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -MAKE_NIGHT_ARGS=-j2 -MAKE_ALL_ARGS=-j2 -CXX=g++ -CC=g++ -BIN_DIR=$(RYZOM_PATH)/tools/scripts/linux - -night: - +make $(MAKE_NIGHT_ARGS) -k -C common night CXX=$(CXX) - +make $(MAKE_NIGHT_ARGS) -k -C server night CXX=$(CXX) - -all: - +make $(MAKE_ALL_ARGS) -C common all - +make $(MAKE_ALL_ARGS) -C server all - -mono: - +make -C common all - +make -C server all - -clean: - +make -C common clean - +make -C server clean - -distclean: - +make -C common distclean - +make -C server distclean - -cleansheets: - +make -C common cleansheets - +make -C server cleansheets - -update: - +make -C common update - +make -C server update - -touch: - +make -C common touch - +make -C server touch diff --git a/code/ryzom/Rules.mk b/code/ryzom/Rules.mk deleted file mode 100644 index 67bc3bc42..000000000 --- a/code/ryzom/Rules.mk +++ /dev/null @@ -1,64 +0,0 @@ -############################################################################# -# A few basic default rules and intrinsic rules - -# Load objects dependencies -ifeq (Dependencies.mk,$(wildcard Dependencies.mk)) -include Dependencies.mk -check-deps: - @echo - @echo Dependencies found [OK] - @echo -else -check-deps: - @echo - @echo "No dependencies found [ERROR]" - @echo "You should try 'make update' first" - @echo - @exit 1 -endif - -# Start off by over-riding the default build rules with our own intrinsics -.SUFFIXES: -.SUFFIXES: .cpp .o -.cpp.o: - $(CXX) -c $(CXXFLAGS) $< -o $@ - -# remove object files and core (if any) -clean: - find . -name "core*" -exec $(RM) {} \; - find . -name "*.o" -exec $(RM) {} \; - find . -name "*~" -exec $(RM) {} \; - find . -name "Dependencies.mk" -exec $(RM) {} \; - find . -name "Objects.mk" -exec $(RM) {} \; - -cleansheets: - find . -name "*.packed_sheets" -exec $(RM) {} \; - -# remove object files, core dump, and executable (if any) -distclean: - $(MAKE) clean - $(RM) $(TARGETS) - $(RM) $(TARGETS)_debug - -# make the thing again from scratch -again: - $(MAKE) distclean - $(MAKE) $(TARGETS) - -#UPDATE_OBJS=`cat $(DSP_TARGET) | grep SOURCE | sed -e 's/\r$$//' | grep "\.cpp$$" | cut -d\\\\ -f3- | tr '\n' ' ' | sed -e 's/=/..\\\\/g' | tr '\n' ' ' | sed -e 's/\\\\/\\//g' | sed -e 's/\.cpp /\.o /g'` - -#UPDATE_SRCS=`cat $(DSP_TARGET) | grep SOURCE | sed -e 's/\r$$//' | grep "\.cpp$$" | cut -d\\\\ -f3- | tr '\n' ' ' | sed -e 's/=/..\\\\/g' | tr '\n' ' ' | sed -e 's/\\\\/\\//g'` - -UPDATE_OBJS=`cat $(DSP_TARGET) | grep RelativePath | sed -e 's/\\"\r$$//' | grep "\.cpp$$" | cut -d\\\\ -f2- | tr '\n' ' ' | sed -e 's/\\\\/\\//g' | sed -e 's/\.cpp /\.o /g'` -UPDATE_SRCS=`cat $(DSP_TARGET) | grep RelativePath | sed -e 's/\\"\r$$//' | grep "\.cpp$$" | cut -d\\\\ -f2- | tr '\n' ' ' | sed -e 's/\\\\/\\//g'` - -dep: update - -update: -# ../gen_compile_flags.sh > RyzomCompilerFlags.mk - $(RYZOM_PATH)/gen_deps.sh $(CXX) $(CXXFLAGS) -- $(UPDATE_SRCS) > Dependencies.mk - echo "OBJS=$(UPDATE_OBJS)" > Objects.mk - -touch: - $(RM) $(TARGETS) - $(RM) $(TARGETS)_debug diff --git a/code/ryzom/Variables.mk b/code/ryzom/Variables.mk deleted file mode 100644 index a952922f0..000000000 --- a/code/ryzom/Variables.mk +++ /dev/null @@ -1,33 +0,0 @@ -############################################################################# -# Setting up the global compiler settings... - -# The names of the executables -CXX = c++ -RM = rm -f -MAKE = make - -DBG = off - -ifeq (RyzomCompilerFlags.mk,$(wildcard RyzomCompilerFlags.mk)) -include RyzomCompilerFlags.mk -endif - -FLAGS_CMN = -g -pipe -fno-stack-protector -fno-strict-aliasing -Wall -D_REENTRANT -D_GNU_SOURCE -DFINAL_VERSION=1 -LD_FLAGS_CMN = -rdynamic - -FLAGS_DBG_on = -O0 -finline-functions -DNL_DEBUG -FLAGS_DBG_off = -O3 -funroll-loops -DNL_RELEASE -DIR_DBG_on = debug -DIR_DBG_off = release - -PACK_SHEETS_FLAGS = -A$RYZOM_PATH/server -L$RYZOM_PATH/server -C$RYZOM_PATH//server/sheet_pack_cfg -Q --nons - - -NEL_PATH = $(RYZOM_PATH)/../../code/install/$(DIR_DBG_$(DBG)) - -NEL_INCLUDE = $(RYZOM_PATH)/../../code/nel/include -RYZOM_COMMON_SRC = $(RYZOM_PATH)/common/src - -ifeq (Objects.mk,$(wildcard Objects.mk)) -include Objects.mk -endif diff --git a/code/ryzom/client/CMakeLists.txt b/code/ryzom/client/CMakeLists.txt index db2ffce2a..36090be7b 100644 --- a/code/ryzom/client/CMakeLists.txt +++ b/code/ryzom/client/CMakeLists.txt @@ -1,6 +1,6 @@ ADD_SUBDIRECTORY(src) -ADD_SUBDIRECTORY(data) -ADD_SUBDIRECTORY(patcher) +#ADD_SUBDIRECTORY(data) +#ADD_SUBDIRECTORY(patcher) IF(UNIX AND NOT APPLE) ADD_SUBDIRECTORY(unix) diff --git a/code/ryzom/client/Makefile b/code/ryzom/client/Makefile deleted file mode 100644 index 11e58485a..000000000 --- a/code/ryzom/client/Makefile +++ /dev/null @@ -1,18 +0,0 @@ - -all: - +make $(MAKE_ALL_ARGS) -C src all - -mono: - +make -C src all - -clean: - +make -C src clean - -cleansheets: - +make -C src cleansheets - -update: - +make -C src update - -touch: - +make -C src touch diff --git a/code/ryzom/client/client_default.cfg b/code/ryzom/client/client_default.cfg index c29ca9b93..997699ca8 100644 --- a/code/ryzom/client/client_default.cfg +++ b/code/ryzom/client/client_default.cfg @@ -80,6 +80,9 @@ XMLOutGameInterfaceFiles = { "out_v2_keys.xml", }; +TexturesInterface = "texture_interfaces_v3"; +TexturesInterfaceDXTC = "texture_interfaces_dxtc"; + // The ligo primitive class file LigoPrimitiveClass = "world_editor_classes.xml"; @@ -351,8 +354,8 @@ SystemInfoColors = // NEW System Info Categories "SYS", "255 255 255 255 normal", // Default system messages -"BC", "255 255 255 255 center", // Broadcast messages -"TAGBC", "255 255 255 255 center", // Taged broadcast messages : color should remain white as some word are tagged +"BC", "255 255 255 255 centeraround", // Broadcast messages +"TAGBC", "255 255 255 255 centeraround", // Taged broadcast messages : color should remain white as some word are tagged "XP", "255 255 64 255 over", // XP Gain "SP", "255 255 64 255 over", // SP Gain "TTL", "255 255 64 255 over", // Title @@ -440,23 +443,24 @@ R2EDReloadFiles = { XMLInterfaceFiles = { "config.xml", "widgets.xml", + "webig_widgets.xml", "player.xml", "inventory.xml", "interaction.xml", - "phrase.xml", + "phrase.xml", "harvest.xml", "macros.xml", "info_player.xml", "outpost.xml", "guild.xml", "taskbar.xml", - "game_config.xml", + "game_config.xml", "game_context_menu.xml", "player_trade.xml", "bot_chat_v4.xml", "compass.xml", "map.xml", - "hierarchy.xml", + "hierarchy.xml", "reset.xml", "actions.xml", "help.xml", @@ -556,6 +560,15 @@ HelpPages = "de=http://forums.ryzom.com/forum/showthread.php?t=29131" }; +WebIgMainDomain = "atys.ryzom.com"; + +WebIgTrustedDomains = +{ + "atys.ryzom.com" +}; + +PatchletUrl = "http://atys.ryzom.com/start/app_patchlet.php?patch=preload"; + SelectedSlot = 0; BuildName = "RELEASE_HEAD"; diff --git a/code/ryzom/client/client_default.cfg.in b/code/ryzom/client/client_default.cfg.in index 8ae0117a5..41c3dd1de 100644 --- a/code/ryzom/client/client_default.cfg.in +++ b/code/ryzom/client/client_default.cfg.in @@ -80,6 +80,9 @@ XMLOutGameInterfaceFiles = { "out_v2_keys.xml", }; +TexturesInterface = "texture_interfaces_v3"; +TexturesInterfaceDXTC = "texture_interfaces_dxtc"; + // The ligo primitive class file LigoPrimitiveClass = "world_editor_classes.xml"; @@ -352,8 +355,8 @@ SystemInfoColors = // NEW System Info Categories "SYS", "255 255 255 255 normal", // Default system messages -"BC", "255 255 255 255 center", // Broadcast messages -"TAGBC", "255 255 255 255 center", // Taged broadcast messages : color should remain white as some word are tagged +"BC", "255 255 255 255 centeraround", // Broadcast messages +"TAGBC", "255 255 255 255 centeraround", // Taged broadcast messages : color should remain white as some word are tagged "XP", "255 255 64 255 over", // XP Gain "SP", "255 255 64 255 over", // SP Gain "TTL", "255 255 64 255 over", // Title @@ -441,23 +444,24 @@ R2EDReloadFiles = { XMLInterfaceFiles = { "config.xml", "widgets.xml", + "webig_widgets.xml", "player.xml", "inventory.xml", "interaction.xml", - "phrase.xml", + "phrase.xml", "harvest.xml", "macros.xml", "info_player.xml", "outpost.xml", "guild.xml", "taskbar.xml", - "game_config.xml", + "game_config.xml", "game_context_menu.xml", "player_trade.xml", "bot_chat_v4.xml", "compass.xml", "map.xml", - "hierarchy.xml", + "hierarchy.xml", "reset.xml", "actions.xml", "help.xml", @@ -557,6 +561,15 @@ HelpPages = "de=http://forums.ryzom.com/forum/showthread.php?t=29131" }; +WebIgMainDomain = "atys.ryzom.com"; + +WebIgTrustedDomains = +{ + "atys.ryzom.com" +}; + +PatchletUrl = "http://atys.ryzom.com/start/app_patchlet.php?patch=preload"; + SelectedSlot = 0; BuildName = "RELEASE_HEAD"; diff --git a/code/ryzom/client/data/gamedev/adds/interfaces/new_texture_interfaces_dxtc.tga b/code/ryzom/client/data/gamedev/adds/interfaces/new_texture_interfaces_dxtc.tga index bbeeab27b137f23de2ef17354622069d33f7c77c..91e87e2e7ca33bf8fcad0846b7f2d90a0849095f 100644 GIT binary patch delta 75237 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 wOzxN4!CoHX0h+d&k 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
{Fb24wo2>~lVm~rbn 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 Jr8B}>{6B`FHJ$(f delta 55962 zcmce930Rd?*Y*jtfloKDP(JsdwXOAw#V`ttZdRfAxR=*NtKDgeL*0Yc+VzFv{_?U;Gew(q+)9 zX(3KOslMe#j*aRTl(bUakybsXFQh@<>IoG}T?^{7NgXV1Y*2sVCcmZPQnj5{73-JL z{W^7Sh4MiQR`nJiz5px5iiiA(Qg^FUY1K3O*>rEXdUA#Gv^TBTuBk3o)XdjMJQ%47 zfpjjd*rnc5tYnHaud08LWy^$^*8imD1DZCe1)YWwJ0C(E;iM~1QQ5kwu$EE7A70Ll`+O-o7?pUU|)QHf5YS1!tx|L>=)Y;bBkj+%m z$;qEJyhX{=nxF0pNhycKszFGAvd!+&C~u6)b|&M?!5l!2XicWGp+0nI);Sg0xD$uGGiSHvVwT z()d&v^|Mu!uv9xs^Z7#FPbSE@> z3))($ejM!o30wxlDGax2yK zHjVVxAO`W8ObLb{9_AqO$CRakKEfC;qbRgv#F+*)dK#MFkM4O@lU1y|`A;x&8B<}* z490AX=O{AP>SL+ARv%4Q!!bS>GbHeF?F8{rgL;U^Kf%glta!%CcKMe_3(xD(k^Dta zwmuJ`d|x|RoNG`I_(%2&*nS4v&vn_KK})Xb(HqnvELT4n_P=nZ-_U<#zX6{a;`vMCI%JgJHWWNZWQ%j82G4Iv0NX5 zc>AN_q)>!bIhehULL{z*gaVFt3Hid+nGDWC`p`W5Ljz(A*) zEUZ@y>r^B*>3<<~xH0VhaGwVJ*C9CL0+p`OX8X?WUQo^d636}ckRCm}Mz8mA$B%U1 z!obe|gjqE+lTBQ9cM}YyfHJ06Ch3LiCez4;fhJ1bskuii+^LUuBXrgO7RNepOqXf0 zrzv{%d-T;}+8(`v=(W>Lp!=ELz=NPS|A0QxO?GZV=jK-YzmMVtW+*eP`gexa%&=NA z?5-O_gBAuFsP8FFPci4DKE+L@H(?a`?=Za13}pt^{jr_v>zHPpq&XNf4^rGfJwMU( zq?tPn4~s9(>fcsjJRyuHV4D4Z9m^7{7DQ!2UT}qS44t{4KOm-EkQ~SBP;q^$=_O`f z(RaYCttN~_VAkvZni*OBLCqoa@Vbi{rjuIKI+-{0!-Va+ematI7W4Z}(?d-ARiDw= z%6b2#R#uoH@~~=(_O7{SV#z{7epNfeFwk4d^jc~`&)0ymK;^z%3HkVs6_!bHsm#4*4IqV*d!x&QagoWVq81}YrI zX*+ZV`Xg@j+DOrPy zfLtw#`kSAF3l>X0lyD90Hz?P@)yNmR$Eg29+D>BHWZ6Tfg3y^On*XpC`2Sf{ta?H_ zmmCd-)pVf}R^Xq?#Ptyvt@uG{bF3*h; z9zzkuA0nVYt9TSEZ;MYJ*ZzoU#e+UZO zSNk9O&C3+vni+SR4f7d)h=8I-+;!UTRrHQki}K!29NnO44Hn@vViRy@Ze-jg{)TKi zW7ZCLj!?Tk*Xe238eOKxUld)uS^;2;1dL-qe29QD?Pu=Pa<;*jViyIP>9_6Ld@i9T z&=X}AUvYVd_Hz}TaA;9Vw-B$rpwWOvG>v*un~6OTZik#D@r|)7HT~e@g#Qn^>%* zxW4+3@vMHhyD_RAwHabDi(4OR-vjk3Jr*9Zaj< z`#TDgC55R>0UsjZLL-H*TomNj7G$}iA1cm#rM;n|<5RSKrRU#BY0h7Ro2)OPFyqfBN)RyrshV@td0Mhobs40E6 z#ZTP&N&Ak9j?LF%S?DW{{Gw4K*Jg_qzZz0Nz=!%gj3xNZx!R0BTkME{<%}1wQdeCS zpmR1ckbHDNLQUw4z5*nFx@^$-i<`}K)v&FmV=G)>EwuhB>bKIGD-u-Jy@1ou&&#zb z6yOK`t5#U^iWMySH%f@jx@zn+=-zbaT3%1}dd5I?XXf1(53&xiDB`w3cR)o`zR|W| z=0{7l139=yP1=@#*~~Dlt-AqZpr1DarhcOdFr_Y-of2j@!zeBoGo6XhZIsy>gB-ZJ zPG=TZBXw`6XhoDckdE$h0YpoH-3(y2zTie976#hs&Q5J2=6r_OWt9u0L=kX6f*fX$ z_}@WN7zDZ5!7zlL|2fK+u0Enui<_y47k3&U9nubkggDk->kC&7TlM1Wcd^k)jb;_5x@?3~f~`ACg67l9VXdV+$e&#?N)mKcI5n&E0(Q9LUhJkQp% zT?wJ5Geg)q8f!Q=mRejMsynHoCuV8j**Wb9X?B=2n{D-Wr=bf2hhmatv*)Zcij|la zi>i({jDi;*-2Tz!#TDtrHO9&PJ@F>El43FjjgeUu<`3$&tEl-Z1K_S|$BGk^ zv_5bl_jjx-jCIvIyI6@30l!KY8rXE6&N+(I&vs?>Tx9gmWJDS~!jYNsd^FPej&>@Y zepLILsL%V|?p!?`b|uhTilJNXqk zwGs2PagYg}V;wpN=2Cjgs=KFHv59v!XjQ86`XZ}4P4j2lX0~m$Eh<(lA|OWEj$_+p zO#x2dp-be9#CYoZE`ri_8amLqL1u-FLoj!_J+Is2gmEy8UYvLV(JrqqV;F^DVi?9@ zTTranML-7$(}`jBxL`0x?AOUT3C0f?GKv+2?!2YbQ}gFBiUhr)D}sF!ol4hXmWKUT zrTsl@Kc4M(VEgH|M~jtEOhnRtU$$SZJBud>Z|X4pEEh2NlG98dmzlSvnQAtZ!Df1~ znLf5z#Y&|2?A@<7jCzvDK3s31ktcONB7L}i2AVX74cF)MBL#S7o^<$aqB=uz(F-hrtRZSVbT9*ZPXiKkFV=RVW2$hU=`K$NFla-?5p@TOv|rnj)JGpvzw z)GJn|5KQ?cT(}LPgi>oY=kyHfR%-2q{W5EAdA&cAC}I*DnMA2=G!5jLgsX7#VMBCUNs<q`Q!-T*!wQIo_(L2M=4fQ$Rc;$20OCMm_-K%Jv-Fg@I}p^0D8M zYZ$qfJ@ybm87551@OU!K@1_|pjBhb$WgkN>&zqBuYWwpTa=JFPBPG-Tv|lYg0y3PMuH9qJ(pdci#FM1!h}w%ImY)zdD9H%aJ{28|}%@EB=Sh zoi~{2_IZOMW?uds`Kl?8g07hk2y3oHPBX&AaqQw(jQr8%IDbag(??Sn`8anP*U#pLr)Iv9;iL%q5K3%(&By;e6@L3OOUwOi$fCbl5MgKP9xX0msjV zAQxD3TF8Ln!^<2(qq5a@ac-gEJ-3o+wp`AoC#mBS!##|iDi&yss~c0 zSR8v;(#;E~O(*j+@(Icw?kJ6T z57CM<8h={54_kZIRO#U%lv0nArZvq>(q+;sozgHsq%&+M_HmCj*O!CqR($r7>fxQ0 z#jVw%zS3|3>)}H-Jr-KF9xfjH44K7B4>7;n?>zdL=Tm%N^Rtpi^&fcf5GkpwKc>kP z)_b_AYYuT!*Px|xvUJ1g)xI2oK1`)AQ$dfFRQ@M#XT|@_t3E2J9FbINYznQ)uw}TY z95ZB4{YpKiWM46V(C>Ukn&%WN%_%v@j5^O>1l9cuB_F1gEv!S0+ui8cIXpfbJy17< zUd>@5Bbi7J6RG2Nuji&XXG0InwuLaRo=%)LZ1+BS@?-=4r%!Eq16{T0eduSK-pouE zjx!cDw$K#wBV4biO*KEwm1ful6AI?0M&cv@6FkbjtjQ48iIUD$!x)(yV|Cr>;8f1U zDa>dpGeQq9ue`{Nt|AjFFBz(-elz>;FBZ=H9d*9>5h@UlKuTX=Uc>tpk=J?rz6;l% zaeb)tHX0@95#ttw;f`Sf4{dS|d@Ns=PKOt8|C`U?3m6=|yS(xygWqBBTTS3&iQLMF23V{cNw2L;yAKmKBd)Yn zmju{yMWvh32bE+lz2a%y?{Zczo>*&K#(3ClLW=;el<{=bWwW`6E1fp}W|a%D^(B;Q za?|$e31cEXtJP+TuysZhz{jk{TpCxR%b}y2(|Ti;X57u}sjHhuijM<~AG=ZMB`i3` ztwN9Ar!gLIkuZxD+l+-E5!OUv7n9Ia*WKooC=$yP6f;T)xgR^oFpHiIgU3-j*y9?9 zaR`musvAcqcc*pZo(|;QjI6NBK}HXE`Z^qEOCER@Gta)zCQwDJ+Gi{PXtEPjO;fI# zz3HJtW=w|`y7#bo89&`mjyM0xGJ5)YkYO%uO9ryzWk#+~HxA$~`Cyf9813-T`qDdx z(>ik>=lL2P{lUXFp0Alkg3;5R23KM$d0&$8fIBDqJ2n)YH*@r;>D6NWG2`stshH@Y z8uMso(Yw~Xm@BZ<4D(M-EHLsbBKa+j`5Z!+2E96=LDnMlR|-XwD_wWUL#x*8(utHUpD5#`S<)=X8Qa z!vn@EZZzm3qmFGt4MiFJgArvg%G^bif5)6#p`iSmlV{#9R{d-o4cnhIeZ##H#`EwI zkms~(7B$n@?)^7m_mzC^KNu`4lr<`P@B>qGk>_K2%pK0TQ{R>rFB;OyI0cimu^K&y zvI-22Vr8zlR$y485}z$Jz7IQYM%Y=*c52y9k%~&sm=eWWy=fTis8nK=*~oh;xh{iN zHfUpmdP*-cB=JtpH$^Dyc}e%#DrqyoIDw9o823>9d3|PuvK%%qv&{(DELPTw=on)- zs#|n)hjA7~#u-mjdKsIVA-*V+rb5LR&l=way&$6;IZtdgZm0Td`X2JASm|xHmLjc{ zVBgUg18Z2%RtEN@e(6S(C7q0~Q{*1Qy>xA21nTBc@!1|}H%5G2X{>|Y1hzYu()Jls zsJ?*@EQH7aQeJn{O{O;AlQDWUV)T+2{&Xi1Rd>HWjL{bvY_B%-qfQe-!i$wGalTq& zv=QGNG1da3ixH#mY)U)E7=8wHQZolPo>mPu)kzEuV+@fPn}lPyF$9l|!?Zxjw6>;q z>jOJczmW`;W2`DxyeX*8a9^=9S)8vk%tE|V#kG3lapYJ(BT^ASXBfza;YFrG_IOh( zZa6V=f{76KO(J2kQE{X7UDViXxflpPrm*p;#{JxN!!8)GMLJ%5bipuJMOVkGJBsfv zvibWTFy<92d6agU&BtNLgcEieJQ4mF;*WsaWfDF z#(c(D;KI1>!nkfIP|=|pV@L7BP2=mpm}Z<&tZbqBPHg_NNhyC|sYzztxh#&+GLwgg zNLy~yyV1T{1n7vH8uVAN>6OM;ixtn3FeBJcuexlU0rIodCQ;&Ux&*@ujW{E;lIr`i z;oGJl8bhW#%=_Fx=KVDD-pIUfcQ^WT98Lt_kYT@4Hoe*S5|1un{>I*P{zQ6Qv63M! z`Wt71`T>o!*v$3fS}9UL0(~alvuV8XqfGa$I@YMIA)-QyD|U7{Y~-&lvj|;{apa zKUWKk1jabT7>CgdwegsYodEF?KrL3ZHT?*HN@F1}DrHihTVM#Gs|!%ZVfr-_k|v&} z95?++Q$8?x3I8`uOMr2bF&; zJkeiTt>>Wk=N5(499Tu3ASz#&zITo_$zPfZk@IIo@|8xz55TZ0CZ%zRrAyO0|rnH#3*EbfeUTV{+kWlTeP|T%`_nfms>M#$ZLp zKJ;B{!=vJAk#REIS#9!nr>H;^s+8HzHm%>xMSvVfQ>ZlDT+K|r`Oler0U2x> zU#vXL4URDGW=O;|$+U*nR;pvDG@1QNX#_fCilovSO*?U;z4WjH!NU+5lx~_$j!ve% zWZz@#M}f&MoIM=Gg?mldd5&sp!W1!sn;tlad5Fzq(BVA$^Qc5?k1$?0#_M5Tj(En= zjT*)~#CSa=UM>ylW133|eNE+2i;HB ze59P)wD#CcsWoD4nMtLCun)k)7OkxZGJhwMhcqIeGsU7s#f@Q3Trp^*sfEf%B^Q8h z?sVfZeG;YD0p96sg!s9R;g`H?!hU#ce-rk|)!ZYuuz#1&yCBCgB*rmXdyygWok*S_ zA=|o=f0AhwnlM)knqumqqVx-lFpk3+FWf#gPEd&_J~K7AQRHY7oUm~31cE1ham~1# zmr*h^-qP%GZr%WJ&pDmS(pr1C_e95xh`eW0x(F&?B z&?3r90(()HLM=|C6=H^|d{Te5SeZ%(Ri;wTuwibd`eNm%YIx}F2 z+Wf1Ef>v{Q!9{yFm**sxtxa5_RW#zP)tl;e+q>}E>hU-bY8_|m%#%*DomMPl^Iv2_ z5lm>?Ul4jhUne@-O+=_Y126&*ZpAIMc)3!0aMIC0 zui1yI%Sj68u&ZxK2e?4fb5hUjW~Kn{OK^ZvJ9Ld*%PexU(7e_Fv+@gL+Q%dDzra zLJyl}s$pp7AoO{@`4#E=Oom_Jf_GPQclJ~_`i=$^enF#X_Dbb`y14?&%bP814Brw9 zw5nwc@1_3pj{Jh&3I7;2ZWw6rLhduY=}eJYPc)rdHz(?#Y1v|^Fjmyf#_ zsN5@_=}$MFGQsvD^CbFYC1)*iBT#bFG;!n5*n)Cs#%84H%~IxOlH4rJ?P=zw{X1?g zMDJpgmx}r>H2H8{*nbsgXtt<4AEBr`diLzuK=W6dvuVX@vyVG|6z?>sA5(dNT?5_W zL;bBvF_$sfcUGJ8=+n(6jC9}`EP00hfoEJ0nsB!=f^P0&p3#zLEc4vXJj4Eur-$hF z44RN$2z6l0ZAtx~Wu7`d9GprZ`ySQiTRiE>vcT^Dfc0+In9x?TPHJL}vnqQ#f%Wvm zsL5|0V%F^?>yFHNKeJB$H>@j|bz}eUU&*Wk>2x|yA4=9s_5}9&PYKVUONTkk7{t0t z!dXp(u~%K$7pXeEmI>D|;hvIkZzlXE6YlnJ2*2j)DgBR_KB2lk<}NOx)&Dushv;0b zDN_>dFNqFRpAhF8)H9K^Ih?fTIcd)^%VCn`2xj>KvmEqqSiaN9vflI|og8WI=3-g* zk64~J^+542G@~WUvA?sN$}F!jOYGE&o0BBVhnVG;%yQh{vGfu5e(GZBoWd`fYU%AM z=I&IvIeY@W@(rF@ExGWI_+B$%hohI!OqYD~)fmzqR?$lff=1J<24xuC#MZ93`KV+& zkJEKGoP@!F<#xR%x}=!rA}Wa(;<_20!|D5181;HWX`1IEtVXic~1JU)#<|ovhFlv)5Dvq z<7TvQqZzeY3p%(Pj?9Zg*^&OMEs#9p;K*+;*z|DZMRp{D9ohDGj@S)zML#<~GJq%f zG${zH!?$-ec@oW@DF4WlIQHZv_GGX0q^il215Qt#S!0<%uN{U5cn;!C%R1Tbr4=QC zI%?JlZm15}Fiz$lWH(aSjeURTMjOL28rjDDqsxl~^AS3A$ehKU812!Xy@>xuUUXtF z-e50YmtGu&7g~PAjgJHW(jGWtR10qw_vK>QL@oQm4bPJ{E|O2N8$H;KV}IvHXHKim zNUMEW{Lo!Ple(CXQe6#?@0-K1ciz)HhL&XfBTxFWC-1Q*?@CWj|FJzhNPEESPfIqM zQR(2M(0O?Bc#a(vbuejilmVjISsO1yK4DLWuqS8!&XfBLi)iS5=HFZm($9R1-Z^LP z>~dq6c{DA~R`>o-C)H7?ec6rA*^SSn8<(7JnCS5h_&{TZrMS&-&w~u~oh0$LRDOGb$O`6&^JY$3u;OM0J7r8Jb>Tm?RD@ z*7A0!H$BtQ_*8|`$wO>iW;S4-1<%hmN26r+i_4@F*P_3{8Ey*-KMDLKVl=ZrJ^W8% zL~RN!CuvimWgb=;e^Ip}R4dI`N#8@$iwxt%D<#_5DsT4|ew|hB9`sCaVJDtTjh^GPO!u+-Snx(J$!}t0l?BY6G(>`d_S^BzLV0$7#PJ zHLreh|C-n4yLoK|FEU=yo9M-IZ5Cbau6~qS?$T6I&~6PjpWBJ2wwV`uHj%kPpE@jU zxGZ{;=9K-fW|2HZeVJPMdkVYnrceb6#n>xaE3}yP!o|x6HFzK$bXap7k6r>th$Z{X zxb9HXDIv3o#x?pp-Qr*xCu#m3+zI_-BD-kp`FAu9n|tuF)S=u)NRy*7O?+tmaV=WT zCMr(hwk}y~HPvLT4jeBQA2Vlp(uuwaJ(`GIr%Qb-u}q|n7FMgX|C~tmzavt67m=yr z$Z0M1sPVv{^nES1sr2IcPc#^mjpsFQkhLyww0P_c6FHWX(5s2a_w?0BOC%FHODpQs znSV~C?%xqPe;1MI;@BnaWDvnM>MyiI>CQ8Hwb=G8PF<7n8dJHzR4$u4d(x4q3E53l zaPCze4fhn4*Z%i<&($^;{)WkC7WAHLcQKhIPTbN?z_U(Vp5>>@+kWGCXd5(j6m~su zu$Xt7<8fqxiv-`ewy6HYx8PYK5GaFQejm6$uh@E97Z({G}Ew%7vR5t*Xb!-v;sdbM$pI1{QH z?!=zV*x`)5G!WRa5<8Bu6~+#;+=u?RyRrXC&nkC2;X;IAtC>gF2{bTV{|xQh9i4|= zIT{zim#cwPXIv^iO41F1hz|wLMIiUJ({+#!55=<`B~m9wif5!`%Rq_bMIRhaNW0s+ z!%jGy_N_AWGs}t8ubuumsyZM2B0Z48&t26tvLBvQU)iheR;+ZVpZbOxY5E1@lj2;K zZU8iJ@P4_$PNKW6J-t%Ke)g8=eHlH2(YslCBgQ^>f}N0YH+HQP+aOvUmDmqazwV6P zH})}{!lscu^aJQlcO$ksu%Z9Db^zUeOy7xa|Q-8Wdjg`M9@_Yctzp{Qp}{&ewO zZ1*0sY1`AcQ$xetANv8jEJe5ru(HVDL$w!-ZNX1m9;@qxU?@~MUY9{(Z)-v0AxUE@ z(?C%m=8UuSXr$4YYv=!%Yu7+1>0qQ*w76uR33DJcUcZ(0U5nmA_fOCdDaP@@i=Tnc z<#2U7`f5RF)SuGv5nt!)dN}FK(q)KM^Ryx8S_`zNDLPNxSIn7d$&^fvH6*x(I%o1V zGzH|Ac{=nH>BfSvHdtYZ-m~<)DV9NlX6uJj{dc&pwYCd$SoxLUCQh10PMevN2i;5h?Ra&Dg%djo#GlrqiVOs&ZL=hKQt3LQKOKu}>uRH_-44{Lo1;fi zWn2@XP)R5PP+^^^Te*HGRqkRoam;2rvkBH=a7TO&|5<$E#JMWjjd7|^=u|(VjeZDCIIZe<5B{UNDJfQo$kD;XU97E?Y^al*xAJAGgk7Cz&6uV$tDF=^B za`3pu6Z{swgX6fS{hXh{th#Io0VXnVYW!%by2hAOW8v;pCnkpNv6e~BPI4`5AdUP& zzlJKWGUimq{E{(80~6y#SGv^@YNhGdjU>Llh2fz>Nx`9{JKEtD%5;_Z@V4a>4~F_f z>HY>)E@*1Sl(aib` zP4iRl;W1@q3oB+z54y9$GF-gU!eYacVGMoZXF-qpLOfGoZtX@l9}CRoZa$t``{;Y{ z0;jd>_L*NKUTWbNi6?+7oyDe{ zW}%e^Yd?O(G(v|r0R2>B_oo{Mre{-Q&0xZJw@WQJbk)LwBGDmI%$BWq=F*uC*(|7| z^F&mU83!S67Bj&GDb-j(B;z|!Zm&A!&E#0{VLMBgBfAf5N+LxO?b;<@qV}DnrU~>P{I8$=&IUT&k;pbE< zw(LEqV>``oW-^M>(yT+6$t-Ht9-M9-vdj~;?JYQ-GQN{#FQvEAM$^%Dnk*5u=WaHm zDQhRqX+t04v>EW zb}L@%u1OWfYV*^-H&!F5S|-((N!2!yIx1T%n7-=Eq`EVyK1`~XN%b&{;K}Uv>$(p7 zKx4sB>mb?`ssp9LOlc@n8tSApW$iHQKDvF*G8u6!KQ_$bPUCVc`?)qaG+5I?80-EQ zBXsEVoI^Rx=)AM#+K8~zE=J$xgg;Je2P2x5Bbm{8X0$M{HH{m>NB1A11rtFhvYoay zbsLWa`sxv;Gto)sA!>Ng`YQc=)iOaGnPkDii3g`zUgGVLgX1+Fh4I4OY^tg98WWky zM6NlBB#Ed?mI-Jt8{L>1{vj7~l~b6;H75-NO_{*Q(?R1A&`6r4$)(eeSPydZ0DO-1 zb#iM!M?dta#UHPTTVUBkrL*|T#r1zdZeZjEjJ(oWhK!PriNvs5mitw7Ye6{92jB!+ z1JC~rNxAq=eTo)54$Mp8YPh}>uAhFq3HS-?Ud|pjKkE?j%9F@f?($PsT6WW>rJ4~{ zM$27!fv)4%4k@uRGWU=B$mIZWM@<51NZnvc^3n_~R_>z(>i}DlWl+;Sr0GSc*EPYe zXIM3P*{lP^D;p$i1kKrODWmnI$rVQbyKx)y(Z=AL+4T+9VVo(>TTye&Ux{;C>w78; zFHQzFYNKTaIrR7rYp;^AY7O06jyJKK-qA$hdFx)jAcVVean@d9-wT#s;dv;{+HHA` z)|WE{<Dry4>R(sJof0tCrQ@RKrF0DbzBBx2=7d!iQPb4?&?XDBOJ88bBf4H22FXE7979u3Zca z<56JAht|H7KiY^$yw5y7bn?KM^fAVypM?=Ta+t@*P9FaBz!%=*0}=s)G!wYz;oxaYiW`bEt_!~6&h`a&wy&JHGs)*0 z>+|%Wz*?}?RBnN9&;r!Q3zt$JxMq2kHhrNPg_}=z10(ULa>HL^;BTzm`QoiwoEmGz z(ag%J3_Q*W95m57oaX;z9ZX3-FyKnhL5&oh{~;2cX#@#o!X8|Q@F-CGA!Af z?Aw@#FFAHt@1@yX9;CJd5fln9b0#b%U3=RG)CkN$jl1er9EDHIQMwi@NmxE`L5K~X zc6irH(4M;kP>lhA!8h^)3e{=4t!1-0DveHp$d!yg4a z7i8nI(AxH6nu&~?z~j!Gp|%@Hw^txMc+1Hlx+MfjPiRunEXa2d*iOGAyr4)Cur{#3@FWa}*U zUb4EuZ(kZU7Ke50mo*Pl!dFPS#~wk-b)2QmqsL!p=Sx35f)G2ad4(Q$6!$prybgm- zgEg~4$yABkbFBwdc-5s!lwP-}fpFPlxgW19ucd`DA?P(Qtt2g-b&{s3i_Jz~PX*S|d34^o; z$T8Jr>=|CNnF0r*Z zO1)`ZM^Ouco+wrVuvN|0zGrK{NNcl#wiYXIQ2H&lW^og%ZrjRKqJDhj_bRb%mdy{Q znp4g#>uAP|S{d{tPv(a%gnO4nD#bL%BN3KbgtBu>U6wo(U6#BQSi0FlY2i*IJZ%__ zU|@3)7V*unpR7DhbJU41i7BSg?ocLHeu*5KL_`kz0iir}ePKgz)EuyzCdJR4MrmxL z_>iGvH(T+<&M;dEVJp$nN;!vSKRH6#N)lV~75hSzxiAo|;4JyrP#cOPyQ?@t799>+ zP4;+Y9nDE(EA6Ef5wwZY$Jo&XNo=Q$*p{d)hl%!z&YdPEu?aojok99!Q*v$4a%|l) zkxVwxQ<^vq6E&xTVIqr7M2gZ(WerU9R7~#lP!^j|bA948ah^?NE9jpdG=D(i9()zk zhRLA54?}mR=+u0s(lL;2*(p6s@fMo~C?zmBObNyqgwyc@*wzqAzZO)89aNXCF>K3M z%$XG09x?s`wm$N1(*pgP9Anv*L97^~Y=N0cN;u4n<*P1e=uyp#W*!Fg) zAFOtV)qSxcuzJ*G^$ltD?MACd*=j9Yji*65!MSWGtWH@Y4Zg=T&Ytt^cLy3dHFyZS+Gi6ErbJ#)O4#6v&z%NKzX{dB z;CLAP=tO#Au~I;eOPqp;<>%7oH_~Pp880!vYs@c&MlN8R;CEetqqvOxz02G$(%dYV z`}vntjN9?#xW(p>H{Z*=`9)dmPAf~W3^m?jgAEws@tCz2jawPqi_?XhrzFUZX7;63 z9!W4CBi6SFW4D*W?DL@xFvul`XA;aJxjpQh+%4>j+^M&h#!gyK+_|pzv*XP<3vo4U z+-5e5R_Bxq^S2`vJ!q9W3E_+o>rK)w!LE_a`zb+_v`F?owVivP$-dN`z71DfNULF^ zHoN4SO%Lu4?!jD*ihV!ZTN{!DyCLG)=rB&8^57kGCmjohZ-ebG^6%3_lkonPP_aJ5 z{xs}H+n+=t8Auz-R^yyjQ4Smq&Sa~yq3rSYDq5S!b|b{L_F@eENX%w4YwZR!|^lC;ZD&Gt?nwhkdjXvKqtObl758g?i zcD27oU9ys`^Y^uNg9qKnQX>^71xJuj^Xis#*XlUoVf%o9Ri_=yv&AAqwA|see?WuACgoHpzp2EuarSCVS(EIWVWu+amIEu^Av?smMfQy-1j@vmCHDO=@TC1b3{=oUTS&ZAEV92TO4lUu z{63aO?hNx1xf{a& zH$v-Gd!0Kyn`j+gtgOL%5?JdEXjLe1XMz=}~3S{LjW zMCIp6?!ZdLpHR3KwiJU+$UCUlq|z91^BendcUm{biaG@H*X^HkEh>I{Fmi{Ryw#h~ z5VnX)W`%rMp}gUNWBB&h;p7Y}7BlbBl+Hmu)T#xFRh3t`%3UmcEaU@3P)%1Cr!1%W z!@_;U1B*g%aGuv3qUG|)Hn>%3jPVv(K0)tz(b__ORn`Gou>^uQHQ{)N-$QQ)cPv&e zh=s)=d?8s)XG&m6mh3Acf_%lG)gidw^0G$bi@P}7=Ypeyu%1%n(7>nnY zq2VafMwW$KKpWsSa$8{mKLPc*kVF?3)y~Ky74E79U4ZfyYoSO>3U|JYN1AwGPsj&Q z)>C~|$}-v&-rh%a*&EVMC4PD}vLp0Tq~1%`0+E~*&bjF!231QuGu0nWDI|wmkhkdg zdPoPTye(CFNR>BOWniO9om9agr_(^0pOWq+I=mZ#;|E_Ea4SG{R#F@y_1?1%$77oC zYB#d(j`0#hE`*$u&YifFvRov87Sc&2ZhaHk8Pq07`Og_AKYX*B7%k9h2YJW!TTQXm9v(F`_Rbza9@$UI2^l5JP20Z7mB?jr>bWvRNX^a zwM7)GE|aPrwh02N+wng0zU{q5Z~xG*oV+xt;1w9kyi8L5Y38+FjXjTX10zE?Vrg5$ z3n1)EBhPpA5q*@PhUDQFm;Vc?;nZ`xHU|wd=T`#7i}A08z79AWajvncgYP!@5N!0u@LSu zICrRNigMRg*U1RX-07)t6mbCBT9Cp(4LitS@YWgUjXKWwQZF(r~lR0x>Zd4n% z^ka~}H%bX%^^8E%-06xQlv)t#{5upMElw@uHu4vJ7KKJ&-TY(}k}km~*rlRjl@*ET zqp3xqe6Y@kJ}Q9CA&{B+B7+YHIgEhV^rD`8Ul?fXhc<*%wo{qP(Ex1`2$iuMam~y zCv)?MWkoE5N;QMj98FzL>$40{d0ncs5*{a`643TNm{eLO4`)6iY@k%BlPafEi>TBs z#3Y8k8)^XxRL({vBQu9EO4#(25+1(M$f5Sjf&;+{;mL2X z69*#$Mday-M?flDk{ZZL5n@XJFpEmG7#@wAnkWa6+aCniLFqjwk{XYN7%3<>EFO6? z*6I0!qr)&S`b~xs=SjCOrOM|}feF2E+=`e1l{_X_lb=?`!J0BXEJ!8%=SC+$1=lcs zWR3D3ER%-ICjms&oeY4 zSugm2%YuX-nG&)e77}d}5OZq&Vkf-$v%HfJcXfCWLA&aMeZ;D)NIl*>ak;&hh_4RA z>-%bsroF+zn)7-X#+c}n(b1CA$agVSKhT3Mre#Wt;@*J>1L_Qwc=nyJmvDIRblRI@ z{<~p>3gm3`QO1$;>%<`;RbG@nfVC#jigd@1_yag@V%w)-XJNXG4!zLUODy{=>?u{# zVdII^{M+au91Cou;g#MKLSFKsE@NyMA%?gt>~s^)-*8#rLO`tej%y!2=*(|DUc+xa zP8CyThhT=UUmQ6B1NK=tvR2&*Pr;whaYF+g@{O5|p)W*METYS@NbFl-_tT#)Eoxgv zm)!LeoxeF#5;+F?Z#pZEK8u2V#clua4z8AZ*&Oo-tRSGnF`RaOI`SoVI=#9rita!d zkb$e;8u=q?t$5Y%J9;AvqwyTNoQonP5XBbOqtOQp0+Qc2c{@8pJe_TU~^IXMR7ICOo)D_=xn zTjlg;tUH=@J;b3~F5To?DHssT#EHCcRG_7Yf)R?jF&aE#<4LXRhsX?Qe#e^AU7DUz zjEW6x&s2xpPPp<#aMZBQ=Gi zDEvB<^kUz}7_~cH?H}bWDs)kq&^yD>Vj7jsA(qq<5`D z#lEqP8e>`Gf=eU)6K}`u0)q|(p^09c zC7qehYTvQi;zqT_sT-@JBEFZ+Qt2Dp0zIXf*tS%nEK1zLZFkY#hKr^pt`J9+q?VCm zPlPvK`xWsm>pAQ9SIn_obz$d*r1I)Sxro0UXzPUsN{z}}Q@03*;>0W87ZVFO>;g%O zJ=-CNU`mB)G!bF^!3C|bgnDQpN{%LMUkgdw_0E!-xC8_WyOg?xdx#@9;zyR}IRP(do*a9fL*PoFFQNuQ^E2KURFm5nyzsN~ zmQ=pwQqGggW^rV0tPfK3ho~Wt|BmG|MWtu-k1C4tcfEg%Maq#H5i^#`C( z*)BR8C~a9Gxk({QD#)4ysj47(QmbY1#Fw8r39WtIqkBQCYtlOUxSM8}3uYj@G{x@l zqLhJYt5Bqii<4ucZ^~g$E<*c^O)Hf5 z_<214^g_fvu+c$WzJfLuhsH-^EV($EZQy;Na(sL(KiU%wiTCZ~r_JS^{P`0)wGiK4 zkKj==Q{4PD_Io#RY*sX;n2Xa{ai%7R9@54)qxq_sW}4uqIOiXk4Yfp?Umk{6 zshb@c=r_H@$fu*XxYNbethrV*fu}1kadK<47H6ThreQLEPq^75dqFco+>UW{fKs-2 zV0&~Kl%8XyZ5mvSbr1XnYIy|Nswg|$L zXNmksDILatlOS4LOp?+`;@&-x6TtDHlx`Q}iFbLmOMX=3r^aA^=xQ?C4#BDX7y%}b zu9niLq;&U~-&7RPJ$aGHzbB?6;@izBeQ}_)-9~h)i<}JGpGfJ!F+ZuO)!^i%B7Z2P zIaO~DVuc9t_1KsfU>*t=q{6pSVSLOjyj^{K@{=NeVxz)1ZFhc-Fl9TQHh!HiwPHn= z>ydeY`Aurgin*a8uUW|}MgAjFYqGO|y1Y1MH!wnFU0Ky7iZxos72rYM(ijXmZcCF_ zi~Pr9(%osgr+$(+S0X*O^YGh3boP&W81fb=Pcc_ibZ2cciTrgO(g!vAJZI(p>DHK+ zfMFNOO4MA)$4dEfDZh>7cVJqg2SV}ee##L{)t^>1%EwFjj#6I4e5sM({!#JK(U@0Z+9DD%q6%QTw-h}tMUS!QTU_Lg$kIQ8&Jc4Lq6Xo}jw*!c2r2r0 z%;&gb8bx!Z=tENU3n_Y;MZby(#q0RT>gS3xw;DzBr06^; z`hyg`&7wbXtvEDaKTn+Tj6DDXdJ$C+wG0HFlA_+R$oiXJ?Vc0)&0?_>9<*3rAkJtS zMT?~9CMl|uqFNR;#4>>rCJ@>vS|&wbl%nBMG>kGMXOjet5LLCik_09-KA(Z7QIJ`9%a#ijiPl@^b;vMSc(o}(V?-C_+uoe^|Qs9 zv5le^r0BO&bi5QD$D$LZ=p|VFC_i>Tg5@uQu16Jt>u*wYmK2@IqL0LK&fJ34j}|*c ztAe6gvSqx?UMabRB_EG%gJYqd2As6Bh>uEQIbm927ePu}q%_5H7OZWD_F5M!bC(Z$ zMu>A;W4VJvT9MMRQo3A9Z)52lu^0}fgz~G4Azjrd9WSLjN@*db_p$WLu^0}fCGiPP zNFQyK&XCf*rS$Pw&hlgJICWz?yVJ}pej|UpxO_U6`)M;AW{c(*LXD8p@5geVJJSw* z=)>5F7(9B2%a$7-kG9w~Sbg5|5)Iq=^7 zb}5UHunr`FTaq60P*>sBtx>pI3ZIfzyE{Daht;~LEI`gW!rkfDO#LW4;}Kqi94nos z>!kE2QhKn%7xTj4lvzky2YTb}0eWosH_$8N93K}e^TetP(F#2KRtk@Is4?Y?Pnj&H zO?04_-yWkMQ=#BC$FZ4?+6rY81b>4dHJ@$p<0UxexLFRK<7TBa&T)M0mKIiO5L4&Lr_cXiUEcv7b(OWh328!rK-we_GD&78g_J3olBq$e zSumDy%d5(w87u z9N3h3mgiM<`bg$!5NZgLn>Fcmv476+vf)TtXIU;P8*4&Evn<1MSyY-?0-_B>)P+AO zV%M(BZ>WSuefkh0lB=@QRp4-WIU0&LEtaKXQ(`haKRt#;vPd$=PU2|C9|ZByk<9Oz zBR9P-a}>2oSA(NNEk_%0G=9xcB8!eP{1Cxy{QVK{ozMK0;rZ!30LRh7S=(wkze_rf zfvb8OT44xnj;bf#?1r+u(=|0xq`hI7CyOpH(OK27ngfyfw=zS}3L0tYn~v4<%p0~1 z;)mWj@Ie}oj-$A$;k8_Yz_q7Aa;QicVOT1QZZp>n;)AuB78EOYp=573&EzJoJ52-wMh~Rp8SZ9)R82%-IZI$Xz8|6wI|u z7gGXa;cwFsm&$32sZhaL)Ib3-BW1s+EWN_8Bpo~T84)>a){5v3Gl|BkoC!o)DY6*LzXczn~*yhx!2GR zO>q$qY>nP!nI)F4PefCEMpj!14ySPV`y7`Dsb1ins*+8v>)3>wfX&}1nC5jiL&Rb@P z#@|v|x_dd)qH)(4>IIc3sfSk>8?v3ZxQ@Qf)Dn>hsi$Ue8>mfoyGz= z{~`Cv-)oVN3HgkW<7<&~6=a1aBR@dQot?88-C7m}WYDOnZ&b!QJn)08v+)j&5!k|7 zY_U&k7=xG7-Z(;j5Rnl9a9k}oioo#%76dMeP{HI)Syt3ME#)$>x1GNs2fO7kI1FUa zn9lHmk+fQ8og*4&8Q04drCDnL))07?PqUuEI|&>ri?cJD0_>^oh7JNAmrR%rM;I|3 z-ewYf7D#&N<1BJiq!G^~54|K~nPiGl>HH1FTjQ+n5DDA`rWsdanbDA5eXbS9mhc!@Y+Q|@ucubz?}SQ%Cs}F8B}@@P z6yG3Sd`5eWe=h^F!WUZ?i^vaAAuFQw)Q-zlIDTKN(#T0VeG`SCBx4AUC^hy4Ot6s% zw$&1BB7#qdAejj^fZ!<;SbPL!8N&i_?XM6Ft;lF6tM=9s>>`5Ch``DOJ3%n?$5>d< z#z(LpMWD*r)XF}Oj$n%qal4-Kwktk*N309+2p4t7woGz}NP?n3(#=P5+DFob3<;3M zXPM-(*OG=};Cbs35&11y(w#}pf&^*o)A1sLK3u7bt4tChwhXW@ki|Ec;eIW{En@hQ z7zPsq&uE)&s5*(h2Mk6zf1JLaLi2!W@YLa0`#f3vkZFFerFl#=&x|D^VODsg+%jH2 z&&Typ)rCSg7tPg^i$+3)C6j8VDI9|Bvt@BWCJnUuCZ(s<69a>6AZm!C{c~eX336AV zezK1!AO=BlCxlMuNANNrEOP*e)MD3i`*c|x!9;PjL{UT(52DCf;aXWK^b?o}PbEfB zuJ2<)SL!8FGm%DAZm>_5#Tq8cs3p=7Q5J}P4Oa2JMV#DMsvqlP(~wz5gid2_UY0kW zV@Z$)FX%^d@ese=C8k%ox(hBQ|B*Ssznt75tA=|^gXfk8*`|obBTP#28d^{SeA@>u z-8CS_uU!3U5Y`U_$)ixtRpV?uuzq+BqLoLU=!XSL#9FPdy&N*g(X--nvFV?gdA5$c zwa|1Dx$c7vxj5EYFU>{qYjK&i%!Vi0mu7|r%4=&(r}6t}{{0%6wJyFCzh6(kUz^!5 zP~O~TI)&dS^Y6pN%NhjJV+)hEJ$@_Xc92{-%k5=3E6deW@)W+DO~M&6`C$Af5dNHm z53tfxth6nJMdts*a!v8iZ>2(qXfAbC@nsM{L*iet_+=LFPU3iq4pwwg^`dQ;?ix#8 zC&}+v@;*xrCQ0NVXee3?p#20St6B1AlKhD!e`m?@B#Gn)^@V4w3aylOoKB}L+7nM**!p7OO@Pk}qmJ27jMl6T3#kg$vj1>uzdpbV0k!ZPGg|M`2 zX-rga0BI5lC-{UjARIzzjOjnIFI*KZ%S#OjL852tCV+16LX8YH5!B#=x>%27dv=mN zMyY>Uy$LE>l3a_d5ZH}p5IeBkQIM*j&8{8XKBHm zBGdYD5&M(qn?BLuEP9(o>k8)$)lgcF>qe`o&Bl=EC>9NuKTXL#fZBM%qIh2KA+bVq zCX3D@(HSfnCVyC%eF&n#MpPU>2Gcqq=1sb>PApRI1n)8uUg{HG!@|)Jrptr82udoY zl8NhBbUlf#^@(m{(PS2FDqhvZpx?ww&35&6u%etKf6Z&rk`7c4YpLnxeXd*7DfjT1hHWH?DS(uW1gTXE)-K03j44e45U zlx&=sa0rq~B$>dH8MTt7EQv9jMBCjk+1QwH3@$Pz`)YJh7Ir}x%RMd%(ks`Aau--G7a zssAlNUK@^rW1Z%c>refyk!(Dg<;K{{8K>gv2y{{kor#?48{&3k$ zgRMJDqkYaG1Hlgw87Q1n7GF!~1?SD{_Sv{QIu94XKG*co0rJs(GfjYl8G@Uc>#9ED zK}3d2=2RzK^%L*?q%V>9;~dC;XY%nZiSG2Xs&~2Cs(hX3F5s*mr)Q)5=f1RU_$OQs z#PM~w_)?gY%vM-IwdV!5sJk@&jvW29ITt>@wSNlZW>X1$Nn6%_N$bhb z)h61RQvj1C_s?2zXA&MWpj_P?T9Q~x32Vt!&Rl*kiGL(VXIfhM$#Iz$=;A*G{#*?w z;E0oQ>i?MNI5J-Z>MZ$xrj8VMlZYB_Gv`c9UB=W-h5FaB_+Mq!Zqrp1U=NlD^d}rt z;WXY}_*pDnYRC*?^j;JEt6vg7nCPLdA81-J%Bq%z{iu}v%xP0jb{_AK|4mjM1E&C6 znY?z)gsb8EcT7LRy1@~x#nXY7zfpnf3eSDhdRo=uu6QRsfz#=UDOXmFVY&xQrzX03^1BD| zjX*b*>2{lN=l;aBI8dzd*XhO00?SA*-S4LL|nbiVKhBrds zw^MORtwLpO$c&J47g^H1KW+-n2G#JOs8n%fj%B_#jWCQ*W_6gkJjTsxRc z&s+!-{2OkAj_cK_%oQ%@?6cq;rpQWG)h|dwexC|Up)kAPcJX~q(@^n_iS{XKq^rt~ zgkhg^h396`h{J6)9giK)WwLE#*kCfOEg5zyE2@z=a@ew1m^;9+WMWI~z!oALQcmoa z9Rs2>Oq9<=a2qAJ>$*)~+NpeUAs>B(>#93hg>DL_bHvm;yF?Up29s+sRu2V(vg5#X zotgT2nb_;*KwnG`qUscxRG7U1o*~?B^Z?9PH!ZV;c{maE2hpBSBUN(Lxa~rP-?`>_RPJRD&ZB$2ZuGAz*%C_F_>mi|i_av)-s;CJJYwB|f4hULrjE z*37E$nIvEmjgNDY*6HG0h#^Y+bxrnsQLv1x$|9>aF&SfZA7ykG%s0*W*5_#jMTx)xKjnl$}*x+MvL28Gg_q2CNpgEdAHRSf89%r zJCHk62@nbwYma3Ago%qe_xm{avuPP*+HErJD4P}`j<>chc%JPPv3(A)mX*fe1@tK#6o~^}t;=g@>Wfz|XBUcsGpZrt@(H(rVrfcmW&aBk z7BgK{MvvTg6%K5osskAnY=%*{*{Cpac%XGj4O=78>3%kzNxKdox^)zvXRUAn`)mIHCYbvYM32NB2 zknCz}#%N47Q(vtw4sNt6kD<^GIad5F!#qh~3MyEt{;R04m@mt!9ZaNWA~hTb6PkkP zz6GOkpS5N*TA2WBwYm7t`hHTcf(v@=|UB=J={@ zRt(9(sIN_JnF#fD7zOkZMT%}6%(F0o5z#B+pWVzCFncjkzPKz*+31PYIAhkW@Ay07fp)(#YawHuRlw%VFepL5ynZyKgUVS zH1hxvWg<>YL+4t;My${DlTp?Pj*$@|2NLdzstnsPk-5q=R%GtTvPl>^0&JMkTia@9 z&*dT#U(#~56GWX&_`pP-)?-!I^{a$6&#!ltpLx|wN0)tN zY$ocYMxN`>j8}=#*IrAd@s1hS^i_Av{c)^VQu7O7`vdE`WmJ``Q=Z=f$ch45 zX<|&5(9-`UvG0K%SF*iopiAYtC+09X&^;=Bc41^OTL?i7SJ+*)?LBkrB8+b|Gz|KSx%U8;4pcZi5K{hF!V}e-q5ouA0MT_tpygk|RcTus?RE{_JY&iJN zm)DXlp|BLr>XC>*?xTgOFAB1P<)bvq6sTIS6lzK*J-u^4Fvc32M4K&{*f-Hy-<~Z6)d9n!4QGTR4tp?by|_Lf-0WS-`4r z6L|(Fvr1!y$h5wObZA2)0=Zegbw{K1Q+mjpL5}yR{yz9#gH}P}*TIfLQE}6>Rz&@1 zTTNM~a+MnUdhqkgIt)ZjQVHevLoM&H#wd|;U6sdOQKpSFq(EI50{sz&_SP>NOk-5< zV#YX9heywT)hrfq;~n!v#Us-747!>{sGJJtx$!j>_)38VSv{Vj?|(nZs|d+2enu_U zv>VO3nbQp#Dxd5Vf~YH6lGhV6<~rU}0)3ahqL_DkaugPNOd(FYkX$^I%W!YOIlE~XSaO2on# z?Ha^RlcGpc6c0sTWTe^T31JCi*cVGs3$LuOEcA6s`Q0kZQgp>|JT7ZY%3e>|l5p=? zVra_p?5Xxd)k-#|kh@uKatSdn3(3KA2JIM#{zuV_m| z>`_wFn$)~TYK|mA%~7wKmk(Po6yRfe!UDHb`Wy&jXT^ND9-cN(tR6OoJry*oF zqIE$1mKGyDRK(sU>VZT(0@RHoROu4ki7F>TynNHLz}uDYTGse@$AI_IERRvPePEzt zBBaa2)FQi0Ao9_V9h=4ciCUh`VxJIs0g+Dwd3AF`wCFGi^KkhSOB`!Zs{fH?j>O=A zcP-b9Qth*pYBz7pGm;Yd>O3u$1EYhS;D1NEfbM)FL~O7V8s?CO#W`hIZd+-lANqjkRv{X=qFu)+-uZvXk0K&i&A^S*u6w>zrFz!$&n5 zl1alx((nm<8dfD+X^w*inrU9qLIY2er_xBn_C)%i?8q*qd}uD&O>d-#Rgmvy^DSh4 zh$z~lMR$PlR-&#T>d%PU%EkxKw<=V0YnBrs+L*C|Rr-?M`VshzwcnC#LH@@*bD=`M zdW`woD8?5ZCw>*e&zzWM4-@~F#NXBm$1acu3vFvFyiA^25EhhY-3;EB`9nx4Qk=3+ zzVV(vj;yq_W9{ZF6GdMWUsHS`ob-htzHf=IyH)M|0wr_>AKQ7jr*#|nIuYM>;&LckEVCOV^28i!R;u~yj>g9_Y2tJQ6WF5%Sd(BAdDiWUEqjB_geq z$h1V3W&cQIZPW+jSi*|%rl^h962(7#?-piUM~o&fW0~ON^+B8q!K4#Uy}D!uFbvV@q!x?l)fa7cc)ixtYvwr+e8?%shgM zT=fdkA0_(MW_*HQvu~uFcHFevj#^)WpmLe~${+M+XAk4|~o zc-CKx>zAmOoqFhSt~&R;bAwp*I?-Ps`mRL(2GNJhk1tq55MH(x={MreS>Gdd_2hv| z)cCL-%vHqP-^+Z}%dC;zhJcxe|1IZgvFa_fT;^@(c+9|Ntcph1*Hf|&wtdfSYhWGG z?51_K67q4^%Z;ols!)q6|Cn4_PT>SvFZ+d= zU@me#w^E`krmobHZw?;5h;l8*f*ymy9_{)&CS3D2Dz`}ekhm90qsmr-j$b0HVr|M7 zP9x4YjzI!2b$fIuPG?N5<~`h8 z!u*+i3EOG2ZDqDAcH45UffRAc7-M^WotG;I<$`jl`hn0L*G*=^ z^(8shyd#b6Y&)6oR-R2+6NB(&5Z0KN53X``sJ~qIwJsb_;+-=e=c;S{EiufH#vZm$ znc;_?w%IxWP=<0DTOzj8HBSA4tF<$Uc_uD%L~jEOeNvr!_SPO?p4RR0<=m%K95CTcf{F6o|W zJB05d?Tk)^CjX9bV*0V75c?J--fm%l<&>N>&$cs&o_Tn*)V5YeEiqy8eS9&BFEHxK z!%dShTCm{(P-w7po)Q7f(3Q6R!2DG_T1%J`FUA|NyDvRC6g#pe_{x@-YW7kF*{?fC zg^C#(%K?NT*$x4U&0{CLoINE`WfPCeiKNU+qE_bUJdCZ2;?Wsv{MSX+bw;1&@ z2Ir%%h~~79Mj}{P1-%zEpW=;kQP9P5Kmqr@2=I!b5pculq(Z^JBiL1f8TY0(k=uqP z#{hQQ3mbrvcDsX063E2KWepO;`l((KkA5QDgIe5V#yufiw0Q5|h-EJrYuPJ1{erTJ zxqaf`{5D$knt0@wv$i5C8|r8plv@yXh_wvmHr4K?Yx1S_)NhK>vn~5&r;r?|t(uHP z#e-%NvQZ8+h7lCa3g~KvhKY623Upx;^*|g*Sw5Aos&b$dS@;1hB4`3Z)wR&AK4>yQ z>xntdkpp`427;y#^yR-H!}*|f1T_#;Uu*EEUT9`ka*)_;)qYI)84kP}K6)qNZG=y3 z8;{v#JGE{L!spiFPx@51)$SDI{)%&w(T6O%WnR0SV?m;5bP{j}3D=Qu`L(!je7Npf z%-wAz#&_f9Q zazC05uMu<7HixDt+m=;@q!rM22^wGp zbRI!F^^VbqasDwLj9G#%A*j;0O}$W5Gal&@+HKUW=DbhM6hZivgg^LYBob6Nj&Wf8 z627EXb-GV=DX9(>ll}*1MWZzY-AqvbXHn^5YGRBPqn4m$UMS94ohbpRD|&p2I!A~Y z_fKl1Y%6#IWZrH<8{6X9^0~&CbWwdEX9GsB*KnZQ`_MJFPR@SYenWG7^r5xk_ zk>%b~7x(E^@D~XYY?uOEzEi+Kij|VYI7( z$+rm^E~fko@q?oWST~44`@@^cPIoYrRy0lq@FxO3@ahC`vKRP-fK9}le^U*Q1@Q6v zQ2_ozWAIu;29SPs3|zA^a1oWhAceO@qBvLwq{o}~JGMzHQ83%OR&3fBt&u%L?8xVE z>6Io;aK0Sb4nx=u?O{ZMRtCvxCcyzvv<`jiT~V+cP+gV_P!&P9M@B+(0-@Ai)hV)a zYYOd`up~$(6mEnz0QLBPqta!+6nhy^T0$8JrLRSO3Y1th&x1$kth#c>?F6p)b8_XRcJ}v!u&#{kivdfx{94>Mz|lb= zh2Dz2-E}MIB(mTvpmiS@Tgj;llP1bvgBeF=(c!J)vtlzV`ti+zK2E0?OLiGmwI zU238OY6znS5^5BoMtV^=digDdR{na9q7}!+>x!1D{~-z>J0#Mc}?(jp$O98HA>2~JE%D;o$xBUBF9O$2ToSbCc|#OL z*uIxjS2AD)0oD?r#0T(3FQ%t{1yp-7^NA?X*zU`jn+dXKBLbiwl@p|lAZ_Rk23nyh zxpE`$G*oIBkUiMWpQP>vzNUoUZC@EADk~6m{pbLp_j}R9C@b8$4gi&_TjHt2R<@ty z++!rX?{H*yd@xD)bgl4axv6(*s8_g)?U9^+(Y`21>^>LS8v~Anul`ARxKH@&mQkT{ z#sC|oaCl4p@x47VQ0%xF*^m5*GvvW)dw2Yz_GCRlCRW>@U~SYiKo*R(Ex}Jy;M7K$ zBtQDYK3wd26xpjz;$NPuXkzQmz1@i*UeM6E{U?u(5H) zCJ#r_a~L8Mn>tGB{8`zm_%d-YGAjQ?%G9JxL&_4o%2E|&txH|#h)qQ^jbkv~^l}Cf zOIq?sE}BPiR{?`cfqLA8E;9(vpXw%Bc1Zq+Mmj0!^1E$|m9? zwEuWK91btHjxxVUdp;Gl3l+6vjj|8kcOmV{1s4ucQbcSQ2Yj=khmxOU^h}9dHO46(SpySlU6=22!=wtEv(8?RvtH>{YeFt7;3YLVB{Tj@4{` z93J`0nMDe6#E29u(V{k3deL895`Vq^LVabdZzt(1_tsYR-X4-cHM4(r6$90_6~!`tA$W?q{`!NbLbq zYo0=ZbZy;yt@Fp{xX!^tJ81tC+(r=+8nM4d8zCs6Ei%tRMXJcMs{@M}(!}Z4 z6M|*`cIqErsPHr^JWC3{B88)FrACOs&5<*P{i&^ z5ffR3`1cw3p+Tcg_UNI0`a)$_S=kLz_8lpU9PGx8W|;WnI`s73sfC`qoVO6$O44)w zp5vZBl`dYC56+n(epqj5CLUb3%p^TYvg;7_?=RHzfb~2iJwLIY@ouaSLU?)={twY^ zZ|R~UW!lr^$!IqXDQhCT{^l5to;hAARE+r7&u~A3o;dm11a+M{|Jf-k8d#}M1~{R{ z&q~E9RMb$;P2nGaL)@G?DX}uEZpuGMjdX`PXCpty=N3FVTbMJ4$nnHf9r%jiCl$5} z>W~+xkqyFFPXy^{#Cn7qOFN|BqHTj;gmbo-_?EMoG{vTjhn^HF4j!Oy>Kw~GBS!p> z$l;RU?XPh7lR#OdY`YRU(*LtevVoeFX-HWDD=Sr$At6#wvBo(^eAG7`y3$xzI_W}w z$#k!-NKsmv^Db$Ct|UcQglw}}9r{9Dde)Uqx(uvKx+}y}6HeqjhPqBZnPd zW#9%}x}45ATqfv|HF`{no<_3eZe(nKQJHdCPb=qY*{KETX?)bZQ#@|zM4(S2eJJb6 z^XZ}UYghYPJx6Qww5-u{?7!&AXFXj=Pe;~sf%J5So}m-9YMN6mJrzCD(#wf+EOc!& z&xM-i>8z+gcFc?Fuoo7kFRK_pRrV%V*=?$_{#0cx^!2GI_MxmILM%ES6C&NisLw$U zCc)dvB#5TzU!&*Ff6+6N^^7Gwqgc-qce!{x#<^H@=%|mxpq2JXiXLg1>@5mZJgHGJ zrbfjt|3$@gRxz7Y%wQG49;lcF75D!qC4r9j-Sb&Rm}u}e?(p3Us3=9jcK&o=G#pGV)1*?EoI{pD;<$8pj0gux(JtYiAUsBd$BFPX6P_i)ub8kq5uPDJn0W~a zHL1h6zwvg(7UE2I`x_Emi~VH6>j{QGkzHl78$|XUlMN=a>t3?EDYQ62XSm0mVKAaR zz~kpHm%Wwn8C-a{l;4w4518j6@%+R*<2@gVAAWY?IuAxYMe0)GdHFZzbgsMC#lObe z+Y(s--nW=YVG=(VM)j>|Y@-$qaDm3phPeYf1w@z^dRB_+IxeMvbyF9BD^%u%x+Xlg zj@3%>PQpJG8re9Ec_N6X5%Ih-A?6j)M|g&a$KfudXMjzysVl*QTg;}evCr|O%J<(( zkSN>AD7a6lnMXrB30|HKqF*U^o+h~vaR{C?=D`Jhx@*{TJO;V`qXY!VDLi`c)LUn( z`)rf5!LuE&G!cH=%~-#iU0A;xyu=;xD697UU%A$J+?lG*$JjHqN1bx@Lu3wl!?pX*jF)N{`!eGI zVtmuf_!hZ){n1}B4(sfCvg6RyuAur2pNbK#vOiHZCTB9mxRHdM-wywBw{yJn9@Z&9(JE@TI`}$?el^&cJdtR#M~vB?A|^PGRwmWQBi2j=NLAj;`no zn5gF3R?5V>j;nqlyey9Ed{y*W8I>=#ti<6`<`TML%9}ue60_yC=;VBWnu;rjF#`og zIdDt2TrOJUYK4Er{6k)3QxXzG>^+<6<8g`Ehp#rQ8k?K^Mp;E>vdrbew%L z=T+i7|19DgJbL3LtRCo?E)U-GaSe9RG#4rw+$OKVFlij>IQ;@Hy|h1|>pF#NJaefy zy@+^JfEwKQn~Pk6&@S-K`V*mLlH=qH2-7PpIW@KwGGBzaI|p^QFVyX&Ds=F4S7V!f zzT?=7sNh^gTs3tkxcgwYNuBfl3dbCIu&LWycfzs6XI{L>iOzW)y%=9+$05G}>h+e|j+exb8y$u6NV=P@1H$C?QZIS4WvFnO^6^@y5pOecDD(P76v-2g< z+?oThMz*PR;A=5@5Ap3L6C;oiJqP< z;3O|a=ACft2Gwz*x)?o8=H=&LnaDg}oI}!>Jr{gD=N#N|kM!bFg6aZO!FjTK4kiOo zU3#9XPct+%62FE zw%k54N8>e!T~zlx!TAwwMy@<^EC;Z(YO)(lP368PU=pu(X^tKG_?$QC9a_EY^wd%2 zS6Vbb3hB$5SenW&rsstCYzn6I-d6&hV2P0D7r5!@C2MD?Y+Ie25S86~x5BxCs_ zE@_EIBd=|BKLAaNJdy024Kqrq1A!#%&m;#Q*qX`HWjR5R#c3z{e3>=@**1yfN^7zNdHqhh>EJtCo^R{KKQ}u{ zB(3D2Jm>1?NT@h!S#>%mppJNYF-k2g-==Lq0#0Q07FW6wlU`PTzEJ2<+?ar2!Ep5u_) z!|aMRp&~K9`A)e@kTvI55J|TDqp9aCStAb$BH>$VZ8T1<;YHg+PFm%h_Z*klzQk^j z*VT4BXcv{$9Fs^Xb8RF?G`;*I-N#kxT;eYhlkFqPWwn=_y2UyB|InD^O}+gQd^nKv zUZi=Nm&r=Wg{$y#IelD`xvb!-{2~@ym4D)r+jH$H@S~cZ7A`VgYraiZ9%Y)tU^Jhx_Pm6CJXQ!by9ueW3VYcyd0?T2t@-i4$`Zl~|#hMs!b@?vZmpO-TMzm@Zv@ z@q`*QZM=Pm*vA$3^iMQGF>QLSX^WdUDBzyD=FeZ)G>3}1^`%bpJJKpIk(51UV?vAr*v zi6dQyXzB`D!^HDsn#yIv>6ftMynKk9AM2Xn{TMd56OCNPE2CQ}Q`pQ#Zhh&s5<8|{ zwOIFYbNDnRBUL*lG1pnDCM2yt21`Mh;&S>6OR2rrQuQ#oD9tt2Px#G46ieOB(e0Q^ zZZETEgXdFu(8?5M*8>^5*RvaVJRD=jF6u!9Z7$f`W7R1??&<0Rf}=Icui7cwE_M@xQ~Lrtkd#~QdsajF16eeL zuz9!b?Pxu`YpAO|u(xZl5A1{Ml&gONtiZM3pM7^$O>n6JEs>RzTtE zwYr=_<>=B*_F0&!_m_(T6SwlBAHf)NZK#}MJQ*rm6eK!sN^A3V^ITy8@?b*;QeaIz zkK5AnV%H4i>MCcI1}}c#7R%``=SL<^z%BsZ-*H$attqx4tq7K>(TUh4(EEIL~ZyO(7-(;cwBvnUuXTdv8Ln>({rXX86mw+C;SUmiH0B&dy*(n{3!E z>Js0lt1Wgjx?Ji)O#Q(uqTIC0HJi0dLnS?!!wLC2?j@qBW+GbmeymN*-vy3pOX7O3 zt6qq#lCG=Z@G!>_*KC<~LW9j5CsOZtDmB$#PHK&^dErM0-iF|flm`w@9d+FV{56K3 zC-^16W!~k~bi8iWHF2^Jd7hBn2w7j*I32&>`X0zP9PJUua?79v+xD zossEW*J92s+i+1mh~dbD<9Yz(2uE%J)iNrxp4j-*95s2%Cx##GQED9%3t=IlZY=D>I~bV4e z2~&#uAq-gTuzBGNZ+Sw*nkeFkCBIuVIF482(jq{#qK1fP>lsl*RO}^+W}*)r+1}o@ zR7Xenh^0s)k7e$xc^PcaMy45=4yP1d&SX)&$;*(;44*jkUWSDhx^)19of#-iaGr}9 zDu|&7FUp9wEx2>2-sNSmGQ(%YFtd%jgsPNp!3=rY3~y1|bRdR4hZC3kiEDWHhAgWm z3fkmM5!FY$G;NvYOGi2_DwXaXA{KUYbBqeMYCU0(boWjR@t1AR(a7@=g}{wEXS%39 zpSWIDba(%bn*FwhWzHb?d$QS3G)$>`c$&9aTi;CFhSlvoC(?Zl%2_C?ZxM7bLw_Xb z)N$_BGIkQ7>{HVGrTtMN*5{qZ;gX>GG0Bc+*=H;}*S%6k&DXYq>)*n(hki0MFzFD4 z=aO(x5`+s`xS^AXi%EDD3$J0}NER+8;i#nbxF^N6%Mszehf>57V%#`S1F>L}d%ld? z!mw=&(=u!m!E}Ii?G+1HDZ{c@(JoR{$%ws-Ff(EoAuK=){46q3o{;W4P~>665kj0` z#3>-~wkh5?v9u;w&m(|6ZIkpqU4q8QFOIrz0QMTg&J*ks!!EO;u1TknL*#tUZV}Zz zX_`3PD>hD6U2xMZ@do^l#H3s9^)l|R)`beY&xnCZ7yZPbTRCMSYA_Iiqa6wI{B8F) zK#X9-V|R)8VXjLr^PXzM0Q;Tap$L`6f~1qs^%%$o8pvscMD5{3 zJjjE)mIl~}-x2%l%j8Sd8s60k> z07|AEPWlEF+s6K>NIaS}hO&)aY3n%)MPD+cn+Ju11wW0DTpCSIP>{2M>n>`~GKOj+aXyM^wF7dM`9&loq?vy+yG zug)iZZ5B31m*Iq}+Ca^H4CcAOr3Gtn`Hw;tdeA?s8oDCT2F0FlWT#aG%3IU?Ec8Tb zexV8#lZx%D#n84$_?a24!Hym{!MJ$FZSvfc{kG_^pm=p#^V7g-85b&MZn7`;;*trM z;e9Zmlxnsr%cTPKF3%m=uaa85)86JM0XBQVT(gUI+2@HUt7aPBYLt&9HDZ;AaGQ!< z;bP$t&)0I$2?BRJ)f}03nzhzMV0UFQ!Iks~J?ON6A3YOqcTJ6uLB~9w0{)t-DbJhr z#5?CbH_MS)SoXZ!{1CuhHFQ1rNY=gR*$u%rTqrty@+3Yw6HyV9#oNC(e@XuRe)AoW z9>~%^3HOe~Xc>3Mvk{OHF7#!5V(ZDJk3BO8A_3U|R(uL5))9*x9L{DLj94pd(*a&vNbdFIVGRd3O%pBrI1CL%VO*gvxb(i6fE6 zZZVmNZ8~7#1Z#~1@s1v{dYNk{U`{`IZH49-U;{Y*5jh+iB~AwHLodw6uQQ3!NrY`7 z25B9=Wc7L%9@OKL(E8EZmrA#6pisjbiuriCTuEgtaY~A(j;lT)rs`Q9vuIdk2o`Uf z3}|LBnTctKYXiIK)RSv>Y68K6X-J=l*{$j`uK{||pvVv+hPE`IH@ZZ>){efi`g7Mx zuXFc`Lz+ekESF(ldSNMaA_~{#&R$qof}L?K$5RvJhqUyphM%XC#(ai->xF3)ZGHM1 z@OCP+4J6ogf^i7!q8l2OqOC8(e)PiB3asZC1KdB%qGy3)h^+pZV0ii`L@s*hgN5IVOjg%%FUN8-0I#~?MX8Y7)nI7Z6q zaQ6~_IWt0=R7Yx;B;JQ)e68eqlGKX4jW}PePGU(7-lda?CCr)Sl|-Vo9fm?|%|x3D z$7ES;axcIdH5>2b$;2|2^mrvz%KLO3KR3)~@xvtE(mfAr(pK6Oi0^0d*J{M`&KPi) z5{HOF9LrXBcF)Edw2L+!^@qpxPAB4{T=fPCH=dr>M0B`rn8(65Nw_}?4*)Ioh_tJT z_^?)us1^R%EBuIr$FT5N77mk{4-#p*npP`Z#|Y*a;SR(l|CNyl3IBDLdkSosO^*R0 zYDraLOrjpQxYqJ;BP@>;_DJVEj1=Zy4r$r~Tf&m?DXsdjRyfHktaZ*)4k~|L&-@#R zzfUpTBFyTf%fNi%#?Z$>P=v@c5e7Dyf#Ea2-*>nt!ls?{bYNvfGTwI6Cs8>*^I}xu z)t1IWO1gszZHhw?w` z9t+f2LiIfFjF4&hNmRk#y0Jv!U3Itq#%ZE{H+v&G#%wbXM&gY&T(8`4j{@)p0mr@X z!JB%0ldx^5`q7<@i78BU8w1$3z%;;6#scR88T61;O?pUg6mGwo48%xAJagNCKot5c z6zXt%6gui0=K|^(bpt$bXPXqD1EM%u+fZt!CsEgK=)sb>nLoyKr)4P8;ogZf44mkT z@NA0k;8daVQ@px5H$oSIoK}%V77(WzU4Tin4akgiGznHrsTvNI#TZd4+&G7ouma(YEgJKvz zH?9|l8)Y7lQLQ|EIV?#pH?`6|R2+h(c0bF$#7OBe(;9JH zHXG~d!Ldf|A-`Czy9%-}7W|L}lR!3bOY?>0>U`{J)@3!9y*GMdAbm&n z*{I8hw3?+q;aWABK9o1RM_k6aM1`jvq#nqj6}on~3)O3Q;%BLrrVquVN%6zW)gvKz zm<1o!d>|2ReLclVE2g`Lb(EqYOk7cC;#s&Bny&cde907@p~!4)k^vRCemv)Cj~{9& zaG=mb{%}s0Uq|lisObXKx75Rw?$KUU_BS;V8)s+iEmx~yz)cT51E8QKK5?h($S>a1 wv;yi!&sOwH+`ft9V@#pKRi%%?OT>UEVNLh^OGiJ^;f?E28Vs7MXH9eeKS;WPCIA2c diff --git a/code/ryzom/client/data/gamedev/adds/interfaces/new_texture_interfaces_dxtc.txt b/code/ryzom/client/data/gamedev/adds/interfaces/new_texture_interfaces_dxtc.txt index ec1afb449..f35989e33 100644 --- a/code/ryzom/client/data/gamedev/adds/interfaces/new_texture_interfaces_dxtc.txt +++ b/code/ryzom/client/data/gamedev/adds/interfaces/new_texture_interfaces_dxtc.txt @@ -18,305 +18,305 @@ BK_goo.tga 0.156250000000 0.078125000000 0.195312500000 0.117187500000 bk_guild.tga 0.195312500000 0.078125000000 0.234375000000 0.117187500000 bk_horde.tga 0.000000000000 0.117187500000 0.039062500000 0.156250000000 bk_kami.tga 0.039062500000 0.117187500000 0.078125000000 0.156250000000 -bk_karavan.tga 0.078125000000 0.117187500000 0.117187500000 0.156250000000 -BK_matis.tga 0.117187500000 0.117187500000 0.156250000000 0.156250000000 -bk_mission.tga 0.156250000000 0.117187500000 0.195312500000 0.156250000000 -bk_mission2.tga 0.195312500000 0.117187500000 0.234375000000 0.156250000000 -BK_outpost.tga 0.000000000000 0.156250000000 0.039062500000 0.195312500000 -BK_primes.tga 0.039062500000 0.156250000000 0.078125000000 0.195312500000 -bk_service.tga 0.078125000000 0.156250000000 0.117187500000 0.195312500000 -bk_training.tga 0.117187500000 0.156250000000 0.156250000000 0.195312500000 -BK_tryker.tga 0.156250000000 0.156250000000 0.195312500000 0.195312500000 -BK_zorai.tga 0.195312500000 0.156250000000 0.234375000000 0.195312500000 -charge.tga 0.000000000000 0.195312500000 0.039062500000 0.234375000000 -clef.tga 0.039062500000 0.195312500000 0.078125000000 0.234375000000 -conso_branche.tga 0.078125000000 0.195312500000 0.117187500000 0.234375000000 -conso_branche_mask.tga 0.117187500000 0.195312500000 0.156250000000 0.234375000000 -conso_fleur.tga 0.156250000000 0.195312500000 0.195312500000 0.234375000000 -conso_fleur_mask.tga 0.195312500000 0.195312500000 0.234375000000 0.234375000000 -conso_grappe.tga 0.242187500000 0.000000000000 0.281250000000 0.039062500000 -conso_grappe_mask.tga 0.281250000000 0.000000000000 0.320312500000 0.039062500000 -conso_nectar.tga 0.320312500000 0.000000000000 0.359375000000 0.039062500000 -conso_nectar_mask.tga 0.359375000000 0.000000000000 0.398437500000 0.039062500000 -construction.tga 0.398437500000 0.000000000000 0.437500000000 0.039062500000 -cristal_ammo.tga 0.437500000000 0.000000000000 0.476562500000 0.039062500000 -cristal_spell.tga 0.238281250000 0.039062500000 0.277343750000 0.078125000000 -ge_mission_outpost_townhall.tga 0.277343750000 0.039062500000 0.316406250000 0.078125000000 -ico_amande.tga 0.316406250000 0.039062500000 0.355468750000 0.078125000000 -ico_cataliseur_xp.tga 0.355468750000 0.039062500000 0.394531250000 0.078125000000 -ico_consommable_over.tga 0.394531250000 0.039062500000 0.433593750000 0.078125000000 -ico_fleur_carac_1.tga 0.433593750000 0.039062500000 0.472656250000 0.078125000000 -ico_fleur_carac_1_mask.tga 0.234375000000 0.078125000000 0.273437500000 0.117187500000 -ico_fleur_carac_2.tga 0.273437500000 0.078125000000 0.312500000000 0.117187500000 -ico_fleur_carac_2_mask.tga 0.312500000000 0.078125000000 0.351562500000 0.117187500000 -ico_fleur_carac_3.tga 0.351562500000 0.078125000000 0.390625000000 0.117187500000 -ico_fleur_carac_3_mask.tga 0.390625000000 0.078125000000 0.429687500000 0.117187500000 -ico_foreuse.tga 0.429687500000 0.078125000000 0.468750000000 0.117187500000 -ico_haircolor.tga 0.234375000000 0.117187500000 0.273437500000 0.156250000000 -ico_haircut.tga 0.273437500000 0.117187500000 0.312500000000 0.156250000000 -ico_mission_art_fyros.tga 0.312500000000 0.117187500000 0.351562500000 0.156250000000 -ico_mission_art_matis.tga 0.351562500000 0.117187500000 0.390625000000 0.156250000000 -ico_mission_art_tryker.tga 0.390625000000 0.117187500000 0.429687500000 0.156250000000 -ico_mission_art_zorai.tga 0.429687500000 0.117187500000 0.468750000000 0.156250000000 -ico_mission_barrel.tga 0.234375000000 0.156250000000 0.273437500000 0.195312500000 -ico_mission_bottle.tga 0.273437500000 0.156250000000 0.312500000000 0.195312500000 -ico_mission_casket.tga 0.312500000000 0.156250000000 0.351562500000 0.195312500000 -ico_mission_medicine.tga 0.351562500000 0.156250000000 0.390625000000 0.195312500000 -ico_mission_message.tga 0.390625000000 0.156250000000 0.429687500000 0.195312500000 -ico_mission_package.tga 0.429687500000 0.156250000000 0.468750000000 0.195312500000 -ico_mission_pot.tga 0.234375000000 0.195312500000 0.273437500000 0.234375000000 -ico_mission_purse.tga 0.273437500000 0.195312500000 0.312500000000 0.234375000000 -ico_noix.tga 0.312500000000 0.195312500000 0.351562500000 0.234375000000 -ico_racine.tga 0.351562500000 0.195312500000 0.390625000000 0.234375000000 -ico_spores.tga 0.390625000000 0.195312500000 0.429687500000 0.234375000000 -ico_task_craft.tga 0.429687500000 0.195312500000 0.468750000000 0.234375000000 -ico_task_done.tga 0.000000000000 0.234375000000 0.039062500000 0.273437500000 -ico_task_failed.tga 0.039062500000 0.234375000000 0.078125000000 0.273437500000 -ico_task_fight.tga 0.078125000000 0.234375000000 0.117187500000 0.273437500000 -ico_task_forage.tga 0.117187500000 0.234375000000 0.156250000000 0.273437500000 -ico_task_generic.tga 0.156250000000 0.234375000000 0.195312500000 0.273437500000 -ico_task_generic_quart.tga 0.195312500000 0.234375000000 0.234375000000 0.273437500000 -ico_task_guild.tga 0.234375000000 0.234375000000 0.273437500000 0.273437500000 -ico_task_rite.tga 0.273437500000 0.234375000000 0.312500000000 0.273437500000 -ico_task_travel.tga 0.312500000000 0.234375000000 0.351562500000 0.273437500000 -ico_tatoo.tga 0.351562500000 0.234375000000 0.390625000000 0.273437500000 -ico_tourbe.tga 0.390625000000 0.234375000000 0.429687500000 0.273437500000 -improved_tool.tga 0.429687500000 0.234375000000 0.468750000000 0.273437500000 -item_default.tga 0.000000000000 0.273437500000 0.039062500000 0.312500000000 -item_plan_over.tga 0.039062500000 0.273437500000 0.078125000000 0.312500000000 -lucky_flower.tga 0.078125000000 0.273437500000 0.117187500000 0.312500000000 -mektoub_pack.tga 0.117187500000 0.273437500000 0.156250000000 0.312500000000 -mektoub_steed.tga 0.156250000000 0.273437500000 0.195312500000 0.312500000000 -mg_glove.tga 0.195312500000 0.273437500000 0.234375000000 0.312500000000 -mission_icon_0.tga 0.234375000000 0.273437500000 0.273437500000 0.312500000000 -mission_icon_1.tga 0.273437500000 0.273437500000 0.312500000000 0.312500000000 -mission_icon_2.tga 0.312500000000 0.273437500000 0.351562500000 0.312500000000 -mission_icon_3.tga 0.351562500000 0.273437500000 0.390625000000 0.312500000000 -mp_amber.tga 0.390625000000 0.273437500000 0.429687500000 0.312500000000 -mp_bark.tga 0.429687500000 0.273437500000 0.468750000000 0.312500000000 -mp_batiment_brique.tga 0.000000000000 0.312500000000 0.039062500000 0.351562500000 -mp_batiment_colonne.tga 0.039062500000 0.312500000000 0.078125000000 0.351562500000 -mp_batiment_colonne_justice.tga 0.078125000000 0.312500000000 0.117187500000 0.351562500000 -mp_batiment_comble.tga 0.117187500000 0.312500000000 0.156250000000 0.351562500000 -mp_batiment_noyau_maduk.tga 0.156250000000 0.312500000000 0.195312500000 0.351562500000 -mp_batiment_ornement.tga 0.195312500000 0.312500000000 0.234375000000 0.351562500000 -mp_batiment_revetement.tga 0.234375000000 0.312500000000 0.273437500000 0.351562500000 -mp_batiment_socle.tga 0.273437500000 0.312500000000 0.312500000000 0.351562500000 -mp_batiment_statue.tga 0.312500000000 0.312500000000 0.351562500000 0.351562500000 -mp_beak.tga 0.351562500000 0.312500000000 0.390625000000 0.351562500000 -mp_blood.tga 0.390625000000 0.312500000000 0.429687500000 0.351562500000 -mp_bone.tga 0.429687500000 0.312500000000 0.468750000000 0.351562500000 -mp_bud.tga 0.000000000000 0.351562500000 0.039062500000 0.390625000000 -mp_buterfly_blue.tga 0.039062500000 0.351562500000 0.078125000000 0.390625000000 -mp_buterfly_cocoon.tga 0.078125000000 0.351562500000 0.117187500000 0.390625000000 -mp_cereal.tga 0.117187500000 0.351562500000 0.156250000000 0.390625000000 -mp_claw.tga 0.156250000000 0.351562500000 0.195312500000 0.390625000000 -mp_dandelion.tga 0.195312500000 0.351562500000 0.234375000000 0.390625000000 -mp_dust.tga 0.234375000000 0.351562500000 0.273437500000 0.390625000000 -mp_egg.tga 0.273437500000 0.351562500000 0.312500000000 0.390625000000 -mp_eyes.tga 0.312500000000 0.351562500000 0.351562500000 0.390625000000 -mp_fang.tga 0.351562500000 0.351562500000 0.390625000000 0.390625000000 -mp_fiber.tga 0.390625000000 0.351562500000 0.429687500000 0.390625000000 -mp_filament.tga 0.429687500000 0.351562500000 0.468750000000 0.390625000000 -mp_firefly_abdomen.tga 0.000000000000 0.390625000000 0.039062500000 0.429687500000 -mp_fish_scale.tga 0.039062500000 0.390625000000 0.078125000000 0.429687500000 -mp_flowers.tga 0.078125000000 0.390625000000 0.117187500000 0.429687500000 -mp_fresh_loose_soil.tga 0.117187500000 0.390625000000 0.156250000000 0.429687500000 -mp_fruit.tga 0.156250000000 0.390625000000 0.195312500000 0.429687500000 -mp_generic.tga 0.195312500000 0.390625000000 0.234375000000 0.429687500000 -mp_generic_colorize.tga 0.234375000000 0.390625000000 0.273437500000 0.429687500000 -mp_gomme.tga 0.273437500000 0.390625000000 0.312500000000 0.429687500000 -mp_goo_residue.tga 0.312500000000 0.390625000000 0.351562500000 0.429687500000 -mp_hairs.tga 0.351562500000 0.390625000000 0.390625000000 0.429687500000 -mp_hoof.tga 0.390625000000 0.390625000000 0.429687500000 0.429687500000 -mp_horn.tga 0.429687500000 0.390625000000 0.468750000000 0.429687500000 -mp_horney.tga 0.000000000000 0.429687500000 0.039062500000 0.468750000000 -mp_insect_fossil.tga 0.039062500000 0.429687500000 0.078125000000 0.468750000000 -mp_kitinshell.tga 0.078125000000 0.429687500000 0.117187500000 0.468750000000 -mp_kitin_flesh.tga 0.117187500000 0.429687500000 0.156250000000 0.468750000000 -mp_kitin_secretion.tga 0.156250000000 0.429687500000 0.195312500000 0.468750000000 -mp_larva.tga 0.195312500000 0.429687500000 0.234375000000 0.468750000000 -mp_leaf.tga 0.234375000000 0.429687500000 0.273437500000 0.468750000000 -mp_leather.tga 0.273437500000 0.429687500000 0.312500000000 0.468750000000 -mp_liane.tga 0.312500000000 0.429687500000 0.351562500000 0.468750000000 -mp_lichen.tga 0.351562500000 0.429687500000 0.390625000000 0.468750000000 -mp_ligament.tga 0.390625000000 0.429687500000 0.429687500000 0.468750000000 -mp_mandible.tga 0.429687500000 0.429687500000 0.468750000000 0.468750000000 -mp_meat.tga 0.476562500000 0.000000000000 0.515625000000 0.039062500000 -mp_moss.tga 0.515625000000 0.000000000000 0.554687500000 0.039062500000 -mp_mushroom.tga 0.554687500000 0.000000000000 0.593750000000 0.039062500000 -mp_nail.tga 0.593750000000 0.000000000000 0.632812500000 0.039062500000 -mp_oil.tga 0.632812500000 0.000000000000 0.671875000000 0.039062500000 -mp_parasite.tga 0.671875000000 0.000000000000 0.710937500000 0.039062500000 -mp_pearl.tga 0.710937500000 0.000000000000 0.750000000000 0.039062500000 -mp_pelvis.tga 0.750000000000 0.000000000000 0.789062500000 0.039062500000 -mp_pigment.tga 0.789062500000 0.000000000000 0.828125000000 0.039062500000 -mp_pistil.tga 0.828125000000 0.000000000000 0.867187500000 0.039062500000 -mp_plant_fossil.tga 0.867187500000 0.000000000000 0.906250000000 0.039062500000 -mp_pollen.tga 0.906250000000 0.000000000000 0.945312500000 0.039062500000 -mp_resin.tga 0.945312500000 0.000000000000 0.984375000000 0.039062500000 -mp_ronce.tga 0.472656250000 0.039062500000 0.511718750000 0.078125000000 -mp_rostrum.tga 0.511718750000 0.039062500000 0.550781250000 0.078125000000 -mp_sap.tga 0.550781250000 0.039062500000 0.589843750000 0.078125000000 -mp_sawdust.tga 0.589843750000 0.039062500000 0.628906250000 0.078125000000 -mp_seed.tga 0.628906250000 0.039062500000 0.667968750000 0.078125000000 -mp_shell.tga 0.667968750000 0.039062500000 0.707031250000 0.078125000000 -mp_silk_worm.tga 0.707031250000 0.039062500000 0.746093750000 0.078125000000 -mp_skin.tga 0.746093750000 0.039062500000 0.785156250000 0.078125000000 -mp_skull.tga 0.785156250000 0.039062500000 0.824218750000 0.078125000000 -mp_spiders_web.tga 0.824218750000 0.039062500000 0.863281250000 0.078125000000 -mp_spine.tga 0.863281250000 0.039062500000 0.902343750000 0.078125000000 -mp_stem.tga 0.902343750000 0.039062500000 0.941406250000 0.078125000000 -mp_sting.tga 0.941406250000 0.039062500000 0.980468750000 0.078125000000 -mp_straw.tga 0.468750000000 0.078125000000 0.507812500000 0.117187500000 -mp_suc.tga 0.507812500000 0.078125000000 0.546875000000 0.117187500000 -mp_tail.tga 0.546875000000 0.078125000000 0.585937500000 0.117187500000 -mp_tooth.tga 0.585937500000 0.078125000000 0.625000000000 0.117187500000 -mp_trunk.tga 0.625000000000 0.078125000000 0.664062500000 0.117187500000 -mp_whiskers.tga 0.664062500000 0.078125000000 0.703125000000 0.117187500000 -mp_wing.tga 0.703125000000 0.078125000000 0.742187500000 0.117187500000 -mp_wood.tga 0.742187500000 0.078125000000 0.781250000000 0.117187500000 -mp_wood_node.tga 0.781250000000 0.078125000000 0.820312500000 0.117187500000 -MW_2h_axe.tga 0.820312500000 0.078125000000 0.859375000000 0.117187500000 -MW_2h_lance.tga 0.859375000000 0.078125000000 0.898437500000 0.117187500000 -MW_2h_mace.tga 0.898437500000 0.078125000000 0.937500000000 0.117187500000 -MW_2h_sword.tga 0.937500000000 0.078125000000 0.976562500000 0.117187500000 -MW_axe.tga 0.468750000000 0.117187500000 0.507812500000 0.156250000000 -MW_dagger.tga 0.507812500000 0.117187500000 0.546875000000 0.156250000000 -MW_lance.tga 0.546875000000 0.117187500000 0.585937500000 0.156250000000 -MW_mace.tga 0.585937500000 0.117187500000 0.625000000000 0.156250000000 -MW_staff.tga 0.625000000000 0.117187500000 0.664062500000 0.156250000000 -MW_sword.tga 0.664062500000 0.117187500000 0.703125000000 0.156250000000 -PA_anklet.tga 0.703125000000 0.117187500000 0.742187500000 0.156250000000 -PA_bracelet.tga 0.742187500000 0.117187500000 0.781250000000 0.156250000000 -PA_diadem.tga 0.781250000000 0.117187500000 0.820312500000 0.156250000000 -PA_earring.tga 0.820312500000 0.117187500000 0.859375000000 0.156250000000 -PA_pendant.tga 0.859375000000 0.117187500000 0.898437500000 0.156250000000 -PA_ring.tga 0.898437500000 0.117187500000 0.937500000000 0.156250000000 -protect_amber.tga 0.937500000000 0.117187500000 0.976562500000 0.156250000000 -pvp_aura.tga 0.468750000000 0.156250000000 0.507812500000 0.195312500000 -pvp_aura_mask.tga 0.507812500000 0.156250000000 0.546875000000 0.195312500000 -pvp_boost.tga 0.546875000000 0.156250000000 0.585937500000 0.195312500000 -pvp_boost_mask.tga 0.585937500000 0.156250000000 0.625000000000 0.195312500000 -pw_4.tga 0.625000000000 0.156250000000 0.664062500000 0.195312500000 -pw_5.tga 0.664062500000 0.156250000000 0.703125000000 0.195312500000 -pw_6.tga 0.703125000000 0.156250000000 0.742187500000 0.195312500000 -pw_7.tga 0.742187500000 0.156250000000 0.781250000000 0.195312500000 -PW_heavy.tga 0.781250000000 0.156250000000 0.820312500000 0.195312500000 -PW_light.tga 0.820312500000 0.156250000000 0.859375000000 0.195312500000 -PW_medium.tga 0.859375000000 0.156250000000 0.898437500000 0.195312500000 -quest_coeur.tga 0.898437500000 0.156250000000 0.937500000000 0.195312500000 -quest_foie.tga 0.937500000000 0.156250000000 0.976562500000 0.195312500000 -quest_jeton.tga 0.468750000000 0.195312500000 0.507812500000 0.234375000000 -quest_langue.tga 0.507812500000 0.195312500000 0.546875000000 0.234375000000 -quest_louche.tga 0.546875000000 0.195312500000 0.585937500000 0.234375000000 -quest_oreille.tga 0.585937500000 0.195312500000 0.625000000000 0.234375000000 -quest_patte.tga 0.625000000000 0.195312500000 0.664062500000 0.234375000000 -quest_poils.tga 0.664062500000 0.195312500000 0.703125000000 0.234375000000 -quest_queue.tga 0.703125000000 0.195312500000 0.742187500000 0.234375000000 -quest_ticket.tga 0.742187500000 0.195312500000 0.781250000000 0.234375000000 -AM_logo.tga 0.781250000000 0.195312500000 0.820312500000 0.234375000000 -AR_armpad.tga 0.820312500000 0.195312500000 0.859375000000 0.234375000000 -ar_armpad_mask.tga 0.859375000000 0.195312500000 0.898437500000 0.234375000000 -requirement.tga 0.898437500000 0.195312500000 0.937500000000 0.234375000000 -rm_f.tga 0.937500000000 0.195312500000 0.976562500000 0.234375000000 -rm_f_upgrade.tga 0.468750000000 0.234375000000 0.507812500000 0.273437500000 -rm_h.tga 0.507812500000 0.234375000000 0.546875000000 0.273437500000 -rm_h_upgrade.tga 0.546875000000 0.234375000000 0.585937500000 0.273437500000 -rm_m.tga 0.585937500000 0.234375000000 0.625000000000 0.273437500000 -rm_m_upgrade.tga 0.625000000000 0.234375000000 0.664062500000 0.273437500000 -rm_r.tga 0.664062500000 0.234375000000 0.703125000000 0.273437500000 -rm_r_upgrade.tga 0.703125000000 0.234375000000 0.742187500000 0.273437500000 -rpjobitem_200_a.tga 0.742187500000 0.234375000000 0.781250000000 0.273437500000 -rpjobitem_200_b.tga 0.781250000000 0.234375000000 0.820312500000 0.273437500000 -rpjobitem_200_c.tga 0.820312500000 0.234375000000 0.859375000000 0.273437500000 -rpjobitem_201_a.tga 0.859375000000 0.234375000000 0.898437500000 0.273437500000 -rpjobitem_201_b.tga 0.898437500000 0.234375000000 0.937500000000 0.273437500000 -rpjobitem_201_c.tga 0.937500000000 0.234375000000 0.976562500000 0.273437500000 -rpjobitem_202_a.tga 0.468750000000 0.273437500000 0.507812500000 0.312500000000 -rpjobitem_202_b.tga 0.507812500000 0.273437500000 0.546875000000 0.312500000000 -rpjobitem_202_c.tga 0.546875000000 0.273437500000 0.585937500000 0.312500000000 -rpjobitem_203_a.tga 0.585937500000 0.273437500000 0.625000000000 0.312500000000 -rpjobitem_203_b.tga 0.625000000000 0.273437500000 0.664062500000 0.312500000000 -rpjobitem_203_c.tga 0.664062500000 0.273437500000 0.703125000000 0.312500000000 -rpjobitem_204_a.tga 0.703125000000 0.273437500000 0.742187500000 0.312500000000 -rpjobitem_204_b.tga 0.742187500000 0.273437500000 0.781250000000 0.312500000000 -rpjobitem_204_c.tga 0.781250000000 0.273437500000 0.820312500000 0.312500000000 -rpjobitem_205_a.tga 0.820312500000 0.273437500000 0.859375000000 0.312500000000 -rpjobitem_205_b.tga 0.859375000000 0.273437500000 0.898437500000 0.312500000000 -rpjobitem_205_c.tga 0.898437500000 0.273437500000 0.937500000000 0.312500000000 -rpjobitem_206_a.tga 0.937500000000 0.273437500000 0.976562500000 0.312500000000 -rpjobitem_206_b.tga 0.468750000000 0.312500000000 0.507812500000 0.351562500000 -rpjobitem_206_c.tga 0.507812500000 0.312500000000 0.546875000000 0.351562500000 -rpjobitem_207_a.tga 0.546875000000 0.312500000000 0.585937500000 0.351562500000 -rpjobitem_207_b.tga 0.585937500000 0.312500000000 0.625000000000 0.351562500000 -rpjobitem_207_c.tga 0.625000000000 0.312500000000 0.664062500000 0.351562500000 -rpjobitem_certifications.tga 0.664062500000 0.312500000000 0.703125000000 0.351562500000 -rpjob_200.tga 0.703125000000 0.312500000000 0.742187500000 0.351562500000 -rpjob_201.tga 0.742187500000 0.312500000000 0.781250000000 0.351562500000 -rpjob_202.tga 0.781250000000 0.312500000000 0.820312500000 0.351562500000 -rpjob_203.tga 0.820312500000 0.312500000000 0.859375000000 0.351562500000 -rpjob_204.tga 0.859375000000 0.312500000000 0.898437500000 0.351562500000 -rpjob_205.tga 0.898437500000 0.312500000000 0.937500000000 0.351562500000 -rpjob_206.tga 0.937500000000 0.312500000000 0.976562500000 0.351562500000 -rpjob_207.tga 0.468750000000 0.351562500000 0.507812500000 0.390625000000 -rpjob_advanced.tga 0.507812500000 0.351562500000 0.546875000000 0.390625000000 -rpjob_elementary.tga 0.546875000000 0.351562500000 0.585937500000 0.390625000000 -rpjob_roleplay.tga 0.585937500000 0.351562500000 0.625000000000 0.390625000000 -rpjob_task.tga 0.625000000000 0.351562500000 0.664062500000 0.390625000000 -rpjob_task_certificats.tga 0.664062500000 0.351562500000 0.703125000000 0.390625000000 -rpjob_task_convert.tga 0.703125000000 0.351562500000 0.742187500000 0.390625000000 -rpjob_task_elementary.tga 0.742187500000 0.351562500000 0.781250000000 0.390625000000 -rpjob_task_generic.tga 0.781250000000 0.351562500000 0.820312500000 0.390625000000 -rpjob_task_upgrade.tga 0.820312500000 0.351562500000 0.859375000000 0.390625000000 -RW_autolaunch.tga 0.859375000000 0.351562500000 0.898437500000 0.390625000000 -RW_bowgun.tga 0.898437500000 0.351562500000 0.937500000000 0.390625000000 -RW_grenade.tga 0.937500000000 0.351562500000 0.976562500000 0.390625000000 -RW_harpoongun.tga 0.468750000000 0.390625000000 0.507812500000 0.429687500000 -RW_launcher.tga 0.507812500000 0.390625000000 0.546875000000 0.429687500000 -RW_pistol.tga 0.546875000000 0.390625000000 0.585937500000 0.429687500000 -RW_pistolarc.tga 0.585937500000 0.390625000000 0.625000000000 0.429687500000 -RW_rifle.tga 0.625000000000 0.390625000000 0.664062500000 0.429687500000 -SH_buckler.tga 0.664062500000 0.390625000000 0.703125000000 0.429687500000 -SH_large_shield.tga 0.703125000000 0.390625000000 0.742187500000 0.429687500000 -spe_beast.tga 0.742187500000 0.390625000000 0.781250000000 0.429687500000 -spe_com.tga 0.781250000000 0.390625000000 0.820312500000 0.429687500000 -spe_inventory.tga 0.820312500000 0.390625000000 0.859375000000 0.429687500000 -spe_labs.tga 0.859375000000 0.390625000000 0.898437500000 0.429687500000 -spe_memory.tga 0.898437500000 0.390625000000 0.937500000000 0.429687500000 -spe_options.tga 0.937500000000 0.390625000000 0.976562500000 0.429687500000 -spe_status.tga 0.468750000000 0.429687500000 0.507812500000 0.468750000000 -stimulating_water.tga 0.507812500000 0.429687500000 0.546875000000 0.468750000000 -tetekitin.tga 0.546875000000 0.429687500000 0.585937500000 0.468750000000 -to_ammo.tga 0.585937500000 0.429687500000 0.625000000000 0.468750000000 -to_armor.tga 0.625000000000 0.429687500000 0.664062500000 0.468750000000 -to_cooking_pot.tga 0.664062500000 0.429687500000 0.703125000000 0.468750000000 -to_fishing_rod.tga 0.703125000000 0.429687500000 0.742187500000 0.468750000000 -to_forage.tga 0.742187500000 0.429687500000 0.781250000000 0.468750000000 -to_hammer.tga 0.781250000000 0.429687500000 0.820312500000 0.468750000000 -to_jewelry_hammer.tga 0.820312500000 0.429687500000 0.859375000000 0.468750000000 -to_jewels.tga 0.859375000000 0.429687500000 0.898437500000 0.468750000000 -to_leathercutter.tga 0.898437500000 0.429687500000 0.937500000000 0.468750000000 -to_melee.tga 0.937500000000 0.429687500000 0.976562500000 0.468750000000 -to_needle.tga 0.000000000000 0.468750000000 0.039062500000 0.507812500000 -to_pestle.tga 0.039062500000 0.468750000000 0.078125000000 0.507812500000 -to_range.tga 0.078125000000 0.468750000000 0.117187500000 0.507812500000 -to_searake.tga 0.117187500000 0.468750000000 0.156250000000 0.507812500000 -to_spade.tga 0.156250000000 0.468750000000 0.195312500000 0.507812500000 -to_stick.tga 0.195312500000 0.468750000000 0.234375000000 0.507812500000 -to_tunneling_knife.tga 0.234375000000 0.468750000000 0.273437500000 0.507812500000 -to_whip.tga 0.273437500000 0.468750000000 0.312500000000 0.507812500000 -to_wrench.tga 0.312500000000 0.468750000000 0.351562500000 0.507812500000 -TP_caravane.tga 0.351562500000 0.468750000000 0.390625000000 0.507812500000 -TP_kami.tga 0.390625000000 0.468750000000 0.429687500000 0.507812500000 -W_AM_logo.tga 0.429687500000 0.468750000000 0.468750000000 0.507812500000 -w_pa_anklet.tga 0.468750000000 0.468750000000 0.507812500000 0.507812500000 -w_pa_bracelet.tga 0.507812500000 0.468750000000 0.546875000000 0.507812500000 -w_pa_diadem.tga 0.546875000000 0.468750000000 0.585937500000 0.507812500000 -w_pa_earring.tga 0.585937500000 0.468750000000 0.625000000000 0.507812500000 -w_pa_pendant.tga 0.625000000000 0.468750000000 0.664062500000 0.507812500000 -w_pa_ring.tga 0.664062500000 0.468750000000 0.703125000000 0.507812500000 -xp_cat_green.tga 0.703125000000 0.468750000000 0.742187500000 0.507812500000 +BK_matis.tga 0.078125000000 0.117187500000 0.117187500000 0.156250000000 +bk_mission.tga 0.117187500000 0.117187500000 0.156250000000 0.156250000000 +bk_mission2.tga 0.156250000000 0.117187500000 0.195312500000 0.156250000000 +BK_outpost.tga 0.195312500000 0.117187500000 0.234375000000 0.156250000000 +BK_primes.tga 0.000000000000 0.156250000000 0.039062500000 0.195312500000 +bk_service.tga 0.039062500000 0.156250000000 0.078125000000 0.195312500000 +bk_training.tga 0.078125000000 0.156250000000 0.117187500000 0.195312500000 +BK_tryker.tga 0.117187500000 0.156250000000 0.156250000000 0.195312500000 +BK_zorai.tga 0.156250000000 0.156250000000 0.195312500000 0.195312500000 +charge.tga 0.195312500000 0.156250000000 0.234375000000 0.195312500000 +clef.tga 0.000000000000 0.195312500000 0.039062500000 0.234375000000 +conso_branche.tga 0.039062500000 0.195312500000 0.078125000000 0.234375000000 +conso_branche_mask.tga 0.078125000000 0.195312500000 0.117187500000 0.234375000000 +conso_fleur.tga 0.117187500000 0.195312500000 0.156250000000 0.234375000000 +conso_fleur_mask.tga 0.156250000000 0.195312500000 0.195312500000 0.234375000000 +conso_grappe.tga 0.195312500000 0.195312500000 0.234375000000 0.234375000000 +conso_nectar.tga 0.242187500000 0.000000000000 0.281250000000 0.039062500000 +conso_nectar_mask.tga 0.281250000000 0.000000000000 0.320312500000 0.039062500000 +construction.tga 0.320312500000 0.000000000000 0.359375000000 0.039062500000 +cristal_ammo.tga 0.359375000000 0.000000000000 0.398437500000 0.039062500000 +cristal_spell.tga 0.398437500000 0.000000000000 0.437500000000 0.039062500000 +ico_haircolor.tga 0.437500000000 0.000000000000 0.476562500000 0.039062500000 +ico_haircut.tga 0.238281250000 0.039062500000 0.277343750000 0.078125000000 +bk_karavan.tga 0.277343750000 0.039062500000 0.316406250000 0.078125000000 +conso_grappe_mask.tga 0.316406250000 0.039062500000 0.355468750000 0.078125000000 +ico_foreuse.tga 0.355468750000 0.039062500000 0.394531250000 0.078125000000 +ico_noix.tga 0.394531250000 0.039062500000 0.433593750000 0.078125000000 +ico_spores.tga 0.433593750000 0.039062500000 0.472656250000 0.078125000000 +mektoub_pack.tga 0.234375000000 0.078125000000 0.273437500000 0.117187500000 +mp_beak.tga 0.273437500000 0.078125000000 0.312500000000 0.117187500000 +mp_fresh_loose_soil.tga 0.312500000000 0.078125000000 0.351562500000 0.117187500000 +mp_lichen.tga 0.351562500000 0.078125000000 0.390625000000 0.117187500000 +mp_sawdust.tga 0.390625000000 0.078125000000 0.429687500000 0.117187500000 +MW_2h_axe.tga 0.429687500000 0.078125000000 0.468750000000 0.117187500000 +PA_bracelet.tga 0.234375000000 0.117187500000 0.273437500000 0.156250000000 +pvp_aura_mask.tga 0.273437500000 0.117187500000 0.312500000000 0.156250000000 +quest_queue.tga 0.312500000000 0.117187500000 0.351562500000 0.156250000000 +rpjobitem_201_b.tga 0.351562500000 0.117187500000 0.390625000000 0.156250000000 +rpjobitem_207_a.tga 0.390625000000 0.117187500000 0.429687500000 0.156250000000 +rpjob_task_elementary.tga 0.429687500000 0.117187500000 0.468750000000 0.156250000000 +spe_options.tga 0.234375000000 0.156250000000 0.273437500000 0.195312500000 +to_range.tga 0.273437500000 0.156250000000 0.312500000000 0.195312500000 +w_pa_anklet.tga 0.312500000000 0.156250000000 0.351562500000 0.195312500000 +ico_task_craft.tga 0.351562500000 0.156250000000 0.390625000000 0.195312500000 +ico_task_done.tga 0.390625000000 0.156250000000 0.429687500000 0.195312500000 +ico_task_failed.tga 0.429687500000 0.156250000000 0.468750000000 0.195312500000 +ico_task_fight.tga 0.234375000000 0.195312500000 0.273437500000 0.234375000000 +ico_task_forage.tga 0.273437500000 0.195312500000 0.312500000000 0.234375000000 +ico_task_generic.tga 0.312500000000 0.195312500000 0.351562500000 0.234375000000 +ico_task_generic_quart.tga 0.351562500000 0.195312500000 0.390625000000 0.234375000000 +ico_task_guild.tga 0.390625000000 0.195312500000 0.429687500000 0.234375000000 +ico_task_rite.tga 0.429687500000 0.195312500000 0.468750000000 0.234375000000 +ico_task_travel.tga 0.000000000000 0.234375000000 0.039062500000 0.273437500000 +ico_tatoo.tga 0.039062500000 0.234375000000 0.078125000000 0.273437500000 +mektoub_steed.tga 0.078125000000 0.234375000000 0.117187500000 0.273437500000 +mg_glove.tga 0.117187500000 0.234375000000 0.156250000000 0.273437500000 +mission_icon_0.tga 0.156250000000 0.234375000000 0.195312500000 0.273437500000 +mission_icon_1.tga 0.195312500000 0.234375000000 0.234375000000 0.273437500000 +mission_icon_2.tga 0.234375000000 0.234375000000 0.273437500000 0.273437500000 +mission_icon_3.tga 0.273437500000 0.234375000000 0.312500000000 0.273437500000 +mp_amber.tga 0.312500000000 0.234375000000 0.351562500000 0.273437500000 +mp_bark.tga 0.351562500000 0.234375000000 0.390625000000 0.273437500000 +mp_batiment_brique.tga 0.390625000000 0.234375000000 0.429687500000 0.273437500000 +mp_batiment_colonne.tga 0.429687500000 0.234375000000 0.468750000000 0.273437500000 +mp_batiment_colonne_justice.tga 0.000000000000 0.273437500000 0.039062500000 0.312500000000 +mp_batiment_comble.tga 0.039062500000 0.273437500000 0.078125000000 0.312500000000 +mp_batiment_noyau_maduk.tga 0.078125000000 0.273437500000 0.117187500000 0.312500000000 +mp_batiment_ornement.tga 0.117187500000 0.273437500000 0.156250000000 0.312500000000 +mp_batiment_revetement.tga 0.156250000000 0.273437500000 0.195312500000 0.312500000000 +mp_batiment_socle.tga 0.195312500000 0.273437500000 0.234375000000 0.312500000000 +mp_batiment_statue.tga 0.234375000000 0.273437500000 0.273437500000 0.312500000000 +mp_blood.tga 0.273437500000 0.273437500000 0.312500000000 0.312500000000 +mp_bone.tga 0.312500000000 0.273437500000 0.351562500000 0.312500000000 +mp_bud.tga 0.351562500000 0.273437500000 0.390625000000 0.312500000000 +mp_buterfly_blue.tga 0.390625000000 0.273437500000 0.429687500000 0.312500000000 +mp_buterfly_cocoon.tga 0.429687500000 0.273437500000 0.468750000000 0.312500000000 +mp_cereal.tga 0.000000000000 0.312500000000 0.039062500000 0.351562500000 +mp_claw.tga 0.039062500000 0.312500000000 0.078125000000 0.351562500000 +mp_dandelion.tga 0.078125000000 0.312500000000 0.117187500000 0.351562500000 +mp_dust.tga 0.117187500000 0.312500000000 0.156250000000 0.351562500000 +mp_egg.tga 0.156250000000 0.312500000000 0.195312500000 0.351562500000 +mp_eyes.tga 0.195312500000 0.312500000000 0.234375000000 0.351562500000 +mp_fang.tga 0.234375000000 0.312500000000 0.273437500000 0.351562500000 +mp_fiber.tga 0.273437500000 0.312500000000 0.312500000000 0.351562500000 +mp_filament.tga 0.312500000000 0.312500000000 0.351562500000 0.351562500000 +mp_firefly_abdomen.tga 0.351562500000 0.312500000000 0.390625000000 0.351562500000 +mp_fish_scale.tga 0.390625000000 0.312500000000 0.429687500000 0.351562500000 +mp_flowers.tga 0.429687500000 0.312500000000 0.468750000000 0.351562500000 +mp_fruit.tga 0.000000000000 0.351562500000 0.039062500000 0.390625000000 +mp_generic.tga 0.039062500000 0.351562500000 0.078125000000 0.390625000000 +mp_generic_colorize.tga 0.078125000000 0.351562500000 0.117187500000 0.390625000000 +mp_gomme.tga 0.117187500000 0.351562500000 0.156250000000 0.390625000000 +mp_goo_residue.tga 0.156250000000 0.351562500000 0.195312500000 0.390625000000 +mp_hairs.tga 0.195312500000 0.351562500000 0.234375000000 0.390625000000 +mp_hoof.tga 0.234375000000 0.351562500000 0.273437500000 0.390625000000 +mp_horn.tga 0.273437500000 0.351562500000 0.312500000000 0.390625000000 +mp_horney.tga 0.312500000000 0.351562500000 0.351562500000 0.390625000000 +mp_insect_fossil.tga 0.351562500000 0.351562500000 0.390625000000 0.390625000000 +mp_kitinshell.tga 0.390625000000 0.351562500000 0.429687500000 0.390625000000 +mp_kitin_flesh.tga 0.429687500000 0.351562500000 0.468750000000 0.390625000000 +mp_kitin_secretion.tga 0.000000000000 0.390625000000 0.039062500000 0.429687500000 +mp_larva.tga 0.039062500000 0.390625000000 0.078125000000 0.429687500000 +mp_leaf.tga 0.078125000000 0.390625000000 0.117187500000 0.429687500000 +mp_leather.tga 0.117187500000 0.390625000000 0.156250000000 0.429687500000 +mp_liane.tga 0.156250000000 0.390625000000 0.195312500000 0.429687500000 +mp_ligament.tga 0.195312500000 0.390625000000 0.234375000000 0.429687500000 +mp_mandible.tga 0.234375000000 0.390625000000 0.273437500000 0.429687500000 +mp_meat.tga 0.273437500000 0.390625000000 0.312500000000 0.429687500000 +mp_moss.tga 0.312500000000 0.390625000000 0.351562500000 0.429687500000 +mp_mushroom.tga 0.351562500000 0.390625000000 0.390625000000 0.429687500000 +mp_nail.tga 0.390625000000 0.390625000000 0.429687500000 0.429687500000 +mp_oil.tga 0.429687500000 0.390625000000 0.468750000000 0.429687500000 +mp_parasite.tga 0.000000000000 0.429687500000 0.039062500000 0.468750000000 +mp_pearl.tga 0.039062500000 0.429687500000 0.078125000000 0.468750000000 +mp_pelvis.tga 0.078125000000 0.429687500000 0.117187500000 0.468750000000 +mp_pigment.tga 0.117187500000 0.429687500000 0.156250000000 0.468750000000 +mp_pistil.tga 0.156250000000 0.429687500000 0.195312500000 0.468750000000 +mp_plant_fossil.tga 0.195312500000 0.429687500000 0.234375000000 0.468750000000 +mp_pollen.tga 0.234375000000 0.429687500000 0.273437500000 0.468750000000 +mp_resin.tga 0.273437500000 0.429687500000 0.312500000000 0.468750000000 +mp_ronce.tga 0.312500000000 0.429687500000 0.351562500000 0.468750000000 +mp_rostrum.tga 0.351562500000 0.429687500000 0.390625000000 0.468750000000 +mp_sap.tga 0.390625000000 0.429687500000 0.429687500000 0.468750000000 +mp_seed.tga 0.429687500000 0.429687500000 0.468750000000 0.468750000000 +mp_shell.tga 0.476562500000 0.000000000000 0.515625000000 0.039062500000 +mp_silk_worm.tga 0.515625000000 0.000000000000 0.554687500000 0.039062500000 +mp_skin.tga 0.554687500000 0.000000000000 0.593750000000 0.039062500000 +mp_skull.tga 0.593750000000 0.000000000000 0.632812500000 0.039062500000 +mp_spiders_web.tga 0.632812500000 0.000000000000 0.671875000000 0.039062500000 +mp_spine.tga 0.671875000000 0.000000000000 0.710937500000 0.039062500000 +mp_stem.tga 0.710937500000 0.000000000000 0.750000000000 0.039062500000 +mp_sting.tga 0.750000000000 0.000000000000 0.789062500000 0.039062500000 +mp_straw.tga 0.789062500000 0.000000000000 0.828125000000 0.039062500000 +mp_suc.tga 0.828125000000 0.000000000000 0.867187500000 0.039062500000 +mp_tail.tga 0.867187500000 0.000000000000 0.906250000000 0.039062500000 +mp_tooth.tga 0.906250000000 0.000000000000 0.945312500000 0.039062500000 +mp_trunk.tga 0.945312500000 0.000000000000 0.984375000000 0.039062500000 +mp_whiskers.tga 0.472656250000 0.039062500000 0.511718750000 0.078125000000 +mp_wing.tga 0.511718750000 0.039062500000 0.550781250000 0.078125000000 +mp_wood.tga 0.550781250000 0.039062500000 0.589843750000 0.078125000000 +mp_wood_node.tga 0.589843750000 0.039062500000 0.628906250000 0.078125000000 +MW_2h_lance.tga 0.628906250000 0.039062500000 0.667968750000 0.078125000000 +MW_2h_mace.tga 0.667968750000 0.039062500000 0.707031250000 0.078125000000 +MW_2h_sword.tga 0.707031250000 0.039062500000 0.746093750000 0.078125000000 +MW_axe.tga 0.746093750000 0.039062500000 0.785156250000 0.078125000000 +MW_dagger.tga 0.785156250000 0.039062500000 0.824218750000 0.078125000000 +MW_lance.tga 0.824218750000 0.039062500000 0.863281250000 0.078125000000 +MW_mace.tga 0.863281250000 0.039062500000 0.902343750000 0.078125000000 +MW_staff.tga 0.902343750000 0.039062500000 0.941406250000 0.078125000000 +MW_sword.tga 0.941406250000 0.039062500000 0.980468750000 0.078125000000 +PA_anklet.tga 0.468750000000 0.078125000000 0.507812500000 0.117187500000 +pvp_boost.tga 0.507812500000 0.078125000000 0.546875000000 0.117187500000 +pvp_boost_mask.tga 0.546875000000 0.078125000000 0.585937500000 0.117187500000 +pw_4.tga 0.585937500000 0.078125000000 0.625000000000 0.117187500000 +pw_5.tga 0.625000000000 0.078125000000 0.664062500000 0.117187500000 +pw_6.tga 0.664062500000 0.078125000000 0.703125000000 0.117187500000 +pw_7.tga 0.703125000000 0.078125000000 0.742187500000 0.117187500000 +PW_heavy.tga 0.742187500000 0.078125000000 0.781250000000 0.117187500000 +PW_light.tga 0.781250000000 0.078125000000 0.820312500000 0.117187500000 +PW_medium.tga 0.820312500000 0.078125000000 0.859375000000 0.117187500000 +quest_coeur.tga 0.859375000000 0.078125000000 0.898437500000 0.117187500000 +quest_foie.tga 0.898437500000 0.078125000000 0.937500000000 0.117187500000 +quest_jeton.tga 0.937500000000 0.078125000000 0.976562500000 0.117187500000 +quest_langue.tga 0.468750000000 0.117187500000 0.507812500000 0.156250000000 +quest_louche.tga 0.507812500000 0.117187500000 0.546875000000 0.156250000000 +quest_oreille.tga 0.546875000000 0.117187500000 0.585937500000 0.156250000000 +quest_patte.tga 0.585937500000 0.117187500000 0.625000000000 0.156250000000 +quest_poils.tga 0.625000000000 0.117187500000 0.664062500000 0.156250000000 +quest_ticket.tga 0.664062500000 0.117187500000 0.703125000000 0.156250000000 +AM_logo.tga 0.703125000000 0.117187500000 0.742187500000 0.156250000000 +AR_armpad.tga 0.742187500000 0.117187500000 0.781250000000 0.156250000000 +ar_armpad_mask.tga 0.781250000000 0.117187500000 0.820312500000 0.156250000000 +requirement.tga 0.820312500000 0.117187500000 0.859375000000 0.156250000000 +rm_f.tga 0.859375000000 0.117187500000 0.898437500000 0.156250000000 +rm_f_upgrade.tga 0.898437500000 0.117187500000 0.937500000000 0.156250000000 +rm_h.tga 0.937500000000 0.117187500000 0.976562500000 0.156250000000 +rm_h_upgrade.tga 0.468750000000 0.156250000000 0.507812500000 0.195312500000 +rm_m.tga 0.507812500000 0.156250000000 0.546875000000 0.195312500000 +rm_m_upgrade.tga 0.546875000000 0.156250000000 0.585937500000 0.195312500000 +rm_r.tga 0.585937500000 0.156250000000 0.625000000000 0.195312500000 +rm_r_upgrade.tga 0.625000000000 0.156250000000 0.664062500000 0.195312500000 +rpjobitem_200_a.tga 0.664062500000 0.156250000000 0.703125000000 0.195312500000 +rpjobitem_200_b.tga 0.703125000000 0.156250000000 0.742187500000 0.195312500000 +rpjobitem_200_c.tga 0.742187500000 0.156250000000 0.781250000000 0.195312500000 +rpjobitem_201_a.tga 0.781250000000 0.156250000000 0.820312500000 0.195312500000 +rpjobitem_201_c.tga 0.820312500000 0.156250000000 0.859375000000 0.195312500000 +rpjobitem_202_a.tga 0.859375000000 0.156250000000 0.898437500000 0.195312500000 +rpjobitem_202_b.tga 0.898437500000 0.156250000000 0.937500000000 0.195312500000 +rpjobitem_202_c.tga 0.937500000000 0.156250000000 0.976562500000 0.195312500000 +rpjobitem_203_a.tga 0.468750000000 0.195312500000 0.507812500000 0.234375000000 +rpjobitem_203_b.tga 0.507812500000 0.195312500000 0.546875000000 0.234375000000 +rpjobitem_203_c.tga 0.546875000000 0.195312500000 0.585937500000 0.234375000000 +rpjobitem_204_a.tga 0.585937500000 0.195312500000 0.625000000000 0.234375000000 +rpjobitem_204_b.tga 0.625000000000 0.195312500000 0.664062500000 0.234375000000 +rpjobitem_204_c.tga 0.664062500000 0.195312500000 0.703125000000 0.234375000000 +rpjobitem_205_a.tga 0.703125000000 0.195312500000 0.742187500000 0.234375000000 +rpjobitem_205_b.tga 0.742187500000 0.195312500000 0.781250000000 0.234375000000 +rpjobitem_205_c.tga 0.781250000000 0.195312500000 0.820312500000 0.234375000000 +rpjobitem_206_a.tga 0.820312500000 0.195312500000 0.859375000000 0.234375000000 +rpjobitem_206_b.tga 0.859375000000 0.195312500000 0.898437500000 0.234375000000 +rpjobitem_206_c.tga 0.898437500000 0.195312500000 0.937500000000 0.234375000000 +rpjobitem_207_b.tga 0.937500000000 0.195312500000 0.976562500000 0.234375000000 +rpjobitem_207_c.tga 0.468750000000 0.234375000000 0.507812500000 0.273437500000 +rpjobitem_certifications.tga 0.507812500000 0.234375000000 0.546875000000 0.273437500000 +rpjob_200.tga 0.546875000000 0.234375000000 0.585937500000 0.273437500000 +rpjob_201.tga 0.585937500000 0.234375000000 0.625000000000 0.273437500000 +rpjob_202.tga 0.625000000000 0.234375000000 0.664062500000 0.273437500000 +rpjob_203.tga 0.664062500000 0.234375000000 0.703125000000 0.273437500000 +rpjob_204.tga 0.703125000000 0.234375000000 0.742187500000 0.273437500000 +rpjob_205.tga 0.742187500000 0.234375000000 0.781250000000 0.273437500000 +rpjob_206.tga 0.781250000000 0.234375000000 0.820312500000 0.273437500000 +rpjob_207.tga 0.820312500000 0.234375000000 0.859375000000 0.273437500000 +rpjob_advanced.tga 0.859375000000 0.234375000000 0.898437500000 0.273437500000 +rpjob_elementary.tga 0.898437500000 0.234375000000 0.937500000000 0.273437500000 +rpjob_roleplay.tga 0.937500000000 0.234375000000 0.976562500000 0.273437500000 +rpjob_task.tga 0.468750000000 0.273437500000 0.507812500000 0.312500000000 +rpjob_task_certificats.tga 0.507812500000 0.273437500000 0.546875000000 0.312500000000 +rpjob_task_convert.tga 0.546875000000 0.273437500000 0.585937500000 0.312500000000 +rpjob_task_generic.tga 0.585937500000 0.273437500000 0.625000000000 0.312500000000 +rpjob_task_upgrade.tga 0.625000000000 0.273437500000 0.664062500000 0.312500000000 +RW_autolaunch.tga 0.664062500000 0.273437500000 0.703125000000 0.312500000000 +RW_bowgun.tga 0.703125000000 0.273437500000 0.742187500000 0.312500000000 +RW_grenade.tga 0.742187500000 0.273437500000 0.781250000000 0.312500000000 +RW_harpoongun.tga 0.781250000000 0.273437500000 0.820312500000 0.312500000000 +RW_launcher.tga 0.820312500000 0.273437500000 0.859375000000 0.312500000000 +RW_pistol.tga 0.859375000000 0.273437500000 0.898437500000 0.312500000000 +RW_pistolarc.tga 0.898437500000 0.273437500000 0.937500000000 0.312500000000 +RW_rifle.tga 0.937500000000 0.273437500000 0.976562500000 0.312500000000 +SH_buckler.tga 0.468750000000 0.312500000000 0.507812500000 0.351562500000 +SH_large_shield.tga 0.507812500000 0.312500000000 0.546875000000 0.351562500000 +spe_beast.tga 0.546875000000 0.312500000000 0.585937500000 0.351562500000 +spe_com.tga 0.585937500000 0.312500000000 0.625000000000 0.351562500000 +spe_inventory.tga 0.625000000000 0.312500000000 0.664062500000 0.351562500000 +spe_labs.tga 0.664062500000 0.312500000000 0.703125000000 0.351562500000 +spe_memory.tga 0.703125000000 0.312500000000 0.742187500000 0.351562500000 +spe_status.tga 0.742187500000 0.312500000000 0.781250000000 0.351562500000 +stimulating_water.tga 0.781250000000 0.312500000000 0.820312500000 0.351562500000 +ico_cataliseur_xp.tga 0.820312500000 0.312500000000 0.859375000000 0.351562500000 +ico_consommable_over.tga 0.859375000000 0.312500000000 0.898437500000 0.351562500000 +ico_fleur_carac_1.tga 0.898437500000 0.312500000000 0.937500000000 0.351562500000 +ico_fleur_carac_1_mask.tga 0.937500000000 0.312500000000 0.976562500000 0.351562500000 +ico_fleur_carac_2.tga 0.468750000000 0.351562500000 0.507812500000 0.390625000000 +ico_fleur_carac_2_mask.tga 0.507812500000 0.351562500000 0.546875000000 0.390625000000 +ico_fleur_carac_3.tga 0.546875000000 0.351562500000 0.585937500000 0.390625000000 +ico_fleur_carac_3_mask.tga 0.585937500000 0.351562500000 0.625000000000 0.390625000000 +ico_mission_art_fyros.tga 0.625000000000 0.351562500000 0.664062500000 0.390625000000 +ico_mission_art_matis.tga 0.664062500000 0.351562500000 0.703125000000 0.390625000000 +ico_mission_art_tryker.tga 0.703125000000 0.351562500000 0.742187500000 0.390625000000 +ico_mission_art_zorai.tga 0.742187500000 0.351562500000 0.781250000000 0.390625000000 +ico_mission_barrel.tga 0.781250000000 0.351562500000 0.820312500000 0.390625000000 +ico_mission_bottle.tga 0.820312500000 0.351562500000 0.859375000000 0.390625000000 +ico_mission_casket.tga 0.859375000000 0.351562500000 0.898437500000 0.390625000000 +ico_mission_medicine.tga 0.898437500000 0.351562500000 0.937500000000 0.390625000000 +ico_mission_message.tga 0.937500000000 0.351562500000 0.976562500000 0.390625000000 +ico_mission_package.tga 0.468750000000 0.390625000000 0.507812500000 0.429687500000 +ico_mission_pot.tga 0.507812500000 0.390625000000 0.546875000000 0.429687500000 +ico_mission_purse.tga 0.546875000000 0.390625000000 0.585937500000 0.429687500000 +ico_racine.tga 0.585937500000 0.390625000000 0.625000000000 0.429687500000 +ge_mission_outpost_townhall.tga 0.625000000000 0.390625000000 0.664062500000 0.429687500000 +ico_amande.tga 0.664062500000 0.390625000000 0.703125000000 0.429687500000 +to_searake.tga 0.703125000000 0.390625000000 0.742187500000 0.429687500000 +to_spade.tga 0.742187500000 0.390625000000 0.781250000000 0.429687500000 +to_stick.tga 0.781250000000 0.390625000000 0.820312500000 0.429687500000 +to_tunneling_knife.tga 0.820312500000 0.390625000000 0.859375000000 0.429687500000 +to_whip.tga 0.859375000000 0.390625000000 0.898437500000 0.429687500000 +to_wrench.tga 0.898437500000 0.390625000000 0.937500000000 0.429687500000 +TP_caravane.tga 0.937500000000 0.390625000000 0.976562500000 0.429687500000 +TP_kami.tga 0.468750000000 0.429687500000 0.507812500000 0.468750000000 +tetekitin.tga 0.507812500000 0.429687500000 0.546875000000 0.468750000000 +to_ammo.tga 0.546875000000 0.429687500000 0.585937500000 0.468750000000 +to_armor.tga 0.585937500000 0.429687500000 0.625000000000 0.468750000000 +to_cooking_pot.tga 0.625000000000 0.429687500000 0.664062500000 0.468750000000 +to_fishing_rod.tga 0.664062500000 0.429687500000 0.703125000000 0.468750000000 +to_forage.tga 0.703125000000 0.429687500000 0.742187500000 0.468750000000 +to_hammer.tga 0.742187500000 0.429687500000 0.781250000000 0.468750000000 +to_jewelry_hammer.tga 0.781250000000 0.429687500000 0.820312500000 0.468750000000 +to_jewels.tga 0.820312500000 0.429687500000 0.859375000000 0.468750000000 +to_leathercutter.tga 0.859375000000 0.429687500000 0.898437500000 0.468750000000 +to_melee.tga 0.898437500000 0.429687500000 0.937500000000 0.468750000000 +to_needle.tga 0.937500000000 0.429687500000 0.976562500000 0.468750000000 +to_pestle.tga 0.000000000000 0.468750000000 0.039062500000 0.507812500000 +ico_tourbe.tga 0.039062500000 0.468750000000 0.078125000000 0.507812500000 +improved_tool.tga 0.078125000000 0.468750000000 0.117187500000 0.507812500000 +item_default.tga 0.117187500000 0.468750000000 0.156250000000 0.507812500000 +item_plan_over.tga 0.156250000000 0.468750000000 0.195312500000 0.507812500000 +lucky_flower.tga 0.195312500000 0.468750000000 0.234375000000 0.507812500000 +W_AM_logo.tga 0.234375000000 0.468750000000 0.273437500000 0.507812500000 +w_pa_bracelet.tga 0.273437500000 0.468750000000 0.312500000000 0.507812500000 +w_pa_diadem.tga 0.312500000000 0.468750000000 0.351562500000 0.507812500000 +w_pa_earring.tga 0.351562500000 0.468750000000 0.390625000000 0.507812500000 +w_pa_pendant.tga 0.390625000000 0.468750000000 0.429687500000 0.507812500000 +w_pa_ring.tga 0.429687500000 0.468750000000 0.468750000000 0.507812500000 +xp_cat_green.tga 0.468750000000 0.468750000000 0.507812500000 0.507812500000 +PA_diadem.tga 0.507812500000 0.468750000000 0.546875000000 0.507812500000 +PA_earring.tga 0.546875000000 0.468750000000 0.585937500000 0.507812500000 +PA_pendant.tga 0.585937500000 0.468750000000 0.625000000000 0.507812500000 +PA_ring.tga 0.625000000000 0.468750000000 0.664062500000 0.507812500000 +protect_amber.tga 0.664062500000 0.468750000000 0.703125000000 0.507812500000 +pvp_aura.tga 0.703125000000 0.468750000000 0.742187500000 0.507812500000 asc_exit.tga 0.742187500000 0.468750000000 0.773437500000 0.500000000000 asc_rolemastercraft.tga 0.773437500000 0.468750000000 0.804687500000 0.500000000000 asc_rolemasterfight.tga 0.804687500000 0.468750000000 0.835937500000 0.500000000000 @@ -324,340 +324,350 @@ asc_rolemasterharvest.tga 0.835937500000 0.468750000000 0.867187500000 0.5000000 asc_rolemastermagic.tga 0.867187500000 0.468750000000 0.898437500000 0.500000000000 asc_unknown.tga 0.898437500000 0.468750000000 0.929687500000 0.500000000000 mail.tga 0.929687500000 0.468750000000 0.960937500000 0.492187500000 -mp_back_curative.tga 0.976562500000 0.078125000000 1.000000000000 0.101562500000 -mp_back_offensive.tga 0.976562500000 0.101562500000 1.000000000000 0.125000000000 -mp_back_selfonly.tga 0.976562500000 0.125000000000 1.000000000000 0.148437500000 -building_state_24x24.tga 0.976562500000 0.148437500000 1.000000000000 0.171875000000 -ico_ammo_bullet.tga 0.976562500000 0.171875000000 1.000000000000 0.195312500000 -ico_ammo_jacket.tga 0.976562500000 0.195312500000 1.000000000000 0.218750000000 -ico_angle.tga 0.976562500000 0.218750000000 1.000000000000 0.242187500000 -ico_anti_magic_shield.tga 0.976562500000 0.242187500000 1.000000000000 0.265625000000 -ico_armor.tga 0.976562500000 0.265625000000 1.000000000000 0.289062500000 -ico_armor_clip.tga 0.976562500000 0.289062500000 1.000000000000 0.312500000000 -ico_armor_heavy.tga 0.976562500000 0.312500000000 1.000000000000 0.335937500000 -ico_armor_kitin.tga 0.976562500000 0.335937500000 1.000000000000 0.359375000000 -ico_armor_light.tga 0.976562500000 0.359375000000 1.000000000000 0.382812500000 -ico_armor_medium.tga 0.976562500000 0.382812500000 1.000000000000 0.406250000000 -ico_armor_penalty.tga 0.976562500000 0.406250000000 1.000000000000 0.429687500000 -ico_armor_shell.tga 0.976562500000 0.429687500000 1.000000000000 0.453125000000 -ico_atys.tga 0.976562500000 0.453125000000 1.000000000000 0.476562500000 -ico_atysian.tga 0.960937500000 0.476562500000 0.984375000000 0.500000000000 -ico_balance_hp.tga 0.929687500000 0.492187500000 0.953125000000 0.515625000000 -ico_barrel.tga 0.742187500000 0.500000000000 0.765625000000 0.523437500000 -ico_bash.tga 0.765625000000 0.500000000000 0.789062500000 0.523437500000 -ico_berserk.tga 0.789062500000 0.500000000000 0.812500000000 0.523437500000 -ico_blade.tga 0.812500000000 0.500000000000 0.835937500000 0.523437500000 -ico_bleeding.tga 0.835937500000 0.500000000000 0.859375000000 0.523437500000 -ico_blind.tga 0.859375000000 0.500000000000 0.882812500000 0.523437500000 -ico_blunt.tga 0.882812500000 0.500000000000 0.906250000000 0.523437500000 -ico_bomb.tga 0.906250000000 0.500000000000 0.929687500000 0.523437500000 -cb_main_nue.tga 0.953125000000 0.500000000000 0.976562500000 0.523437500000 -ico_celestial.tga 0.976562500000 0.500000000000 1.000000000000 0.523437500000 -ico_circular_attack.tga 0.000000000000 0.507812500000 0.023437500000 0.531250000000 -ico_clothes.tga 0.023437500000 0.507812500000 0.046875000000 0.531250000000 -ico_cold.tga 0.046875000000 0.507812500000 0.070312500000 0.531250000000 -ico_concentration.tga 0.070312500000 0.507812500000 0.093750000000 0.531250000000 -BK_matis_brick.tga 0.093750000000 0.507812500000 0.117187500000 0.531250000000 -ico_constitution.tga 0.117187500000 0.507812500000 0.140625000000 0.531250000000 -ico_counterweight.tga 0.140625000000 0.507812500000 0.164062500000 0.531250000000 -ico_craft_buff.tga 0.164062500000 0.507812500000 0.187500000000 0.531250000000 -ico_create_sapload.tga 0.187500000000 0.507812500000 0.210937500000 0.531250000000 -ico_curse.tga 0.210937500000 0.507812500000 0.234375000000 0.531250000000 -ico_debuff.tga 0.234375000000 0.507812500000 0.257812500000 0.531250000000 -ico_debuff_resist.tga 0.257812500000 0.507812500000 0.281250000000 0.531250000000 -ico_debuff_skill.tga 0.281250000000 0.507812500000 0.304687500000 0.531250000000 -ico_desert.tga 0.304687500000 0.507812500000 0.328125000000 0.531250000000 -ico_dexterity.tga 0.328125000000 0.507812500000 0.351562500000 0.531250000000 -ico_disarm.tga 0.351562500000 0.507812500000 0.375000000000 0.531250000000 -ico_dodge.tga 0.375000000000 0.507812500000 0.398437500000 0.531250000000 -ico_dot.tga 0.398437500000 0.507812500000 0.421875000000 0.531250000000 -ico_durability.tga 0.421875000000 0.507812500000 0.445312500000 0.531250000000 -ico_electric.tga 0.445312500000 0.507812500000 0.468750000000 0.531250000000 -ico_explosif.tga 0.468750000000 0.507812500000 0.492187500000 0.531250000000 -ico_extracting.tga 0.492187500000 0.507812500000 0.515625000000 0.531250000000 -ico_fear.tga 0.515625000000 0.507812500000 0.539062500000 0.531250000000 -ico_feint.tga 0.539062500000 0.507812500000 0.562500000000 0.531250000000 -ico_fire.tga 0.562500000000 0.507812500000 0.585937500000 0.531250000000 -ico_firing_pin.tga 0.585937500000 0.507812500000 0.609375000000 0.531250000000 -ch_back.tga 0.609375000000 0.507812500000 0.632812500000 0.531250000000 -BK_generic_brick.tga 0.632812500000 0.507812500000 0.656250000000 0.531250000000 -mp_over_link.tga 0.656250000000 0.507812500000 0.679687500000 0.531250000000 -bk_aura.tga 0.679687500000 0.507812500000 0.703125000000 0.531250000000 -bk_conso.tga 0.703125000000 0.507812500000 0.726562500000 0.531250000000 -bk_outpost_brick.tga 0.929687500000 0.515625000000 0.953125000000 0.539062500000 -bk_power.tga 0.726562500000 0.523437500000 0.750000000000 0.546875000000 -ico_focus.tga 0.750000000000 0.523437500000 0.773437500000 0.546875000000 -ico_forage_buff.tga 0.773437500000 0.523437500000 0.796875000000 0.546875000000 -ico_forbid_item.tga 0.796875000000 0.523437500000 0.820312500000 0.546875000000 -ico_forest.tga 0.820312500000 0.523437500000 0.843750000000 0.546875000000 -2h_over.tga 0.843750000000 0.523437500000 0.867187500000 0.546875000000 -ico_gardening.tga 0.867187500000 0.523437500000 0.890625000000 0.546875000000 -ico_gentle.tga 0.890625000000 0.523437500000 0.914062500000 0.546875000000 -ico_goo.tga 0.953125000000 0.523437500000 0.976562500000 0.546875000000 -ico_gripp.tga 0.976562500000 0.523437500000 1.000000000000 0.546875000000 -1h_over.tga 0.000000000000 0.531250000000 0.023437500000 0.554687500000 -BK_fyros_brick.tga 0.023437500000 0.531250000000 0.046875000000 0.554687500000 -ico_hammer.tga 0.046875000000 0.531250000000 0.070312500000 0.554687500000 -ico_harmful.tga 0.070312500000 0.531250000000 0.093750000000 0.554687500000 -ico_hatred.tga 0.093750000000 0.531250000000 0.117187500000 0.554687500000 -ico_heal.tga 0.117187500000 0.531250000000 0.140625000000 0.554687500000 -ico_hit_rate.tga 0.140625000000 0.531250000000 0.164062500000 0.554687500000 -ico_incapacity.tga 0.164062500000 0.531250000000 0.187500000000 0.554687500000 -ico_intelligence.tga 0.187500000000 0.531250000000 0.210937500000 0.554687500000 -ico_interrupt.tga 0.210937500000 0.531250000000 0.234375000000 0.554687500000 -ico_invulnerability.tga 0.234375000000 0.531250000000 0.257812500000 0.554687500000 -ico_jewel_stone.tga 0.257812500000 0.531250000000 0.281250000000 0.554687500000 -ico_jewel_stone_support.tga 0.281250000000 0.531250000000 0.304687500000 0.554687500000 -ico_jungle.tga 0.304687500000 0.531250000000 0.328125000000 0.554687500000 -ico_lacustre.tga 0.328125000000 0.531250000000 0.351562500000 0.554687500000 -ico_landmark_bonus.tga 0.351562500000 0.531250000000 0.375000000000 0.554687500000 -ico_level.tga 0.375000000000 0.531250000000 0.398437500000 0.554687500000 -ico_lining.tga 0.398437500000 0.531250000000 0.421875000000 0.554687500000 -ico_location.tga 0.421875000000 0.531250000000 0.445312500000 0.554687500000 -ico_madness.tga 0.445312500000 0.531250000000 0.468750000000 0.554687500000 -ico_magic.tga 0.468750000000 0.531250000000 0.492187500000 0.554687500000 -ico_magic_action_buff.tga 0.492187500000 0.531250000000 0.515625000000 0.554687500000 -ico_magic_focus.tga 0.515625000000 0.531250000000 0.539062500000 0.554687500000 -ico_magic_target_buff.tga 0.539062500000 0.531250000000 0.562500000000 0.554687500000 -ico_melee_action_buff.tga 0.562500000000 0.531250000000 0.585937500000 0.554687500000 -ico_melee_target_buff.tga 0.585937500000 0.531250000000 0.609375000000 0.554687500000 -ico_mental.tga 0.609375000000 0.531250000000 0.632812500000 0.554687500000 -no_action.tga 0.632812500000 0.531250000000 0.656250000000 0.554687500000 -op_back.tga 0.656250000000 0.531250000000 0.679687500000 0.554687500000 -op_over_break.tga 0.679687500000 0.531250000000 0.703125000000 0.554687500000 -op_over_less.tga 0.703125000000 0.531250000000 0.726562500000 0.554687500000 -op_over_more.tga 0.914062500000 0.539062500000 0.937500000000 0.562500000000 -ico_metabolism.tga 0.726562500000 0.546875000000 0.750000000000 0.570312500000 -pa_back.tga 0.750000000000 0.546875000000 0.773437500000 0.570312500000 -ico_mezz.tga 0.773437500000 0.546875000000 0.796875000000 0.570312500000 -ico_misfortune.tga 0.796875000000 0.546875000000 0.820312500000 0.570312500000 -BK_magie_noire_brick.tga 0.820312500000 0.546875000000 0.843750000000 0.570312500000 -pa_over_break.tga 0.843750000000 0.546875000000 0.867187500000 0.570312500000 -pa_over_less.tga 0.867187500000 0.546875000000 0.890625000000 0.570312500000 -pa_over_more.tga 0.890625000000 0.546875000000 0.914062500000 0.570312500000 -BK_tryker_brick.tga 0.937500000000 0.546875000000 0.960937500000 0.570312500000 -cp_back.tga 0.960937500000 0.546875000000 0.984375000000 0.570312500000 -cp_over_break.tga 0.000000000000 0.554687500000 0.023437500000 0.578125000000 -pvp_ally_0.tga 0.023437500000 0.554687500000 0.046875000000 0.578125000000 -pvp_ally_1.tga 0.046875000000 0.554687500000 0.070312500000 0.578125000000 -pvp_ally_2.tga 0.070312500000 0.554687500000 0.093750000000 0.578125000000 -pvp_ally_3.tga 0.093750000000 0.554687500000 0.117187500000 0.578125000000 -pvp_ally_4.tga 0.117187500000 0.554687500000 0.140625000000 0.578125000000 -pvp_ally_6.tga 0.140625000000 0.554687500000 0.164062500000 0.578125000000 -pvp_ally_primas.tga 0.164062500000 0.554687500000 0.187500000000 0.578125000000 -pvp_ally_ranger.tga 0.187500000000 0.554687500000 0.210937500000 0.578125000000 -cp_over_less.tga 0.210937500000 0.554687500000 0.234375000000 0.578125000000 -cp_over_more.tga 0.234375000000 0.554687500000 0.257812500000 0.578125000000 -cp_over_opening.tga 0.257812500000 0.554687500000 0.281250000000 0.578125000000 -cp_over_opening_2.tga 0.281250000000 0.554687500000 0.304687500000 0.578125000000 -pvp_enemy_0.tga 0.304687500000 0.554687500000 0.328125000000 0.578125000000 -pvp_enemy_1.tga 0.328125000000 0.554687500000 0.351562500000 0.578125000000 -pvp_enemy_2.tga 0.351562500000 0.554687500000 0.375000000000 0.578125000000 -pvp_enemy_3.tga 0.375000000000 0.554687500000 0.398437500000 0.578125000000 -pvp_enemy_4.tga 0.398437500000 0.554687500000 0.421875000000 0.578125000000 -pvp_enemy_6.tga 0.421875000000 0.554687500000 0.445312500000 0.578125000000 -pvp_enemy_marauder.tga 0.445312500000 0.554687500000 0.468750000000 0.578125000000 -pvp_enemy_trytonist.tga 0.468750000000 0.554687500000 0.492187500000 0.578125000000 -bg_downloader.tga 0.492187500000 0.554687500000 0.515625000000 0.578125000000 -BK_zorai_brick.tga 0.515625000000 0.554687500000 0.539062500000 0.578125000000 -ef_back.tga 0.539062500000 0.554687500000 0.562500000000 0.578125000000 -ef_over_break.tga 0.562500000000 0.554687500000 0.585937500000 0.578125000000 -ico_move.tga 0.585937500000 0.554687500000 0.609375000000 0.578125000000 -ico_multiple_spots.tga 0.609375000000 0.554687500000 0.632812500000 0.578125000000 -ico_multi_fight.tga 0.632812500000 0.554687500000 0.656250000000 0.578125000000 -ef_over_less.tga 0.656250000000 0.554687500000 0.679687500000 0.578125000000 -ico_opening_hit.tga 0.679687500000 0.554687500000 0.703125000000 0.578125000000 -ico_over_autumn.tga 0.703125000000 0.554687500000 0.726562500000 0.578125000000 -ico_over_degenerated.tga 0.914062500000 0.562500000000 0.937500000000 0.585937500000 -ico_over_fauna.tga 0.726562500000 0.570312500000 0.750000000000 0.593750000000 -ico_over_flora.tga 0.750000000000 0.570312500000 0.773437500000 0.593750000000 -ico_over_hit_arms.tga 0.773437500000 0.570312500000 0.796875000000 0.593750000000 -ico_over_hit_chest.tga 0.796875000000 0.570312500000 0.820312500000 0.593750000000 -ico_over_hit_feet.tga 0.820312500000 0.570312500000 0.843750000000 0.593750000000 -ico_over_hit_feet_hands.tga 0.843750000000 0.570312500000 0.867187500000 0.593750000000 -ico_over_hit_feet_head.tga 0.867187500000 0.570312500000 0.890625000000 0.593750000000 -ico_over_hit_feet_x2.tga 0.890625000000 0.570312500000 0.914062500000 0.593750000000 -ico_over_hit_feint_x3.tga 0.937500000000 0.570312500000 0.960937500000 0.593750000000 -ico_over_hit_hands.tga 0.960937500000 0.570312500000 0.984375000000 0.593750000000 -ico_over_hit_hands_chest.tga 0.000000000000 0.578125000000 0.023437500000 0.601562500000 -ico_over_hit_hands_head.tga 0.023437500000 0.578125000000 0.046875000000 0.601562500000 -ico_over_hit_head.tga 0.046875000000 0.578125000000 0.070312500000 0.601562500000 -ico_over_hit_head_x3.tga 0.070312500000 0.578125000000 0.093750000000 0.601562500000 -ico_over_hit_legs.tga 0.093750000000 0.578125000000 0.117187500000 0.601562500000 -ico_over_homin.tga 0.117187500000 0.578125000000 0.140625000000 0.601562500000 -ico_over_kitin.tga 0.140625000000 0.578125000000 0.164062500000 0.601562500000 -ico_over_magic.tga 0.164062500000 0.578125000000 0.187500000000 0.601562500000 -ico_over_melee.tga 0.187500000000 0.578125000000 0.210937500000 0.601562500000 -ico_over_racial.tga 0.210937500000 0.578125000000 0.234375000000 0.601562500000 -ico_over_range.tga 0.234375000000 0.578125000000 0.257812500000 0.601562500000 -ico_over_special.tga 0.257812500000 0.578125000000 0.281250000000 0.601562500000 -ico_over_spring.tga 0.281250000000 0.578125000000 0.304687500000 0.601562500000 -ico_over_summer.tga 0.304687500000 0.578125000000 0.328125000000 0.601562500000 -ico_over_winter.tga 0.328125000000 0.578125000000 0.351562500000 0.601562500000 -ico_parry.tga 0.351562500000 0.578125000000 0.375000000000 0.601562500000 -ico_piercing.tga 0.375000000000 0.578125000000 0.398437500000 0.601562500000 -ico_pointe.tga 0.398437500000 0.578125000000 0.421875000000 0.601562500000 -ico_poison.tga 0.421875000000 0.578125000000 0.445312500000 0.601562500000 -ico_power.tga 0.445312500000 0.578125000000 0.468750000000 0.601562500000 -ico_preservation.tga 0.468750000000 0.578125000000 0.492187500000 0.601562500000 -ico_primal.tga 0.492187500000 0.578125000000 0.515625000000 0.601562500000 -ico_prime_roots.tga 0.515625000000 0.578125000000 0.539062500000 0.601562500000 -ico_private.tga 0.539062500000 0.578125000000 0.562500000000 0.601562500000 -ico_prospecting.tga 0.562500000000 0.578125000000 0.585937500000 0.601562500000 -ico_quality.tga 0.585937500000 0.578125000000 0.609375000000 0.601562500000 -ef_over_more.tga 0.609375000000 0.578125000000 0.632812500000 0.601562500000 -ico_range.tga 0.632812500000 0.578125000000 0.656250000000 0.601562500000 -ico_range_action_buff.tga 0.656250000000 0.578125000000 0.679687500000 0.601562500000 -ico_range_target_buff.tga 0.679687500000 0.578125000000 0.703125000000 0.601562500000 -ico_ricochet.tga 0.703125000000 0.578125000000 0.726562500000 0.601562500000 -ico_root.tga 0.914062500000 0.585937500000 0.937500000000 0.609375000000 -ico_rot.tga 0.726562500000 0.593750000000 0.750000000000 0.617187500000 -ico_safe.tga 0.750000000000 0.593750000000 0.773437500000 0.617187500000 -ico_sap.tga 0.773437500000 0.593750000000 0.796875000000 0.617187500000 -ico_self_damage.tga 0.796875000000 0.593750000000 0.820312500000 0.617187500000 -ico_shaft.tga 0.820312500000 0.593750000000 0.843750000000 0.617187500000 -ico_shielding.tga 0.843750000000 0.593750000000 0.867187500000 0.617187500000 -ico_shield_buff.tga 0.867187500000 0.593750000000 0.890625000000 0.617187500000 -ico_shield_up.tga 0.890625000000 0.593750000000 0.914062500000 0.617187500000 -ico_shockwave.tga 0.937500000000 0.593750000000 0.960937500000 0.617187500000 -ico_sickness.tga 0.960937500000 0.593750000000 0.984375000000 0.617187500000 -ico_slashing.tga 0.000000000000 0.601562500000 0.023437500000 0.625000000000 -ico_slow.tga 0.023437500000 0.601562500000 0.046875000000 0.625000000000 -ico_soft_spot.tga 0.046875000000 0.601562500000 0.070312500000 0.625000000000 -ico_source_time.tga 0.070312500000 0.601562500000 0.093750000000 0.625000000000 -ico_speed.tga 0.093750000000 0.601562500000 0.117187500000 0.625000000000 -ico_speeding_up.tga 0.117187500000 0.601562500000 0.140625000000 0.625000000000 -ico_spell_break.tga 0.140625000000 0.601562500000 0.164062500000 0.625000000000 -fo_back.tga 0.164062500000 0.601562500000 0.187500000000 0.625000000000 -ico_spray.tga 0.187500000000 0.601562500000 0.210937500000 0.625000000000 -ico_spying.tga 0.210937500000 0.601562500000 0.234375000000 0.625000000000 -ico_stamina.tga 0.234375000000 0.601562500000 0.257812500000 0.625000000000 -ico_strength.tga 0.257812500000 0.601562500000 0.281250000000 0.625000000000 -ico_stuffing.tga 0.281250000000 0.601562500000 0.304687500000 0.625000000000 -ico_stunn.tga 0.304687500000 0.601562500000 0.328125000000 0.625000000000 -fo_over.tga 0.328125000000 0.601562500000 0.351562500000 0.625000000000 -fp_ammo.tga 0.351562500000 0.601562500000 0.375000000000 0.625000000000 -fp_armor.tga 0.375000000000 0.601562500000 0.398437500000 0.625000000000 -fp_building.tga 0.398437500000 0.601562500000 0.421875000000 0.625000000000 -fp_jewel.tga 0.421875000000 0.601562500000 0.445312500000 0.625000000000 -fp_melee.tga 0.445312500000 0.601562500000 0.468750000000 0.625000000000 -fp_over.tga 0.468750000000 0.601562500000 0.492187500000 0.625000000000 -fp_range.tga 0.492187500000 0.601562500000 0.515625000000 0.625000000000 -fp_shield.tga 0.515625000000 0.601562500000 0.539062500000 0.625000000000 -fp_tools.tga 0.539062500000 0.601562500000 0.562500000000 0.625000000000 -brick_default.tga 0.562500000000 0.601562500000 0.585937500000 0.625000000000 -ico_taunt.tga 0.585937500000 0.601562500000 0.609375000000 0.625000000000 -tb_action_attack.tga 0.609375000000 0.601562500000 0.632812500000 0.625000000000 -tb_action_config.tga 0.632812500000 0.601562500000 0.656250000000 0.625000000000 -tb_action_disband.tga 0.656250000000 0.601562500000 0.679687500000 0.625000000000 -tb_action_disengage.tga 0.679687500000 0.601562500000 0.703125000000 0.625000000000 -tb_action_extract.tga 0.703125000000 0.601562500000 0.726562500000 0.625000000000 -tb_action_invite.tga 0.914062500000 0.609375000000 0.937500000000 0.632812500000 -tb_action_kick.tga 0.726562500000 0.617187500000 0.750000000000 0.640625000000 -tb_action_move.tga 0.750000000000 0.617187500000 0.773437500000 0.640625000000 -tb_action_run.tga 0.773437500000 0.617187500000 0.796875000000 0.640625000000 -tb_action_sit.tga 0.796875000000 0.617187500000 0.820312500000 0.640625000000 -tb_action_stand.tga 0.820312500000 0.617187500000 0.843750000000 0.640625000000 -tb_action_stop.tga 0.843750000000 0.617187500000 0.867187500000 0.640625000000 -tb_action_talk.tga 0.867187500000 0.617187500000 0.890625000000 0.640625000000 -tb_action_walk.tga 0.890625000000 0.617187500000 0.914062500000 0.640625000000 -tb_animals.tga 0.937500000000 0.617187500000 0.960937500000 0.640625000000 -tb_config.tga 0.960937500000 0.617187500000 0.984375000000 0.640625000000 -tb_connection.tga 0.000000000000 0.625000000000 0.023437500000 0.648437500000 -tb_contacts.tga 0.023437500000 0.625000000000 0.046875000000 0.648437500000 -tb_desk_1.tga 0.046875000000 0.625000000000 0.070312500000 0.648437500000 -tb_desk_2.tga 0.070312500000 0.625000000000 0.093750000000 0.648437500000 -tb_desk_3.tga 0.093750000000 0.625000000000 0.117187500000 0.648437500000 -tb_desk_4.tga 0.117187500000 0.625000000000 0.140625000000 0.648437500000 -tb_faction.tga 0.140625000000 0.625000000000 0.164062500000 0.648437500000 -tb_forum.tga 0.164062500000 0.625000000000 0.187500000000 0.648437500000 -tb_guild.tga 0.187500000000 0.625000000000 0.210937500000 0.648437500000 -TB_help2.tga 0.210937500000 0.625000000000 0.234375000000 0.648437500000 -tb_keys.tga 0.234375000000 0.625000000000 0.257812500000 0.648437500000 -tb_macros.tga 0.257812500000 0.625000000000 0.281250000000 0.648437500000 -tb_mail.tga 0.281250000000 0.625000000000 0.304687500000 0.648437500000 -tb_mode_dodge.tga 0.304687500000 0.625000000000 0.328125000000 0.648437500000 -tb_mode_parry.tga 0.328125000000 0.625000000000 0.351562500000 0.648437500000 -tb_over.tga 0.351562500000 0.625000000000 0.375000000000 0.648437500000 -tb_support.tga 0.375000000000 0.625000000000 0.398437500000 0.648437500000 -tb_team.tga 0.398437500000 0.625000000000 0.421875000000 0.648437500000 -tb_windows.tga 0.421875000000 0.625000000000 0.445312500000 0.648437500000 -ico_time.tga 0.445312500000 0.625000000000 0.468750000000 0.648437500000 -ico_time_bonus.tga 0.468750000000 0.625000000000 0.492187500000 0.648437500000 -ico_absorb_damage.tga 0.492187500000 0.625000000000 0.515625000000 0.648437500000 -ico_trigger.tga 0.515625000000 0.625000000000 0.539062500000 0.648437500000 -ico_umbrella.tga 0.539062500000 0.625000000000 0.562500000000 0.648437500000 -ico_use_enchantement.tga 0.562500000000 0.625000000000 0.585937500000 0.648437500000 -ico_vampire.tga 0.585937500000 0.625000000000 0.609375000000 0.648437500000 -ico_visibility.tga 0.609375000000 0.625000000000 0.632812500000 0.648437500000 -ico_war_cry.tga 0.632812500000 0.625000000000 0.656250000000 0.648437500000 -ico_weight.tga 0.656250000000 0.625000000000 0.679687500000 0.648437500000 -ico_wellbalanced.tga 0.679687500000 0.625000000000 0.703125000000 0.648437500000 -ico_will.tga 0.703125000000 0.625000000000 0.726562500000 0.648437500000 -ico_windding.tga 0.914062500000 0.632812500000 0.937500000000 0.656250000000 -ico_wisdom.tga 0.726562500000 0.640625000000 0.750000000000 0.664062500000 -ico_accurate.tga 0.750000000000 0.640625000000 0.773437500000 0.664062500000 -ico_acid.tga 0.773437500000 0.640625000000 0.796875000000 0.664062500000 -ico_aim.tga 0.796875000000 0.640625000000 0.820312500000 0.664062500000 -ico_aim_bird_wings.tga 0.820312500000 0.640625000000 0.843750000000 0.664062500000 -ico_aim_flying_kitin_abdomen.tga 0.843750000000 0.640625000000 0.867187500000 0.664062500000 -ico_aim_homin_arms.tga 0.867187500000 0.640625000000 0.890625000000 0.664062500000 -ico_aim_homin_chest.tga 0.890625000000 0.640625000000 0.914062500000 0.664062500000 -mf_back.tga 0.937500000000 0.640625000000 0.960937500000 0.664062500000 -us_back_0.tga 0.960937500000 0.640625000000 0.984375000000 0.664062500000 -us_back_1.tga 0.000000000000 0.648437500000 0.023437500000 0.671875000000 -us_back_2.tga 0.023437500000 0.648437500000 0.046875000000 0.671875000000 -us_back_3.tga 0.046875000000 0.648437500000 0.070312500000 0.671875000000 -us_back_4.tga 0.070312500000 0.648437500000 0.093750000000 0.671875000000 -us_back_5.tga 0.093750000000 0.648437500000 0.117187500000 0.671875000000 -us_back_6.tga 0.117187500000 0.648437500000 0.140625000000 0.671875000000 -us_back_7.tga 0.140625000000 0.648437500000 0.164062500000 0.671875000000 -us_back_8.tga 0.164062500000 0.648437500000 0.187500000000 0.671875000000 -us_back_9.tga 0.187500000000 0.648437500000 0.210937500000 0.671875000000 -us_ico_0.tga 0.210937500000 0.648437500000 0.234375000000 0.671875000000 -us_ico_1.tga 0.234375000000 0.648437500000 0.257812500000 0.671875000000 -us_ico_2.tga 0.257812500000 0.648437500000 0.281250000000 0.671875000000 -us_ico_3.tga 0.281250000000 0.648437500000 0.304687500000 0.671875000000 -us_ico_4.tga 0.304687500000 0.648437500000 0.328125000000 0.671875000000 -us_ico_5.tga 0.328125000000 0.648437500000 0.351562500000 0.671875000000 -us_ico_6.tga 0.351562500000 0.648437500000 0.375000000000 0.671875000000 -us_ico_7.tga 0.375000000000 0.648437500000 0.398437500000 0.671875000000 -us_ico_8.tga 0.398437500000 0.648437500000 0.421875000000 0.671875000000 -us_ico_9.tga 0.421875000000 0.648437500000 0.445312500000 0.671875000000 -us_over_0.tga 0.445312500000 0.648437500000 0.468750000000 0.671875000000 -us_over_1.tga 0.468750000000 0.648437500000 0.492187500000 0.671875000000 -us_over_2.tga 0.492187500000 0.648437500000 0.515625000000 0.671875000000 -us_over_3.tga 0.515625000000 0.648437500000 0.539062500000 0.671875000000 -us_over_4.tga 0.539062500000 0.648437500000 0.562500000000 0.671875000000 -mf_over.tga 0.562500000000 0.648437500000 0.585937500000 0.671875000000 -ico_aim_homin_feet.tga 0.585937500000 0.648437500000 0.609375000000 0.671875000000 -ico_aim_homin_feint.tga 0.609375000000 0.648437500000 0.632812500000 0.671875000000 -ico_aim_homin_hands.tga 0.632812500000 0.648437500000 0.656250000000 0.671875000000 -ico_aim_homin_head.tga 0.656250000000 0.648437500000 0.679687500000 0.671875000000 -ico_aim_homin_legs.tga 0.679687500000 0.648437500000 0.703125000000 0.671875000000 -mp3.tga 0.703125000000 0.648437500000 0.726562500000 0.671875000000 -W_slot_shortcut_id0.tga 0.914062500000 0.656250000000 0.937500000000 0.679687500000 -W_slot_shortcut_id1.tga 0.726562500000 0.664062500000 0.750000000000 0.687500000000 -W_slot_shortcut_id2.tga 0.750000000000 0.664062500000 0.773437500000 0.687500000000 -W_slot_shortcut_id3.tga 0.773437500000 0.664062500000 0.796875000000 0.687500000000 -W_slot_shortcut_id4.tga 0.796875000000 0.664062500000 0.820312500000 0.687500000000 -W_slot_shortcut_id5.tga 0.820312500000 0.664062500000 0.843750000000 0.687500000000 -W_slot_shortcut_id6.tga 0.843750000000 0.664062500000 0.867187500000 0.687500000000 -W_slot_shortcut_id7.tga 0.867187500000 0.664062500000 0.890625000000 0.687500000000 -W_slot_shortcut_id8.tga 0.890625000000 0.664062500000 0.914062500000 0.687500000000 -W_slot_shortcut_id9.tga 0.937500000000 0.664062500000 0.960937500000 0.687500000000 -w_slot_shortcut_shift_id0.tga 0.960937500000 0.664062500000 0.984375000000 0.687500000000 -w_slot_shortcut_shift_id1.tga 0.000000000000 0.671875000000 0.023437500000 0.695312500000 -w_slot_shortcut_shift_id2.tga 0.023437500000 0.671875000000 0.046875000000 0.695312500000 -w_slot_shortcut_shift_id3.tga 0.046875000000 0.671875000000 0.070312500000 0.695312500000 -w_slot_shortcut_shift_id4.tga 0.070312500000 0.671875000000 0.093750000000 0.695312500000 -w_slot_shortcut_shift_id5.tga 0.093750000000 0.671875000000 0.117187500000 0.695312500000 -w_slot_shortcut_shift_id6.tga 0.117187500000 0.671875000000 0.140625000000 0.695312500000 -w_slot_shortcut_shift_id7.tga 0.140625000000 0.671875000000 0.164062500000 0.695312500000 -w_slot_shortcut_shift_id8.tga 0.164062500000 0.671875000000 0.187500000000 0.695312500000 -w_slot_shortcut_shift_id9.tga 0.187500000000 0.671875000000 0.210937500000 0.695312500000 -ico_aim_kitin_head.tga 0.210937500000 0.671875000000 0.234375000000 0.695312500000 -ico_source_knowledge.tga 0.234375000000 0.671875000000 0.255859375000 0.695312500000 +ico_taunt.tga 0.976562500000 0.078125000000 1.000000000000 0.101562500000 +BK_generic_brick.tga 0.976562500000 0.101562500000 1.000000000000 0.125000000000 +bk_aura.tga 0.976562500000 0.125000000000 1.000000000000 0.148437500000 +bk_outpost_brick.tga 0.976562500000 0.148437500000 1.000000000000 0.171875000000 +bk_power.tga 0.976562500000 0.171875000000 1.000000000000 0.195312500000 +no_action.tga 0.976562500000 0.195312500000 1.000000000000 0.218750000000 +no_pvp.tga 0.976562500000 0.218750000000 1.000000000000 0.242187500000 +op_back.tga 0.976562500000 0.242187500000 1.000000000000 0.265625000000 +op_over_break.tga 0.976562500000 0.265625000000 1.000000000000 0.289062500000 +op_over_less.tga 0.976562500000 0.289062500000 1.000000000000 0.312500000000 +op_over_more.tga 0.976562500000 0.312500000000 1.000000000000 0.335937500000 +bk_conso.tga 0.976562500000 0.335937500000 1.000000000000 0.359375000000 +pa_back.tga 0.976562500000 0.359375000000 1.000000000000 0.382812500000 +2h_over.tga 0.976562500000 0.382812500000 1.000000000000 0.406250000000 +1h_over.tga 0.976562500000 0.406250000000 1.000000000000 0.429687500000 +pvp_duel.tga 0.976562500000 0.429687500000 1.000000000000 0.453125000000 +pvp_enemy_0.tga 0.976562500000 0.453125000000 1.000000000000 0.476562500000 +pvp_enemy_1.tga 0.960937500000 0.476562500000 0.984375000000 0.500000000000 +pvp_enemy_2.tga 0.929687500000 0.492187500000 0.953125000000 0.515625000000 +pvp_enemy_3.tga 0.742187500000 0.500000000000 0.765625000000 0.523437500000 +pvp_enemy_4.tga 0.765625000000 0.500000000000 0.789062500000 0.523437500000 +pvp_enemy_6.tga 0.789062500000 0.500000000000 0.812500000000 0.523437500000 +pvp_enemy_flag.tga 0.812500000000 0.500000000000 0.835937500000 0.523437500000 +pvp_enemy_marauder.tga 0.835937500000 0.500000000000 0.859375000000 0.523437500000 +pvp_enemy_tag.tga 0.859375000000 0.500000000000 0.882812500000 0.523437500000 +tb_action_attack.tga 0.882812500000 0.500000000000 0.906250000000 0.523437500000 +tb_action_config.tga 0.906250000000 0.500000000000 0.929687500000 0.523437500000 +tb_action_disband.tga 0.953125000000 0.500000000000 0.976562500000 0.523437500000 +tb_action_disengage.tga 0.976562500000 0.500000000000 1.000000000000 0.523437500000 +tb_action_extract.tga 0.000000000000 0.507812500000 0.023437500000 0.531250000000 +tb_action_invite.tga 0.023437500000 0.507812500000 0.046875000000 0.531250000000 +tb_action_kick.tga 0.046875000000 0.507812500000 0.070312500000 0.531250000000 +tb_action_move.tga 0.070312500000 0.507812500000 0.093750000000 0.531250000000 +tb_action_run.tga 0.093750000000 0.507812500000 0.117187500000 0.531250000000 +tb_action_sit.tga 0.117187500000 0.507812500000 0.140625000000 0.531250000000 +tb_action_stand.tga 0.140625000000 0.507812500000 0.164062500000 0.531250000000 +tb_action_stop.tga 0.164062500000 0.507812500000 0.187500000000 0.531250000000 +tb_action_talk.tga 0.187500000000 0.507812500000 0.210937500000 0.531250000000 +tb_action_walk.tga 0.210937500000 0.507812500000 0.234375000000 0.531250000000 +ico_armor_penalty.tga 0.234375000000 0.507812500000 0.257812500000 0.531250000000 +ico_armor_shell.tga 0.257812500000 0.507812500000 0.281250000000 0.531250000000 +ico_atys.tga 0.281250000000 0.507812500000 0.304687500000 0.531250000000 +ico_atysian.tga 0.304687500000 0.507812500000 0.328125000000 0.531250000000 +ico_balance_hp.tga 0.328125000000 0.507812500000 0.351562500000 0.531250000000 +ico_barrel.tga 0.351562500000 0.507812500000 0.375000000000 0.531250000000 +ico_bash.tga 0.375000000000 0.507812500000 0.398437500000 0.531250000000 +ico_berserk.tga 0.398437500000 0.507812500000 0.421875000000 0.531250000000 +ico_blade.tga 0.421875000000 0.507812500000 0.445312500000 0.531250000000 +ico_bleeding.tga 0.445312500000 0.507812500000 0.468750000000 0.531250000000 +ico_blind.tga 0.468750000000 0.507812500000 0.492187500000 0.531250000000 +ico_blunt.tga 0.492187500000 0.507812500000 0.515625000000 0.531250000000 +ico_bomb.tga 0.515625000000 0.507812500000 0.539062500000 0.531250000000 +pvp_enemy_trytonist.tga 0.539062500000 0.507812500000 0.562500000000 0.531250000000 +ico_celestial.tga 0.562500000000 0.507812500000 0.585937500000 0.531250000000 +ico_circular_attack.tga 0.585937500000 0.507812500000 0.609375000000 0.531250000000 +ico_cold.tga 0.609375000000 0.507812500000 0.632812500000 0.531250000000 +ico_concentration.tga 0.632812500000 0.507812500000 0.656250000000 0.531250000000 +pvp_flag.tga 0.656250000000 0.507812500000 0.679687500000 0.531250000000 +ico_constitution.tga 0.679687500000 0.507812500000 0.703125000000 0.531250000000 +ico_counterweight.tga 0.703125000000 0.507812500000 0.726562500000 0.531250000000 +ico_craft_buff.tga 0.929687500000 0.515625000000 0.953125000000 0.539062500000 +ico_create_sapload.tga 0.726562500000 0.523437500000 0.750000000000 0.546875000000 +ico_curse.tga 0.750000000000 0.523437500000 0.773437500000 0.546875000000 +ico_debuff.tga 0.773437500000 0.523437500000 0.796875000000 0.546875000000 +ico_debuff_resist.tga 0.796875000000 0.523437500000 0.820312500000 0.546875000000 +ico_debuff_skill.tga 0.820312500000 0.523437500000 0.843750000000 0.546875000000 +ico_desert.tga 0.843750000000 0.523437500000 0.867187500000 0.546875000000 +ico_dexterity.tga 0.867187500000 0.523437500000 0.890625000000 0.546875000000 +ico_disarm.tga 0.890625000000 0.523437500000 0.914062500000 0.546875000000 +ico_dodge.tga 0.953125000000 0.523437500000 0.976562500000 0.546875000000 +ico_dot.tga 0.976562500000 0.523437500000 1.000000000000 0.546875000000 +ico_electric.tga 0.000000000000 0.531250000000 0.023437500000 0.554687500000 +ico_explosif.tga 0.023437500000 0.531250000000 0.046875000000 0.554687500000 +ico_extracting.tga 0.046875000000 0.531250000000 0.070312500000 0.554687500000 +ico_fear.tga 0.070312500000 0.531250000000 0.093750000000 0.554687500000 +ico_feint.tga 0.093750000000 0.531250000000 0.117187500000 0.554687500000 +ico_fire.tga 0.117187500000 0.531250000000 0.140625000000 0.554687500000 +ico_firing_pin.tga 0.140625000000 0.531250000000 0.164062500000 0.554687500000 +pvp_neutral.tga 0.164062500000 0.531250000000 0.187500000000 0.554687500000 +pvp_tag.tga 0.187500000000 0.531250000000 0.210937500000 0.554687500000 +BK_magie_noire_brick.tga 0.210937500000 0.531250000000 0.234375000000 0.554687500000 +cp_back.tga 0.234375000000 0.531250000000 0.257812500000 0.554687500000 +cp_over_break.tga 0.257812500000 0.531250000000 0.281250000000 0.554687500000 +cp_over_less.tga 0.281250000000 0.531250000000 0.304687500000 0.554687500000 +ico_focus.tga 0.304687500000 0.531250000000 0.328125000000 0.554687500000 +ico_forage_buff.tga 0.328125000000 0.531250000000 0.351562500000 0.554687500000 +ico_forbid_item.tga 0.351562500000 0.531250000000 0.375000000000 0.554687500000 +ico_forest.tga 0.375000000000 0.531250000000 0.398437500000 0.554687500000 +ico_jungle.tga 0.398437500000 0.531250000000 0.421875000000 0.554687500000 +ico_lacustre.tga 0.421875000000 0.531250000000 0.445312500000 0.554687500000 +ico_landmark_bonus.tga 0.445312500000 0.531250000000 0.468750000000 0.554687500000 +ico_level.tga 0.468750000000 0.531250000000 0.492187500000 0.554687500000 +ico_lining.tga 0.492187500000 0.531250000000 0.515625000000 0.554687500000 +ico_location.tga 0.515625000000 0.531250000000 0.539062500000 0.554687500000 +ico_madness.tga 0.539062500000 0.531250000000 0.562500000000 0.554687500000 +ico_magic.tga 0.562500000000 0.531250000000 0.585937500000 0.554687500000 +ico_magic_action_buff.tga 0.585937500000 0.531250000000 0.609375000000 0.554687500000 +ico_magic_focus.tga 0.609375000000 0.531250000000 0.632812500000 0.554687500000 +ico_magic_target_buff.tga 0.632812500000 0.531250000000 0.656250000000 0.554687500000 +ico_melee_action_buff.tga 0.656250000000 0.531250000000 0.679687500000 0.554687500000 +ico_melee_target_buff.tga 0.679687500000 0.531250000000 0.703125000000 0.554687500000 +ico_mental.tga 0.703125000000 0.531250000000 0.726562500000 0.554687500000 +ico_metabolism.tga 0.914062500000 0.539062500000 0.937500000000 0.562500000000 +ico_mezz.tga 0.726562500000 0.546875000000 0.750000000000 0.570312500000 +cp_over_more.tga 0.750000000000 0.546875000000 0.773437500000 0.570312500000 +cp_over_opening.tga 0.773437500000 0.546875000000 0.796875000000 0.570312500000 +tb_animals.tga 0.796875000000 0.546875000000 0.820312500000 0.570312500000 +cp_over_opening_2.tga 0.820312500000 0.546875000000 0.843750000000 0.570312500000 +us_back_9.tga 0.843750000000 0.546875000000 0.867187500000 0.570312500000 +BK_tryker_brick.tga 0.867187500000 0.546875000000 0.890625000000 0.570312500000 +ico_spray.tga 0.890625000000 0.546875000000 0.914062500000 0.570312500000 +ico_spying.tga 0.937500000000 0.546875000000 0.960937500000 0.570312500000 +ico_stamina.tga 0.960937500000 0.546875000000 0.984375000000 0.570312500000 +ico_strength.tga 0.000000000000 0.554687500000 0.023437500000 0.578125000000 +ico_stuffing.tga 0.023437500000 0.554687500000 0.046875000000 0.578125000000 +ico_stunn.tga 0.046875000000 0.554687500000 0.070312500000 0.578125000000 +ico_move.tga 0.070312500000 0.554687500000 0.093750000000 0.578125000000 +ico_multiple_spots.tga 0.093750000000 0.554687500000 0.117187500000 0.578125000000 +ico_multi_fight.tga 0.117187500000 0.554687500000 0.140625000000 0.578125000000 +ico_opening_hit.tga 0.140625000000 0.554687500000 0.164062500000 0.578125000000 +ico_over_autumn.tga 0.164062500000 0.554687500000 0.187500000000 0.578125000000 +ico_over_degenerated.tga 0.187500000000 0.554687500000 0.210937500000 0.578125000000 +ico_over_fauna.tga 0.210937500000 0.554687500000 0.234375000000 0.578125000000 +ico_over_flora.tga 0.234375000000 0.554687500000 0.257812500000 0.578125000000 +ico_over_hit_arms.tga 0.257812500000 0.554687500000 0.281250000000 0.578125000000 +ico_over_hit_chest.tga 0.281250000000 0.554687500000 0.304687500000 0.578125000000 +ico_over_hit_feet.tga 0.304687500000 0.554687500000 0.328125000000 0.578125000000 +ico_over_hit_feet_hands.tga 0.328125000000 0.554687500000 0.351562500000 0.578125000000 +ico_over_hit_feet_head.tga 0.351562500000 0.554687500000 0.375000000000 0.578125000000 +ico_over_hit_feet_x2.tga 0.375000000000 0.554687500000 0.398437500000 0.578125000000 +ico_over_hit_feint_x3.tga 0.398437500000 0.554687500000 0.421875000000 0.578125000000 +ico_over_hit_hands.tga 0.421875000000 0.554687500000 0.445312500000 0.578125000000 +ico_over_hit_hands_chest.tga 0.445312500000 0.554687500000 0.468750000000 0.578125000000 +ico_over_hit_hands_head.tga 0.468750000000 0.554687500000 0.492187500000 0.578125000000 +ico_over_hit_head.tga 0.492187500000 0.554687500000 0.515625000000 0.578125000000 +ico_over_hit_legs.tga 0.515625000000 0.554687500000 0.539062500000 0.578125000000 +ico_over_homin.tga 0.539062500000 0.554687500000 0.562500000000 0.578125000000 +ico_over_kitin.tga 0.562500000000 0.554687500000 0.585937500000 0.578125000000 +ico_over_magic.tga 0.585937500000 0.554687500000 0.609375000000 0.578125000000 +ico_over_melee.tga 0.609375000000 0.554687500000 0.632812500000 0.578125000000 +ico_over_racial.tga 0.632812500000 0.554687500000 0.656250000000 0.578125000000 +ico_over_range.tga 0.656250000000 0.554687500000 0.679687500000 0.578125000000 +ico_over_special.tga 0.679687500000 0.554687500000 0.703125000000 0.578125000000 +ico_over_spring.tga 0.703125000000 0.554687500000 0.726562500000 0.578125000000 +ico_over_summer.tga 0.914062500000 0.562500000000 0.937500000000 0.585937500000 +ico_over_winter.tga 0.726562500000 0.570312500000 0.750000000000 0.593750000000 +ico_parry.tga 0.750000000000 0.570312500000 0.773437500000 0.593750000000 +ico_piercing.tga 0.773437500000 0.570312500000 0.796875000000 0.593750000000 +ico_pointe.tga 0.796875000000 0.570312500000 0.820312500000 0.593750000000 +ico_poison.tga 0.820312500000 0.570312500000 0.843750000000 0.593750000000 +ico_power.tga 0.843750000000 0.570312500000 0.867187500000 0.593750000000 +ico_preservation.tga 0.867187500000 0.570312500000 0.890625000000 0.593750000000 +ico_prime_roots.tga 0.890625000000 0.570312500000 0.914062500000 0.593750000000 +ico_private.tga 0.937500000000 0.570312500000 0.960937500000 0.593750000000 +ico_prospecting.tga 0.960937500000 0.570312500000 0.984375000000 0.593750000000 +ico_quality.tga 0.000000000000 0.578125000000 0.023437500000 0.601562500000 +BK_fyros_brick.tga 0.023437500000 0.578125000000 0.046875000000 0.601562500000 +ico_range.tga 0.046875000000 0.578125000000 0.070312500000 0.601562500000 +ico_range_action_buff.tga 0.070312500000 0.578125000000 0.093750000000 0.601562500000 +ico_range_target_buff.tga 0.093750000000 0.578125000000 0.117187500000 0.601562500000 +ico_ricochet.tga 0.117187500000 0.578125000000 0.140625000000 0.601562500000 +ico_root.tga 0.140625000000 0.578125000000 0.164062500000 0.601562500000 +ico_rot.tga 0.164062500000 0.578125000000 0.187500000000 0.601562500000 +ico_safe.tga 0.187500000000 0.578125000000 0.210937500000 0.601562500000 +ico_sap.tga 0.210937500000 0.578125000000 0.234375000000 0.601562500000 +ico_self_damage.tga 0.234375000000 0.578125000000 0.257812500000 0.601562500000 +ico_shaft.tga 0.257812500000 0.578125000000 0.281250000000 0.601562500000 +ico_shielding.tga 0.281250000000 0.578125000000 0.304687500000 0.601562500000 +ico_shield_buff.tga 0.304687500000 0.578125000000 0.328125000000 0.601562500000 +ico_shield_up.tga 0.328125000000 0.578125000000 0.351562500000 0.601562500000 +ico_shockwave.tga 0.351562500000 0.578125000000 0.375000000000 0.601562500000 +ico_sickness.tga 0.375000000000 0.578125000000 0.398437500000 0.601562500000 +ico_slashing.tga 0.398437500000 0.578125000000 0.421875000000 0.601562500000 +ico_slow.tga 0.421875000000 0.578125000000 0.445312500000 0.601562500000 +ico_soft_spot.tga 0.445312500000 0.578125000000 0.468750000000 0.601562500000 +ico_source_time.tga 0.468750000000 0.578125000000 0.492187500000 0.601562500000 +ico_speed.tga 0.492187500000 0.578125000000 0.515625000000 0.601562500000 +ico_speeding_up.tga 0.515625000000 0.578125000000 0.539062500000 0.601562500000 +ico_spell_break.tga 0.539062500000 0.578125000000 0.562500000000 0.601562500000 +fp_armor.tga 0.562500000000 0.578125000000 0.585937500000 0.601562500000 +fp_building.tga 0.585937500000 0.578125000000 0.609375000000 0.601562500000 +fp_jewel.tga 0.609375000000 0.578125000000 0.632812500000 0.601562500000 +fp_melee.tga 0.632812500000 0.578125000000 0.656250000000 0.601562500000 +fp_over.tga 0.656250000000 0.578125000000 0.679687500000 0.601562500000 +fp_range.tga 0.679687500000 0.578125000000 0.703125000000 0.601562500000 +fp_shield.tga 0.703125000000 0.578125000000 0.726562500000 0.601562500000 +fp_tools.tga 0.914062500000 0.585937500000 0.937500000000 0.609375000000 +ef_back.tga 0.726562500000 0.593750000000 0.750000000000 0.617187500000 +ico_absorb_damage.tga 0.750000000000 0.593750000000 0.773437500000 0.617187500000 +ico_accurate.tga 0.773437500000 0.593750000000 0.796875000000 0.617187500000 +ico_acid.tga 0.796875000000 0.593750000000 0.820312500000 0.617187500000 +ico_aim.tga 0.820312500000 0.593750000000 0.843750000000 0.617187500000 +ico_aim_bird_wings.tga 0.843750000000 0.593750000000 0.867187500000 0.617187500000 +ico_aim_flying_kitin_abdomen.tga 0.867187500000 0.593750000000 0.890625000000 0.617187500000 +ico_aim_homin_arms.tga 0.890625000000 0.593750000000 0.914062500000 0.617187500000 +ico_aim_homin_chest.tga 0.937500000000 0.593750000000 0.960937500000 0.617187500000 +ico_aim_homin_feet.tga 0.960937500000 0.593750000000 0.984375000000 0.617187500000 +ico_aim_homin_feint.tga 0.000000000000 0.601562500000 0.023437500000 0.625000000000 +ico_aim_homin_hands.tga 0.023437500000 0.601562500000 0.046875000000 0.625000000000 +ico_aim_homin_head.tga 0.046875000000 0.601562500000 0.070312500000 0.625000000000 +ico_aim_homin_legs.tga 0.070312500000 0.601562500000 0.093750000000 0.625000000000 +ico_aim_kitin_head.tga 0.093750000000 0.601562500000 0.117187500000 0.625000000000 +ef_over_break.tga 0.117187500000 0.601562500000 0.140625000000 0.625000000000 +ico_ammo_bullet.tga 0.140625000000 0.601562500000 0.164062500000 0.625000000000 +ico_ammo_jacket.tga 0.164062500000 0.601562500000 0.187500000000 0.625000000000 +ico_angle.tga 0.187500000000 0.601562500000 0.210937500000 0.625000000000 +ico_anti_magic_shield.tga 0.210937500000 0.601562500000 0.234375000000 0.625000000000 +ico_armor.tga 0.234375000000 0.601562500000 0.257812500000 0.625000000000 +ico_armor_clip.tga 0.257812500000 0.601562500000 0.281250000000 0.625000000000 +ico_armor_heavy.tga 0.281250000000 0.601562500000 0.304687500000 0.625000000000 +ico_armor_kitin.tga 0.304687500000 0.601562500000 0.328125000000 0.625000000000 +ico_armor_light.tga 0.328125000000 0.601562500000 0.351562500000 0.625000000000 +ef_over_less.tga 0.351562500000 0.601562500000 0.375000000000 0.625000000000 +ef_over_more.tga 0.375000000000 0.601562500000 0.398437500000 0.625000000000 +fo_back.tga 0.398437500000 0.601562500000 0.421875000000 0.625000000000 +fo_over.tga 0.421875000000 0.601562500000 0.445312500000 0.625000000000 +ico_gardening.tga 0.445312500000 0.601562500000 0.468750000000 0.625000000000 +ico_gentle.tga 0.468750000000 0.601562500000 0.492187500000 0.625000000000 +mp_over_link.tga 0.492187500000 0.601562500000 0.515625000000 0.625000000000 +ico_goo.tga 0.515625000000 0.601562500000 0.539062500000 0.625000000000 +us_back_0.tga 0.539062500000 0.601562500000 0.562500000000 0.625000000000 +us_back_1.tga 0.562500000000 0.601562500000 0.585937500000 0.625000000000 +us_back_2.tga 0.585937500000 0.601562500000 0.609375000000 0.625000000000 +us_back_3.tga 0.609375000000 0.601562500000 0.632812500000 0.625000000000 +us_back_4.tga 0.632812500000 0.601562500000 0.656250000000 0.625000000000 +us_back_5.tga 0.656250000000 0.601562500000 0.679687500000 0.625000000000 +us_back_6.tga 0.679687500000 0.601562500000 0.703125000000 0.625000000000 +us_back_7.tga 0.703125000000 0.601562500000 0.726562500000 0.625000000000 +us_back_8.tga 0.914062500000 0.609375000000 0.937500000000 0.632812500000 +tb_config.tga 0.726562500000 0.617187500000 0.750000000000 0.640625000000 +tb_connection.tga 0.750000000000 0.617187500000 0.773437500000 0.640625000000 +tb_contacts.tga 0.773437500000 0.617187500000 0.796875000000 0.640625000000 +tb_desk_1.tga 0.796875000000 0.617187500000 0.820312500000 0.640625000000 +tb_desk_2.tga 0.820312500000 0.617187500000 0.843750000000 0.640625000000 +tb_desk_3.tga 0.843750000000 0.617187500000 0.867187500000 0.640625000000 +tb_desk_4.tga 0.867187500000 0.617187500000 0.890625000000 0.640625000000 +tb_faction.tga 0.890625000000 0.617187500000 0.914062500000 0.640625000000 +tb_forum.tga 0.937500000000 0.617187500000 0.960937500000 0.640625000000 +tb_guild.tga 0.960937500000 0.617187500000 0.984375000000 0.640625000000 +TB_help2.tga 0.000000000000 0.625000000000 0.023437500000 0.648437500000 +tb_keys.tga 0.023437500000 0.625000000000 0.046875000000 0.648437500000 +tb_macros.tga 0.046875000000 0.625000000000 0.070312500000 0.648437500000 +tb_mail.tga 0.070312500000 0.625000000000 0.093750000000 0.648437500000 +tb_mode_dodge.tga 0.093750000000 0.625000000000 0.117187500000 0.648437500000 +tb_mode_parry.tga 0.117187500000 0.625000000000 0.140625000000 0.648437500000 +tb_over.tga 0.140625000000 0.625000000000 0.164062500000 0.648437500000 +tb_support.tga 0.164062500000 0.625000000000 0.187500000000 0.648437500000 +tb_team.tga 0.187500000000 0.625000000000 0.210937500000 0.648437500000 +tb_windows.tga 0.210937500000 0.625000000000 0.234375000000 0.648437500000 +ico_gripp.tga 0.234375000000 0.625000000000 0.257812500000 0.648437500000 +BK_zorai_brick.tga 0.257812500000 0.625000000000 0.281250000000 0.648437500000 +mf_back.tga 0.281250000000 0.625000000000 0.304687500000 0.648437500000 +mf_over.tga 0.304687500000 0.625000000000 0.328125000000 0.648437500000 +brick_default.tga 0.328125000000 0.625000000000 0.351562500000 0.648437500000 +ico_hammer.tga 0.351562500000 0.625000000000 0.375000000000 0.648437500000 +ico_harmful.tga 0.375000000000 0.625000000000 0.398437500000 0.648437500000 +ico_hatred.tga 0.398437500000 0.625000000000 0.421875000000 0.648437500000 +ico_heal.tga 0.421875000000 0.625000000000 0.445312500000 0.648437500000 +mp3.tga 0.445312500000 0.625000000000 0.468750000000 0.648437500000 +ico_hit_rate.tga 0.468750000000 0.625000000000 0.492187500000 0.648437500000 +mp_back_curative.tga 0.492187500000 0.625000000000 0.515625000000 0.648437500000 +mp_back_offensive.tga 0.515625000000 0.625000000000 0.539062500000 0.648437500000 +ico_time.tga 0.539062500000 0.625000000000 0.562500000000 0.648437500000 +ico_time_bonus.tga 0.562500000000 0.625000000000 0.585937500000 0.648437500000 +mp_back_selfonly.tga 0.585937500000 0.625000000000 0.609375000000 0.648437500000 +ico_trigger.tga 0.609375000000 0.625000000000 0.632812500000 0.648437500000 +ico_umbrella.tga 0.632812500000 0.625000000000 0.656250000000 0.648437500000 +ico_use_enchantement.tga 0.656250000000 0.625000000000 0.679687500000 0.648437500000 +ico_vampire.tga 0.679687500000 0.625000000000 0.703125000000 0.648437500000 +ico_visibility.tga 0.703125000000 0.625000000000 0.726562500000 0.648437500000 +ico_war_cry.tga 0.914062500000 0.632812500000 0.937500000000 0.656250000000 +ico_weight.tga 0.726562500000 0.640625000000 0.750000000000 0.664062500000 +ico_wellbalanced.tga 0.750000000000 0.640625000000 0.773437500000 0.664062500000 +ico_will.tga 0.773437500000 0.640625000000 0.796875000000 0.664062500000 +ico_windding.tga 0.796875000000 0.640625000000 0.820312500000 0.664062500000 +ico_wisdom.tga 0.820312500000 0.640625000000 0.843750000000 0.664062500000 +ico_incapacity.tga 0.843750000000 0.640625000000 0.867187500000 0.664062500000 +ico_intelligence.tga 0.867187500000 0.640625000000 0.890625000000 0.664062500000 +ico_interrupt.tga 0.890625000000 0.640625000000 0.914062500000 0.664062500000 +ico_invulnerability.tga 0.937500000000 0.640625000000 0.960937500000 0.664062500000 +ico_jewel_stone.tga 0.960937500000 0.640625000000 0.984375000000 0.664062500000 +us_ico_0.tga 0.000000000000 0.648437500000 0.023437500000 0.671875000000 +us_ico_1.tga 0.023437500000 0.648437500000 0.046875000000 0.671875000000 +us_ico_2.tga 0.046875000000 0.648437500000 0.070312500000 0.671875000000 +us_ico_3.tga 0.070312500000 0.648437500000 0.093750000000 0.671875000000 +us_ico_4.tga 0.093750000000 0.648437500000 0.117187500000 0.671875000000 +us_ico_5.tga 0.117187500000 0.648437500000 0.140625000000 0.671875000000 +us_ico_6.tga 0.140625000000 0.648437500000 0.164062500000 0.671875000000 +us_ico_7.tga 0.164062500000 0.648437500000 0.187500000000 0.671875000000 +us_ico_8.tga 0.187500000000 0.648437500000 0.210937500000 0.671875000000 +us_ico_9.tga 0.210937500000 0.648437500000 0.234375000000 0.671875000000 +us_over_0.tga 0.234375000000 0.648437500000 0.257812500000 0.671875000000 +us_over_1.tga 0.257812500000 0.648437500000 0.281250000000 0.671875000000 +us_over_2.tga 0.281250000000 0.648437500000 0.304687500000 0.671875000000 +us_over_3.tga 0.304687500000 0.648437500000 0.328125000000 0.671875000000 +us_over_4.tga 0.328125000000 0.648437500000 0.351562500000 0.671875000000 +building_state_24x24.tga 0.351562500000 0.648437500000 0.375000000000 0.671875000000 +cb_main_nue.tga 0.375000000000 0.648437500000 0.398437500000 0.671875000000 +fp_ammo.tga 0.398437500000 0.648437500000 0.421875000000 0.671875000000 +ico_armor_medium.tga 0.421875000000 0.648437500000 0.445312500000 0.671875000000 +ico_clothes.tga 0.445312500000 0.648437500000 0.468750000000 0.671875000000 +ico_durability.tga 0.468750000000 0.648437500000 0.492187500000 0.671875000000 +W_slot_shortcut_id0.tga 0.492187500000 0.648437500000 0.515625000000 0.671875000000 +W_slot_shortcut_id1.tga 0.515625000000 0.648437500000 0.539062500000 0.671875000000 +W_slot_shortcut_id2.tga 0.539062500000 0.648437500000 0.562500000000 0.671875000000 +W_slot_shortcut_id3.tga 0.562500000000 0.648437500000 0.585937500000 0.671875000000 +W_slot_shortcut_id4.tga 0.585937500000 0.648437500000 0.609375000000 0.671875000000 +W_slot_shortcut_id5.tga 0.609375000000 0.648437500000 0.632812500000 0.671875000000 +W_slot_shortcut_id6.tga 0.632812500000 0.648437500000 0.656250000000 0.671875000000 +W_slot_shortcut_id7.tga 0.656250000000 0.648437500000 0.679687500000 0.671875000000 +W_slot_shortcut_id8.tga 0.679687500000 0.648437500000 0.703125000000 0.671875000000 +W_slot_shortcut_id9.tga 0.703125000000 0.648437500000 0.726562500000 0.671875000000 +w_slot_shortcut_shift_id0.tga 0.914062500000 0.656250000000 0.937500000000 0.679687500000 +w_slot_shortcut_shift_id1.tga 0.726562500000 0.664062500000 0.750000000000 0.687500000000 +w_slot_shortcut_shift_id2.tga 0.750000000000 0.664062500000 0.773437500000 0.687500000000 +w_slot_shortcut_shift_id3.tga 0.773437500000 0.664062500000 0.796875000000 0.687500000000 +w_slot_shortcut_shift_id4.tga 0.796875000000 0.664062500000 0.820312500000 0.687500000000 +w_slot_shortcut_shift_id5.tga 0.820312500000 0.664062500000 0.843750000000 0.687500000000 +w_slot_shortcut_shift_id6.tga 0.843750000000 0.664062500000 0.867187500000 0.687500000000 +w_slot_shortcut_shift_id7.tga 0.867187500000 0.664062500000 0.890625000000 0.687500000000 +w_slot_shortcut_shift_id8.tga 0.890625000000 0.664062500000 0.914062500000 0.687500000000 +w_slot_shortcut_shift_id9.tga 0.937500000000 0.664062500000 0.960937500000 0.687500000000 +BK_matis_brick.tga 0.960937500000 0.664062500000 0.984375000000 0.687500000000 +ico_jewel_stone_support.tga 0.000000000000 0.671875000000 0.023437500000 0.695312500000 +ico_misfortune.tga 0.023437500000 0.671875000000 0.046875000000 0.695312500000 +pa_over_break.tga 0.046875000000 0.671875000000 0.070312500000 0.695312500000 +pa_over_less.tga 0.070312500000 0.671875000000 0.093750000000 0.695312500000 +pa_over_more.tga 0.093750000000 0.671875000000 0.117187500000 0.695312500000 +ch_back.tga 0.117187500000 0.671875000000 0.140625000000 0.695312500000 +ico_over_hit_head_x3.tga 0.140625000000 0.671875000000 0.164062500000 0.695312500000 +ico_primal.tga 0.164062500000 0.671875000000 0.187500000000 0.695312500000 +pvp_ally_0.tga 0.187500000000 0.671875000000 0.210937500000 0.695312500000 +pvp_ally_1.tga 0.210937500000 0.671875000000 0.234375000000 0.695312500000 +pvp_ally_2.tga 0.234375000000 0.671875000000 0.257812500000 0.695312500000 +pvp_ally_3.tga 0.257812500000 0.671875000000 0.281250000000 0.695312500000 +pvp_ally_4.tga 0.281250000000 0.671875000000 0.304687500000 0.695312500000 +pvp_ally_6.tga 0.304687500000 0.671875000000 0.328125000000 0.695312500000 +pvp_ally_flag.tga 0.328125000000 0.671875000000 0.351562500000 0.695312500000 +pvp_ally_primas.tga 0.351562500000 0.671875000000 0.375000000000 0.695312500000 +pvp_ally_ranger.tga 0.375000000000 0.671875000000 0.398437500000 0.695312500000 +pvp_ally_tag.tga 0.398437500000 0.671875000000 0.421875000000 0.695312500000 +bg_downloader.tga 0.421875000000 0.671875000000 0.445312500000 0.695312500000 +ico_source_knowledge.tga 0.445312500000 0.671875000000 0.466796875000 0.695312500000 +filter_tp.tga 0.468750000000 0.671875000000 0.492187500000 0.687500000000 small_task_done.tga 0.984375000000 0.000000000000 1.000000000000 0.015625000000 small_task_failed.tga 0.984375000000 0.015625000000 1.000000000000 0.031250000000 small_task_fight.tga 0.984375000000 0.031250000000 1.000000000000 0.046875000000 @@ -669,6 +679,6 @@ small_task_travel.tga 0.914062500000 0.523437500000 0.929687500000 0.53906250000 small_task_craft.tga 0.984375000000 0.546875000000 1.000000000000 0.562500000000 num_slash.tga 0.984375000000 0.562500000000 0.996093750000 0.576171875000 W_leader.tga 0.984375000000 0.578125000000 0.997070312500 0.589843750000 -tb_mode.tga 0.984375000000 0.589843750000 0.996093750000 0.601562500000 -profile.tga 0.984375000000 0.601562500000 0.996093750000 0.613281250000 -w_major.tga 0.984375000000 0.613281250000 0.996093750000 0.625000000000 +w_major.tga 0.984375000000 0.589843750000 0.996093750000 0.601562500000 +tb_mode.tga 0.984375000000 0.601562500000 0.996093750000 0.613281250000 +profile.tga 0.984375000000 0.613281250000 0.996093750000 0.625000000000 diff --git a/code/ryzom/client/data/gamedev/adds/sfx/marauder_teleporter.ps b/code/ryzom/client/data/gamedev/adds/sfx/marauder_teleporter.ps new file mode 100644 index 0000000000000000000000000000000000000000..cf6a508a942d9049f0cf355f85bc1b466f5793f7 GIT binary patch literal 3974 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 RZKaQp+6HPDC^joD{}Uxw&^Q19 literal 0 HcmV?d00001 diff --git a/code/ryzom/client/data/gamedev/adds/shapes/GE_HOM_caster_pvp_pantabottes.shape b/code/ryzom/client/data/gamedev/adds/shapes/GE_HOM_caster_pvp_pantabottes.shape new file mode 100644 index 0000000000000000000000000000000000000000..b3fb8f6ca0ca75336a5cf6bb23bd98a21c08cf2b GIT binary patch literal 74810 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 R+TlAu?Y#4$(ccyt{cpKg!D9db literal 0 HcmV?d00001 diff --git a/code/ryzom/client/data/gamedev/adds/shapes/GE_pvp_big_shield.shape b/code/ryzom/client/data/gamedev/adds/shapes/GE_pvp_big_shield.shape new file mode 100644 index 0000000000000000000000000000000000000000..c72f5304e7326656f116201984d9982227afd0f4 GIT binary patch literal 10202 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%0DE-6bh!YJ-GU{&CQ=E(nDV>y!UmyArwkvgD<^CK zmpV|2$Qoa4UI10$pf4r_;`V`5fRw81a@%ba2id`J#=Xj!0Y6AekYd&d5+s$mgJ<=e zi+7kxs+(o!c|su7vO)=c75yWRX=?o_^S7v`rxIb!V-y_YLr6m!wg}5WZKst9v;0A@|hUaujvf25aWc?+U?fZsD{C|`ZzaPWvRFBRsv!)Je>T}qnjOAOa!%{3v!5~ zFS@?-N~thc(Ui??Hi%2apiW0IGA-6YvC|s1WO+Edf}QDr5?fJBgG3|^66p+rPy}n6 zHndk9AVdQ0eLqU=o(fDsva%_}#S>&Xsd{3h*d3AF*AL3bfmWz=7)0Ew6K@_soJ}0j zE@gOz)F$dsz)B~i7eXzyirUeqBSSw`XNXLmAugKBDc*)+5?z_@o*a2JOlxk~*elD*J61)GE@+0$C}>;C42nwVIAa;Za{mZ)MI zk(L6v` zH5i6LCy-ctp*C$+D@cj*NGggS05T1LfEV2!a#kPzwx8V0bcaY!A4*`N#W|gVbbtHAY!X6>lR4)%bdeia!QnbccnjCq9=$VtZvR0_23~TQWOsesY6;cldU>Vl4hi7T2h^& z;VhxBY1_uMU+(!!U66nz5fBP!u7FN0;X|uiTzV(%XgHiJbnc>;WMPKJM2j8RKt3rn zT_SKv$A~;;tHBU9LLIsWeiBBW!$>2YeG|qw&cgd@o1skYs66%J5L%N_Zzgk}t8@*LWZBW*$+t)-&UCaEbXut9DY$~#)?VRVh$8%rx#-LWR+a={AVm=h}m(K!J$W+28ztoRJvSOFQs?|t{r zZx(evHM??=P_x512T_nXa@@ET$FW_Vr110A!NBconw=WU_#IF9WatdzXcx^G<81f zMx(vH$7nfou}j;)fPSf*?ZFU|$P#EYmOgocNM47w5lO2=3_TTEvUpHA(4BS}MojD9 zWM85BMO0C7w$r7uJjjP;*GiD59F;O)v@VtusI6QmPBHx%^|l&p3zPW z&tNzfQV?=rA~O22w6F+2lUKp@JlcwgtQkX;)D|e_g33na2t!kwh)5a{eGa>Dp_Ma@ zN_vHwrf8ey;2}e`eE?-nBQOi*5!ym-4^l|>%Xyx>5J-f^A&9u$xg4m}-1nhh%1n#D zo+L!j7_h7-x+q`7-6&diNN%XXUs@+5$97X@?EdL_(0H@?jEw}8RY58$tSnV&N+`+& zx_!}fTZQtVl!+{fmGvP`V(U^nO$#)dzA*XnAa9V2a-|G8#U+^lHM=VA2qLaD$B|M} zg-0bi>Jw2{J2g2ZnM<2$S9sIOXQ(hCCn4;07UZ2kIOmb^4BIdOB5P1&=IK5VvSjU# zb-y=U;e_-c3OM4qi#OGP1NX212+v+tqKHlgC^CHX@BjGdbATls834&3kmz@mzX6sA zW<&%$Myocgna>>qQ}KzUl8?$*VnVH(Soerk4jMt6(CH9N=Gg^H`fttyg-Atr36T>I z)L0`08L53er>#L$BQiLh?upwZv|p%PLJ|;i#R++)Z?sn$82dS5^bZ~8Mu-%tQ3jb% z6WmjUT}<5ss^x@c>CmyCg;K2%{hX4tK?t-YM&OzVhCqsD3l*W39*ym*oH0skG}ER& zi7afK+CNP@Nl38|n)Wb=F~a+_T|Bw(TSS$pAg~x<(XKraxhDz7M@s{RH02c7gBKeQ5vog-Yd(>r)=dXR#6g4s7Xi%ln{fp?(hV$ zT_W36u{Ec2jJA!Ao-22FG;1cSt#H-!Fj+Oq3h7UM9y!8u(V`CNMaTu&=M7-@uu%RQ zlcv3$K-7p~(ZE9nlbg#aXU)d95;ocK0H}#;2D@k&f6nJf1`lTI<$_6 zb2wd}Bm&j9VLD6WNXull6o)%rm5)4+K&nt-X4+1b31a2T8DNs1K0j0x0yS z)gc;o!?t5w&M4?hn$4ukTz|+La$N*SZ|mF{(56np7(F$FmY^6kHALt<9bx2s2};gT za7k4rE1i=-Es#jw43OEA1cAyw$o_GX^&3*Q|&wfF_U#AR^>qn=XzgE$#ROYypr44_tU6;(^Pu4qU(`0E+N~ z-})n)0eH$YnO~12ogHzGKD)xG+!KRxfmA$pA|jOY#9$9YFK#11(hxlHGZ58|gsBdz z;jl}TNzzo(pHiN(nbIUvgV3DGO&KY`-a?6ULc30E$K(()Sycqvq=bp2Nh|~B4z&lL zwl%7QO29;Q2W4{PTuM2R*i}}s!IBl|(r&^0;9n{eTr6G<`eDek+)&X`>l0LjQox2Xm#+gXI%AVRA%3Au)*tBLHqo9Jb z*;}FN`?S6_=877wl#FGJ4hpHok_zoqQIJxyWVA&r0Z9xQ))1mI)P@DM0HaLa2rSA8O@-4Q8du#4 z$)GLUj`&6NEw_WzJcx30k^&cLOLv?I-D+Ls^cwBYii(f&UVb71rS`PNRe9qjUiuea zY^W{a8CtT57=>Vj0Qevi0{m)W(Bm*FghkOAqQi7T1o_221wCzU?QZ99m#etCm6#Dd zB%SbpfhkTny$hWflA@&84=0J+tGh?8E^;j!lvPWPHl2K$(0(k@jcSP0>O}tKa)9J~ z_bf<~R2L^nG<9J?rZZ3%%I+XQdJUmi;6$EuB}$M3iIgT(91)j3&7xOOA(WzoD=h>@ z!=16&wSWGa#F4I@pM3RMFU-^Xe%rH2#2|%(lR8#e@z6E=(8m!;@M`9T7ZqOm$hZF3 zW&keSJ99UUy5Po&rf1;Bz{R$Ff9LS0-Wuz@FmvwCJ74d${jQ$gfssG5j*y6Bw^{u-Kttvxw}n{-9yHAp|whAyFebar?~+Yuh>7*g~ArD?tmAVT9(f zgA@jpD_j*nQc@-;x0sTLTJm!tGJ zhY%uFJzWbL^>{6B3^NhgBvu4wDsd4UVGP3 zquEnSpScrH*Nnq32uwY3c`a+;il*B|DkW`0aWO;{$Yn*fVk%>um+6P_R(5nxs@Wa7 zq9+PdNM1z9P$taiY$GZ;C{Nw1RVu19o<(+wj@C&(Pm82LTuq#^9W($hp@4i9Yuw`s zu80XzD^GIaMq86hBV1FIZrZiYB8>hJOx6@(Q1Crq27`fhA&#NI7vRD&ac_))I|G=r z7F%QmDUEYyiOq3Sf24~w!aAR6dIM)&>`R? zFPYIkbWoE}*JhyFvI-KC&18@SI-RqRhZGSVBN`an_{MO=TqiJmh$B?ui0T~eKmh!r zW;v@o(+FvV8h+6|#VPX;Lb??^cF4}&8LcFA)l636$@%BbHMLz^aA@2SQ(M#^)S=f1 zM1)YSX`3E&rv}7WY_RP`z&7Cw#S@2UYUbQ#)M@_VlSZf2gYM#iq%YtM{3?EB z%Hlj~v=LgopBT+=V-a!4pea~F9RAcm33a&y1#+vDR#(pp7DE_qP#)45swJFvjnG6S z3RBQ^(JsZSJ5^+C#^$2K$@iO=230Y|mJ1KsOf;b_J>#?n^g~nU89KxhI?T~h6*aJ@ z^~pmoV`3n(kcYO3MjtEqlt+bB%NQB%i!1lg8mGygS{PZHn_w3MplF#N+apm)OGV^5 zCQ`i$NQ)%^*-K6iUIM9=kcG4-&uE6?`1Ypvm-R`2s(h={BNqT;PK?aLs=U73;7Q*o zZ!?2YLROykG;Go#>OS!I{>`R2Ma#O620B&C-cO*b4&Ml5T47Ps|3~6E9#p8wLCJ+% zl#9-irSsjr78iD2f6`{an_ZNfm($=b2{a}L$56+Zj3#y-dY+ulL6g&Kdg*G3AjwBG z&|FaD+CpInJ)&e-1zrDq<1l1`)Q}A{C~*?z%vmB(M_f-yJ`R{-B&EhA=Sh*QgnTU>9)}IhD0-o zh?L=5MeTVI4Ix>}6K!}=DWrvPiIZQw5h8G?s<_l?9cV==$;!=)h}5hmM`IdkT7U>0 ztttkis5Tif7sAcPw06Z1Xe9+YWO2|$nyMS@-HxNYrI@74`nE|%?Ls5su2di-S6DoD zJR(3PB4ZJwcGQF8nVHnyA%-#+A2mhn8!(vL=f?5wn zK05WLt;h~i90DbD3go3~P2b6Y;6}PqwnLqK**NOZJT@RVS+F4Pa;>ltVoP6paBji5 zA?A%{(FXHRq%dLn^vw*1W`zs11Zarh>Qu-Tf;GoBE4SZ3o1PdEQz$(1#0SjT`s$9z z2jVR16;q%GD~`~WqK8_km%+~T=*e_Kz!gpWIbu%zkx$qt(x{2P)^CCnwQ)mW9fVnTFfl5$rVD#lZr z=&Yl-(~^>2UYqV;VAAzo_J8D!id&sQ?sIPb0T4WRPn?KHGe8Ys#6cbqL41W(@*F2` zuuQi#T%hu(|ceE(kRePrUjh-9-@*!W)!E)IcMP|hGq&i}7 zcXZAohK$tq9Y}^zYJ7wxA19E-$no&VTjeF$3WWkExm+YUXB)0vZu2_B5%j1mGLV9z zfE{965v-?e-l{6i&~%)mG!i7W3_i+bcpDkBts z+SV7zG@X`>O1`~JGCkEGh;R2UA5=bj)Rl5*qiWfk<`hXZW1>;?iM&)vifYw}pnk}e z8I~S7<}jfi`%B$6ji8&E;Bp`r0Ks#{*gDK%Q83M#o$*M75ITsb38ijVS-BesOPrEj zjc+oqx+)r4&o%u%85<{1U!igwrK364;=&abgNO^-Tq=<^#zJPvWk{43hlnI<04hZn{+<62-+f zzbk+-DnxRJZUBFJAgO?8MP%T5K?imKL>IxG8JIHg>ZWhg;N4sVYgT}cR|i(W(xP7O zt5*Qc9x;qOA?3gqCVn|UP_Mfr)Z{BTU=3vl zZaR9S8kBKOfRPbbbc+FWk4lK**-K4b#vnYdXnTZ?=x(_?Dx|Qr|GCR}6jE+p^OWqZw3ug&QPbWscm=Ix2 zLNbvFA!$rOG=NTdt~QYmWq2m8-I;oXUazGo_Xcy+P`xdFzQBk^N|C4uQPn{a=(q%x zN~v(157G3vpotbPQhhoB@F<1yX`bmX7kjWlsleo|OsYGv7(b%RGfj&!2tOuQmDT+a zlq1uYGYDHG(lIo(o(dYa#xY5>UM}09Oy$7#QjZ1*$xy0#h}vQehC@MMzK=-6dBjBi zChC^lN{-Nh995UdCk{2VL%g)4)QL7oFIpztql7Cczl91@N^hizg!TnEW(=u>WN44J zI1x>yuxK>*T8y=_>Pvplt)&V2MLW23kuJ0bKcqae*9;U)lg@@j*haIIsci2;UIctt(nPzdCP+pIy5c|efw zDFLr#f`Rn-IJnoJfgy-Km5L5*@%8CJfXat04B`~ zlNb>r%i+U5XJ9%+Fe%q07_GL1)7ep*C!I%e?qi~(Su}$QBVLlDEz&6i`v}>^a|w6m z6?AMmCDZ`m$Yq2pnV6}GCV8`5elC`2R$VQ(@~^(KpnBXSr{;~AcnrsUE$OUWSTK_ zu}!~*{Pd9M!?#W~Sm4rv?hBj>DhK+RTp|!QFV|7cT@%e5_UoGwFKpQsmU=$2ib9kD zo3?SO>J&=}5glREB`Py#}OCs8mo}!dO-E1Ijs!3o05%ElIpmYNt9sm=HB>0e$`bI2`74;;Fh&F-oTl8rr7JA?&>n5`JUB8^H1>3k_<)Nj;&vTGbL{_-%`9!Oe5T|u; z)S^SBmHrM*|AbUbBooHRQ zhft0Md3HZ%SPnf1BF9wUFE1_{@BZ%nnI4#vzIZFB*R6!;v0P#d2 zT24vDEcYcbcu5MOJ^~T9*2=$857H-Ma-GAxp$*#qC|sIBI+Zc2getB_ne>U^M{JG>#!_R-33YgUM{5mM%ycQ}XNE1;*!Kk}go43>qL_9Z8d?!pK#?8% z9h3kV0a7SI+?5F9_BCGWMzhzh79lEl+%Racy)|&l>gKCelsDmN47az z7_88*VW)N;!9=8(!;GLv8YZf1SG|?HEs!*G)FQP=B(9UyRjT7vJaQ#Zxr2PhQbM*Z zYdCipL#{m=!^FvEU8E>071;xAX^Y_x?BGy1RgkQ_rjKHc)Dprvt*{~*{gW6`Un@*` zMHi0Ztb#^;8ZKqEC~R=7>Fbf7F$n5tsFkqGwIv)SM&AXBH*_cug@p7_Re6?kk*A@V zxJGgN-eHa*VBvWb=ftNd*6wT5Jsr~pd~^5JjaSyZIx`(+1#{siY&wuf@1>ph%s~cV z2JHFbcm4bPzJQkq)}WAg+XR{cd>PnI>xj9pMr76?rvssMdhlfOhZAT%9VQKtH?1{N z_%YK9i@}(jXlHE7y=W5aKBu?_30W+0M3iChrK+Z01W)n+8!p+lb0V!wpiM4}XvE7P zg%WCFN*yccCb7UopD^1AjIeM^%wd+1Lq}>GjkfLeZR?(dIze`j3xoL)t&yoQcyLB`J7(kbp6E{gXxnqpZ(E-!W8MU?WMNUr9nAvR>PZ#8-E%HPJI&9$5 zQCTSxvA|r4q92q1s>A@NxYZ~)sbp8PcH1vOX=z2Qbiqtpq^MZ-2c@aX`rDDGcIOpc z@CU_IyAv3xDYG>ZG~sTW-9VCrq^U$7Nly>f-dJ6Dl|V}?AQu}kQVfFrD62Y4rz7Q2 zIwxTRtntBLUCYSV{7!T6CYAr(!XQ zCB)i6(~4ZersVfHad`6m8X%_w2{>`NNMwmugZsjporJY-=I3oZs_D2vFrkbwO3%R? zBIJubM8qDi6!86nych@e4OqSzu;ZnzT?`k>j*2kw3gMKzBT*yNmbft5Z3JZv;`r`} z%NVZ$!9}eQb=_l|uA^lPj!v83zQh6h)rHYbfe@aV)FKb7n1mk;IZ9bpj~TS0{J8Rs zS}v)n&KRVH2d6eQJ;Cvs^Y|iXwBQ*W_FcOmF2Ee747QxOUls83SZ`9D#^9UyBT55E zu>>2aMjME~z{VTYD=sbO_bl99C3AslPzzNcbdQWKX2$5d184r%GoP2hHz!5`HrVu} zftvjG9bM1K6Np2$-bp~nd9TtKTo8OTg-A?6C5(p-Q-VrrEvHWl z_}MZ_Hd8+B(`$4PGfJoF+bi{hjIt!et3TpNH*MzPS}i8ScN2Q5(WtEDVGD04B@-xc z=H+Bk8;SRkO<7oo_=p2JNSCl!TO<;0Z80LLX|pEssBak}BC9*ch=Oq--Neq~hF+k^ zO$w5+CPTHlbDpXRjH(7Do>s;0ypC1DZ*Go$o*)1CRpU^=IH^aRT2zARgrt$@w@#&> z6#A@O6;9GIO!5p6pokk(sLfSMI<$@FE-_WJ{V1_uzCwWAsL(%#3d0YIiB)=;J|m}*Ef z$9JMr`m}R4*A@T{TRZ45){M|)Z|<3)hpKT-EI1%0V@+fSJZ|^-fdfxmFh&0M6ujX< zb=2J31kEA{Q;3KXYIkuJ0kp5JE6r$}-aLm-lYvnEMNIdBXmqJ*4KXm+$u20;UDD^J z7@d@sRELBPD-KMB%+&W709F7~t<%taLQg;P7nTB>;2rx`n0H^V*%Jgnt=JYJjv|0Z zJlEdY0H*9v7knx>su0h|J-V(oVO69a2~xhnl#Y+O1mfuZtU)EgrU6pWBC>XjgBg@C zL+{XcQJvM|5p#{Fh+(C5T=Aj*9uFu|Ca@+zceN#nHn83XtU|+0o7@h<03iDcDVDn$ z&M`F$!Pi80cG01igvhpc}H1zU?vkzgRKmY)HEOHt47cxcp8;q(BnRp8^d|? z5V&#lbf3IuYRE!o7%fwviNuDxO0vTx#hE%aCCH^g8PZkeCICmy#kg*eXIXIJQo;PN8y?LTqgcC`r|TX4{~92!=2!q}oDMy5i8dEFTAJgIx!C z2nUQsx;vN`Ee4S_P_W?GrjBpQ;qltE-ip`*py=uNgeNnv-8I7Z{@s7Q85$VnR-5h) z^%@AJyF-^d_&g9$08}9Wv_|EZFhqk)7=q?msS!yAaX=&AgP#KrX_-Q$^?X!~$wz{_ z$^m{lX?zldNSfSWfrptvGRtR{Fs$DLJ+MsBcwoxKs6Me-;{V&94t$eqDvZ@ z=3|qtn#c%+pIp0xJ05;%d^OB?FPaMQCU?Ie(PNteo$_+>QvyH^(4&vpp$Wi8{t#e+ zjd|X<25eX?Y^zYd^F`~_bc^p9U|0D^glx(pRZ0<-UqmRx#d-rU!j)s~L7jqCLg=C{ zv=e$Rxg@9jC33`(;L+qGk-CCC9RgNEnk`B1(=>$P&i%GtsT{6%H2ttuoIpz6pw@u6 z%k^~9XbCA&aQm5byu!3|r08dF7r(c<<6-1d$&*S$t9gP!8MYPl>JVDUot_Jr7wQ(Nd=i5p(-BV93oE?S(Cd1KV5YMY!OEdfH37miF_xo&ABbK2?D$7L5rxJgl-gr95(>c)L@Xs zCI#1Fsj=?bWB0l86Q87mROvKDoo8ThNFglLp%i#f&tMNX3K2Z`vK>+v$OAhlkCh=G zOd(v+SPwptB2LjnM+`h0NcPIMhmDj@?+R_BaUCZ$Q7gt$sHX&TEg+t7W&u&GSe}#ONLCNmTHn{i&L z*xD1rn#}2mHVDz!wB-zK!lc};q!i57f?2QVft^z8k31kEhP+KFaY|b^*Z(95BeqGV zJ4?ub_Q-}N+a}Rn#FEQE#H~r`j)4%;2z)8JNXs7oikLHZ+K6<;$+jFw1nPi3!|Che z3-~85566|*{8s!2LQ&>xYp(l6kD^YIoOfMGhGsY{F|qVP_?FL?E~5lPbiGQEX*tZ3 z#QB9?21-*xPCE}^Jfv1gN5oSv88*2o|F)je2X35@pOm6Mr6*`i%NakCOT(qQgr(Tk zIr-HH<6)9G3%`-4?VRnBl`hF6Cy1-mLDF`}+S6^5fobpWB@h9RFh<&wy!DJ3(Xxmg zq6j#ZJ`Z03%}?`yPaYmkkJGh+k7sdH(=DBv&?Xn-CN4A6ZdqQUCx_e$ZsA3gD?2^qjay{oSHJmCiQ<#3c!uuixX zEa~4smm*UL3&kbQ+_%z*Sj3sdgybkokqXvoU}=t$rlE69z{Hjoo%D0#IfGo77AdDha zrNGJ$qYGBz6o{3-VLQSXSf=AOuUmMuh|=XfY<|oZS1ZflDMA>bDlFUqXKv-8DfulT z#v~IWL~p17cVHwH*KOC&lO_-76gvELs%eW+p{5G5mZHs#R#9i%X%Sf z%9tOadWROMcjnS*lWAIV(sgUJwc2zj(by$)P(d?9Q8(p0Q|sxc#=f=8b!2p#*L9)7 zuU-%-49yphDakmU3KxmFUI)o1}TTrtfYGjXGfy#oi-xnK24k6 zZZk7Bo09vmahh_u2qAY4k;t4$1)FTd{+uDSVlt6u$he5y3ik)s2k<$5$p<$F&y5q6 zhvHN%ICAj9_is*!^A`XGNZ~RymujR716&ND2f0jST7@9`ppiMQsssy@6O}6NPV(;{ zl9K*ZOr8uyFSHC3>-tHGgO;?lqmdBtm9%PASicRRS3n8WX2W4ZKOWYa4I!rB(8MX%!7+NUlnVG#dmrsF=JV=00BD zt)RFsAt6ugwL#Tnstmsx$#JojvAp9tqh5D%L@sT@iT{jq}^@B*7{|3NuVv)qqC4 zTF*7J&C#)|-pV7SOWHttRPzyk=!jZ`l%s8)X{73>X`=SH#)??ph>wC+f@Ja)D5N>? zvbfqMKuq=jy_R9&z-k^dUN!WfTFj3W^??8k8f_o zdD3z0t{y%7@y+p@KD9Y{{l_*ZuZx9b{M~wOwEa@PDuJXpWde+vAh)~7RRZiyvBLzd zJ4t}OkkhUeKz&uGg#3*#R}awaN@PL`KNnQSt)u~$l^MhK<10MTw%STFTP@HZNv-xM zQ=ZjdPvMXxEy#6iJG2xXO-wP}IFgijv{F3~)(F+`TwILfgla#o=AJxDNoFi&#K~Vc zG$#cJ!UzEl=>Xvh`8ghc8DS0*0VxG7`S~|e#2`28R$x$H-jH`2DBgZ0$cB9liCf}@ zL&P;z*qsT7ro~WS!zN57$x22(?aE|%X84}#k;nvvhy(T82U4WvBEWWNR+OPZ)3XyM z#~PJyCr5w{5~mt*r8)ifsNb%%aXg>=^xG&cYM_76mune1qvw*V^3$HJ={Q%tcslOb zxnR({!AyJBFZ6&kJrIL$gaOjl>&f_?14@G_-ksLB>3D2dGXrY`iM&t=AoZXKh~t(V zEiAwtP=*}pn#03DYKQnJr)Qhq4a#HzAjcnx3e<>#uSJ+&%Aik5+v z-Uk3JHt}x8)*YawfAsdxZf?BtBb$RqKDoIOcOb3>KwSsK9*Upi4e+`Na0N^acfyg1 z&mV>#1MEc#S0_$>C0jQSB3{gE_1 zv@`5&Lr=*|{FJ6d)dqC7D{OK>y1=Sn_dqVN0gUoORsP5+0M&80gnu)*UkBRgB<1N4 zJ9oJY$L`#_04C3qOq=N-o%N0UG*Di;z`9O`$+zp^20UQoO$ctXI5roK?y9w2xd8;~ z3yzq4ihGY(wM1x%5G`?70#CC!VjcWq=IMxmJFWu9kcnT<#A$V{%FntW7&i8!Hqw?wSkai@V7&ioQ#I@~m=t3*eSKkG#a zcWM`nsa+A$mEbw^1Pn~|=cg_)LLHutVK6cmRXxris%t(hm{XDFU=X24Y{GEim8%Pn znT$D+uuAY*DI*7%+*OKCS_M-;H1f}U0UITuw%Z~1tRk~CO2rCD4?fyZ715IXtvMRV z4Kgyc(@6ayV$UmMp?y5KxbBHDUm-+yz-4C}2jyJn&{(@FQABFWq6j2e1xSHop3sp( zNz6Z?Cd$vLFnn?)!{&*phtPrQ6XtT7nA9htX<_KFqYkX{TUPQW0gDQ`gg0g<#CFBC z=(g|(G9Zi)s_pOT#3)V<7Qe9M_@y7(9KQU+n`r6LWIs}EpApCZW1MtRW2KZIG|pE=STXud zOQs~K0_L~{Ci-Y_uqnR23dDdg9sv>QL72L*;A^Zs*B1VYD+_?lybgtGZ*CxA!Nwh5 zS)d*E_WUV3P6K8bHD7D-&R07e=vd;iZ1xK@sjzJ&)-h1$1Cbf`74m!c%sw+InubRn z12(3kGRoir)hUkdU==8*Dn|&c35xjaD0*BNJ5NJi=d{Gt5>CqG-7654G01T}YHbi>>=@$IZ1i8>fn*~6G zAP8*{(k^8Zl#G!j?l4+>q1@RcCUrp4QceVCsDaSn8GUPHyW)h{TxhyPIK(Gpk>=c*i6Xo1KLg5f1ArvUkC?T-$kZKvlbCJWe^~9)jPb@l5Nvfck z41zdC>AFJF8E~E(HNxms!W;mwkrM!o8h>6j8k-EhE32waW%_{p3h4uSY>!Af9oSio zO9CFHy-E+KD3zCNjM2Ja;gs{#NGnDiQR+PXQVO8P$Z0Ic(76(E`p@Pf;>JjEVg)O< zoGR@*Y02!6uN{8_wK4JDkPCO`)>}TaISBYUc;hEG`)~f#W|gJpoU*q7)D%L<9h?=wjNz%Db^m{vNF{6!-^?#AS8x z%@?P3K)FJpii3yZAQ8b(eCnE?Wv3ui7|K|q;)4}N5n83EHL_`4A8Fb-@)r0uJ&GIN z&xw`(D**Vb%@bWoBBkVn%DGq?{euv4SNfzJCY1AXC*{#G>tWY&_a^WuH+>@FZM!@_ zXaH4r>j-sx(zOw<^l!Y<4Lkus7n=vsC6&QI`EAKnhDW*u+92e%D6?L`M3}d_ z0T|40`b0pHU(%RkoMA5c8fs9eeW#pM>^=tG4ZJ+cBgwNN-wdFTTYSFU%9HQ0twEqA zZ6Z|giFg4}UWK6{U98+4ECgBsKk2wJwvJ*hl^Boi&;l0#!~yOI8Gddh63a2eXwzxL zZ|CLBQI}z45K$X2P(<`4h#&~q?#JSCW!R+UO4lbucINjhon?`zu`!o&+f!Hj8XY)4 zSLmcZ4mzV4>3B|cG>&YW5~QRww1rT}N!y`Lk*1Nys5SkhW3eX>L2arLE&yQmB_+Qp z8FL7xZF68vi<)sFaw+${DdcYm(o4<433J5qb95=R1RID$BNYp7DxTm3$2_;YulP?2 z6vKc@BcvYbP)q-$IiCbxQk<#IJeC)>|Bb|GQQIDt`1YIQm?*rYqu5nDe#hrF`*AdM zHQ?q(z|i&ZjIIaNGzbcaI(gm4HivQ9`}DQ3{eJUh@kJn@X8?z0U%U8Q(Mtf&Ie?%% z7DAq(i19-wW6zPoSyLjS)fs_3w#Rx~hzOzB;cHMUASjMJ*+q?v8F(Vx`8eNpmMla< ze9(dg{~G|7bfZ z!}s@)A5vm)N)|X-A`zs+0}`q*T?364d~(eI=g9X93e$2QBRySKgQ58*5`eG(a6kv( z0-R|8;!CmM1uhndK)jqD($osNoKv4jIX`)dNb@_M7>&SFo4Tl!J_~i+a$6BQS6&Y= z!!W=cl`;T^(32n_h)mxerbD2JurY=So^S)8d85MG?8bKyx&vEY9$ zT@@OtlD~B}8aYytbBQ=-9}`opBI02ZVkd)HBLE=pTNqJa?lF9ta&( zo~J{sM__QCd}PW&Kp{oXmmkIhWeA%)6{u5fia>zV zPN5Sy)Sx%gs5w}SoKUzA$Koc^;inb~QgcBabPJ(<@te>OvTLIK>;Ni7HC2nM`O<7e z7`7`Gz5l#-<1RY9=>a4(kx)-4*TR^Q0VCv3)cFglUX|->lg?WRKvBNp+7M_>tbvjj zx~;>8T*IO~3c@b+SQl*3gh!Ai4h0^84BCI@iEkqVLZ};T%2g4Ngg@kpbFV;(QBw(( zudo!rdV)PE)tX*ZF0C*Oc0gWNg)|fX$Tzq|zT`m&3Df4C>Nh%~LBe#7>h8oeV_j{x ze%z@O9sOt=)>Nh-oguwdu!xv9XKR~EK+0_=d>^khc%%nL+$+r%}j0KUdg%cvAWVYkWkC$t7VOc+01Z8O09sK#U8Od{^JpP7 zP>_(akV@?e=}<$4+IZuN`nrYDU+&zo^wOcCjN81}aKG9oz-5fg0d-58h@vrbQa#Xt zQW(_0GVVIGX=pNK{LB}EELCBGl1n40r8XCHG#6ErlPn9M!4AaLRa7HeP0ZoN#sCAR zQK`u9J_Mz@EsQ=7_-RZ9+R++tauYqG{a6OdIXv5;LB9}}pN=ELD_UqWc@@GGt@GTBNBV2GQ<&x2Hy22(?6x2@2 zOUQI4@$?L9Z>=O?1NQcII6XJxx&f$i8mMy=*9{J1&+GcDe=UxWKE2tGJ9USv-`ecI z;S-x{ul(rd#>+pl*?(CaAq8^X4CFeDqa@!#y2V)%Zze6d*>LMMVMX2@i{seZWA_ed z8lHOFr(<__ga`=Tt-n$nEaFIrbD^9Bv*^ zI)5r~lL)QTj%d|^8(cgX4r9Lb4UZ~cr)muYJcQyJ1!Y9E_^pX_>1d$jJ;U#73)cBdL9hL|O@J<=s{ZPwPLvZwT*6#< zIbrZu7Q7q9SL3*4u=W}^evkf8yC%n;+^WG+N6aKKi=S8Zrkzd~IOlD-urk^NjNT6R z2A#tOVLb?;8-wA-vWrm|Q<#MAp}?LK<-P<1KJ%Gu$^#o(5`R|8qs06HWg2i>tV;QN zxbBgXLN*lSe4-WKYx=8PC=n@hQN0ilDu^T%7L0DEnxaxq!{pJC4wZW+>9>)Vox0Bk zSHvNVypRDX`MYmrhRdCxsD>D58ZYXDVgM911q>|u0DIdmn;z?UVIahiyR$&aIf_Aq zl_TUCbReW78WgV@O!;jgZ!zqar$q=#K@{aGTnkVD6B^gXn!n07E|lm<4Cz_U*fq`% z+S21jGZ>W!hIWty57MKg^Z+)g+LnS0KkP>-sw6b=sq5Ys5tPOOYv@T)>4{L7o=PbN6R(#+9kUsd z8Ak(&Ghfd$l}7f^U&^7B)Kyc72i=sCD?D6a-2+D{MGn)Fc!3qOjkv7^BIx~%>#ATx z?n60$=_40n(4RYmF*$gkVM3WiYqsL=6EV4|Nh(EbP@s0kbPR{lC>xiHzSDytq__hc z7a8)JE@TRWaB@Z%Q}@?4-v|J3b^A0h;0SaGusM0_XEz4{O$Xur?8o1YfTSC*|M+G< z{(!2(fT@Gn^Sc#$e>hLKqYl@_S76ox%)0%?aHmGJ0;vX|Dn4Wuub73gZ!XC<-->se zfSFqXkayk``+5;S{N;ChkMF4fNbrh$@hU^thOQw+1?juG@`C2vqoGxR}#OV>q*bP$gr=y{l)RG&yRf;etFC+2J7{xIjn0}DN4`NTJ zHG&=n2t#y{$PUm!No+Hq#xoEgED~9k%EG zlj*)5v^5nZwc?*GbmECLV7pO@RA;Y3Iu-aCmXYvp`&sL>5tvPf|I^rD=6i|B| zI%Xr$pi5(a>chKL_BFQayrcXMT1@XiILgkfsJQsyjn;w!9aAqKxDazbl83H3t2%mt z&_p>}cMIfv%@9Tl{gfeIb3vSqXX}zUZBWQr%DP;)n}kowKC`-4IAL7D4b1NCu>PQn zn|y&!H{XL2wb*Gf>6*k}JC9!HsYDQ56g#q`}$Xa;WhQ{f#T#94(tm3P2Fq&1iGrniyu(?PgVL&G1-+75n{XIr&k)o8eJ#7ywU zyWbW}9foG;cQ`qBnHoEw4m!tB(R0ecC0!?sxpSpH9cWt%>M*CMN4(ACe9tSef>e5> zm4X{ela{FD>Wz-_V@?#D7akP~xv+D&E9+@M*+JH{xu@0W$zTjkxGuIa#0bF)AY#l; zIYU@xENeMXggOtq*kvje$`s;Y-?7sP6g=IJl-b<_Nh-w8!Ca#ggyhj_g*2Z|nB4p;OzEMqe9P}X3!(>xbNt8Gee~3TpiIQeJ~utp<&J%Lh=?J zR+y(HU7}fx5PgCn)D(LB4O^g)6iU#ZC1Y(y8m?C&E~)-D0@8B=g=sAZ3Sj|48s+v4 zOu&KC3bre$uc_=5?U6IIk+nwoJZK_;oZq&vI-3M7=V2$MwCI!9rRz#*t zZjVgsyjv4>fFW9=RTa~hgKbS+Hir6YFuDRB!BK6_yH+t|T5z64tAw8Vh=hzz`rDhF z&_S7^j%MYAlRQz$HYn)wiqT?=NPu3^+>@kj>?emd#UQs6ZH1)2UHvhlGOL6*Gr$5+ zgy}zdZJagnGEqR$VL%d4bV&RypWPe=B%NIR;^vqedQs*mAm%v!4&vPDBb zD|}(BF=7vKxEYDv zaX_6rhfjt#)dN024B?6fW?;>5HxS51S8P(w7|V+N#g0ch8=eHU80*SYFMJ|FM^L#4 zBisx8lh}+jX@(=T2AkB=nZL~_8owLW)WxOBLkII2DgtS9QJ?e1e#B6~- zq!W^!*Wy~MRC9gR!BDLVk%Sjke;wSG$#Bn0i`5*VC($~ul=04%s8bU`=1)5r-Y&wx z!XiRe@>pa-Oe5*d%%ux1?cg z5j$~e12RxRTwlb?0&|)oNn#@|Ml1`ptPn^E`J`FV<1Nas!3kfw3sWyTITg))eyXy{omjCuQ}VDOMVyDX|u!(sFBe!6N4Tm ziij~1O5_PzX|H8yKYvaLvK@`1Bz+DU&`b^DPUZ9P#FPkOhR@Lh?NOKBs6Mq%iJU9O z$P{?W1uTjc3q}5VE&JF)sx|*<>{#85lN+|po(!0HDz>w3hVf^I?k2DjUJc$&!c2sb zw*SUYZ4Tb{xy{wsAG;CnB^|vjASmDnxZxe9TLCerVbb|#&`o@dfSKVm@aSoG0J3Nq zu)+Kvzc}^-!-u-{rbrJz>LhwT32-~c&jDZpTW&rQZ$UjTe5vQg>x-ZTfU^K>+@A|b z`5H6_Eo(vM76(n-(CCQ~xf8Svr$J~B+R(4p(uE#D$Xge1U}X#sa1VD3U#Bn`+yRAj zm?F+rUtZ>;_yb51{vrnCh+V8W%-@b9Ptpk8kfUPzT?+J)1a&-Gb4ykoaw*S>Z;lpV z=PJ|~cr4(XLEfmkgf+-deX|1xCas8c#B_E*sCK#pKCN_r@Q`+>%$xZv|FF8u2bZZ~ z0n&%3Zy|u8tB5;=9x@;X$1`fkb1pJTNu>||ocRS|CYekb_b;&nl%{UJ{2|o9Gd~Aa zZ5JcyM^?Gg^!V5_t&VCK4G)l}mxty}Dx*b8^TRwdi{Vw8C^v z#6zmr%pWK$A{0J?Wa5QQ5X&$fcF=%L?Y)nzZE^FA9?&GS44q^CZii~iIcnXTLt1TuF^5G@dhQ_umXYGd zmX0`O$Y###FL@w^6+lje*a)V_mIFdzx66q5!x6dKqjOOJ`lV#lZUL5owU^8pjiZ>8 zM|pIEP?yJ}R?0A4Wn6?#WCrYHaJn@|%d#UUiR%g_-nPyYTN}q>%F;S?YDA#VYle)9 zzBImJmkB{C?;+rue8-)**l;`k?!NoC;~NZt8tjg}>$f*oUho02Y5(n?-#iiDXSf>p zb0c=jZiMB(8hCJ>_huK!!r!LII<8zfej<|F&6M!AwjdN7fvqGub+Q_KP3Mj|0Ne7{ zM(N9aPmBrm$%fDFhv-GMm9cFwbxq+3|5jm4^Egr&13f^7v)uXVeqCO61`_lV&Lf%H zvO{t_W24KVB2JIW7~!q3$Sd%vD~HMt%eg~_DFq*NZ}o?$UvSr)GZ1D;ZI&B^pbcga z)07ev*f8%iV-#v0)aY%68^w-ZAxZ-_D(H@qLf>GR*d;jorZ7YTU=`96u2jL77bSKX z4k^_|`Awv2?}_ZPb4&!L5{E(L5|VCPewTo!)&rcLxl0O2>m#8HdSJpCB0yD`c|0NY6b+syz)zzJYG381nA(w+jGtV{q0U7i7wnfThAT@4^pyWjJ2r zt@r@5uAvx^*6|A--f0)pSS~0)^usk?ucm~Ew2R1U`fUp@>!H$!NH4+C2$O;7a$geV$38a z2opg!>>TbrPv94-S0Ga4GjJ3>A%>V*t(Foqg(>7PNvZ7)%V`owaSDNMHbyUrH4&kv zGtdP?b!ErYX2N>uP%zD- zT?qFJo;7y3R!BmKQE$$VzalFDbQoQQs0jv@bbQWjV;*>ij4|Svf5PVRH1uN&(N93k z%SQoF&;$>)T!7o1$lXJpXc_83$TMQBwPnuc5Pk=pRCZdsiX)|z4s~@TBy^?C>W05M2L0un zA!I0UA>{dz+XNKxx*#Tjwg}yf_uEiRc?|_UsN)?3Q%KvPBR{!Eo=>%fbOR*y+eKhr zRiK}9w789KU|3Dq3Q=jjL@T$GCX(S1Ve3R*NhU_3Z@*n$^UHf&XgOt)6H#tYequ>R z84xlrvA9@P46)bjyy^X&fEEWq94@hQcp3oYy}kg5%i%d)3*-MpfX>zMs-B3Sws-17Z5|JE4|wf|hje2+(9)}l^y2`o0Z&S7|0r$N^WqWk^$yCpo3!YZc4W0Iws; zMEJG$eA%7DV_s%r_i&~U28_*g#E5moNM8}z@mMRGF4t^39Prg<-1hLUga=t(m>9Sa zI0LwRVR&9nFH%wOiMV_2y=Ip=1y=$P58nSnFL|h%&XHYwFRT`+m|(0G7MRc#9F26? zJ?w?Mh`u_5wen_PPmEb_3SN~UhC2pQ5$4w{*~iFYk18Niv+I%f`5Xv#qY7~*2MbHrVW zIXqB?rWm50W`5~{mVrQbQuFd3B?UqvE(KuWIbuRp^i2qi3-r-dg%Iuq)EQLO)y9R1?M?Usck#~IfF`bprplN$r$UwY`747naU2bXnHXSYe#fQI= ztxO(??mqQs6E!0)uEB*44Mx{>*gEnd&YuRqLDAh4jWE0W?Rb&bexdCFsG?M_$BYbe<)^{DNo@Ho2IQB%@ zuL6}J#R}s>@Y*f6?)=H6b9chQxfPgk8h=ND5!d5YC|;A=A3ndi92jyrE=fEVkT*OQ z1s}W|UdH3NUg6JN4Oi%TAk6hw#cRERZYQ`_Vg3)p9pn3a$I;JeAP%T?%;kwdtKl^K zt*0N2cLi_6)rza(OdUi&yf}Om*oXtiS7i621@62<*PWn+9ZBxY-;QU{ia58|0j%M6 zfZQCn&KrX9Ksaz;q~jAzd@_CD0~kBU;iVC|9ea~}Kk#NC9C7wHR{)qu#@&p8jn>$U zjI%61p2XfDZrKXl_vI?w*y63nU_31EhSP{dQL0*0C=|rxS5h>}WA0?{M%@kZopHxg zp0VP~?_1NN<`ZGlP+rp26r$Prd20MEFLJT}lds$m^Ayatef^zV-t@gFRsmf-Ujn5R zR?x2)&6%NSH1mcqZyM6G_E*xxjIEg*hcO=o0c13O=2M=DbguYq3Bnj(>ea8qjj3T1>&plrNV~34j01E3u z1&lA29Ahg8^u!7#gebp7Q7M2$dO!hE9&}Z0z($Ayz7|N66dnj6&~GIsWYLTtXC*?u z#-65TLNMeBEIWlzMJ)JIah4hbXd865S9cV8M$H z}Mkjf2%U>O5p5H?3$U+F@`Vinmrli)<&J3@z*^$zo(WQ}$s zYC<$arA_xfQV}q@A{p8#($I|)-HVAZ55)3g`(sNrcf7c#E0mwig%fz=v?)4yjEl00 zT>hG|Y9D$k%m!wmv-)Z6d*bxSttaM$NTxS-t`yuU9wgEUl^Hnk%9nJPW6d9A^h`|s zH}hSjx;npSk?O~FI#^}*a7J9qyTY=D%v|IWTVYqb+86Zu5Pyds2jsTiN%#(2CihZ# zSnCt6T*OC^INEwFjQr!V8~DfJO#N}V7mtM(@OU^cUk!-5vi`#6YB*TeV+W7&2jQR{ zhgm;~F#uUySU-&Sfe+$t-$5Lm30VPB`_GS`etIN!A0vJgU$Ef9`{COII{DJlh3f%H zhp`8FeCdmu!*Hj7E8MGF0gMG#z|+kDoI63GFtrOb-K4!JtwR^Pn}h%rh_xcJAOpnANDUy?3JB{-J_($4+Yp~?4odN>RE1dH;n?9bPi(K^w0aOWh7GTTvprx1k+aG| zyNJ7dM{KAC8b_gTA*L`Rm2mr+I07x_9a&dxD$_b4xW!CCV~JxT(RA0f`7Wsl#n&NR5| zW>5K6guoAM7R1JKv0!i&*uKLj1< zD!=N-{-A6{GxNtZq1un%l82JQPS;%*U>tP|+CVd44Vl~vYN9<=XV4=kd$XD+@8QP> z3F5+7h|BduYMVvTd^gUv!3YHtywH!c;5GiTbLbF|sXuc+8U>EECZd+sVGPka*ivC( zSss+phhJwxgFQec(!=O-zVcX&>h0S{NTkrr85~wfRLe^ijG%d6Jcx%xY|H(7hMuDg z`V+61+uo;y{F>;*ow`|u(fS3B8lvmb7zC}8=9HULjE$87_(a8=a1_E0|Fv?)p5%f> z7<}%bgK}IJ^mVB~x1;zwjK70Gu&d!fJrT~z6M=4zMcJ=j`oiY1xJL2VJHNE~YB*z8 z-v4`>%dzEnCE5e&t_D)F{dWYyg-Zh34aec7eG8Wh4_^`Y6hN1Fx%eplj>9!OiA}`) zNcT2|^Y2OB`P1(5b+5Xa|o3+e_o zFFT+OjGO#3VefYI*W-`jtpR<5ZW}1Kz-7ZbV-pgfFTktkY0dVD< z0e-{XU_!@l3cGJhl3!avwG=bUr$jzS(Doo3zDzms_#xNUPsk+mRatj4skXWLl z46uMpe=0yMf1)H8aZ$e`A0D`U;bjf<*LxhH;V{FQAT)W}M%8V9j*e_RK&|2<%Yq_* z=!AK~Jjl5cl$)Qwxe*-{*K?DXafpFT;KVix+glUV2x4Xx^l2PpbGiUnS#p7qCa?~k56%%q=uqZz90rLX-$!4Ph^<&Awue+4}YtIhDl zMu?191yRuASN|#1qZx%d{$fnN?}S$Q(IY>KmYe?2ES4~#LyxfRXc2(rtko>*l%V47 zidxf&1!q)IPqTFFnQsY7)SQ-V2|k&|bcEHuv#Ca@_|Yx$B@QWm=gn#7IU0lV2mGj6 zla#pbl?G^+s*DnP39DI}BW@|ZE2of$d61Ob=o79JbKuh%78vw50HCAz9-qH*8}{-v z+@%5`_5?2n3;;rx!@ar^;B)y`zr1-Yz~}M!yZr7iZ?1;DzZ@>v)c~O@0T)-pY~KjX zIf$LX!)TB1Sa4I2a6eqFn_=bob*Q5Nx8rb$2K=r24I<<;7V2rnE3M4d$GJ3$MVIe@JFm&LDA0bMbMQ+5ZV z-~I5QfTMvcjh z9fCSM-whT3JoUv3G)@VtxvtSLRXyot3tdv&M@kd+7}t(OaY6)YYvEm0=nBnmPHQDb z8>pY<6a$g8TuXc`panp}%L0=KbE}Zc8M<8@a^;sPL?kX`_!g*(R!dz45a;*GXkPi3Ca>Y_!1fs#~I@WS<_??bFi2_Jp*^| zu!`6~Y%2!KUnI{vnh@=R7~>CGc*)tj8f$H&yS2m?v;c;1i-8uwl!14O_b~Ke3H8A& z;`SMkKn?W68yA8!U1Bm#)#g*aM;JuN%Fme-!=TY*`Db3Z@FTc&*`lzA!Oyz!&)bS09P|1&g|Lf8M*8#ezrTq(k%IKE!} zA<8I@@XL$&^+C8Ycr!zNhoEnenqU-^KvA(Bs(1#i#Kf2`Fo1Z~fojSlid^W?ijtj^ zPCj{z=@JUy4R#b5b51HVL2Y0cMAJ`XWfEHF>DZcB$HI#$uIv0TZ=Oye0_HHD6tj$e z^rohrL1z+znE@>M&Mvf_qdbwCe6+7}M~B;?GjJE8X{x{l;sFgB1wN%raLV7i4nmv{ zQ3P{@_HRE^wat-n*&KFpm&G~;lKX31U30=mS7p-dq0K3D!o94xCXhdixV4{`8r*0ne_y2iOxxKEd3%kFYGHdn%lxE`o=CE}L@rEXmM(q=!l z^7iBI`i&^hhXX+`zQ(i*zrMNly!USo z-xw(K>Tv0JB{{Ab9=s|Xm`FQ~JNdWb?>O>spl$`$Rd{<9TZy1n{M{VBDBfLt&U-gE z0>OsEH^c=8u$0b@X0-kb-) zeD8~Qj{QvF%oxCzhx^!op1H*USZrp8#7L1GW=#x9#q0_!eDVy8Awq6W^eF6>1L{wT zXJNjc396yw0@yAwYSJEa7u2FW9I_=ik{617grR=5lZf1k4v4#6^`anEA()WnkWFrs zP|j|1{Yt+*xf+2eZ5z`Sldh!UVx%vFARQP^k0G#>SWJvlSykPTyd)qR0X81M`P(Dd z%5r=NwbxW%gC=tdBT5>xB2vx|^+e&qGD2)(zMo||n()E}0EOfV(Ud1+=``g*tn2!; z<>DHd)1C9Y&OzCHHw_@j4Zf%fX$)SM!DB5HBtFIbKJIfo4YwOE41>a2fWiq^Q{D_L?iSJ6^_^HsgmBWg9@=AVnjkn8@?K$7vVYp z$)n;fqf$?pq^V7+1&;!mmlpi!Fq(~m{LwR?yBUDD+?ohgM0Hfqh$~Bq>42e`YhX)l zb$f<>nIJXIR4fwr3f>3-FNCQb8bb(BgWJIv)hGeUxx3-az&<(H_E}sehch%LnN8$2 z5IxK>e*oB1@u#^Y((xveuEA6B%Y|pI90=e{lZ`9Ji&k--bTcdk zXm${H;{mj5VWO{xn{qu)yDkSfJrN*uEv`>oi!-Jx0a(}hA>Ma z0T)o?1+Z%Yi2LjU#xsD%`7s@!Du4e0->ZF#9dPo8LIf?)D_;Zi>rOz`%Es&n8XMVZ(olFe zGdu-C$)U2=b%f4U%;Ow1BEsY$o`+79_azPr!x-Q5$`_U+ixi5`cQws4!Nro6vlB}k zA-&xdA-}%#uz?vvI9R8jo8T<*!3O8!Y#--9 zFgDmG_KXMyY%rLdC6qt{l+)yy9cG6~3V@A|?>YBA&-Z84_r9yAN5c31uy@t&P~E$` zYQ42qty*OXA;8VVl(V=A|88mgs|*;0a3@oeL}Bnz&diupjeJ&3pG5&7i3KydtZ-@TP~k2S%H z=aJTo#r_CBP4#l9b@57tQ<&|-o86%h!|JKca8I8_fjO zEM4SXP{bE*T@RIuY7#Hr4N=LW5{9s~azvLurn@U!ZC$~HAY0ynlTl&D2tKJ)<(__a zxM$ipi>6nkfvR>* z++?02oN44>1$sKOW#|hjNw#mhw6eb>w_DFWyD8VfiT>XH@5(oJ(9#yOUi+h!zB zr>qKz6}m#cBe>-2ia24>0SVh-TNvIHurUu=$sM!FLdttDBYeVECy|aB_|#9+7(g0> zqm8TYh)@8{8~CdLXFJtK=;R=}J5?^Z6(BKl`qJB`(+c_OHNQ{gYyX%AId9;L_oTin zZcl@3AHIkf^r}rfI*Fvxr1q3;ghk;C-%-IBxPj>$<@0`?>Q~(!hX&4l^!a+l=0e>p zG}|KeuZ5#Uhm`ZL`8Z5{e7=QTwKC_HJkpdo-?syc4|qZhAzB;42Izxpw=S7+I4?Zv zbC=Xmj4eOZrUPvr)&cLwf;`Jq$oO_lqgIjzKc-S^r2E44GKdvb(`Gf*VdaMR_or<_ zh0N45Jku+9Z&3<&;J>rpdpDjFwu$LU{x)jwK|^6Qs%Rd$eS}u!iPMc~-$Ju;i}X^P z5@1fJYJKJY95@UogN|_p{N#jtjj}F%OC4~jAIGRoRHNv2KzFnQO%ryW@9K^`m0X>ficLMx$xr5 zQPiqf{z~;pMF(nSQlxDh9%ZeYpG$L9cACG2bbQ8shiwowO4UkrN}J-2-=lco#?h$` zcGxccCQzkDQK2TW_cd_SXhNbUc&g#CKE(D4tQ_IE)f@JW2NO_Qp_;Jcw#alp>KXceZ{K-E4@=i1vYSSVD*dk|Ol zC_>U$iKfO(dE6ltV?DB{rql^5*VK>@)ha~0^($Bwl{L%^%BCP!RN`rVgjq0pk93xc zG@=R4w(;0^)D&2l1O-)ruf_g|NnX*gOSXNx+|f@gSzEpHpyFJswKdiIF^#4-b?+YO zb{j<8VY|7)_P1DG#j=e4&%FT@UCw;Aq!J-&@}97Ufu;zU=6Qv-8C}9SGED#8)*hp3 zj3m3s$L{koA1I9gTRt=I%!_#+alaNEf!jUyBX1<`$u0S?TL=+lUyL~^4joH0)e|5O zSL>D;p}8QXeEjCak#2hZz=CSACQPnwg}C&{n60NkR-h?r{2ztt6m~qzZ1;I93Zq7t znOz*`7LPNHXFwUs(M}5sESmA%sa5%0%_~yv|3p3XN6Z4%99an4FgaVlILd8-LvOTA zwuLIxF5p`HiSgKi+@I0>JQJt*)FD>ol3P-?`J5l(YQdJ)H?ds`v$he`s?Hi;`!`Uo z%2)j^^?v$SY2e0t(-2{>%UDNxuoZ5+=vQeg&{}=wcNys;K=75uIQ(fE)G6Lu*hk`t zwCa_7NE=_eFZJ=VUZ%TNO3~eKd^VUkX7HeAG ze&W(}Aon(OgrxF*7TQWYqDU>tnpKn-+bPeq2(uoxLV^Q273%{$)<_NF9-3iaOiDgoaV|xLp5dK#gR+1gPhba-Yq8x0 zgtZVhfM652shI5meiNu~J8+_iMTTL<1lv{IbbZ&FC@7l_k70e(J!8@c9l&P-ovEe5 z_6ty*OvTWWRK8Xa=eN~zs3)2Y8r^kp*e$RecU4tVw+ z@D_u11dI$U1aeaSj&qYcW3kv+PHu}oIZ^rBrw>kRgKPORawuPxC_6lw7UO>KSx zHf{)%nMRAv=WTM9M-=}lQo6P=Iu$0X=>CV=qGX(_TvI3tvLbay2+FB_o)SQb=}6&` zr=;@``cXru$Rhw;oJ=Ut638urKyp zeP`MN#%kCQRrACcOL_e??W<FnKTOM)-ImtVl?!!JU3xeeXXf}+JEQ>*6@s)P~b%~13h|MbAZd9dwVANO8 zB^hFsU%QT8-X~wwF5gtN93Ovs@jfgoN(fhue3qHDG?p>&B^5=OFF<7pd6T3SgoBRF z!6T;;7Ne;JU`#&(th^uTJ+#@hVm?-`%G(}tTP6a;^YZa!&pz0H5=KBrwNRmU!6%J< z?-4ayb!ikKH_9nZUW?m|t0be0p{{qfwJ7>&mKLL;5zs+XSGc<)RAc_}0R~Xlnkbrf zgCVVn<4FH8ZeWbxV~n4Tiz?70f_8$YNzgQoIL;<9GoCrh9;aXx3q3Z46oR^iM&x3T zV`2lZiBTZ|goIKP%i#!mR~`MUdH2#(M@wtnjZX+L8b{j_WZ|u-H4;s0)KyHlQ&XdJ zIMquuwfKzSpHat@*wph8V`Jk_Z>Gj$t8vwTE!BWb)|(31t-D=<&7}~dKAz& z8mlTq1Dx(qY*`B2?8I;4b>N)e@` z&0n2rYiLa@3&yW}u@V)ve1+wlPQ28T70w<-&Z@#+aT-4*b8)nzX^YLZ#ZF6&oo>(L zy;J zxPZHYC;_KJ;_tC;25&v5OJBfThw{YWQH&nhyov^7Y3B3DyIwjN6|x{umY*sM71B0l z50CqaBRjkUFXyeh+ut$1=Dmk~&`g*HXLvRD%L`>vh@x16*DazcpHl1~#oky_>r&>0 zdKIDZe8LJSd1GEG#eh?+$){jbLV3i$A1RT-^b~8K`S&ctt>!}-+N>9w+cQKq6;P7$ z^2Mh@+9;z!+=XQ}7dcY(FrTm@P8yAWy)$Hmd3X9x9k$x>Lne2j$*9t_*rrA!l+>bX zz+&Wc#1tkBPUCB=%m{=U5GreY^TD)m=;B+`hEM)D4PQo>U=TG7g8DD}ZR-CFv#7q5 zrNPhNlZMz{`Pu_%3&(Ey>>X*_m$TIUorluES2|M}Y*oL2p$>~;l`D;7- zT~t3qkdDv&F7@+VYTti24Sw;iG|2u6R!c3K*7vYH`);g9zTX^TWabo%GS<7V#*6x1 zO?|gf5A7VpkXTN-=&1$6tix9A=vA2sGo&@vvI0p{pt6;Cbb%>TQRQ6~X_OL8(fbTL zP&Cmg02NImzZk#H^02rVH|kUJT(_BeH-%JCw5d*w(reLmqQNL<^(z?)$Fr&Ojjpui zG9DUy(1k*5eelT2Jlr56Oflxl@RpZf!@rB?Cc-X;Xb`Q6RV|4IPAbO1MBh&EIKe)t zG|odAv!SeV zvT^G-tN@83Gs19H?UxK$!Kf zdxg}JYIS@hCx~1>jw?o;t5q0(E2Dl@(UCIIHA`kyx&GLLtI{Zn)d;I^wcwwMRi>sE z&lTGd;u2)-s!3Gy;#Ea%<<9d@R@fG zoqEuydTz|pwlCb9dcJUf8vf>=Qtwr)I{Dc<({|3<#z0s%`HkoQDwV%@U)qfBlnr7< zJa7aPVgs0Y2ab2ut|G)4I@;hhcc!gZ|2B2gbr@hMuEt$9x#I$0b}M{<;jEFrH~VW5 zW8dzF91~+ckx;H8ps_DTmA2KE3tcF4bLM+dKa^8RMuS6f;U#x!b}*X33IviG@@kWL%ALlP9AYV-*2fn ze=nEWJyqYf*I^l6&6D>YQjUf(9WBa3J*r5j3yEeDqJVNT1CSr6vK?*~pi32D*W;_x z&cCi9%o4bH@@>?NC+W8kofECA(7246tE^O_MW6GC7;XWCZn4)Nt5_jw)e;;6Q%}=H zUU6;o3j;SfEz4T$>b+Bj;^C{R(2YJjiWFP}lZdO20VR{8c9Qw4;TQNhYsXBM;{sp-Ga%-&E$UZ7EZ4SFv<@t6frUz2*aQoHnW_y-qk=!h z`e3H9P$e-BQDMZ{++xtoR9_FdRh(O-@+vg9#sB-IO~_@8#BGuL|5o;)Q2??Az03QWt8tbBW`+V^+2;@CRm^XjW6nOhTh&uN zO8$f&2dOB@mj+S#2@g|Q<&h!R0vRFn0$A>wj=yhDJR}aqgbt>hiyplfmcaI%i!=mk zKxw9rJ$6l{amNaXpDqpNPl%|17YYU;5*HD#yd8mCuWLk+5a`TjJ@pwk$6y#}+% z@8D=MhN>2JI<0}F3TP=``8%G@cOOls3`3xy_`tKTcBa~YJeVpsLa8s_pQ>nOm2W?s z`ab*n)OQ_j8sC2`_5JvXwEcUJq-|eaoceBHm6z{6ma5--EcIV=H=n!G0H0oLjO#!3 z^R)fa+fyIZ>%abj;Nb3R3~trnS@p`_rs2>0F7@$y`?Y^a19&qI;HOyU&TFWO z4H)N>lr*7It3{V&j$1loywazaKPc5lpJ&;j zTWHW@#{DN;mA-S-+3A7r$ zu_qUYlQN;Dsv-a+ED=s23X$Gi4q^R~lco2l|gc~qn!>)jBd zDqji2pW!JUKg0WSdZCemOvU;61SbVmOzSa|o2nE_(kMdTi6ff!i>DfxG#9#5l2mxVy8ztOOx(vR-+Njt>f3!z+5-+ zZ4H>5$HypVn(748820cMWXbAq>CDQPI#cBctQ^#8{NxR8>mq|8i&Q z|HgxH)5wIKE$)+#dm%6Y1Bj@2_cnv8`+Q?W}FGjcg(83+Rsld6GW%UT^#k>vA zvjv1M6m`ieKixMhTCjCKPTJQKJlHJ-y^1#KHd~T4(KHPE?mXKz72RfCALvSpD*Xb* zmO7;J?!Wmsz!hozZO#_>t3~O|)2!@qay08@vb5|9{ z#fENq4jZCs(%-NZZ6@qP2zPP^`s>RwmXm7Zl56TlW88Tbpd_eD$<1r)-rIs!rMW@YHquoP%?eb&0ZU z;oL*g1Lr}lt}}pD=_G*m30Rg1wCq$)=n!HB)?}CYX}ZmJix87+rXFqj5vGNBD;4mG zE?M;1!dE;-e>Ae$5^Ml5@g$<=78Sl|F;;X-$s49MJ&MU4D{U#$>xWy8&BHTdz-xx= zvgKMY$%o!3Wv41z}NK6nkl(;`f|~b_rA5vQbIR#Yv^?QdPZ=V8}LTVD+>0e zm;y_Q6CjHrK=rH$L=>K93a#)Z%L59jTB&SB&)LJnAXOku>1I9zXYNuT@=gBta` zeg_tQj2iN5C*!;ms8!(rj|00F#1THjXfzdusYcL<%8+RLg}0ajQkN%o^zw=ny`t=9X7U8~`pxCDKf0>q^^S!hLi{0So zat&=rqOre+{oB#P`eA0@^>?SitN)OyU%DSlSf{ip5>86n!D4u#rNwwC{j@t$O~o8 znh^?@nNB&@VeB*+W<`ri1=HeKan_-^(wgAKedR@Xvrv|1dn>jWU%dH(WWGxCx&H1O z_S|T{rJ{0&nIgP>t^8qKwC?ATsXQnmdYFk;+vQPHp3qz^#+OTiE1H)>8mxBCI?|41 zo#1>u(G}zNh)(lPGX5tcNbiBHU4X$Mr52}+&>b535|i`%|G2iRBk5E44>U3-acOn3 z>;EB+3FgJs2Lw=Zb$i1w?auIu!is{jrc7FKo3!fk z!E}kI8S?4FzpYLG^z+o()b-!5Y(aZok03qSkB>Po zb)Eou+7|KEHD43m9yncm(DA8D)vF|zK6mKHQ&#}$WBVMMN>a*9CaGqcGb43`m1!oR zX2>OfNh*01x>zQq+Ty3Vk1AeK$!A3+hXYnvtE6)BBhtU*mZ+?5&L@-Ec4FRS;L93b zvKe_~jw*lsU*ksyFQ|xglDbINjsw z6k}fdc&@!f%kiLsP~N4@+Qx1^3Qz=f?9D2Hq*zfNg|)BbFQrn1(#pf9OQ;zhseDx2 zcyxr2C>3ReO)(yI42x(F44wt1M3kpSFW$@^b6*5uj_E})+o8afX}k=daExC0ER=HI z-eP~`{?O(Qaa#en-9Km25Tgw`?Ufl>aGG#Yk;T`ydrAfcpz25 z%^*WfWek0p){l?(-EdDT|L5ar099%b^V{%G{+b5A`AF*ia#z|8u)6Wy-Nq1C5Af>) zBz@m_CozRPY;L!Y@L z4WL@}U4=>U>ffjB+|9bnZcT&Vdo&Gy>rbigB0|5jEj(Ffiyj#ueuPJ%KYavHvwhbd z=~MFv;biI~^@+vsWv4GN0z4K}(h?Z&*DJ&_XJ!PFN>)BuTrzpF%uIM<=2OhXQAscb zp?vpY6EqVS3LhrlYXH_830Iov6#4?KuQnP}_gZg5UkayCv|_KGuR{{UrykiMnN+KEif|#3zr&LEu>NJ*kPmTot8Qk}>ODqc z{)KJODacyyc1tVlgVIWcX9u14-So~?G2Vkxnz3BV!-W&WKqaD%GQPQUY+c}ZCrZsY z>XH+tCJ8~|T8%p5jcZ(EM9C0;s#h({*P?0%rAaHJ*p4|FnY+^2qJ?Xr4i}>s;Ku*5 z8pjG;AKY-XkuyTgf?ldsElqlmLRPi7S`!sZRt^8`sWix^%sAID6R!qwEtFYR*k!(q zMX^S_iwa6#gprb>&{o1s@GSJd&&Ht3p%ZuUA5gGbe8#}WDF3yN0#~~k2Su)E+VIL6 z1TjiBC~4$JkB8bgPD%1=Cr?&|&3M1rZXRV@@an(U4C2?oSJ!{Nx|I=5dJ3W{d!J0n zTqsv-&i-y{dmcD-z5twN-gf+@>4bgerGO81ppVT?8W53ikuVdfTwcm`{ zsY`Z&tpml@5$aU@y!fDnX~qQy9*4zne=LW`h4nC-##a{95?_&P3oT1_&2@*{&jeKk zvi@D+3a|;THo+D!o8eC}_7PQU&jj75;V~^bhJzv(bD*S(RXiX-I^6*FF=s_rSekm2 z4QOv%6x#!AIb+HqobI+yW0x)xL<@0*X}lvl($ea(Nm1J z8oq>H#QTf#*=?H79#b+!AUw$36;2m1u;nnn0!^cwsb`y) zWTr7sXewgGjrpW3wI#6?LB?Z{BF4C8S+KH6k*V-7@3!EnnS4&GQa04oyw%x%IHTU6Hde5{!{Ab ziappBw_qde0el-TxEZLiw2OWud}1h4P8IneP`LZHljQH43W!E{ydSjRu z9##cY-?Zq^Vk@Ieecll(ZN}ajSLjp`VOLH?yur+CL}u zOPd6892_sJ(0{I8JlWXw4k2L?+v+L6bEH||aQ`=4$CV_UCVt(`Y z`veAb(Esnq)qnVb6OK$7h1{_yXAkX!8S-Tu*{qYf={S5Ey%jBlfunJZY-4CAV;GyQ zhO)`=s&U4vT5i4dd?a%qh)+P3}~d?et&z0T@D~YbT;5 z+bKRK*_=)A)j4i%_e)!7xqNkgz*qM7m$#%Y&&b~V)DKej)+fJDfU+}L5%G778C`YQ zsp-T6j!yF!AIj!|ht9bS9Pu?LWpm+1+W`q@MC#Tn z5BXT?j1$zPW=NXTxUAGUn?oK@`D$}Z=B~LaO%i8sC923vrXt@dfzodbjc4qrG~S2y7Zl zL@9{8LsPrP@+CUWfhp+}?pAxCrHoT_m?|_vpv)-{WmnX^M|e(wDdk&?X+;DLMUxkm zQs$?5GSk~oCb?Ipgvb&wF}!UiA3gUP9-F&>nd=mL`QZHY@s<+4f#H5;d5Su>DxP!~ zA0wupas4vkbhfIMF6%Yasg|sO4^_sI>U3)dm><=LzeEpy3_Yk~ear;uM@;l$Qy)YK z4ARIqTzyws|Jl3KhA&_p{PEw?rt9xZTd%*Dv8%h&_Umv&r^8vLlUnB70XS18R9XdR zqOyJ%_+<>hs2;3(19%Z`f=j(uGOG$E4Prsm0yuyLu}3dMj@?Fi8!kuGvtOSM$F%eT z2|hW1)h?vWnC2dy)}VX_v4DzLyrEM_slb7cI~GCdv<|fCRM;tOq7KCKmL?@}WR(uf zV!O4#BZGYY$d_7<%3*=|2-Xyp0+=O%8L!qF5Wx|>ytilC6-t#AEOdA`g;pLDD2k4d zyFEL4FL8pXD%pf#3b~IaWs|*K0DDfWY#!k$VK%EV+D@EM$c2S!T4X>HpW@>?VAXEu(zATFe{ftOg8nn5mBL6ud%vt5TiI=tzUOw&!*} zWTZY9vug}eNvaBAot$O71J=l;UAVjL#&JIjQtd!Uwe4h6=Kl6czC>0K>-lrOOYpo; z0jAgaYRgW$5uhA)QffbsuLTDll@=U;pkJ^*ipzd;4oGbW%>`5k%{?G>%C5E(5&qd3 z2QEk*m%$Y?=N)`}I@b?CI`^RCQg$J(3nejTrt@5MkS>X}&*`w|bhu%9Hk@#y6f?c} z;DzZ5Fmw?(nuZ#=JHrc0oKHGt{g6E#TCzrui18t5{~o7AoFC5%I?!L(}wx zCSjmF%+(mVWP7qv$de);h>8}K>rs-bInLJY@rO0pSnlFtkG9!abDJZXilMX*?j#Q;Yqc}FhAF8#O=d#Z`8jjd&Q%sIpvE)3k@kez#^lR0d@c1NCHgpa2-(n!D%a1%OD7apkcWL(4f~iARt0`FKK;1L58!|} za1&4iY~8rTZ^4?l8KrA0!&{qi=IBNR9Kd4Od&M1q5w}Ny%r;|3bvg&RU9dT@uP<)+ zUPK4Mml$)4_f_cK<^_~BI_gL$^)V?r;(B;jQG~aZ>vd7t>=4bcf8(Dq^@nGP>(ISYqTQ&4vHO z2q@fKDgGb$61t}K?%}5Zw!=?KokFc`!2w66&MS^MEwx>7_-QG-@`z8Q(p4OG71NhG zFJcs_?IN&|3AGugL$yoE+;HR>d`?f<^+%kZN;h!I1qlD(TifNFl6{d)?FF_%D?5EZ z7S4!dS>6Np5;1s^kEL0D{MAb=M)B;DBTBQv zr%+XG{JRW-p{=#l*qDzs@?$)kFzr_W(lE0vLnA{@3^GGlS zLuaEv&DmcD*cjLA5QlT8+0U&S?}`NX?v=NrBJ(KmY1jBaY^?I&N8etXjA(n*ILmpYF= z5VhkdzB(6zvbKeX9Gf~%JscXHa>R+L^Q6O|hEO~A$kV2wcJARPr(d7=nUvkkSDSEy zYtT%%U3ugua<;W!#jh_Mb!NI~9-IokiMC9vwOxAXNidBmyKUD)IOujp>Xd9b)UJSR zCCPThA^29Dd%&@2=Gn3aqNuqQ+FB;kGI2KRoT=TW=W)D;nqEl(5bK0A(_FEqI4V06 z=**UQpXH|hU13vS3&l;UwaG>t6pu)yvtg@n>y&FVM42R0dov$yikUQ@jsGfyrY&TcXEL68J^hNkKrDpira=!UcD>`&2^a8eJ zFIM0z*ZbTPIGjRMkuMLtW~lhue$L=%e-b-ttW9N8Re?^XAtd zN~^x|Kw8Hn&h>v>lHR)I#k2x~t^DP)Y2`1TN$+sX2I#fn&X>|ARK889Xj|xIcSE%v zh&RBt0pw6G*X(C>Ej$vx!}!;CnEQ1TK{r_NuUkKS1la(eJ_K1Wu~U1<_u%z7{Ow0# z^lt09#GS{XqlFE!aor!%INtx6esLYntyU3r{%k~lfZ_5hXprmAzWS2x9L`#fmm8HJ z0$97xiWyHbRIHeVuAUYumfeP6)JN)11S+&v2=6^kZ^wDX$Q>p3fB%e6##dHjuqF zdVdGsz0E_cE$X+SyR(4-rLcz1NF!Go+&i)z2bI}U<1c-j>-<0_hbgARpp zQ5+4^Ph+vmv>mClhA!|QGS|wjS}y-V{yi$k1YHy%xdR^zJt_=k+dxqqWiD2o5vmbv zj&)E{VPasNiX+{|=xU8~+$c5!7r+{YWtnl{+vHp}dM8+|Q+eAwIIE*n%`{gNhz`L~ z+&G_1Z$rM8Fst~FSV8%W;j`hcNjwrKLG~z9v6>IRl^Tz~lbU~hH#KnMYyNE=)$y_P z{3Sn5-#+Eabj-Zt(ti6Nn)coI;I!|42d6W@)fGpbp1!!?lPUYcv7bzbec{+or3;Qm zd76KEI{%n6(j~{9ov!=X1?k$4T}XOiq}MLGFkN`;S?R(BXQs;*oRe-^cv1S&aToHr zAbsbAi_;C1aRVh@eB`O=JOFsLYS~wgIXAW4F#qh-dBf3Xr@5D-@tu3f!gTpzC#TEj zot!QNIu`;d)6X6b&rtlXKkBTMU4hQm@!7*pOBb;Bf`b>Ot2z4fjLu!lC%cXvZRa0& zJT^h7ljl_HI;CIdMc{14HHV&@&coDs5^nIHChhdd>^!W3i!W9~lx&RG!6WI1hBjYR zEeP$bNV`6v*)hPT9u~I8PTf8ji905>n-g&=W#MVx6*}6#SsUq?wOf7dq1l##Sut1~ z;AFX@Nb7HXF|EdBVkfAblfZXDb4t7f0m&d*2AnY#V+X z-QRpD^}wfYoELl0x_Z&ZdXPrFG7gb8%sd*Mz6KCPJ(wmPvl~W~4dYo-MU$)G3o=3( zP40aH4Kk}U5v*+--<5pzJzW%HTy5;ed(!Os6*(Jx-oAS^EAz^3-*ANI-A`Bd*vnSa z=?=(LM?{^@N+HjD{^4jCL^2nvg6)Zv(jkj{$zG$lR=~vz?qgLlevU!0X0{+gYH^ zd4VpdCEA+I`Kp69;|bQ$_AU0o%@zyc=B7)6Tabi`rYw)Jwe;SRl zbt7wgqLdl*q0?dy-N{+PO~@61d;iII18@z8ymaJ4g=-lBkf?xyPCI4e*91?5R6DUz zjx+pKr#IxP#+ig`mvF{@s{e!lC-t8`nT{W!Mn!lG&NH1Pu!VG!bX96(lQPC|^-yQ4 zQ-p{!{Kf>=6LUL2+ypV=$H1JC2wP9QlQuHX$DNffS@@}R?a3FXOFsVT zbnPjZlD{Nfd(y?}!iAqq7ao63y6pH*rJFu>NxBKVeaVu(v*?mEThLv6)M@FwBY@n| zXQnSNI4{XLF?Y4vny5SYG6*K_E(e950(m0tfHIcP*bBcBiRN1;WC7c{;etPG?)2u*)ujXkF5-&7r*PRG}C-cXZ0T zPI*^45n9Q-*c57CTX0aluk93JC;C7f6UnBB<$`~*4twS?`P?!yS@=K7zi`U`f3R8nG6KQoyx6m34)p6*QcwbSeyzrXeHkSjTXSzXFqHVtp;o4)^d<$TElN6fDzf zoQj_XcbmDM=St-VwQJt&nl5r#9Gw3y!5f|M|VeWS{4I!a{aSO(s^*?+( zZ3KZE?s+4v#y4!`ZLg#^fAdm$_udt0b+#(KcJK1EfYFmou5WyD<>vuG0~v8IFMg*T_#b$?8wpl}BkFlWu^K`sz? zpw`L52&$!hc4|nJI+f?t=|boi{`#W8>LD7fuOh-UUbq!0UwluBbqc{;OY@A}qr_Jn z2E@W!GWuv81$V7Q_N=T(!A4(xhdIlZg{Ho|Fe-?>S?Y%c|BAdvS(~G$m8+4_#HrKZpvtut474-71gpaQB%O^`-!z;lBjnC>|Zd=zO8qQL(FjIHwF4N73F~ z4YELB1N1dNhsw<#-9epG#Z%v#B=5|SOavaOZ@v?p#Na4eWXlfEvZXurziDaYPVA>su&hp1t+G3$DR@>TyVsqbj;z$r%M)`1q#97(O?jr?g~Da^SR;p^Z0x^ zU3bC->3np#laD?nojm`P0N{0}U7oHx{fczm8CRx@Prfi+-}MVWovyd6d-}i@PvTj1@i#mypsZY=N|?nIVZcEljmM|)T!wLka;FYi^>b8HN-{fqC*y?i}?t{ zT=P3krSAj=)=GN&FTklks92JF;pp;lxYcnYJUf*m7tB30&6{-~>Abv*b8+%-`y^l4 zag@Q=JS@Gqes+FLtck`M&Ll7+9gnsA!)EQDO7l5r5v47jKl{McZqCg7*$1S|32~j~ zO6KHa{E9GEAN91%XG8^uq+~d$$MhFBMf-=4wya#}N~kb3BDPI)MJLXbbfq}Mql1h3 zc+E0rBR5rwdz_3kpSRv4>9yM?jTmMIv+i)A{ZkB3`Gt~17^ZQgB> zb4N_JF6I(UD~2&>5gp^;k`k_@d?6qQ&0+1MMymR~5ySco() zqKNYjMdP%11Bco-4I|{_)@dxFAsRWg0(|<=5UY3K3QfOz8$x9RTG<*RP_1JO?p^Tq z)_p6|^54CR7Whhf>;6^gZLqlFcT3W;KfROQ_}iwm;+f59<3 zTKT89(i(8O{`aq?Ev!G-4NkX##vVk@c7)kR=Vagha@z2v#i{3J#tG3%x1$+u0n@!` zoBe2|!)TX-jIH$Dvn+Lg?=Q?hc#IHvFQyurYXxmnFpi)#mYE$8!$N3`yD^gOV%%{8 zuZrFHCO830CKiBn>@r@!)buhWce{L)RRS(-hO>&kQ&e??zwbNPrMIS!JO``fnPb(l zf(5ngbCEB!#9}-y`Z_Vd;B}&Y#k;qFyoOqle0R}PYm#1 z42xEn6gff{YZz$h@HmQ5bA)l!0*z{h6L{=q@-P#KGh58L7KrjNRL(C$NcF>6lT8oE)DxLkho4!K@#8ivpIHkO?mOc26!w)d zK-7N1Ez{$xaBc&Gyxfz2s)AL@kc*jsJlC+n0?~o%N&Ga|G86efkG~}Sh|eK&4^I2- zb5PoE-$Su&9+vipiib)?=yw>3;o*?+Sg3gHF(;*Cj$DLtxG)_xZ$UchkooE8LyzIZ zAk~p4rL&GYna?TdEJ%0(YT;prAD0e0av|q0N*_Pr^mNjRXQxw6IwzfW@+Z^BNzXa; z{B-t7=cVJ1J2f41^vBZa3qFx9UwCf1;y5gyoPY6xGt%itemtGQ=Tz*hr{e2!>Y*nD z9nXhrmqNnqeEc})e*D1s=`iko9-l=A9-U4*__#EG|0C0U^U&|?BTh;eVvEhr;nwD! z$zbE6gOBCNW6~n{Hy?&w2n#>4|NP+Ed|)%*Y1IcZ(XHzsBZC~sT!nU-cnlvWGccp! zpj0|+&cXZwa;NUkq=eHrf6=~prI4ONxySBvgdjX3%{p|}LFuSDheE&O(#Q5?J^`xX zg;-*xWKgh89(HO{%|5{ZAL`+;`FNljBfoOzmzcE>R@3%Ee+(!(udeO$5I(z>ulDZ} zt*fw{h8`I6NuxoCn0>AMfifhuTSElEN4NRAKvt2@2jk?Vr{}En9Abt|u~I^XyJcu` z5lBQ#MYODZy;=_U=(rT^+B9HMv{Xx;o-&Y6PgTB$zozPu_h#yGp@hw~2#Mhq@3gpk zx6Ak9Qd9O}wnP}DP@WYr(U(`|s3%H6<&eK4u6-M?-c4*^(uF~1A1I7ye*?p`8 zznNn;0@HWyd?~FaQpEE6mZzoJ%C!73fOzl9wBqiSY1MCEO)KtO$#3BK@S3#hX@L2} z#r*QayD zD}m)I6Vxjed-M3! zYMD9bEjl_`d2C4w>X5X1>!IFtIPcg1BAUV8waRNo752aHX(#?V$TR&1F_>&h6gC3~ z*I}ViJ*!wkt3Ypnm@wvBx3B^<0RkrA=@?XOeVxbd8ptzcq_e|a-gOkpn$L9p+(%fB zGg(^|bqqVLmhl$8R&~nXf$h@OG=-a0Gb=;Mxq3H=!3K1!8x`kk1RUVCHh9?$5Lx5Q z(O-i7CVnM$ARZ8DRo9!Af3A9X0xI70zxDf<&Ls2~cVL zooxNNKT9WW0GjJR{WIoq{&ITuXdh3Z0%3Jy?q{g8A0O9VJW}-p8{+pMhL8~)eCoJ; zRtVBu^|(mkjr8IC){_z(@@7u!ScZVSEItvt=G$e><&9=-HLw$dx< zz4>p9KQP|F*g`)c8jRR8%yC(n@M7&P+W#nnt94ZTtjvRK+rhN;=t=} z?7%zuUpw)*-Nj0yJ0E|WuE?@9f$z=)!=5efARB+`UFtV`ome=D<@){Sx1@hOw}~2u zxq9Y@&u>Z}KD{oz&ve8O@Njyc>4@1sI63)N!7W3rummEPyqdwjC@pIn<}@8Ll2i2G7w3zx{;v^kBRP!T2A10jUn-flxN6IxD438irGGR&oJ zF9saLEoF{O)x7Btr1^qr!7$ohTuzw9EzGh2f4SL1{9UARbs>>om?Ltp7)8tUg1jE= z{^@(p4YA&4sbFSIbITPtH^rY3N^QYLWn{R=#3b_wTk;V~&M1Br`eU#&tg9hk6qOx? zp!FD~oYE(kO>nZ^Tmj7(9*svILU=!AmUm?;NKOBpmY%yeH3NJl|8hJUpV3X`%=n+& z;}bBoY++eE43ATs`r!1JG@$>^k&-h;Oew#@tbMQ51&eF{^OCf5!3G`O~2oGgh>_;rtRNGl6>pY)b~ZO$tdaw z_g)5{qH~Dxp<$vbH<95Ly+o1m?=$gB|9ja#6r)KI$TenF>zpn^idaY~fYr(f&)XlXnz6ZmyTM zS8S!xLumpr??`W*2RQ~F#=yl0%4Rl%Bh7x|QuWh?^js054j?DM;TWMzg{C15gr>k8 zB>?v*(8=WGAyz=0lU=8%Zm$NJ-yq<@PLMQC1swHrCo^pbcUr;Cs}AZaI2I2vwNq?1 z2zfd}I&5#K4m(R_dP(Y-S&eR2TU~_8%OhI!yacA;tdb58)yKdFBOtShR_U~d3Jzrz zLMEtxiq0K~>RpO%r2h_t|Bh!irXA02OcUT^{DsZTOveTc2Wro(=Xy`CPsf*WnXMzh zYxub~jLM8}&Zr-zJdQqwZw@|4EyR5jqKzP99U{+a2-}b>RPCy*dahT5wYH*Ly}F}Ei*`&_|&L0PMtK( zcJdEqjMKSr4ypDGM-gHTxlBV_`|e*qnf^h>K+(X=#ZKX8XXKQgfss6l@08jWaMC)1 z+|89T8{kJ)>u`g>DJVM4zwq>l2t;8r4SKd0EDZ~;2n~CrqC7xJqqMxZ88-ys+!8R& zsZanh{BFE4uV^FRL&4}%htF#mYCWJZe6w;o2 zOc4yP(K&^|wMYvsQ$V^clu*T5hmuN>qqs3u>Y2v<20A@V;TKz?o1%CMftAzVo$dZd zZ`_;BWuRMT`v^ST|KknE|6-eINLe#6*WwxvixR-4e|_)A;7S38*j3BSaf!ij3YSeB zW;A4tAbFgp*GIY?ljv4D^4ork8MSL=T6f>_w2D#5B{=9TeekXH))Sat|FRJ@zMED& z@J?FV^=5kG$@OW;V{6mv&umRgUhYn>zFAH$Z)l_!m-MG+pWB*Vee9jI^3UtjJNK_l zo9}on^>nUCTh%6i_FQ@g48Mb>`sOd5Piubu0-ETnY2#gB6s>a&(=^tB(Y3d|oYwyO z<+S{!#pxZ?hxK>94mw{-8*qm0Lqn~ikq#4jQzu%ZK}FDAx&S+9T%%a)jG>rmtDQTE zq1I(nhXJ0vbPUbl!=X@3>6t$4Se7)_*_kPStTjdIYmWL780!#(zBxCGS5pxcv)T6; zZcCQx_E?R*!va0hG*rncL#(CzMYt+sk;|OJ)q#Tiu&~lf4rtH*-OiDHp$4(Kf>6k^nA?Lo9 zQ*s3OwSI*en68g@)|Lt+6gN^`<5w)ghT>U)pd%bJ$mn9hfskb^ zx~5g!r*+in6pt}7shduWQ_fNQth*d3HL1ds!9il6^SGdSA6FP; zRhl7GLg(QQGrOdMqUjQFH5}|3l-uOv43unyafSm_EJvV$kpsrKqJ$KXhJ&7-K*=OZ z2VIP&S>@wg6_-iK>X33@@hBRbpm7veCDEwex=A0xc!D*bFZS$F-v_cGlZl-&@xbw$ z>0|LRouug*TE|7cCz%8@Ns}AnuNq9$AZ;UfNL6^~c11?$>DK6;WJbo>X9T^zOoKJr z^@w9EKjb!nrrn}Z#$8%WJRajS4kkNw<|^#~!2v|c7*uRGCmy9@*!|ngb-HX_n^+78 zmI`$;N21usBXrpsLK??nZQ{X}C7?`$cxG}38_p`Wc6msIVcB~|hP3k>cLvvH3PQ&Q zrDCC1M#r?x^8#6+RmHr0PgQX5b=j$31sQVylgU@*$_^3|P{X!NU-{zb0ZHXjbPPg3`G>--)r>+eAe#Gz`0wMs=1OHBh+9I171<^Lhm|vMO$pJi2duTen%(mD>aE=Z4tVnMI z#N~h6oK`%$B`y2&2H^NsdhO0P(kr*VmX=~(UGle$>BUD@r{^ADo1TAWQ+i?fPb_so}Qp9rcOM z79x&1`d;k>iHjojRne&_ zdHsu;=oQ-w!>c977-qZ5q5H%1>UBzTFsfhJcikV=R(x8$<7#H+SUn3rAZwj})XHmW zkzOR$7n<#zdi!z5*aIg~|5O3RR?gjaYP038g365O2%;2!RnnE zy|tr`yE;Ny#+qM7 zXjh=*Fvr!H0F(*IMKOL!Mox|}kYA;8S=lN$v{slsGDL4nR`ye|1~5iVdQ5Y3d{g{P(S+N0HFy6k(Yz!`2;ChNoWXiO3F-B z&ZuFOt)QFB$d=~DQ4U!kEY&4l(zT+qv8+VXZ9->RX`lhu#&flyCLpTQ9S~6?sC^Q0 zi2JT`jXGFsU_5Fv0kg%}N1gsd^gwu8qdcu~p2fK3@P1nS$E*b?_jj($gddyV%~UCT ztXee9Ca_c!w7)8uYy5Tri3T3R;Hs=u}pThO~Z4pfgEJ#1eWUE{68zEmYb`S=Jt5m#)zvI4uFKys<&%nHq|oZ-l-me ztneD4V0vjU6xcEo?m%=WUe3K>-4v0{l!MBRLP=D1gcnAPRK}bTH|3gN>{J5gVPyi5 zij{URQ$RT%+O@oJpvq&Nh{-6&VdI$!T@9o~8j!T0ndbaY#s7?d@5bD4Y%Zp-nDME{ zexGXo)Z$HA&<$?05Z6u6N5i*1Mt+pf4u&FS$K)SqQhZu>5y%R~u8J>wuk69jI`H^9 zh6vye6OCNYQEq!DyzC0+9e|aap`bu|t;pLw6 z97^PiZw#ep;pU6W2Gc7qb*E))Uj|#>!iKsYW^QDtax3Yk-!Dn)?^v4NzV(%~;s;Ns zw}1Brtc07td@jB9ljqaQ@BB5b{^_%6?H^WPXyq@~*B1lNgheVJW+j9D-u zn6x#9X656}eYSj{zRylElrLK6Pv1e&#fkSIv*t)I!Q@`CXWlpOc8?B(MW@WeW3};6 z-J&BFLyFc4%lAx62!pMs&NAk;FgF^TsT&2IX&$G>`zX*J4oERfUGhN}ahA@HK8k z&BNl|xCu&gb~ei4bE||GuTg%P^$zQtS0(Qn9W~bQ7`)=QX@F0SzFX(OrN2otTyS^f z+mGVX%DOtZv}R=(SgHfID#p`n1gk-*k7y3VxIZ&W_h`Cs5K@-0!B?=k_G5$Z0gS__ zjDs+}kGwjiz^nksp|7HFqTQ&s7*4IuCsKsF!P15et^^(iP^|jdHo*94Kg!l1co{TB z86JRML*S>3NLJx<^|><3CX`VMU1p(*qBxAXanKP>w5ooT$bQ;kKXS7lQ|tiY>H5HC zA0g`o$qyj92RUY#{_GHVtAorcN@s=VTnBkokk%j_V|Zt8~%Lz8O zoY^R}X7Bi^eIY09b{!4kBxgB{ObY;|bNcUgkv)ce#n- zI~cu1(;T2{GeB3Tmsw@K`0owiTHMdw^@GHIa5%_*{r4)olVRRfjWL)i@6;=eG5gF( ztmE|F^yPCssBAa=f;O$NnPlwPMGbUjkq+=iLlTktk7Zh6+he8?!2CN;n=Y#MSe{_X z%5Nq*&$$g0n1zuNQCes!fvK>?cD51fYfrXaRehVe6p$U69 zqnl6YI{t_$`h}ZMsFYr6KZ#Yq*wixJF}5YwE9K-|2)F3OyQMA0bj(fjR?($M@+6gl zTv1Rk#tnA_N%?zTz`q%OhIIO4Et@>}o11bZD$}L{(IBR0Da(}CdjnL3Azqg|VtGLy zR3V_<<5l85&CKwBs%tt`L|rqlB?jPc8%0!QJ87F&3(*#?16sDMoc6$nnbO~jGPfNI z=r)wktqv*z(6x7?GhYlrx#w` zo?coukY0VQ7pU@iu_wKT()sE$+tM4HzXoU8^$)+BHrfN-KZxWLo~cCz+@6YFfj6tU`NOfz@`|FP=-wg(yvZ-OUVq0@7{ zG7;TI9aDv6ilUinsdnzeoD)c8~%uV1)U{V46eh@;AU2* zq*BYNuYflj;RUqmpp(_`x|vl4bOV?DCY4$GS9n(WIOyz>!JRd@IimvhWM>Ux4iWk& zbHdQRgG2?aeE;z@$l&z=pFYkJntgtV_@@zN5CcS&&ebq=yicQw2a-g2KFjQZlaVvosO)a z>kZ!d67D-J4U7I5E z)1=D|svrXN(5lgVTWF8EO3O@5z%p|uy@Hry>l7vGqV-W#Qf6jCvqMJeouFbVG=rct z?##FpIWJWxf|mxr3QbLoCWaVGGA|TETSp!@G_*p6^0bSM2Zd))et_hR;lzly5mcKh zr6|oK!WlMb6muiRq=zcQ1CFG*ZmT9)U^0ic$Lzt_G#=ZfO+kwgN;7QF1uK;wp;pF4 zL(x-;xjVKnV9VRK+%~b19~C`tkfJW^y5*UeS~vj!rQv&+Kz7sTo20pqYS^N7w}4=kDT=~mfF{w6wzl~$ z;sW3Tv7wXMA&Xb1)sL=CZ}C~twI(fp1aF;3Hl(G0T8Fl{F|B&JFRggBC#_g9l$Kz9 zeRWMGy}n{FEnPa0maiz24gtljX&G>Qi{Z`nc>HX}D!UPFbsgI3hOW2Ly9`gRq2;W^ zDRw1p{%--|)p+r&z!IlVW7;KD{Y294Bvaq_A3O?ozv7YLyj1V~c%1Mb@q*5`u zK6|CUY-^SED7WKEOP5~{v{^-C`SswWCfbtM_dfEP8#$|Y)Va8JRMP0Bd1zQv_Vb9M zqiDg>Qhl?|z7=cvaw)ji87lCx!| zhF6!}lbRzAa-#hUPPv)YSe|jF@Qjf!q_WFo)o|(QQq7#F$5#Jm&{E-M8Eh)RYY6*c z-E@o^$h$9NsqZK4Bj&r{9K!QUcp4se_yc0No)CW=qz|Am_90Emy09C!S7wni0qDwl^*b9ovfU_(r z(e?)End&7Q=w#^ADEIvg$PR$OVPbd>5X8I>;P&Hb(ho`p_+%=ZUmntQ$=(LeK{Wtc zgA5UAfioL?pwv935DM72m?5i?CS%^kBbn1H@(&P{Y#xQXNsx|QF za{;F^_^V@Gsyb_n4&<;Qig?C#usQ6kEiE-1)6h`vKra6@x)_*R4R{_Jy2nGwswP({ z%I^^k*=!qjDl8{Q-m#Dr*XuzBbaU)>I&E+03LkkVz4O58^!9^m(waxtr8SRjNXxq3POm=1M3Wc$ z(woc5Y1NX!v=T*g#p-HWx~7_zY-purTPMbD>D}~BC*H8|d=0Kft6=0xl+Wc4tw~Gof~{&%S@*+Wdzl1XOr2^*AX7dD)G1t{?eYrR_H9Bh--{nFgiVh8wG+k{Y66 z45{FPL8?SUm)shC+VJ_CHHMXPf}te&>ht!c#H*zugspQ{@rnuz`bG*ohJ7I%e0+)S zk;GO%0hJ4{V zfunC25cT>q|Gh|SU_NcdT=<^N)PdMgM_RH9v}Q83U1M$)->C@oXTX7jN10O@6G#}+ z)CJa9?IJbI;#9m*uqsTYswUbIC|tpOTL9H`_)1p_2B;+$Ssue!mr2uns-;YgT>CIi zv#xwRM4F8t@MlQWA&6@53fEuG%4nvi^-l40K$jtyIsiwzuVIl&xr&F$5Phv47O?DQ z;mTo$JGB-pFMeAu}BMI7HQbj zgyu|HS=?t>jQN9EERJPwprqUhOqvOgi+t>G$^sXh4Ae%>%g?cFd8$k@uQ=QL{-QW< zB&gpN$aGtW0?drMg7VZ8#cl)x?NE@3T(|mHebn(c+z@P^T3?<^hD5!=TaF_c*>Fj^ zm|n>{-%Yp5g?Myq(-k|GtERm;gzr#(9kWeU2RM3gV>;V2mRR|vV>7f7w8DN&p1st> zUZ+Mvpbb!J9VXDtPi;(VA6lEGln@*f(iq zD{v=Rd*|yo-ZH(D_3F1{mhGp9TE+ zeU@%(HVun~1?H~1-dZTeVJPFup+nW;iRAJN(AKb#rS>afj@ zV4GFC7~`PR0nt+Z^LPd^NhEXev4fjTFmbiX3L};c@`dJEx#kb_Pi~9xP93(@K+CKO zRt1*^=MkHxRW!|k%jojz&E00S`K(4~h~+Se%;bE_Y=~e`?fS?Uuo!81*hlrV z`!lTZtQtz-i(Ur12N(n$CO_!MYJfd=NYi7_wX7VeMZb^BW_(0I7oF<2@QKLcFEmr8Qqa+DX?YaV0kD+0@%dYVl0RcI;Mi;t*dg=OEBbWk4P)l2MARA!5&ZmZO zsL}8>m=67zRc^qN>x`83SjM?PwY`F$&#0vA4&s= zgLGU6=*bMQZ3yu)Kxcda7r$Y|%OD+GgE;r{gt`IeR<1)(uKs`ro)H{L^*#_ZvlGE{2rLQU1oYuc%z(&ji=IKa#jI9gW!f3Dv9 zORn?0^F#w6sbFd>duDdddc5cCnO)C%j(0pB**i{Wk8Fjpf)25s^icB z^;!qlzCx;>_`8Hty(?d+`Y!cTS`Ydx{f-;Xej#(y38$`Yvl5U`tU*jJ3i3&>dJJ{I+_mPSHW6G)MvM@^;sXge&+g_ zzj7-Cwq7T#v?%%1D=h1bU^S7#vK%W4ccT$2T}@$zJsM7r$5Ux-J)(JLaXi+)sR`&p zbO1PRpl%(CmC%EE>cZwAU6$zE*waMN?#|fEfr^Fq7j67t-Nq*7Y$VvV2`D<1ShT5R zUyq(FLfG1An<$^MiNYH6UA2+uf{n$OY$m>F$?=xuum>lfFInuFjK!bJT6h;(p;RLp zBdST&hbEwF5UPfsOWD}2gwuBP*$jpHQZ_O?#b?tt!8wmTJZ)o)o2QBDo#7f&I8TcZ zI#1KCsHrQskk@TA?Ho%B9ji_>Q2F=+_Dl100!mG&G7ID)s&)y>(j4RV4qc&FMy0K- zayOM`xJda3*?jteu=>yIf9o}CWd_==I9~TAvKEZg5Zw>`ZZS%qO4(@-wNCxdZzZpA z=SS`jL?vIH>Uws>R!^Af+l~j1a6qi}QqLN`3AW?E^_flJ>O(y$dXThsL98drgM#(* zdS|fK5!|UiG5iDI5)RTh6uMcCV*)YFjfbf0b%#{8vkP%eMMTCb0t^@`35z z&5)Z@WC&b?WL20^Vfb2uwpEsz%)&^+D)O-c37eRTTcRvx5}A@)EOq6our!fREePGg zh}&Xl-QqiQycTumh=7^L)4B+GHKo=vQND}pqv+dtx<`?>tI(t$6Aq;B$nQ&s(Br#{ zL=TI)vz)tfxq9r=fxLR{jDor?XxnD^-J$UWy1;FF3vx9Ww2QS07iv0hX;=Ss7GBOH zIOky893oN%7(RR$0ob|Hz?!Dng4i6fEP)QE&ghMI=O43|qRx$hhxRhtlf8g&Li zoO)o~G7nBzp2l1X5JkbTIU^p!+#GDq^5aFCZ-w6|bIdYQyCrw51T3Vhu%O0GSF;jr zJ&v|tj#iv=**TzbU!gkw)cHGQZyNwjZwqW%tLyJiSfaM+*!5QG&{k*Q4pD(t-}cY@ z%2i+N`#5!&p@Ay&{0x_Wf{#F@Rz6sJpo9ZXzczrb_YKZ@zr361?N>tD1h1HThs3O) zt8WgVt8M+dUb|TIP~9yqV$~&i)ghgLl!RwAY*(kF5rFQb*80?girq1*8>VaWcZJ=) z-ce`i0l?mys!tp8QG}wUC3=2Im-Gvy<>DEM5F2yGk-KEBf!53`R9CUp#1vhK*?Q9}aG5uV!yUad!Fc-H9$2+u8% zPLg{fj-1U|W`Evd2g^2vl$|*Bri!O*s(QvIYG-Vu za@wYPmu#YO7T^M1)+g)dFbJ<&II>_FfSZ|USqfMuPR?5FaM2?B@)q1ng(8f*W60eJ zr1S(irC}uS82O{eILDFQICj}*oCu~#z#P1P9D{KP2XNHlRLPB_CT566DbfZjwD~M` z*-G@uZC)#KzQT5scG)DXp~X@s-cxy_UD~Ioo?!x8LtfV~C^Z@J_k>yQV+$u>2PL!e zMKXTDtp=-F3!);<4x#5)9j6|xL^deS7{ONS0cyQw@J%4!`njI;fw0wct8EvQ`meuR zTY97hLRV{lhHtL*c#5kYyA+VLyxEg1QxD5E7roJy%tpP&_53NIC1)T}473SqGv(&$`o9RiJ()2_3B5WBo6+V0~ik4)UE!EF6 z)G7Y?1NMok%pwrD@aGR&^@}^L%K4O;a3?3$;&Ls3=pv(qqFk>0H(l9&^ggOBKje(f zGRDaAS(;3oG%7m7z9~#eX$mBzIbH>$W|il$#E`Cximg#IK;gi3wySjSHI@b(l$ve9 z*ftEFmCIJoAv~Oe2eW)WkIL=voi5y6#2hS>@Dk?Y9-^yDNvIwr^_BS|28*>`8Ufad zw~DixrJv}*T4lD#iQ1OJ<@nl`akovMp}}bz-ZltW&|tOAK)r$eppDVBb06nLo2ttU z4^I`%q)Z?=PXlUPztuwjws1td>yzF_v~4oXZyh+BfddA=u; za9-Ks_fpi8{o`otIBZWs+B7{xmN1YMBu)YUBt*@z&Y*1b98Y!3@*KOu+16;$4MsQ~ z5XD(42WfVocp>f_u3|Zays#B_Bp~c=+mP1f{~+cnHPFME+)lh@Q|WFIZUd6H0hx-o zIC#~>-S;T+`HXv;)#BBV)Nkw%YrROEhU)6j1r4I1ZifB1RP?YUy)_WFgKd|`ecU<* z=`P-R%hj^udVpvLqxcW#JbtOq{Y_QtbF{0QP`~36*Q=#Cj^Lv@0^w%Bac%32J(yP; zE~;<$i-5B_h`Of1TAb`>J2lBN^+!XG% z#PcvqU!{Qe4rPSuIDwix%?&-lJYlnp{bm{aH5eZ@|AjU|*`GT0ni@es^`BBwmJ&i) zL}8jBqs)n_#o=k>xspvEZP;XR-p0qY%Yw?k$rN`$iaui1`&e!pM zn4;ll@L1JC@OI+4tc|i9e~d`tXNVkrI$@zlDQhGLEaQMM5ML`5kS;wnLisAyE?c)CzIkD{X-gE9a1}roh~gDI1ET2rh0g`Nt34JC?6g+)i;_YG zQQ3thRRvI&tiVQg;T8m}{l7nOJFr7kDm9?^qpdOqm;T@`tNzIkLFT7mYaN=^DKa(O zM1sCY;H>bD;Hk<80;dcTu1j&6RzLGN^K}nf;iLRBD!h1a{v%9)`q?L}EE-DD!cXB- z>k0%FJxhR9>pbq)Kn|IDTM>|#;c1?46*%nzZ7Ri)0y$LmFJ(E^BxjMO5=4=HI>YP( zDMoOq&pvJ$Xd0nBQw&X=!nKz|>lJX+1gaF*`9H(G5EK29myyoKP zJf@g7Myxi0JRP}d`An|UHtyDWXd`yIHk|`^ADV-bvbMIQ0BHqE2x_osCI%&#&oLrs z6Y1<>M-aIIJZmVy21jdfq!xh+4J@}Uc-BIxHc*Xn+SI6uQe|HS?v~+R8C!ITMRhuJ za5Qt@7?xr9$##NXDM{;05{?)pAUK5uIE`5=fr8CE7N*(?(=2i90u0U)&Zyd+?w*Cs zHMr|`b`*rB&2H)HaGEI}R?cLFTd8`)8oi{{hbPp?N(@1zTvu*V^fabFg{U}41H$JP zN!NZfu)2XQ?sL7sKj}`jW5G+1Q==3#eH(>dAQrD&s$ z0aLY>g}4t;LCfb?(V_LzlDdxNA?KSQ?Z^`>h6d43zJr(A)>%1M#WK%oQJWH-A9g&Moz2gBQ z+w|*$0lkY`-3pJa^2@?Ft>5tT(w98-#iaoqoO6-2e$$ge{daY9`gS?Jr=y^M5X?G; zHnfw=;=dW-Tkq(KG$o{LaBJ{GdQ}rVwXstvV6YBb>pWdmp6)U&rpS|5p>BuYO zSd>48zm6V!mcB(}>{%>>suQ4zrdRQ|oyPYix(0;Tp|j|M4VjEJpZ0b^YK8xs)|%l( z#V`UQ?48Q~cGSwE${Ttu7~iT~2NqZT=k=ufFjFJIExx6xM8wBgnnJ!Wp0=|?E(c~#p|i`7Le2%YO(^6y14KGx_PoYWy1uosDz$MAkc_Ml>$&D&6tZMi#z-|>`6|N*%8tCA;+}a?Ov4M~+Z9x6foS0($gXgl5qg9LP=o$vu`uAD0+}mB37f-_KwiF3?p=oEE59TO=Ab%lIM%cGJ{#$`VJV z!e2?mY6_Ec7W~8+Tg@2h1zx~l@Q!(SNSKvfbXZvRj5Y7K{gpuA{k>SRRa?$V0Z|)6db{7t(*%D_uLgEu zy{khwzizJ8PMrWZ_Y*PndhovXAMjo4!M^%@aO}bUdcEC!nsg8zGXi$iy#&N4FC3$> zwz`MD8dle&{RLljO6olHJqMH*;dAKvOBb@*LBA$eDy&J{&RhxAK64$e;;pCHXeYhn zF;Jd|Bi!!L_ct-CgK8h0fp=o=Hg&VH-ueZ;`b-%^I);N*4E3|?>)8Qh-8BE50d8L) zHc&1v%|o)l@OhDSkCHL77;^;H3K4ltgk6^Tc( zUa&~54^{uUc&33dZ4UHZlLYh2~zhRPCZ=_RUA8E3Q{y9bJAr6Dfp_*8QO6?y{ut+T;!x2>NoSRKReV$E(TGJc z7$+W?_N<+Zz>29T13)umCL}RT73fEb^dnVzff|CLMKx_jZ+0k(TGaqV!)>5j$0Q`g zHWckhI<62~MZqYHMsr^+a9@R1Rj^;@UaS7D3d1V9Nq}8u(6#cV$9(eTHQo$7LSUx*dBBz^~Y)ml%FU?>HuwXmwk=6}Ykps8o4U+rFK z4a9!?3;ifQwUd6S2sP<`3_Tle6?u;yQ9WF0IzD|3$r`Kp>1H{ZWiDxzOH)aBm$BmO zkSySyrz^JJu5Lz-R-sj8Hd!h(hcZirW}@VlntVu%TjkrVvaV>&_`QiuNd97t=NlxrG-+Zru2B1w z`Cdf}qt!D0&@xus5{k3Pv9cuCWl_2rGRw0+AQ+h6jNg6OV&E}B7nK06f%tu67D&MR zf1BhGNlr2OLzM$1h8VsMCZ#ANc6In7KVMX9XIojYbxuKyZ%e>p#-2yQcbO7z5wp~? z#Hw7a5~;EQZ+Egn(^H}ZOnOh&l8;0zM_x_#nY86G`DVil&~(lU6J6+v ztUTIg2>Sa**Lo0nf1fQqXU=*v{akU?0b9lV+@8XY4ymJ$(F zo>U3eKnrcU#RaN}`o0DNR543ZtD>pu1@`FH=Ae&&D!D2v@VvZx=+qinI3lU^>ag&- zrTz&NYm@)ZyBfS#g>H51u1cG!ur%rQORzOhER?nba*2Maj%_%P^ELCqA6tc_tKz2~ z!AFYx{G%UO;V-dFaHJA7n$sV=$8u0M#kvS-1=lRKoJHIs+qu7c(h_hs@hA6M_H#Qe z$9rjHZi4TmIY#`Wa1`#!hnk_hViLy2x$Fei;4~67LX=cO`;n*<<3WiNa2UmEn!qj_ zBN#D>q)M^Gkito1R7TR52d&I-u*t*O#(q4954HniyHt%($)qm-qYgIWw*09-B@PMB zdNqif{#F;Vuyu(VzSsktXv1pq_>Lxgw2nsch zd{u3jGXnsrS{cSv(3BK5c{ z5+|z=cAZ7IU4@_`?rC|1fb9y+c#ZLp!beYGi9aiofO6l5PU{u_6L-B1iM0Z6KpXE> z`*GafRGh9Xg}Iyf)mooBtJwB5f~^AZ0J;5HKnEPt_qE+;g!b7K%C5hh^8Nbx`tY_} zv8rvosqepoSg$%S*a@@mRIAwxt8{@Vt?G_T??FUYuR!b^yLn}OMJQNp6;K5`H|}cV zJ;JKoR$A+~bh)~00aj2QC{{41OM$RzbXB^{cY8Z#=aKw_7K1%P+S@f~ECCRnPooHBjx@$$Ed(#+bGw9XQ z%(|7PH>?mkWvR(^B7Sk2M$cI!e8CbkmnpeAROGtCnwEv3m0jYq#I9M)NhRw_dSw^+hYrzGV5*1!%otV`$jX=_Q*O z@7ToAmQC&}TX0{6oSlqKaPGlC#A1(Aj!Dfb!1X*Gw+u^yYmBi(=$I1BZJK#fT9&{< zI;hfaMi4k+^K4i6tc+c_jQuT39&3M;OP-(z%ROA8b6bYgZ33No4CvSCoX+sQ4c4No zs&1&{l7bx6u$Y7bQ|mIE9p2#IGIWM!cZ$w!SmkN&kctyz#a1!4_g7?SfmhLWgK@LZ zM&Tul-1h2j34gpaxO79XU^`H#S_`r7XjE-!4{w$p&(x3C*K@T+ZPA_hzv2%NuSC=h zOo@v;MDwVjCa0&maw@xkxP>nwN5AxprP(KkbPW`~zSkbi@J^C%B!O=HlLROcfGlWc5w1B- zCPn~OjPp+OJS2#oa?#2qBmiZMfT0tbbdVe_@A*P3r}Mn7TY~bM)qd=_2KX=Mk>5 z155n2WoKq2-hh2gEVeChQ5PsdRviJ`WNBcxsbk}62%aFW2KpKjv^dxxa$2BQ&i zRcoVFSmIJ2VWFK-N2?_@Wh#69odWV z>qw&L;D{bh?e=q>yPtrhfG6^(Pt-euwT{`Rt8a;rH=V3PJ~!5H^>+pdx;jnmeL0BfvCwTXc~OU z8e^|m>*QsdKl!>XO{qzVGXD|TfS!P z`Zb${u(RE(R)MUA&a0NKU$W`cSsRa%yK|CS6C)i9jgafJ7kBIa8Ws7e^YnDyrXEe% z^p1#4Kfq`KJ5YRQ++u`3g?AC+M7Hbt-b_X3q59wSROu}l zw&WL`$6we&c+Fw~=^|FUAO4XGRu`)TxGvC@bnuNfk*Bi=+9l-bGSHL@S}{zjYOhKp zUauFZDu-3UzXEKJEMiU4qx#C8VxtKPwsfIKKx`dqkb2XQfmdXGmwc)%szS6VGf^Tr zrzX-+zqiOzCG4yzde%P2EvX<5D{NE<9m~NV}$SK@@OM=IQdY*p!RB-}*6qZkuOmo8a2P86+$598X(7 zl>JRr+wbwQ9INwKe!J4B;B{W*g~4hEj4D1#amAX`riyCx@=<8insQjM>$YS(1vf%! z6(uQSs!H#cNF^^ZR4>!12&XEHl>aW)Y?i!KC#qC9E%8}_>&df}8P-;@5myJpk^_1Ed_Yhw0^uypEeB-tKvRIt0^dAZG(&V{2AC%SW$GRrS!mD{u2#hcM|dwH zs6N1JA}>|8Z3YKUm?kUNtj9oMwn{T-PM}pYDDw>FJfGv3K}1DY23#A&HOa)M?1?Um z3Ng;}NXh}LI49}WWi+aodWr$c8Uqt$>u6i+MILH7X$9bb0DHTSIvIJYO!#RUv|^p4 zV+B~RF0tuV^-4;PrY!=T_xo;8^5RPl2DML5qa7f?*EfZgH)su#ea3DfPM;1q>sq!i zT=kaIRU3X>VbIS*8+WJ&5GI8_f%8_j%C6w*iw)jv$EZnB+(23}U z|Bz14Rial_6<}Sy>T}PE@%p?EtAFZ;6>&`cq64*Wbk@mjR|lxy(*Ezi^ySikFY6L62Ulco{U2uL9`ns3>)6OZN`R(w|M4`nD_35XulunQpdXh0;knJ#*->IiE7DS^??JruG%1PnLjwO-{mP`|{ zOO>S5j1ptkq3jvUOrN!Q@SM#=E?RV&0HtyKsS__-YvOgAJNbq!9EYYyuG+@YYj)~+ zmi^c4^nvSk>bYyS{`?J=YqokA${xF6^OJAdT;xq_XKvVB>4tS0*R9=p%bN37t=xUx zl8wt2%3Z{Ndx82Br^%dMv#BYTktG{D+_tG>1Ua4PSQyV=BA0RXrW_NY^$4s=m_P5S)qJ@CM46$DVo<>67US^|AA9PW&Vn` zMAc=CrfyY$uG&M}S`R3@LE@Y=tN<%Jv2?8HsxYVXbfD)j5IbalS<}cwO6&tVuMEQaCibt@t+!;p#*LYld#8F0>7-u*246x~m1)EzSlyK=+pw!K6t> zn<%{oi`SuJd??h4v`x?@(AG%4X~NlA)KUdj)<|8^tOzy!8vy}#NGX<8&N9%%Yxw>u zC{h}#C_5moXsaOC%!lu>;2+-Qs7;e{Bid@6!i`(}62&3@7LzX0Hw`9-(-d90UBJx) z(>QRB|LJ`e1+)o(n^D$I0@L%h1guZshK>InCSQ;oh$5E%Q}iz%vM5u|CwMoG!#2&Y zr-=GVa}`PM#S~XIP4a6Pz|K(XB?e}qbk{-d?hI`?%$;9LVjVQ-xbOWfvJq_RzX=w$2j|CE$ALUya0pZWrjb7-a@T z+~00V#bPe53pgOO#kjKpm}+2FMKOfgA|R@8233M{6$)ASM^a0rSTUwn=y57od&;z? zJnFEBDlenB%ivWYEzpXx>|2m}k->&ej~*`S@}zWXcmo-2a1ZA z$YP340nhA@@v)*#Q@}QkTUIk1$7#I*k@hztL_@{Etq`2Vqmw|p#$~Sq^ilM3g7;Ef znL>^;G7%F^r2&D$maFL3CWC?|zotj2$ACeV0eo5>21koGt0W4!!mYft!tF9`UvVzW zJm_Am0^F*KqOf}!W4l+Al}$?l8h8B9$W?m067&QrwQ85FUWDIUA|h72+C-_d%E{Qr z7i@53XeS5sZ3DBW-qE(;_s+ih2|?RSRt)J?f7ng?cXzH2xOpLBxovm5PE1%G0N6+E zBJuW33`^JoMRhcuyK^(@k}tYZSZCnpCo1+$(Bhe2%C>=i)R$!=c1P>&g0MI_5V`t2 z^?RH3^?g=LuU{TrD|`z;iWcSzv6j@{;-Vy;I&;qVoO@6dO2U$oXIqOZTcDRZ64 zeJLUee^Y79La-uJ&j`UZ+f^FD5|3Jk5uNax$8?im1UU5w1%Mx+2m_co4rY!$o3Uf$ zi;jTYv4dqhd8lfmhbv6yU9-s$C7EJ9i%vsO}Yj*Cjt9I^Dty!M9W@nzhZX3I= z+sbn{talQjJM*S>(r;Ne$5Q>7&DL*Nt$hPi@)Zl0U$)WGOE!`|Z$U6T6+6oiVc9|x z3zUsou<%hzM;)kI`1yu~pXFM1n3A8j{QlJ{K4d5 z^7y}Z4<0qIk%^U)fiYO~u#2Z&30Q#LF7+z7w&1C_s)^W!JD63OUS^lwE~GYPB?hN;Fj@wuCB&(4 z8HoQ8PUiR@e%}LED~c7O6lDXn21L~DP0ThGHiXo&)E-K6M}a>sS>IE{hMU8YDv~CV zwMDGVX&j{~mJFCo%Z|%B15X1o{{BPauXk7k$vW}J|BRHxvdbP(0-|ELTcez4_+t-P zm`JI_=aHt&f|Dd&Jc;)pMzT)?&W;lW7yUe;OV~XkT%zRZG?vB*PI(GyhOvE2!;)!~ zT!{bmG#1eqOq%9S#JSfg?rsw8o?-M>;BhMQewinx%JU$q7U_Lv2{mi*bhUY=7MNJP z_v93l#ZiR~PIjS52azSRO2W4JkBO*VEX0~JV2*Y7nHigfzM2K5jCgA(_6O=z7+H#= zVyakLV-#P7VP)CHSWA6MvKAmvnI@oU!3rFem!*h=&2fE29HV6{#&UR;5Q-&!GY?yH zgg50GRTN-v0Z&bybIb3X!Ey^X`Cbkd=b&N+;(4;F-s82H8s{D*?j2=h!yCVuguV&R zCWg&8CfZ^Pj)}gUMI3u{1a?M97>FUBqnv4sC5wzzOs6UktD>Tqsu6_}bma%?a2J+1 zTUAJ0fTukS399O*$>|p1rwRtFFq&9ky~Lt)Sbe6oMxcxG^1xNOXr*Q~-&NoY8{1@S zl!TR(Raf1gHB!*(2M9TUM4};a)qyDTZ51LNm4c$)-mcFF81!xS@K1cMaSuHH1<9+! zXn*bNFcpJbJ3BB7H=yWQ|BoO$2TpVm_NanGxI5Xna`tKizz-LI}Db@(A&fX>*_ ze49>pz)!7p9PR7%aQd~B#5eG32NiNedT$ zo@l!0eG^zvr)`|%nlUQktIE;geOhvMWOv?m0E%`!^9<`p0chZ=U3lQC zo&V`IyKv7HyKwIno+@77f7Q-Bgw6%D%X{$69tWrsZ`pj1CHXV!6yLT+>t|MKUAI`1 z_~OnRHr9OAf`yAV6*+5>2njzED>f5inOw5aK_%@_`G0SLIa;%}|7hLzov7KNVB3xp zS3JHKjZ2hPa%aqPdlQz!0$c>D8J74#Do^dt`P{7u?n@Hwn`Z916c+Rn#UtdeuF!TH zn5|mhlcg8~8yN$dic=F-FJd=Xfh%kDil>nP>-buvT2E;kg({Ms;`K6UU8QBMp;Vo$ zcM7W7!`FOEb&8#-icVxNwaztZTKdv6c-X{Lu@#OUwCyV1ARVh_BD$*042!GpmwJ_Q z)k7=As%K4uOl@oZ($iCJ4c7Z=Dryn~%4%DKR&Uwb_}3b!Noj9T&vpStyF`*fhZE3@ z(91yf6vjt+kQM1QM+$x&&gL;<)-ZU^q1H7ibr+&^P_t6Bs=V*h)wqD&D%i?GEXW3= zUbkveQqfitmf5lCl$3ic(OLyk6_!8&y4{{ZwH6?3k#DM+Ly7G?Nwaxo4-ZtRn!mkF z{%Z|WcAiYr9MuZ*#9$27N>CV?76e)2bm~*!YD(B;3F6qFp+U!a$l^R63C0mA zIc|~v3KS@E%)BZ@VW-smt5rJq3PZFCNye2gU`}9YBthHdq3n`kJO6mdx*%5xIP(&* zEFB;;_b>?Na|O*eS-dQ=?57~ogAs&FtiuYj*K0*Dsc32i`B(ypWk#VYjaC3yB}SUc zKdn$=txD#30VEb6Vg>P7rg2psWyH!-#jsQ*%&V8|j@{?yRWDaXm*lqev9Z{bMrjGH=VMV{7 zgs#xJtqmU?_{c`DHb*|6(bzx-(Ldkmy zk%hdITA6&7E-+#kiyz33S_&t{Y0g-v{%sp71AG}JM0W?PbE*yH(7Eiuy3#p%3v-Gy* zTW^zAd&8#YuGx6!icM5rqC~|7i>F?&=+uVACf6)Bvu4vXtCW!HFi~B{4ls&%F0y3% zrsr)p^8E0D0+ZR{dxo^JM~F9mc!qfcvQ|1#M$S^3kxZYNLj?=hnl7e*J*spc#cc>}Y~nIf8opx7H0iSD|J0<+8;sOfiD_A-i`-yZuon)b?95Zs zu3A?h={kz>H1@m=f#t$YP51e>bP zxX&1g0YfP>8Zp1TKfd{R$?md4)53YSfSy@3-C;r5o0vbhYAt$rXbCaHo57x& zCoZ=P>I)dI^B9GT9HD@yED)?z<;W#i9mxOrPwm}B_Q+y}PT)N)U~Cn4_3aYfr@pCm zkvfQh6zscuf+SoM6de-jy#l%khV^$n6Ic@HvTjIrb^o`V|<8be$rrCx}5g zgbWUTHIl&+%h=V`K>ktw*hOm+h%wUvMo==kNk@vO?4)Rn>sqzrj80?j} zzcucCl_mah1pUWX0V%vDCaw$qFSl%|v8_^Onc<(bKGKB_g5 z=6HEh2eMf1(y%wfZ>A-5L2VMereJS=7lUwqQ^Gfe6Dh`f5w0o4@1@~;630;nE1)EM zmEWvjdT4O1e!m$1{JVL~g{r11{;tB_WjHO1@;oEXB`IER?g9g;MFuY_X3?V&Xx^cD zS?kgBE4aqj=_RC!y|@J}U1g9J?|2RtJAak-GbH}H0@lVmAy0h?+i#^%!EL7k!KO3U z#ibOS+lKqo=!mWT3jCmaGoMGKb{N50Kdd{GhV+*6OdCT&kN=wX_KbS3n(DK>Dco`p zb}2eKV+Br6oE7g}#yV_ujJ^=nv3L03K|kOVsOvyNtZ+I&t&3-`k*I?VK&!P^%o);Q zL|m`s-xuZXaFxNhUj*@{{MD~$yr47Cwhp20P_GATU8Nt$G3+XMhlVJg(HjtCw}`R< zVfJg9?Lkg?$%a)PBr&!`?slBehG{&Qq5TDNUb1$4H_OqA9ey@vhxcGQ-baS%;fftQ zTD8NJEj)tC4YEY?#5?6!$f1c~HjX6EqHs@JZRUctCNElN>}6XVdBs+bzhP&OT(cJr z!qh$2?8PV94zTbWc>s_;{P$i%|=6#+XCwfff(g~K$bCpo+AjOL-b=0wYvgk*J=1pS|}S> z!%*~Y@$~f0kS(ETSJ8@V;AsW9FEbM z=@b>wyvDYaOrdk*MJB+^xXgTSN(yp4-Ngf?tPevh~*Jl z!y@g;uOw*dwdy!|!mDD5X(as=9a&O*toOgDY=%_$A~BXdh2CHsU%&z>G)kx{c1k(I zD_qMGI#!clw*g}vt7#2uXc-yTBp|4Vze~84UAaRVk8rz)_ctKc-Z6&_b{>3cj4uz)BHR<%ChJtX|WBz48!Rj@2SZQc#mHtL*}UH_wtG z@VO7^K5o+_YBPVuXP`wEP%z#UwH_ARK zkejC0&SL`=b_-aXOL)$+#G@6E!UgVA0dIF6SzSW@78!QrD5jiasFPDtGIFsEZUf4h zy<`5V8SCr}TOIJu5jUs|@(Nn5Ec-I>9ahrYfAqOkL1%^5Q3Pv6th{*;mBacg535jH zkOanV>#`T*+K(fQ(yH<}a+Kd51ErGsStM%? zt8*Ge=D}bd)aI~md&LR%QLJ*F-w#Ot{_k0!oZ&1p2<$8ZKgqAB=^x{W>nOrL3T%_S zpW;{3+K<6QUV>Y~-EHgG=>fT{%pI*6m@UFv=PLgtS(v4H#n?r$7S4*VnuVxKf86E0 zE`y~&mw($G3sS^6 zZWSg~??$Zk92<`(zF9;9NP7CnY?_qGxeT@K(2ZA>J1m*R25mdA* zYez9OA3*9J08RUa;{zqCE6v#n477(P+ID!lW0N@wL=-nHQ8;CZ{24sCR7@l!IThTn z`s7&xrCzX=&}+6ndfCn(buS#cYL^I*x`b!;#U0n|q72RVTxAG%#m?Tv^6fY5g>Qi1 zud;movc34#%XaCTuiJ|(7eMp*e|m!g58(K|tG4?1b?ZL=rnRQtvQGZz)0QUdHHW zayIth6w}~EECG&_Pp2&Q6kc1r)?x0)*kR^y4^jkUtY#+;=WX-=Mrtq|d2Gf~yApVJ z3AiA0zDQzJ8PQt-$0~`VYUv#k5tgy7ErVlC*G?l^VC8tZ9=r=#JI^uz)PtyCm~1)6@vax59W< zB`HMX+xG!tZRlCiTF;4$)S|Jwk#KxG;zbgL;rN^yDgB$BxE zaCHG5FX9=LrEQfH7l*xwI&!K9C+85R3hA8VR;Y+y1J1R0uSIl~=AsjS7hp;kHi*7+ z2+LVY8@99{4K>w^W=Cs5V_BT%Bz`4s6@?7v3lh0-H$}2g4#}O>!uvUHUX}`EzcnBPc~EL7n9WoA~QY?8Hr9Ho3k ziet@?6%=7R&i52(9D|`TSUOE2ZTP?c)DnOHl*M3dAWWq5AJ2SYmjyqw((jA31w^Ju?LLuE3LwAuo6QR6F4iZ5% zTu$?un4FRnmi$Hfr}T?yEFpd|kYQ->J0(b4;PBNe1&u9iO86BmT3u`1%ETnmM?SRQzYq!k<4TR55@sLy{mk&vMtN6B`gn%t6u$Py9g~Sv=p(3C<*H&rTWfiz2(kYspo)p-r__Q zoVRLAB6{;^{j4CFj(smz(H;`z1l{Jhf(sf*WUo@ORhOvqch|Y>&;1M~z2$ix{aoc+ z+3XTzo476V`X_9AEk@76?Z;p1CVpQt1qj9R2nxmW4$232o{^qn=X#8d+sxe9ASW&T z&m$J5^26lg%y9E?#11_gwf)Z(?Ac>g+fAPBf#Y>Mc)V#x##(kX+Os2(E;GKaSva*o z9Vo23`O`Ly@{G#=JGo(vlc%jWe!QkKIk(vL<53v|CB4m4s zr(fHuAGz?cd%O&@+`VG43RbD%JCc#b8+08Dm|&N2X35elXnLK|#q<{ZgkS)c>T2m19{e6*U}t_|Q?#7)%@i4DS&T0F3Ie5EbiZJM^bjlHia zdn(YaAm*xoRuiF@xXC%rB+r<$z*%K6{pIeWj32+Q_mZ+2PS)bp~_V;~)GNi{UCxLb))e_otz0 zobygIcFIEB9Jfhhi5cl$#x@!Bag_O`GTcfPx=KUgJpU+FP!f%^loe4C=R7pdVdKcN zWT~84;h)=t$Td{5BBV4KN1ptM9E;Rr5r#?Y=EYk08c^WUUl*v>CL^(wYLO)m3G*mt zspBFHFNnmDE{{6SL(@FHmPjm>T!FOWyVP-k&x;Vbgf~bePVzb}67zYAHlkSP9RAuO z^UCV1vWmxY!!|Z79Y-XFepRyXix|v(1b`-%Q96s$ThYymXpYb-HRXtCoaNXhRJRP^ z8CrIU7OkSpnz~N~o*Oj6HV>jECsGSn`uHMkc!B?hYEShTLQDO2<$z&K(`8#FrR9uS z;J11#iXxwfz&+kuL>WsZudr4mv}hbq;m56ON-#npi^lT~vJo|*RLb7V^sQ8Y%b%(T%bZ~!86Kx5t@}+6p z6NxOH3|XW%`u0Lg%d)x@2p?SL{5=x|f7$Qixt5-0CIbnlC*BrZGgH zzMr^fjM8g3goWvIsO1-g=`VokFI=|3C0PAuFMj#5y?}l`kDfmDk8d#b-xXUVxU04I zx|PS?v|{`%OBdcGSnQfbTUV*Pe2ubIuQ6ND%XU2bg6+?qw>{~z_EhGKJ%(HO5g`2- z`u=g&Pc!4t9tI$Xk2GxLaMMQ7&7o&8OFz%d2K$NdevE<3eq7}z>UQ98i967;=Z{xx zi~)>hJ_r)9HHo=8L=lnT{RC7#61Ay+*l%g_1k-oX^wG~%nXno7%T=&OGuME5nWiT= zYf|lbn&<)p^cDu}7R3s>xbT~N-as`sX_8&KofgK&HiKo&sw=@CcU=v;U8ky{Qw5*7Q8WzTBOG76)_U&u|H+ev zRCdxUA;V;GT4w3MG9%rM4uJV{9{{I z=v@LL_kWbM?=pZ`0^M$R2g0+TVA^+RF$V=yV5$pAT3AY(5TcFtlT%qnhvFx2??R(8 z+Rqg%YNV_(Q8-vSIbEx7B{b8PS%F~_YxVc#%t?V6@PE^{fs#VD1 zoPtWKG!aNKBG{f_@|`5M^fX6_6Ys19+&~i8emp1I;g(MDNd^K&Ima2C){##U_spJA z)-gyNXGwGX6w3_zOp>1z#_AjvrP*&9f(OyS3MS5j1mC(N`F_nj^3i*zs>nCF6U^pqW5um+@bd0zZ;wGyf79+oJ@cP+D*B11fK8b9P&K9k@0G$VSE zT3MwUHmmFR$Xwd0YB>0Wc>RLt0?zve43glzm8=5E;5|)dAbRUPZ41Y)p&jW0ohRbz zW8r)g`!}7Y0-+A&c4$vM?h9GRaOQWuY}Ijt3+yTkmq~G7N=gaQ<$&Mp_wm^T(eh>-mq7J@yid( zbWPM2W@tA>%N$LV)`npGHB8lC!fgHd*X#nzr7ygOc7DxXgvsZ>f@c2u>%=0xPW&-B z#K3%Z=XI+dx^B7YH;LJP%O)EvJ(k5AcCz(4llHx8N72puLGsg)4SOuUVUMIX>|s3M zPZZDCuGo_8nwYme!Fk(HB-g>cn)Cn!gXUv<^3-mgvy%sFc7*qyM>8J+$wy9dFNm=o zdoD*Utc*=ikt0O7X7D*CO4tFChcSVF@2E|ol~ofb{UFMK*y%dHv^n~mF4SD4uh8V6 zU2xlG6fFd|FkE+N?=5Uqn*5~((dz7@!m~cP1Z`f0_*6$;lYq`*ne5P)EYm+Na@=|P z9L0t$(YGzrr)k2u_sPn=L>Jlq$d9b>fq$?fKrXS2!edoB9_VS&SaDVEdZtN>$blX> z{^e5`LKT&z7lZZEXP8(IHLp%UiN~i2-o5~s1!+}#)Ql;r(BqD6gg#Ivs=3E`XbR;e zx|XgSvmO4ttA`7-{fP%`9ssm~a2H9|0m?Eh%wi^<1qcBV`QO(uUe^(bRVp^*5RoZx z9L2<%0C9QE07N`f8C+B`db^pGqogPb6(_PPjcU(eLr4)Xtm=sg&Ls)96`P!=^Au~7 zGFg^M zU=|Mx&KRF#7=n|;bB6(bgzpQ;fhp|ZAD#lGK{kRIw#PADPf$g248eTzb5Ggm7oM>Z zAsIBE0KLa?Jdb?mpp7!M^kL3*Lik2NkMJuYKAU9G_m6@0W5j|5zX75_@=4N@M~T@U zW!NzaR;Q46(+q8nQ3Pe0GYN6OLU`ZPz#_xYM-K2QM01vrT!PQ02}MZqxlG+j>SUFAqc94-?4HI7*3`vnF8 znvveYOk7;%K>>aWNA*!lAb+y}Jk{arT4GpN~_x?r^p)O%c68>4lghgI#)c|n=I=P_OD+j0phuN`qaO4qSZXw?+6QE4mzU^3wx%gkd>J;{oant7hR>7#7MLz5%J_ z?E^8beMIBR2fl8@I?U}dP>aA`Dw4HO>Gtmdj6F757belHwbgai*0$_FUc$9;qS@ArtEnYFdp) z7A-IhoS*3wG#0g}YFzH_dC}7$UPwWTQ>fGf8NGe>d0ixkG)6@s>bhq$5v_Fv%mjc zMv_eF8CXX51U6vtmidp}OE3nZTtlk;q4LoIB}{GcEs^++vy31Vd9n_5S6SBS7FV#C z&Vj61tiS>J!vDh}T}+QIdjV6ji+FIjfH`>{b*B0Ev=)RrboULu+4w9zWI)zrX@G+= z%C7)kGK3cka0S%2^i7uTET_r$u<0s3Oeof*d07CM!=#;I>?xI;#MYNmRxPNJH#HE4 z_Fq%Nkb-wJf-phEvN-F51m8?@CQ;xL#bTWXWC;Z)6O0@NP!W8v3H0X->uJKVgIKYH z0v38W!kJ9tRh9-0b2cHc9Y%Xb(7IC~dYbJ?yv!j$97K5s(fH$lbn?ptMdM{Yfld~9 zk8!mpzID)!bH$?sDvYpee3kE%fLn#9RE4zy;^+q|{HdZ$%b>r^s8_ae z57?%?$y1$|O`8#O8go+)5N8-3q-nVY+Gv^giahUSY!M2;7mPc6zXOb=klQ?U^SmdW zyGVcQ#j$wuJG{RDVtc%&QMslU?ttA`op(Nh+^N@re0pnHzJD2rFU*x(Hb`A|-+^@(X`s!_e z^{~{jms}nYS_c@`i){j#kU9WyKmhjQ?~Y@AG^C`;UzEpU^JcyH?b;HG2T1mPbwDpN zsf_`WeHzjsd6@;~{;cnwTCB^`&|!zJ*>gcObP$a_H!5)PF-CHJXPmq`b+@FuQ@KA) zpdhRd9q3-d)5F1d$M4xY_;op~8`m#KCjS0w{Uc;f6nob}uV(dLV`L@o<03AP4i9I8 zpoz*3Mw*D>R<%o^!jM)i*a^%^(ClQa2%-R?QnWMFSG9=0oR@TuUVDouKa;F83w#*6GV0edv9BG z^=B4Y`$Z3HReQW~*&YVPPcX^Cp2j8H)x2c;m@9BM2!0ev{KUw- z?Hb2weQeJ5QLu9V7=hSNsBQ=KJDw*9n~Oejpll=0=9upu%QR+#Aa?wdSg9u{QaMTe zlF5g|Hcf4lI4$#ow|#7M)$c`3V{@hAt4SSqc`Is6li8v_SAFvXFYr1*Gy_OMqBw6`9^3 zEqI0SX`k7Ej#kCFerbW8Tn7=4*Sodu5=?!FP9@(jsqBQTTW|C~d zF>JUgqNlPDSvkTr?5<7ZLj{5>a#%iMkL+S3kd+X|st|{>N&Xd4xERH`9Alki|1@Gw z91GaNSpU#IbShvAWGLQHXmA!KuqWgMG%2>BZ&pf7~*oWX8B zLqyLM*A|3HQ*b#*?9>Eo8f7|!F>KruBr8wK4$a781l#rKXP>sQFYU1r{-wvUTOUF2 z9>uGC{GSfliMx;32@;-8V0qE@$UhyiF$8n)`y>_Lebho24#vK+*AD$H%td5BPrTR> zJkz6itrdZNn0s>q-X8qyBX*FApdl)`g}=6!aRAvsw)-e0dux|ub zrxdl$wPg_5Nm96CFgo!G5~$ff%Y9N+>PgbF6N~^=3UiW2D+-S_A#jX!ibwX>y-*1U zi&3~lMK)3hfGl1f%~lX24PQ4;CZz=Pa%U744Wu))g|zSt#FfII!UUB9;3~n90?irf z2zfXb?I+DK^I%zcmf1SXI?MM1Sp@eV=lM0ctE(&}hK+TO=olu*rb@n&s$AB+0Ri2@vQ)AfrKVw!Qg)Rr8}@b?u?JYzx^KW1PKBrK0;>ZSXbsrx#O|A$g_f-Y zTeYz4wLW}@%|zp2ecq47>eE~HYxs9Fl1zLTdf)LMi=wp;e8U1Kf9r4U4oPMit+kfq zRp}t@FH`g;sogIv@&>fa`vwe_Flc1{)Q!$szaysgb+OsGt&M&#*yi2TadhOt+KKM>c_7u@u+9B;vq9h2 zuP6XFYkyl|U{X4gODaRWOy{+N;L?OxE$nc!JbgvlMvhuhF#IieyGZo+j+mmdELp=*mP>h)+HjQkC-DyIpvQtY|BI3D5RCX)*qRppBib@gU6{FTphr4C3A+#8uy7dZT=^O1?4QH!pId0-|Few*xHot1S@jmaXUb5ZtI;YOq_u*%f7Gd-g!6gu5Nj*pjA7)aSc?c^Q zeU2tA%hCbY=vSKe6MzDLbKL&|hzpd6RJqe92Sxfc82p#Xbu1D>QiR|s4B~k?-{{4% zqz0)#VI6x|6=Z4lm_P|#b(;z+R_NU4Fn+WM56b-BU2q#oT=|3VF)8gI+-1uk=`_~A z)*pS}0wbvCp$Yz+VvrtC70sb#q)?ZDpnx`ZsO09BGxw8MCu;w$s#JRwP7KnjB-29! zG~iH`{#tXa_2^D}82u`sT~pYJu`M3A78dyy>a~FnQpGzKvAi#!H@YxW=IRctoP{T< zJ=x;oDs<^N3S|^wLmq9Jk@h4CTKZ0`PU6GOP}iz}t`(y-*?Jk1vr5BNd9*dDd=6$5 z=#<5o6z35~Lq^cXF?^~?SexSaWAZ0Qxqt_wP&F*F(1pezOO!5F(a%#*Is~nQ&^svA z3&qCqa!(QY9434q#6$~0mXnMwra7}o6z4dEo8)-%_)ZbBHi_b#;$J!m#ivl~K?ZK4 zj69B$Cw2IfkFh*%hd%v;9l?YxG9M*0;V8b46Iij1efNkRfzn4H^3m@cv7KD;DBGi? zP>g&T(>8fk2O;zb=IfDf?6)y_oQdu}NVN6=)Uy=yF{pf;bKFk`-60h25!8GLOvfpWJ%Q(Y`mdoiCU=!BQ4D&V@21!{i5WY>058GdPB$#Nm=?~>YrSB#33!hN|6L}u1pjY%F zw4=t8Sq7nwV(_e3?i%Yl%YUva;ffrII-J%HE{Qo{4m-0LtwKL}97l3YX9(m}m_doh zsK6tu(RLI4quHL?jIx_N&TSsUF2m79+NcU~bs09!v;Q(b+JnJM9J|9q(V_izIjLFk zozb)=Kc0u{a~Ot}pPHhe&NzH#hzrkGILBq0lNa%#Iju`RlRMs@5^Y^Y?YuPTYau(JH;0622eI~baqZPF{ViA6+RI;Q&uzET*=a6B2lN#$!6i6* z%(fS=+@`oNUHo9(pU6l+c9Q@c?wbTeV_le=xBKG^zcacJr>fs95!l(jMY_CShEw12 z+v&wlbYo=k*V<*XFf0O7*MFZqxGIr?sdOICnTo||dTUKAs0!!GicjIQnIV{Q(q*DQDCEMDdN4dGd;`0;vz9#Wq4LeowwQS zE7r?mW=>GJWBLXKK;E>~-8XE7Y^YWEyG}UuDRlE`l9D$_N?!TqWeQAPwz=;xEfViH zdA|vByW%cvUjEJ%icwu5vF{2g16K)$xMp)ZZ&>Bvn@qj*7Rl0YTWId*Hofq33$Fg$ zPOiLd#~0tUV~antBbc&x<7R%M`-VN$yll_1JXd|i_GHi7lhomSWO~(}!0f&om-wF0 zy6q-TZRayZ+s)KT2X^P}@UFBy_fW(RKasGbKb@rRC(|k2H)$bE(TT?~T@%3-Lc~Of z=t@6Gpyu7AKmLfAIcev6sVG2ct{B~K5rP)zy32G81ptr%8acX~JZ@rQgsLTcW*A5tV9P=fumvJF> zKYpM2tP@z!G&^NL(bfNlSHtDmT7rSfLSCddtka>)4pWhg2!<9NP#xQPjbClDpQ;hp z>5yvl+GX@;i)>{@y39hm4!5WU=~`${)rFp;gOlgH3VY*J!&C-Rg$^u_RXR;CAETs) zW)@N;R+jy9d{1RS0%cJ1?jkHKF^I^qF364#V-gTwmRTn5yPiw9FS8bp%`=8cXA6jk%q-71Da|7?YfnT)~-Ftw>y-qlN>ksIN=DQmpzv<_D^^q!ekxLDLo?cETFK8T8 zR)K#kNEQ;-Y)?(U<{M3ugN4yD!srHZ&Ym#bJFHbS;-n(qOTe)6yrVmL6zhL64BO7FNN~c zfblk)^z3s0vPiS$c4@?HUen&`X3j&h_QD3~+74fY$~$FH2dM&42d=w?B7X#E9l3eV zpBcBfb9cVF{KqCM*A11&V)ycTz1>1m2bV(AFA0V7q*=#;SMlH-30jX6SuWO-9@2f% zz4gcEkJ%+Gb_CobKz>O0o1crXeX%Ofy9LG$=p}%=g#?{TdXMyNA+qqaL_q95hgh-0 zU#DvCWFh(hyY&Hd;D&WN{Qa_?Ddcqwn7i~n=-6Snz}clEy45jjgb5wHw$dU|W7U$c z!g;O|Ar*Ty^+j&|O?-bF^y6#Ity%KREaTyFfO3j4b^gkT^;Sffi8*GS%@b@{^D;+r zfC{s>Z_b7QY6r@+D<^_$HUTJ4F_kNuW}W+SrgG)pvbh{HF(>cX$^_Fr;;hv${J>UN z%VCA-TB}8Oar;AX0pIh0@4080n+YJVJ^MaYnL8}|d52DkyO!N|o2Y!tw&d-CJf8)~ z&m6*XjW=u?P(EG5`VVc`u7^IfRQe-}%ztd5bwK&_M>ewYf%y=)2ev-6uFX5vxOLyE zx9(Uy{;!rZ6>MO^rg&wD##tAIh zX&d&0Eg+&>$_SqV>?Ev<5rvaPr~oGUJN-O;B>P$S5KfaoaZC^gl<;I!|3Z+?5PP&p zt0wYJ5OX5r@H=(q0gLbLWjZ|yt-u%Xju7pGfN_Yw1EkS|@RA6}2`ZFn_*D$6P)t2F ztT5mM2{JWF#yP?KP(`B*U;dXP0~afqp?v}b~9df@~*{v<0SYU0);_?%)iSsGDxl8~7M%o7mq z2mn4x%ToYw9OOTEF&W1QgIc4g=N}7Mr${!v4nUZ;W4^U0;WS7x5Q725363!o%n0G# z%RBa?zj_gd2La9j0Jw!>dJh77FF!?(+*)+053vmpZoP!)ekf@_AUOz)93&C&$y^Ok zcT+I#MY1>T77-k;+l1CR&!KLYHCWC6anFrXYnln>GZ7Gg^>-bTgu zC`nTPw~pd}^KhCXF{o7=w^~diRDk6;z#e6-sSw5Vur3`8&IvPlwJ1DH4QiEXh7h*vm^z6i?V$;(`CZfpo3zX33B zu-_zM*yO#caam>MH8zb>+(Iim!+kPkoZ)O$XM;zpNc_2$hPVhQpZR6wAHf;GRx7g@ zvfx-PRC#!IWoHn1XD*1t9+<80Cy%NQf<9kMNsriRbyB00Alvo$I7D{SqlHO&x*nLv z>z#!UT)VSi-PNldM!VVf4yc{4THyL{o&XDdg~q~WhrPSpk#5=%#C7D>Y1*w~vWRj$QK=A3YDvJGz4&=-^lfMY4D0sj{lfPN#;boFlnX`}$eZyKT$`OT?k&O0>-nwdmnrm$Ua*D-$wI3SN(x)wSQhsfvE!ua z`*4&(RK|!Y31V!5x|u8|W7N%3NR4B!YFq-+93#UM=+{9ysr-k1HbPnyK$?sYqcvD9 z!s~|6FajjW!2^9vB&MLr%4{KEI|9Lp5Er8mrx3?O#M3xd@DRf#M!s8O|I+vW9kIZF zJ^*2U)usua6ReW3rU_U8%qE+Z;=cdm7dFQ#23nSF9k@LYCvecrMJ*b@ofcIn#V^pPc|_P1Zk+^4CU&1LiPe7 zdzI{8OhDkQ;fu4dbxm4WmB>d3UqpYNg=ei0`sYzjr+}|4imy6`r(hK`8o0@0C*aRn zpmLnB<7R8A`4||^0LkNobTQ=|kTb>oS-?AuaX5*+JE2-J%4*{ABNIw~um#nD| zwYm4DZZ`J(TwUlU-K#(*`?*3f}T)qjfw6 z$NpuDwWES}{-P1cZm=d&gf7(Z4q(5TT67B;WG%mDJ*h<#Jh>GuqJe1D!F%cjIy*TP zdw6Ug&+UWvcViOw@xHv&y}R+ZJ)^N=nz9|CojS-D9{{6AwLyi0hz1dT!InFe zI}7=o0o~^Kk>{Z&)ADps;hp1HgUO~C2a;c#QTu5<2Fg4|?m0yTIw#*ZNI3&KOXbdz zgU)i&XpsypG3=I4=Jl7z0+y%{%h;viU0YD`HL_D7^)|=bWX9V(U(|Vv_qK(+E`(m? zL=%Nx;{?@ylmDfqiiOPE9G@ji5IUdZgq4Hn0@y2j_6VTAe2%R6{AcxMbv@?M+3DDV z=iOS^NwnEv^OwJf$$4xRnmR<*oo=-y9XL4_4cm<&*ni{@;IM9sle1cB;z~wKaEemt(ym#g6OhUPp_Dn^b;x zgjndkpRfD*%{&@f4aUIeP`OM1b!3g z<^~zv4gHo^Aqhp7@f^6Z<(yTQIV-mbm)o2b+jtH(IHOhw;7imu))=OX`A@0zmF!37JjG;y45d~}hei7{(KuroAUP0ZY|vFV#O z&O#8G<=brcIYybD{=ibH4=l~n!>P{umMXtT@4_8Mg5IW8{}v|Q_sKKg$KrDfo9u1W z-a8ERxI@py9h!+C*;2+)z0XsvK7Sb19Mkuu;`??El6?j=-(VE>e1!3wxsNTg__3uo zKD7i2czFF|8(zO}gN(%PrSjZ9^`>=X-=Mkbb!&=h7|CfX?OU;eh8ZgzIcpUd&dUck ztfXtvDt*f!`jS;6GBlUPt($7|z&QN$2kW3(i@aNx) zMTixme5l}l1iT<5A^;H|mDLA$2r-MJ=x<-K0P6TC_xHe520-(kzddAw|Mz}-#P^?G zvCMxx%o@Ge)IjiA@NSMR$L+(A?j`7@XA>~>EPaz%&}+coI{h%4fc7Trasjb>8Cg`L z1lNF5O`29z@hoy@(HbB<2aj3;pf=Fq*8%qpq{$^dfs_1*Pg4NiJP}1^)D_~^8th?} z_&0}HY>~5a1u$Ia6;*}P=%h7j2?B9V8JPv}rVwk>fT|jm=kUf&@eU^We;E>p42i@9 z$654M$FfNRGL%Xucu$ka5n0~kIMV%?UpAHuL4L}3_#Lwe!30dm{`?{9?f zVMHP>%tl}yMobJ-MGWx2gP4<}#L^(|cbNa}}R{;61I<4xbP1f`z&xdQ*A%J&0 z-C?c2;(ii>R(N&;T)CQLp$&j;qay}b8+jyp&wdIjJZ8JgkTtxwd!)e+7g z=Y252yAgaIC1DxH@HR++|Ityt=)rFsHy_9z1c*m)>~%5J#*6biKwH)by3Z&-isr6F zNj?MQmFnc~Lp2}z2`yuQxcB=w?S6(!j%>jP2_FW`hk2u3$iCXehJH|HUR-sW%`)^u zmhU(?WMM9u@DcQI_EC%$4#d&6(-e`?oPZPZdXrR7V62=$3(ul+WjR3?0AQ^cp|zSE zh&!5%Srb56l4!9t+Le>f={SqgcTBWoQ^ak6Sa%1pzlk&EDDmQt3tr@jSwz|giwG6W8 zH9pH;`zt~CX;O*P>@~w+8)M2D0{S^F%nPI*qG^{1{X%f97Ig`euv;~XzXj&%e-?IM zp&i4mAH`l4GS6is`G+;O#1)r6gIw1vB)oBhvjoKXlC`7QUvY2+i0K{ykf2_-=~%bz z=-@hX*q=vncbERyp{(v72*!ot`MpO-?p9CNfrD{ZNOr5Ly8^Roq7qsQ!Sm=XBzMiw zg6|#KI}h4B>#^&Bf^`SoyYtZPaZ|?hmyp`yR>2T(yYZeo#Q;aF^QCG>teq0B&*I7h z4z3?^-w1tFqS$)Ij^EpHbw00ik$)u**^=U);Nq?JI6jzfSWiyvAr_o0O_ zb@}`5^SXEGTmaI6<1Cu@3?}c{C*QLyx_Ao09YYU~9lCAl1GjJ@-Esyo!S&hw^h#@p z$w^?lbO*9GI+&G{F8D|S_ePF}9mmy$#5Iwv<^STYB zZ(3L6iZymDS$S#3PIWC?Nsyv-=d@syyns||A&0nA$lA2o%b}|jrPO_f>qQ~*^OcI303C0OXLd$qR9^bqQ#EBHe!cg z_1lr>yjJkbPAlWMA+%DasE%(L`}x&0u^1Kd0Lp z2=9e&_kNvX|F?=M0ST(vApKt8dW0{_OL@DU6+hbbzxlF4z;^gVz~W@OaoNm(>oK@? zipw&~$vCBrFMkF-eU>eUN-Y=WG(V^ydmfLtTgi$XQ>$D#m7J`22FO=ymd2Y2n$?yy zrKT%tJ`+Il6pk`=Pv_v+Go`#P8ktttP)U0hIM*Ok*Q>!vq*b*v&OkY=%#<3@DY)LG zr$WQC1=m}gc&qq_)-Xh9oaZtpiJ*I(V}W(?IBjZZ@bWEF9$Dsq;b zz#d`sU*^GDJp4N0-34bwkF4 z#;!)~uvwJ)OXAT2VuAh_`E`kIEOD~9Bg(>Jf$|QTa^T?DEsF7Q{&Q$A^;(bH8C>E< zYU|@Xq9c)FJzt+q$gH_1;_%uFn|B;z4v%@2EA+!%*H_D{N(%Q}WTsP*=8$O2#6`%? zB~GSI2+cMpqvTADhg_$ocYwUOTV+pZLs*#?=5rj_m;*$mOS^7g}~yGxwmaNdxQ6I-F)FI z)<1gL+UjSl`cTB`T9>S}Yu!ryXRNGm%_=Z$H*_yp3%$)P^f3A6@Vx}HtX`$CBO&uWD274z6FjFX@(+GE2{>~BYvcG9Uv2CU+2qZwfj<6h15V3oh z8uZX}-PX@@`?&B27|Y#@M`i$lZxH%C2&VUd*=-^)V6)8PLo`)+d9J!={NQn%j5^AF zLy)ho@0D5?!D;|Cv;#!y!D*!>1B*1?X&QUd1Vm;G&-OSt?Bz^e<+gQRL~y(a5^r!q zY>;ZNz$hhp&(lt`2n;U+U0P&)8uPD8z#2F`j-_at2(rN3h6P0*r0#Vh)&}a}*^UX@ zu8Z3RR+Tb~w5vtTaDi#C4a}PgC2S08*(Z8L_MhluoBP6aCy`%+|ww=#hNyM$8B+x-jZ70p? z0K$7QGIWD1-I%7@I8jNexK z6*}ZE>l9oA!2_^g!KwPNJJD;ps8tLB#a&njg5)a0ypMJ<>1Vsm`|1GB^+xOY5%q+h z)LIWKfb@N**t)Sn_I~vQuzwO!NU)4v|J4F(V z<`fxj<~T4(Nn07SteDfl@f1)jcrI48`d`m;-OV7LOB|mS@WP?h;3$xt#iygPbcXvi zuS~*vmQy^ZmMcJ9Kt0W-S*6poXiWpOIhDWpnblXVM#_1_b_wDF z!sKER=RXk;Uk8N6mc^b0$Tt}fDKHj!78twcD}l^z@nj*bb67d{EHDxxyIb|gmxM20 zL}MN6juIX0Sh;nyM=zKcza6r>iJ!&7<2^!8)sr1b)`5d$9qcIIpWCtjJHfA*vYW(> zsH}aSH4C1F%-Rc_Jv!JeRMzV|;{34iT941`-wvTgn|JBRRjFNFS{N+q>^h(Yy3Rkg zJO4r52l#yAwgYv2W=Fu?ux-bfUH_KubV9da+PUwfD>$q!a%hhfcL`|L^YvI^wMHOo z1fv{fm-+e6az3BMX}C>*l-PY1W6%b{X_a4Xl~iz%ZvJU_j})R5K_=k|vHEhqAC{eqxgopW5Ui2)+4xo4EJ~%U=J3jbCGb`FA#c<`Wy+yl=_nTNc6P z7S6n7qhoK`(C`IoIUcvp>YTMS%vx>rwAHraBx{+m#=&)KqlK)ei;{Is+FA;O)`i8p z|24Q25@rgt%m|r(#Z1ZPI%$NY>_w?;4*oPn+?yb_Ww|W}L(b8+I!Pc-LqQTqit5Z6 zflvA1Nki}c)j;di6eR2}?n51bo2SH2zKL>1_67~uRy$n(dtrsA| zb0GCPNUf%)WsrInM9%%~L7SBa3w=`t?ODRb#4oG(VVLq%7hyT-1lC%XE1-*X0k_Qt zE95EdJLj9Xv%NXHNEPIwZ$jP(231WJVik|#rswJPlh(^aaoBOmMMKZ18Git z^$^6l&?dMr(vQ>lj8iU729hA54MMnsAf=XR3UdKOxey|>+XUe~S}`$9O)xC9<~xZH z9%KAZPn0X?Xoznv43h~E?p3lLhOG^N*?k1^ZfXskTs|#0?wg_24KTPGE~P54xDLFo z5cEOA8xTU;X)NldTcB%izxCi~=#+B|2yJ<}*BbPAItGeJ?#iLTmB3jMG`jfNemnBZ zZaaX|z3*Vi4jc;D;RB;~1O@!qQ@leccJX8FRs?M>`B?+cZL~7za;@MQD6V;?-O9-Y z3MiMCL62*x(Rlc#YhkXU*X@+XE2%P6L+Ptfx*K^;6T(k3uTzcQ(nV!?0Lbs7Icxws z`QVRn$^qSdKy*J$TJ~@+r+$;*n*Te*FWAqS>Bq@7!sg|;?+3JJKi*>9SI4Z z>-PZv*9&ZG1ZtGJ(-_}v4%6o(&X8$HMvmVo%cUa*oum4oE{iF0tXY`#9C_3ffSd&Y zwJgUJzoSQ!!S@KFGY+ChxrGAwznY>RIL+Cvp(q)AYi=Pcdau;fHLk7;&W$Mu(G<_j zk<-nv&2ibzNoa>4t?(l2gyIeP!2o?Xz>`Xk=7z~bCQq41n$cf~H?NXeYN&}!-KTYJ za2<#_i#2NjNkO&ijApMXx#y^fJNB%pLA!+1u6n)eB3?4jWpLUfur3xt?-5saoEdO% zqrUctISZMzcXeflQx1@X&UDD*n*6y3O@Qqr>SDRMcLgEI zt`~Zj!)1BOb_!WtThBvKPC> zzuhWTPPKL>F=ZcaT#Bm4uGz}fi>W*BXxT#5T~6E=8{V01A}Dv+%1+NXtXa2+J?jf_ zX763X^in_Ku(<2`3ZJ4lUEG{86|L~p9F^q28$GqX9=R7X>Kga z5~^~~a!H~TjuG|}gpP3>L1`Wlhue-K-i;78d`y)J92&BI5V?ym-Rq&j4OH$&gd3!< zvx^YoCFAd}j9EA8XCImWAeVbL{i01+ul+Ptc>&k~prM+=YUNLhtrn%Wma?&zY(cfX zB$+`J!7%*QBNqLeL)P^lU$E4F*>7`{tY=VtbIcH%`a3GpIES=K>=G1tfo&RkJ%!DB z5=NE7tu;x3HU%wB0LW3oMTopR(Sokhma=Sk(Pq8Vw%j>krw6C(ENg;Xif`E2zA3xP zYN6LA&e^rG({_1$+s*}-7+$k(XNP9(G|P9L@1C&p?9ZX!p9aF#$u2fwH5*Xk4WMqB zLi7>=X_3G)MOc@UOyXl!?+KAF%X=PY`b7p1o}{3h1_CBnzc39m8^_R{{sHS&FpMRM z@}5TVP7s>3CSsgqBBIX$#|UG)2p1382m=9vOg;-hWkTE^kaCUSnV{qsM%|9`*;8?#O!JwREro=kML2? zV;adgIymmYncRjOu@g*gBYSGZ+Ew>dyH$ao!s99&+(&R~dw$+#g<$QG7Y1$r^IqG# zcgPMGjoFdC0XzEAupOrwUHBwMlV8D|aefyS|I)*zYtNvQObv}5u3TBPo3@V5q>tN967&dJn(lHB~gGHZd-cF=Csk1eeq z*Ld#_DyW>JM&l^&;biapb}5b4ILcAH+i(E%;!5wO(V&$=b03fG1&ckc->_m`WD0*RBwhH_wnDlzm7*9(%ktEC06^jLS7A`OaeTB0MJLa(a9@z z37K(s43k+5$aBVvk0KuhDCdmxsdGYKE~_c^HIm#;P&dz!I8U)@Kg*?*BL^k&JP zviLobCSZ1R*9CIT+<3> zLFHM3?wo=uh`h|}EpTcta-Unpn!SebtU*LR?pAnzKl_J}a&y=2V0?lHFt zv*6a@YKe%W8#nFdm5AHr@A_jC(w7CiVuQ|9#j%z%c7F?cb>}WIW>4zhKfVLK4@I%8 z3W$ZsIxZFrI~TTKSjKLT4jeE$C>CG-%E15j!+$1D3yg)udKDdegvEP=#X4|G_~)3c zYVywd&myZrV(o>Vf?o{@-)V1l0<;5T@!Usrr1!3rLfT=AiG4_Brv2r@@m2qQ9f$%4yo zSYZ2o8$N%>hA-W-q4W1Sh8@%U)Q>f+f9yWXE8exfPVTF{XTgfQ7NZX8-K8|H~+~J zZ?IisyZl>A&pNU~oHGP$vPQ7cA}|zW1SPd!=uehOCR< zq=!_ypCC{UG4x_??S-E8L4F&-(K5y)S3Cj5pmI6LWBR~+A5)`7360+f6P-p`B)ILr zylNf)=_R*R#DYvRlw@ZCwOIgq1%O+GWzMrrz$_=I5ROsO&A?E{0LugeEs|;t28=>5 z+6V){lf79>c4llcykyg{6`SwR*(Qs0oeizph1iB&%AB{$W9RM4VS;lsvz{hBTt&xT!bPPv=mmJ(JPAmaPNgYX z+F%M<*zOd!i8)Uq8D!9?Gkm5Pns%B*Wm5fEFzEDSG}}@NcVi`C&ta_DaY9y<5Ef#K zz)d^>P`W6}gqARNo(K^!s*MCT278I}4ibdG2z({P7T{|RAW`~YxK1_l6=z)M09E)1v;jkS?)h>LY-%eogJ|Sf0 z)GLE|mSPGoBt1NYD18_`qzu8gg3G#6d;V7qk13`V`4pFVIR)i9JYuE%-!j-{4NO)- zcohq7)c?57$~b*HVeOqiWJ7pv_*Rj%f}vfYamRN~f!JmAmthEJJW4Z7(=F7RTM@Nu zXo{{z;1+sUv2O+8)eBbk-C`@}HQRmws|JtTzsD*3kCoO4BkuZ!$9fU3yT5S~0lUaL zxxeE(WmX49H+%3+ULKfKJZ_qc!Ps4ODj8Hkf<{!t4<^@7|&~qNQOyg6O~0 z$}xFOTWhfjna|;za7azl)fKjDK(Z?|f7XPRFEDEle{L0-!~hOg%q!R>4wM~K3z)tL z)ee6DO!w=aJWzjeFR<1#1lYP=d|CUi2zUjpf^F@4|IH5^SZnWCwCc@n#;5pmvFmjf zYU?lI_2(Sg>EijSvg6(!!L~bcrZPvLh1YJOXo0hIYqwCebCo+h7G6KBBZ0MuwWzcs z*uv~R;=a09bz`SmJ4)^J=^dJ_mvxIo3de=i+Pl>?b{y$?qT|#K&)wkghup(HqtZHd zFYJ-5UF4SkL)N&+IdYbWFWJMPHfMrX@7}37T^NBI4z32mlaqBH&TuWiXx{DGBeO=afkPKx%j2EIX zN{9>52^}MxjYD)YAYzUw4AY2evoCS=LO3$CnM^#xI1$)%go0s|?~fIT=|fN*0I`Eqz6WVF9fDmJjZmO#q8yz@OxH3?S%mc&G~FpE=nSYW zV|NbvIZZ=O7CN5dwsG(%&6`X}#YI;RV?i4w*o3jK#+YrB?8@NAUt-+(yrn?hnb@kW zC!x@|`Oi&Uw2RX>?9%i#ySn@)+Z%Rm?uOl1dBbk5y=gc3`}*`%yD@ReZcbjXYvDD! zJ~U^SyR&wV&erpM*iF(D>D+4sw`KT)R*PIBW0=AdG$UU(^nMzRJI9xxA)r|(v@?WJ z=uCd&7z-?&v^2Mk5!A-0RHwKAG>9Y!f`_;*%*h@h9EL@y34syJYH_+^lWalma|ST} zZ-mNw3>ux5r<=cHyoWf)qkJF3uu(55*dXavA0fV*klqT0x6m!yz*fU?Edjh58(%rN zUIDI`^TX9r&8|h}Xq58J57xMEz}m1Px5E2cNayNMX6v8twrW!4Lh!QyGuOeNx7y(+ zP_&=vx5F=Z?eO7{?b|!d=CgvMVTa#G_xi2ir9M0U6gYff*iNGEdY!eKHCIXCR)I_zqgEPK|+_g@XX~4b`V^{~}^hRXy zGQ8Xk->-y7*I7FN+|FxO{oM&`hibP2*cE?s%o_e{A@j}3A=lgwMQ?>rcaSi2LGyb^ z09vU+x8VWrA~ESkg3#m_FItuZ?Qh^I$4r*M;TGn7YRXCkX?~pVU>2EshHV<)p617y z1gC}76JU0hNR~nlPjP#id|BS`1oh?=S6)iT{Ag*gd<-(3CQ6QBHOTNd5$bUWwFU$V zwWl~4rrBpXfv0)SEHbx4ZmbGg-)0elE##InQfpZ)qam$R!xnb0$iK}==2_va|H={w zu3@1{_)R5;GJ)3xu_I(zcVn1CtAp0|zcE+&( zK9AA)eIBdxBwK`7a4nv#V+}3IQ*9j!tBVEPC7;XOetM7#rNeV2Fne^Q1E&w@u3Zk5ong$qw*GY7 zTHl$tb%}7gSU0;Ktt(W>EnUlw%6-8VPq52C}mBjkX1}|j15kW zW#aHEr^yQ28gYCH>NriHp8|L$h#O;E;_+9A&!}Z11b_d2EK3OBL&TQh6QdTQKpVs^ zHsW8!hIQ5YiO&OTZ=3fF7U>I6XFz)J+ym?0{?Iy?A8`MNEENsS9zqE3U~9T(VW@So z2!N*eJPSy#ux+uOJHmXjV~jjGdC%6N-fNAFL+Sp=7J{GHT;{hnxBNSsJHJzGPC%(6 zH-866|IVUpk!y5WoyPjT@Sct5-m&b&n>H4@W(hBAUbZfiTx2b9EWwh_IrANkkZ=Hi z#6B;vt``vY6T*hc+egXYqc0Gn(b*!HSSH~=6I}XZ*s*dbiIaqkadLV6oragh>5mEW zT?Og38YNE35aUOS^P|xX67sarK^v^G16`~MdfbdvrGfOk1lLs?fZWxRwsxp0ir|z`&Ss+ zo5uPz=AE%rXwfob8#Xb%X$vb?ZDab9on}eSb5qyt{PY`ke&%hv#20^c={>u_{tYVs zZ*AVSH&$=in{00}Ed9;d8}* z-v!(gix8n{w4W(xa*iT$md`ScUL^f{l1pKXHnHfpj{(k1_eA4P!8Z~BaY8^Vq6{U8 z5C_#j6%j!5x>2HEjAMa!0z#c6ex}g6$D#O19v_3(B*>nk0IeV38>U%)IInjjeD)xy zb`i^4iOVertF_vQ`BnV59>BVim|e|dYGGgX97_(b=Xp_oA>C+LuVnQZUX$2;tWC;M#Q{!u${BxL&!2JDsnBes9vs2wbd*@0Jw?7*`F zb`0!2iUaKBnp_;LRH*lu6!e*Bs5!UuzgkeaYhlP0q>|0lnL7aY27tBhYbUG$WxM=uk6Fv# zmsra`lv(}X!@hsoU~K?&y%GZ4-7R#W)o|6d%9ak37rP%M!5E-EK1BLF%zbg}XfbSR zK^T09Ekf}}BiPmVnBfP^Qofrkp^nV-z!Vb^QYUCuVO@eG%65W%3d3xglsFC`3#b#& z%lH#qQq8d;-$qzii38Q@uTAkx$ndAN$0NgcR0o3!HgbtuNUf}sl zWTQ)*=u1T66$i{*@?TjXk6z}QU*}P4oSLhk^%{>@dx63A0Jdj~8+L1XBZ0Gn>D^k( zO0?Q@7EZnAEd8~4+1qo87Q)?vWnpx&`1KyOTxr6|HKL9q)KrgsJ99P!zaqcR4wh%d z+B^0Pd^uIzm8;#PG3O2g-~ldIXV!C_*!_?UVM0~yg}lXrw zx-)9`dI6(7*)~tywT-g7j96jxNyi5^IZR_S>UL)Kx0a<_O6qp{>JC?q-uRs*;L8bW z&k<_gp+!7tlW#gW&V;Y9n$~4Y1uh}bZdjyh#zJuBa4G4;$+Qh(wDAMSek8;Z46}Z+ zeLq1W$b}yGR+)vq!FVLtLlm~4na_zIBCdjP2?AA`?<&C-!Nf8`!Oq8gi4in~QM_XV z1hhe3Yk(lV};jf8EYxnX^9io}HV$ZI=)#uFc%Dn^Sk}?K#%- zUi!e^S$tscE#Bqt_w1edH|^cI>-N^fd3z(eX4m?s>_SrtNM_nF@V5bUt?*$df!qn4 z;&Vv*^K$esqiYuKI|UD(1#%~U$ym?FDr^!JJ0pdgp6V!?z%c2C@B2j-0J;+dIzg`V z>nOZ62H}X&)DtCLnwvtbokR#kb}Dg?$Ap4XY^jR5Mbmbwx74i!g(Ohtnf=wm= zv*vk7GniU{Rk83fRPPsg&I>(uh`;4QD+dcpAhiY5lS@#KOF8vRsVP^ZEH_ezZiMs- zADbV?&xSJJ00y`J5)T=-bWVzQx~QZT;V) zWdEJV>c4ixs2F5A%x{=L3jC|_ z#+0S20c3u_B&Vc+daO19Aj7ILjcJ{&OfdirsA|G!1|Zf#?paQRX_Rpp!lpTsG<0l% zlJ*>b&vH_E7P#S&c}|6S`12fvlSMAFRUm(nlY5!Su)?;)$qsMsvA=Y1%%!b=2U zXuN^mcA894(|b2L?KS&Ta<^m5c)^9r=PBfz0~$P6uvYBWAggmE@E)PEN2t78sO%(e zIfr-MUhRCD?Tc{n_5p=zoUedZb`FuWmcqyvxyE zq4PfnW+C)0N!|`wcMD_PU&85Kf?ki%`Y&|5Kv`n9?$a-uBtwLT>#n3F0Dvd;uL#jQSeQ>NoMFYJZtdn#=rf*NIcti98a%9eC5- zx^$LYs36vsnBZV14sbi(mi5QrADV`pu*_)O~GesqIh3P66usU6}bkC;6 z>t-$4v}mK0r2RNzhhIh?cm-4RD@+gBM;kJFqYt2tK}$kEs$Y*3#Sd-qM@)CSJ1} z!DYLO@%ubq!X{bFIy6NKcd4Q`E$^?YZg{0R7q}j(f+fK1R z!9OTrf9fFr=x6{BS&tRcW^n2m(m~G7%9jW6sI}TYFt7l##W9F{A)<5{9JrL@LsYDf zaRn4{byPmlV%410C*iJjs7wv~UHcOzqdeYj4T$Eo@a`JnIJrRsc-w+Mt%b5#BUed1 z&u>PYZbfBkftR-tVVb^u$_oGfn3a9C5WKFi=I@kS?KkL5KcZC<0GT^5Z4p)atm-a1oB<$xgzF zlVEM8aG1q1ai0O-&ezSwGfjG)P^1>@WB={$s=#u({QE%PA_?!L@?Ndfp-fwx4|J?9ae z1mI%Tj!{1(>02%`p|)mLx|KEd=r4h}0Lmi({(SDp=Sc2=TKDhF?G|J^%IY5ONVx74 zXn%3POQgD3xcy~8wGQ%oacW_)@OQ`N?VMqPYFDA&^F`2h+&pLS}B0Dm~kwr+?5gVetRwe(4I@rlP~Mn(g5ZS%6SW@ zoH-y~%OWl!gU>)s=IPy8dyfJN|Xyc4BADQK#~G(V`vW%>dHyTNgB9~Fp@aP zbdU(aD~O!!=Q|4^iT4mRx)BmvAsSu0Mi0jw1gusFOcyquCPc?ZF19-A{sqvxTJrBk z6yawRH;hK0#nKo0(5^|^5pTdFI1bTE4C>m&34-0GxXS-l{c1f+whB z;5JUd9LJCC_*mnx!$>u1;J~zvW7W>3w`?AndnJ1TZhg(p<=$fbvUlxFG$p3nYZlSh1c!%^jW(+ zvSgRMv$jQh{u+?#7T1N9E)&}(ag#Zy#s;pFcN(6Zqtkc>vXKKu$2E}T(K3sm8ASDY zm>uS)+^Sl$pE}Pdf`lJmRTS^7U^@&#2U-U#M&mTiJ!0$?X-bb#RjJC zHbT)Fcw7U@M-#8paspdIL4f{gbm*4`>?9of6j)qHmE|y5<6-c3UqRIN9uC-xCzJL< z*_b_hDrLVu7_?`OM(u@?v^{wsY`-`>VlQH?c$wQ?1f%yIrx&X*Yy~9=E8@6-shUSf z2#Sx5*a?z?A}TtkUh`QA!ny~ax98~|J3+Okm?YsS_>4FZH7ou#RdevW3SW6O)69y*n|XfCGq~jt-gSEor+*zz>;`bZ`KeB8VDfk!T)2Tk zavhgd9hX%-p{5Kiz2ZAXc8UbD1Q$gm&arxUbv>_H@l8s6->$Gy_;-ag@86&afbpeV zat(|~Z6YgfXZl(Pm!Di^4NOew1&4jSZ$E#JAbpKcwF=^v8%2i?l2?S7rWV9G7vMbv zz;Q2@l7H>x%>>A1wFF(9A1hHmP77YtB20$}mqskg=@>f|u`m^mn6fwolq6z{R`?j> z2iI6}O*R`NV@`9@q7<>lDtkgn8)J%!LBtGQ>M^KqAQ&tfga z@jpli&ogaF->W15Ysh4qG}{ZLSLyChjd}xiu35dOIrUG|%y$OHuFCX9D$=S-3##QR zJM(L%ZxH*ne!IY0@GPP&o-NSU-)@%1WzzqLU8gPwf@{HS7B$NK*kgZ`_cfDB2hRDYU z4r59#h54Z+wUx%LsVQgmtut2FIcH7Y6>AG@1JzfpZTy-wvr==@;#*b^v#tZGo2Xhh zZ``wbY+cRF2<@DKU8nAwKR}gwgm&qEr19?imZox@W?pE#|AEE*A6g{#kqxI=5qj=Z zrgZ<#{Ad4Q0fv<%Xt_!wfv0Z#){<90vGm1{ZETzND^|K1n`F3I?4nJC&Reo$)sn4i z7O$GJc=faeic;nSntexEL9!@hBgDG!iIBxkgqg$HN5c(sIFXlw=yx%6wkW-sQ6@ZU z2uT`QJ4SvUpdJ?Hnja-5c!>{PXmA4@Yw%d_0l#(7v)cZ`06Bj>BbBMu5&v3`*zLXtc8A>SUIbR1 zx@)&)Zrj`0*X<^@vP;n|JL8?VtL(nDPu&(NkL)s@vMkYAtMyEZopkpR}gt49!}jR*ytg0VA)aZc<+uv?>T~ITu$6C(j8g z)yIwnZSTH-?JbJiYh`JBxj1gGl&0;4^0YlmRr*;@;%5=ZpYx2_Qw1EKNZ9iL_TG~T zd+rb@y^j|?$oQSo+O!oFgshmq3l8Bs!~9u5_4>psgLV+l$qCNX6VLS7{--+VvgU6P z`3OVIPEsa6%-Oq-v;QzU(aC*07gOYMy0r`Nmmen~ET=Q9;uWu*q8fb+1-uLo`l*+^ zRz^{%3PryG#l4X%r1lw-Q?dYcYB#`W)p=b7!q#%zNmT9PAK>dIJE#?d|329PS5(or zO0AS)RMq#X{{3TxRWiK19Clp`D?deas$wsuu60H_NRYd@`nqBFGJOtlr43+7^HHhx z!`=gEgF!Ns04!c(NB!ieBOrAI^5G{5S5oT-V7*-7USui_XAhEvg~`4`)%aNW!D4kO z06bzzsvU8zRIzKV_mRYkkOY{ube8~I>)mCzIw!f9WCouAd^K=FfSrXE&uILK81^*E z`Il!n&74#YtS@kV&vWXjEq00Q)U$vy z+FJr`3Z9+|h^Y??vIW<&4oejmTziDuy9Cru8vl~uTFhD?EoPnP)E*tUF&u(12iLCS z`EzFN;8{5BFxuJAgx&%*$649$6o!vOee4i!LI?aFwWn;@^TFV*+PfDj{PUrd2=PB(>LAqus z^Grj=CK1BNIDsR~qYQ9zdO5*+fwVp%RXb4AT!q1j6S}5j&g!~mt-gE3>iU6g-Ph zG$MIy^npb}A6X#!p#{c(?c66ey!2c1Zv5VSXMS&^Oe~3B2fA-ky=EUp0FSX?bn5KK zmRh@OX}nEi<2NiFxk`J{mLku60O_!g%5g7>L@xodlhfX=#T1Q8$lX2hee5Wl0Ek)}BP^6J)-vmTgk=e_0)K(FCm#1`zaAJ zIItFLLNh_2&A(vHtZmlWHf9~L^G=K=bx#nSAddlva{ysJQ$}!sO2sLUra+i)j!^L7}8p^TIHD${%-wm3i zFV0=U-F?w6V^_E`{kC09zGIjDx9n=?yLP!5t9~7Bz0{I0!Ue$Q^<3Vg2; z*k*sL>Ym*N%I}er-44RC$L`tN*z&JVzi#Jng`Z}1mvx-rYe3u@!;|OG_~u~AYIRYc zmMZZxm}qn4o>^G7798`TDvi;RG!8coz_R_Y@eptyL|F_F{{pCuKHz$Uh!&y*8Kz+| zf!LlzuM|8d(KO@yxH0;hJxN}qNNYPJ0pB=rI)dySA}+`3(@aVCBWf`6jpWA5spCD) z5E|lhAIfP5kLhV1w_e8NcDJ*%99Fq@S{YktGjHr*xi$O%O)W6*YAW3@?D``kRtHP3 zEu^;#3@zhSai9$=K5{H%uc21IR1mSfr_#2!YSLb=8V95k_F~1yJTPde`G1c~yVD)hr z`pK7Yv7y43KaGDKHeOG5+`v`^j@E+rH3(Q0Tq;$FSem+04USg8yep)-gT;kEF1KPT z<5fQfpP%RiryH#F$87Ygm4NGYC<3j|Vfp}{h2O2bzg97K?2{6=2Kk>I)Tq2L>rrx( z5%Ah4+WYj|>xkJ>k{$T{5?m=}N=0^<( zys@8!>&9%9AA1x#T39CrTM*_OFStnxL7oM)QE6ga< zEHasr->4jM5U#%k>3K4pC)V1(-4Hg9>b-yJ80cq|TlYAq{*09hj0E<2jBeN84htRJ zJtQC(5(|+9xFwD}I|SF!E-lMZEPCx$&=Pn{C)eJ!cIm0^HH6;!L+D+s7y7IIf3t(* zvWE+}^Lyd9;9Gk^_lyA7c?94)RRY2H z!=l*2ZTI;{eb1`3^sQUN&}nOj{B}-Wwa$gNtYzgbYo^3qvwq7eR^PQMoWm{4 zckr&UP2aWN*?TrP!}RUR4=ezphm!cz(ja;c6rW+9$~?2pRz5Kw6G?~9eq#RfAKS6GMMa0(5CmH$~bTrCJ<qXzpDQ_)bsMnnCjx!d+KU6s>wgV(xu+nlcz8z-TiCMgoAzF2qu?B#zMr4^0>b+?g zUW9j>0K-Qq`}yUjBS2~G-Ux=Y5dzu}!P1M`KR^OMNCMx7`qy91d{|s?(bfz-@G(mh zCl+9ii!jLb-YHujV&GVG-7dnqugqVy%b3ruPQGnd zZM%8mw!M4euH8P)R&dweV|%CI4##)wZt)$v!(_VK$Sm*s?^4TVE-X3M+4<|##xL1M zVA(bi?j-RMgtq|cEx>m}W7_I#scLh3 z9l})|&#S`()d0L!9|i_##VDo7>;YN}IByODm#+fhuR@_;f^)xGm$jE0XYA#sS$l!= z_UY1$Jzt%(XN$*y@oC%3A~LU)XKZhA$_|sA9;=(O;pM-uF z9vZPjoE-aiUrDcumwT@P^N8B* z6uJ@0-wq^qBhq)03Uniq50E1ClQInRoen~=HIzm5uOV9Ge8>l0B!?kf{)1eS_z z-vfy0gHY~%sB=HslUiT;q2v9uUUdq0!RfN}D_94SB+k;cI}ikma60pT*Nd1k48{i`X+!i-wA2@wkb z_#Aa>`N-82p@xZdl7Tf`N6ScN8;~oRKGsnI9Efu%y;1>yqm^8#&- zJtEqP|J0&StOL~@s_2)rNCi;02j6&%qPg75kqwcSy%p!-ks96d@;6MhT3Wf?pN z13!asF292070(LcuV@*M&n%^(1uCSoD5+T*gHniCF%;D>6__YAYzV^9%L&AZ9|JziwUi!DT`!2Z&fX94YStLyK2q;O>6XRQ0=~Koy7Q-nVZ(I_=Z)_zhRZR z*PV>svBHv8%gjvyx%(DxTmK5?wB-+Mbm;-Jx<9b!B5QW6eQ2YL56sWrzwxmJPBWc! zn@Oc-@7ciSZR^_t?Wvj%FTZc23%4wgdEG)NuznER+qY%I-J3Stw#o$5HMsV?jh4-t zzk(&e8mBE%J83a0^zoBX^5)1+A})^+nnRRJMYfVO)uc3P>;#w7B#53A=Y}*$gd3t9 z=_PURKss+xB*D_#aw@?Tv6ugW->4jJHQqEPgSkaIY0XoVC zn3otrhmTg`t;K6IMY(Q?{+9KD8Qaz@6eRPD>212Iui7;Y$yLp7hts}SXox`{7)`8ph-T_?X`|sGhY`69T+=p)4ox(fzel>vJeaGGi z-m;4sD&*5QZG$TJI>5c&pR+~Y;4BTPS!}Z@Ol0Fo+hfF}F*x`nf>8$3ZAMZz(qe)i zDhgna@ZkbXI2opEaR~nH#jE3kc=!SC(aIpT5~Oov@i5>W1f0V#>=1Ep6eTi5Y*fRS z18u7MF%p>=uD~GQg%5xaaN8)++FwL{8`$;n-3$ZQgOII$!8cL7kJ&HXSQWbYkve)A zNelCC?wzq3OldWgOY3-i9q?IO9I<-DpIT})^$Z-Uh6R@K8YeKI9YX{5?&fwS3a{1LX%RCTxG%xE*7#{n7Gq zJ5Ejf*vW|Phv^?X!u(O{Lx+IwgQNuquygExWduLle!9e<)vtor$2g0Rb2dx2FGMy! z$eDfuBYJTG1#=4Vg;42}cGO)c8 z?5{Zc?(dmPNGbeKHtr1sy8l#zXwLbdC_-6rUF5%r)-n!8%T@J_aVuF5XjFq<%t5AdD`QOWvw?Oq8^ z{NF)5CO-0|0dk3cWPv`4?gLMNuSlJ)&oa6@{hYMt?*{F%9f$j;S<^(6nBoIGN#wZA%K;9XLE$4vm92c4( zTr*a(FSgq(*3>z&R?iF}=zkQ1&l86i*cK7rSI8#TXhB#n^4l7(wn%JRrn<9Ep1I0? zlhb+&NEdu>v0VVV&r>25|GvT|_!jTJ#yEZ{~71r5zhtNdZg}gd^r!o+V2cF5psVH;k(7a^_Sz`ZsJ*< zce`aXi^aZoIRF=KJ1M?ITDh~lIl$g6((O#>LhRj+ZiBHNp`@F1;>y{(^r!30-lO*@ zz;-S)L8!|={wxo@+6$!hA(f%%I1kbSZ5`(y>(RlV38?it!fNgFL|gwLPqDSnQ*J@F zGou$>V=TLX`#hknWwZp`s(No?Qd|9Tu`U0Ig_4**u|%bN4w{n1*pvjeqYCv9%Mp^# zLDbV$WS|;kpUUdE)stT~HI7?tWzuTuvsTGg)jnrcZSz*$xnK>$n^rfvZFSM})|fhP zP574@SP`>M+Y;4p`hGf=-vhRR>!n-P$G&Ijwt11#{lIXDfua9DS?~QF*>&Cdc3_jD zC9mh1=b1HY&6^jTCTRJ2f@QCfWyu~%ltkGQMTrzsH`%$7a}I^7LIw&z0jON4j6zi* z=bSpA6FRWF+0C4rq?kncAK34+4^(t`KV004inprnIp6*L?(g15m%bVSrjr~G-=J8G zElwd>94~t4+lD z32cQ~cUIyg38OYzv_X#3Kxq=$TIDe{d8HuRW038MXUO*dvW-@vE}6$>Jwr3^3EV6* zc4BS5k2nK5K>#1XrtPMWg|momljUh?!-L+5M(JSI96;~%5+3*=KfS#)GsPJY3|^2x zfF(iPo7jujq!qY!V(uFpz9d#wyJ*DK)JCvhM{w0mV%6WjMACFYoQNEL%9gz?qa;?- zrd4SS`0hE`BT0tpD3eJX1KJ1^&M;=UI9g&9@A}CEZn`At`4MKuFug3I@b4jI{LB(A z{L&scwhz7?1ELhRr*XV35fA9%LKoogyEOK`NmG-XELwh>R%N#-*1Cgd{2qM!-q<_x zdf+{IyZe24yWxF#uZnu>vitI8*@yBr{p#K+X3sLFZ{>d=@3D002e}`}M+G0shur_3 z^&@$A;A43$`jOn5pWA&*SYP9Ew zI_HqMXUOr)5Q9uJmrXMpjxn#Lp&bcaIw2ktMJ6Ak#ydrhC`|~E=^mG1By>#=q{u;x z0NW|j1u16Hapu4Y^@x+4RH;2f%28om%e_YUPEuU>sSYk0pgWEuDb8%1V3v-vg=v}< zCZ-Ay^7zPR2U+ZWkQv?C&jt(cMMddk(DWd@_cEJzfLPXUD1+`AA7y9(^C!enMa z5^p4p-H3Uk3CwQP!ZAR<4!OLZeT`x^w`-wU4f**xu(|=cycT0!E0=x~Ms_<@R0 z`T?oL4i07yU?OZ?SoIYOxZ_~&FrJ1O(?t?| zP7`IP`9H%IV3yTJkC}mzTNS+j&9Wjm+Z+u}=ef2Pa7fG%XD^YmSwbgQ^j-vORZCyO zS+d4}UgiI@T$|e*Z!-?JXt<-8y@`%?mg{^AoVK22R{q!Lv5uYxz0WgJFLL!?|OfU@T1Km5L^C~iu=4(O4xZQ~zP zvTe-crV`9NNNwhO8oI9aaX`6sw%Ge0{c6gpt%}t9^nROhkt;?XQpT$XMiK{Jb#L%m zDfIybU_H=}XL^7eslcu`nI$q6gUx5Lt5fZ(`eGUh=w9zquv60NT$AqD6>)gZN>})z^k!~I&)5wan7b?e zY<+VtN#Ew{(zE%d^sc-LJijU4v+qdY{C%MKJ_|&@FEI>bvE2_PzRT*9WVxewy`vll z*rL~9+L!K2VCQ`nl4cQUo;$eywz!r#p132fu{+`%xy1|@yeyVJ$A#WqeR85e!;91EN49`$C9Kl=BSdHB;Pa&{~Sk^TOsgR0)!VSGg*ALljWBN zWrq7ENnDO2YQ;*3rkS0BfcXHg<*b^Jwi4V!0DUX2AV(joeL#1dd^;}hw)lpx$k5n} z^v^eL*%4oL|BfE&gy+KwC0eAdWXnqxy zPSUa=#%K@1RgmmNg6LhJ`NHjI#@8^SD0mG)juSKZpSw{Gd%4p6RxgG?I$1cnDDf)PC++}-}dabwQ&e&UW zF9d~lfWwXNLzCH9QRR)i`|<{u`$oeHTZluAwEcY?4jf|}?!>pqZPo;9)L7zOvl8Lfp}qwP z5TCk;nfjTa`*`&pF0F0|Ru^#X0LHu9*jVVMixg-V(oH9WsH1ffPgj&2GjSOAR{%~0 z#CruW=X{uRUeBuJ6T{`hpvz#-rJbu%+P^JjLpxIDJ11psw%#=h8kAq?8o0(gzh|)$}uMB(AJ4NJuRp zT?24dl>oF9Q&a-D)evai*EGmzHWt759Hus!;S9F2}mFQvvx#oFUEUKkD%WmxJ02r+)o2*V>x{2OQ3 z97+)cr#Q%9Xiy=10wkW`iB@%_{pT4j4fQTglfBZ_?xw-;c`E*9LEkxEVu6Twl}K+H z3|&K{+2l!z#=88bX0x}sD9`fhTNH?IF)M9>DP}z5_eiN3@3#@Jr78Tkd>F@l{b(0a^Eb|MACrLbe_} zptmTaP@^ZHlE2Dsn5(DwrCA%(32KVhlYnjY|zx{>s&F7a1eC z!mXOXvp}t{VSxJw*x&SyLkign(OJ0Gy*|ruc+&+{iMVOAX3-;4@&)<6@wf$N!5)U+ ze1ZSjuD{S_daEdYZ&7fu{38num+==r*~U_{w4xxJr{Z6nh%baz6Cls(aihR8fq8nD zs3x6~u2$$YDAna$m2RexPR}{xK|5d^haD!T9l@Cvz51SnFGG!?$pLD^g3xU@w|m)qTW^5*Z-`^*RdHZUZvhP*6St)= zwkuuU^Q<7fEA8=JY4cx_j_wWV2fh0T&WpPZ3sB7r3jRD=7DExF4Hr{Ii-s5H+#?L# z1g^6b=sZDQZ5~9_cK`Z4tl>6W$4WX)A;=ict`sOf%J2@MyZI@KbyudPuWU>ll}yD< zU7hfq-oY*D3++g6=)43uCx7auBoYa~xXz0;)LB{q8X~{(q0#-_83_-mLgg-e`wH57BRBk{));@5wbTic2%s{;v`~>CPnSO{4 zC_ai@FzIB91*Kz5qA3dJ!WaW094GmF!*nT6Vp1Q$&Ns?&n&TAco+5-uV+D*;r4@xn z$En7RDUD_hkB|;B%d?{;MWNJT=&^?{+=C|LVmcp0`{-uCbn-oS>b@}}9r(<;t>a)> za_|3o@CtIK_}$9u+L-q1Akwv9cp3OzWJCQ%lgUNp&Tn6kVv^J49V=3ZK2yO(R*cGB zHn0w+L#|Q3OCixE++M_1I+pq*MalWfeV>b zt7@hJd5$Sdt0YriRX@pNF~SimTL8^+7;*(8teHTdg)gH{fgHBl!jITmK`d$=GyiuG z$h0HXcM>GD6wxOYMZOJ&--f~5MtPSuQm_0a#&Y6nJ5`olT-+Vx?7GPHv~s)i8OpL5 z4V{#84e*|7OmD+Sss{4_%-O?h_oKM$(j@}~1!gHTa#?ON**;ixkYK{g^Mj105R4_v zkEhLLV`v~&&2>DiEA0enTNok)(dNv704nj(7EWYY=}^c;HlQWcHS7~^YL(AS9IH+aS-m-rTEu!;VDj%?T_ zSZp?w}D=_2OLU7mXtL*na)d!YTGCa@L46})w?v{@nBv{g~uen^k>7DYF`K>=Kk72WjM0Qvqb zyzkLzz2C55t3tRz>@0>Wtu{$%h3EZ>w~EZBZP_6OaZUB=t%}dOH>-gtG#|_&w?1Bv z4NUG?#r6LEire}OtD>gKbn8Ku1@E;YRnX3oYrSW0IZFj!CD{tz#vQ-6q_!fi$ztm{ zDID7r4O6UK#(r<-tRm3%wedPyLa_#3$a*dYa7g_gV>xXqTfy8=7L^=xr9m5hb zj2fQd(n&M(M7Y#^$UR`(yXoUaEoL4Rq3T++5j0#4|8@1V2-fGF1#&6wABb)exF9;_eoLT7w`5P zGQeZ|d2AO&-_5gk7)BSxGPEOI*wmHiTf0`I31d!!Zp?9wWbL|LXQd56uDO=P8FBpJ z@sRlQ05`m`5lk^*I6;gAU5aGdFoHvZm4c=zM4$Xcn=DZ6wRE^!=IQ*j$Z}K*n9ruL zZB3R_BZ4J6N>a_oioqVHsh+Y?>8P0`JGmt7%%P6tHR&Y>;2pmwzNtGBntw$Sr00`o zKLWtt6W`3+5?nyXpG7#Bc}sc$@s9LO>4{#JLCkwj3f+5$FH0A}Q5)ZSSMMU-Fqp!? z+J1n%7jH`+0fd{(rxOFsAh;YM8J8qz_rXmDaf%P|m=H!IA2<57ASbtd-6shxD9^43(bB9ynaWqTlb3J$JtJS-T5EN*Iy^SeUD1~ z+acC*nZ|Cu`o3IQdPOb}Dx+61~LH5r?tij1o=FTj)&12O9;j zN6Vqi%$jjPe1w@TLFUg-`g({DlC%$_gHOtMKdYZIb42i+jiB|bRelKO5{C68pyP4& z!=%fTRDh*BpyE*Sv=S2q)WCy?AuUxN-F(*=CDf(-3!iegRhDLZp=6FAVs>(_z<)jYlg_dy97 z_Fk z0_6qJ;gh6mju(L1ZEO5LD=)BwNZ|<<_Bsx7v!GWE@ohdjbV=T@6yQNCf}WSvf%xd; z6(Dn&7L0@9MZ8ue`g^6FbFyGt=e{aDomC{#D@ij|5zE%KEm3ARCKe)qCQ!Sc;nP^b z=Y|@0*tm_$xSeEu54wLRp-(pn^#(#ryZYF$fj5Jqttd!#)T1^E!L95oo(8$8=IDZ2 zSL3*8q%hSA<<|AN2cg-Ghr7f=+G-G6yc;xj@_b!rte?Vh$4Tt$s8oZX_yEILo6ijp zEx2)l^pV>hU<-1NA%52ozkv@`Cx}uN=J$>eqJ2|4-i3kUpd}+iXenWSun@`Z2w87;)Gn&W2HlwOTkwDHa@4N{(om;>E@Q+bQm!U_6f_n<JrpoQH#^u@Xc@wyJV zzeg;4g9?ln0rGp6n7qOQ$gi>vtOEGUfcjm^Q%njQgm?w0z6k_X^?) z*;%;Gg1JJs-lqTW>ER052NmzL*sc42j^;ts^3{0 zH=6fBeJurQeU75KRcZMCESj68HV z_6?d_E4JsU>^$m z(7AUdwEDUPVC`;n)$WCR(wurx8p4;QE^|#90dTALtXKv&rOtU)8V1fu9YEgDf`F%v z+^%KmMA2_^d+uRQ^#jvvgk#S z?IPXT1QG7+S-_ba!sSDoDQ@cn4Z6v?x!An$2^S68yksB;$r$$2SIf!lV;KMr2Kd38 z%rZfR8)lFMKd#1Ppc6?_xew${< zo((m_M>WswUY8;_ z5boNN68{BysbDKP#T_S`mn0V)KUFy{C(0(|SjD)!P@IwH&kV~E7Q`;jOUe-%k-l); zE5#>cQkXj|#oC0em{tK`1AMwS*Mk6n*k-UP#KB5&V@>$3xip%ZNHCLHY`zuaAuCU*`HFk)-K zTB|Z|!t7S^*A3uyE2U~}_}p4y&rSHnZAb8;F@ie}vq(3xc?UHwjW5txjqtpe(7X-& z?&fv}uhm0tyPKT0cAV=Wj_AsvW}Z;IpYw9zEa=DAK7icrCncbAy9*cR5TUV$+_;an zLqXJWE%OTj(L-Exe)McV_XkvRXFm+)n?BEE-IBy1Bjo4PTns6G+%)n`ihOqpx5Eh0 zXA*5Z4OEXQ#FP8h>V+wy&lw)N=N#67@l^)y5@EUO z?yH0fTNoTS+0GKipF>hRPk4R_L*;&h;bexax?0G-JFMDneVGAq;11;!x7A%vvfHWv zen=^}iswqfvv{q0h;vZBrZoJYBKJQ%&JuBj>3<5_2F;uGRs(u_{YVvH4+Q?p&kWb@ z{No>rb?`s_z3fv3+$?*&*ZWMNPg|QQ%o?h0Q#jsRy;|Y=kTO-hQy+BYuL{iG)Qo8$ zV2ZO9I8`NAE~{9qdj)GnM&;8cX|0s|A-z|zTw9(fSZDY82z8E`UML2r4`kJJMOCXV zF=E<^>r2}7ru|vv+(-cX3;x?9^0h+`iCuyF(4YRRe=qjG{Fz*P)@BrTeJ$0^ZTkME z;fu)==!;oz9d2d0P5#_`u2rr-*Cv-~o^|z^Ho2sY$LYVR>o%<&H=}ZSiu*MU~A&LSYv=LsMqXyx*e)O4zJBHsN+l~K5}`^ z&L!!F_;h0c>hfNa-sBw_97h+Je_Omu_a(ZG<$Y5N)V`3+#^*G0qabY#$R5MyKKY4+ zXFjGG+=t?YdplBhWni3=_QZAkXBWkR7V0FxZ>6}dhk@6|*1%-ZQpDr}3F}4f>to^^ zV3Ke#84X}7b1?}yG42e4B%P3l9vf{jnFt2q0|CUlAxOk16O3gXNKj}SfwQK`iY0+% zUHf9P5HSHu_9A<=V6OmO+bl?O7NLC0k99k_E$1@iphvID)$!YMedJ|%Y3Oyi>wZ`6 zb-X8cn(oWJT1vLdK9E;UzMC9(9?-1t%>K24kL2a5kL0c$emw|0CqJdn>Bn+)1)h!H z?84j~*&IGEo37NgAa~JcBm>SQHVvHly{u9jN;6SF-;UeM0Cy4kaBsN#-=G(Pq4sdoEBzD zYTGi{zQ=&+@yHhIu&(eLFl=O|D1vziIQ6Tp%B=2Z<_|Ck{IEtpw|j|U`ygIDFuE?_ zxf29xVPTXe${14;Kfq55E30COdmOLQ*42kjM?Q8NpE784BJ0nLL z7RB$%mVXR(Y$I=<8k3OJpcSKAvDDy_I@@mFzH6z@gfa)2|0!cH$oMV0A1~e`xC%* zlGjQpY?By>ad9SyUb8Q^>&43W2Oe^%wyOa(B7~7RPVKY3D?#?_^v2YTU8^sD_lRE zRl;?zfStwT>|Xh_(ZdZ;Du5d}SLohrRI0$ePf^>Zn0`PJTd~k&zZI_c%BvKt_bV1F zSX=c0`@h6*h3f;^exkZJOIVx!C&qnl*6UPcHj8bWV1X0e16##vlegA`eJB6?`_ig7 zZTVdgyZ@U{nUFy5*LPG<)|b&^#clmx?eLd*HN|R$>8qUn<)1X*RcMzBk2T2_jeWNt zvzkSbS7=SN2sDj957Q)PGJ+=}flGJ@sm2e92{KDYHKoVJ6=A0FqVIWN);-Kdy?At7 zuDN}PAPVqn!q`!@|=|#W~(YZs%0?UMm)3~U5jEzO784f zly+vgHYNi{4HlvNl(?To%!eMpFbm3@tl zFu-$q`3sp?r2YBqZ)AMpbD7XiF=Nz}(>-Qrnzd6VJ|NHi9<}Rl$slk)5Z;vms^bQ* zBXu(QqF3-Iz=f|(h_SjWf^{mPq@!%K?I*lBjATJ$- z4UaGrjUbJy7d}PIILgJD2C64ouy^yB;>4D5&UqN=JHi(hBS)QJc1j|Phv}k{!X}>X z*FyX;>K$lk2DwP}Ql$l~C#d?0@;)KDtPJsd^&O>X37#T1J?2{ly5~u2vSIxWaDfdm zqei&c!>!EbAd8m^$WI*P<2&{<<2u!2#ShfQ1=ypx4QA^OX7~0=1ahjn+Q?5dF>vg_ zxfNJ%1)^J-#VzD98iD9KgyJfSimG7Nnm(?g0J|EwsG5+jo)}Wu3AzUv( zbUC*sqJU2wXg&s(2X;FMJgcVV;T(c_0n&!}RGB%VY%w4+0!&BHA;Wq*5F3Tbr_jbS zY}Pba*#9-kupA?=GD;q0j7ut0O@|hqIY-1dPe8E1wu~^g2FG4UfLSSt7@%I^3|6?@ zHtE}-y-?SQQa9k-YY1j%X`XZ$kl$s9s89SFw_js;>=Npk z{vAWE=@zKHRbI8lO`VtGw4$?Owbpp)UcKWcH~pZ}=qxHLz0T5UJvNUpOL!g3J|tV} z^>8*B-S$V1NS0VDQY*REy-L=motYjOdc9Ykt*Wr$)&~`uvtVryQ{mWZz*>3nKWV3? zFuzyeW$@V`^_R(Mn;sodlvcD>XtpaP8|*gNtjKAW8#AtN;MA~deaAhdS9~_*Ym&_y&NiKz#1oC34}>S~>f} zIyw6@n`~3;u=LlJ#$>jHRbw9RJjM?gSM`vnD+(xt$%};ep`*-!aosdOgHYooQgiaZ zTbnUDFpZPJ?qc5R@UBT);)1l2t#0veV*tA>EdXgpfVOA=>!AOf44}phAcuQKRo=xa z9l0z{0J#qtyNkSSXXv6d_isvL@2b?hHl&`Cl z%teOt9L*IbNqc6HkB1q?QKJ4R)17zdtT?fIJ5$$WVCuFEEW9Rzlr8lyz0dYB|FbCB zG%eZYDG8tYg68LdF^h{$WPU9ZNxH1EjV3>nRQxlE4Syn`5gNlxB6*L$C$1Pq`hGNr zjwR`3`cf?IV&GY-nQkbr(kQ=&&)Lb;I4@+MgbX*^`uJ37}2JDoC(5oEh5ZCF?wZLfc=e>tj-7%sk%?Px{Wggo20Bu`dN%9ABy@=Q@ijzg$VSJB?|OhS(3 z#3a8Iu&u_?#$!)c)3+R8&4m+}@P@^_xpL=n9#dHb0Ao5UBRVMWBwcRPcBweg+gIfb z;ji-OTr8MH@as~J%W-qm(B`Fv58VhD+u^F#P7E%`I~m6<+-u{jvZ-&JufqY9#qIM1AP+4>>EMRp@3{!p)m}uG9+%$CI2Q}2DE?aE&8(DVN*=LM?u%ibVasm&Gmi- zWo^r0QzZV1x|=jbs+?JYHw(a7wAKG@%8?DXd?3rBv!%%TltT)>3c|{nvq1ch3b&%K zDcSm(lIJXURzOuWQ!rNeQ(KzuvyiNN!=V+8_bVc#yDnH&w(}xs~^__Je z{`${Na{A!@1AC}_=&3*ahPfw8ob~yN+QzN+xT5tXo_qE0`Se9Dme=&q(yX7=Q~PE6 z7p&4nLi#Lj+YR=sPwZ6`kN=Vt6qp1@$xV(x+ccFDQ`MUZKdDzBX^#j>xY{rL=q^5N zjR6?O09Rob6~P@eO|khlr6mSJ4{eJb_iUT`&-$pw29X?yay?!1(igrU-A;;6X%ON_ zfY1??-q;oCgkswv2aP@J(%@L7zXQDo>9RaU}0JsHa(gB_B zV2)_Zje}$)X&<9C0xI{&^O%eQH#eW!PMm{E*n>u|g|{WN z@9Jfq7^J?Z5902`=;LIygFZC+K{R+TA$<_u9OTmsRnWSIZW~@8WB^F<5S+WolKRWZ z)G~gRTPn{?oI*%A;iPt+6%p`RkCNuj;G3HOsz?Dx8r&yY6=5^T}c}?yNQ)V5et(gy=?1Cpd@p(HxmX`*8CAU1E$c^x)a+~<% zUg9%(CBruNiM+J>kz8ASmu0+OHt@eSv?*&Cw&n=-=a{=DnTsMQmoZd4g4Il`h5s7>2y@xO9UD~EB?z;?B^wmO zyKrK`*J{D+TDWN~Fjx(Dt!4$-Dx6>yU~>t)IG1EgaTji~E-I|y&p8Z{qdfj7s?iG+ zZXH2}e!gKro~fK>S&$id8ZNB7`7rxa!1k%S8F?x{DTj07@Md6|$DAmEGdC>D3pHbM zjQ7i-nj*J}!ZO~!gi4BXWbRV@;u!83`=|#Gek>p zpp_GUR0DqHOcOP5&t|gFZ6u%CbeIByOR_?Q+Z zr;#Ej_(g7TXQ1n&hz}^S@Hg ztni)X(0Zf7s_wPbi9&bQ5UzXuUm-EOS0-(msu(Aiwl_Vf?MqeNR#{z9(5x@Am(AAq zeL&GwQBtD-g?7Vh4G`-m+js4eialZbYkH(0uDY~-Al+-z64lg|chq8_qaC%Wb8 zlXkiMRI^+>+$QIrvdiY9b#xzPy~3X~%H~g+WR<0J)}HK;MPO|5i59aY@FZMp9FAiM zH;PIE4mM2XQvwT26d(u?{05m^L-3;r?pH6DU>~-dE^3I|gJ-3cBGNVj$PVl=Ef|zL zdKSe&qmVw5+P&<1No;qrcl6->>RrZGPJhk84Q%Cj#i(a)#J$ppsk@HEutkG%9H=cc z6YfH#?tx^tqeQn5m^UkIYrxFd?ZWi!IK_}+P8y=PH1ZV9U5;TxqON0-AvS#&b(_yS zikP4^lf%d8Vu)|d|9r2+37A88%i?Hkp&S|&lMeF`oI723#vs{RndX|kE&U7k#JNOY zw$=BjF8e@w=RT$K{MRxV`;5jXpG!3Gxg-^!IUeZahqLX>49X)S=u*9hXDs!5X<&nJ$5O+pF*E{)!CrFvzcbRE4+wLN(Q^tllft;ar6!$sQ!vMN-?$YmJti6ZMo4@stqU=MfQ95b{=o$`wRe^+XO;q$TP>b356zdYtFXpxVr_pH&XHa)eI7$Qtnlf;_Czf8vy${bYDBBoFnAD45_-PHQUT+I~4C+;`lN&{C6&Z;5&?z zD`=$`$yi?_w!Kcx<_(&s++lRQMA4U`_sjKKghi%$zm|Bt!Df9`>$Kl!9hQep15$um zQBFHt8!%?CcJPH^sgO6gm}{b+6#8fNfReeo(n~7OwRX z%E+^@ZJglN%iqk~BhY$~MQjCZL$3{Jt5N*_2ij(>E*Fi`jQeY!0cu5Uvo^M(usPpD ziqlG{vwOv9z1O(N_9#O^lorid9mqdYP@R-)*3VD5@9BGfUhh1Dq8EqOaJuy z(y3s5;19p{`?CAfS_AE-@wi1Fr>CWFedF;)x%LE3Il%hT(=BrD39IZp+bS0T?Q^se z-+I1VR=-~@>%VN14Y>B=&st?3hBJAj+bn&QX2Ms0u&xy`tblfswX9%4NrqUMCQ@M( z+ZcR1Mtm2fG{p&kc6OppyEbT(yiD6c76k_IIvJileE<aPw2e8ahBii4S{(K;kGV)m571tzm*Lb4PYs>>U`<`{OmX=M1;n%5WdL&KD;W64DO`wLyagD{PbjmQ)h5{}kzf{?IafL31$6B>G;!@zKTalYibCi~dWlV; zgHNhM7Dyh4_>KYD+G{L+jQ-#hokf|+hq2Ej)f0wx9>F0Kr%)vmT&DdAkHyxVLIj+k z2s_h`wvMHJnA)re4vZjrxDVf)pMGs__HMLsAGNkV>c;|XVW4{mE4mMAH`sanbCW3D(ljjouEuJ$kIfjx`~;;rVQSP7+a@2 zn@hN!`)lBcHN>HfK(=-Pv%q(2iiSZLG;$zXo0S;%HQcs{#C0L4d74gPxuE133J8yb ztj8M{&$X_| zndUWGk^|?hB(NdPc|4}vGG}~bWn`HuDAq0qx^wd(wB@66hBq$+s!!2<f&~2+C^gfdSR&+Knt8Wcjs$QkBaO z`2X``qA+dJ*~*v=RNE934=NBV6W7o~_r~9SQ13FgWT9F=Z|=XF91d?vZKe^)#-_Q4nq7B%Y%u zyI3xwOHxefnUnOSc#6dtxe64ujhBZjW{4}t!)WPZno^f#C)1RhlBqtXVYR@jEa(QE z-84kh;s_5T*afrbC*bX|P|ZRc2L~*{!L-y(0N-^YC_UtB+d%3LrovY8wl0EhHz?f) zmY3rT$sf?$0?=+kz0`m!jztckP8Bj)=TP(|*FmU&GgG0b!w%VJ~J=w;obex~?=Q+!_5JoG^MT^d1)ZJZx|3f``L(HCq~jXOm`fu6!t#4^b@6@t z+~llhsG$a%Z?ArWCbar1dGy-GujIP09#<< zTtvB9#YQ$p6p_a2Hp7|Dzzt?V>1ky8NhY9-W}@i@G0J?C!MUBr!JWbemLP!>IMIs) zPN7yFiyT9$BibE}X5kq-*>BK0%q%m7#GgSPPxef+E+*WECAIuC^$ua3b8$SVNR8Wj zkZ2&_z*R&i)*;PaGoc0{)?PT13sm;NZM;mTYU9)6Uabehgxm*^bW>l{LV95k4%kcO zT-yLtgu|Zcy$VO;cOZ$1A63MZPL0VAN;O%5%%XerS0)uvs;cb z3asTNgz;zCpC;XQ!m%W$(d$m&$}B*iD`282CPz^T1*jr4urScATye_mTlj^nFzFT~ zk9OFs9a+1R$*BYQ?|@l%F{wEDRUDi{AMsQl`g=bUgGVKCAm7d7)zsbGr~N{fn`o$iA!Y}aczwg+JI)SF$-?Mna+dt=h4ZwV9{%sQP!!nKF^TZp{3ep zE^V;*U-9}XS?sH2=;Y|)w{^K}bn&~I!3L&ZYhm>c`1H%HzNs*+eK{1Rt*^qi%`(|a zsk3ON$3_P~m?hU)I&J9aoU~P94O2a&K%K>DW$4;OiW3KHbdv*AB#Pi(Ftb-uh*$tb@X<&(Z<=?;2(L#}=7=%q}xO z0hu2G!GF>$Q?&7#LW`VvzK03Ck2M)-w5)mTGiavdY{Cqv!81%xXo1cq+In%pcb{Ti zd8R7W0eeY8Y3B|fNx1-BO1wy7E)cnwL81#@^bwc#ah)YAJjEf8J+!H)H_s0GB3a~wO-FQIRj z$=HuDQvJ{>X+F;|kw*CGZV9QKo7V`I0BB5;KE!2}x_YTa>B2kHM5pscdb`-CUX*$W zq=kMiEjY?rR(>TNi=Rn5ZnCb-7vhW{dLwGPLEm8Cr({Q2yBn0YE&|V%W&SLK+siI6 z8n(Se{&sfc6B*CEE6LGUC6>5NE9n)QC)1FOG@zfU%n!40^Qk>gImG#Qb{Y7gMZ7;I zyH1=G|OZnIyM6K_s8XU63Twjssvxwlo6S zD48zpYo0_U8KDAZ6pLB{oN`-V%X*A9FLM~R@Fe`3A zq5aFKIw;o;=rg%%KeO5pQ)!qyc^E5M0G8v2&1m}o4=l$6?RS$U)cm!J>DdKbxL`Uh zq*eNfAqN0uCn=g97NN4Vup)&W!;}s0vkm;Rfkiethgg_qn<-t=2J&{jjVgqCg3AU1 zvS#dDjdUex|EPxU)JCYOHu_9Neb9%Jlg>n8js%hAPWey}@c2t9b$KL1uE{=09C~>wvvzGRQ z3a3h%^_DkV5c@e+Qfx#3J=l{26v7|Ya6?zIR4CPbRs~m(HzXW}tq^O~m|(xczcxTI zU~O#R`?|jIbLmo@`=BE9|MvV?KGcmm$hfwWtsgln7#5ui!A+}MV5ZtC<{Msk_GU3`FV#d zfYEa>&he+an8|}O{8+1aeqmpLdGKd64y0{nA3CoS3KB#Mb924AD2C`q z^9kYxje$}_ETI?S{=uKO$pC1h+Wa_LSy~kUlFnm4vrGS9TV^SiO&H6gV%4(%71Sa2+Rs8);t26rKbsF` z;~}9ifK)V~i4X$1))NEL2f1;wxj>bEVA+LBsT--IhiwoUq?c}+9VB8Jk$37?3#yg> z+d#8+5;<)Mzb%Ahwp@yV5tv&+uQucpE5WG+XGOEJMQ+n|t(st?DiYUmUnT9l%V4f0 z^d!lpgO9S{lc?J#V7Qe>f#PE%ollWa&V?oyvE|c4Aon;)<9zl-V{)_@)tlsWAqsaP z`(vfUR89k{$mEsK;wny}hLWnP0w58Eya?J{SdVp#cKfHG*e_6leGJRm321c=u%A~5 ztp=`(_`i_K>3sT(=NAIIB(O`ly#h_FqL{2aazJqojnSalm1MKZ)T%}a)oEa_6bfC3 zdR@y5QOyjYbi0(9qk^P$F8=CVLYzDz{(K;@s&h%o+mZZP?>iqz&ZG0o=`PC7fa7B= z3vv{>;aCf|L#a>lTDd$=A-ay)r~y`>R(lI9p%KU~g)Y|;XK5XYTH5TqPbaLQg&(q= zb8-+8IMM&Qf#p6Jf{WK0Bp!C-_w=Hu50G_pp_mT>(Qe{5Eur^gXA2U4MyQdDP=OtF zK$~&S#u1F7pmhR!P7H*O@R$T~@GulV2?A&MY~!5E6uROxN$6QFv^m0rMZ$`8Ufa43 zPye?o1PaQZ*ZI~~;V4@SnN{ZFRU+C=5>%VWPTL4(iqjWJ7M-P0!Ug1}t7NCIvcF9g z;vEt|x}3*L$uiy19l;n~RI`%K1K74UtE&8Bha{wzB0<(mzuHUO<}dPtA{B`ojpZiI1@ z;QkVnA68ISguj+c7pp>5Gq4%B9Cx^730nvh`O*vcvJ_w?OM}m&*3jt#a;J7PUT%7W}Oo@%_a~ zS^Q?PEdEuAtbx*N*vsa=RUs=s!xc`da^Yt!GXDK~Nq(ma9lS@zNx{Wwz3YS9^*rYg zuc8WBQ8yEOAM(}!QK6Ts$%m-tMl$j;UfiVf`p7PI9QR5WjwKIrQVQz)xBvNXxLOA`{+c$D_4mn|me7a#7)5v`LH!Q`>ip(V`;> z>mT`%MJE2fMJ66?mT|JU!!#dE13qzjMn`yl?D0;CKHbm4c%&7d8x$|$yb6<@nnic4 zvPk!qw9+1|Z;aZp`B%ideqY?HAG0{g=i-|Ff&%Z~h%fyGYhwLcJb1bTzRxA*rJspv z*l^})^y~%K=Q4->y~O=%iO*$Y^ix@-|MmRXo01M+qiyAR7Vlw=06WWMlI8QD>ARWC zgD3_ezS9T@9f0|}e_%DAKTOIv26y(+rzHrdj)C3@9;02xLVPb4KPa0ay*`14rmK*T zLQvxr+Qm?hgOKPD$fqbBL)VU;!T^4nFPqRSLwauv@~t+qX_VY45Nj4?cLoYD!(_6E z;d>>036#DpYc#D{TYO2jm+wHL??IMdliOQw$}QGDy-SDpJ2a-bfkS?m?dk%p%Ru$> zk#n+%R=&=**)uE4ECxJ}UN}oqVSyic8?wC0lrnkDLBSjizlk8Gk>w_tUPg~&k-z{m zfk{36OqV2n-b|vUQ-Y5*(T0o=?L?o1_$&!zyD-Z3P$9O7E-F#mFpT%IS|P^oB-2v@ z<9HMTo&bR(Si`*B<|F6rX7lutbU`h5Lo?Ji7DWXQfzT0c97*A{mkDx^33QN&R8{T) z^vPbhos;m?#f9F-AaKL&9E#3#$Lhzc*bAxFZk7&`HI}D)DFlKyBNN$N&NT0veL z7k-PPb{RS=0M-F8w$f3v=@bM!SNovM!m%l|2JmcLoK2*98vwv+e3GT~>@GYOCPfUF zJsqd+84dRgNPOm4gd0KQQ&_EXGp4?(q6QQ9nUv&}O+kJ$pexI2VH+y|-t$O&mmru| zliaR^yw`xJwGioAlG{~Ph{#&gg_wSfEDb z4SK^F6}ihH=auMMtu-Zn#hc_okgPI}!kATim*Ba)B1ymUt{&Zc9=CkR~!n@p;p{-za2$g0OFv2x1QN!W`er0(?ff^b#1o4Cmh9 zTs8?E*HFDy2yd52YW;6(0Q454{sOYlHbis<=gdYlDoL#Is=TA!?Fods({q#ss*SD;qFR^V2wRZ6YU zs(Xd)lK=Cs#H!G3PQc)`!uLNS_d(^3jNuO#RoRa_*Z2;{W=SGX39=%j7ps%EUKwWa2x8vijX}RPk2X`~_=c(xz&M z_D>g?A}>N5L-*|u#W!{5aT`n>ygQQcnkF^tw4a3$`bQ~IC(XY-Q*0O-SPa;f< zKI)&t;BT6IbLug>WH`sj_i7~bM4Mz_(+PCp$pkn* z`FG6{`A&s|A4AROoH8U0ho5yw0Q~o`_^tEtRu;F_)&)$Xq{Mnj5_Ysu5k{=;8o4em zlyB`-KD13^k}cTt+UGQ8`9gxzVD|X0#hv+$1QTE268=KMSh+_+Si0FJLcgZ1)vskX z_G?+9Hft5<^ZLvuvP$Z9e(H6ZO};3@&Mn-?C}7q_@xwb@$fQH?h$u5m;FsOvK-uUb zcJlnZ6Y}VVRojVcT4_>q~#>;YNk93iLrznf8wD-8fFzY0J$db5XQnV3GBKxJ=XqrO1P%Yw$gUd;5>~R&p z$vk`M2kv2Wqd0hA-fnO`05yry>_i*!`M_pBwjR|rU6jfwX7>_M4xk43$i1oqxF31O z#RcSMYIQTkdYQ_--0mjVXdJ>2v_5{+9tc}IQ?DIHt`_jx!yc()vw`J}&(qffjJBPi z^%ktzj_zy+_Uu4~6`i{g7;Io`1lwzQTn+bCL2ye>MkMcWP>RsMOMum4Sa#77`p4!y z>z4v3MxrJSAoy9EO}E=O0gBp zyd3XX9{7C<#(V^p{eoplj)4EqH_gjQwTI(D%ZF7L4An83m^i z>b3V70Yw>jUBr9jz^qGnyg8vXWOHIllog+XI_+(c8=gOAhv~$dGOb@_rb5fcPMYGbaLm2Z<-NkxGayj94Gz zJmQ?kFqoYIhcgK9<7klM1a&jqKFftQ%SAIsT(dw{MKOC7cE8GFR(Z|>QqKaTei@VF z8huo@$=H1LJeYkR;ak`5x=56Ik%HSxjH+EQ{RXXoUPOmd57|9PwPLpQ4qW=*D7}6i z^j2d1PjOqZ+B6dVEp97@XW4cZss9;rtMUzMn<{IL_bDvf6kn~Xe(%>KJ+LZN@6Sr# zd+kaLD^{SkD_u2faOi%|O1(@|lZUd9tnjSRtS6o- z8*>Jx0l7`F-KL0axdO~y`$@exkqI(?`V5w_0yz(jKKIuwGxD8Mxt!yaOQh{CQ#^MG z=so*0t6Y4pT`uRcQaQ=#^&iy((;c#mC_eWcAn-3sW#*9vnWxRh#3L3N)dcTRSeT|n zk0VA?Kr;jzi;%h-gpKt>YfV!j^z2=<5Z0Opia`?DwC1F zu99)WgDC{~acJ@s_f7oNhMBuVrV+i9NCG|*^W#v@Y0yC7%+1!zy0+agx?W_fE;30D zH_J#*yeJWt0Euk8C6V*@C2$T~*A~lUul!mfv@;3Q&SYrvHiz0l@9LXUpJpa2%PA&!%zi{peqx&*Z@As)v?lO(mAz}=j{IFdpp$dm`= zOcF>_`*s35fSI3o8fIof&Z ziI-^MxiWT9<^yZ8OlABwOJrVNy)BoQpvaTEa&2mt_9Zv=md=c9nx(9FeXDX2!_@^K z?E(;go*eTU@3q7STSRABLOh;_?k`bBw!(X_pwulBM$8>?pwD#6Din9-1U22nQDeVs zr>cE`J~cg(A`_E7L+vy<=)e;|GqgKFx8fLmVdCtES#&qS;=5!0tbj?cu@Ne{MxexD zD$62}2d$S51IJ#7ML+QCWwP>c?50x7!^P<(A)xK00_Z>rsUECyZjuK5XpL@WS{Jd> zAhWenXD2QQrOvvHlNRHs%h$!s>CxNJjQVi^_cNRJpwD!%b->E((B!)3CyzAPd{T5Y3Rr_rr!|Q^4$cDR;A;(_UPBL)TAGj5 z)X##WD94z<3c=t!F!eYX{zA*T9LM*4lw|c$`?4IR$ogarCbX(KDJ-W)D7ai+4t9d; zl_aGr^GKkVPDvGbpMNqa#k`Li%nB&J&aEUtj%aXlGUDhIcvyq_j(@Z`KM76t3ymec-oa%%7_SPTw>#Ye&G6Y%3x zDA>8=)e1>8=Ym)H{EDS;)G}~34^^)ijH?01OL2cx*P(9LQLBb2z>YznnbzcOsPi3| z13Gb}cEY85Nv03*I49@T3pOj4?#CnEhax=yUw3ls?wS`581IEU`$&R&m`Va*aoD?o zKSi;58QUTCd~oM5X0{MIK#2E^gT)EX^$${ePxHaY$imMNq|6gY%mT!7 z$Ycw65|_At30YDBdX5jbmx%vaDDCSIJ%zlKsk^^-(s3yZvhTGKpu!u{|T0I>n8B zyYN5!Pw9ni@3kFMlzvdjv>qtnDy(X67Cknws%Gpx+N=?SX;`Z4*4V=im_##xte|RD zn0`RtRyA^Uc4hZ_sc(%b_UY-F)}s5q|F8dOj~egm`P=8{>V33>W~D#I-mUL!(`5Zu z?iR2RIHAnX{^-x;E0j$?`Dfpj@xyhp`z%dB@ob;{+cK6K|6Zk7w!c>;J5RRAg`YOc z7T&3KwsYiTSANBxC^wIggq>{kOF;hq5|Nu67J1IP~p034FgnBEUwB8GRV& z)dFcZ$9_umv`bkWzgR+3o@$w;OmCQ(RtZ`3iB?GfEyF-+hUbsKUV}hr5O^Pc9LD?i zZPN4KPsuzG9Qlhp8U4!wx}xDK2ddYA-NZLe$3>bk>c#gn-#5$dQC zJMT((hh?%aP%E{;wn|5_rGJp<{6EO>+&@T${lpw_JHxg>t50s5T;zD=H!{bz0E3=c zx-Zjnugho}SSLXMr5OeJS8dVD+$N$IIdq&4~Us=8YDN456?%*|@ z-0`{F?QuIPOQbAHq$oHO2UalWEg_do@f^x@$FQCaBZG|6 z=r#o-9|v}I1lc&SJEUu;lb8~L*)cZn@q8@y7!x_}qZzQ9wPH^&tRAJi2Xjl~4ayuL z{IIZvb);!z3-xp&K0A4S&9Chw3bdKpbPJ8rP57_vz;PY#u@1dY)$7JG^sWH{OD`7L!FXj9Wd;` zT~q}Gm-2TBf@A?nmX=^-F&J+SwdH)u7J0a+^GMyyyFpYIo0ao#9>gq1Z_CL(AK_I2 z*b3-o0}ffK2*N51r!rlVuBimraMEQGGb1@>iw`0_gc(vHbD*!fp7WNrZ%tY9#jJeFV8A7;2+CO@)MCr41d(en*xLZhY8K12jP$JL3$js{vttjh zrrumj9oY%uHdM|^W9bxSl5rd;3#{?TEQ9^F)X^AFjvRxU-hmCU4R+qm`|Myv(o0R- z1GsuY_cBMiV0lk?w5@qIOu8hIa#-J>d zn7#Y9~#mJooPp9 zba5{33!r=TOuo1QRL}bs1FBSvMQ1*m#Y6w44Liq83~dlEktxOy3sL3miW>W>Dc^lOz8S&(NUD% zB}Qb-5hFJDZ_+paZ!$FhA2PP^?=rshA2P`{vBtK+WgGt{V{88+eR?#zYr&vUT?PfEAA;M9YxT&4i9aaJ!ABzjEIcr@)^lS%e7UCT1ly(|k| zOR~cL=D?rCT=qJY-TtZ5yg;X=IYz~`;wGnyd^ZGd(ICFgpid?#h*daify8tYg!mSZSW zu59OAXDql75GSSgI#x6`DxtM-Uk3{fwdywG;npb(<(Fz0e8~Oa);4@g4mP`PfU}mO zYpDuW@^?As+G3bl9+u`@&dIrymUF?ye9U2mu-_uQNTpn^WoOH^2Fby`ZGmOxan8<$ zV=IfZCLmv<@Mcj3PFHm}8RZo$Ol4qI8Z0;&kWOS%n{_N(j4H{&u+C71Q1W*?;2j@8 z*KjISR^{yY2n=5Ub0Pt{S<(HZgt#O<79TZ{pwSl6N}#|YB$z}3)?pM^qKg+K0);2M za2}sGbQy{r0#y#DbRCHgT4-G4M6a)$7AKOm6DhkDYTbe>u!Ds}8`60P&(%RG z-km+d%t2yx__Bwg(?dMZFqYUUZaYaY*d*_3fMu}R!8%XT+E1lxhG=xi zGYZN(;`I(d|3gLJmmuxS*;H)$&*1F$W&6|~HDv2w3ZFY{S)tjGWn=sL5|~ZnmEqQk zjZf)3MtPk$AZ6)u&k?@(u}@@C&4XGP{c3dsu3286$Ga%;iZ zc*U#=%Z4)h>ysOhR~+^Yt5g*BdC(N+{q+%E{_>e&_4IEmxj@TLzBCn6#4F7lLH%wOBl2ak6?W z2XIT41weB`nI`4B3C?-ru;>xQ?16o8(*JU_3;@7Gc(2?CEaE;_E?uO5bbUZg7jSg} zwr%IJ=y3lY&c7WzMhAf4g)q5cfc*&MI#Oxu3L^Mhsp5V;M*0z-2YBv&n6%@KSgCp? zL?+(PfgOj*;?XQwc?SSR7is(H1)1clwEyt5tOCYM`;)}Y-=5bZWsGzFz|mBxKO8UB z2O^~M)nKW7DNtHojS$c4@nSoO!2M1ZjFFD3lZ8@osep(v@d)nuC-rD*ZTh}?u}nd4+6GlgBtNF8QdHHE~D#!?#=%tlehkt%-;GBnYjxP z-+?XPp@zKu|H~)<-ZzCqe=`**u8>jIg##zB z0r2zbzl`xd0Lh)dJ5S{y)BwpOjdb$7&H7Q{&+ddTwEYylR_PT(G@5=@Yk84X`8mG*UxurW#}C9A~3CQ%Ngf z4HAc)nz$42cH%I%Q_id7_L?kJOPW;~Vs<66X;A_-Vak5Rkg8n3I3H_K3Fr1A2%EaG zi`f@&d0{Fn8e(KcD$S;>n?>0*i^anr0zfr?I7Dl}=ER zm`#hm;cAtR0%hYU$Wly>zD#%UH3B%WX(!yk-wkSJ^0P}JWiJyto66OnUz8{&a73_0gUT^Evkb+8GV?mZ3H(k%@Q%%c zT4Rw2Lj;Zjc_Tsc(4r-|%9I|+40Sl2FZRuq8 zI4B&+awdZRauFOy&Nri6p*>Y|>rwuy0#%)#XF$3!ul=GS*4E${^X**+WtV zmRl=XGCx-X&8?+4T@CHkPU!LilKvmwlWI8=H9q@Mz@M?l|U(0>T6 zW&%g%Btgq#p!@{C&PkTgS^`?6puB~4eGC2PF35Wq;JwH81pVj}^y<%uyZs!%wJQ2P zt?47b#N(ytt9#|ks$Od_Hz?L2Pye#a^Pi??C@3omDN{Dd+(x_hS9YurXjQp7SE1C0 z#0rzU6n%G)*dW~=#bNClRs`1l4ly>WwaMx<4bJ~J#rj){wu+Yew7ORuRglzIr+Y8}E?q4-Z}Wm!RZXRq|yjHlkMmsI@C5&6z<{jT_fz`6P;`~wz$6BqaLjRMhHzRuBD zeLW76nJ5EbR_}pW8Rg_Tg3oIvsERJiIZ00ZELlb&#^an=CsZAMGhIAy zWk^3K(;kSahm&j{0%Z@kcOgW2u?-mljG{aY{}_O*4nbBYAmB6aX7HSGGDY!p?5IUX z-p`duu()e~l=QwDD$9`AmABL67TDd!@~WL}__=FRM?v5FTp%4_Nz(YjRVjSwiWI(n zL)?cFWcUEDZ-1gp9!1T54gBRRui>%Mp1&exd?dNxbOv<B8t{)=?eUxqRU4mh_O&?{6K^A6X zys;r%0QKlQ_58o><$j&~u)0{pb+SNgzEs3iUS$shb+dIJTTF!=59G8-jVMX1@MT{&!@XUwH6rh9@($||ye4P)2 z3DTi-k&kMv*X7bYltmM?l?eHqa3#^G%#@aMXh5=Z=2iqv)AH|&kZQx^*o-|tvVq7U6B25o?Fihy)3-keF&HpbEY35PWJTdU3Utbee^rico8uk3l%L_X z3c5ycRvv63z|?r1XL3dqj7{xU!Oa+*d;_X9F2rh*v=t0@sXVO6>P!0oO8r%-wtV-X z&l2W$@BK7iH}g|^q-d!atC*|%Ts4vTD;63YRhabCBU94dqiAiUXC!NNS}98FOERM> z41+a-yMpF!y<7!x^>cr7_tQT1>({!MYO%h&Z|ZeBuT@{T9_u^P&q4S4*sZJ*{^;p% zih{0U?pM(F5GJs#*P`Wdq)i?~)=@jQ$RduIdCvS3NYmpSdyZ$wBnUZiI8~-#sq-M+ z0&H^b^#qyOpDZJ<#QJ)fk*}xDm&-UO#Ze?;@6l{ZexNt~&BL4^2RUI4LSKfEPDeO- z&e0b=4eBoO_v~Tn!E7@yZ0EiZnLCm$i{zfnzMUdX&s`Mva{)5o9P2Uv*7dB?`LreWiTlzz_lY!N67E?0rFd`sT1M{wPZ_>X zF!qCgmC;ZBRi-}$b=jsr{a2ZMg8cm8zsvCUKT6Ni-$~oR9r1MEkv`{|xC*do@&Ba* z3Az`u)5ns#T@mG=s2Q+n4Z&F*SPQ_EOXquhmaI$$Kwou{dqCJ8 zfK2P|y;@?0ArJDI4}hquAoLt1*^Kw!N3XUA$-jq{jte!{&3DuXnDw%G>725-LAqX* zqJjKA5Vr@ZLK$!$2FO_u#@U7mK8erA9mG z+n&-Ub$np7W~U8zQHChZ9Xwt=>Gq-lpTUi!Z)dF&eY)fgg5Y0xj_@#{G0mh$7$ ziG~H#mGiN4<d1j4Wl*cnI|g`<15xASA=ldD3<`&3&&#z$oXQzE zr$FA&G}60sK}D{MN&+c!7I9ilLZo>i#fxSjuwpgEtw(8&uQ{108i@bZ9QJIHWeBVv(4TMG3a8$qjl21DbEkWeD)u zhFfx?c1b>}U6E4|;fr-^auF%}Y{`P0FI3bQ$jDGL}!3(Bd+dQl->+E4aR_ zY(|O-L2De{rFrAbZ5@&tNUNzUgOqk;>^jJC0}d|-jxsyc+R4@kF>eChTOh#g?7O*N z7tikkeFu=z`?L-*02%);gHgBpS}1>`eHhnuG)>o3*5~kN`Rl%EN;UE1n@;F z$*c54ZN#?7Evm^6uy8zNdxQk^2rB%5|GH|Uwtm7tyFM%N$j?FI&uKrfYBJ|;U)~q^ zoY^WrXK18V5qH-P8CD~gxy00njVh}{F{}zW{>o()d~+3QzpincdQkA!Z=3xL7^Ze8 z#igCSVUG$@z5x{q!2Sxw2BHf^56^5 z1&p88!IfH-RxMlcSm9X3ZhcfU$JtNs?^_U@?jRiAqBF?Ic^>xTz)G_woY1UXU;(mPLsuVGGz+C^5h$-G6|!ZLN501i*h;jd-l$^Vq8C;vkxAOCk5=knp(|0F$xakdU@ z1G(Gcg6z607f7d|U4hE3E1W^e+GI^YmxsE~APQI?%axi_EFIvVE*#yhi1tk!HzPW< zu;l4sIWiiq4O$5KRIvL%6g5A4v0-_D;XXd`q2n}{0oy|$*C@w*RLVV|oELcZ67kY| zkR~r6SsTW^i0QRifpo}z)!aM`#oP(GzvvQuN`E8unF++8Kmi;`%f_at%V|?D;SEE2*i-}wxc_WGD zxp*1eOO^i33>o_%U&fB)_+0Naxew{zAnw=|8rwg_sr6R6ctP%d9(OyR5^l4_^=+<-N!8Mt+F>_C;M1%^wn)ruWS&rV^jf^xeJc&8MR zqFkxpl1m`&Y1^ip0C7KT0C|tuH{}Qw;1jkD`N*~|r|LH3bj_NaE?<>1kmOTUYjUo1 zSuW&5f>ry5v|pjJeWQ|Uap@uvC+O}F^0XWs7UCfVv`_LO?5aEzv6jh;?U6$MhZdvz z>Oi~Vgl-cTT*>mF93ou~JQri`E-sxmq_-H0Sv9dGRfTN8d>QwzM&_!;CRPp9*6<}e zSb*CBP$yqv1GR!SV7v{@xs5NlJ9mr$EK}kxn`T5@KQVQ^{4aEImgvQr;S~?&c`ur@ zhab#H$%G83wF@8~2i_-G3M>G)D^`5dNnNrQ(;_!fUhb2Le;;ecWBiH_u|wQveX73c zNBqb6SpCyL@24Q{C+YMb1Hu1LKQ5o+ss07&*H$IIyA^&Fcy~&|xr)AiipQpY`elHZ zPb^mSHG;FUU6XaK{P$~Lh2S0ZQWmTbtVpKtWKya3D85yH|2>m?y#vC^G7Sd%nIi>Y ze=QK}f$5I&#bYX3eq#rTcc`#JupTQLR;I3mSaDeK*J}J;ipV=Ctd}Y^*4Lx7*lJ#w zzQV7m1xzn8$}(5$UQtw@I<7_HwGy~CHl0fA+iPoi2PNXIk&dsixcV zVdEWnxA~U5*Y!w_bl#Wu+HcGI-1h?>=XlMg9CvKXN#`y3$Z-oq-jvh4#`9TI$kPi* z*h_M)dPRcRf)$!1Z4nP zhd~+^tbpuijuefbQ6&C{8obwlwF0vKt*uO|Mys9rH%hc&#R|gKFXvC}`YI(hQJ1DY zC|410m!h!pV8cQc;rtc36v+$@n~4%T2&{XnlHgs+i1qG<#VQ@%y(3C13LBQI5bSU8 z7d$qccaPpiG1y4buwmVs+v4YK=qup;o&3cLC|J5a1xt1r^_>`7m7_-Reg{F~qY z1B3Q@?T#nhpt1t-GrCUD1M@iGur5>dxbAO1Fe0}pGFyWF>wb9>Su3}c2EQ00i~C|^ z=?Ho;RCQT5DDD!HqUL1ZK5aFLUpM#1${ld>_DPGu=j{u0NI~M(s2pom`Nco^k@!FJ z+v4{OayXUe@BGf6NYGy$l3`xwqEcq`VWf)xE_>~N7vfuor^soIw`oQb@@q5zhS``m^bXV=X zbQDnQ;r~`IOYbK5lJc+m=mrX{*f8K^4M+qd;PB{GD!W?Ug~yEnF`X1t-KssKD|aC$ zRAK$@g7gni)a-{Cw?i2FxO@=k8V9E40&&qnGAF48j3eW^RfA?t!oQEKJ`>xO|2ph*wnwHl_vI|=)p46gx$+hh(* zp2Y*Tz~W_!Suw!Yg(Bnqh=Mm|jyB}? zZb~2hd@Nq1`7SthJGapclNKCb%@`1zEM1y-cMWt~JGIRY6}ll1s*Ibzk$SBIy`TxR zc0&{nE@*8NuK6aGXbsTm22i+`+!ICOB9!csNC(X#qQWi?7(EgyO+yPQ5ua)?~w`GQsFnYQNFZT`00HQcTi36eaI4;ly zeRfM!41zJ&MbJVVO2&0K+1W7`Tv=dk1h^WSFhTewc$-GEQ5-(!SjJ0+5D5Yu4osw3 zDFXGI>%+j~@N6(Paa6A2qrOTDb3nzKT&rD^D+te5%a`SP>5^Q ziZy^-xh`jN=j9?Q^<@QS7BQExKZT>7$HL*009DN&(~Of;@Gb)--HIA+$z*Ud96gWv za5lJTVPR8%-K!vTL<%r{7w|YmeE3DE+l5e9y{r^!UCDh)P`V4Ki5IfiC;+%i^CzSV zpsog}ZG4e->cCDqupCfg2ba}@#|?mXBO;o{3pBHSZ$+W*=6Stb=fN)KRl3Z52e@xv z1Uj|Wi=p15)Tk%1jLqi^$TB9tWtM{LqTkw)1RwS{RJZLXwwSHUnR(j#y*m4+KLs74QN_bG=551ui~Ui z)aqn52_Krs@wCpCP%Kr;hewwoCet1$Ee|$!UUbrTWKRP2#n4gQk_r7#shHii1lC=K}V->+-RpNDd~7QP^_b@Ff4<6qeMqpHS7(8lTkE%IZP(@0?6p!<0k+k&inoFlU}$= z196juZ>LHT1izItt(~)OVo0e}qEuHiwWXFs#OfBN_<1*^2VixRDAl|0v2>tTx6VA4 z?zvB;XZ};^o&J>kj|bA^-jWUyAX{pQrfs1Y2>@;)5x+T-URKVmRghPmIygcBr;GkA z9p~T$^SS^^7l<+r5D&uDhQPi7Ttq$8Hv17;djM&d5?jvvZjeL~$&Jc8{&uFZug_2? znB}rD)cKJEsirvW<#C!=91Va(L)vIeJeT)41?AJ!fw8cA=;Q4H3wutJb;9S;gBweo zSd&G4%w0k?2a!e)eJ62BPhz1PJ)bYr*UC|%$$p8p6T1dEf1CJJxaIrf@rQfW7KMpHU&r3EzFU`;`)H7UfWy#<<{LR?-+$@m#QQ$o& z+rudE9*BF#Tgm3SepL8@GxT9$r}w;<#Ud(C`cdNt;Je-+B2n2q9Dl!;rmQwrFJ0jd z=|n|t!V=cZ)(ELJm3D}*?G(A9sMF1;$qf+ldLk@!Zb!XBF^d8_1?onHWcsTdd=ce5 zPAzR7b>xgxQCP0v@(OI!cHA!7pHxg?yqZQc8&mpfaK=<%lP-;B#ssUZD*Bo#)uIIq zSKtV+mLh>zYVh$?hA|o{upXM+POuiO$B?rU&Zi|=%sXYxR)}V6MYGL>SY=?gO67c< z#yL6#f)xj_#&AB42Am@xU6J&q$8f%nLdT8=KN29V$(l=vVJi;Yh+!Xr1|5l>oeDN2 z$IzfdhGy*fW{JCqehnbUUulyBazRq!XyoC#h(IdEv4au@NQaW`5vZA(X$+5I3&#u= zmVl+1?2fQZhB+ip%GD?`DZ>WjVsM{ajv0|l*LvkDTV#SR4j{dN_(ecCFpF7`MG)QE z4Y}gnk_)w~@)5-MbkV$AuGo~zHCUdjHt<_*Q{_couD>fEwLOw!_4nk6>yaD=bKmlO zB1d{3$p@W} zb15T8a9VQtY}F8#%V%GRPb-gZ=py#{EPkv= z)CG*7wt$Oy;Bq04S%8vOEM6pW+8Io#~Ys)RRT@ zY3mj-aKFDwto1grUpKSdax=GI?qJQ@)((Gu#J97%O+nad>{;4o?EkA`h%_M|xytmup$)@dghrM53maDkyuPCPc)T+q1M`dG0GR0oq>$OIlR^+vs z@ePW(W=gVx?mxNa3~cUnCYeFVzD^{4Jd?j+RZKNUd3t07Z-cOgZ>x0dm-?6ceK5N_ z@K0Yd7_7|L0Ibs4T?(oy$m>h;DcOp!yY#*1LpT*>P5Jm6KmFz(vp~24iqZu1)625S ze&c7pV@1}jpZU;rQW1XjrC@nR2T-hlv76L-H^9{U0VQ$|k$RQC-}~;%lIOQ;4*=`G zhxTLtr{uu5zb`YCnQsEkcTZ%Ks&YvNc%qGckut)ADwwwX?I~$y>*5s`Q?@Vq;fK-& zs8+vzMJfT+!q+ZK+rD5Kc`aIM_5%Bd5~cIa2$PyU&S_aaUlVAna}*xOaZzjWvGb(} zli}e#S&YG#To6v@9Y^pYVUcO#??&u3?TkyXMbwiW4Y44;ewUG|h*1ayB?oDax zze!>xn)AeC@h}>}MY3gc-?rE~m!y@D$Hwvrx|ZfmgI_IOowXEp9fr8j&YU+OgE^FW zF!py7P1YMg(e*si>Q$P1&XJjMqfSP`fe0}oV-I?= zc4y5Zt7H7;7Hy^o{*S*-C`c;1hGRN>~c~wHjR;3=R9%y3^mL?A*uM1f3 z1j>5RtldEIpaw;kQ4xWT8P6M|~%wk)_fxU3GRF?#S)+r zvznLncC(PlaXP`q52AkqokQfh41iV^7cZts*9E+B71}*Onwu}g1%`GXh41nJeQ3g7 zD$ql;PW9o0?gN)qW7f*=0B>v%=Gw;_^1@mNwQEW}W4xh0zQ|tQbPsH`i#OA89_$C+ zT6l3zeh_vzdn?zq;DM??Q7DaFQUNw=&^BVJwMlr+l%zN8{t)79A|Tw;8w zX3HkhoP9a0wh9HaobzEh!lC-Ha%mGTMTx8^pEP7CAF$2IqtFYmrU9sFpJSP4pI(gA4-o=Fv@aJ`jiC3 zj>%O3`C8Iv#0!AaA>#$o{^Me0;gFd@(Oj6T z1(deHel3M_l9e+dS$Masplt~)%vFG9IbTFAo-Z4IvRYP7RWRvls`RydX>}lO9qrL} zioxwXb|=s8&KZ?HSZ+Vat%cwIND93G?l7w=bwN)dUr*z9p2D~{%OZY*#OoD)bX)ug zH*k_}Wb_g?Js_Jb=5G?~eiN6%O-z#8Yr!`#GWN78;MJ6NDK&pXSJ<8L&8K~6*t3JAq(T4u*8(&~$&3`>+pjHuf z2X1xcpg^myTwk9aE7bbRyn58P@0uCEXjtu2yGgrz?=OBr1uo7P55h-jeE^NwbrW#g z25s-3%$EF*L#wcVfwa~~S4$An`A4(P9x~M9;!B66zz=e~$IowBmYlE%>VUqXadFjApH4Nm}?GKiU{nupT z9nc1HQ@=kP#gw@R`y=UbikGo{2{J{X(ilW-=mhCd^gi|MPnA-h$wi3A5PU-C0=9Bu zc9IR|pb*$W=y?O<l`)HVy~MM zdo}-G@`t686J@QQL@Cxqp3MCYOYC1{k2^(adD#8rYe&XpVYa~G)EaT41W3UkkmN-{KfT-sr}3F6SK>^=ZVM-`7l zsHd@1&GFpYBD6>#$|59H(R3aA*)jt0!da$kg18GIsMUPtqX$!D6vOfiuYZnJg3kRI z1+~4X(!D6u4cNQduynP7{0-c`fmMPN(%o~Rg63RS1AO*s6>H&rT6A2NE(Kh$SU1Sp z2eNuV(}Cl3{NnlYvUeY$kqVSmWbF%tv7+~CS-T5n+YXYt(12YuNw@Q6RX=X{Fc)h$ zHgSll6UM9qs~gUgNi~Suh@Y&H51J(W~H8dZ(nv#4CC9@hUH9Vxca=1bzWVJknxwoMNjiVD+f}-Up7d1&_L{kf_fnk&( z`&Dp~EQg-v!aB9&GifFmZC_8kBtj4X^uZWn>=DiUCehdQRvSCoovDhpjXnaIk_ zi%oR)5?*zo3H_K_FE!m*rMa{a1ty~dr;bWc4$s9FMBc{r3}PQs$K?XaTbCIZaUs}4 zY&5p0*l|!5vvTq*re(${L{cM-1jP6|6xte+52ymH7fY7p9FC`x(ALv+TezS$qUza4yTOyR&63_+W z5!(~spUEsgGAY_-!9z39elz)CEv0jkOA1#`E@(>cQf~D!h|BF*>STk$mXcX+51Mj6 zE7xTeV^hBeH;JdaMGV|FTJc@B2iUA0Gj8ljpZ7y@rdFd5E1W7=8T#s{7g<#@_A^XTHDd#PyT2+J>#?DzW@3ZFqtZ*Cbs22U)gwP; zucnr~OI2c3i;WLji^ostUGx>|UV+tzuw3Jp{k=mzaNXlL%%mlj2FhU-Toq&upVjBu zt*=gBwbr4HV5|rJ6K7N88>CViD(jc`(s5q=8LKZVGf$TWzE`D3Uso`FaN26-C$7Pr z9z$CdTkpP)Obn%-_#jdK3vEgT+M{IBv-bQsmaIGHtOiqeu+@BYT0IWZRgJ!xl^1b_ z(JZu$UONxO-n?8Sn`~?Jgv_H=cTlu#LlvIlee@oVktyKH3&U;#VkY0hM*}o>?~Ro1 zw-V76lcb8bS@mkDRQ@bNO5TX3-^41_IM6EIN{})>+WONJL6Q5q(1TmC5j60l%O(EE zQ9CJiX8JkETx?(pfwtOK7SppqJW@74P+R4sRMWR!Sv`qRgolw-g{rb~DW;pV`kEb0 zn32Gog*zd{ZcspLpW3$Ez>vwtcamfn1KI$_v{7Jc2$Ss)y*gfeJ|pO`V`M*!0LLBY zd2QTg1jAGZ2C>1Hjoq(-W}5fH^>X<%v5#}7hBTTK(Kq5U^~_=|dg zwqE*X+)?PUJXag$-WIZ~v?-~X_T3I%mj`t5BApI{F2fM#@yn$qB1MN?S`}9h^-D(T_@j| zve;hK-a(XW509bNuci+&r5P(gH~8uP0OtBW_=>VTz;k)Dyv(~&H&+jeb1#qMIRn0u z_2D8o#HC;j3vGk7Dz>_CKD8kdw}ZPCd}0lhtGoCXIw*m6fxpeDz(PRlo{MkTx0Or(*{KIZcOB;|xP~3`J=S2P&?@dLwC| ziN(NiQte1&ehl#>Q)3F1{$RxDT)SFyUI$ z>0WFS^arucCG=ofbji9h*1};~A+%))j9npBZH2|)8V%{2g`}=yd)y?g?M_KQ_1QML zgKhZ%BJl%O^H115B_Un0^>aosD6A@TRo1E=DMi??=)p=?6=Y49&@+87GzC=!n5Mt= z1xo6%p3k$sd%!o^(C3OW8IeZ*RYdjELTav&Uk&HgJNXK)##^M2=VwMVr~!JHQoo({ zT3^D263?&cqwO>SsUu2{73LH}6}uGIa&@SJpI&2z8JiTUTt!u%5lSDzmo&wJZ+LL% zj}G`i(0}BGtEP->MiTDQM^mshhGqke>SfN=NAOGfi`T!nk0xsrfBy(e0yIZI!(L4% zl-|=UD%QbEpCGPK>c7oD3Z*Dr^agWj)-q zCbmrqV;W4xUoG7l_7oSBNBHFfthFe+xpb?Qm(vJIc3?pbK$%Syiv?0-5N$h{RqfR1 z8i9;DPWROxrWwA~4i6oL9*w~xM~@S9$<{+5x*I3)&^a2SFv*UERLdYdaD+U=aYBZ5 zKXxojmUw+DfZ8I)+9kGSoY*s@RZpYx&K}K>DGI97d$E0Qa5!$S0zp>f{J^?QF>Fzctislra{z8XZ1Lu>kK@21sb?O!E}*r zJ=Teyq$Xm_N`Up~dvso(;^d%F2Dm78|)#$EjFqVlS( z#%{=Nk9OU1+zsaSfQc@Or0rCpJ5Y?<**Z{#yHR3Y{0O?a&IVq0T;@8I-A0Id6V|py z+*ZvY4yIEOaK=iajZ;V?3T{1KB~^W!=#+4v?pAP{QXZp}$106N#Z6+A4V<)`rGL4F z?hwBCf)HALz((~AS0?adfrC~<8>(YE*}&1*4k^)AAJko|Zdg(B3(2kkFD;07xy579 zoDpackqcx9W|na}ub45B{&DcqP)^Okh44JZO9aX=@GKaAu{9J9bu0`WIJky(*BS=; z*vV$Hk)8O~^;ym-}xDFnt^rbt_) zI1A8(m%UT)`R@1YgHAIp>4i^mXu zhpDViQx%v=V)hqnuX%n$3%X~Wwm=boiTPT~{9cz?&#jR-wZ?ehO$6OdAoC^=d6$6Z zJN&-yrL@TdlFjdPLijA7vB1eqOi5^xpJP+{6w~l$sf`9M^;oN?s`ILmc*jtzdt)Td z)zkK#9k5hpsmHq4ejPIl*k5m=9M3@39_4ceYx>t<*DwHacDh%!H%_~&a=1YB6P&HE+ zcB_c252ygAdmpZb{Pk;J*oyz^TfhHh%aX$64jDCk(8p($c^Y_C1ob=jhd=Sb>+U~( z=3CP6+9mTD=prM}Agp4l@n-9RdA42p;`RBJYZ`3zD|q!I-}C!Fjo_;vc&>Ijo5o_R z;;BVHc3qc@vMH!)9e3=xYy8ddLi#UP_ePn7=Q|N33cnm6YdE8{edrcG(c8FIHUX8p z;dQbC5X`}@G;?Sg3-Bx^k`d0$vsA(c(epZKZ5dUIF6YWYKvO$DTvXrMufY1S(K)$~ zjp|+lOS^j3^HsDtIyi6I;y5QJc40HXaFW|cS{vzY_9-c~O=Czm*2Olbq!a8BqwQtA6p%6m>$&nATWI718hk!Z?=b50aIt*xy-9T(b*c}A`Cz6|C zgJm+q`F;gvxPX|tda6)v64JN~#%PGvGF>a1lwKD|HC#rNon}EXiPkyFLSYzZlZGLC zQkwZc*<>8QUNQ>3_!2ziK)GPj?QsnTaED>mLxAxV{)GvA40AY?mMEbvz=YSLopj>i zN&-;l0sA>XdXCcW6vFH{i;-z~#TiCUHF^5klP*<;|^-F$QuHD^SI1PJ7osG&aA?5 z$wti0E)!(ph*5&vh&9hOY~POV)4>X?@Yi3|fC1F5(LaY7D(+XTZ=f+(Mc zpg)EKgE!Cx!vKNsY66dGAPHB|m)pjwo=I{<7VVgs*ke-QHEBR+YT7XKh}IRj0ipLru=d5~`(Wz>d70b1+VaR;_gd>iIoR=u9OUvhx$F(ft#3kZ z57yk0!pFVWzrN#Vn)r1q(Tg{ zK+H@~GL7wM`XCI@B@QIns+Q9cvbE%PWJb8!S%@ME84mAA~~&Sjdt%^X1f z=WnrO-llB2jqm^VS5WmK9+RR)bBLXX$`YWvZ5QrQ2>th%KYN+U! zP->{CUhZRo-0vxcQ@x)e-42wRmRPI)_01g=Rr;vMUqw)bD@9SGX-M*2_K9-^IarWebM@^^abodsqXce%uJ)F^+;C``bdhXdK|O&m}v3T zlu`Zn{_dZP?Qf3x1`M0vEb}gvwyL!{SIe-z5sEr5(Qkz2R5LkommXC=dqQ@j@|uTw z=H+kyg}89_>NleM^6wonEk*k6=&@BxycWe+CkGweVw@M>!54H3qSJ$%?&2|*UWt$` z6w(b&zZ-{AWCMb>btp;J58z0Ci}VbzWr5S}6sOK1EKB+eTZDx6(3v@bhNtmK6JTpU z1kjB`xS!Lci_>%m?Jmk;oF|IK9)L}W{zN++=~ZEzMscia!l^BR{97i>)N*>QsHE48 zOhPTX7PB6#%5_Txr*|9JQVtomQ7p6{NjIvl2U4jM6I_Hvy53HZ@l!-qokuSvL1{X) zR;IzLF&wlLkk(PfTy)8K@NOE?J^5;^EFMUfTd1=eK+xPvkuvu(+bfZ>4$s>_As*Ww zFO%T;6r@|nDS6>_gWzjF|8si5&_VJhM(AoCrV-A|`|Z-gC3%a3m=$`pg9a!XVQn#H z=`q<8L&x}GfukF&akax{j%^CJ&rD#YOtGGs3WvDzUPs`Jlfc?AU9Kaj$)h)FjY!}= z0wIU652C?(z}Pm{H(fxU^2s*V2p%qXUuRGPh1@=#+r@fFd1oh1Bugg?BiC^PGhnq{ zyb%X-eK!QQl`puNMMe`}axXXRL0ooGm34uqJuv#-tBe}Ly3`HpHcuAGJSz&OO<1Ga zXmRbL>86V>vY8jtegUU11=Z${ilhU9*4US*AUE{+boq?-IJ z$Z0BJ$DAgUAsfkRKgu7c1_#DcB(>&`q7M?$TMC_GOXqn~GH9To;2N*lhhS<1m>Gti z7{=*27*Z92jWm>6U3dwZ5x8h{@=i45D}sF}6f_#WFon~#&eBbV3?)XBN5MW7!khw; zN}%4CfP}Z;_XmJ*K z6~T-(!qOCz3bxY#8-x!yFw84gqlcLuM0{}(jW*>Q@?i;mG?ll2J$$|P`*OVTG5YL1 zIRv~OYJDQt4|RSj`@q)cnjXsYY%erDkY}Cu<=OfN@?y)!@>0ta_VC%Z$Fdg=yRZGR zyaIRq8DjApb$8_eO*e1Tbn_ks)c3I~o#9C@!BMZXg;cLIZDC2GVU~%u4N0I0Cz+~l z3I^mb#NcuUb|keoS*dR4;pZ*ogRbDqu0}(sq0m|bORZ(AXOYtg<~9-p(o7d~ zCs?ZZ+Jl1cMUChQZWS-gbp-S9DBCcR>SGjAC&<2-VbL{{Ga$2UbIIgWAoR|`DCQA( zS9RbnOkllYOtzT0yUjG|+u-b7R@gdc_a1EZA*}T=+b4{}e5@GDjMvXdW>kFr9F}TT zV0}tuUPacAgDVVgRfK)&{{+|H0INCr4PjLX`jW6dvqM&Qh^u1k4r$eWuA-HhY@nq` zeUcrzYDnsDC@XB$$i4oGwuVV6U-jw4ile)~N>vp+P02D>ukv-gDzHASfUgHiPz?fu zu!@8RQ}s~|(keC9TdDkOz--qWfA$0Or23LgtBqBGD_05X9zD{>Q2MEReVBNL0{akE zvGve*et^{qDE8M>48v;mAWubLQ%^OY!Y;jq7LIjtuetM6zx&KLq~)daW}%>WQ)+5N zUz4V#FVV-R^~l#|e3z=?V@y0N#3))HhE&Tp?^D6rI+QFose#`8h~AMGSZIJO%h-`t zISVgyW}bqj&B3&0bWDxr+fBkaEXE}Y1sS1}#S2f;3Su4NXcye6ol~phN}V~~*{N=p zT_ao=&CbEr06%Re+Q*rT_Q$Z;TCg%bhgw+;raf?|l1L#tO&Jy7Wy?DjDdk&t!9j=4 zl75e7??PanILss>^vO8{)mgShuxJ6UItxFYL8F|aBV?W_!OMuOt3bi>al)hDOqLY{ z>Uk{6Ye0x^p8_{!7!(!H1#o!+)79K%cr5oFL)ad`DLV)rD<>VH95RNeI|+`CW8EFX zH}8ed_Jhp>7>$PbpX4QZzZY$^U+>TRn4>**65crrW-jnQY7TBX&Fh>7PiN@goa8nd zn>l)_Kqi5g5!NZg2*l&KbH~BRAz*I^>>NOA^=N&RI%M|+oV3bGF)8(M9}gJb4c4nG zSBE9I`TTp8X2R$D5X(K>z8fP|C+mk6;If4(uv;^#6f)U*!C*7W5zmq)N%Vl>-EiM- zUV{tR>}G2VASVm4xf3edc>^e9{dBD9SRPX@P@q|4v;p?56jq%qwwe)()r{0Y$+(f? zXbZ6u&7681X`K`{Nt|X0}L4aYORhtqF_@=&lhv=qY+e}|RNNo3WsL?Hr4!$)Hg9wYL}T%s1IGvH%! zfX0Q>ph_QP3a9P_PUmsN45_m<5gbm=q<0e>O$BR{xL+Kn|45)Dn8&#RlvuT!H07!? z(_G>hV42quP_HL};PK-Un=mDDbkanU*c27cV1n==rp=Etq+nLAB+kkOs;Osl2w=+J zk`v|RAXeXzlT~cB2(vhi-fns){#$zQ@VNK5*l03k(kP>wPtCC{Ag%YISN=Rur ztB@Khq;)WU2U>GI=IJKJCAC3byXe&E05o0PwvWoHmnNA$qN@9&Ni)WGJkGCT3c#E~ z=AE_-P%UN7bS?=Jn93KJNj1+YY5}X9QidhmN2{Eswiu3ko4LBxM`70=BJB-PM*ri7bFh5TR z=5^wHu3qA=DUYU~Rt-*u_kIaaJ~dR~*u)$vv>7w6X@XI(3;5&beK_TJ`j39%qolhP zp_DD|gfSZ8>91Wwio`w;)cXd0Z{HWt`nykmU0g3Q5bz)qf0f_*;98G-xsAFI$WyTP zslW!&d(J2NRN$w6`a9o|k$0oa-StL#YXhf#`hce1>(`3nFc>w*o zb(E-QytR*ltK>G;lLyS-eL@JqT}_!dkZ7dN=~rSI_QI?nx-k|K+GG)FaxSJxrcvUi z5?f^w2$=;o#^?>~r*5j*`KknV;OlLtyx_!kS;Z-~272kl>fyvT(nh7e#lp~2Y?=*# zZ#};9I%dV$b)FiMXI+F-3aD{9Q5V&p+Qun)7zwnG8lah(0IW@Mx}OI+XMxMv!-PBT z3zsG6<^qs8MHu8N>}V0F)P$&2_FF1VBURs~<7Ayh!3J<{j(M!U=dOw8`RlTIo?s)q zy55%~#PcfD6L=fNZqo)c8-SJ$0c%6LEPx`8hvTgUI=v^Eg@DvOrgH(p?L_@oiW}$~ z1a_yP%M-*KPU6X(RT##%I|EEE;53-ybDlzGo&+wZQAa0%sKIxc0Rh|%!Pd0nX7p4k zaxMdAPZrV$ibaUe)qRmNCD7J$wMts~yBGH6;=Vn6_8uV8qqGy$>SJ?rzaA*I+KDV~ z)*Y^o7#M*oN{_oS_;&LoZgd2_tdkpdq8<04aeL5?UBF#859)+(cYx1bVfb~GSyExIE9V9T-Mm5ovj|m$a zWGz2{8n!YhW-%EKg%rz6k!mZmxIB$1wfKgd@!bsFquxdRvp(5_C9@yRpEiHm6$=W0 zL!c-NN@*=a-LnCa)YvSQLpF&@~G#lC1KqYc*RDv5HEm;fM zw0~Nmn|O<2@EgUTG{#|liLG29Dj!J|_>3eDAS!o^7E|aYuOm6uZRP{S6PuU>-A&~2 z;!y^bR;B@sN!Vvnt57uohCoinVLVoFH6z+-R0*STCA4f=0;@OWYS}t~xhU6|#1oc^ zS1A>G8;7JE&g%+i_8oSjpfF@+q}?mY3vw}aLC#ueB`u-t(*~`qCXxZ5JVp!X5kT;8 z{X;CdR6|=I$pN1q}eq7Jxj)(G`B5IS$ zx%XtB^Oo#qJH+w3c$JRfD>~J3S1vT&maAk$+;H5KK;A?onGvyUadnE8o6MwNmn7C0 z$w;v24O^1dunAH^Ep2#*T5d}!flhItVNBzeLCBEyZ3*ezmf#Nd9k(TMmzJq<)?I^8&S`!uGi;N|4CcsYWDgSVY^K{}5HE9<(!%H> z(@a*VJFGA^dXsMHt=LA{rf~I;#j#S$N5rRDKLsxLd>r3k1Y9MU8v3u9ONL~sg1bxc zaYw@SSI9Gy>=Y(6BW&QH&3V#Y-W>P!|sedbOn(8RnsnDsQ>4Q&2O#`3$q<%{3 ze1NA%#<{Cha+hJ4+`vGq-qHj$C=5pYMJmXNJ9$seu`SY z$JSS)kLV+Ur~mLr=(qm9NATBS0-Y}+dF!X;XWYqJQufy)JuqtoL!r$Ft8(scePqST zv1c!fU0u=o;Ql&Z;18butuG!|%cO7q-v1+3eIS3mwXRr9AFughl$0AqU9sOcMnS)r zR}^oR*eljPQoOxFQ!6Ik`)tZiZ{gqBqLTJ8O*psD70NBPC6XBDISo(jC59NuP=9T+ zSVjhs9W^vz8ip|gHZC%jWtN1IVX$_X(`z#*NYiv68*Ce z;@k&$^kS~n9L077_<{p5j1FcjE}u#*zrR|9_dagxI$bIihzu<_m|8Ieb%MfOY~C-> zR(0BL1Yr;6AeY8Y&?4G@3ClCJQZ@7Hm^&|=Qd>=3=ZJs6G~~j->sGL3h13~flNO$% z9s6_}VA*^I5M>qB3>WRf1=WI9+=7zcn0%e zJhB6P^_2_}Wwlj@7*SQic@m3uG2X~h0JsbTZlxC00oi)WR!vbf)ui-F6J`=88f-}d zEve}^)hdzqs%Gi)r(2QoTOL50Nli4Hda0$5vEjvBQA}4&5$@k2&@~rRW*!KhZ9!{M7P0&kQ6ng(##A$fwFb1Mpc-FC!4h3Dike#}C-o4>Z@5LLtrGCSJ^{iU zkIyIxs*{E2n+E;S#HA$2a5`w40?AFv8wY@J`$BHj%M{wYB_V)RRP(lkl719Ses6$= zE@a|AqC+OsvLsPy)F7dyVH8e7p{2o5^tsXv6PUdum*_jan7$~dt!r|kK$}%C)YcJz z1TB3B#61Y&9(IDX4Ugna47&$AsFQYmF0Xb#KM{9-4AB0#UO^0g4b69d1GQ2IS}xr+M*-XqTkg?q11)X7BLRSFppzAY1F&UOK#UWx z1%Q)iqDh9HCfYY7QEQzYcO|v$wj?RV1ZWf5?nqqAEfabi+_Ei!J@+KQ{ZOuZ9?Ffr z2Xdno5a+g`0C6Ob8HGp?Pq8|cCYnrIO|6Cho2~c$ui{M8^d*9`yQgGbXW>ZWs4zT=0c{eq@%~#H?Mkj3iA?wz zg1TpwG=;Rq5Vt&_&ds`0fiA5+%p3raRZ8vo=gg$93utM|p<6B|Qpl$LM)eqSPbcPP|JO>W^vb3X%Y>>o#>o zME)YJYkv_W{6$%5QHKnV1gO8j`Vg}d#77P0(xh68v*CKtO`f9-kIMs!s}uF327H+! zYAq-@>`9G|ckT=i;Obr#%lsutA1cxbK1C|DDnRORuAL|Pf~R7t;HtF)p?*6-`zd)V z~exRr*=qH|r z38N1Q>LaNO4v!N{#Z-~hb<#}O{>yh=23P4&9YXg%RApS_bwRpSTDx?z3rOp3zbUCY zFlnbhOwN@_vOWjZZj!f%i=^|#`!J}yhqP$}_&7M4Pv~d+Z)D2yv5VxH; zXe;P#$IGuxKK$#Mp@A4~JM~;@DDA^}us68CE*{|yB2X{Tde)7jcLxR2?FfG%x?@L< zwGtQa;7&JltY$t#6M5KrmfEdaGF-iFH5e;I)RvIytR(kb#UjTA#e6HMN2&yeD)?0_ zw~$)hN*;15=$9!*r&fT&V(zS`kiy;I0t^_>&!Fo?@LYvw5{rOb0z6A73_1@$^VX+Z z4!}Iacb6-G@||Y$IFv_X^c<1mvt+%`qfGOFat>H#`rj!}Jj zJcczO4@5Nw#Sl!6p&~W5h04@cJC52t0@U}!lR!9Dtv2bo0qhx=-=Nho8%WdhD~9L7Sg6Y;!ZN z+w8+3PD}0y{ z+m%UDGi!*1<_$ZXH)=BdF6c+f#AdwiR5nO;vYnZTU@G zTgd`Q*B4&3jm3f}ij~CaZsNZCv-$ui4Qh?G8u{?;&j8rbFc9PJr=+OvMioE zfOEX)DR_R))H&j3sHEyRkyE9+QmT%b4vA8zp-x@7P_DL~5;P@Ewf3=7`bcWiM^9~w zoWhh|3)99#y&_#Ifc{vUI-T}}04i<@Q@+}uA0yNk)0H-LFNk2-#MQR9xM=ggyzPbHcr}xXsQTyvloO_Y+6oi#!t}b|D^LHU zclQa>pvr&h*7zvrbmMpt^Thw2>>dsr<@A)`wN#d*^phM76*8S-R!#3eKl)Rz0(D2- zfnwJYwX@bP3@}~*)!p_n)T3W}6z+Xbmp8VW&@QYLKO5iJWLGzm4<%6C505UB4;5t; z>TTjM10NlrGd02nW}mP=LazgGw0}(^R1r0Dtc}cHH-AQbjEB9jvx~5!LZfYT2exd_ zwnjpb%^T9Jfe2yk>J+P7tFHe{D-=gJW{_Ef2vq)_$7B60o%#jHPZfg3O{G8e!~OJW zQs9CqQ3IZaHSaLf&Xgl|0owJDx$GfZ+Wp}H8$@yTF2o>+5N+L?m^UH4yFWN+{ZP)K z@|7LPvo7k1nz=h&*cbJ1=C02WzH5<~lbIWcvYc*$!L5r4HWM^%BEZ{wG?!YYL~DoZ z7uIt3n6bQv|8PCL-UW9%kfU92xl{bynQisR!s_>!H4Ztd`EFW~gDnKDn^nillSL(W zq>_AREk3!Gt%4Xgnf&b;;0A}3t(>% z0raxPP?PhObH|I3qJ=Z*A%%_wi*Q7QzXfYkEt@#*87O*=oaiZX+S$6H+%-C!_&lrvzOw&zbchL0|9+fktv6n(uVHgvsznl54q=2m5sjB%1i4G}>Y-rr zmvJq~Bn5ey);tYtCJCLLwv{H+O(0S7aZ@5@_4GXMV*3Dj*FzxlIPEckajZRc_zU2h z7s8rA^NFxJhv}mrbO+m;!!TqZL%5mJ)J>`6N0C`u;z20sQ5o^BCPTW`gG>#-Xj_9h z?_r#bsL$O+0{Hw0`S~G|ax&;(eA&r6o(-?o>@qP|sp&)zAzM{CR-dzW(E z_o3$Rkgy+@;MGuk%Vrkbz-w^KK0ANYR{ zK;+CBvVBO+14TD%ci}bL2}ySpv6SDkZIE+)!HBIzey*z=vo(bywyN}+ttz+*r7zh= z%5#|Imm77vXSTp5C#2~283WB1ciMrw>tjK$|Lg|ebd>a;Sj zrTTR?-7~o)w9kXkeB7Ax=~og)OQwa;P(Utk?ozBHbxb#P1V9`Z`E2iOWQi1YkF~!bX`TL9!NrUTsPya z9x?>we|+TW2Vq_L73zy{4>Zp8!e7^;cZBNU!_6%3(LsMHZwEo-`t}qX{LEvQRz}#> z0~t2FIo_`9O0_FwPzPx&S@+UMHuGO!wwy^k(IEYXS*~L`If`S@Aoc^jWDq+yB)Edt zE(ZG^gjyeYgg!E!7mpysmQff>Mz4jq;Y9|^R*>09tgjJyQpEsWOgzvdOP-$>B7zF} zse&QDgj8M`mIHE~ucf4@fni<<>jh00D12&qdzhsZ@wH#-J*5DV^6XD*IK z9Z35wx?H;`?okxHcTK!?vQsOMD{?vNVrc@>?W^M`DyA3;@O5&3nm)p)e$pOnv1n8R zrgbcpACc81qFqLlQ65tTmJ;7B2Vj*XFJ%jy4{+5GQwm&*fLjq_wh*|L0KhV8eM(j& z+Ig&m3s}n66CPNbPGS^~L+)}Znb=I?#_1flm}8s+oH>{|sQ&g0k3LR%VrHKKgimkD zw)2SOJkD|EGn$)7j-DsNehx_IuS{fOKKfp`uG0WLZ)dLM?mcU#2tQ;|Ynyrk+dukR zVvd|=LJ~TMX>^iIjN(Z@0zk%W&$VO{rda?qTkCyTJyR~3Lw#-z5wO7%<>4@OxOgSnXxDt6gwl)@{AbLXA z0>=%3Oh$gV6$c3RIn-wB_c2i%aog3D8LdHwt`tCHm?b8XV%$VbbyMhT$s{8xV4^eM zB1Zcj+wW!Ev`J~y)*>CTnq=e{Y0Qxe}{4HAa`Ez%GCz_PfqnD}KeWT=_ysv}$ke?fB?%0}|TehNN%vQ3jD7$Ve zYHr(d5~mvg>J}vEHo&lZRHnO4$A}?AAzkWqUGfxJT1ZH@2=CrfLcHZlpwjzNy}!&Ff~u|AQ_m#o zCDiItIY{!LjW~bjNy>`I=y$X3Bg20QhF;=7#30ZAqqLK2{gQ0b>v+=jv#=p{s7q8h)wYkQ0_t~Z z)$V8aE=M*UQF}V>Owj(Ks$SJv{PK(~53@(LN>RTikKW# zUHO$xAr zu|6KqE>ep$NQ2cd%K$zG+U};cvvYffb?-UF?{ln^){GWL=nF`kW=cYvkV6enK=r?> zziB`|)iOfY^SYbB3}M@b%xR<3LWRQvw128iV}QX4R9=Y@_0+X%-fkWNO=x!yPoqG(z+~g38?=lRrmF4~dQJ$akSjvb855B|Em1I-z^_8E#hWv& zm^^1OceF@PG2GP>_*hEdw{TjB<-AYMm2aU4XNVF+>zOG5gnMH!H)1+C`diMx>Qk^f z8=;zeFduV3xXU+GjCd^|aD0|yomK7?v0BJJ=Q;ja&U;2;me52l`^i^1YyUai?JF!f ztdg0rt1N-=Y69&93Ggq0`i}&Pk`fQ$=?r62x1FMHm#}hh9rL{6%M54FMBo*Nv`9fh zBt_651;S#`mZ79Y!{BQaY>mmiXes%9mYmscshMq-oWYXQWpPQ(76W4=(W@cwH2}$R zBDTriIzg=YByc=Q%=ZxB-WS_WUXvzHs*+@TyMb|ib4;gg&g`?z>4-=QZ1$!1kPD=D z<5Zs=&%6MvaU?)32P0a8IcTtoiMgN?62UaL?p3apUXU&He{4%6?n{h!EyrFk+8yj&|CLLzp2^uDc?7z!tM!5`M{+#t%}FG)j}p zO)PY8+m!q-?ERe2?Hw&?x9#n;G4s5cI%Zp6B`f-JCNw2O`eNoSdjZ-$cm4}|q3piB zRQ{E{f;@eth`J>t>ZD@cUHT=az4vTN<$acW_DS7WHm%`H`=soS&8fI!3nA_jWab(I zw(BA1#_GGarGlmMu5B*4W!u?jN6{_Y1z~p~O?P4byPai61=6(kbN0IfnQz+WhI_US z+rpJ~w{2zZZChG**Opb?w$DmNZF%_(TXk;OHd4~G;}mzCF4RLv*JCOKPNQ>%I~o9K zgSexC*cb-kf)R*uual{C-^5@Y70;5$l8p0l`Z4?*D6`IitY=WIXCZ3=R4qZdmeV?1 z$zxj?Dzz5M*7E1oK(@Q?P_Z>p>fLgp+?o#-SqJNG{6Bh0m=2KIzZ}e@q)}BiLP^AR z7E$&Zigc9RjsPprUZbx6F5V74&}xQO!BwEu`b!p92;;$y4ODyoXE+I9+6 zka6|1LWV2A^%GScQOAi9LWpCJFzsr09@op_otP@5dVV>@tp#;~)yGwj=;4%^HbTV| zKQYxKjExgN30qw8Dzl`T$KTDtZL4M|62Vrl`26b8UV0cMo8waIYh;N569) zz?*vI(7IxsLLbEGXl?k-`^Vq->W?NoYM=h?Gv4N#@q(#OnL4KGAf-pKiMLm*n{CN5p#azrAXy^Y+@{?sU6Eqh>b=!Y(RY zHBI{v-jn@Qwq7LId6C!qHm6!I{SX6$f%}gYP^FY=?KD%gki6^Ml+HHV3{BQXQE40F zbR%=6HQ?sk1`C>|oJ8lv*uc6ZDsdqv=Nh77S98E#p(%8b`khOnCZD1QrVY`eH44?Q z5U3r3oJ5*8baV|^GUx6YMo;y4eJauD5xZTzB1mW4M%OhMx zlB_Da;c*L#ClIN>uSMDj>OOB)}`CIJrsX|y1WDD>>LJFXI2oy zMQWB2Z#|Es%_C!7u#9XfUyCVDwG2L;&^`yS@A?dt0^Ed zh1jK%4GpcaQ-ns-X?4lM{`6E}HSIAKINwuvb_}olTeGp@)cADAw`1|$Yf%w zb%Jp2k*H?dOR{Yj#0XuoB*G@8X(J|f8u#}x{qr7w{jUKAuU58RyLlx25=!-ZRumsQo z6VzpE594?whojJ5TTb=RGG1E}(8;uDeYQLn2czT>TSha>A}BeR@a>$uyEdKW{ah4f z+AVuKmGEuyO?xe#F3^Ngs)xvarozWlpWE|F0Z|7pH<(oMU)<`pcH8X8Pd(UlrE7*-kZ^9`^kD9PQ|tXd3qdJo;9cCFRgdR7HaHDibhV3o2qVbCx4$ z5CwHXq(_{5)N94yRiaX)_guT^51@22ayv-+xzwnmo9Otc25uozc|0Lf+|ah@BjM?) zSzY!{qDW(xR~$hUS6L)rI+^vD&>%+Yo#Ld{K1OOSVmK#yuYMH_J<^;0J~X;t`aJ~X zcwgvNYvIG;&bj)DNjki9>-BcP=tsYYf!oLOrfhH@M@SVQecD;uK0G=}>vZ%ueF|OU zYk%`k5BM7T;S#Udoap$@CH$C?4w1Sh|F6(|?&7qYzwUwioWkCCZE2%<#vc3mQ-AY- zzE3~$7~Lnty7hz*<{lb!0PW}^x!zfD^wJX&n+oTSk{KN(e0!N*-zxxf1fQz0NDThN z=oH?YVVj=&!0X!kbNToB(V6OiIc|daO_*r=kl$DKW!eCevzOM6OXLDBk}2$3774)8 zT)=m554lsiCwdV$ed~c5%Ox^@edJ7gHZr&8iWqG8z>XBwqn(S$H8K|WvR6Nay#p+l zIof3kZb!ET^gv=>-J5CGc4yca0KX2N5FhcwYwvnLUYFVL(M+ot^@FSh_0bQ(#8WA zQ+P(!#aZysT;lwTf_c73uwklxFG2HO)T$EB4Fp^U(ZJm#Y#WIyHxOTL1hIv$ZL%h; z9WGL-+eyN=gBiQ>tgt$){_-phyT6o8 zSPinyCTg3*nB}lZVNud?Y;rk9WE8IDsjalQG+Agm^B$bJVBwh^7KNgWJ=I}xr*JY) z5jM$!vR^F7j6rEeBK$%VTj;#Q&6U?A1_R=W;>O^9Kw5Plh}%J+a3=`eO`vcW&HP(q znK>-8-}WIYRh)aABHa_2ba7;1(nBHB$qZx;Y1rUEag$cmpwoR82v?7wI`>4-8p^?T zq|omIFSj%I=+@L;SV?sd&7rGLG&^RlCk?s=ONF&3XadDjcNxxqp9Ng76$wK`ZTqmT zrHUxzqAiOb!rfpHtK3nWfBv4$E&PJ{!N0H%sSKKwL@`hjk=vwO_9pCnDTT`0On8|E zFSGC3ui@se3cj%CioUep7Jg|j7k_0hmwaij!Ob@-zp*!}zqPmPzq8*p{J}nM{i97` zncDUTmfzdd_U~;*>(@5F`72w}^p&k@yl?B!h-<;%S~TMtG~{|Bx|_h|*0Ni+h1924 zSKdKW-nNa6U)Tngbzpa66YGY%wzlz(t!nv#<(@6CM_+=_rR8I`wDOj%D!XPYXdYd6 z{)%lnJxE%b3NNDH2hf-YK<3eO)O|`nRb99^gtgm=U`2FW(3yl0VlP@u%tecj>b3;Z zqY3EC6g&dcl@Uc}=7HM0gOygm1TqD5)BJ<`EW`to|Li2M3 zrblfK9?45LoI58WR|ix5^2!G@yeMPmo$JMIxg?yx>1t1%d{mXrfd9V$AKDpGX}q02!|8xs}0)EKB&RKu%kB1a*;&0mp8ryjL2LEI6o zbk!O=HHf;RVmH6J80B8kUwTPlF3Hy|uBUJu;?-*;!!o-)Ghsbv`8G%Bxqdc4p zLk!8wyT{MiiFawWQH*xnkE!YL1Dh{Qc?+sfE3?H;WqGY-bUBc~2(6NW|tg zz6z!-82}lBRHXKQ#xy2`STCZHI!NesF9@-LomnuH_mZSjl28pOoh0LWX-$!PP!HOw z7u>YHv5mP}18ih9$9k~tN4gE_7z8=5P@g+ORnHX?k2iP%xValkU{a*l2{m73?YXuz z)W*qJSiTZhr#-M7_S2W_8le0HOj6^7+O>!03Y{YpgeE5KnTin9tA z-Eso6n%1U}^Pb(9g~0;TkkYo4O5iqaFTqvJfYPZXlBv)sYGN};aHe89ltSV&c~>3< zAC;C4Dl>?PrILF}-h@j%4jk!VGle9l9OXk$ra_?<^fFX~O(wED-DM%TS%slABT<^M zd0pVK(_)gE7&&Q-iNyGbn%t;3DwKpw6sRYm$wE>wIHya?oawdW1@vlw$-~5R1M_+;Ft^`=a{KHgC_aJeJWBoT zK@z41D0(?SJa-q-Lm4z|qGWUv1w+A`!n$znqZx&%yw@FTw)IHLjUgmHL#Yr7XVy@f zQ$F)_+ae_A;;>#@N~6jOif)(24cQ{Kg;F*2DFN9}a;THdB=MPY+a@K0%DC(HW;|wo z$j;xKx@XTKHJ^Qe%in_6msx&W@TI*{^0~cMe&60G|JvTF0hhJlvhjO+zx|Ikx${r< zN!OokS~u$pe`fjKrni41Cs1jP@eu#WGxLnzOqgk+CK(oGtMksyyDA;Gw31Tcd* z6-03)Jrns|8cF6y|{&?jY6UeptFbawtkYI{YMII7=MK;#|rE!)gITV_K=u;N<+ga|AQkL4yA6Hm^Qj(r9uURsqe-Th29>VKJPH8GPP!I*mgCPpJJ2r8IB7$?dzfWl@&WSm~;EzZa?BI<*asahV9ydGj}ybqMhS-SpM-2{KZQuoRw zn4i+$i+CwqDnzUG*al3J`C_h9nKVLfQZ`LjS#A)`zKcsj=nZ)3xlK-Z+~B9gCkW)~ z2hXiT*%o~BAXXLYm*jHkK4oT=y(^7vZ&Ix z3#WtT-!XSL%xvdbLe}*yq>Y<*XIm9P?24`Mi3;1ZEV;vE=_|^EUwI@M z&m-exb5TnBZP_wh6DZ^0mX%TnR>bSYNXB#goV_B&(nwP$ zagNl(1@xZa)JRq+i!hgyl_V*%dAd(0@|sH0G7UMIK|e`GF#e}UaHof{GR_SdeA2dOmLnZ)d2jNuy?-#5v3 zD6*GnTi6byFbLRepY&&G$wPUlI~nyavjej{Ep6DrTB;@SyGyNiPY}RVIdK`FA)ca z^g(Vs3FSCK<%GEdLx~-P5OY9o#soH79J7nZoorwN+FHv*TIR5vhMDJr8;Q`?Tal;H ziUNq#;!#vVI-oq1g~q7r6BSmEq->xOxCu_SvaSA=F8&aEs5ZOgDYwy-CL4m6SK#G{ zm`N+!D1o+X`*H}+6`Ob|R!+QiggL$0kU`Piz;kv7Wum0dqmqgmfO@ST)5#>k z(qBIbaW2;CFBzrxd5z^BqS8sDP#xq4_aR3Xj|Q}HdcSa~Gdb}!L5fn8^r=ei=7{Mp zT1rfMgRbJHPgOb*<|sK{gQoDUx9cM~fI7PPxo#KH@`s@8xTtBXoLu{wxk)Y<$xXxFHNuQ|nNl=)-IB>x&rTnsA8h~u+otpm#>wM^hiiPuG=B2D5=S-b5UqZLY?}$#ly~Ru%I|) z%1oMTq#}O=M8WV;^TRVK@>9AvAVDW%dOr%Qe=$i!FgLV3%Ek_!a>chJz;Fa30nfGV zY4-FLAUA{sK)+IZ?AeY|ROx9qq0Ax5axb&)C#otCULlAn1P;!o$Z80F`zuncPRvkI z(N75UD6l#~I#CE5nMZFb6m&XJ)xs_f?X_akHyEb4fwRa6l@Y&JFKP}|KfTK{x|sHr z5&rR0TZ(6FYoa}N71rON-dMo%t%v6aIr)8=Rvm47uJPG}2Z7xM@txeHT2I=irqpsiansBdD@b+sS=4;;R<%dM5|`erb5+D`7A8| zwwz+x6(;KjfMu(hiF`GHTboJi3hgAsV2c4)J-L}`fL4u2twY?E5#y}}dNlw}uT=oO zN(5yQU@Y8qmg}QR7IB$Nfqoh>-VDN0slYgGC&Ca1mo!9T7Cva{N6WD`W{R>PE!CC= z;8GEWiHtiEh*8lv=>fa2*cvAYqZoHWBAChy;3eeJ=*~KZ$?#%n9eL*K<`jCaHHGg0ORB_)&amTkb)k$=bXsEgDxJIc;0`6(BL6bnmY*z z{%RviaVy?Io2b;;Ol9nrux{JH1l8;D61|#LTZlK>Jr*XmH@)V ziOi@Hcg5x>Fq29m-a*7tKOpz`ZY0nP9kLf92JLkO1jhHuRy;;op}^u7JA^Dj2J=dU)o_pkP$kO%sv zbp6SucYJHJ+K`G(_ibU*SGJh-6417c2}4)1y&6odqrzvSmgf7mvE^%`sP}CRXk1NX zb~V^sec@YM-u105MJ6s1=Gaf`g;ez{s<>$j%f>k7Jt~8ci)A-$9Th?wkc!)Q?%2(G zS3V1gNr%0x%eFtMmnbW@8Lx=r3EX;;ks;CD6him7$ZB)|aRm?r??5~s_56Lr^9V#w zO8fnocfy@$=SFxiAZke~`gEczGnt@ch(1}cqa&ZBA$TfTYHnU0-u`@M)%?-nnwV1bt)4SSQVXR z1(C6QkNpin(omt#73nO6;))cg_A%GVC6wsJsicu%;wVKeSK*yU&P3rV!5yan zsM4b%oM#N{9X~}vJ!0H=haF0E@LH-hZ5`G@N-{Zh{ zjfaU)ry)ndzenI3rw4&iLdj#>37QTON%d1eHuN$~4wfdo#0P1o%d`6fWZTDdlSt~( zVdA4*AEX<^B$rGHAYLi7tD+#LbQ+U$PLXLZmBEBDm7%PoZ>JGTRpb3r zF)PffRuXQV7lVN=jhU=v7X3v64_{8Kpc;$I7gk2vR-tswZQqbu~mQ z=UC@CR}m7ikg#kX(lBcc9<+p4Q&%N27s?r267%SJL-Juckg<&ku=N^}E*VRLEJ%?? zgeoZjpC2rE6xNJksEMWqRq`!{p(j48-4e1pEfKmUo$9g#!lSWd4HKD}EZ~;pJC`T*D5ejXN z6b{>gv)I?q$tqH`6M+4UJa11R7X#v0E89rc@i_AEM2)(nuLPXj4N5?Zb#s`!Euj7d2vU#vt$FuiJ}c6MsXf^tqh74`@di^gLCm zrN4Kyd#UVedlk~XK^XL{hVN|>*~3ZAf3$Zy{%r5Dd_YKaayQJo_*eU==g&5k@aVJ) zV%~Q)M@#FswxHo_c=Zh-(r;`zY+DK2R>QhAEUTNoVf((VV!u_b-y!S%V9PsyZ_C<$ z?>M=rpB->xud?eyLGLQ>O#%wX1TTEzlRWW`)=SOTaoZEW-s_i&4 zh$Zcy?LqeKJ2zsxlaP9G6y#)MW1DuFnac((Ed4UG$-%sE(#AnN{)Awvhq+#ALE;P!|t;7df_#^5f zEP7ErAv76XA=WSwQ*A@=?#hV*yN=!L$e~;p9`)Qtro|oI=yP zonNh9b-72qGG1E(iuT#{_NNaR82ZLM*M6aQd*@2gXVDdFKds$e@OsDV_B@QS`aePi z%c56*=Vh~>&f%x!kEn zd|i>tqw0rox*BZ=`yMfMoVHwIQLpHRKOuDLGIWQu_I+Bdwdeit0*hU^#eVk0Qx+~d z{*#}-3ULsGk3VUT{Qdv5rSHzRp@TVgiA3{d(rQL>YTDWEZ1?N8(r*i zQO8@mD2XQOI6NCns%U3PxLw-Cv}H)a?%(ahW`|l|Iy;=er;ipL!myE@4ooL?C$YMAKBGI={wh6`db0YfN!B;gG z;(mDCYOo&=F&kD;5lo3`^~_MKWT~Q$wFX^S&6G67GnjXEGk&_8neBJWX)B!_K~R=? zPSJ*qyO_R(x|{|yYCYSYdW2(eIU&)K4eIqE{YY9ecL`NL@Gx%&bDqH5(-f~}q98N) zIg_8W;BE%(X(<#tq*5iAMpP=DqK8!c0}_~cItHZ}lS=;v$}TpG%9?~aCc%NHgh7+D z84^*7Nff6hrng!Ol{YEulL}jt;;H6AQ6`c$OiUm&%CHy1F{4u2Eu65ZCkYdS3__bQ z??^cIKBz>;ODxy+lRi95E5?!26nkVMMF@57$s#pKD0Dv+H~WwghhXCg3T!kLRv<%c z2uo;etA(iDLoDUkK}_FqEEy$9vB=&;kV#9&CWiCP)LCvy?YE8DBeouQoHb{z+uEG# zSj>UW_yMNs?D1v}DY99dcAZElPC7A6hZ)73(x7q%f^dpw$fkx5+2m+&88Kq7#NZ!G zRP+ThiZA4TVb4-@qe9ge&wXVt7Sqg81u|>DvzP0>wU@!<>)=wze7E6G_Fl_h?A_MC z*azKzu@A`}P6m;aFA^Q?{G)x`p^W19HnaUZn}lOAdDrGq=sK4a&+Kb7--rP|;n1himH}V+OHo;Wm$dJGT zC&SQ%kyHl9P=OOqg;N@Hn`IIv&7>0N6n=T9NFScZk13xJspdW@f|W(+#4>s)Yj{Yj zqfxej*XknasSLmx51rWIsq}_LsffM|GcThNhtY^55fwIso5<)1Qiv={DPC7vkww;c z0_N?L6y@y8vRe#`u5iIw!}y7qu55LjprF!K$4Q1`$7JW2*B5xI|+tSJ0?<5&>=5O}`@h9HYp|_>O4-xsu-~Zfx@{51A z>;<&<0mT6_Wy2`MD})rUK$YuAtvkeAB}YA)eEV@lUiIp2(5SgnhDkE^Qy(*gY8*s> z4J%p;m^_Yo*A_8doDQT7k5ZZLb$_w&3U}NihK&;k9R^u@`%K*zuCK&>i%#7?rf)z6 zQu=(p2PNHf{i*u?SUeATI6)e8gvhLzsB3X~NY%Lho!UZ#MLF4PtqEZyV(&4hyKj99 zN?xOQ=LY4o*YRT*-H~pWaVZ#pfCI~-=tCi;NH3(cr;`E zEUV%!*|H=uh4|?##w&e6#u#iIvstk4lc38s)dL%2@JWv!vB|LV{n+dFdfW}$@-qLt zn0Om6So{Nsnm(I#+g>cZZ_gKhZO@l{V=vbH!Je=F-hKldU!tt$4Zt|5=}-1fD{yT8 zv%Qaw{E!lx4~U_D%+J$QZUY=Yz3@ky%`z8lxBw6?1dfZ*jEm8XOPb&w%W{?#t!T?G zc-ZwvVx-^MXO!kFhKut_87|;G3#f8kz|V8*zOvcGUT32r=Te$8zy1qbKnLYQ7`eEV z7%EzFW#O2ugOi(yt8Oc%gOb>)EcJHbQ@bmhcq*29`!NDKmdlciVLP$YfXE9L3L~RQ zA;#bz7#&J^GCDHpWD^au_$!9CVt-dp_`cHe;Nf{f<@tCMoX26mh#Iakx^c?+W2{9# z){;-I<+UdMSekf1YvZ*G#8j0s>^WBSkd1@KDYrRZVAq%f>;}sa|AEJt{ZDMX&Dt>$ zHhS(*T`*oX8_Kt7?XW0y=H}!Q2t^aE6*zTLQZ#%*aX&#$AW@9VCnmKP8r7zuwOj_A z^m9{R359N+DmU+lNaifW{e(luFDD`0*eJd@3F&boy;vnyxCo^NN`J{mU8pzwrlHgU zO22bFjL=~w=o<81jj2bTpZbGU`nYqmwmp<2p09$r54v`3X#f8XNEhSvd*~?ZKkt{X zdXcTOJ*5)~W?GATS__E!2)cN!b$vhH4%2P*@81;RLY-dw_y6_u|M2qmaUD&J)Rkyk zgml|KqN7gjx*?wwCiVGrUR}S|`dR1GJ<~fSEo-+k0~$p(PC7p2dO4_r^?L;Q_>-U7 zL`ZpH<~l5fb8KWAHK9;aiMMOZFu@loful#5{HeAi??g)BO?!+|>p4VKsha!Mns@{B z=y!tDZI0$jTtK8Fq*&>v-;hBLwx<*om8pf>pY1DC^+^|XA{ z5QJ^ojCnli$0med!*-l%4-~kG9XvIt#9#@@nhjK>lH4o>=H)wR7y+3DBqYyrw)5Ml z?g5MEs6frxig7;S)>Ay0pXSLteP2FPPcw=UVogzUk;aUSxJFRd;t&~sinf0wU;;=? zp#dX}290zoPBTtlu=MOMOW|ogfeM;5q+&9L{AtwIr&C3f9LjW?ROiGY6=Mj6MnzMB zBiV=&2;&?cGDyJ`PH29SV{uI5MaXq8Ry&7JUABWXa~z<^;t=83BZOm*fXAbeRNjQt zGhr3grb(T4oWjKr5{uDP=0sAw7*1biG*U8>bA=Lq4Q8L9v_3Lmn(0x|RwnVnb!Qz@ ze5^$2tjM@xt1@sVC&Icu6WPdYl^fHp;^w~-`QI&NJt3zE)wy5XedHX?j*|E{uk)@XPZfOaaQN|Hiup>9|H#q|KsIz1MG-9lIhm8kgHDaDvTg-yaC=7Yl_HWhoG3{s4z2)UjPX|OXvRM&(x z+quAcWF$_pQO#Du#584|I;+Gwsgh>aI-YsjGA~#wc)Xa|Y2Els^b@lmh^xhGtjPNJ z=Gx#1(uf&U*&rbma#aVUB;+k2QUx_gN6%eKQN87xuC`Igky=!=RolYiL*?itoliD; z%Uv{1yAew$@>g(D8)1UNqvD~X=mVK3B5Ksu+PMd4D06)b8pk!hIhi?8qnxyy_LW-F zT8hEt|J>vvx-?&aHB_%5zy6YQsHLtFf zM4w2%(^`u0iHQ#;Fd4V&<*8o!@EdO!RUbeE^KsE#zmq`zJ}kPI+*E1a*8jGJhrL%Z z@x{OUr-zbJC)0s+Bb;(|HK_XV`gHoOPd2((>NtH_`lJG%yA<~v;S!PK^qTzlo__Rk zFASe{ve8wV3Wy{cAAiEO{BD5_6DyU``c+_f9krw{Oka+W`Vfd*4(*ygneQ0s8CxGq zj1;Q4W<&3m)0m>rc(G6D6ZISiwef^FsM{@ciCnk$rrRx+F^Xkx>Z9m6i?uGm<&*vN zk-ay~{cY&s?Qz|4H{TjZ(VjYz3UGB|ol9$_TisRrNiT+pe*OaAReWz90VgOmdke{U zlZM7SQ1IqXDchat7A*CwB3p6q()Lg~6hIa%q%OOw&YZ=W|ZOF0)L|o~| z0SLfwYoW%op8c8$tv0~Pdf3IBCofQcx>DR`?h0mMDIi$VOke9g?hD6 zuM|^;YSwj!@)4xWzDZ9H8y_RyzUP)qNkYtR` z>A!d`k3I}VQS%Xr)RI0|{*}E@{jEJ;_r1N?_y_xK<9GI2(;w`$mOt7g1mSxw(TFg- z0Q!ice%kdHo7wSKo5Sn#wY2^L!S}r_29uw$UJBusg21H^Z7Je!G3Z=O^mRo&Ex0UBp_$=o>{#2Q|LFd>AuZkJ-Y_6NH53S^1C*x=(f$Py!(KFn9&ts zPFIM_EA-n?#AGA+6xY?B|_#LVSb1s|l?<`@%5qyEdFU^&t88vaNc zc(iFG`Pg{8)Gj2e$fk|Hf5;bxCs;ax)RTpFXo`|A3pWAYKUR)9QAhj4lQ-VH%OZMr?+~i;arABGrS}4`FPjT&hbH)RR z&iR*@q;P^Bg#2_zTlKvmI~G zcCC9V1yvGIK+~Uwt|d%&YJ#@(iq7KOen4wp)%AUe!GKC(B+E3xxZ~sB=oKO7&Q9i- z;iy`>WAMrJ-D>*|6*0HSY04k(>b68gDnSiGw_}{sU4d@rc=!4Edi1%p?VdHx|jma&`1xieN=oG%N_q4UCigOxC3D&_v zx!=@Kx>}EhY$k}=%Ih7hn<&U>r-i?brIBE1BRp-Q*P@o-s@6^PM|i4;x&}9(Oe=BM zRd}}U1XsdY%2-MXmlmTS3pksa`_G^ePi@S$Qz*-9%56>slv?_MLLS)*EQ#)mL(ooJ5!Q*}i8Ko1@>ts%^?L!al4yv<*q!SNBK*R)S zNzv)CI64;zm7X9hdV+4lV9Q zi8GIM;&d7(X2guxCrTrt2S1LzYE!T>pUmn2uh4|Qx91zavlr^Vv)@o+`VtU(gXJwC^)?{;p!Yw#T9C?{Pk`cds&PK; z{0j|_~=#_)aW_vmZoIx1%lj<*B_;gO=eVbQvA458o;wZI92o*vuVZH3!4O@x!TS?A! z1L4#yC71=A9kK1{%pQWE-bYGte?mW#g4K0N-2KHxZ8#!6E`_KXQl}XdT4h_m^#Mp^bc2xQt8gQy7$1t zii8dYI<0#y@E8AdBb=d;V@2`OgI*B2BGieZ;ka=VZTF-(c5_RjYts=FE3<4@=M zKGY%3J(@&S*R2ozaLpIs1EFrH`-I*?W%r}5z)5+XLMd0R1wThYsl_lM&(A4Vojh1) z@exov$tUp!^t-j&>$WpYk*5-6uZ*#*)tahwPK zqr@_gqTG(tFriry4@(L1^HG`vPonAqND-bOMR<(RSpa1-fh<8(U__t@BLb>vYOA4a zrxRsJij(+i1Wj$h9yX2xzr)nF?u*9`mF~BV)YGh^*_8JWszl~$6 zNR;8Tabxx@%@)rwug9;kDE}2!s=q4w%6?7h>9aIiJWKiMbIpIU-w^P81tz_5;ZHUR z=)DC5-|6~`z28CG1;10;a5_KF76dQ+6_))6T>B4O#A}NQpe{irIsgK}MeTni_K5;S zHO}XE^LYO}jyaEGE0{WyRN`z{IE&Qdr~Et}fKG>(pAeM&gz}r2HF(Tb-LpC67~7S9 zZnMjXkFs7+`nfGG!YA%LU59XR%_-*mI5kWw26pJE!X1S-ZATWRsdOCfMFk#79YVtQ zS`f-GFp!o~=17T-=(boo_T$ufc$Bu&W8|Gtg)+FwIF35R%q9mlm>VG5a;EG%!E9PE zu_&y`O2t7QifRd_H&A!nNLsO;hnyB_qr0(#=u2pXgY`BI$`+02t*ylRMpOhZdnB%%B9%w@iQ(}Y0d5w{Z1PX!= z9?2uUyb$4h>~pREE&}N_Hx1-gwsjRc zqZ4uuw)L8iM50WnBde~_o!6npPrA^JsE@ge{}K4~p_~>3elC(H0BB(L*Q;A!`q&G; z30r>o?tcTHE+b6)xyJy(Qv2)Zx=<%-{j?RP2%o>QrT_To)81qGU)&kv+9sULavpaM zIpZ|O`=rwkLeSfmqL1m#Y3f{|x?$t=(9p5;#1DX)i0CHGGECRa4; zz7|I~e_gTr5_NLdhoTMl{rJ1<;Q=R1J3T2p>gpVLSWAP+9pD;1FeCDz<9s)%?74fC zdLqQ2*TGM>$US(C)7{mXw076?r0=WKd9*FUYFnSshdB2b0_yZxy}IAs3B_++3yM&u zqv{eLvTxdL2~R0MSa*|Uh(3}VdompFF4I7GWh=(#bf8>;bN!Uf^sY^`?&TDclKE@L zn5~hCKw5S%Pu3xLclfL|?4+r07gIb3GGhQ8=e0a`*08Q4I8#IfwFFc4Dk7pav|!W{ z9aRIMR9+1c$$FL+)L#<{uZ7>&?4nhIl9_tm+i)P?T4@UGI_8}`wjGYO;W*PyRJ570 zmIln&8ev@{ylsMWjR*7Hypt8Mu>Qz-*L+xx;;fdYb=CxEZ ze`%r|6Ef!zFU>;jWz#dCPCY|1gj4})ay04@^2sGNhN9GHGJkPwM^pC@L83>KFbBk- z`k+=23NIw3+m6O`+947|Cvy-HWB>z+V}{ToC}-1?2!lXGLMSx!5bKPLp^cF+SzIK7 zf}~MAbr+F1h(*)5;bEVnv}_-x&i_bKKl4c9IUa)Vci2T+6WnDh0ozK{-Aei|mWMMJ z2g~x{3pku!w8fDFz>WoFH;Z128F2tFits04&yNXvzDt<%Eui*F8go3-WAUPtUi7Fv z6Mw^go$7UK`xRNhf5&#_-z)ChGu6MhXH_H9^hbLEfc*wV_iE2y?9Kka+M7N9VQ&Mk z_gwMlU+g1(H;wHXyf(A_Pbfa%#j@Z6z#}BO81OBUs3UW@h_L5E_FKSy3$*6g^Xb=^ zL-=zp$Dd0P>YQ$b9s+Pi*PomV+%!brG{UCSNE*&ydj`OJXJ+*mHmmZ!&93;u=9J#G zxfNg8qH-D$i|*Red=wwc+Po24M`6qc$hUzCqpfE~ZMzm!-yYJc2WZhe8b^;OYA?vs zWuf@ggwfy<3F)FK9F4`|EtYixUr=(eGJ<#p9w!aW6G`@gN;^%%;n@?_mhWk@0+vEz zqovq~SDdI~?ns(2_ycMo{LsqM#bZ_%Y3J^+3LBtOd60m-RNrMy%n`!e%Jkab2r0H3 zKyGwrhTSA4>O!F!{~YX`AX5C(C-}Vn;6B6&cfy`J>$L607*WOL?R?{l#&eA`8k4;F zMaLQqj9yKkIH8IwTVtwE?rH6Voi`4tJ^kIV$%Zq# znV^?+APvOQY))J0jDETjuTE2Uz4p`aD~%@r>A>3dI*#j|VfrNgOaA56ABt@Jaz5Qm zs*_!vihVeIdrf2Y>0RN5ZiRlQYY3Gz^Ve1AC$F~q+2c=9m4EPIywe>=pLnA7(IBtS zq(N{mL581C5M^gnr6pyy#MUUQac3| zbMaI=g{n*5dDde0o`(&zx(C-VFEL&)TvHg0iZQ6Nc;)+I$?eggkb*i(g==XU7f^4_ zmQ92*E1D=~7R91O7n69{PK1X^ydKBC(G-)$utXD#il%uXn%rM3$BV(^B|fLmg5gv! zj0-0k83yA52w)u}<#Q621!RyeN@sy>ffPOjqxJ$%GLaO*ES&sbIP2)(N*uXxaoBlZ!6pzjggd<%QESE=#b@mnUlcm_|k zXA;ThVMqE*>TP=#;QdTWr7G z|6lfg-+#IW!YL@QsVKMUD7qPhDQC6*88!D;o6FA&DS27cruAQKA^R)@b_-E<^H6Vd z+fZ;Ef1Z8@jPtvRW&*c4D7cxdXQ1k)q8z6Iy=hdpcvajtHlzMq`?T&Gn_2yp&10Ec ze$N)bv;{>}x1ivbiEFTIRn}Eon?7XgGVxwxdwup*+eBx{R#>+u=PF(YunpCA4Bwal zqL{&W$OPff6GmZZbTo<%pPpzpB}T0!W7nR@Bva{pVJZsEf^|7mxSTp#&6J?nmlDm) z-CJUXT?DX(RH;AXhFiaa!G*jyXr)>nL zDVpgOawt2E3>xD!PD?FGWVpbdGlNk@x_8E3ZMosz8KI4rmeLTTF<5W)W?D1^P1G2! zAy0#kSfaHzoXDwuqQPAV(SWJJQ9o;~N`4Jx8tWdeIh;DlzssogmVW546Ma{yW9#bO z@CwAdQq*YzF=CvMpnV=P*0mLC6xS6!P;>8p=7r99UAjJy){>-7QTaPg^Le~+L4C5h z|N64;y&o)jphtvIAL|`hf8dxd&P7%yXxP?u=>vTeU2NZ`R(U76c&u>cL3dh>-8z(y zf4UUCrrYBMlKZlRCta!cVL)3>?&)_A(cn4`bt^7x4)t?8o#34^_p6KJ2dzC*6om<-;y~W#(!BHK9^`>#!(mwhV3e~lEcNECf0q-@w5g^^A zqw7>3>Ks(}XWAEGg{~S!7pj9eRJ$ARCOvVgPT!smt_#zC?)zh{3R!LICg~$-?Wj4< z?ZG#!SKYz9H%dRcNitLiqmmnstaiq!CE^B)80b-@Pw+J&m{(|u7>0&dwx`?GBWLU? z_Dk|=?cR}YUAv$k9%*evGh2_IgFm^}qG%=xuMt8v9^~gR9E8J4P-gj7eJBrC;UcSK zUB|kK{-vhl=dFPvv<@CWFY*|AkxW-taH(|#mXf!lUWG_w15wBZ)Lu(asdbYA4Yua;~nUYb9)Ynw8G;pliqXkw8on;FyuhR+wJ7uWN z@{>hY#!?bcZ0Av#=Xm_hV;c25_?81}vp8<*fg);D;2bPU3WbAY$Rgon1k8#hiIPmk zWMT$&E;J;h5L8M;XCE#EVI6jeAmx4}h7wLYWBY79`fhDdhpj%+ zVkcK0Yq!-$+iVp+qbmU5N_^3llHOaKIAjZmT+YKrW+wG3(-Uvl6qaepH*7MKC%%Vp zd*{qudyVqVm-8s$ByIOB(^kk+^ck&5=lzP`{i+gCSO2{|-%L#l0_}w^@$WzFl_3~7 z^ndO3%l`*~_h0tT!2fj&{1EHtPjlEL!vPd{{WQ6UM>3 zxiC+RoTqx2wm;e&_&AH#loFhd@S6f7ry=yFA_k`t`J4&|r?z1GO_$*(_21a^>aT4^ z)qR^;Mntm|%W-j#h~~nAF_+C-aTX3z$+;F5u7!IWD2?5~db5_aE4CwNlnxVSM~-Eh z5v+Jl(tR0#m=30{B?xgH$`T&I7l=1dB+<+mnj=yOH^=WSr$K^Q#aJ?Eu+L`Nl+!!_ zozW6NM3atDReV+iS6e-^SJ#KqI7k4Zopf>s(abIa3m5s%bSbRT1}G<1rROk<8tg}T zIK35K;=D&?DszpDo{M2UB8mxq(lr`^we1?R7{Oh^xmWCn0dDwpHlL~v(a0qXI+f+r zp~fPOrVqy?Z^62b>IS3-sVUy)5%&Cj%yWq4blEq4mkBOCDH?{+uZiW2dfi zkaJN{Z^OLPb~=F@{dH&D2>ys(@}W*=)ArTfiLT_*bvyV=)YWZ(vTl&p$sULqwjM|; z#(Q^JPimysm5M1^Yj5A(^+8W$7}=lf&fq@j#G3U14sq^XT!TKL-sP_FQEfTYJwTj3 zfbaM^mZR7Nz2XC+4|J|n#&s@=h(CUh`@T4?b9-|UPo2f1;HfJsxr@;ARt5Wx>5_+D z-sxaYq$bd$Mid*jc+s67K@YYbVs-LF~VsrR~IdYXNWV zCz+EupupP0%iOw&?WV{wt3HbS!mXkv5?L2fPJ2?BwTG5kXGj?fd3K&mFRaBhT9IyTpwH8Z7JR>z28#BBXRZA(O%GdCL`ty>Vb2DD z)fmiKj~C*lSZtMKD#`)?8gMP6uC0v!>!mb6RRX(GepdwK3V1#~OE+R31)gU#w}kxD zDBet`TqPBOm&EuHACAzAW&9yM7MB3f;xr>L?l6EVH4UJh?j>DE>q7bkOQCQwm6DW% zXapYRByptWV(~7EN*CCuWY1!ocvDmcaV(Z_#99>Tz*qv5@pwVTQ?3#Vw4#Ym#USva zDL09vkkb=Es%=K35^p5nqQPqfR}c|HYc=*Fk@V?Bu|#6EmB2cV5itto@c-C)%fLFa zD_vW%-IUB^CUa-*%)Ln_X+}ev8JjuH=l|oQ$%FBgJejl|R>lw3S%WUT66w6v(s4 zyJw=0*z%1n_6(J?pJI@S$7Ql4BJ&Z-!aPU>=l$6y?H))c-`s7`>~_k;+{z$@H=*Q~ zBJCD1=)|0gk8Ec3M_%c3BL28*D?hQTnXW9wFGuyy%Sl?es+QoCBY&_Pq0m%FHKpqd zn+VM&jeKoWPC&Q8Z*1nsH#T<|y0Lx%X30gUwxtkk8Pmb8zQLn!7}D*(P$V$L^P&+#bSG15JB6%<^bJ&1;G4@Pvon+7 zC-OG8z&L7$;;Ab^xbNooP>vgSFTbt*7}FbZ?H<8h+( z>c(kFl+zi#*%xSE^?c#xOVp_=_Kwsor;$2H7jt^LCG1B(_%};e5aW0S`EMq#P0Vm| zYr%0jL1$GTDzWFw+`QY?yz5TAWBI7eOI!MQ;0cUWcdnk-bxyLnen(Zvmvkc`>ADC> zuC2OyMEm0aU!DDV&zwKKNUal;eWSlk_@Tb>f-vjCoYU#O*=l9P!Pqhv^JV=Ov>{TL_D1Vln~?v&tG0gGgJj5O`C2tDRgD;@&Du{# zJFCX&F2~kr;a{}l*nTYQk?Qa@|!n!xtSvzR!VCv4Ow^shCIvBCLjj1`l+8R-JOd}&g8?fBO^ zP;;&L>yF|3YXx{mi7jbCr8VP=JB&5785P$+=3gD#8h}}S@&P-Pg@Yrz$qsPc+U#bl zVSNqP+!s@A`v6}hSqjxyOslbGR;-{n4c9Cty!V_N~Dl-yQgE;Eb!ER|flG*q8p zmtMs75-LX0apeHI?Hse6&Mq5R=HRK@#^@27DGZuIY-K9mwzO>l?vg=XGTTBpaT4h` zH)9D+qq9ui*nlOItOeF@P5^gFWJEAeVBms{sJMi+$hlRCjMfz2X0OxRzDP3OOR(^H z>bZ!0Pcy*MGx5Zv#B|sL3BC4U=7>GS0EG9YjiBb>-cB+Wvfi{i^WL=Ei{5tLEh+!d z=I;K$=2d>mQ1_qPjG9kv64P}Deq~qhL&34`D$1cyM83t4ZwbU(imJQi$gk{H z68~;(`~>SJSqw~f?8kez_XE2Rb$5RSWz)!7c%%mUF@F>SK3V>jJ%yTkTIJ;mux#d> zu$LKx>gCivdxHnR0r|X^XS_bG$E#$=qU<*D+~dh=NFYWt0k2&;C1BF@Wv-_#5MS_i z-gNR(j#?3cxVy8vtcakaa)OceU?w<-8KIW6nkJ}s7#Hy|)Z9_r2JQRZYj z8Dx-m#v!OTLLk{`6y5kUjP!eo+VwJTzD*_UAE>Jl{Je)p*@gKLR(N5`gc0a`dW-^{ zaLVyVV7T(PSQUikfj=S2yEHLGGzq$O^==+ef8?UKj8PiDaz`$|XyUoX?sV4H(o(ule^MjjFSiv+o=OoEPg1B!&7%*K}&CE+pkp zzW5ixQR6jo;I_M-{rm1b^m!&V=hUZbAxRyt$42U0{%L|*EglGUnvWS6BQN{6|3XBd zopks=5>F>kx9=GFf%Z_Buao?vymNriTAe(M8a)Kv!JMC56|_E5sqDQkV6yXPtFw>O z(%5CZ<+`92{58m%@51fK^NA(_Du6DzdJ1FZt+Ef|b_X=}J#^4_p{8%qA*j3e1pV)} z&RfYHsg+t*BXoqn9gNp`w71_E5DZkF_6h0M{XIlqx9-o6WbQ|PKYXr#+^WyoQvoYs zwf8;<4E>SwliGEZU3l-4^3_)hV82>6Xem)Q{ct$mm^dlRaG6P4#F zJ=mL4WBmZHKeOKYsQTQKiB`*P#$$faI)PpLPDXgiqiX%m!`94nWC#DBXuj4I-cAL* zZN!u@G*u_Toc+X;$qLhsyR8Q}34rauu>}CO6W-Adq*_s9?ZB^{U`@FIr59TPUrSVl zHLbd{hCY!;K%ZnWTjt0Fs20GRN_iz0KgfTGp7Nv8v)vs-mh$W z@0T`X@GF}$_^r+D2Y|qDLC;sVknM|lzP2TOUo#{G6Z2)=%n^LI0>RrIf?pu-m^#1U z^A~n2!tgfcH+Ou2*^)T`T>?NC_kCfD$b47`{N@9~1we5DX3oX902j9+1&?6bZ2sJC z#jJVzAzXXJuH24k^LD_eK+U@`Yu;V`p50sdrai#?p-M(0ET)z!ftXL_9=GQ(ZN7+m z??vGE3Wac9NAj)0y%$=$eb_Er2L?B0QZbuKFVO_C#E_y8OWJw@RbCQS*IQbMcdIPC z!Tf{@clKC5Kfhvr8YR4QmGbVjho9XZ(i0A-awrj0^;p`Qsp@is_q8^R938y>^(EDf zp>G(E_;Ey_#veQ#TWx3XILN4Zc5TUM$E!EzU?2i@`V&Mo1*NDD64JCBlo4}dm)_0K zo1r4LmwGJ^92_rP>61?BxYEMEst*eHkebU;CT*skU2~mMbID09tH08jG*`Fm-L^Kk z@l#iHGF+m4ynln;>NUd*SAVKwwWn^$L*vIwlxnR`wDc#}1#GzR(a8&fW3@%caW3f| z?~{WYqxBxN=pL<(l#;0U!f(6wRU2?1J8*1`p9qe4-&pIV~j z-qqUz0eFErc&*hP`7$l>R;W2HHY0QvUrN$avd$CX17zs9kd`8~v|{PcN86_yz@gU( z;ne=)b$u;_Tjy)XX>Hg5>nFcJ&N$zf^J|ofp$*$f-M=WPvpwP8|LI@sh3PjFW|8h^ z^J{B&4-5^1HCYQ6Ynv9-QW5GO=YFi;hU;{F^j7LqxLvN^$LS&HyHR_*m62M~Ii2d? z)1l!uhv#EgCvwIEHbnZf zy)xf=W6G=>$=8j%bNXS)94^@CU^DyHs)Is3=T(1VnS3}|8gOpU+x24|p za*Y~nK{Yvtv2#Mag#EUc>r~TCRB--^ID%W^_G4$F;wNQP@)V3oz)2;gPRSq@&3Y^YX_x`oa(DIFHW9CYDr3mVZ8-k2 zAYpE98zo?%9>gr*xI*6c3yTH_gkh|RG!1v(V<`m;07yDrV&SmGWApTY782JL#2LT2 z-I5p;JsF=+GUMu`67QEp=2tS#yAVUVrZOH+0>q1o@37Syse}dvUqj)&8tNc5ua9bG zLsa=3WH7>h`^j^Oi~*5AgiDA)0Ykm^Fv|~z7%(u2gmqF99wGJM!K^p!-mKGhTjp6? z3i%e|z?*|9bKd@6*<1!LnpO8(yRrWFl<*`1v!0ZLS^`(7SauDP@9M_i+jWP3Z#P1| z>6G!D$ut9b7McpCo|q2DX27)B{omT0{%>p^yjuY8=EJ`EV%EU7Fpmi)I{(;q6a2f4 z?YD|`5`cWx^37de!9|!S!3g&>jM97`%Z54oBm?R&8*?AdhCYMCFP7+(W1#jS|FcB~hj2)%Ah z{zIwtHq1}>L|UDlN~>ku&vHA3Tj0&~19p~|&2t+{Dd7ZrJj6XxJP;*90)!9eD(ZRd zPcKF0Mo!@=LhHSdmdEnB+sBPdQhy#$a&ee@B9r(hfOvmCsu4s!w+Ke4kMjB>uDaAy ziLUAjwVb3*GeRwM)VdMQxu=s|q<&DxYtQfzVdi;Tv|*f%)-63fb!lMW{Ju2I;>#zV zKW>zDI-ibLYjxr9JTT+wNoi}>^U0%D&aL-87X%MFJ46!)lNKB)!OiL8MG9OABPZNc z&BN#m!ZxS;=rV7Vu=lH+TF0MTN-t2iuTEa)@opV_X&wOeAJ3>g1usY8I4x<-tV^#M z^=Nj#oaSpBpX1a(omcY!+qzAiJq$pPkc{Y$*%@T_MJ~Sd`at~Y0Z-7?b$&fEt*FPoesG4-58q;^HyLR7trY4t#1OZfy3dBzk$w=h+xkM)&b405m_yrY zt&bp-zV!Vzn1!lie9gi9!!Yfz^)m0;(PSNk6sCuB4M}_KaA~_Wv+ih4qqU>_+VSLx zYdx8b)(hJ@P-XpF8f=hM?QR&=$3J5i%BvN=93yyA=FCpG)(zJ}T|g+I1Fa@K*MTl; zO|2y)<{*P=*F#cD{G#;^Wi?wZ)Y?z2%mdq7?En<3!{)O;1IlfKYG}y)+2}h$WcFkn zvZ};dtHwB6Nw`ckQ#oOsyD7U;9DmS?D34MMdA37187#M=(?qtdDy4#LDT8p8^b7_C z7tt_UZZGb)ywU+eQ_ygPab{2uEK}4g#&`+MGBIRkq5ZOWInTqBSHL(C#TYer?;f%u zv|ApbCp*z?nYq-iBD^HIXxKt!BNm%KV2Kbf5wBo8`^00=jHBLWA_h;59+yh=Un=XQ z=Qg7Q(^dP5QjiI2n=P8~leJ7MH?-L6ag<+4?6v2RYtPZ$zML^c9c%2GXuKD*k2AvG z0Fn;97f=2j`#q69Y)_;O+hZEg2*2LFTTa^DWhNc?+7=CnlwV=e{1THUN{(QaC35az(p-8Jvt|>{ zJm_{a&b(V1KJ--dTOivl`LoXPw62_9g1|GK@_1kD;5sO#vuYU{%N-Nnn9sMd{rzmI8zf1nZk z03)lYU=7hkwv$Acy^Tx#yiZ5~Qs*CrfXg89%gv3+!kLH71!gC8K`xda9!*6K?3tY7 zA`wj|)7&j_qaB_=d^xmW8dprMk%o6u3z|-ysu7D zryHpYtNs4zJRQ{Os>$wpi+ne(#3X*)TNo*r{^(!-Juu8&9Hv%Srlxub)^KyfDl%F+=Cp{GGKsZQ+%Z z0-8m{Eqf%u_$A>-7H)%{s<&m7Y<>qk3#X(zB(>G`r{l=4I(CZ@`YODkqb^IDw;$OMaS$Ys_jU5yEQ<)!z>>~ zwH+l2x-+Z6y5Ncv4F_Hyuadp|L-xvPhbrshAF(SHmBzdkdtpZc1Vlx3^3N(;W_NnM zbztZ0h~JAt5S9^b(gvT7qQZ_s$R-%qNQO~u&JjDvuq+mK;sdvUo;hAbv7x^tbcqnGw8O%gy>sbjr~` z+mse!FWbJh>78HOoG!d{P;4#)o6CHD&tHg6fok2~T4-tCU+msx{8_@*#jtNN3|z`l z%epXQBG-gCfow5SY>{9#__fW$^f{mTd}3Y}68o|kAK+5fEhYA4879lc9e<>Nr{o&B z>SQ zp0ZTF*Nh@2(kOGVLFW;%w2R+T8Na0Yqc>HSP0>xL#iDm2UNus+IjmE z&<6Ou4hUod8tFBs(`)S{FcZ+uCaB67`oXCn0RkPI5~HFf%rz&TgTz&lcq8tp2T~`d z-NJKsmR%ri6Xuz~625?kgMVLC3#%V>ae|vPoA{<>olo;HeX7Tp_AZh{PrYKC_AIi0`LZh{)AHR@8eEO_~r zagJe{d&B?vSwO0BGTmk0{k)$g&?oB81LL21?l8DLti+9!>dM1wMK&ju79zF(v>#s) zv@c@T<=3Hj5N$!!yc*|g`P@sd4M;uiLr$%> zXpa;vME;$jGNirTC>jVgjRzROS)n|G8*>ngd$Kv(rx1f zIPp!^$agS8hR)!BOE|L$$(CMYLjoFEcU=Tw_5!@V5H;L$4gt7&8^}gx^#GV&%!EDZb=FIcK_9ZM z8)@byN5Iy~atEfxPQas_I!U%}OpomwtE>xw*17hzY0z^g(+ zR%~suQgQ@Js0fxze%)qFlADS7---z`Ge^}&$d^OJWs*OaO?c&YOq98p6y;dU;>|k? zr&;^pneyRy623NT9+Qe`?H2o{h-P=IhNBDYR(%i+A+$fHXu9JGX@ z0gKy(XxlwviKWL~z@_jxp?HMBga~5D1$2nJ#BG=+$v;S8Frj43kZH+nmPEK;d=i}~ zXj{9U;wYQQCy45_H#RW}EduUYtc@=q$X>t{Df`(oa}a0OeB#!i4Un-(PvL( zo+POp<(7TQevTRPZl+tdzio@Ce6pbGW1B(gucHh4D;w#~pSIjQ+iHmUJXHc|7#U)bbhM545OY17-jp?2msB#$%ihI35w;M)SI zwg9>0}K2n{Fq+!FY+=%|BEdp z*5&3Q_y*&a;+k8AOKxe;pKMW^+;P9PWw_*)QN{Bn3Yp#1__-~s|HPKoVV)%A{npx# z?WR2vZy$K(!99E5r>^w-aPBR8T%5x^`D6iOH<4lR%yuRUu_^Q5MaHRkIT!aFk(#ei zJLNU8E)~wfz35%18P2xHlF;T`3I{BcRLV?ZY;*Ci7E=6XS7IYSPwWmvUDgo|T(^;w zQJinb60mMyb7k*Y&Csw;0T9G>7u8FfpvAJULeSsN~E>}m1T*=Nb z?Kkc>g-!k-6t&`E6%kq!`gK90jsHCRpx>qrdwkAK!3iV9VLifNZ(nj6sR3F@)+)bA zJxs?^XE$_Vw@3NY^O9V^?wBXDdOVb+ByvMUSoVRoH$7s4!fb}SP?ReaPA z7g3yO`yp$o?6kJ>4(lpoe;C(J)MXcJ=}fD$PDEN4V$5A?8>_8_ytp>Kqv0B4kaaEfNUWL{21cz2$HZ-ZmZifU=4ej zs{5?IvWIQ3u0R1N?e1pVhx=_m?zd{VD#K(o2F^;vUnPV6ly0M@36`K->Wge4S5CQZ z8Pq|^qVm?(?Tm^*5vCpZJ+c&30^4#3Jjr6;9HJ<*YXf?`4}nlIPXqRO&GFmg)j|~mdHGz;<&{z#aErQgvwJEkBE!SRghj6 zIpjkYLua^&aZfjG?+*&_GeBO5RIGS{DA%t$YU_}22^)ahDn6_NY_G+1*(>pkqK8%T zg_J(GN#FNQ)?OkWdy`HfA5YtuTvr4;60Y&MhFCM`D)N85a+g*e?74?-%)wgAKAf*w>E z#>oYcZ6T^{{t%y~&_-~~jX*MJwgj>*LA@V93NQ{=?FYw{tCX$SIIkggW>E~W(_*o5-Lt(Y3{dFlzJ8~G@D6) z%%tkq&J70{PzXyx9F}y|LBS+hzjmJ;Cg0^K*76o;)|*^w{k(+r6P?wMe|nJlF#jAw zlqovFeEc~=z)mX8#HY#tY+lJwU~}^!-HZoPctU`1CTxgi!e0<1=~$4UaYzUtLGXs; zm3kX>w3>S-6sblpbh6GRZ-}!>5E-vsw4kni%sx2Il_DS=qtr!O(v`kD*I9ILem0$8oG7I;>O;~P z0kxo3_#KH35f4mXG-^H7I=?F|ObGKbytlR_>0}`4r5Jh0!W9p2jcAD?oKp=yJigm3D>WUZL!sfjFLcwlh>lDda|yKaLFEfJ|3W9 zD*FW??#l^ne~jq9M~RSpIG!5Lp#gi0@{~_xvYyWPp?rpdB~9SxW$)Xah40xdBy%q$ z?QM1yAlvh~O(G(4^1ff&lzj|Nu>2G}O^c~Twj zw|d0cAriowzd)pYWfPBlWuZwe-`Kb*$G#=1;~NXjhH3ZB>LzUtp*C0WLZmHX z3ZMqS6k!6$<|D`EvAh6N<1*yf%_nii0kLIFi&?i6_$>p1%aC#MskxjZq9jNcpo$nt z=1YLtGLqAmH2=nyFy_z_K(@5ub4-#z?BJ(%GeEn&_EWpN@iTh>kUhrq_`VMqJ@#D^ z<}gQ=ykk%8eg{9>Tee(dB#}PwEYDCNdkJ{GPSLNGg(qzlWiVIZYl~u(iD;!TQm1q) zagy15p?TErE+8?k=+!E#rov6F624dOwL|Onk#Ez8JGs$X)?=k0KgK~e3b6sw1&$MF zbtT<#UOQhTJBtCSW~GdAD(Okhd7$lY9{a8vI&*3r{->f){&+$^Z>-Hm>c!pnKM zl{_C6bo5RGp~bs&kt2LE-y+yW=uo#PhP2&L=mIKo*Hdfldlz0bYTx_O5C0=jmum1O zYKKs#7W^abw9W5~I}GHF-z!fdSxq@F%*N@N2^o*fTpETtvhULzM50zlXm^)z4m~wl zNBA{a4lt*+jv!hSDASCGUUrG*Zp-n)^gE&5_M75nN0h@aaG~iOI-&a_bq@cX1vXuM zVPX9FS2@;L9TD7?mi#$t!JnfyAi{qkf$dgbpH8gDK3=LQI+{Q^dNRN9^bh5_`y4JDlEt z=4(QSp~ZL=Z3KDEq-i%WR!`IF3Tp*_?JRc@1J+B;6d|w+hg)Y7>sfB0hDwX;xLUIC za7YkH(g;c#z+4@OlWse}@&T}T5cC`bgNMp`?9gs(mBn4QAG_mzoOAo=DfXh{_JY(Z z#=@y4=%j)H!*-`1vI20NP0~OnA&wcOc5elLo6&KbNnqMWXk#WCZ7bvJ>_FEQmi0RV zx04)@gS}BTzZ5{SgCLWxfs&mnPPdpYa&3|oE`7~DmIKuI_0<=vK3K4{xY zhiq%raZ9ThvE*GtmW+-Q{^ItX!jMI&L>x668Axqi?trZ;0(+&5#a(p5;wT^-&!Dbx z#HB}5+iUG+CZf?7MWs**n&KvJ#CO?i>yFuqs194Xi4cdFPJ0n8_bi&?aeQzOZ630R zQikk-Ez~+;uI%u~u&zCfW$gh%CLW+WzmJT#yQyt*TlpupXczb^``D&S%Ynct`xxPT z@2>&`?gxRRT5cLBoLY-*a{q5^GV5;G|2w;WA5kYY;IHA2=(#^*za&e%`D@1a`PwD{ zzDcd$+GOB2?dUf)L$*qMaI^8v%>jRN&~x)KPtIc!1{Y|K1#&)Elg^tX1hTwf_*+{t zge`N~Fgq*(fQwk8u*;>yt1LzR1rWqnhl*Q5KHfr77Z$bsfz$zfaz}p4gkO%4hi*d6 zDScoW0K6F>-q!SMs)I2KP~FFNf5S)iF!oD9@G+`{J%NAjiBd)ZVqn0>3(wkeY?V(_ z_3~MTQI?#w7pZ*tM!^YNg-vp$s)SJmb2Yj9G33rAQ=V-LNs(E=u!u<6U8yaMYk==< zO$~W*&31@UewqlCY+ON<@LCd9`4>`hKqpf#Cj0>@I7}P^>&k#%0KkyOgN;1HJK{P22msG>w-x5Fq)iXV$?-p(n*|&cwqvHCR+Bm$qT|gu{s}hXpTG%cehkfnQGMb z=#IS$|Nq2W7#bmI7dL~2qfEU23_NPOfKKj_fNlm;AF77A%}T8uFLs2Xr@ZE1Y}MIU z-VoRVy+@DK)zpQ$g)Ru}(=p@2(n`Q8ePT^;@VGl~nB}Z60b9pkIN<^-d2E%p)9-xj2({XIf1#GNO*r{(Gq&FMe2~o$`TXo# z{R|tE4%2cqZH=^1Hv{~C3heAc!6>KEym`)%??XjxnQ-GsTz zJbxm3nvPE&k{}%a??%cL)MR|1?LJ7Oz7M+Yoy1Cq+uKBsoJHTA!qIjbxShfkH%z37 z@&Ni0DC~v4>m#b94`XCUDmn{L^%chK#rKQNWEz$7AFj942z435VI?k`8O&_y(X^ivh59=cv&V=+&`YCj%zK zt!i5hwIU8sl(L4%%02W1)xfL@18D`CvwSOIYH8FIqyS|B>vEIoF+d*0=|+?!#z_qd zCxc`*(IYuTlH>rfoy7I4&}CjpKY0MG$HA5b40F(R*;+0ml5+2`W!H@OPzTuizb_HW7$cI!tu6#`+%+4N$o^w zy0TLiS9XTn0Bl_JnxV`=iy?a9ryEH5j>7mDoiSwVNeEa?8uF^OEw*yaF$GMV*fQ@-5I;5;4QnS_&vL)kZAZ4;0E9p z1GqW6Kd~95pV-vu&uki5a8t<%n1asJJR~dSb2oytscgCN0IKc)if$iaDEt3l6Pa!} zNWJE|KcVoxAh7alM(g5&@Tse(tMjJY>{c8}1JC1M@sk^x#ZT`St zZQjsdZSLS-2_Rt|`E&EY++3lKx-F|9i}YGA4> zGWbqPIG2&#Uxfp%hT7cwR_(L8Ra7wtZbz7ot>1(18FL3gC4$>PGC^Pbo5=Ylzzwl{ z0(CbG(uUyMz^dIgh*NI7`V5gw#!1aRX3b;VMl+HjlUoPpB`A)@8L*odnbKauQ+OWkUENmYU8R=BeYax_1XnmJ zA_z;+WnGaqGmLitwI5vaee-l}55q`OCm9F>b)OgNdOE$pre)1_?V48;M~}buKYwD$ zI?8Qn7i$Mch&o~r7RI;^(q67wf4!qVkQxrsh#y??y-`SpFQaxk{Kk8S&UwTNHNfxV z5?{ZO~Ev90Ls} zZnUi0V&b5uCwx!3^H@}7K%vq1f$(jI=V4MgQG>hEd3Aohp7^)tzaYWSUsV1sJ6^5w zEqa7OBB54A>UgaRESKJPeN6ZSgng7qIUL4lmAUc*{B6HPf4#erP=6(KW0E|#mWYyd zOtIzm4#+x949O|9+6hAZhZIACW*fw>){i#pVS77)lASxLEt%J3-Iyf13!ANfU$^y^ zwOXfi8wit*>jPu@+`;D#;!4``(P>#=Y&+N~#H5Jn@erD=Iq#SqLNC?DAFz62M-E{k zJWMq6;n#Oro6MEeZ0@2kLvIX`&IDB+<3;qC=A_K27IO1s5T8O9{^SRLD@kCRAMTuVV^yW6;KVf%E4(RbtcQTjK6Ic0h7gy z5s*hpo8mySh$m4^+)nb4atgXVS$oHUQ?_I8aob)& znp^ddWrDJ;Xta!d!Xu#T1qu&Ism3XTHJ21 zRdvFmNC=3^A7Vf=#v>>gvbDv>ZG9mFyU0X|K1(G~K{$&gYj^_^ZBjG|+iQvRU%Q#) zDzdpfm}KQKd;RsJ_S!~Fm5IbnrZdDG+aDoTQbm~`qz2W`iTD@J?%Q_C?#aW~Mjgt# zcD--6=YL?g?fTFb@A}B*@BY~45KA(v@)Mg`LCj>;XT+6!Zqw0iQ>#7)ZzOn=*gdrd zknLf*_{5rk^22to6R&A4W{{Qur>o7HUossW}3^g6x;%q=cCx>5C0Wa_g7m8#ujP9 zOSgnrlf{ZR!Du-T58OO(rWz{qI!X6tT1YHPLc%f zBBt_zBfqi-8-E4TKD9^pd|;2D)1KUmW+M&mu|hm>N(>;T^6AoZUd{PMaJGu7&tA~)+qyiOg1739BAXP`Yq zC>B4{{>=^idw{YSYMAg7A0(!v`_)40Bc*MKf2q(Q{_Kch%#|K@C!ht0Qh%dfIOuo8 zF)cZ#f*|g&fzg@gWjnlgQs)xs-MMI|{>CFs{B)yTrMe{VQgv1>xK+}7Q+;yG=?sn_ z?d<*Yc!5o456|6><)$xhqmFRPrk|Rle67IdXbcnXyA9Fu+gmDwPI}y1Db#*O)`%8< zMfdnPuTs<#N9z6tHsuAoU;J@e;2hHK(q7udJK@o}`gJF!my}e)9Y@@=mch7O2w>^ITJ7P#p^u0n5!pOG zGC_7oaZPr}cbUJ5yG>j>3)kKyR^%*fJGp^`fH(q(3E)44ZBa2LJy9jZF;e0@_mFjC zPi)-^Z}J+6iNp<8&;-BgtfzqZ5Y6FSkLI}P`tloX2%BU#v6UT41|SKb5xLe(ns*~p z0}`u=_>DtIHN`d_LSh}lJ>ImY%37l+K12$2H$_Cmv~GCThVAhP@~j#6+cDxI8~A5# zN^7tNVod6ZO{q;Mh-_Q4)lrJQ7Mo%%BfZtaI5F(N4mh^Gl{m;FwufU55Wlex7hDx` ztr8n!6*8_I7us&(A9oQSQo{HF`LHe@ChkOrlx~er zum$dItvP9%al57NJ7Gykv&724{T5X+Wa~&0SeMB-0^0{Iiu~R+VjJ$dXksJdcCv4J zkA;|G8CPHf^+(n*Fx;w*t)8yEc14pVtXj(`avR$1wbgC*8uOQ;JMB4k(nxX-BirsJ ztL^UeLAxKW-4hzLyBKKT-n_GRTRy|5Qb+mL-7t;nT#KotJg1ykl8R4kIx=ncE;8J9 z!8MpRy^N{!Gn;~hn^J*Y5~fYAV93;JMvU8wNIO7WYZGOM#Qr#?9nl8jrr?a5-V43@{%SM({$?|wl!!J55jF>^&4gkzq1Y^h*=#5_ z7g6S-O#%+9<3b5L_MZ>c79h|TDoX&WE$kzjlK2ymZ4QK+i$!uC@g)m8utZ{wT!K|{ zsS}PG&{!sK*TnbBKin0 zxkL(0-Gq=9wmqub2_w#JiQWydg9ie5->W0&nT3=wedqm?caiFHv^hz=`1$zsAW}oe zI2Hv;KgLTrg-`cg^QJe1URM2^_l4fuiCAuH^fT!=mvQHx836ptL{{JB5}3!Org zmbIVm!NdJ7)YH*(){$D4OwlEupL1JaF^o`sEl-*YG^L}{AB4Ba?^CCY^jl*gSr>7o ztmgX_b;DYS7`x#M?w>p_c+cR`g|Df{7|1wppH@feBEdB{Nf6wjW=0-+Ho>cw1RCzY zDD!zbw$NMdcf^_0P~C~npt;WO?bd?d(1iRaR=WG{&g*Ad^XZ`5TD8Ww{wT{G(GEfR}qt_z>8+d_%gu$Mg=9N1A}SH>tZN)CqHMk)eGSH{1!V zkf)JfCzRJl)X4x6t`}L>wFA5%-P$r4-GlJRc5v3ga_=tk-iRm}VBX92UbYPtlO{mg zfGU=>6S&n1+72^6l-+2}#ckGz2jECH?lzVWCe)*eGG=9i1CdrctS zI;oW0ww8=;s+crkjcg_wtdXe!;L?8o3T@ z$afT51d2F}cNoA5daK+t`dcy8TzTK6>=-~O(;3C3gA=A8K3Q*!= zn+4*gfw-AvSS7*Qtlgj4^b(|75mO$+4di}kQap{qO7fb6qW#NUV|9H!xw5yy3{Vc0Iw96M@}iq}xP5H?i|CRPI8;A>RZ$huqNL zZ1!Amn7boCogYqEljcXfCXqt`xYr0B$zvakH7v zp?b+&StOBeivZmctdz@ezug4rZe_ZKV9L9&RNjf4ySwq%b}#7xKL>6P)qZLZRei`n zJV37GZF?BW_5^V!%PCj69CzCY}n;rh;1i+b2_Kk2XS7YS~Hoc2|F z!Y%Y(G<>Z4=fYiNph3N_R#X1Y0H(E9{`>z8V0WP`k6{vtJKt4kZX66qqZ7N~Py6b+ zj>=1Z`2Bx&hIxD8jgHnm>!RWQUPpL1{{>;usHZ1P{kG(=Yr7y!LMkuJhOzuIkBaG! z${jnK&McZ}?q}A5^GfiS$cY_z0 zFh_KzfcN1$^LG2U=vGYF?B|QT>OX(%*Y)GillptQs=jNTQ9xDG{d%kqf9rQ#HPuuD zl=00YY}{r4>%VOM?7MB`HB}blu?N3d?d;#TR{3vH3m5zObl=#p<+l_On8eB6XkzP{+*1kuoIXzPm(Gyf?09^uU;>F z>|ovr7h7f8REWtoiYZ{?>}6d)mAd+nh68*a#%njo_I@O!nAkzoWjp4~V@yrihpd4- z@MA?Sfrkx`n#L_?PGal=Y%uNdqzbGmwT@SctdEqqKHgfp)|OfuMVOCJr?Lr`#9=Hn zM@W&Yr*c<4b!qow`aA$D58`b*kU`xNeDnK|l6#1T+=J<|CcoYGV6v=KhzW9U4=D!~ zQ38Mc(<+g49jP1Gd#?wAQ!5NeJYvY zU)pZGY}Lmt363V?rAsa!v7};BHVxo?sAlhvc7R-&vz4fb(+Q!!!EN1mliy>8R!)r$^YSl4Yx1p6(xpsRcjXKR# z&wnDe!=~L&n!!COBX&#bu-%?XRW1rN-<-wRsSHN2km$>~$iF#7AKHAe5Hsd9B;WKB z%$X&h+01;rbUR6v+rb16Z`=+Sb3V37+ds641)te9Wxug2tNvh@*Zj$@JoqQO`oI@< z?ZL0?8mM?}!pT9oaV>`8T}> zGD68&GHi}85otM>h|77T3(RLe7cwTzK?g3Gg-LT3UcFgRaTWn8vjC!VkQBOE)H<07 z4`+#sFi~8b-%Eur(&iR3U)rs~3@Gu82)qL^cn3VZldzO~j{MplkV%u;ClA5JhZ!3E z5pi+%+s?(O5PnbLsS^{Q!6Wy~uCw+mNe0j3je7|mzQ$1Fs~FvOT`t)mgrCGS$Z86; zwztOe3Whne7|&cW!mo-Xf;tp`J*7_@7%BJArg~ln$qGgMb?_=EF81?!*Rhcd(iGUp zIK&+aT3%O4*#?Nnzf?EYk{(_i&xiAS5h!&KVph0saXP6x35p^LLKmoKQLn1G`fbhC zDS02|*l^^8yII9GjA@nNG&-wy+rC~s?|G}0P@3ei5UyGjJt0&$)Fudo>d4fgY1!ec z3q|To-UzJIeF9DqpI`zPI)_WQ@VKMn3LO8WWd#H^{}L<|&XwOVsmgDh*VL&Fydlw;5O?BLYnF2YB) z?a^1g;mO)5urO=MUlQE#=y&g5l}?|e2D(fg3)t6fi9FhT`Tzb=aPA56zdbN@fj3zX z#!sUKPbL^^kzY$^2q>%TXeZ4()^2kJ=x+r-RD{ctD<}I_9i#`TJ@x*ibE^fK>w8j5 z^f?@Onf2hyHti=@+PcN}TZ$O?J!xJSg-@*ar=z3v>(P;Vz~L5a{+&mm2cup5*X_RH zAL}Tu&Wzzx(J3FPS|!wbmoa!W4$pgpS-!N++tX z6|x;8@wyqq=OGNAhf#({Forf${iKmtmBY-NakRHblORs8rEE97s6TlmH1A|Mf@2Kg z+QM=xBs{{rnab;R{F~R})H_JHbv2aS%fEXyF)n+FcTp}uCC1Nclwu`D)e4AMO#tRD z45NjtE80%XKix)wlD5+tsgN8bwB-{wk_`cKi}0*KBPD=uVeq*0U4v9frkle4lthAC z5*4`8>6W&Z4l_U;^&+WVnM`G_WE^;@B*<;q-DjIodt3IQ`0CDC8YE1Ea$EMFfOIHF zrp=IVOC=7xnp2iSkY&nlIr5HMY7y}%JE?4vgAp^c)7De!X$_USR#NR`HRHOhrv%hW z2)CNSz}J!=w?3LNUm)Km*2P30V?q(GVj%K0M{Ls@O%}VBYRwQYnrS_;m#@UM6$uvC|5tzf2{VTg{>h{lUa@I#Skqy`7e{NTz5-%h7Ozo^=6TwFms5Sn5e-Sm^^2Y zb~gia=PalA-j#SFz#qcr; z1v@myXV6K)csI(hgBQgv%$+^Ns;CCTc|EAW|Iv4A^{xJ5*6-2%3OqZzl8SC{xmHILDrePad7#tptA9P)Q8g2KNeKE}KoN8TQ zMRn4Ndx23v% z=KFSaxc+c-fQR+yp@bifb1ujt2vf%I#-kve>Uu(Md30coe{J!-=c%I}TMx-!A}-Mh zoT04tId`C=btjsu0scj(0si-8wy$QD71Y;+`mE_xT5Y-n`>KN;jSrfE%;l1l4kTNvDpM>M2#d$$5 zjG!ZgULI!>#s+s%rV@n7pm~f`w^mZwyiz(fW4pjo4+V)j zU&5)*e1N(pJ!JlL;$&}oopD=1R|{45j)1!Q_0@KOk#hD4TM2cPOWteM#GR>TN#*7y zs{&V*2)c6S<#}yZT1?R_d~rp@r4*14kO#(guwMZokrHfqq`mDZqCN@u$}K1Tjg&YI z5RguuKr%ut5uaQFxdCw)G~cN*b#(o#4_8bvPB$O}lt;uYH2Z<|0@ z)DA3Pq{VGuT1}<;Ran1PlMS~%ro*CRTWsTc5S1X&#)vu_5Nd0hErvpraqEv*EZEw# zy2aMM)NJe4Qaoxs2qR1GIox&6QLgKmG)k9XzkDEm&~Dw>WlKXtj3e+i2z%3(WKzZ? z`)!+>`IgPjrCisJ4{cW7hc>+!gzfy)X5@TkH!{6EGw(B-T_}d(v&;I>CV{Z)vKeis z;MaEfuHV>CD}QT0s{W&0TJwcnzW*!m#e^yIGU8CKX#Co)mS|J@oF>efQ}El#S2qcC zO`?dhi#L|1BG{((k0MMyJH*<;Genx4CCB?L^V0~qQq11*lEMho|)doJ^bZ0oNknwv_2+!Ofjvp-%BL}HKELOE0EW+QCwbsINS`CYW2O9c z`0qBTf)~Y>6F2kzL(1G1MwrM!rWNykl+XC#r7Z8>P-puHvfNKaul-~ZD3hQLC-PCI zWBkLk^Zq3%Czy3(ZRp@1p^qPZH-5V=jGEoaKn=^j2dw#6lm+>m6dU z%K>#I5x?Di^t-Mpb#;y{b$l+o#)&-Ib*vW*B1Rz1-=zQqX=4J1Gh+;4>Q#dt(K|>{ z>tZblRXU|s2v)j;taMUBng`{C9duAkTm3BF?Y+8iv~tOK$u-@Kx_`eZ^@^q%dQO|7_n#hhTvvLqxCu2#eN(MuEv=AIY;%9=%RKe>%?Qxr@EWV z{^S1!{rdR-{O5l)mCn@F0yJ=KfBK&Bu9oODn){6f*w$6tC+8ll;N?T>9BBXbFaI{$ zVAUW=(pTh$SUnsEmF{<}(1_Oj-S-w)ENdTK@8jyYJ{vEY`v0`j9kpX8RVyzDYcjP( zl#0FeF=v<$qj!O5_WImA$Ml!~`e;;`jOU-WqCh zLoT;KD)a<^y}hw?3}B(RkxiGJT32Fc@W_q4wu3qd1Xs!e3DWvWk{bq0LDfmn)q}ax z71t0UDGIwBBIM*az!453;)PyR~I9KpZ8xS~QXXmHe9+OSPF)wxcnG znJ{%~gn*T$*12N0^)h}<7ejdufUiOD)xWOHx>prj`)e9@ywr{|HM8x&s&Ym>#YjWw zWo3xk$VB#6<8xDem4JMJb{*Nny@0+f~AtTZN>Yu|5xfT#l3&QTzq? z#qwC63C6a7wro}TXMJuNwm}eKF3v%dWMRMBilQX`p0P~ zsZ{n)!dI7sEixHArR)V=`>9k>d(PsqEv67!lBD&dv~4~By09~*5Hgv%3)>?|Odzf< z5!+%C;o|X14n}pwp}ykt2&qi#u{EJ~TZ8&qzu^eJH<+8&G8%q`s&= z8S@6^=-0GjhwQKwD_V%8?68-Ko_qn<+tUmX@MPkEJsR6@4{z$TyD>f9M3m*?ZD(u= z_*#&9&K7QY%NFG@98T6RZ6?z+5H>CIBk+X@5|iUA({>U*iQ1Y5zHUT)O$1%nZ~e%w z$^OKy$Om7$e`Eh$`Fr~r__}=WpY5`JU)X=|`^qk@`_?YS3wMR9FFbEY7&PuE<+<>} z-KaoH%5zNwVG}#q2Ery&fNQE$7=E>>D6koL-4u2*|J2`X@tMClzUDKZ2hIX~u^$1K z)4|siG}vS`*ktfG8Ej1=^kg!~nu7kCgwJjg+oq$*W`VVNU~3W9$R*5gVv+{Cg8}XC zz&m#*rB3c_#R5s7<-J%Re_sDN8Q@qT38H+c`a{A_lm-4vd%Ws>JaSBg?L1R_7JR*J z&ljAsSIGW;BYV(R<`6T4C2|AdCkeYq@83x}2t~0slN*r1pmDh>VG><$MM7A5t5so< ztQNv3N-Bgk^;wncI*dMBnOWnxUVs!IXEJ9v~x_2am?z5ZoYO}aP);)Pp|aWXtVZJkE>IRiKB}| zEq(e&d!ssPk>>i@#^9Zh0uUj(f6nfZC(;>Hc+Xf4*fwdjaiZj*=i`HKO}iwk z^?^xLFIt?)zo1bEA3OY5P5cPMqNl(CHt90K?Smu=oVtN=kAv;pS_YnzIzySAUQ=wR z*B0A}S8@rPDfb$bGBO?qb%UhJ32(jB`RYx@yPdShM#vW!0boODG8J784O7f3VT58Q zBbXlt!Pp?xCsm!Ym&%iEAgm)5*I61R|5ZJbVddIETo-Anow(AvUM;d742j(@f;I5g z&#-WPE2tK>j%}|OTN@!Kt#9nM=2wcXf&b=%yqNAK`mzdNdnFkLyF(KKZTcL_!daeL@ z342aiY|R-mwCT-2T_Pw;Bzrrl2DE{_q;iy5IYve@01|~XGP6U3kS8*jO*C0iNz}uL zLy^UVNCS?i-u!E|APhs|`WEIb7R>-RF&G!42sMdH>_nllZe^pzzS3Z^E1PT$Ndm8- z(q4-1wHH$d?0ItCmV>n?5{B*Jjs5oX#9_M=v@MAru|?o);kLJJ{${3R42;{}u{qn` zwHetT*bIc%%$yHx#tx!Q5M(#zBF3QG6ufFvAlwZowg0##2czPS&+Rgl*?*V*)_z?6 zTl-nnpX>^-c16wC7#P2{|3;nt?9ex^%&u+z$|mDVn~o}*-a>8wDR08tMBxqN;tk+! z5-18yC6)WXr{W@;4%if0A{{pW)c@F`v;PCs{>SE={F{fK+=ynI4A>^I&kexv2K3nV zXtQg9+eFTE9eV6KG6rs7-9)xc0ctaV-kd?=E18z?`DPgx87%I0Tx@rC{gDw?|6rlp zDNp&6I}ZQG?j`-r(N=?baUXfzdq{f&Z%?7fp4t16JzMdf{bC1WqLK#p(ylk{70imO zF)yy6z{xrW5QxIDwt=L?_-z^y9xFB@Cv5{`nbDXRneR-X>?xM*GMs8RAwF4GaJThLpt z8@4X;zKjke++Ta2ss5V&TgySzh5Bok1CimbHl!}=``&|&_KIVDnUFTx^J<;0;Jqi; zb*^2YPg<*vQsaAz1X}hk?R-w1SL{{qsJ1v3gWLg~REM}`@%0nFdkyuY3f~LVMclnl zJ75KC?d6tIFVg5HQ(q;@$875b(43sHndLJgux z_P>#I{&(Tu(AXoq{p3SSCe4b*ie<1~|Tt_{tIDLtGFIvjeeGYZew7E%Wo4^>XnrUT@M>aA(|YvSLCTuQoLGTlyaLZyDOukoESD1xQc3({B_&2mDOpm8E-N7HznJv0 z5=wv+P}Z>!nC&FQUvVFWWLcMF6DLW}u#+i=YFfE?#&(pEriRW+!IT&(8KA5qFd;r9 zhIs<uI*iSfjK#4#XBJn)K7l};n(L|}`>RJf|qqE;}L&6;C` zKmxFsR$H^F#nuoPxrUgKgbkrC+qe#K_IjK zV2^F+wMRA$*v~f&+MP)!Y+?LKo0D|L7NnfAd1(l=48|%=f7_-fykk>S-?gb3@7uI& zVm~sOw&5znH70#FiTOl`Hj(A4fY+74>k8sQE<>07r0S1ovp)kb0Ji^22K4^gF0K8> ze%1iM4v_{xl;ji#7``juHG|?@)6iv8y4i+F@j8klU(Y}QH-MfS@sLeHn@v^32jTy7 zWKKLSP4+)F8*MfNtu~$L$tfUg3Yfcr{jMc&@*0l48jW`~=kz)Fx`tSjYgu;#T5K{p z?M6(Avp|~=wg|1ZtRJ)D00@(Lkx0thiK4s>jNJmoZbzftPN9-}_J3mcGl0NDB)dJn z2h$=Tdy1sDXUcwQ&oL^_b5!Sgk>VsTF)Ge0JIUDwV5=AfXEmt+8_8ANlt->25KG>| zfVd1qn~~l^9;JSmT~@##0R_~)Da|6NcY6=Hn5|Zxi0wR{YF*@AHsB{~By#cyQ%f5D zGJg0iywy$UNG35=_Qv!k?29c&V&+ex8)3_4yRoeGrEeST^xjHW`s{_-rt```|1P|9-7ih^f5^v|4 zhxc_BMCu3;&8Zc5_{P+qODlE60oQaPkLJ_D{$Iq5^6VE2?(oLzOk)J|BtWeR{D5l1 z1R+2R+DUi2@}>uZQ$)&gr>Eo%KHn}~$5%ya$%!M#M5;-8WXW0`RKwEKj7WIsxqxNk zl_eg29-6!Qa(A4bUieXeN1o^r1TI6JDG-*rmM-JT2jl&8+<~sC;#mQUADad=wJBNc zk5J2!gs=!_SFny-4Ird1Unf<0WIx<9-kM(uo&O>5C98!xV~`BuOZv(pi+=v9$B<;X z`r3H&BV*sBm$@7tCai8n%PCq&2s2Aj{^FLR8b40kYrkAyWFInr9|xHM1Cn{TaGcMww+YGKKzoh8bL^PA<=phtEo0wXT$l;Hb6Su0Lw!e zwUj`hgfgG|6O=bvYlEaz4>6uhKVoZ$IQ@Zms+!<#9_Bx408S0Vo59zLY!FTjz@?t$ z**3VMlmVy8tovn#9DrBttZyT|?FjLXwW})a0K#k^?yO3xKbGSLD^G2-U5px9Le*H6 z>Mu=ew4$_nE5tpP&prjjF6I;6QG}=}!VI$$VYMS)%dm{t{sL0i3SgAdt#jd)#$DUS zvSRO(aD~OeqF7=UV>u>7wU9X0ZNlXhgAH*5tcpdLDIPzL?j1z{7 z%)S=kbv2^vYUX0sM3^;+ct%ODX-qSaRx>r7fLBb@kzLbZ*<`j&Ms7{SR(Lg1>na#^ z1^l}l5qCMPx(aq(g@(HZ8|8KIOj2wL({z|M2g$WSg8>ZU5*uJ_(|*SD#-?~1wnZ`P z=GNbN#Q&{IXRH0x9-vh6BQWbR2E2K!^gS;l{fp9f?78Y++6#!UmkQ6>%P?yN0|Kas zmJ2W06EO~J1n#(<_)9Z*F^Orm)F|>KH&bhyFrG~8iG}1x7UO#@ChET|v)xLQ2u&iX zWIwr<_0;QbAhx3s7uXSGSeuxI?2>D2d^^D%?TNLFiAXjMquh+eK7^U&uj+I>0dOR3 zyf4;5(DBl3d8h2@S?d41165Z=pQq2>UygM^>U_N4R8JQ4-&*qiTMH9(h}hs=>ge3% zi`V~Iug+4pq;1+q9lDO!LB4JD>Tf3Q z@{Zgi4&0h`%j8)>!yR0@x$)ji7RJPy&gd<1@ufCyy??ZLa)k24JijXNnE6?BuYruv z(m&|{r#+1m3e?E(^YX{R&H7EzXl>u|L*Ig0{H@^&&lLZip{xoIc6kDJx?@Jo(dlS7rqJ zsHKtN2Nuv(XVe;b=bdm~MBZOR?#E*7zO_>eDz7a~13=`%tgb{H_ zV|c*5t{3yI?bTv@ZZ%ei!LgPcxLUGU_wZ_3$(SDHXt(lYjlb4pWmsLxHWU5<6L-VA zUHH!mFgotsPOciSwcDBUa`B%L{;?fxmQOl%VJ6I@YSs?4TaL<&us#!C*%qcGx|>+^ zS`6!B(RDHS$l?oN9QrMqZYhTGw_+ zAKNye)uJmY0f}~73-?xIY+O@9nl`-Kl-V>+6W$i`4ghb1tNjq3z^q_g2Wdktgb3+r0# zg^iuIJf_DUTGeLvts|vvZJ#Y$H)wOBPud0363^LGm^Wi9tV@0i#=UEk(P^Q{fN%c9 zln-o5?k6^J8y+)UYB%J3VlppYPTR?%BKM!b(72q?k7tQre3r7C&oRBS>us2KhU&=_jl`d}dKc`YZp;P-y4h5O z1C}_SScct8Vr-)Ht?0F=dP`qN{nE{hjg;7A`9$&;k>OT^J}cwLR*}q$9+CXDMDjOc zZfuAp`2|BmGx1PI6wk=0rEO7I^6{gou1^P35XVTr5X6G0m++2}ZqR!SdM&r;snZ!R zR_K#@Fkh=(9ev@>)jQU|lWOYH-SaWlt!cs4p?6DMTIbfqlGH1W#Up5~_or+L)Q_Xi zdoJzm-Q#GiKb@@lHkTs-Qe3O(fFRC9?edOO*i@Qv5Jaf4(bU_EVQ!^#m8PZ0^Q*!F zP0iJPYRj0-@`Af2&GBaX&G59;w6Qjx_c6Ktaj_UI`5mZLUg6Ri#7!J|K59a7pLRuIb;9FPMR^6Z9fEFUgB;Un)u;DIKyDW)60LiZ>Yr)Fr`$0U7yhy8M0k&j9GenN%4 zqlgex*qfRdef0FoLI$`gL&@!>I5O79)u=eOjl8m*;d%@0BxD+*u4M0XIjAn8HBxJ= zpQ$H?put|B&F&A@9R;a;pdG*~+)yG_|quazbl#O~m8A&Ew; z-#|Xudf2s*T(a2zkE{0#jN-iBwez?Ck8!u6VA!&$-We=;oga zv!>wxNLpB96KH)LOZ%*t`K*}*Aifl@N8x^(7}{l1vgk~qwj$WHr{VudPuXS}Xt#6{ zVWEk{9Y=1msYyF=-&2Q8yfHpyH(ifuQ$km*36xx?&~hs!b%#ykxunExHZg5K^=JFM z3-Tx!HUjJ7M~Qpv^@M%)QtEMgHs!cIIiau+#nk{U!ku)Y5!}hqP=Pib&B;%L}HYT5DpUjXqiAE$z6jvnY?6*w*RI>Qf z$-xSglcz2>{G8%XvLv0^l~8L7h(gYTWDDu+wgi%`$)(jmD$|ofvC1hMtbC%{7OZEk z019CEX}1sYwpS!mHy^s!MQB`hSDeoX5N4Ieoq$z9%d=T}6n<7D)2I~KvbE(QJ_m3}F7kJxa=Xgu=DAUB2tkueR7*T^#&wm52Z43Bu)){Ar&t({r_2XlH~9Ubt&uSesX ztHJOHAC^A;`@LoOk=D9z)l3DBi)&k7O=OXAKTuk})qGDOF~WvK%+-^m4hoRy-|i92IX%4go9bn zMm*c?z5s$PlrB3qI^Vw$F}toli>uSr^BGS;SUI?X%J@li<3PvcxXY&bSdookv_t zf@~?RgXZzv?9`12F4_`j(I6z3zE}vY8L1UEGedK&@f(-Xp$rhsL{!a0WN8xYLSU9p z&@q?5Vu<}|7#F9JSWD;mbdH@u;dCl>J<0rDo?3{(vGf3mEyPa_1?DsEwuf)i~C%l#9jVNsGxQ*@ee`0?v+!2(U?5vy)>hZ5r*A zGA3^WR$B-%Ry(97lMG7^?L|;gN|v~lw*0iiqIh~dbFWP#&NvY-elozCjN@Y>&X71@ z7Bh|6Ytj*YLnj}ww+S}BmU7fynt0TnNj`2*q@T10Q|fI%dV>wfJ!Ac|&sv|HM(c|3 z>Y8%_GF`UL1uTW1T2~TeT}nSE5%#6E$B5sSAY&US)pq{h?H(joyX9Y7$Cck$J4n@* z(y@EiLo3S0+9JK$QbKk&z+pF_B}jE=y9XHRj--+_>qbygvZ^CetNmUO1+?xZ z8P)-b)e(u+1x$6p*w~Gw2bk(3T#+bykVKh!X{nHGATsPp9zS*92YY%i-68iOy7tf^ za_2Yp44oifppfikxmVMc51)46=?(i=r-X!4)Rtgp0N^f6Iy+&T;>4Q3Jy zdT(tznzRwLnPNk)(J6hDY#Q5KqeW@7(_W3y4#+?r@{W#N{eS+NRt0oT9VRKY$>)se`;YPUqBH2Vvmw z2cz}Aq|zo8CjI2UF!;zlaOiC~{j23;b8hLIi_o4cvtw(&cKe=)KlOdIsbVeWk(YuS zjPfhxo%{>-i_mxIEl&JzhNpCb*ZV&j$ge1oQ0=#xzwfK{CVIJEt!;f=f1RNpD}2LR z!?KVzqO|pwLW;FTv`?ndEc;^I9Bagxc#d$OsCE%=y{L8?!F2}l6q1GUmXk=Y(@3$C z$t2K11Q0RB*CES}O~#awu!wTyMf3^B{J|>@!?67^^XwosUx!AP5eQ^rddwZQ@UnJ1 zubZ^kLMPL)q?|&S)yLtC#E*CiI-W>ehD&lD+q@IS(4yHRMWVKr`$e8;F{$A=|x_S!0&b9%wm_muFVkk_ixw-=E8fw9H4I&0{^AYSJ0} zew{_1p%VHG&A<{?MiyPu63-zFI18f9By-_&VIjq45hheCtOC+)sv1j$ULmsY>8d0{ z?kT*O&XggkxzKDn@(Ze^`1G_{H@$7RfaR ztJ=63>|4a#T(rH4#pW>@pWs0PP-@E^R7*ur}#*!CmUl7czfZ#KLt15hJeL|W zilavpJdC9mWGoUaZvGjJ_@^zA>F*|$qR1B$NoHd66n?m*rDMcP+H5%~)m8w{iukiE z4Q;bBilUdyJwhO{+7?XOV9Td&vNdpQ{gjQiDZPs18GQwaOza>cv4<@3uDE5`dvQ_m zU*QPR2oEA^fb<}uqsiw~5q{hu?*0M|+8VBEK(jI8}s z8h#?fW0xBxn}TV)&sE-dgbj^e8v3+$dci}{EJ#g-dFB_7`JQds z2b$?BwFl8vg-7!6`u|>O_>s>TaE%`M6|vT^9ey_av1zTjw*%qiLQgjla7!P3WcUnM zfZn`E8zYULe>Rp=gr3b#(Il}{8O>k_O zJ`3NC_o;83_K~;WaFd-GKl4{_?|{=6+oZs_L(hBpX?2p5lV_VcD0`GK;??dC22n`A z!IqyUi)(;ZEgqYiTRGDn6w|_rO>6P(3#y=nw@=V&pP<=Xx3RuJQtT|@!_)CpP)}J- zQ%F*10Ip#ox(zO!h@Ec@py>n*Q-rXFb&Yfx+lL7u9;KznQKkVs3I`95ol8J)Apyd9 zR>SM+&}DTb&1wiH9*2o_9ABsNz`qmluTFZ6`7=)E&|4Y0iE<}MXV;_Gj-l6% zWs^{76LJru!1gk)%pMz;Ar=yzgm2?fX%lG$IiB*f1eS?-`{QYcHD(%4#;Ht*O+$}A zXEL!`cAdSTu;L`bis>h8;M6*MKw-rx4c0q!#(I@p#HD!2dd~O+zFo3Tg`Zfv(oe13 z%+Kwf1%IQ52bOyp8Mj~hch*#tX<4dp;y2cD^|#h#-9N1p-5#SWu;Mf0%)J$`jcDS% zAnhI+9JeX|7ZFAfM$z=0EO!ubyrc4Gy9309?jmXS>h1h<8=$+LQ ziv$B`T>x7&K#RujA&J(FdbIAuAiKMt1hC=t=%8pKuelfCwF7P)IHogFts8Lb1>Aaz zV=SsQlOuO0$^53zoj!kj-_xibFJmh)G*Yzl>y$s3ucrqb5aD773jR5eLu z#~Y~IM}$#<_=7Bm+3%4>ACf#079OXaa{=+3CK?w*8o*r=1Xgl}A`Nib>qj;jsG&s= zp3_L}1FnyH8pxUkVn*)3FQIYG-^m#z9Qqy+?V2z(BnY*w*XvnbiLNrt0UzkDSS@_Z z#hK4&rqNqR>Jq|yYGzr4+;l;7)Zc|;gPCbuP-s_kXX5bH=p1+7^7|%r6K0U!!LP%$ zlFxkoYn&-WDHv+q43}Vl7O}#IYOPsboL*6ib?V)82Y%ZB%W=JBaId0qT*9u}`7XO_%X7o{vS4fvEGK>LOl^bF5E+s|F<3Ssji6P(6^6B&!{VL<3Ssft{LqsJFN~7{@O3z~V+ARYCD*Il;np39D>P z;wmPXDyMvm->9H!X&iyZ@hr^Fv1}?OWf@gAFJ+U>;Mh_g&&04i6Ks{TUjf9~^pu(f zw#txYvq(2AASE#$2{lKuO$+j=5LD$6h|Er}uzZdyLXzduBCh~MWfP=K5Ak0a)TQPV z%$r55XhE$_URrMx$%w_49ww$l01<4BW)K>gxq~%WVoKx*U}Q3#h9@GqG?CVD2CflQ zK*!8tFr$raB8W*!AvlN(n@W?8N#iOk9#j1|q}Vu20poI!Z%m06=W>kTAuh(m=}117 z_;e7KxzA#zAGZ-WIzFW5{yV8hKvWIA_v>wtjEl)N_E>VA{V}=L?oT~w_odcbUySzM zF>`dM3cC9Y;)ui(?=1yWb3xR6vRzC5W*t^ytY-@B&a3}notX@+8FsdtAu5K*7j z4PA@>ZqJHSTmNd$SAAiFD?hiFE5EeYHh$((>`#m2>G;GxTK75Ldwh&AYZw#Gj3(4L zh9!1kBYmkFkz%Jvc=9U-)t$_*lqqDxLd27EG4f<3Z?zn1qo=3wXPUa%W>3Y0ntd8mu?69u+;ovEch4ZU|b?&zoYThZPt z0_c^#P0qj@>r;uAfdnxuyw;g@yfm!xN7`=Qr{kI)``P_6{4I3FfqO+;k@_ywc+uh1 zYVJpg{)q@df``r_WVqSBrQSLGjMkn~6WzeZ0xNrCOcRteY1*E+f~FWTm*?u*FTuZ7 z-GzUxp04!V7vHw7^ZvG-137h78w#;6Wv}p9pztHr6pjrFLLu#l)H9z^-y9ObB7E!9 zDT^&l#(Qb1&!|(r5Kp9#InO@H8iuT0}leX<7ld5JYQdgAwL5HJ;xs&{S(McdWv&xQddP<@AtSnMLm@e8{V^h$2p0N8#8eTTGO24k~LV7@NuSGr-ae zB7S8;)J&Rn@H@4PwdcNw9F`Q&hl6u*w57%Yw^`QtM{8LDX_4e}>pG)x-51@i?tE_&m~C8MTL zQR7iu@uhW^psCOJogNFmV)Bpi9Os%s-+Xdpqd0C@&QZJPy^I?BQ|O4jmRV0p^9dW2 z)nHHOPz(m69-MZ{?#nrCeKSs5Z`>N)2pM)Oy=2kIsxCAQZa@DEyLaIi)@}uyf=wNm zqq^e;IK>=i9hmp5Bh2c`+|*rp9KGQ?ngf65&GWm1sIHY1h;9DSLhY-5w08xnyR~4s zzl)mZI{?)kQ3skpO{>N^i+5WBAIerJUZX+{x7qAk3I$+`Gj9luB zq!OqEELrGf%kL^%2gtgYrJWYyi|sKnwmy zRNW7vRPFo_n0f?EJ<59EVH)fo#<-!V;qJfLGdr=`BdG>ge_=1K|I}Vt_ldo^?o)dQ zWc_&+kwYZahs!P^t>{37q#8cI(MHWZYcUu&V&|Q)*f|XrUqBydrm>q0swVSGWojCd zigi}{F6@WZmOp`CQdxBN1Xc5y@^kKZY9aY`w2nW=)sxoS+6n7y-Pq-}nLqXIRDb>@)&3Gs*#`A>2pjD2>S)3!9O4 zy^a<=H2!H@e9~B}AuJpf{57|<-^Vx~7PWPa56=vCdJx`r_%PIIpN2gDjqWee$*;sA zHCRXLARo205i~^NCCy64g`-ZamK#2Tw@_eAuh8J`oV_yM>tUvzYoUF*bq(T!dpr=l zG~&?s!az$oy>#nd;qA=RE1FN+gs+f3vum_h_Yr>f*KiGQZ;Qb4zc z+_|f==G*tUUr?Fe^jU?^uP-pX?U?qWI=9EWx_0_Zr3oSo_zY2Y? z`c56#?!c({Fol5L^})vx)d?zIj4un0(HXp3RLH+7HCzd{bnDHnw04iq_I_0EpO3ud zx*M(Jy*P4d@Tyff>=)Kl;l~~n3<+J=2x3xMpFyur>CkaGWiiBBZC{j>+j%H<5sF<* z=A$|fy3)iivFnUtfiZL8*Aj}KXIaB!JQm0##RO|p$V#ao48O+_jyp~+?062%f+eBg zS54|lJEr&_{tfqVAhC{d-oulY+Hqvq;Y8+BOT6oM@Y zmD>`2m(Jxs`uxe8tc*$QXYqIj?yXYlYs$!i%`Krz$873yVA6Da9r-N9^N-q$S%<8M zG{cM>d>sY5t&p~Mg|xCOETOj|d@E)EDdarUkym+Bt9Ts|!L03;Nw3ySc{%W5B*C`H z)BsIZ|HC5u8I!At;4vpl2>$RpI)MRd0=|mLWThsNoti}5kg`-`Fbl@g+fXw~C#LMB z_-nT%VirumqmhVVeggc8o3PtrCbQ7EJ|>5(S@vPLb%@vPXN|058B3;X9L~0pG`Jr^ zr0`uLg70S5*emo&e2FaA3)v^^Sui$`y5@(;aQ%VK90Rf%tydqp42#cO^elWDWtXh$ z%*%A!fM3f9|E-d~`kLnT-_XSVpYV$XUUh%({c+_H`^9{sY1O1Ho9J*{u~n+wUOQ&B(7?SZ+mv-44l= z3A<-^K(H>7S&*zf!m1O2!jK$^Ps(iH0cN#RevBjCvWO@XzuFT<>_nMZv@;A_BHZdN zj-7@S z>a`VQy<7d)FmU8}_H(+1d6t}{vN$@(q z$aWpTLhsowYDtdMJ+XzxBaL1fo3wVl6#ROIXRZu9AS4`UNYamQryFbkMcvx9g?^{= ztcF%+nkb^-T&E2pgc=s3!W8pSP!AlP!MLV(xDwlIt&7nvp(ji&jl$aJg&M(ATBEcWKEspvF~qTY@>UA{9cO(6Z(%JQtEaDTEetyX z?~V{$JPyZ>!mv6t*~y|RJH=9i@9;Rf>;PQajqcim#@aJ}sqGnBW`_v>)nc4)K&Le* z)W~a(4J*U9xW;P9YaPY|awK6f`7^?X=&c|biH!8iFv>4VV<4EY-pZy_S~16zlGQ3=5KvZYRuP=aVvcEaT0vU1<-nooWT;Bu z)eLx5np(+V!t2moVp%?H%0qYMkW!ycZB9XQx#hyh9DXS0qSJDyQw=3oSQ^JoBQ!WQ z4>v~+U7#jb+GKQB5*$mOT!l9fGy7DU8z!QwV2rv+C85(2;MLekyDZihGE~zJ*m#!s zRNB}l?zC~k$}N_n=XmBP8>J$ylzldqcJ!k;M@&&IZjU22It~3r7;)@$W((o*@SNlJ ze#Q~|6Pc{n>Cy3e#!-7Az1E(CU(aMW*gzKN80flh#s%wBa^8A?t>}55+4$&rpI9fB z_Depu4$CR+TJ<&Qs&B0`8mlWD>s-!+EbyxHMywjXd}CcVX#%rvtyjf&Fzg5GQ~d)) z&6;-_$HX=gOgJ^#pswz~L4Vu2f7$J*vD;wTts8%_-);QaZbpsWOq0c%VcAWrZ$g>< zt^&59&ZNlhpw)d_oE&m*bi$?438f{~C6-BX-AkabJp{X#u2l*awxcnlC%52S`@KI~ zJ80GknsuS<4|J>G*V2MeZnS|p~h$@mOi)MJF?{Phm$j@+KQya@NvvxS%{ZoNix+Tagc0U zKr&HmW5Q}HCqBNJ^$z0Ud-)HsAA%j0Z-e!b*hREzZ6cUPIE{Ud2Qf?=LAX$Oa)qNf zn2)#-K6+^wcWvSR4i|DwKnvP*=*Rb!b`Ne2&;aHD(?I3CY#!Hw78@GVeAsnL2Jf#i z*T;ArtIP7&Xv6bJ+W7UTt;03UYVD_r6ixiZI?TsgUF?pDg+UxF^62>;ms^{Z9Q(k zC%BPo)Nx8r>Gt#o(JaAuTW$N-#@c_F_-x}kN^j(s(XS8ve#jYeKbp6?}LK`*LnT3==HPrTL~QOr;vF~Z}D>i^s7Q>D3(WMbHt%p3g) zeG{d|LV{V;7fdszz2aF&p~W=C70)RV2G!1>#ZJR8#THKvE%x=9X}ASr=i+-WBeqDY zN`=ZakE+F!cm(f74F$@_i4h*dgK=yMJr&Vsb+AsUE^Qx4q}ea2ti9;4J+NyJx@}pNUV>VntZGib-1) zkz2?m-%wOYems4f6_BDTrCHrf3cF_D#+VMXregz}PEXc6={M401-Vq|@O&QobCNb$ zM(kS4iCb%h#253>UZJVgG>U?2nrfKX-jtNBmWnn@r8s#CIgZKr-zQUSJTZ|*Qt)UJ z?us}X`o=I-bPRK5#*(gzq4;>*B;t+9dn}H93CtT73){xZ)$Q-McfH{GDYVIpKr+=Mc}15zL4RV@PZNt?xlJ zAxyeLlnZ{jYwHTn{8zemwGi1f6oyCg07ly5ZgCCN8Vxn}X$(}W5FZs?_GmH~mk8d{ z$)AUTTI+O<3hyDP(`oqED6DN=T6nE@XciwnhPUviI8@i>togr+qIU zMZhNi%$i`}@2+9pdAo2}67z9gW!c`MNfA3erCV*Xx#%4FoB{`Y7>DkW&~50>qx2<( zrKHoPX*Uef?jZwT2!fX_^iHocXN_KKfXto6}f+SmPOy* zHuyYR-ruHEpj>%MXVkTL@mr(_r&s%LCAS;uu62y>)!#^j)NK%E9Mq|AkOPz5FiNwp zX!1-EEc69AvXFolDS%x{!o?wgMd*=lg)UMh7OB{xFcwmP@uo%|otwCT234y(N2VC# zSrpnS^w()Th^iAiow?3qjJ0UAqv97FI!f;A$TXN$ve}NM@y5r1)%fGk=rA*>9A(cw zqJ?{;u;wujAQO#khjjaS#ZlT(9i`r~hUj4(O9L$y&oGg6-oq zTWGCVfxBuw|54YZLoY%tOQ;N6mabCf3R^&l@?ug2OK3~Ag!WRiAXq7CE1yn2nH1Ng zja^|G{IJayY50*_fO;yPMno|Ks*%OYpSBGmRhTm9rKqnWlvGJ-g%u@1LLL`VzMPMm zE1(>DI?=@3)Xh$};>?{ked-p=kKbgu3FVfPP~qA542U%iTBTydNS#a@Daw&kX>*vu zEYFiEMNTB^l|Ytj0!k{0C}12dHpUP=92>%mNDKOLsi-Y_{Kl|$&Vp>$>tw>$3W<7V1LAt8-`4U7a@J&QPkW z93&Ak>;kSjv2y4sN$y93AJOyEG zo%p9CmirDY?RWodp?e|QqaF7D*E)i&&RVE;QsYs>m==jPti{J z6mxT){*OJ<@NawU1U^I1^>_^n=o)wgzaet$i9KIYCiZuGX8T|4S%Qi$mVb`l@N?!F zqndgBWqXS`#nhkUgN>isha}5B24O>%Ua;X{Y~;MtHlnP-#v;Sw<`G;Zus9Jf$5iY) zYLuDDl1CBy405ou_#HHd-$4tRnq>*|jV&X%xDJou8vcUU$F8zX zMQnW^C1M9jj2*?^bPRm86tXnIiUtwM1P!Oz8k@cN%YApA4ATJPvwlQq_;ud2Y9n=E*USQ=@?Dj(v5DWfFTbeLnsVWxL>e)v0hiYeG~mN}vvr#fli z@MmC@fYG?;*!0S2UCG@y-`WJ1MWa&u+B~o1Xx54JRzCddL2GSkLu);w?bAuK?fR>) zZF2rS*ZaZdBd%On;I7nX5~wy^UF$HnbWyr+eYo0oK50j@qSBr%qceiHXxT8n)Q{8M z>3HX^K6%f71p!2TUcQy7Cp=V{A!Iq10s;MG_oi<9QGf0mRFe6Lgcwxbuwj+r>i_V7%}vLK>;Q`7bY6{z37xdk(kRuy-m=cS=ZK5-?)y@t!S;XFUL~E z;-Ql{9V7~U2A4wOQIvS}dEVM9Bnl}m7}7K=q4RXdh`clv6Cq2+xrqxcP40Ku3eTdP z&f(fP2ay_Sp3yL7w%ZCDGikJe%92~7hKy7Vz^SL*p`v%krmZDXxS4i`v~wCc+YTwp zmknofm?9IUb+EYF_LWdXIg`mR=kKzexHNW5Roy>)qAlW4W`wAPO{WTpHo`D*>=@HI zD@%5W?Y+Fm4x)-%sXX44K&3J*HCADIUxD*?DH*M$L<1MXou&BNmy*F+Rs2dT!=qhTbs)Mx*gIy|7QY@k9%I|GRG`gx2Q0jzk>OgMmUNqIcyh0USw_+*0 zZo~K1diD2qHJvtEt^Jo>z2@I`En4cjbwAq;ECSIDXsH{4((k0Fh!x&}p1KoVbyqc& zUf2r-q4z#$ZM*+cA)?T)NF6AM%mjt=Okj*1DQp*kHoDX{ z`hb6Q3iF1gVJb`)kf>GG&zo8N+09O+!x=w&mH?%dDU>ntXTA&5}-UhrXeg!TVXZ?kP-n~>4e${ zBQX4CuK9deb#Pv#(a|rU30L8Z(VM-}uW7c+)=S<^@Y_+-dEH+aOi~+OqwN*Z;g2Bv zUV41bEw?qH>e=Y~ns3>|qOJTaT%+DAe7%0l{xNAw@1$(mx#lOC4n-%{@PYoL6mvi7S@kKWHxJs@|2WP zGD@+%a0mI%rqW9bdxgyIh)V+1+S1>EZc4XvBB{(xAU@|xi-?FwyYq%yD7?aGD2|C} ztpzj5D)pil&m^ioVXo$jNeeBciNm6Vw9AwyUzo(6bD-^76)S5)UU|{&A}~{F*O?}` zHH@0&a65}7gCb_SJv9&vJcT>HA$KDM$rM~6e~w|ks3E9#6iKC^-ch<4?$LRE)0StS@-uV5i@{zHZOh+*h5BfY#~cN_{&a0 zp0UnJ*kA=9>^^c7F2BwqpgNOon7BYZ%oLZNNS$c;4K-R@lo)vYic z`80L%Zksxl#Mi_BV0Mo|1MJMdd!c+DN%S&MJIgA_6A+??@Y_LHy&fAkkr|pTt zGd{WHAImN?5Ay}PZ|-I5vk0m!`po*Q_|p2W{+sn)|5xIDe@8gsDXb*^SN)wudEl=K zq~T!?b*D}5$Y``vmkP8NOzX0lMQb3}nSJfhUu^)Q3X^XKalZp=Hxg=Wz3zL90&S5j zEwl)4m=UjA`)@QC3+o$M-w57rVJ&ONZG;dVZD_5#2pQf@yN-LnTL+fT6gPK4U3J|9 zw)Uc@_WVMd4%R{%IO~ko>T>88!h$SEf3dD~N$goqk11w-?nhYgJ~Y;YXMeGWSROgc zRGMd4PJuS?Ht-bPqfY+FEYaWDz#5DkN0t7<%&`x>g&FbLt!OQbh_7zOGf(;Q8=L6+ zyBW06hU2|e7rl$rN2>`HEkz)*nGi9KlO_;P)bsnEk||QJa-pRS543r7 zv6c3TQBqjCs_;690_qvvYW#CeH3B!NQdqC?_vI?J4wLKuzfae!YuEGoG2-v&z8e9n z_nqy64=U=qtFE!#F?n1Eab)r9Dgn&h?csG3xYXZC5c6^^Kh$fo#5(sGMs1DBwLkY8 zXi9Opu*(p`B5$J|$lUkHD+*w(K2dct;QE3rmf9H#TmqQG%k@}m(M!BK55c_A2C^*t z*ok(P=yi7DBBa?eC0%V=GumMtAuVFu^?{bzv&um8SC@6*{Uo`VIbLxJZ$u&xR%kwZ~@es zN5F92tbJBmN>MRGK?W2`OWSGb1oT4r`>EX8VZ~6b2r3oFZ?HlHm4bbFW7k@4{Cb4j zdIE-I(3w3~LBwoPk6+4J$=Eg~lv@b_#Tio|;MjFmIBbRGk6dS^2(tV!&~0+H6;sib zN17{r8pX<#oTk%TJ{5|k#uK!R-(pk8Gu?6=mJZTeiAkimWR0IpVKJgCku=r#9Oy+K z`hql)*JQN5 z0#@Hzcj(oFj8%7>7_EB}^YiJJNniD1iAJP#0cM@C8iqOpu_2u+zqbxhtZl`2*y961 zb~7fA>(+f|S0l_?t^LkgtoqI(R_<4SGT=Tilys;Uz*6p^AcnS5o8do8}#Z< zuiu^svtD&f2rXg81kj?_qm94VV~x-YiakceaNwDLGrQ(b_Qa`w*%Ju0Cr^BDPu0p! zPvzHvuc=a|`fDf6q@dVKQ0ukwPpSMupp`T0$|h`xn=o)7(1x&l484Z0r21>=SsO8z znOCUz8b`!1elANH#es?z&aJg{T&cNO=?f8OGeaWSE?dZ--QpzZMO(!%{*%k^Cx01Qtj?-v2@$%h>vwbWFu+bkO;T5S!p@c~w2pm}qih(^t^2P;9gdd^t zJg^fw$viaVuxQ@$0M<3a!`U~|oJrain|{4+9vvIs&BEEivl%)=q{dwh_zoX;t_K&@ zj2jKD&E1(ac5D3g?2G46bP|6>aFK#$3+3j*BfPp21+lNfKaUM4;r!9_{@Os^=u&jz zU>CS+t_O~P_@$-+ynaehEF}=R6bwq+xFjJ!H|Uq<(9&7Mz|z{^MZvW|W@*cHs5S<+ z>k$C0r39bOBlLvVF2b7ghdP%&GOZmpI@H6E`T?M;*UbkJUOg3jr$z6@G~Gl0yF2>T z25PwZdi=I^hKNgJN`uK(qBL<>_@tg+i+HyCfF_g1nh~jiwBnl~tAzlQ;1bJ1+PKO~ zjM=ypKil_yk%g}2*}u)K;HL)JRVlKTfuoSVPRtmVKIlE`epfroQkIW@z}aWoNTaAmmJ4iOglQS)09wZjqFV};%A=V{ z3?+7{xWZ10VKhY)yG~<(mkIF=P1P~)+Tjr{k+TyhwM zr5#jK45hZ4WZ4#usv`Tm347ss%D&bYZ71PH#HDb%t)0EkR^?Ov1BTYJJ$bl!iczn6# zB~WF8EhC-YyP2>oZ7c!GNjoewVW&;Qo-tL4E?OHVsJCv2@~{-zC#D~vhkUI~qAEEd z17${1E1rO2?DXR{iazqgNOTP^uEUB^V?$@1u#aY(wD)Ggum$JsZI(CiYClgv@o75l z4O(!)o?39xo|t#Z9-nj39+}NVmb1^Ly;(OLVAjgnmYk%T6$+4g8Mxu_d+{A-hm|N`k zSn2N|)OdF#1lxvy8HN z?x95}cH$T7%QB#Wxt~un-`E*6*f~hXGVt7g?eWH+?TJRZ_d>EKM6w3v537S@$Ny#w2a6M_S59TV zFpTqSST>-+)??kMqASc6mhH(KY{$4|whKGr0c;yb=&0riiwxnxan;;nUSru;3;03j z=xW|_cSo}#(?J<}wCu60LPEjptfF7Tvcgs8%{+LLeUf1_iPp zUnIu(=h0;U=WX41sP~`!%BX+&4BZn9D8vcfD0WSWlDb-2WJ9TQU6%qxR~I~sq^~kJt1gRx`C_&RL-I@npgU*z?hA4d(HB)B0)5Bwj zt<>C5rw}6bk%!mLqE^kRNO+}A^WxU|5A*P>L$OFb+u^3$n{N4{ktoo|BI89Ef6 z8Z*nZ7Q9Zy@;eI%)qYrL^}|aYV5b1sX{y1_&0+hzvRy0;ds-fgjTv_Jbwo>|NUIy*2Ngy+#4;D|1fS^JS;)abM2b z;|ng?z*&tvK5vgKyl9Uuy=;G6#LUa{nYWVAVc*3PV4qu`)xc{Fb5^eXJK@6sT+v&w z!&iT6J+^+s3@6`PU&^q0VPWsJods|SX3;>a8`k)4+v&^1(gB-$yUjm&vGT1z>;}3W zUc2^3VuwEj>T9*&1+)Y(t(yQAwT5E^u4^%ITt{u#4J)2dmH7`%Cf91FoSOmdw3ub5 zee%l~ivPw_)Se8u(kZyeM~W5Ehh+u@@N+4MUzE4Y7868V%CD>Cz-u*8fmOuO*CDwy zkxDs{hbqjpRX}T7%yMKHzZaQl=rE1cA|$~A-J-254dvH-vwDvQ;>0ZN&{`r)+Zr=9 zz)OWWxEycZm0kmDxO=?DUQH+E*oyG2vu}l(1eXhj^Fs@8kTITy<&GOUJS^z65^LOd zr&9@5UMmzh7xbKCA@D2c_$)EYANr(}5uI+mE5KA#c}ijP)&B}mx{<4NCECz6gmDpG z*JUgS#_blfp842OrK7|Ve`}BNIb8i}uJA=$R~V$10FGvz(?ZE6NgC~4@!o{sA|uoc z-pLk}5D2C%!xy5948L_?0~A~QR$OBG4e%j}U+z8hnO|wtFp8 zIBOjh)xvJM?j{@m$g3s|CaQhP{K{flNK9*eE~X3xhA|#<{8<($Fkwtw3yEtHuF1|a zx#iVoh$o(B)-UNYZJz>5XQwg42}o-IZPH|+6Ns`7f?EC9Iaa5I^5hzoD6@T>_}{T9 ztC$ZAWmUl3%$NxGk`>!e8;%2l7b@*g3G-(bZ*jB7cFcuaN6q&#ufx<|9spwpX?wVz zQfF-+0+8a{-tkLp5Bp{K*q%ohZjiQ7nk>5tO@_8vTe8cZT7@cG#-2qKH!tA-_&n@^ zWmpBvc(QEHK`W*0ZXQv_d<^sX7~V^W9x7xreG+}35{MA;W3~W$M>aY3OrnSBOs1Pg zbB=5Z$O>j0uzX&h%h-~Yw}(j!4_YoYJ9*^Pic=^ei>jW+U=upy4xgcWfcv!PG~O^z%%FPOzLG4rrZpjcVzENMDG zBT^Wnf@drrqg1S1eAGtJgkw0(IEL{<{@v0VduKs|y$Q%(Ch_vh^7A$rz&%CnQRp$` zSf@wPV2{jfw1H@{N0xkI4=(=1?gMdsmtrzp@}+fK{Fy~#IP8wcqxVKowt-k8IO~oM zi{AV-&i8*>cTm<7Z1qBO_1?+kU0|yh(=GP^X+l}_4q**l#{Tx~Z;R#dj*6eC=)&E> zw3k=O*|GWu0*9o+R)DdkctaxCxHV$=4^1IO0q-ZfcFj+Ay~2rjJ#NMWB9`5T7`uyb zqBwTX=KorUEhM>iAhx!{sT~L_l3+b{u^_@+jDfRIchuNpJ-}HHtcE?51|x{rlc_R$ z)%{|kS$}Buz$vDGKJ!19VUIzy$Itz21EJUx(CkUpPn}^wiao8R;a@hWo(WY*jXljW zh`{0t1QuV|@uj^$TI@CC*c(;Y5Vw3`e@2qMLtybeQeYnvWc--zA*&m0$YQdYE0`vX zz~Z=trzv@$1q)^G6Y^;zMaEW{+pL^DHa&y#j5J*Hr8M4T8iPf2DO;X{>w_%pa#|j4 z;Ah(^=6qe3R!Mzxg>8&kMqm*+h67}~WtE7Iu&(L&nzO_*WM zHGb=hV_}|!8K<=?G`QlD!YP)iu`^OA6UjnB{E(qJB$7pFfc7ETo$4C8CBn20i!fc0 zNF_dKzh}i5B7;5t7CxP`-d!0zolyg{z~+RGlpJ%vzjk{ynINL`{-JBHCXlEm*>$LE zr`GDcq1y|eEDXG6phgN|k~l7QTF-qe#>wOt$pwVjqnq&1sAJD>R)=`3QX7F6Qd^>n zJ}F(A)7q!V7G2H^%Qs=!lV&ZhCk>^m2*(&R^qDky5_#ju@H=~FLT~vlzJ(QOGwWQi z=^VOC53siGcSn22^{=l)?s zZNoBb$ipx2JNE`_h27-$pnG8FzIG1O3Vec|d>Z2HO21OPU@zQEX%&8NFL6jYt@YHb||mXcA^z`(7{94+d|4rN^axyZMF&6 zZ7L=l$zye*S_br%Qav`m0QE+fshI_M=23E`Gxu2$sxFVvWFeJbg@hRk$*h-P94jWw zSVZ-5A?dd)ekf<6*0Slxn^{cQ64>Riolp0UJbKON1HRl`LXpW;mPPn7m&)dRS}>GM zq0(%8l@*OxZN&hu6rX(w{`y&T?U+e>q3NU6TK;eVDEP5m0Qj=;;ZKRJw#nl*+Z1*7 zpnH^NQJIJVB%TI{2~1}hi>iyGJ4c)hA#{HoM@Vy2KEC_;XKWZztdID?|1QO}ZzBp` zBTw_B7|BChBtoz2VDEvabv1r{LMb~}%ch<8zoD&0k?_hy(VqkYCNnW-72Wz?J2a8+-_axtzBj22OT1(17zm-2)6iQ)v$-95A^GQ0u6Tx6Nq#i^m~jH+T*0t9zXjt`VI0Ch#vJnE&adnh>d0P)es7@d{fzXd%@mYb`}%< z1sl47xms49vysc_P&JQo3DRie2tLNop%$9JK`O1EL;R^_;8DuUg!ieE>~aNdtv6!~*+o(0UNX+2pZDu^dcX-M zp{ov8czPHm0E!wX?FkS810r=15h#?-XRvf*+*kTvPds$xgt?+phbqZFzr60QaDBOfd51QF^&P zM!l`xUxf0j_fOH^(?1eD=d@+5J9ztnCjw?gZGU}IGrj$*yh`WN#e~;kEqF0zrfav* zxsUSc-rJ<+y4-S?UDx`Wrn5}Nl|{I}h;k|ri^p@>w7xKAhMi~mWD4CSAz&eQgZQ?QVWQS3T z2La$gwVz5Sp$!PPW8~ikAa~^u%G-m>KW!Jex~+1CfXf{OC-;O1ccSceQy{$`#O+O3 zM(`2@l9xNkR4w~Zdk0X3I&M3G%+092s_Y7@Dg}F}!%d)ceJ-|t3U5~Bfx*I^wiL}b zAM};sG?`gU1FN|QEr*`I*#t84z}j>WmQU(^I%7!*MzZNNtI9?X<`Bfpo<U3sWfBn0rs-8SY5uHOGHw&9t%T`TiU?p9jpy9) ztO;L1o0cKfY)S!$TZE=Ok=94xJD*}za$zeCJ?ZUqoGv{9>`es z$AiKIbmsV6$^e)ldeqDs8$!M92iOnZrFX=iNaDP{@`622eC!#<)n`^;w1G>{fx7ed z00GVcpzr=gm+XN#mu$d1@Hg**^;>wE?As^S4J1ZWVivsy#kc-z>s|h>^(F(?tAg!H zGIC_%dVs&^%5UAt-@S^ATs3AAW#u4VZ^+k^`sAMY>$}O6$i5EHu`QIm6Vu79)L7pL z0b4TmISyZ>js0AFta*qiN8FLd7%y+B}3v|n$0B)xG(_M+mf7ZR{HS-8G9 zA^QTr0VjWP04f9bC;$}vo;?3wpvU^$f9z=hI0yg^LIys2<|i9OChpmjKiPBjKiczx z;IVJ*c`|a(ANs}yv%ExS;g_}{0eAkzUPtP^xq(i?0^o)VxFXNd-U>(L8am%2{e~|( zX=9Or0$`js1fkJ1orF_o9mJwzrNt4f#ICGmZw~P3;a^0y|Vhxk!!H z5`vCEuVvCWEnsP!^f6mQ_;2(`#|nYsoDv7adL;e{JmGDRphmpa_t8LNwUYl`ZpSbK zb=g6%l8wN+qAT|k>p7pGOdGl{UEbRFCj~5Q^+3C>0oyp~zePe9!4iRb3zt==a|EBaYUo9N^S$J1{nqj@BYZMW+_A781 zt@8!>Ly<5WQ>N>|$mB;~^J@<2<(^Ru@~Hj|HmOxnFC-9VNYQz(-}m?-;ORwofwUah zsgFZV@Kd{vi_(f>UxaUofFaSZh4zK%C*o0#M$Llwr;U*6p(7iI71}wLkRaDe>=W|N z4KH#ADw=uOYorsIIQsJv`6jW7jGk$i<(m}sTK*b)7p5&YQ7?2B>P2Xlvd}rEDT|QO z3yF7EHH@Jb2+%vp`uMwfCgy1hX|0dHOPKx?#nx#jnAc3`lkTe>H~Ghzsh!CLfJyo{H>r-0NhFVau2m@ zyQBdD-(JBE?I#HCqrQ3%x^TZBNFAMnl3ZX_X1P^T=T=U3uVUs7TNS(9RuckRjV)z$ zF_ub-1(pEG1%yQBtIP1*{Z_~j?qb?iGIE~X=Y`#Kz~*9fUTvBWO4=WCq%APQAUu@)knkRf3=|E@`wuiyG}o z3aTDk1OUq#>;d%O06Mz&C;ZuW&Ux!g`13v*g7jW;*?N+}>xTWL`|7WNAG&YNSJr#O zSJnp`W&f(LtzY%m)@SoS?3Oz(gtYWJt_=$CG%?>JKCW!4@R*uBIsa1_1cm4FLdU zrMz7=ZW#aXA?DeMr5hH?p2Rx)fVqCV{%8Gm|3B-?(woP9;a_j;lzmuw?WdNF8n?bI z{mA9@JW(NCfn(eT?=S zf(HC}@d+DB0l+Xc-xz+s#4J=%0A>`v$|R=!nL-npOcKcjObwJzF0TY9@NE7p=P^~@ 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%0AyJeBP(m8SyikYlk>0c!eQFjvm*i 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 literal 0 HcmV?d00001 diff --git a/code/ryzom/client/data/gamedev/adds/textures/gn_pvp_dress.tga b/code/ryzom/client/data/gamedev/adds/textures/gn_pvp_dress.tga new file mode 100644 index 0000000000000000000000000000000000000000..026711a84c1d296b59adf1840c12b3e568acbfdd GIT binary patch literal 1048620 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

5{Ke)~iARt_y_+_xF>+;CJ^lyfX6o-(&M6no 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%0AG>@O zwg%;LE*QPpykCF}&Z5?xnE6%M`pdBCtIuoGSJsOAV>|w{zxkd2^%}4B9^T7)dT*cM zvwWt{wh!w3iTuAa_R+rDXZs$)cff-WnH*p*}+hD$LrKZ{BamGyEdG6 zMOHZTA~1!o$qhsBV+=$0H>XwJiTndE$y4%{JZ8M#@isVP`{Yf}1@fvqEAPs~yI%cG zSXiI>{#Xr6%<37UcTAH-8iMe+Pe~_IdP{-Rxg}x6@qY zcKNR#AlCfB=C6!U|5qo{A8MZ9)+qORRrXU0r5WGxMqji7hog)e`5grY_8LObf2A^32KNnjB#bewXZ}*q-yXf`^(8iZvvNQ*9)90$f2@U z{RZ;X{LWgn8z1{Oe91p0Zh#tehpqWXT-r8s1D}fV>0-(hqSGqlSD~L)YJVnfK8YQ$ z-VJ&6=&UP zb*m2(tG_MU0-Ph~$~klHoI~f*IdyJ(T)&k1JSEf$Xd?E%HFTR$6b588gkkvW2Z9CI ze`XzZdsl_|`0~Y|>^Gwt9H2t*fWZElkQdIoAv+An-5ADH-`Otz*Fmc{;+ia=Pb07& zT%Eryu36Xa*7mi0_JuRU1>^z_oYjOc;I_EtC*d#YdUbB-eDR!c)~MNG$i(6>0>A%c zFofh8c}E_Sm*gLLOCFQglAOOJ7f@c5C*@6fR9=;5)%`sOG?F_z^xOemyL9;YLgjyY zKmB0#(=?sabpEidfwRJwum30fgPl+QWX8(6o#B=rBtC$>#1HL6kJv#|?ii8K4ShQdKnAc-$ zU~Akv6TM&A-}DGrrsV0HufK(SskpZyT07LL+xY_L8*->(eR^`_>cFY-y*7aj)JYWA zPB~@`n#CRZ63!aNMk?o$+&|*)h(%jW?wxXP{zkD0AC9r{ z+QIYC&2!r2wC^Kso^gro&#OeASN3cFum<4qpZ(46?3>qUlkgt#zWNxrx9@$H@%TR5 zKG+xgWZ!1h-xK?4pJQC7V_+=Qo4>(-eA4E{-+;ae(?x zucUs@+Rzi+zw$d@3{&wZ^q90F>i@l_mWHn5v+>i<4HvH56)vf~HT0ZUMh$>c>?2PR z=lEl=|85~)uQ5K~HLK0ab=q~*%+O`zoG^SoHiqd9*fySzYrg9>dEx9a^U?ihg+ZKZ9awZ-!QIf3j!QD;H+if1N(;m}N2b*t{aMVr*RO6} z`}eSKkh80hjmksu@RWzvx)Imj__n-lo-^)?_VsD_*Uh~X!+zy~*P;!=+Pv{vZ0XAC zWA$|3=j}jV<9FBAp#CpzzWL-i+n)H7&;Azu0{qu&y!QC}`HbkZpuav_JBWR;Pxj3| zY6q~-_C3bvF&4)Z$0qF^t7ja>Zogv8AvBRTViQO!X(sKYp|p%Ng|^aITF*)0A20_O zE^G~#7wnC5;~Y6x&Y5%P96FcI>FAuD#P+WZ{jmLu`#&UeOE@3>e@Nyg&I927&aMmR zkIxTX$7RJeGh#6~Koj!O{g+bvhur_GGpPTY6-KQ&5Jp$t7J5u83Ik`<;bZt2w0M>r z#EoHM$>F$GU9+xT^B=ljwKVj(0j%K}8^YzeJ7Ye|uqn&KImG*&dnq-3(El&OzA$3u zIxv+Vi@YMw$UFPsA$dujigF(wlh@=qdCxk2kr&}fc~c&hSC##@{_qcB%LA{5L0{=Q z^t|x#g=xS42e*%=WmcNjAJ#Q+dN_5_Cql>NXP@*>6IQL=p2&aWh>ZoruDF%>dTWX{ zJ!Oqxba?dm*7iNgeQ7&BNb`@}xAy3#H}(%XAN79rHSGY~u~Y7Tow#Ih%(kQN7z-#) z-zxTcbM^h~Ibj$6{T6c8KEBX+Ia==a#2)T5 zbJ4$-aSzWFW#H}U&yUyy#4d`Dley)=Klxn1Z~n*sdX3k55AWqY)$@IZ&+?f*+dfza z$UfOO`)FV7vwe3Aj^)^~C1XY2Gj?epEu={$w2?;AN}BmhX(%nFskD{Gp1D#qU%2_P zFgkk&vVBLK8|TQma?YGP=g_$<2glHuzg`o{L*E-$lJif!o|!fH<4dvqw}v4LTfqIP zLdVYwLl@MC1=Q{Bg+0DIc>g^n;{Ttp6y1ML=rgx0*81(gsFriVvT)&|`iR{#cIAOE zeC~$CKE+yf&AN6cRUQewu3tsm-->X-q)KRWFW8pU{{`c>E3*ImE663dJ}+D{y#(x_ zgONv~-yfclcM=}@ZR9C=%O1E4cnx9l={lSx5(8aUfrlB&askPGSB5m9JBnXh2Tq`M zhQtppAy!@+cSaMsDEPNF@$lwjlg`-0XYAm{%+GH;O78qa=*Q1T-PW9X^X#;*tNZF> zR}a<}u3jy^jWKM>$O5qIGST7Z6MJX=UCg`Zp1$|HMXj7S^u=#Q4yRh1^$U^7os2MJ-nCq%;Mgu=lD#YZ6E$z|LnVC za4e3=u{lP^>X;q7G>{h3MB1qTODkz6?c$iBr8Jec(l|wLY402i#g{(;pSpA79649c znRDkHI+xCA_v_H(@&6B)0k%%oZtDLalP8x%-2Z_Y>#6Ox3OT<#jLK=jr?5Hn;P-Ch z@2Ue`k!D9ERjIhb!vu4}+F$z&23Gn)?Mce4hxz7Hq^9ax|_{*Q$2=CNM6B z&fSQdUqbBvvSR8BTSFyvsN|6p#)Z5i56MgN zl)M#r3|^Dx2N zpywwxfK(hn^Z_83v^87n#+o&iVAiK<@zx(jCf!X8J@M@2w^Ngd{6XcvHh?9qPod`~ zwfJV%-G}e{KIA@fx(-a9l$>t7Kg{K`dGo8$r`IA=EAIY2eMxHVrRoMHwSzbl@SiCE zk(2qvxh+Dr826tc&L47rZai0@U-Nz;wqkYSl>E=$_Dyu|r@^7&d-}G5TzTu{D96?5 z3wC2KpeAlU*oFDTsUQE@-~7)1#%s9Ndw4JJ>Aii1XMiaGdA5D9FLTuS>6?ADulCu# zJBE0!QT{VFb10KB5(5DSQId=JR-}ovkw(%=n$3rH@11+3DYTWw(pnpUw4b)_zHs4! zmZ)btH_lPaJz&n9JI?^l<*e#EL$|B)$*(I#-tPkYzbRZmj^6-u{vqJ&_n%cAdQVyz zx?P_W7PUMWdfvD^%Kx6&3c62N5ze}LMmXpC`Qf6~2g0c01EJ3h@PigL#+>`BR_+fM zfgR}Dbd5&e6z`Yf2RiTKjL>D&ym0Qt^Qq;xIE-JhBYb`MjUBsQHb3;ZIxh?vUl>Nu zCTK1@!+j!2`JVl&(WpZoMPyMW@*B{(^mR zD>8TswZ^uh&+nnm*q+zSGa@&Drhe~!rHsD$NAHHiw1aPPEjdd2-UN#ry+7vWgJZf2 zAHWW518wNeJfsNuJR__&>q5aa&}=ZhbQ4a5OffeE~ZT(@WoQ1-Vs^UBJQAL@+ik2Y<` z`nPR~ZGgN%VgU4m&u%yh_RW!Cy_ZRqhml2hpqnE9kXy-fvSo_!Vjf5N~holVb7Hx1s-6-1Q1N_Z!Il zA7V>*hrSta2*xk|h01%x!9iwFtH!f{tpYo7!vn;RKgoH7W-LG{`Dhiyqt$>VyAGUy z(p$m9$L=il{kS#z$UoZ^vF~Qo-VtNs#iKD+-duU(<&|OP%lSU3MMo_j@&NUHN6bCt zA#zdOSO32lcG>_|P&Xi-{PryT;4#*o_&R0dJY_8J#hYE&Y^_^l~G2WfVu=+$^552O^OpwF!dwGsBaNh$H1oYQl$O%e`$}VR2Bo>Q zzrOh9Fl5d~u6-fSjdSE&IcLtDb68FN!G2R}(Ct@-^RFY$uJGp2XPTc2!UeO{|JxGX z|C&Xi5BNKMzz66}>p=~mo|DP@n_3vo9lwY?|J~uLx`)E(vO{6u+`2Hc;Rv{YyTYXf z+vA#a4Z22MtFGBD7fugnBlpj_Xm02-VrCdIt15hT=(v-5UXw#zU+fT*)`W{^mPcNY zC*%!zL|%!yKfEIk$xHH-yd{sxYdhdMc~2gc7v)KLbLV%!>LAZ{NSA@D_vOEzeK|ds>ACzM*1)+Pdi4JqaYJXJKXmW-={beSsC+ehuvozyaEd;a%f3%S{1`zx25 z@nzN!!(D`|T66Qup&tL{W@4OM@B@hRV;ytlyEcAxef9r+-%aYAD*Ic(28i_lZ-0>- zE^-MT{2sFZM?B{j;Gq3ijEmYQmI`N$4dMcmd$?9idi>AY0m_Mc(`MWZcFZ<#4O);N zv2MLFfaC|%9sLpK3hLzTdnL-f8%pt|OFUVt35&8NovJap~3>yvtb#>DFz zPs!@z_5Wr2I1eD>#W}2b@Mri${`j-M`JHD4Z3Zd*KXs;ves`Zi^O-)|KBW3%-|VA( zwa@n5F(mf>_OU@@#~R1X*rkEAi1>xj=6HJfy|k33(pDO)|4VaeKMwgnY<^3aM=XGI z;~cdxSIL}Vix-oUx$JS{nsEO0E71RI!iD(DqLS zx>n~k-i6LT75#s5IBUq{Fo3v&&KJ)JXVLoKP!xtup|&6Pg&oxDlNSzP=a)B*jDS1mClh@=qd2iFRI^%FT=Y-I}SbTgV-<9&q&Lq z^cwj4S_5aGJD4|g9@yFq)wy!|4H)dXZ4-k!~tyk)*rZrT0z7xHDbd3GG=WT4qzX;ns)1YUGM=0(_@eKQ zb!W_ZGxuFQd}H6m<8$FzpA zIY!6om{a4I7SbezFC?uz2SnOILun~ZrL8oU*4Fxw_SdaK{?FSK=ft^jj-0DFXUv^* zIC=Fxu=ldC|5Nv8*7~UXpMPCm=rgrA3}4b52F|Muy@>tmHg-|yJEf9%zjd4isMSO6 z-}%J&cNq^ZU)IJjs%USxr0gKRfzmL1PJI|%(1z~6HLgY1q-)bP>RRn__0n+8$T?B| zcNsAw^to~gwt%VOg6j&x5HWsNU!LYkHoZ#`;ai{rx|GUot6u#`xgo^UMxsjxh${TzmliJA8g> z){0G`K|H)i-U;g-Ag=sgWM{;UAzuCgWabm(<`J)C{oTF9`0c~afAD*WJyYFAzovWL zLHw2aJ9khoxb1oBn5xI1*KESpX)W_=u=F##? zTWj(jiJz5O)(8;it`Hl#`EfS$<;4g#?#)>Db;PEr1DD}@C?!8Z8L9rS%v{0$ti6|u zpFNWtxTt3<`)StVO=1Cwi^B)5POe;5PA}R*+#P=V5@X@;udg_$TqjSkUA9|uXAM4< z<3Fd)2>#b=yw-boFYlS00orX1J`?|keXuX~DK^d}_SHVycgK*#{GtCdHpl2#9kXMX z2GT;BNShR$q?xpnhSE|ROWRca13ydqE0-P!m*niio*-_-_u?EmSI(Jp=N$G%@9#O* z*#DK(@+k$=uQtZ@_nb%`AQ(V{=3Dcp2$`SHnVfi>^u6rfYOY?VX|PWm(bpum4}U?`zLX7lsj2io>Ys z6=B%KHF51npFjTkDF55_e{KKrjJy+h2wsw>gjcuyXb7v;&SBd>-&y@qsF z_J6Tm{`cz8t6zG*{NVP>G_BLL{(D;k-8+17;@S8CdWTQUzw(Q{`&43=Z+r~D>U}@Q zZvG?mL~!x2n^)gQ?iG5;7V5m~pHz3*gYI&G`s40zH~lcN{TttOpgkT?41gW%ZRR$` z8fMReEd&l<12TUNcx@|?MHR?!f7^loQ=D_-{`B>$`&T_cJzs18KKK@T(AyCYVAreU zML&T|=L})q|HdbOik#*FS1b^K;Dk$k&E|7`7a)>IDOiwm$W<{^W=?v7ppcK+#2<0 zW9f5tJQuMC*Kmfg4xf1Y>cr*P9uhnNVgZP|kM@6b=sfUum8o-i&g}K%6`~8~H?Z|9XwrdJpgA zJ-xR%cgeG~KVa*i52^mxH~VN`?ep@e|0DkyOSAzX_Z?%rw_}cDryrbkq=~eNIR?;5 znn^pc2Bf7lmA0u`L(*K@UsrT<7@n~?&WUs59EmCEoH=*XiIwb)?O*xdb8I2lKkLBv zEdqBpJM^7~4?eRg#{TyL^H2HTdvXarfFkn#^FyzhYryzfO}(FzFgSZ-xVY}_FgT04 zff@B+`89+qmv4`2(6#8AbZxpu`%kST=6`NDXT+?;2Y~(moZ-{M;PK1C#WT?Tr&fo# zHFrh)i@oUh@`5~}UrZj6SL7LaM;?-wTuYnJC4Gifxs7q($e-Gq;H}V4KEG);S{wws5pAj<$p3Pz7 z=)R9W_cnRsKV?56C+QimdC|Xiya)~ub@&dx^@q5}Y4vY#k zFa#1UG|5O}n!VB_*yx}=OUXf?yo#^j}m*gpVOCFQg{W6L*oSv%)G_Bds}du43x@ArTKxbqe9O|2uO zUJteaaewOnSzyxGwC6X2eYz7{sAmTE+>OuZ3;j`)`;FucYyfXX%wP3?&j1JB{Lg6f zZ+rfi!~u$Zua5tnnE$7}Uwyw4y!dMJ0nJBS4*p#+xcF80_shYeE#%y>nE3V_Fm9Gp z_pj`>*J9lkYuZ;6SFna_v{}z4-+el^X?@@MVCCfPM3=>f9kF?^gGZefd8SM=k6t_d z{7sLByj{=ZXHVkuqx?s&GyiaPyZvAJ8+`!Oy%$Sw_IhmKHMhqYIA!kw?qNK>@;Gw~ zSUk;O!*lY`r|nA-{`a+aBL9*3YskU#p5?dFcitcW+28!m|9Xwr#_@13@9DjL zhR^buKHEOn7vu8mn|-veOX;(H_nyjs$K=>58DsQwkYC`~rGd1NCelV4*`(PLXeSM& zr8KoK(pXwcb8`^I{k?A0O`+y!QftsTa;}^+=Wgii25@%rV(s1D6HBr0gYiG38Xx{@ za`=e-Tih1<&RR=tzbx$jYta8osqmLvZo{yuSj%VKPu zxU?@voxki>WFxrvYp5w-4HmHSKMSAs%(c|CN7m$Tf0Faa%h4WCNv)#NTdDPnKYjkj z2NK^udFiw3#jGJm&)huZl=yez^JH;Gh?qIZv<2<>wdT`jgQaVXy}s~bWMp-_{MS#e z?Yjuvydv-r&5g@J4rXj5<_;TsQgeuyfOa{Y$baQ>(o%MSf?d=jLf=p6|H}52?J{{8 z`tcKzRLy~nY7f9e_Uzgqjpaf!(fP9J@=ulCu#I|j$%n3VsH(Xl#a$1V+0 zbrhtHazEl3Kr?A44W*?tmA2A&I7G0Awz$WTDxgvDEd`UQW%);<51IL|o-sm}D z0GPsKzz(>S>&KF>U~Qks3&)&=&101x{65y$f@kC%c}QN8r{pbpOkR`ckI#Q2|26(^J+JG? z%UgYrdT&klhMdh0;5UAi{gC(quvNtOZ51|kcsU&vo+C`Q#d;6y7R!U z%KlJf-*R zr#CO50KHnAg4%n37&bmcjijSL4W);v`-d;zd+J|5{6Tmg0V{jX(3HgxJA*X0nMbHG?bRo zG{HZH#&vf`noq909bbGi@sIb%IdN{BBj?3A8#ZHIyZp!Ae;u*^GiqaOU!TdG1E!QC z|2Kl;R~hUBCp6Z@{T+tFUeEd*W@vIEyZ{G{;!!)5dP_elXJg}-2W_RfYY)4|2^+R z>9M8dY*tNk( zE8PA#cK5fadGhnP|C(!U>{T0je;c&`jr|uFU<+8m&BO+1_uuu(uc9qrEAKZD=UkJLR6(cVg8>j9z6GGRjnr#Adh+47U_ajW zG&vEE{F1o)H>3R5uCM-o{AcCA-}zs!@mlZUy}ajget$m>An^m(2m6x5K60j^kM=e3 z{l6T?;PsBlu{lP^>X;q7G>{gl`~_(wt)!W>lZMiAE;LQiH{uNP{j}P9!%%YnCY0Y6 z=ft^jj+`s!toMx-=>1Env6B~ijmP(o?%(Z-MPT)U_cLJ){(o`-k^em>QJ;tS|85gj zQs1v2TvD+w^qy4;=0A9VlZ(**w}yfFTfhP;4&$m0#(KwH zAABt}123Ku&cA3BL`qJc7O(Spcn_Rk-B%Ajz;@#!=uyy#@^q8{?$w@-$v@MZX`F)&zs5T zTNknY$OpjY-$EULmTwaO2d02^;hP>IhML^|;#=`U69Zp?yf;Uz3HfiU1e0djj;G?Y z7S!Gr=GPsGzGQXFn)`?^!-r6ME3tX_4f4!QYc&oI`!w=DHgeRXoZ@x9HEWu{=utkB zFFy+%S3Or*XDq#SbygsYm!pptW1BZFZ|&Xa-1JL-d9?p?1~3mG<^iHtFTy476=SN50Rg3SRv|M<`T=6C+r zGl1865AWqYz4!a_AKyl_`x}p^KmP96w_N&YU+uI1cMOijF*!EJ=vW=IW0wZfA|?N& zk+hO#(oPzRE$Cg5Y6V_8J9Hg60leR=aCO!ubpH(@7ki5s7p`&F zx@$h=50e+yB0llE_w2^>(r4G8@GA%+UvE!YbQ^=RuPl0 zjvQ+OD*ut6;^!($t%sYplRUsJ>i>5Wb8ig%Bk?}Qh-9^lV@=D%KZ>^;0^tV#G@JU|j_Xdmp0eX?)%(Z1Se`|cQ&|Bflv;$@7- zj@hwG3u&VLUm8g(X%_7#1gfaO$!1$>MeP*r=y{46io}2@E^S--4PjWX0~#XI^FKPd=b)%(dp4bM3hX^T010Kwd%j>sEyGsq542;>n@g zsLA27`8DCH#T&xJRlDPwc5S=HUF)uS*S@tcA}_!b@Nz3z0UnjJ*N$Pbp4<${KuN7`UJFxZsmOo z_-)%>5l8J0==0R_dH5&fsu2T^EY2k#u$)|gx`)6%AwHlKxuhPceY%)@vKr$2{lA#6 zZRAZ^3*P!~CAWbwbMV_y@2|$!?-{_R{8vtTF4*{lxB>qTj_i+-A>R%~`_Rw9A1Ft+ ztYN=bwydQ_t3HWRWQ=j#*0;?fPHpj4^6%R4g}2+ReO*KzobpPHoVoSruT9|fqwA(} z=*%6+CH_sHy7BTA*u>XyCQ(<`|F7<>9MunC4qgEmc}uW2ETGP8Mw2ym9^^CFxY0NN zT$KOf?Umn&+{dR;f$XmUr=W^+kC^xoSD5?y9NV9K<~P6dzwsKb^&Z~KdwOrr7`fY@ zOX3-MwtcWK_Q}54NBe4@qYa?l|L>R_o6mKujyV~-XPP8;F~JuQ*C?rTDD9--AJG&V zOKWL9sq&66g#16}!Z~qnoFnII(1g|K{)=dfBVLcb|2~r|!_4}lp$GYWy=PQ~3()_2 zAoo2BX#elOpe|foPHli$<;ed<{D!|D`9BoQA7cSC$gy*cxz=2BuDufKR9>}mA9z7) zLf5Mb!ucbng`T5lg^OobhKWV{(fu3aT6Rslwxi8o`R_Vs?aKr5f;=H_$RqNKJR|SO zL-JDODR@gBtAAKuz|X>*qNebr)6Tg33G)YQ#*cq;XlIulOAJQ&ZgJEUvCY3 zDtvaPXMm4&I3?>e`~lquk2$@JxT^+i#_A{5j$QY_+w5J`+W{A4Kl#ko?Q6sK*+k9q z#>b6mHm(VLcD^$gYCnF^a{vRYk4eYViKFEmzUX*zZej1FMHuWsdKckvEWw+{;8RDXU`Jf=yua zBjD1b^JBZ7N9=myuYW&AKRE|bD**Yeo?K6Cg1(4Sbmdjp+m)f}(9u?oy?iM(Zp77F z0v1kYGv^CpBA2upMio;m{k8pr!`BPEUS+>| zfYqEqx`FXOU@kfToCAyj=*wB4&-BtTtZ-|%XwAWJ_UL)U0px|A==+10Z4dnx)qw|; z6W5k&%(dp4bM3hXdygY_;Mx_`_r=ygZNEV`EDKjG-4ia&Yzmq9t&+7&Z6I=7UE{8G z*Su?A9*`I033)>vkyqpyc}E_Sm*gpVOCD(4XU)REJ|XHNX=%u_pjV*c43&m1$Q z)Ac8(_r<^7zL=(cn)d%FYe4xQLMZAKI;{9CvB#5$1zgYm@#2Y44>=zpT~U<0`6#gNT@ znzQ--uzc5(Vd*Y&#mNz~K0O$5)}t-LcCVhf4!^Z^Y{a@PBkp|V&EJXgzi>afd+4|7 z__gOtvc4i!%i&@-YoLr#Hxukfurt^+-}d&^HrO@axkCV_A+$I4UDm#=e{rh zv7tvyK5!5@2Z+Nbu1=0Q1<1nr8>}-xo#8g*(Kh698}5A~Lm)rrC05;<&$J=GO zI;8at)M0JMfA%-OOPv|wxq*9lFYoESeTL8SnLgV-*cba`-|VA(U4ae2zOSUEbYJ9cSsEKRIssGUTbNjqsME$2Z~X)BGTwY3GuYX4ulPv5;J%t%Kg66iTj^k1^!=4)cpq%pEs)XP#Buu7S6pY zGn_jvH}oQQuYcZ_(0fh=&*O~7+H#G#)?9P0y(!cKIC~^G|06Td{ilXLmoEqxFWe9= z$ImbdoIuyGYuh#L+IEfm*){Llmj~p9dU!(KkVoVdc}CumhvX%BO5RHHZ2lw6%Bu+% zeYVSpjvY=|+JTtAQ#*cQ{)A3ff8rly|4ENCEo;+j;IFp^IwJQy1DwDaz;i(7bNlwJ zBJOI_Q~w!b>5bjr@C0%C)IxKw+x3R}znFc>aFLqA9JXi@sYNH z1*n~L&zt{EKHneki~g240CXPoy8Jfu>e@TP0^-dUBX=^R+{16n@hl%T}`}O!M-;_&hFQO^1lrE-$*QA19pNEWd92C)K?uM9-jE|3NQzh>1)AL zT`NWq->usBR9Lx}MlRxtL*nYb66L@BDd9YjPu<#-?mw3}K;_o7b+>_scT2>qpSJ-! zcEssPu=A96S>(BEOV<}3Ea4bQXhV&f(He-is2vHXy$%2sXX`8$#I*cYN-0XeD6 zOz?m31t6cr(k}*UPg(vy+5wRL;taoM7ij;5b#(h+U+j~8 zvyV3WYz{z5{yQee<`~Nut7CTT(m-0ge+JMV@Hq1R!ALu4C@rO_v`yInr1^-2Tf$XK z_r|$!PMn(pur&;MVHYuL5yns#lw#uM59o4EGn0eL~5kT>KJdBy+8JMvKEC1O+M zt<6vW8Vto(!^~holHCF9u}h}rM!i}aW#Xs&Y1s5M`DbF7BgePDsx1E< zd)lwiX^3HF-&^;vHT-_Xen;&T?49aJt=K@VrM?$EX&3s_)>qy|{{MTF=UH1G36n|> z(rzLa{C?`ipm*YfUqT{6hD?&f8>>Tz-w+o?(YWEZZ|b;_9eCPs_``||JD7Cd0&EE zdNF;=Kv$hk{g)}#w}i=6H$}On%+zLlEM8Aa{_9iM?rz>eHNFOG3tAUI%pCP+Yv?Yc zDNB{9OQX!Rp3oC9FK*^q@)O0)+X`kLx^znaFJ;Ur`+dsxznXilA>xq0?Q-QT{YX`J*Oby0^7C*_3>9hVO}>DrI}wdK%1((~u7I}&D8-4ZgW=aAWW zf5e;;ck0IC17RllDL1Y<@Lro)eOIt$kpE+wzV@!L0Ne~;$E`Wc>%B3jWn6jkeoo!} zto^%U%cSnc6mno~6Dw|uZ4S6-6DtnC*Txkc4z_0LP@^v3J5+;+X0m zC*Pd7C-+5Px4d9pwV3MGQ$zm0_-<%?^qnZX=Ads*C^-}+m){Z=fjL*SUwrx3-`kg$ zvo}{FW15K>XazUTd_VKfRvpH6fd9Xcntfu?tOJK-J#him?(1A5?qBIGFM~1ka>N}} zzOUo=I{H_Mt-qLh!YlS!(-ur!?7%TDfV06$asYC+JrQ!+@PE@5ZMH@(HG$DtCs*AZ zYr(0@8YiF1*H3hHYXN>U>cCO{6N6aAd82}UiH*0CXDIv4rPJ?kOuh0|9lL=1dTR@t z2S20wPUJpkAY#(;cJg2JYJK(U{WkS?WADWgDCC@yhpf(PG|uhFh0PHIsQ;{*Fp#{w{&UxcA$cufByoRzsm;^*TCSbE0^Ogu0BZj90TbxD z6?@{Ea&5hL&ScH?BiH|&i>8NjhK)O^_Z1moC^&*w73>d}Ev7~$>)y5N8g?zmHGRw) zcg?%@2bFBl3zoBkx2%6ue}-pSl0bcRdk$^c-{g$3OC=@uznBrwN@pelp{v z6FxD&W5<(oJ9Yfj+*3M!abkK;{NLXbr<0SClEpW!IfR_u8^$5yQ*BBGn3UB?n}cj0 z2WG@f&ID7C<*DZHGi%KQdN96Duelc-OJu&+@;ayXLDusf@89#7Ycn@K8L#udHqQ%F z(DiNB+wyf{73Tt4dj9|S=RZx;grxmgyi(C>vz5@L}%6EML)LSbjzP#ixX9Qv# zmm_1WNxK?7uoPdz3S}|!D0k~)A)j+VRtxcK+5l>jdN|gCwNAad>>TVBDf_vv>b?2c zzx9`|LEffp^~J>CsW&S>3)|(tb?~BX9hoT}U#>X^@clw!9g&FeX&o< z^XQ}Stb+WHeW(A9#W87*@LrD9F*|l?a4b!vk+hO#(k@l+NSaDpX)LY90~k1CeY9mb z7tV=u)Afq{aMmS@!Z~2@_840j<$tehmxc+e_r$sFbv-ozC*${D*ar50Bbb2YVN}f# z>HyV+-m{7Orw+jRQ&)xymehxSnKbPAVnVs5Tw7uiyVkDA+7!+kGygr^e>gZom*?&b zm*?yV^T}Uu&AN77!>(m*|N8q~kF8{AY&fB8g=5^wl1MwV?lK-9o^lka7{P*6T0er6NV;(Tb{$u|1ADcnsv*|?!^v&|BvIoXgriP05&}>W-t5U3!E9A z`EA(z*ssBk{XxhE7j_~-Hsf?J{aZLt?)WFY+~CMw;20p zogU-%U!Xl7mg5IlgP*;`IDLHO%MWVne;&E|Y_zQxB2SgC2?pN_ArBdpvrQWUXCUnM zV(E#ezZ%Ja)k@&AARGxC~i{@ne1md}iK5BgwV%;UFj z_R+rT53ui!!Lc}|I5x)USRJ!tmj=>8nn)XIGH=CJb^g|bev``LoR%DZjoQ5Hzzo_F1~1--{@)NruG$kW zEZT#fUlMv}REExDGeh5n>q4)2<=_KQBaj>b*OKw}t}WM?Ywi5Y7l+QnCxmVzCxyY| z^26wbo5EFv2g3N3d&9;@Si7v*xOQ2?u4UJBjP*nIyVhOvuKg4r$P@C0JR+~iGxCl+ zBrnx+UdX9G9KQOM-hECz<;&N9@zgFOPCfabZ#WU1U%UUw9X~g%6ET3NBL6>q;x{fG z_ld=6Iq-jQ2Dl9jr{&lLjcqZ8Cy~#{T0aNB%4O zJqM&>S~9@1^uGRXQ~$R`oxlAx%5?7MeNys211wBszq-Hgy~cAwsww|%`Cy{>s_ake z|7qF(myrG5vqO8#e{u%sutM9va$g%j$BrM#?s&pSvQIkkv>E4hzx=e4+g^?szS=f7 zKEr-U44->j+l$mSW3Suvw7G!)&c62ZP;%r)VHI)smG>csAEzcS`(phA;GELxALI-{ zYkHJ8X)w>MC$~_aS@rGVhSmG=1Kb?tzqaS{JFL%}$o(3y0qP(85%JRCw1EvMUR&)^ z;`Nd1)yVzQ!>?lRe-%H#TcLq?e|-VI8lR@^-R!KHpl2#9dq6eYb9FW*SN?>B5kCR^pj@V{iUI_^gC%Qjit3Vp#Ib9 zp+B@|E}WD8)7K;Omxi;^{m%pQrz@@B)Vgrd;_bwa5La=_o1ypk;xJ%#eHgf?J`Bdc zKL&egj|s~{&nZRW-0`_l_wS!Y%wGmM0~7P(8geapmUL~o#)i$P2wg6j9nKy$zS9Ml z%?00oUATBoZMZ7CE#fD-R$a4k?Yf3(u4&h{YuvT&ns@EX1M-4AA#cbd@`^ko?}&pP z-#_)MFl_XcaN5T^U;Noqzj5g&Px+T?PdV}PQ#*7xu^h?s>QQFd7}RxEB{mWe_x|a zN4_ijZOVOH$`7FIPn`q&ulMvdUWaa<(*0BNKPC55=YW*lkA2}BkkbE^|JnhR{c|`g ze3<7a-S@xE^UKG<6hB_~k1*8}{QoDO_^G)aumPO*sdGlot=JnjKZlL~S@yPe z-CsPPwwHd79`u{U|4&YnHqP?9!I-}V+dH^(HDH>pyYHvuhgSls*=`>y$W?$hS}fzfj}@#gn^H(~&9c;YAV9I){TVhxF> zQs>wHUyRSclDxl0^s%M~$z6;#05N#6dE)~pyX{r%1k?!R46te+egoQSYyd^Xk>zbi zX5o*{XauKr!+pfSKOAM#yvBRNl&ZtTnR5oHL~d2xoHRa9uf7%A#ofp(Y<627Lg%2~ zy?O`sL0djDR2iw=U749jta&c6=Gxcus8tkW?DVnIV%+>z;^eg1BcuJlv1#hszSkF? zLm#uWOL%_RCnk@W0@UL!lnp@Mk%v4NEUG;azVNxu7k~UCU%vjM z*!@rJ^vR49PWV`+Jb6O+=n~K1(H93Umo|Zu@x}e4p8>AS-x$WN+Qr)89BD(R&oE}_ z;OnvOR1SWmB5Z-S_?~mEHM&xM{#3l(Ol(cQPs!@2t0TLW@hM&3-^9VP&0Nc~(8W_{ ziRo(-x$k{vBByQgz;y08k@JSl_wPM774xUhzm79Wm3Dr0|0M3u*Bgt8L7)#d@8z{u z=5LLCOv})}O&R)Oo|ofgfAZNqC$R%`?08C+{{IfdA=$osMxWm0x3eFj$B5zQ9@d6$ z(|msO`8J`~nA2=*^ICKwv3V=O<*7!#m$OGIoAQZg(?;z3D)!5!NB=$4SnrgW|A{3x zg|W+a#yFgL*ymOvv&z8iD?eg<|Et)q#RDX#?+&iL_f7P%AH*}jCU92N_1B4uhfP}F zfAb??5uu+ou^-oB=dC8LuksEse#o<`h>e(l+o{h>ec4)a{*7TbW-uRnp*7|`19%oF z*iKG3x~QLL*B^n;@4$|Idze~v3wh$i0oWAmJxZNv(oE2~>;YxgW*{`ms*=Irg*0Fcqzr(^7Zv2ggR^LL|TbB{t~ z{R(0yiVqWaPt*P$a|Hj)XaDOpUh6%)*NPa!XD(%ecjPnUv+09v^f#=L*VE)ArGG?6yaNLooVX(tV(r8Jec(pXwwwQOG)JZDqL-tu^yi>d67 z=VSBlGCCuii~R439iZ#j<)PoWqL?e{oL*0C;Gns6VffPRQTHERd28r4z96Xk_od!X z*K2dY_^%=daBb*zV`jK~=|RT(Qu{grSDCdnlo-KtM$HK4UU*~2fmbbza{of&{>Bw< zi)+(0>ROHKm$mB}_PuM`we1>rt-I!3`|^OiAWz5}kw@Sac}CvR7GTZm{>0UM@}#d^ zcM@?n9r3qyH0MU$AO7p`UOtZe*s0LpjRpMjNj>_1nD?Cj+rDQ~A4D6GHY1zz-XufcK8iYM1?f_6(rhAGd68l>PB+(%z5Mc{(ls({lg+mS_G? z{(oxt!j%76{u}?7YUTl`k0g3Xr;|Rq%xN$!>Uo(rkb>;9=cs$k!&MX#zvm&yV+Zeq#7aP6`k;o7C! z!sOBeK$l)WYRV(C{dj#7~ls05-u!Wc_Axu3I0c ze(RI;4clxZIf2zjh{HqXm)**F;?|e(7g$3VydZ4A;>!AJO+0G^uij70J#sFi@jiSK zM`Jv|3hdo^_~f-wFKK<4cy{(A;@PHG-iFQkcIwz3;q#F&3qSWPVuBX1zvO|dBc@&< zv5fEO{|AicM?c0kp4En)jh?JrEdVzso&oTm=i+ytkNtaL^MlCgXV9^en0+x2mT|rD z>dT3}TZzwPHTID*FpzD&S0?>`f2PhM*T$H4?&Up=DexIS%V+v*`%p+clV&}Gbm*v`KqH*~!$D|EkhWf(A_G|r`SIL*R%;zjHG;d?*F(oI~1iX6X{y=T zqdB&a5IO`>X`#2Fg$_d>%D^zgz`!st^r5#v2m}ZTgr0;{(-Vy`QKQMR#eUQiHR@51 zUGG2l`(1n1@P-?6&i!~$uXp}fpS9oj-Fxk|*8A-Jd-@Zu=sdE)bpr}RmoZC1*9q03 z+xQicCZ$bjR9cm0rCn)QT9&4zZE0Lu&uaPpoOu2$|FzGA&xX&4&q}oYL#N9BrMKN5 zK73ibjt#Nzi~GTNe|&B;-rMI*9h}c$hX3*d_4Cdv?r={3_x^XD@BdfN$p;H<;-a`) zOm1*-Upsi@0pKNTF*1M*3Ebgb4U+cJs)J$Vk^^Ddribu7BQ_5n zU?Fk(3l8EZez!IDw6mkbMt8sN@o$nt<&Ch9*lRI=|7VFa0RQhG25ZN2X!Y821WIn5~Pgh~DSASsKU9{PwhZgg-b*_B~|9j;As*~jZ zIpedx`Ca4>xF)mrn^%WAK8zX1<{sY5dwOr@;9TSZoSSoWuFl!Hy9U?dnp~S}bgi!0 zwYvx6zw(!R;~u$J?wNb%9=ezAse9`l&*0o1bM}Ryl_&Azpza_4Mf3i}VE-)ox#Z+2 zM@L^4^8gK4co?6NFUJ4$hN!xoV1Z(?ZCqabu0RYAPp>d<-osxTJYuQaKDYNSzURhmt_tF$alOWV@8 zw0?*$VZo>WC=TBQeqxlWP z`Ewdk6QEC{vHx_o;G|P8MCT_4ij`t*hKHH#pZws}{fm)F|F7)-rUo5Hxu0HMK&)2> zAohB!%%6+@XX0(HKc9AhB=?K|`V!X4{oudyy*RDhZ;P1CcjCXXgyMg~{wVL)@B#_@ zll<>G#WBBqtPtEgB5j*wdzax)*C6wTQHx*y;k(KBGRvnAB;fllh%VU#9_Fs4y-!yz< z=2JVc?5@v%KVOdi0DH){t`1FCuTg6m$Qqqt-z6 zgJ0!)bP41ETuq*!b?^ym@F84g93498`3GKzHR#nPF1y#f@LvH(jny-k%`?$<9pzjw z&d)Pnch+T$Lu7w(Dp?;dIA_p^KF9=ezAse4;_SbT2qVXnlbCcsMQbgKN4>NAKDR2?@EsUUho{w?~Y=)BNn961BQ|DMyxE5zEQ zNoi9Wl~$!$X;&JSmZfQFTN; z#x7rl5B}Pdu?<;zckIR0qC4QnY2`<-&CrUWRdY?p&**Ck7TR# z-N6>t$FXsP-Y4~m7jhmR8;dXnzUZIff3I7^KOVo4y<^VA|2KbDHmM)u0kikfg%^M5 zmLi_d>Q7Q%kD9&5zWKZO-t*me>id5R5B~7a;ej9giSLOEq}JIceDTzuDuXIN86RfN z74^=0K0{5vmwrt=AMaRv_^R&x3K;a6Flp_*=m73QZ+suIGEc(?kdGd`pGQ*%ApYAg zIrar?u-~K}Ftt>a_3`hEx_+>|nq%>Q<74LgLxuQ zaZb+7IXc%lyUERLT_D!rTI2y-n`?Bfe&^cVgQy>If7l!M$h~sU+&lL$@=`f_t4-v_ zDcgw!{9ODGt{uNATs?re|DMGC_Z9!=h1LT~L;KO|uoXNR|Hm%m`{_i!pWeKed#yeZ zx{&9;X}1D={}#u3e;o?fhYp3r{ekJtN6oFJ8EHsbYELeq*1ZbJ?>{qifmi5Uuqt$& zx)mM4=OQgilhUR%Dy>ShF}@QTmX@VyX7tL zi~nN2va`KBK*IkFQ4#?b~YbKk*Nf!1HXq<`y{31Bm~gBktSe0TTX;{k4tziu-Y1 zb@*S$_xv~FUH_VQLX&Xm*i6=VGv=SRLyGzJDjVcoFk2ra-%a)EpR=In_<6)ay&mo& z2dXl^@4kfpzWv!=t-+k6Ly%ihjMs%pl&_P!mLkFNfomjn{&;2+Y_#8FTKTF&o z{`%FQ{2qGjukwz6Dvaj&9z~mi-|cK8bL7x_23hn=$Y;cHk;{JB$ycL% zx`O-y%Bk`L%8p{#qzyH8|ILqv3Du{tSKueK`u=F^R?bzHF2PT3A^5lieny?WSgGxQ z4*HEE#!$~*gq%>k2YDLb#|6|3UO?^O$O{}+Pw-Nhz61LL@4M8dZO6x8+ry0UEIbJ{ z4;~`U3BNz}o61e|=+FG@Z+_>wUgNcn;aF*0d++5vjq`U7*;iTr*W zL(^XP3w8EHov>N}m-fSbqD3PPu`OOX8+htAmjZ&`9Y(x9{` zO-h^6sI)50O1sjqv@A_a+tRqtfiy4eC;a!B@Y(P;bpYo2E2!KSdXAkH-uJ=FhxlA6 z_vhx{^t1Z@?D=c3=zOrhN#13{FUtE!{$KN)|1GbTo|3&@EVRYkdf4nWyI7ymQt*B0@a)7UQ`P=o)82N}KQWS#tfmND>e z`E2|n-b>lS_syBPfbxht%HBg@KJTOk)Fe$Z%6UyLn!NbHUyt@}-`(FpHTf=uH7{BV|D`CSU-;6$e8~JX{DRSN2OU^*-`dgm- zH|)36{N?v$=n57dAl@IWx39eC#TfUu@NVSl+aJRYjXeQbcKQ8Zg$F_B4-b%VzXbim z4E)*6P2jt19Pwt8);|=+t>iQI%7}Bwx#qW-O8(sG_z%oQrY*;IvGiW@{)mt0HN?=F z#1_t^9_}pOZF7imD<$`gHum}8e;IgNL5zMCa&-}UkBQ{TpSXc>$vrq_%Ohd(riWvE z+){981@e5<&vV^E?}MMjnV-w}&F?(dYmBXP499Xz$MzoH%X@ln=ipp2yFayin4@!b z&d%L6xRwn6xhMB_t*+U%y9X243-`pmagX9&v1jg`d+1)er-=`khd<~7_0b?O<EHY`vCz+vv;T9%2z=r9(J#-uYs(%WkIhMZ zsOhciyBA-*J72_C@H4+4w%{kk_fgjuS#mPE{}_wA{4hK_^#Q^D`N(f8!RGbE@~x&{ za*$Xt)(lf9{jIB2cU0Z1-|cdZ%1zr z4>14EPhq1b_Kw;?iw}PR+xH8+2k`9!FKv@I5&O69{xESpxop;*3S*a(AC8;_qn97! zodC{(sgv<_(>HiJSUZO}_yvcsF`ye)Zl1wdh1-c0B)(uKadNZCb6B$1S_9+`MDCr3 zOtO$zdvg}ce;7BX{(S0YeGQ30+=3p2>lPlQ&VYIX>gvqD^Yi51w|?O_{*TZ8<~g40 zHD2o&j^&t+?LEAg_w?S*!MQjm=jI%pt8;eluEDjqCfDW~U8`$$?e2kl;hwlR?vZrwq08)@ z)c9K$dagJeI+xrYT8~%|S`90u?$4^wZcJskb_)1Ed39(ycv@&Pep&P_m1dORuOBuK z{2yJf{g5(Z|F(qAV=F>ec!0^99*?vq4N8mBq_ioGN~_YWv?~qkV;X51+Lp$pb!lGO z_Zje6NcbOpW550TFlOHJ&~wDZaP9@~oYerH+Zg})wfQ&mmWci5)Zo9* z%e%VUKk9qN{Lcw|HfMeU`S20B&HH)Zbni5m)F=JCvbp$Qie1ZAc8FY;v?AGU{|8?{F=ip7=6MWY+Elboqm?fz3Y%dx)3b|03tTVE%xg$C@%?!esL7jIKIFp7*2ZjvtKv_=~XnuLj#! z@a~wi^?@*Z>#495Iex>V-(dV7L|y+XeEHP%uR^!HnjHW70q767fmm;204lZl!#9*8 z_g5U|9YmYA_i3JMVu|;IYv8}%Ex<3`Jb=@{{Yl(knbrJ&#sy5>s*H<%8@=<$%Daf) zMXp_YZ_H~uncu{~i5njX)3ze7;}91&zZC4% z2EGEF`l?f3=U(X3Z#5qww#?ne)|*!cUkI>y0oYzj&4Kw`w+!FFRp_YC{OoUj=eb_v zwT|Ifj_KIm!+Uv8@9iAQxX$yPn{#xo&e^#avIf`Unp~S}bghy1VeRJjbuZkLxHs&P zd*z7Kf`?(xJ;kA-f;{<-&8^(n2z|7N|5L#uw&{To2tpRwzi_cQT7Y(Hsz zxOUd9#P;18I!@gXn&;079nkyh{}*fj&fkY0z#@DHCQ}<|X{41E#ElMx&uB%gU)z2& z!wq9shA!ig{YRFEVUGzo1=qtdE0EA2|d(y}xyZA;_Qx->8C`waLj z_)KKa#vj6lQ=bX>ljekvH*b5b&salz`A+Bf@mXuI=$!EGX+Cf20h$DL{vR9ADDT3; zf5dle89JYcxysnc?Wr!MdHD2Y7yDy8I~Xbc7w-i(ZQ#GSZ>z#bC*gkT&&2;?@LlYG zEByDGT^HD8^Drdyf2u8SY;j?b>(7~_3G4>t4~xHFcyp( zQF&(=g$~*p#s%PxvnIx_Subdchzt(f|FrO4UJ z-C}haxq~Y1A^+bo^7Wt(FGUuQd3DLHt2|zeTu?&3gi_uyC3}?BJ)c@RN3k)S@!8+} zE}qLZ@mj`6<7H#x2f@9(r{_C|I2Z55+|oRqvvZGYU@fl6wYkQ)e%2iGBC!YVh2Ob1 z?vZ=tp1F7Kp?m3`y0`9ecVhp#gZ~52?>En1T#NrL`+@(|{cC&6vS=Sz$$vM2vBdw5 z)2R11XIE%7YH7F{S-#zPasy5x*WYyN0hHar7zLr_@Y0Y!e@CR13F{vT*W{yr?=~h} zGi)LLerv#fatBV^5GKL1_&fR*A(?=C8qid4VMV7lZxfN07m5aKD=8(UvRwM;W}vb|4>63igZt zsi|*IvVYR(H$0WeQY&)`6T~)k0kpi{7={~{)_!d2Vm^|2%0>AEsnwU zx%lt7Q6I4NiHvUm`^9~A0Jd7(ukjO%c7O0c%KqvT7*E;%t?<9}z~>|W8v~Hu(RKYl z7v}z>{hy6^=bWkc&(#5BK1=#1W%_~o>!bjUUysKZ>>ewh*_sf$vu1e>Wd{vT5%RQH zY}3AOzGHJBiPK33u+Vq_H%CqE%Fc?lR@T7&EA>h;$v$A{4Cb3c0= z$K+hEiPtiQV>zZ{dyjN4?;X!)F3!ohrFlAM=k6L@i)(Ui`e?dV*X-IyW3S2f0-G;; z;vTtI?wNb%9=ezAse5Y;z#elCgh7=@(cACD_P-$7{+smytHpnO|JsdM$$8Jk|4!U* zGiD|7{YvWjtOfhY4MYvVwv(zu$D$qKrg?XS)}t0M4!Zx*3nPsbZFw+spS~kpiR|AF z9^l4;b@=?P0RJn(;0pK?Xib`v_M|~+(R!28rZg(8O0&|gG%PJk)6%vyF0D)R(!S4t z&w|gy-j{zF7Vf@3^d2=iy#Mk~^i{Uk-zNFoi2r_Bav3H$9M=7ax<4-ofju^;?b=C>vM*LT7(#B=+E`{l%i+QfeEoBAnWwC8%A zz50Kf_-`-vpNap`?l0E*Y#hq;{@yFKWCKX}ul~Q556HoP<$tk1HFW?{=0_)x&i5WR zv0pwQ>HTZ@fExK<{ErR(KUe>+&fli~!Tl`9KcEi(>oEUs$tU`NaIud_Qh{;tk%XKc`Xuly~Tc zC-lq1&+3`ik)2+T@7wA}(9h#zWjuJv9XuEKsg1`rt-rlBd6dtVgVEyu>@E1{tUn$q z(ATd)$G--Qx314hbOCGe)mqJY3;1pR{%0fBuj2P@*Z|}KwmwD99Bkdo@gMMBi^v0` zEkMk-rrmP#;Zz(Z-w=F3379i;CpvEU59QbC92XG>H}4?6ghyXR2mS*7Iob^$pl-pj zFdQ7Tjami{BL7;Wb^?A3Q@7$fuvy=MQ^>uKM)`j(xpL>$$mGh|bHU<>>Eb##tleJO zea@~-1}_Hp#bU2Z@_&Za3A5k6_ZqK_cwVE|cWm$By(0E|Z<=#)PVs&<*D3!ych}%r zT$5{ajjq)-r}euR?umQj9=TWUnS19Rx|i;$d+Q$eD!DUsoxLx#A5$H!=tT`)>ixD7 z`)O?kFAN<s={{{s7`gmJq%~eQyP_4 zrCDiL8kUx&X=yvrxil~B`waLj?E512ftTJ0`4fx6m2IzYQIFid+StT?WBRjaseVNx z^a0s%=I^f$jy%EN@|l0Tduit`#NHDdSf_7W=^^w|Ht@Fc_$$P0z7~&X;-iz>l0Lt9 zKRNn2r~LTmYi$KpJg4S=sKD38miz%Tet_>8x15$RJ^2Eb-pxIIc4?*P$0~^zviW<_ z?OB^7kIk`ItX{$#K@~^Ae&S)w-(YV`V;Vo`vH5+9$mJvM+6ss-$Zgj5E5dFjPoeEU zUmXEH3CX`9)%8iexr~yJfPJz@i0_eC;GT(hu+QRb)G^lJKRiGk{@3CE+dZFW+35AK_=Gv{@yA0(+Q7SU^OHYC zze+B^hrbhLDc_}ApZXy+Scu(6$68I@o+Ni`6E<&*vcG(Q`QaBM`>%fBHT?MgHI(cm zw=6Y@OLja=zF7Rkr>9g1ST{bShd|aExv3Klr zj`vLWcP`E;>LzOV4(IILU4v_JO|H!~x>nbm*6&`pC+>~00q&K1=H9u7aWCVZQtNs5 zQ{ko=yTIxr;mW?m{Pms{uIw`>T+Oli|JDQNQQvn@{Lebg+C>h4<)QW968!xZP!n)I z=T8sKhn0u66W4?;Wp{;^#PfY($n4N;fV&%#%J7fQDt z3SIL@*E{cm_e>G@vs`}XmZTg%e$IGp<8Rap5NFGGXXBavza3NTPPmqf{|Wn*&&B>T z@!uE#Ydq-x?-*jgt(?4%#Rs2#6aFXcFTQBB_i~Vnf z|LOxG=Iifw2L8(fcn@*ER6iQpTj75(Jg=>ABkQ0S`*WN4ANeD70W|CTr9G1e5bqH*XN$QxwG z`Yv7c{(l*~^@-Pzdwxre-=9-o_TSK7krVFdH;|7qTWR$pKME_!fwJ-;Yx$Ww6*(MR zYSgzr^CRl9lgA!xuRtC*_nvm)S?G&rASafPcV;nlYn1Ho$5Xk*7OPi!txw%-j-?|h#3iFivsot^jz z@SE?5Y54BX*#0zolbttnJ2r^T@JgPiPVtP-{^oa%=`~*K7>?zbj_tMH%X@mBbMQBP z1*2Y~2LGM2b9W7{#WlG$*XUYZb6h)n;9j^V?u~ooUb$!PoqOnBx~J~#bo2=Q$`6G$ zBbG+&Z`#|O|K|Rs!3VUW=5Np9z2q1CVz_qFMtlJlk`EZ&z?drdg(;y~{%qp>$n`sO zd$@7V?co!H(H{&YW?;fHu6Z$B3+A`%F$o{S+2N*%8_@l)4W01&n+;zlZAoL&nlvZv zNrTej7HLwwKQt<>O0&|gG%PJ^|ChF*BD90!Kmlsg>PdR?=-wOYe?C(7iUMC$u#QbXHe458%yyvBsEC0u1Wd1k~ z&tr-!5c?gs6#ir;It<(2lOF2s{nugX|Ev3FzR{$oJgoyr{D3xs({%wFgbNEtmaZZf z`Y*`I|0ABq@A7{CIyGm_ThBWaIcfO==0MfwhkCwG;fwbKx#^L!);;`#lrw(8-acA@P@LX(rC=~4^W{>xFCFe!mEk4>?9{Ya8 z|IO3`G{(OK9e_MQ*}i9^FQC2vn;$1vV2vNZoE_w<*Ozej<1x0p{J?Y6prif|x`k;Q zd5@5HXdZQMXMkhliEEoeETS^)Tyo`3AU)WECZCQv0QBQymHCm8$B_4C6uyhL zG2$dm>@3_$jv#&i#eDtokt=2)Tl?Ky{PNYu&$`t*I>!G$9wyNI-FV=_ZRpOyaDDh~ zh1;G%hJ6yhJ96%91#{2%>~DTodp_4XhGRLVV|x$p4J-ryi}3%Sa~l8q5&t)= zlGubVhy2RpoL3G0FAA-OFAB|XLH5VT@9M$u2=D@(79NWJfL9amf7OUG>i=vB!%BCA z_5+9?=sqEInzV@=Khy(YjDcl)BTY$L(wMX+%}IOGU?%%h!xGw*Mx|A0R@#+@rDbVa z+Lp$pb!lGO_ZhhR%fCfGwL7%9q4x*QX>`Ht2IS8&mM_KG`s`%K>e3o4YK+al3AoAj=_k)$_{1f(zySe&*KYLBW|9E|k+%Nve z2L2}=AXopN@IT>x>NA@`W&?2i)3}e#A@Tso7Vr|<0c_%b!dj0L_9yv2;eN6Mh~-HK zknlf?>pv3t0OkH<@3+s@{d=Dz>z|4LVt37K$XT3S{@gSqG`{Z}C`o0h2yBGBVzGI08Ahvo3zSkSU=~c)G zOOBFroqTf<{|{077CB&!{^#4MkwY!H=>Ln|b_s12aqyd|X?H6*T(%I)wG3Up@_o_H zN5HiwknKN<{eZYY#$81%z$N7WpR?=nFnR6qPy|0wZhR7LF8YGPP2lzFW5gknpIhDj z%45_gyo+`K{5u(Q=Zso$Bn&6MZ49|>3N}3w#*q_f47~ryRriKlh<_il^qw$`UO9OT ze1Q7$NxWyLZAFeJ_AX*9I6DI$;OX1oIl$UE=-y|D_4p7?+6>+j8y9&4Z|C4#oKx-mn5%Pk?ykYL zxF*-;8eOYvcJ1zgd*PnAH|~*nhTJpv&OLN5-Bb5=Br$nyvF|qu05!k)yM6(&ab5A9*bi!&aR;^v z;&i-DKSEcVXD2tJDu<9U8YudrT0R@={bNb3Zrn!(l#O4m+;&xrhhx(lA6LZ5${ z^D`IH-+~V6?oo&NXVSoh;lsmH&Yw&NApW10`%m)%p{h~6OU4bJQ5p7s@i$=``uDBq zPj_N(zwL!L!p5h5L=4pr(V6}bKPqbSivP$~nS6!qly_`;&qiH<_ST1~XZN7?e%=-2 z11M8glMg_SEZY9bFbn)&M2!9#>d+~_SyOH`wPQA7quulf?`!f1Rq=io-=}W64}Sci z=<{E3&u7Cj-dQUjrvA?qK;B^Nio@X+;`|4d z-x2y2-x~Ut>FE6;-%me{HXVGP4%Uj-Gmyz_;`DrS1eRkvpAL5Wo|ug;eh#^E{4HVh zTYdI7&+#{}@mj}lEXVY>bf3siaBt_}T++Opqc#KQtnBX^TuZjj!*PwS)iwK_d*EKU zC+>}V$@_ofjJ@cJzZ}|* zC1>x*d8 zVt?1koA6(FDAJNNC2dJ#(wa7YX)p1m(qlC=l;~8Nm3F0JX<3?rB^(eYO zn#baPA-cPS{|T=n&j1gQ;t1@;e=$Gt03JvCKXZnPcpu}xSy~;_BHsQaJ-oD60dD9=BN683ID}?`2+a?c?O@!g#Ti{P2a!*c!5+0 z;cU`D-Pm=w|8_Kx*(h^me&1oq_J7(huzue8bKY^zMUz(^eL9>p7dp96Pkoo%K;Qgr zI7kfi-p`XW^>aTDw~-5d+q3xJ(YAl;r^HnKkoWIt9$+=^<7MVr!2j$Ui&=-}aHz zB_4|W+OLHAZL@C;`3v?U-xA|q^9~rb;zZPmj|BVj7at6L7wp5Q%^D>qGWj1J`GgIR zpnu0lTAW437GtNQlb?w$f5r~+S^TFqfPP0{w(pZt`~=I;(as~E`Ao3ebN#$PoqCKL zcs^qJLNNU=efC_h@mj}lEI&K8_wZic(|bDy=i<4}EzXg-I%ntZ8nkUF|GPHV=vrN~ zYmasT_9E?zd*oiZXYQSQ=w7;~?rpbO=*fpwA^VH@3IAttJS(&wx;XS-bU1XKbsMt( z>d<=Rve0q-8fx}V2(1Q{hPJ~Ob1ixQW^E2PF1Rza7+FfKzlCAQB5DEMFyfr%-SGDx zxg>O(ydiWgSQYv#I2LJ0T9T%uEon?zljfwo#EVLk(xx;jtxB`ft~4wyOViS}G%l@6 z^C!RaN9gbK;l})Np~?9l$**6JXCm)CQyL@VXPBSK{u$p~zaqx_f&Iq+zuhzVKmD7s zc*6fu{NQckznCxnN9?b`f3e?I1fD1Sx3?vGeQ}NapL77q{Tcp(;Wd1K*emAS#D8@F z;<&gU^#pvc?4OJO3H#%<;C0M9#5KzQwuJvl2ap?o=&?ATTD1M=V88gE_=&^^B-~Ft zKra4!oaBFH|9D&@w~OD>ySSb`Pd-ywE+lb3H8DTc3ideRzI;F&qXz$#{l)*32l;>c z|F0Xb4)g!JG;j%4*7~s)fPQ}&ACPPN&ujwn1fi;N{fi5_4jmgF_}(wVQ*Zn^Jn`c{ zhsR$3V|eKM@B!cYO}OVP#7Oi0y!BJm1t8DLZ7=*sl$|z`V|63)mp)c&u(vM7kFNsk zUQJFr?f6yqz^h|Bp0W9%$OqUL;&Wa?4w@CmUyb-L53qrEb~XBdD)RR%IjS%JE9knP zLDsx03}3tp-u=!nW#e(;=+WyT`&XVI_um10)c2r|-%4Ej`jcTYn6KV{!s?@8;+kV& z{Bkg!=Y9B+yLiU$34@ho$uE;%uKa%wa_-TZb_}`q-Y^_Y6bmz%IFtRw%7Tr?%%fum zbLW8DGm*{3+F8Wl$?q54{z8-mBEIj<@V$idl8m490(15dPY2d7L^qh>w)y=O^8O_lW!f_w?S%BhJM+IXCC%T%EIXcMYz^H6HML%JtHyv?|R?yV9_(zvw#_#1x; zkG%eekY89HF8xrmn;XCnTQ~DO^kU+?JhM9g?Agh3ZTr2xwjZx|eT)C@^Z3`CC*~*Y zuX+d{UF83S{YmGaYj@7I2SnLkOr@pcT=`!fAb$TAa=-X(6W_)DT>Q_~|BLH_>5xlq3;{{JWb z(Y#MT{S)LVVgm80T90j2>{rIJZRVZ33f=2GVzDal`QP*?KG?iF%64NX-}GRZPV*gZ zKa2Nx`M&3g`};C>fUk%3#P3%>@C|f_eCs_xyC?1jd2=V^{18qn7MOmwi0q zO4TXkpp(S%Q~!6?t<vQnE z^LOR*GII1Rx{F+VcRU~M0ow7WsV_jMC|CB zaB;Hm*NCJH`VV^Vfj*|Nn_+^uHQo|Knc+Tg71HaPUvx z{qnYWe<0_NhVRUW{)X`ki2X5# z#$I@NbZPOLU8i*bGdV8Y3hzt~Ae+bfG>%<`U4iDY_e;(E1O6|L`(ORHb-&l~2xprH z%njH$)+bR1VC~Wdi!xcp`he#wsF&9$#xm(2(7s#$_wIY)YvF$NqP#1QeCxDrWQGEAo%9zKFGN}OK%Uo%XWtWoG&)^nZGv-U5Y*d44SHsKEC>sw>*je z9eIT5)d|ia{(cttI%}7@dFv8WdzXAUQ?U_D!cT9ibx6Q#TM<5b`VU$+T>m}K5!cWB z>~DS-^Zav7y56zkm|W*QGJfKvcyH(6T%1$x9G$ascMYz^HMus|=vrN~Yj+Rai?lC( zcCXws_s%_ZFWu7-K?0?g&UE#WE+e6!-i^=o9IkX_| z|H__|L-T=iLJL}J^8I&SxG!8gV^iojV`FGHbY5uLYf`wf^Qijf`Rg)eZRkclpiz}~ zN1Bm#q#z2Z%M|e#BAz{=w4`@XQJOXR}nX7%ocJRN@xz;p!0P#OIFkkHVyy*LIdlsK(tY9ww z>kn%zf5LwIB0nqpuhs5lULR`vfd68@y-nPg2T1r|b|?AWbmWU* zp*iy(BQMYAqfh@D^754sFE+UvUwiDv<5$3glXG5Qzy){V(}%r(t-1o@|5iSzPxh;E zoW;E37o*!MZDW6O97^Xd|x$alG)Jx=F&jn_JcV>zZ{dyg#6|HXK3=aA|B_374s z>ESq6=j_~FgKKe3u1!9`wYp~4?jE=o?umPo_Q^eS@7zQ8(mlOy%B{%%i$l|%bCCZt z9^eX&mHpcdTM}+6x;}>R&$O9rfNbMIS)p|9n1_`OgoR zjB7;9>;>5V-|m_FpZcv5|JaDR;Jxy{d_d#{)Uoq9=>d}5FZL(=mj@906aL3Mz~Fz< z0ZhRUFvi`kgoN0OEdXF^@3( z!6P=O_G^ z2T1s@?C)`u`IY-?^Z>c?zr29>@BPGnd-)B={hy+Px^e0-{;#2d_td+x=R3o{49;*q z^JQ)jZJU{IKo-;F_YD?(xY zy;c0a?(rY;9{GOFJIx&T$kKOV`{wuZd(fHR#d~4b!|4A{5Ci`pdVli%;|EZ26zsbl z|MvCxtuf{hbkoYH!)`X3WOD0Z^xVp}gBBi$7$?5JKNjTqUT8Z}*JZV#Ob@j;)pgIYJcLcawE!qBP{*w0U8?~R&gU3pu5yRx^v z&;B^-)=Z=}?KIBOci%X_vE&vXU-P}TL@|9DIPQ75pFQ?F&-I!ZBghzz<@b*5J#z2q z9DMJjcaL*)uFl!Hy9U?dn*1yu;96a?Yj+Ra3-`pmkq>aM+%xws+gE%5SDy&i6l}+j zAA3I7FYdP(xG=Q9=ij{lZSog{p7RbN`(x9eLe5`u{9M(0YSj5(J!o#Y5?w&Ynd_o=L% zkhs1q_W%4j+Rx6f|G|+>>VG8v!UiAj_t!j&|J`e?(=7h4U|nz0{foI^acc4bVsPRC zqC5?bD*x*fApVQf3ICG}d?x-Y|EHE@@TC8j2TAu+7vTMp4kF>d*uRCCir8NK)tm5N z%s&(VlfJ_FMjQwC#rItNkGg+!0OEgYUYCpiUaQO><^IG6)ZoAJzxW^Jb>#lU10=a$ zKEURAF{e6d@0-vKU+kTq{y{kM)nA7rU-@-7 z^a|MjMX^77ryly!f08f#S26Z_!;|D!L2h4y9)IpW@DI6S_8w~fA(vJ2{kF%*y@IWF zqWXB==Y!|(Mpoa4ew#P|{I`6+ts_Qj4RYNQWPam~W~19Jx*h*Md<05~C7Mg^_*vlo zRD1xZZafif0+q+90YE*V+2jY9gx~*YehAVyZl9mh?&P% za0R)6!C#+ov3g96PCyLybHN6D62NFbPsbYSasYj7>D$+fvg`2g4K+T8>9!aZ?s58ca=Yfd4@6Z2mq`(N1yJSPu8YkdE#`PXsG8f5=fq3y8B(00_a&}L+1wEcIS zye?vYQ+R-DXKe^w7VQol3psaKNw}iZ@J3g58QGxIsLF8tm{sBC>02X>NGsBev?C2k zOVX6IC5=gI(wwv>4N8mV1CTbQQSo1zm3F0JX<3@y`vvL%JoST6u=KX@(KdZAso&(< z){PrqKBQ5j%Z4{Vw_mRw{(b1h&dH|+bZ*%2l5uDAIn5ngT#d57 z_)qg#e!vznm)}>gW-(rzw3X=>2R0Re{kEBVvRL$)@W{4;4cN$ONl%dS@>DTqZZjrN z-+VFOW5?e0g`Y(Ee#@tS7}h_L`S_(?AA*hK|2y*9uVOC`Q2hkD0OCJm{XoWW{5w!^lrs2#<9;q z_8eyMdIjXLNO7?qk3a`mfF3}(-Q(m(F@5)B1)lgC{{LV7eK`0sy8oAc5$<^L=i!c*eje`n{4c`++RjhEL0mQYRk7PEqf{Ir zZ_obcLpl0cefZWOuWdmuTaAxaDer0P&JE>#KCtw*Fa~~nF8uxyV!2nLzgpM{f99A z0DOD21Bh3{mmTE0z0{N41BUS%x@~3LUSOZCPYJmJ=H3x{qqFWs>p5pPHSKqX8>e8K zE~t*Uc{8%}pvBY*UPrDV+Gu3*B!7$3Vz2K3e^Wk>_zZSy!xy*3ip#anh#q z*T1O8hZ|o$;G)JCwd>fh;d>_xz#oYJwp{#|2Piw7l>6UG}8B<_pk`DAY48JrHrFGL4W ziTt*J96|H&2b_mbK=EF3*`{$Qq&!4kBHgndD0JCnPp8X)cA2>hLYxgY$=VpU@w0@=X1lR=T5gSlK zygN;~xbuu{;ihSuqntbtU-l8m)8lzJOxTECKK9!7^>uiT?;eXbfl;fi8}J}`cF3uV zul=OWnf+h;{TTd&hAx&LIU27MrzdX0PG4=kJ!=)7{_L^ed9K%Ztz&5acTC6j9@)Jf zi1&65kw4(N=x2~KSLf~;l=)qgYjcgR)it|z_rSeyPuv^#NE?8A=H9u7?&Z~k7EtGB zZsY;%n-8l9SM-|`Tbo;!hHJ*+&o^pyXg_WZ@qa6$?BBh3H-7(>#0Zv!4%63#u9bVS z`%@37e_^<)^O(@Q=cLeK%z|*;gbnan=y9M8X+(bxX-3+ShBiD&T}tpz+LFekHEB-T z^VnDbX;RvhMx|A0R@#+@rRDox`%^gf)jx&&=}W_VK72!SW&eo(AMW?Qb1v=rv4$5k zySZV*_f1gt4|)2`68mQjzy=o=T=tF*Z9mkwW1F-6etDCOUxWX(GQT_ka{pW5zkGnQ zy11|GZ;N^WWPkBg999pI=`& zjFg4H_|Hb~?CgvyX_t+Rgu|MH|IW_?CKVrXqlKZ1?4SWQ+A9V>edH`krI{be#2A%C^ zrf&Sdyx$i$$HniXH#Vzx@wKh%HT>wnyztIh$=@ju^As9iHas*P`0j91VF>T<`mwwV zuW5hb2RgP{edM#@o>$P9zLdrOZFziAddW4-M;e65JFTKmcG#qadN*8h4ve%Fgn zAfF-2FGr?WZA}1jvoGWwJ`tO|a-Hw?LCEO(=o`Z|pZYB&$a2d53lE#4D_r$$%kK$gj zXWCTU!(MZChO6_b$%ozFCjPeq*RLY>-#mcgzxw|+=mf5vvXxvwGr;^gp*QPjHwL^P zS`j+T*&MDb*%sOjpBGy6noMoqiSPl_xsG~4C3i=fkT#?dX+@fmcBCO`Nt%*Aq%mnt znv?dVOKCC2{Xv`3sNYGm#sEsg((=jI{v1}^^L)6hSo zeR16w}V!pT-Wq)`8aaa6Lc7QYSU))dpg~ti^Q=jl(9w5p8ey99@ z=PQ}apLGA;C+YoD@BMR|_fN9F_%HTH-2lD#ugsrx|MCFJ{OZ?ZtpIr(;sIh_AZh|d zTYx%$<^CEzAmM+K`BN`$M_T}T0_FbH68@)}!N$PWVm~&3T-iU`0UQVUKkEMB0mS}< z|H}V$`2Ux&=xjbabz}eKeHZ^5oZGTf-i57i2u&^@65d0f+6QjBDtw~f`y&1~8+u-7 z()QZCb1olp)wQGQZ+ze@=uiJ6%2QjPrMB9W)ce6#-@NMj?AwgJzV*{TMb7$Jtj}9< z?3GYLZ2Cgp(~HRGQ%;-DbF3Uc5*$&!^Bq6D@&FkANVMh7;TbMP{;%NNsNX&KIpW%} zjc>*`ejT~E$x)+zf5bAbhX)u=Q|=#EeGH5}9KRo4g`AGgU;jVz*7lygE#xmGZ*A3~ zFsS0r(6?+)=!f5X|FSznpJH?XU|nDOLBzM46JH$c2k!L(8D?pu$~|-M+{2EOZVgutJZ<~G3fq4N@V+Vaey+yv?;7&_U)^UWeO2@`XnHgC zd)VV4l?Owsf#spy_!Xh!?9HKFVRdLZlo~-ji3>pXZ-IYcC*lRit$iTUgtQ@zNGsBe zv?C2kOVX6IC5>4NTAGvgq`^dwu}%eaDXmJg>H?(ULtpxJl>IvmD+-M-x~6^o^VR*s z7k{Al2f{~seNg((>oh%tF4IF^?|C7w-~3Ro#qdTAuA3Cj{pi4VH~z?gi_Z2tCg#w6 z5PYMFi8gtk^{gee>c{Z^t7(xxpngUrEy>9--wt~g3c04B5t|+IaygsRq z7!Hmb6Hs~om&3+q{;jsHpw92cC-Lj8X?wo#Gi(Fs{G*NFSMk_6>GK!;{x~kfPdC;f zx?3H4rVA)N1g`Jb-(TB5dH~L|k9+}hH{Xvrf9;e1zp;Ndc@JB~aeM@5>MP_AB9DL! zQGAEFj`W2|E%S@jrk3UZc{tVyine^NQ+|Jw3=h61`+u|rkQbHX3`~uqDX&<>>A4A0N12 zR~TBk5BV5;S_)oZ7trT_JTjyCYHu#u8hVvrM_xiM`z6TIi{R72)Pd!huDj3dJ<;wh z{*RzO&d}w^$;iXn!Fy1Xwj1?nZk}@+V{l#>I`V~ghf&Dh)3CjZtz*F1vDn{}>~9V- z+fZubh{;31>@24KAn%If%$?jji|{$7AGYL3{OzqjyUx?+dae2P<5-O8*xsY|elK+}w$;l1`u(>V zwk)(AV*Q`l*agb5=dXx4{yNXREi~&rEwrJAZ(ni?begm=v>v=Dv?tcDWAT>Is$h9& zMIE44;D4)LfK%@m}LfVi!T+H`Ak=z{$T-|e@c->@b8_c;A7pCI@i&0}%j zb8`8BC`aROV_zU<$qT>(M12ETZ~nfN=TH0>_hU?;zk&I=P3#x|5Ml9tB$se1Q0GE6u@waXE#&`_AA5tx!7D?$o=XIVgvJY@jqdI!vB=-H{pNEXIzIt zZ^ody{rLOs$9WCWbvAC^r9QZx_pTP5!+HNQIN@hj2oFKy-e4KTkgOmw!&(6mtXU4~SnN z@7ewE3Ok-PKj3$$*YmYdMjX@Zedfp|XHE_NkHJ?@8E*hGx;|cG$=O@DjrzRk0OlX~ zY*>UnU@>_|%JBu5PraAfyPoD5Mkl`FD42xazIb!!F?%C^>RZrZlb?Rx4($H72j&0q z)h9U@ejMJs`&?rBW^V@r$qiJ63{DQ)VM`Aoa~~w%4f1UXaqeKX8hy(aos3n>hb8+$Ah;8*xmKL)7O3oa=Dm11Uyy_ zzXjYjk6zRPfal8e$_cii=)^O59^T-L&;FLq^BQ>p&vh)vbZqYt@5Md6w{vhV&dIqs zN9XFCox5vrEpbh(%{97K*X-Ke1NXu`ac|rs_sTtU@A5hKD)Rg!zyGWH&WpPKR{e^D zt^J7Qp;@oODEoKBkI!7c9mlPV|5@jv+o=PzDs-HVZ$QyzpmsrM)nhE!Ul7}1atn>c z79=f56Viq>BK}J=(vCDFElE?-mNX`Sh((V!4mwz8R^qU+S zoY(B;dW}BOH?K*%j(P9v)HGby_mar>YX3?+u)2UN23%DCnsK3Vi!q@|^Rw&sw}QG> zwj}?H-(q`gV6ZxXqz5k}hc?F5fsY<1{I^f|uk0`Wo8MpDPqM$f zKrZ(0dQn^d&%%*!|FKpFAnsQ`_SL8Zuur&Os{=5vKn?!K9@#&|AgBjO_@8(Hd6ZoI zPx=dc`2aCr{7*W7g#WP?LJc1f{rHy`w_ydJZVd*+0^t4B7-ySVce=QO#d{n!P2!-+4GJN-N4O8>#1!zps8 zA0vm_aq_93`T=!RX!m^!-)j7;4iRsqT(*Vx(JJ0w703QH>T752rsmylYvw!-Hj!(W z+%x_310b$!GIzo;NB3i zkY{~x)zQ$qR3AWM0g#z{N9<=DWasPfo4ax5t$fG%$l;^#%kw>>&0SwS<#O%vgDSyn zFgc6AJIH;oF)ZYL!8>Bq@}uZ0$fXO$n^(`=x@Ug&H^1{-ukqR#kGF{L8P~DBhxhWH z-rG4i7w6>MoTGDf&d$9D{(P>*HMus|=vrN~Yj+Ra3vB}KjeC^%CHJo5_*J#CzqbE2 zgOKOR@7D_5e;fS%+YFi?uIw=>+)#LHxT@!rX!pNv?6UZuwd2|rBPzo+6V`_|6VUzl zn-*I49ET2IVz_4D^!VRP1JZ&tA#F$_(n_QmXeZP88|U|0q%CPoT9f9ay+nu7q_ioG zN~_ZB{jdEooc!7!!;H1}g!3-K2G$54md-2egi~H&T((koB&syREv;l~pN%prFH^qHh z)K{M&|BLwv|KmNe$tV0*50K`e9pFs-KU4mf7f|*W`x76a?mt%t;CSMGYU=z`?g9IR z|LXs3r+I};2O###1K9L&NVuPR`GI5u$a-XaWcyVAM@-Mv0Ysnu8XJJe;=kCRp+^?h-|Lb8dxU^~hgAQJo3{&g!{h#yKwJ!e;Xcr{rBOM zKcim2k9^nuFZhJtVQa-E`|J{I&3h%=bTOS_~_5t z2tRHze4?^_HeqOa};UJfERet-1y zHy7VVUOe*vkspYhdEMx*B__T7)Qz-F;U;jk2RNFKPJHy52e3K7n;>`F#N&K?00xt9 zZ|G9yfZv^Q^?i}O#dYUppO1cB{2$Ie&;0Cfx#xPVV>p&$I=1)lUg^Hh!MQjm=jI%p zt8;eluEDjqCfDW~U8`$$?e2kl;hrSf-@S6r+`E>;mQv?;Ugr1LyEwEa4xs(;swn%n z#`o_^Z2fIUED7z$uMJoADGbf~&W!(+|5@`9i^CNI$q$HMK&#Qq!&L+45*Jt)S`8_V zd7$+1mj0?O4`J_T ze-b{{KL5gc??CQ9_v&tW7v6N0y8mz`{I9ZpSNPss{BJ$%+$J9!dS25@$A%`|%g^e& zyc)b*fv&t#%oID3xyAF8Z!h`grGDcxJX<+UeL&RrYcr=sJOy7Xj)S}OGxs3#$9w=; zpM3A^A*|2iTW``>7SH z6X0E8E7pg|W9%9>Kii7nd(3+@X>(1T0Pw$9pTg}=MEPERAh+okXg)yuBJu$i??LwG z*xvijy!~08v&`quX!2i~?8zyD)f3NwqJis~c>d^L$#hkx=1 za;g6@JpA4N6;4t|{m#$*Jn8^$$1Z!@r(P$w|F?L5}Ad`y-dz^xGeY z4PXkj0jF(wB;~4{X5{kI@_%3a|H=1r6|E(@{}#PxgsXZ@#pfTt zescb*2WU5Je*CY7R^3a!f4&=BO5WeKp%t}(n)aSf{eXGoAy^;(bN_p3Akl-gA&p2Y z(u}kt4M|JVl(N4xCap2 zYvnb$p?SC%{#Wb=_w%|FBct4JYdbbH_{1%Zn_PBF<4c=O3++ET>#V-Z#eSP|al-#q z`r0SC{*%b}HBI?n?APbc=CRnnig_PO{UV*|i_@jqd| zz1S}gU=zc|{#^WzxX+vt{)_vLpYY#n!Ydrh{wnci3cd-So|0JU6;LB@3{&8r-1DV|2-D-6aI_)iPx}qUShs2 z`CBIZw~uuUnNuD9|JOKFht+?-J<9uV-%Ij7*yF?DvYY=U7yt7*f&bm`f6l>wbpRJ$ zc72OA_kS*&{4RR`Z)ZBz6X;q`ehCn`iZo&%P0EedY(er+*av2Jgf^tAEyp zN537`Jn;3ff_y&<;LQuj&1XJ&-}%aX=Ij|t{@yVwk5c>Y33UI+A$MC#2V31HVgT0> zI(LnEH44x9bnr34HB5>sELK{NreyXOZ`p@063f^7~C-uXx(Aa7(zBb|dF% zPaj%Itvr0}i~|~l4qhDgcqsDuV15&;)w6d)7Vk{%-JXmsp4(z>9e98&#_r9Z{Vkp6 zHD2o&j^&t+?LEAg_w?Q#I~V8V+?=CxjdN!1uEDjqrfj|2bJm-E=U%uc?u~ooUWxx5 zCv6GM`ct3JoPWsvR}Lr*Eztd6mCtwJf72dQLd(Hrq2t7jp+!Er0Pw%h{Dbko8UtVQ z33LO^hy!dtWm9N5oa_1(g|_$x_+R^<``=3g(tp{^HTC(B-tOER@D0|`{VDD*Sj>z{|W!|nvFO|?Elb( z`4@`+*L?i!;eXVV*U10kqUVKbCfHU!5`QK)|pO}B--~JeN0O|pf>@POj)<1>qk1#)_~+usl0>h}Ka_rBSMlf(HR8FE3ROVELS=!!nI zc7PkFMjt?9pJKZ_|3Yo04e^!gNsRWs&%Yjye&g5C_J0yN>*zOrLtPc>1Ap$9_+-67 zEq3zxe)8MlHs06zT_1Rv+=1j?*}?m3<-Ozuz`t(}`TZvFjvs~&tsgPoT?;pa8wys2 zuG7|&YvvAc<37%LI@8mD1!9RZ(K6?7t_d@61gK@=j zTMuxyH#&W7`aO}=&;0Cfeph=w*Eoh_Ii_RR-iLcC`^Pyj7w6>MoTGD1^NxG~YjI7k z%{98#xMtQK_kewHPuv^#$i3>#SnbBFul4&A@2?(Qj;?$jw9hQ`0@FjwTPmsb zw*$YwiJ`;jRnbP_f7P7YK38-rz_he5+*E!L8v-?e$E?8ifIlPuwf}ki@1X%{L7I>@ zq!DRFnvr&-p-4;6l(Z#{No&%av?mQpi_)Y%0Mh7@*M1#k|BeGDBm1|#HZ-_=NNoDP ze4xuGLdOXquSapj|61(7dc-;Pt{8H`J1!^I|6~2%d$!*rQO2*q|6Kilt?nQE7x!zi zUtR$G7x!&qnz;X_hR#GB{!93ua6jq)#eDHU+U+?uw|0{K?GyGV{1^Mr#DDz)Z1Mu) zerienPr85g0B7QViuJdTzrBV2Kk*i4%K!2TN%ya=U;K}?gvI^T*rSB~@&RY+{>5yu z-!>E9z+C*-4=~C7X%6xZ3IFXA_S-v_I*B^`e|!8n+s{?q`2Y3(zZ3jF_cHYVAK`si z;|CDqpVf)_UX%xDKQZLV1H9|Hmhbv-j}I@}`*b+?D!J6Z{_Akh*M1$}%R8U>dD!~c zPs93$%+LO9Vy|A0IoJ=p{GZ{jFTo$Y^4oCxXWj@)iQk^J;|X;9#NS}^H3#s(`MV!P5=-ygRaZw;5aikI(+*IiBk^Uh5c+6~|<3 z@8P|?r}uUa&c!)7x30`F7ysiLSc_|NZLU#0L0YqW;9j^V?u~ooUb$zf){pZ4RsE>d zi!VTjaT_w(AMC%PJNo{D4WZSDs&MsyV)Q3_<9}rSgO7J1zaM#kZp0^{<5bR}2H;Kb z9{$Jv*Z$}J_woVKf;1s*NF&mUG$ZXuL(-BoWqyBYOj?uXq&;a+9zmLvHl@-1U-*wO z|Mo}1JDN1@mG=&KT=BmNu`lnvwsp*R)ov_wj;|~7e=YvE8WZY&pw|b*|FiuL(dRGI z-y<)7l2|!p#`VP3CA+(^jIps+@xRsv@B}^r>eq?Ov+28Mi}o_GuCk_!wAC6_e;vwq*m|rJriN{Fy-Oe2J`_FB=UIO=D{*TP}ADcmp1z;@W z7@}^1-k81^;~#VVV3)u9bc;2CKbhG#s^Dje527EyW|4dsBd|2)1E<74eW`iTGA!G5rO3cae)Yszs+IO+< zY2VxT{Oj*y9`rNlb%>mJ z_mLy`iBPiVQ(-PX;PL}wtBJFt9$bHN()KJyuaE8jhDqxGGaZ0@K(|^QzzK2#os9Bq z_c`Eh(Kh_q_SfhI@T*4#?N5F^?c#lra|c$y6Ob!M|G7>xw<0TBpBDU|La*JQb|bp@ zo59vTrQ|SLh@8KKdO%C>MV8->ErQ&-=m~n_U!Tud>f~=(VO-!b@cU4V!T0wYCaq(= ztHTZW#a};x{*2G@H@@>+T-32mAK>`zu`S_$F7|8d zx7FeQ+ha`~7XRbzPrHlfgmaAt_z0~-L5Ba=*5p9R)d5`6>x1@9)&K6k7K^ zYi^a@&;KlJds12K8!>0kvXifd4f+5hqo}v_9NR8(uvQ&=HTv0%Kqo(G{r$*z7&M(+-iu!)Uwy&e6Ry8?wSCdDF?+0Qx?o+1j z96x~R>!a=e8ub6#0Xj{q1`{)X`^>lgPGa7uH#@01+%$a?@-*>yi^wrg->cL(KYioL zcT29Ee)!LI2OIT|y9qt{wc`K8YGT*chHI&v*JX8}{$5{du16GrUt_;3$~iu=sGSnX6y0Hw;@s9oCj zXo~k{%zE^JG1s>4H+O3oVcdc1Xk2?6YY*HV@2&UPd+j~<-a7}J3(g7WhI7Q6Ea!}K zC(R@0lyl2D=3KK+lylEH=v?%D&dmql)$;xKhF0zREC}|zZbiR~E9xdj_E*pE6dJG3 z%=MV>w~|~}bpP@>-DH13?UJ@1^>0=3{geNn_%Bao|E2h^9T0l}as9~#i2Q_&7yJLo z7Kqy{`?Ue&f9kuJ_^%C+`0xIj{eF4JNbJ9u|B?M!|3C3R`Ty=C=?IDYX`9Rb#D9JN zOZop%3&`?6=>W+tNOpiezl=^>`R}pa8WYH6zn@L~--8X{kok%K`uvIe$^V!6j>Lc2 ze<}X^n)}!PKlx%y{Qsl=A8OhEhhtB)ZC`eEVa438VbpaYj)rB0VVoKO{m|!73+UFK zKs_f{6kIjDz7}oZ_UC>Q9{jfcmTLpyqrCRZaO(>{54WR7-tpC6@SFT+F>lM?>bqY1 z%lP;RdEDmkS@(7w^|qTnMXwtCdDrTje&g9NVfFDaY2C^Acn;d|V)_Hi{8i)wth^0h zp5gOltOc-`I>1HzeLnepGpQFJzwwSR{Cafh>znY4&(IG59~6H!u3t;|(ciaI4~Nb^6+0lt|F@opedoexbpH`>bHr-;)~!ArM&Xl>-$*S1 zx$^qoGpLuFa}zQ7BhN6Ng}V=ve{h~ye`al+S>)?YCvLA!Kb_wB9IWr&&6}{+&o9m)pPdT<27(C zUX#~0o@r@H_Fl@;e%apD+JY&maB&L5q&k+xI-Rdk69FSF^U?=IHy^ zvd&)}bpTVgP?xdyu`porTGswq8)~lJL+<1~VLa#Du=*7JoA}PSx885>wfEe|&H?9w zbHcgd9C5BVXUzX|4n^+s*tz8#bFMk(oO{ke=c04+e)0oPViy!ukL{mV&}F?j|KW1_ zUUnQdBJ?KT#aP$qY_Cgg-fDVZb*>*-&~sdELD7Wj>0LhBdOv@+9gsa)WS1;{;9dk@%@wkFZcERFU9}l|I7ZA1DO1N`S0VT|6hv#`v3CZk^J+- z|K$HC_NT48Rv`t#Syw~qf+)w+L{c0vHeEM+s)bc%kwBO@^PP2Pl)nj@| zA^A>`|07o9%l~Kt%-Ei>0kZthyL`x)Hr*yvub{8~eQ*D5)MFnaC)@vxJITqq`wiA$ zVfgsWSN|gBZ=1t?ivQn(kG@AAA9~cH$*b*dI?q~qcf3fF6;_yg&XfhZ@_Ng z@z@P_$1#hZdCQLDf76p^E;)L0)zhu3+X_>S8Nl69XxzrR>#yDyc|T~@_Eu3C|`*2_G(|vmkkL58vw&#$}$8+->J=e^6-W9LGYl*f1*XA{PtzNU&?swpK z;dkP9<99S--KU#t{$;=Q|AVe(jh|I#@cqgA8^5$o_TcmO2 zEumW9fBue8#rsBY{dA@tk^AF4_1=1qz1QAz@4a)tx!{~|Za7DrE6y3`j&sQ2oVs|P zIrp4{#s-{|r@r!&FmlcfA)mE;Lt*ipj%TIlNHT|^CPTJb<@GSgKqgnUoy-oDzk+WxB%k&AhKT^u! zkL<@6_4|>nr_trz%3w$8>u+9PJSXxId~6IrUZ4F2ERQ(>e-<7@<9De4yB4tH+&h0A z9--&rlkng7COacj3uym<|B~T;*3Z^2*5BUAz8&@!%JdmlMf$Sz5edY{i!e$|4}x~ zB)4xK`QS^NSpW9)v-H>}m;VHLZVcIPkN;Jy4ZrLp{dUP$pS|ZZ@b3-5K@=yR+P% zyp+$Z1>)SNY)3)KdTf&6RtW|s1o&zt?OYch@HqfCl_YY z3va~ArqD<)oFNO~DE@!l^eyRwF2(B_ue_+TyRdrxxpN9uK4@y+;I*$mz-11E$5hX%{eFYorC5EKJcyo zGi7M#%|2?`o;GT-5VN{@BjPwpO;U$ zHbBzOQ@mg9pF{t6w z{EzxWIwx#^T>eKpfb+=Zzczr}znK5Y2JrmSIr{m?R{r1Rze9T_*9MUJiT~OFGC$P< zc>O1zN3)0Rxg*s(XahuDBl~xI87BTacM|{8``sq~>$@lZ%YOHtY6+4q5^aDi_s_gx zUPdM-BkeB}U-$;cG1XWQPCI2Cye! z4*&BmA37?J8tRS2YajbzCMWwd-}-OS??1zDjGFBJ$G#QU?Ok=-m%~k;eJ9+)|HkoW zGV$8u{05xBN3+I%&7Cjv+fTgu2K-xc_$HIfH)X?ZJik5qiHp$pV=tOx^vr=D*EBuG znmgzR^oLt>*H^-|Cs_~gD1GeE_@}_KM)JvqE~nS*s^ekY4fvOEedewUQBPjU8iLmx zA$M>;8alD=N&Ib+nm3=DMlSwTa^fdZXFp{dz3_;M&t?rg**O`X+t;RMM~44rI0oz7 z%Ukq;ndtC~4nG-Y!_DyzD`#$pDYT9T z^!+dP|7Cl$$N8?@CjKWIz9B9nJ5<|4%g%Zqs@RAI9%;%RXB8 z{`;B(^Sa*@3VJp+9%)BVl1pZ~Eh{V?Wh9slx=!-+5dBs8Jp`J29$p4rz}i@zNo zoI1X7tB!>6^Y16|+9cxX@^S*P>~S}c7YJk3(i>$ie)qWb_Jn$PDa-5Wc{h-p`Pzx=Lp9v58onaG@33oIU;Ny^`I_(bGx4+R!+p6=_w6w} zmdEtio`dHSV-}p7=jge5&hgy22Cv0y^4h#cuhnZ#*B`$Nz7xNjp-Ya3npwM>ZGf7Y zyCUz$ZoDVP{0GtJ$72n-dT$swbsdlIW<3D%8mDg{FJN7$qAp+%{2#gg_89k{2j9Jy z-c#?b_t<;wJ@?)_2b>Ge3Fn4$#JOUQpL54Ki`0#D9H%`Ja0Ern-Lp{$vAOivOOIHh|+4{(toO`Cb$M z%~MEu|G$m@vOkS-R_B zAO6RB;jHhU{QndKa2uJAzNGK34WK@eY=EdSq`X1+uMUvw_oorXTvkcjIsREzkcfYLquW@%`B6e-(A+OOMej z59X)?kB154t~(4Dj)$rA_M1iD-g(plEXMC&b_;9K!T)8ao}kz6ml?(dSXU1XV97Ch z>Qle3uRjGpR_>2ldn>VkqhZK0a_Ma7HKabrGS+p+< znZKL-KJ)yx#8EeWbEuiLE>w@bF7zF_yr5#(lD2&YU(>#vHJ2`aUNLNOyS^ir75ZL3 z<7d-;+^75Y7`exc=fLqjC(q4u^jtk>?EtUAYw?<5{UFyEua#@|+WijvF8oer(kpoA zvfDqv|Jqr5s2w~PhH{`JHrd|W&AdV2h94+H1W3wYWF*7RLZuRr4jtOZEE-+1!= z$75%B551S(Q}3DcKQg z=iz1(as6}e{H9sQ_jwxf|KyA0Ria1u*khPmk;a4X{R8i%FX7i&3y{YT{t)&vJpS3Y z(J)}TBgP`Qk22i9xjjNW{R|q2L;L2)SMc%CKaS96D6-dc%f=%1K1MAcHG(J6f0AbJ zRxQCCyQC@PKK3>9{!{Ir=Mc4hKIdnBY=59_555t{rhDoAe=bw|Z~ot2Y?NlMb1vFm z=fC;)k?(FDp0}g)o+53}w&s!e1F#3}+2ciZrkTn6VjmnO^$=lxV z2T-%PU0%nLL-N}7pVFqws6jVfcs=@JcYKweY%l(T^?QF1w%q^qu;Ej$hK=_y&b<=0 z(97k>li$y10Qht_^LX?5*ZAG1&+L)RdU&(p!-O?WumKxj)iJbTVgdNLvU(Bqev9${ z7apX4?oAKG?UG}xhuidMv8|M$?HSSgf(z~72ID|SkVag>#x3|e9(f9 zrTyo1Dd{)6N9o`N9m@vJ>(cz3$7MqncBp7bcEGB*5BKFhiMp23f0rMXZ`Bu+gX{_YCM+u)G=FcXnYg^5R=WV7zmB{=d;E^vz_GC>AQwKN)Pv>ts8S)FR+?tnf-XFfd z{I}-6C%yiv$Zgg4PkpY6Cssw@|0;T0RxK<1eg1Erf9JnO9wz_aZ7%;4`|SlJ<73ZX zYX7tWVlRN`uV-ukStDB$`?UpR{()!6-(#yCAp0Zt(Wx)yzczr}mtSd{%YW?v`G4Ox z|E_t+{apUXxImWwo`>we4?89CKeO))|9zbJ@7CDA>_2S2Ue*Rk{FnVcmb2Ob4tbn- zpSChz|J(D9_6o;H{MQz^6#t_wfE}PMkoYhA9oiw<07-Yr<^S2Y{x-7zEHxOH;=eXP z3;$bK|NHzs`LK^QtMkr~-vbRGHwKV2fZ2OPUj3>Nx=*eMSJjWqYd>(pSYo@kzeJAg z^S>l!`!oJ`-ig1{>*&?D_UucMx#r*b+rInZKMDuG@Ltq(UF+AJJZrs{;Q!6v3ybIj zJ7Enyambq+x%_w-v+A}maXst&(KBxLF8b!8*H0%`ZRU=9W1l~5fvb-^!sj208u9|z zZr)$b!rh^gUbD4m=EGN=KiW1Y1GXPTYNP7w}TcQqz}(+_@?*Me}>-r#0IRb zn{2KhJ#?mQCx;IH$2>an>8FrqH$lCfweAMf^L`Lc<){xi|_XK=jftc8QWUJIvd z#;*=lW3v8!miuLc=XdH|H@io1?aZQ*+F3o_cCVUN+Ov9US#izGBA*x6&L}Rao71h7 z_m*QTXfvo0xG(qVzT+`G7RU71o`dJ&IeBiLqvtx=bM{)i2Cs!{^4h#cuhnbz+Wijv zF8a@7T|esiQ_sI@^8d{FAG;~D2B3a@9q(&gbw{Y3a((DOojeA5{%Qvd6dUdDUMz4ab@uf6Bqd*^_2!8xJc?;LTiIA@$Y+HKAy=ae>p zbIiHsoOABoc-QlxbzA!U;QN1o|5pwgANk*Z(Upn)p=wUI{7$0=<+p2SY*n$OZQJ6- z?LO@Pp?__E_rU+-FaLRDc4B|B1)>%}4PIiu{MYA~`)TWIr{IhuvWD7#WCO_m)LY=f zcj(pcz;{pk*A|fT@B984{`=bLH#7NxGC%qMY5?*-<`%N`abo|IKO-ODz4!h9qys$i zqkp<2|MmTo|F7Sl_%Hi&hs>A#X~@~c;<$zNiT#QBxzA;Htoviz?8~zc_hWxxeSaUP zHG+N{|NX4CK=S(|`~5!g{bNod`*17slmGAc-NOGC{{L(L|DS}v_3yx1fWz^ZQaymR z0Imx(lX}2O8$;+jyGQ8CnkttM9&2BqEqA>Ve~z z!x`4IKl!Dw?#>s&_6uK&n(pq0{wVf%u}A+Be7{AkM>`vTaVoiM<5p9vb}c#c*EWTb z_@!frZBN;F7qRN|aZD#q%`s!!J*-=QKWoUaJ}$n$dE`^D4+dVdKUB@e7e^-_vFer> z=a&7hr8|loxj_pK(67e+JLDRmk^1)SV^wjjP0zSw~anQTge;5 z9%)=cznfXxBJcal;5fEM7R%#)lQ)FEqgUkX!}l4w=*qG|aDM>YubE!bt7>vZkIIQv zJ>B-5RN1{^dP%p6Ddj%)HUD13`$~9!Z$4KxbYX`+!>(yxF??wo_vyYpMjSKPW{G3o}=gLIeYG2L$m|9Ca=wF^jf`Uuifv!@51jSuJtn`lk;!ff5;MSv9))Ffr}2| z*Y6-UK=1zr`$M0x*R~#n9?+k7e}8KIhb=Kj0efNQI`oHAVa%2X$Qe8w@16J1d+9y( z-g=L{*WPpQy>q~RKh6pDe&>jD#W~~LaSl0`oKwy%=a_R%8{pUzKM4cIEGx9uKjdAp zJrs6d9op0HzccGw_F$dA8nmpW`@8MZ(3pQ!-Nd{OgU8P3a`5*ar#HYFQ4Udz2ezy*}pGMRGa`b=q zq3@sgAGc`#$p%mhNVx%NoA}?X17!7y6bF#|x%}7fHwK^$AaDH+BEv7z|C0tF>vMUZ z(JL~q`BA} zmUC>eRW3CLmKQGU(7u!$sT}^tT7W5=Ss#er0KN|YL)-pS@~&uT97gY#Z4bOnKFu4k zXWww#aRSJ2mY>9Nqbn6+hK$Aq=FXZTOAnwcLM#FcL(evOVjgLv~4w1URvO|dWS zKy>j2YUsz)_h#NcV+Rl6kDkH*N4tl2Be5$ckUKxw9DuFo*)KVP_{!55)3;rS?3}U9 zT!Bv$yQXK(272dQe>x1i`d}CUcV%v3f9>=wp=RnPdg84QmFWHD4NKaVqUDzinAKCB z_pFxp6RUbujPKVyJ35z*sq0=nqgV| zg#lOZMl0A6?_Ioy+)MAN_ttytz4o4a@0|nA1?R-h&ybhJ9C5BVXPi6EA?K2F%DH7< zNavb!ZqC*-p`caI>mvVUf6VuX{~a0|LM?v(z@=@P`CrDGm+-%!)6h}*orjIM)ZG85 zUpw>0FT(-n)*WGbk_zt}`;r%({@NQ4P@^k#x-^Ahm(>gt;-}tlU$I<4<<{)I)^&R$2ULo(# z%~RBNP-pPC=G@C@A6x&Q#)WUQ7Qow_GsE|uhK~oHMpMs@rsrX!F$ISGe~d@O>(GW_ zU$GXDe7a1|{`WGu4X>ar<_!A_`Q8*?IQ*2n#eQJxknw5A_mo%Ay!`^_!`MmwpWD<& z&|X45j%x~GdmMR|dea)`Oz`e*Cz{wg`zZ{nYQJM4Sx z`(gKIza4Ho|3>WV;&1$V`uW~KpSO+v#-DjEth$|CzB}0B<1HgMec^$}@ej|3vFgS6 zjg4@6cx1kU z#>BM?j1NqQdm~rUk7xM_E`uJl9A^YvGWI==nE6CB>!~tx>jh#B)X&4w3Fg%EzR@d* zk6+7vS^L(!H+^uq+i%LoP&ILFsF3@kmKT%_hyBFx)$)5*O{(lsIib3{Bg=iCJG#LC zB6Rs%X^sYq*Fh4*W06n36#L_n9Y6~38V|wgphj1>Q zll_B-FFhK@aE;ml6V_tia1CCI*W|T%jb3Yv_jB!j2Yweri~-ChuAlY)ee8E7Yso)ru!5LQ}^EIQO=Czy~!5*`J1gi!uGIR^emW?}*&y z?=n9P?Ev|h%m2uHxUUT$-(`O6{g<@^+>hh%v*!KN3n06GLCR~C{bz_nq~UvIa_Tdf zxSwo*#D2F?>qk>a?2nrM7c%^J4Ipg*neREp*amh)T1OzVpIAfU|HIq^N7DNf=M(?k zUii-6xA31jmw)Sjpylr$@9$`1n^i##AjSc5_)jyM09-%7e|3O@_6?1dgQu1)JNZT8 zv#i_q8G3Gg{(E8HqpaKa$a_5hqp<$&moxo*PiKDX?c=lTmZ#|N^9;ZFuh9GLt+4j) zH}D6)jDPq*7!Pwt!Q|mf;0No?4|iNm4LrT(N5bwgR-XK7clWzJCvOfC^#(#084b21@$PC@vi^w`=L( zg&oR-%4UF4b{(edPa0*0LBzzDi<$yXslt^4h5rI_&;~{YL3y z-%fwbT>ht=av7cce|`VNbD6IH?}*&ZY5>s&fc?1|fXvtLPs4pC_G<^kb$aD~cEp^6 zoESv%{q_HSEc1<1#9je0evt9i6Sq&l%sz8$0Qs-q@8{xx{c=5*|G64K+Rw%O*A9p_ z0Q^t25!wL0U-swv|4GA_@6qRn{caQgeXllv`2&9cazEGqPd$ZGKjCBp$n@sk$Nvid z_5B_4|E#tN$7x~Q$D462_vhcfKP$TK3vJt$U7d#w5XW%hti#Y#>#+kEc|C{MJ6c^f za6(>Q!QsaFH{j>L7s zfdO05csHIWR&e{v`00<4^GB|ox->E4MqY6a`lIq;=Na2$K})=u3N`k}w~9ls{@8ND);kGQsVS>xh%W#sCaw_i4p zm_4lSU6bLtEYIbBhW%svcdr;%ThwoAS-(*$LlwGy1$hF!`_JiS9$?SPDdoKwJ<2Cm z_3D$c14@V!l-ADaRyKh80O|*{G2$^fwswGVfvSn?VqC!3#9(Uj8i~J;(pJI-7;_yp zi*SA*F@CQx_nQ3ZID z=ua>h4Pb;C%RD|aW@($@OIYiVdsb(CBJ~0zyf5(IxW5{T_tbmqJ@#J5d(ORg4mcNb z=Z15|Ipf@M4mp>cQ_ig$$N`+Z;dtoSt?!&Rg`GDPHnF>ALM^xzdC?_*YB78 z*7iB%ezFzf7XGXIYX`WM`N{WJ2T=b{F@VH>&)1>`z zkMFw2dmf>u|Gk-Yc|Beebq}Xse*Zjt?G(=)DZk%7e=&BTPLPh5jsGVNz^(a~=31us zMC#Y9h7)@?velOQILxz_bNKjj^^XA`rtb!G1<32(0ta@G z^S%B4Z}9p{^yy=LKi0i9Uw;BxeFMxNJatA`9IK?p624qcu>XFxlN_3VI zGz9nAy$lT@j*K2qgf>uIMU6neSv`BxN1zP*qm=W}1}L|`kXitCfH{I{7DL&01MF`g zc2duGS2ejFsWC_B~d$DeSZ{FTc&c$p6;eSLcPoL-~c&02WWEmiuXh zGGYRZE4t6`^l|vVI|Z|H`7b*YKQla5r_b>J!S7LHmmS6fKEQtVBO}jaBcvR>l!qVL zuip=k691cX4RZJ|tM%QHqB>rmyoTdk^{P%IR39{Fa%l^c8x$j6eN3wI| zaN@sPZ2+(5$TQ!I!(PPa(ER1G+xR&8+ke;W>nH9f8$kXi8^CR1zx?-c;(mtxtZn#B z){f$PP5f_y`40Cd>&^K~v48oWxSzIaFxmi_@7b71rk>;DFwa`fp@sh+#vHh+)vys) zwP|Rq${R4bPoS4Nzq7Kxc|`xe-R}In{3BO&DPDHXj=RH-Pk$}`c5gzf-N5hox;x1Y zBsO48w|Ue6mvEnD*N$HVgmbpN`EtT8)& zBYoz!5#L4wAST_g6!znn*UL_9fMMv}>H*gL4X4h$9=6tz4_7mNEB$h|hau*(6F>0t zb!gsIa8Dgve_vm?2l{>Fzkc}mwV{$xp~jD&UW%{Zo4&EViNBW&W(-`|p#=68SI;bx z$34r*^MlddOY!%6@ro&H zZx3U!Q5wiGsAC;~%0@H>?2DfG{n`}K1}G&rAjSnIRc7)7umgw-^wti+cIjQexLs+q z12VY*)x-qMRgl?3?G?0ee;ACeQ9EN>D5ux3*IqSs%lp3njGe^&iGM7=4I7{-^qov> zWGwxCuz@Pb`|X1J{Ym`IJE({VK1ylcfl^3cT*UF_CF3yW-2`f zXYY9^-c#?b_t<;A%Upl%y*+-M3(g7WhI7QZ;+%2rIERuQuyFfbp=-&Y@tv-yo|Tv1 z>R>+nFQoRr5dFU(ul4@C!Va4Y3O+bKjQ@cTb03NQZjVdptGvbdI_FPyT=O`T1VrIt1tdvfpcPL>mAm%jKl?%V{+LKj&lp{=|Qe zllY&Gb)LM64~`7~wFC736Z;eYbJ_3Xl-HmJ;CZC=8qzjXWBGS2{(nmz;D5L|a9QZS z`trQqOA5mk+uP)I-q4zLR`NodecA&B;j)`r7vOspwB1uaWMb7SV!CR({)Vr)5g?YjN`uf-UzdVo0qJ1%^K_q{-^-e>9AL;syktkX-LpZ@=Varon-)`kHS zu>oMW46k2ATmZfgk!{4ghm!kN58E1u^*6%N5#+89fuGOQ*B)Tzsxawc|j??dNa&lbY;mP2HY=3doRNG?uBpOgZO;pvi`Ze zcgW{TwfdPw<-`T5;duXXt3v;=^vlIBA4W`K9OpNUK7@1VW3XV?g|J}f{b4?J`LkJ% zXBshzQP>89(CYho4#fP`{mlvJi9OLXs|9EWL|cIKC?W2k7EnU(#@^8mK%X!^!S$IN zV9r9!4>aeG@5-SKpcXLb8hZK8roIpM_v5u1Y?H>7carzl6l?t|C$0{C#;xSN*OLRV zI}FA?8H}H=|6h*pKY-pp_2m22p|RA?XYHa@cXO>9!Z30T#-ra%+fMBP*XBL--g=L{ z*WPpQy>Wi$f^)*T;T&_OD}`s@Zu3 z?ROT^|1UqU-R{D?E4LQrUA4tAyw$ueA11p$jD6+uzuE6cL(k>E>`MB7t_{!}o5u$5 zv3|eYPZ~hd{bj$8lkcClN&lCJj>!BR|3B&e+6%@4WWM}&r~@?n`&s^{^N&8gaRBTH zx$pDj|0i1`@jt!p@#TIRJ0E#9YX7oa{;LDXdAXm0i)y%xd!XR^*p7ENxSSPv48& zy<#30!^;wM_ueqSR6iO`y*Cdz&ybs{#H!PpagrN7(1YZxPZ1xDRl|P z1$etcFZqd)Fr>~oR91OQS`UX(}%HV$;Ed>{=*R0(Ti*8@%X~`tf|k`^2L0<_vitT z)!OyjANwhJd1wHR=l=SiqAwqF^|JMa?%!O0w-?OcgU^npXJIQN)d5C*z;pN>?=kM5 z9p_>G!yL!q<8$BSZ`q+Q@40y1iTC#MN#h7?m(T7y_WEb*W5<>U-Uxf2csH_IMr#|W z6`WG@hq;GgzmMf~^s`~{8R`m>pDk-;uj>q@Vc!79fycfXhx|9!!hS$$d-7SFfsY*?({b{7`VD1A)3dxc`<=Q?@AYo=el_x|X|ZJ>_J9`0(o>b-j& z{ASpC{*ADl-~RdZ?OSw!9==EE;eYT^>eN}29%fA2O7B|o_=Xd+9x@AG6^8d6PCs2n z75wf8$Mxd};;RlKzke{>fz-g&5vPx9=D@1DX~#zZi~3?$fKk7krib#^Wz4y)m=Yn&>x#1jft~h6$J8A(dk3Jr{RSuj`+qQgByUU7}7Zftr3cIb5 z`FZ(m_Y~w`v0e6Gme+mtRe7b09ly&w|ENDJD`JfvT$at}VY3{Ky?czrY^I^cP6%Z?*%h3*gx1*kx)2I1hRO$Yi&V{1_f)Z2%vi z=Do5%>I`gM^EdI|+Wy?!znH@abLGCneE!7$i*10_cRm;SFZboYL;gqZ!hQMg(5}!1 zko}J2d&~aBe|_}0-r(cp55oQ?kDIjtQZK;7{{!$n*#L?EvOkyq_8v|)K;pUE7<1tq zj1$QJOuis-6~3d){Y3xB>Hr`0{At;L3&;OZbD$u!-E&naWg(!R*BJ+p`+3G*$q8tc zfBBB;!mevOw&}QO;MC;>D^5NYf5Xk;y78XZ!}>d44(rdn6t2YwoW=UHQ}A=A!^gQW zVkXbWuB6tE-24gT@X3ota{c9aKloqSxFWw#1F?Cw6~kACYV3dkFn=I^>Oj`qsl%_W zG5?)h`sy*OLItcZV~yR?dUN&|=G5Wa7sEoCUxZFx1n+y{FBcI*kHZ=~MiG5?da3bO z(Zff7AHUvMzMSor8{aR3x#;pm=H+8AR5mUvtV4$wPTXNCy@?j>|7=)!>zDCw;n>}; zhTWf`x7d@eZAT5&3x65*KmJ2{+tB;u;ctiS557x(o3GRV=9SnR$No63i!%>)P9Y{R zf*glBauO?z37|X zesDSteE*@;J&sv(H@^RtPzL)ehF{aZa^%uB1Ne^h{Ris%!~3dn*aYJiw;RkF#r4En z2F#~#z-;OQuWe#YV0s9SU_GGOd+3{VYnaX&1Fo&)J@wvtkG5`M>hkXTr#(JHh~B{(al@UQ$qa#rD?J{k1PFSsKVWEnv=l68SGPlHV`;eJuBr zel7oftOk&D0GaR525>9))5z!m@AF?fAaP&cKl%T1U;cZ1u1aO&j13 z_1oNX+!njwqn-nO^F|D96FO{m=w}t80TjeMfczsNGyK{=`f2v^yA458%3VDx#E-b3t@q;S?_P(ovHNfYama*4!^V?e!Sc- zuO}xCo|mJo%lCfc$O*vbA3&~qEirC=WMA*2&ky^{V7~lU(=Rc;pL~6|AN_jxC?|Un zKaaz@yDEmU{m6X$efcW)qt^ey7=JOJD`Q{A=?6^Q5bE)f$E`dG-|nTqExGQnZ1bnT z9=5~x{a^TDIQf+f_iuUrzhDFWA{>4CPeRj||2!Oh_D{pXCw?4ufBt)6`$Ocpe}>-4 z7v2sx@V%|M^Q&m&PldU=9}E-85o{#iv6f@?8Hz2VE^(0-5H$hw1dJ1K9ojI_mWg%% zng)4}rF?(AiFYLS*OF6VKf}R%-woHE2xaK{6(d-`VEENnnD=iTVf~{0X#Qv}EFzPV+jleEL0~j`EZx}=TW-@F4O@r^=Q}3o$(t^h08maF216D#r#&SI&I7^Xt%p{_FcE|6iLyzhCxW z%KumYm;G+z$e!EpIzL)I-@@^a^Biau$gv9Tc3)0DK%2Y{oAX2K{f-bqQ(?aAu(sLP zs#S;0q-ytDxbxHD`dhvd*53AFSb6Me^4wUb7hQN1exy0#qwpDJ!3=caDfI7=2_t#U ze!une=*>rddi8ktkI!E&)8V;8#`mQ!LBFx9S#O7$Idb+Y$m8#W4_;2roj!jVL-t#* zXZ~K)^Y!)Z&!e6%I~hLK4(Q2N?sq4i-VNVAav%0beVuKLyIYIT=lc*ds2;g844Sej zj99ogOrXc$bYd0@_OsUT$!F+O>)PVq47*_ZO|bs}dcUlf`%TaA8}&3J=lQXx|1=!H z2H5w-AJdoghhg`l-w!+a>@L>2x$*wDu_eA5*UOtpUBqbm84R4hCG@3Mq0Bf1c?s$e zF(-lZj5a`43ou7f{i0`Iu95RD8Zf_;nn&#QlkNA{pZJ3L0QJjH(MM=aC>!CLL)WzL zJDT`Db&B@#8%*us0PKXa5%W9s9e-`>p^Fd2z6#aT$*+X}b@O+VTd;*(g=K{`W7nhq zvvx4Ko1^ggy_eoo@2&UPd+j~<-p4t>TyRb}H=HBR73a(X^pmn-(@Wa6?XfDuer(MG z@=xvc3;Xk}`=mH!vMkA9HGd&UpwIRJ;xeOci0|M#-7e{7Dg@W1LHA2IbBa+`7qk}i)X?Jq*^~UelyVeXOSm9Q!db-ZzMcuL~kBEb0>a1{q@JL4Sj}_laD_y-}}J%zOYy3 z_oeTR+di<+*JXbh%r7%%4o3GjZ=X26%VA9MRS&JcR{jJkS%n7sN_n9Z6*S0DU*GihDyebhir-w^5qDzFF2MlS47J!L(8|IzwkzWjIer>>!D{FYEU zWO2JndKlDFt1)ou)|kKHz4V@XZ@tIfYwx-D-Z|i0a8B53$vNU&an1~9O~JxeS8Zw4 zs`G|?YD>&7bzT(|WPJaE7<+o(_m}^_>%9Jbd|vkF>i_azR?B|5FaP7vHh}wQsojfq zK$id701g@LFy1c@Wxwop_&BZeC;!zD^xNgX?2o>DRvVE0Y6Q9b_p$l^iT^%MI)K}= ztUoC8wM}CDf_R1O*Y1%0N#jV{#N2<4|FYkq9gz6%b;ejd_J>T4aR9ct{7-g3;=kLd z*Ta4_18o5LzlZt&M>?0Jlbm}i^ZlKruFsM9FZ)kp12|%RApGC^m~oBFdVwhyz(KlF9${QA*{r*hOP*bm$F>!a?EHqCRH zUuh4UxYh3`zYXS>*_+2aK6Bsncj=$soU;!HqmOLeUe*Tajvdg$`hERnS?M;bpUZuF z`IeJU-xr&r8XIH4xHVxo+?zr_!MSJ~i*J6Mc>Qy%OZ!^bOw4+leGeb|LFE3i7x1rG zGxhMZe-`#X_0w>(+<%t!-|_X2^V-GF{hP1(-b2s)DWCnT;64uXy0*X`G=a@%0c+2_ z8f}evdmqM+zMbC4d#H^hN76h8a~9P$;&o-ODXU>bJHTt#*1;C&O$;HfA&CD!?7G`S zr9F=1Kcl?y>MQK`GjiF9FqpL$>Spf^rNifSsT{u|e=x_hui(Jh_C~Tl@Qw8RJ4v6Q z9id$N4BM>lIC>CGwpL?1b(#C3??07TfcMyY?LGJ2d#{}f&I#v+b0nh`91GpchKy;` zrrR3X?`T!nWqm99{^S>2c2j>7ytN*VZkbM8%h-=E9>#C~%Ma{1q!lR$3b|IR#U zd2b8HKdEz|Ftp!!WnRhBHhEpw`g@$|2atEvI6y0Mvs+US(7NrFTWhI*x8B^IJNDzT z4_!U6=E3BM)uRzN!k5u-#yIdu^2w~}Q}eGho)6=r&o5UPYWx+jzJfkCalpJja^L(m z*jHi>U-b3SyQ5EU4_$NjvMkgW)((iaKxP|r>9fqY&fax*GTfiv$^QHU#;p$Zu+Z*TJqMnk+;6n9`%p^fWGGBKY!&H;rPqHVy)A^;_+W#3;by~ z{AFIl7HH!6QP_U`xqtcGzxf{D>u3C|`_P6s^87EOO|bV1)K8Hgu+dyWj=ka(dH`!1 zPg;8#&4l%dsPU^(1F?p|mdL8$nw4Q!~`2Jg8euu$<6Fb?PCoZ zN!=`ZDO0C8oczV{uHT5y@4fb(d+*~MU@kZ(oEy#&=So@qoNjpqZT1zC>z|k3dVe8x zCGy{Vf8+hu|H=N#^17^VlhOH#Lu`Pk7pPO`#QJ?K z`xF1Q0rdZq?;m3TIr_gbfSr%O+N}LY8$c}q?kBq<@jq>U8~=>~B>ms(N;W`ZzJE*C zAorv8&sOfox&gLvO+EOp_Wy7B|0ypZ@qg#TZ^3qZ{=Z6&%}+DhKU>H$0D zRm}JIH;)_u>j30`US6w%g~VlB)2HRCUj1g2j#wFb@|DAU*TX3_znz?Yd8f}V!>x&r zT+jOU@;?*DCuiT+vbPt13%J=gE4pk}U$jfe34_`P_&<}f{>#u5D!9+p z)Ipe6Fo?hT_rdfcu17a$yxP7^#4Whz-h1bOb0IS)HpMwo#Ck}rFPHUg_Sxr8{>y%2 z|H0gnf=(L?==qbMPcESR4;?rCd*|>U>T~M*_kD+Yet7Bj{5yZ!yngI?7%UG{&fFO^ zfK#u*d;H-v%!5no2DyFkd#n|ljT`vfeEKuwqTlx({d=+_aXqm(trz6>%xkdNbD{n( z@&4t%`KRD``j?sE=aUWKdB@L@s~Fb>dg-Sz7a-*=dW<8_!CziK!2aFtrAE&Y>;Kp` zJx|YH;s|cF5q3WAdHfgbUTx@1KVY?hv)}mJIL^QO_t+8Y37K(1$!Z!cs**feS z>^S^1wF_+RS7`5`Kh&IRIc^Kff8TSUC=4EZWhhx{FQCN#JaV&QUm*B@g|*pj+U@Q> zU`BBteEPcCyTX83JLxC8HuNQ~Up=0>accPoQ7`YhGX3F}{rdXa_XeH69NtGwpICmG z18qO{yeEe(vsMm0Z_>Iu`1?I0_u-j7zj}W3b;;r5aqOR$cyCNUyS{F3didL`uP-)5 zKYHcp?+;;}yWw+phDp~Q5A%22OP`+4h3if|6E@%bX4w76cgWL|`P%+J4u|0J3Algi z)xUxLe;xU(7O;nYHa9)~$MJoKpZQrh{H33U{a^fHjO`!7R=D`NfAclp>%RT0cEG+T zei9C02ONF=FFDSySS$WFF)py5oWh--`!0iZmeC(>q)+~uJ6{Tm4}Ct&WWB>NOAcbc zkSB;9&>Q>6T)>R~KcQOwcgYSPcjNnsngHKR<*4NagYety?5%Xo5!MJ;A4<>!N*Wh- zsGN8mJpwm|%CYnWno6D@{2v0(`_J0Xx;)q#1F*-)&$Q1{>OHJY*Pq(OI{Gwd2Y9c& z=iYngfOEk);oRs=pMrK>D&}XnZ*K|gN#>KbfVm|BTOgzT7aUdxum-g)`qS@w-v6%0 zlhram@jsIXi0_@Pu{-6OK=|km*`LdQ*{>ZSi{*aO|J`S@33B=0tpCGr8SeY!v&>KI z_qdnh|2O`7mi^=pB=)&u`QlgrjG`u*nmtLc-!XHQ$WVqd%7 z_~!Pz&-nV(?3uS;k8~H+6nx1LkxqA2h#H1sXyX zHbxD-aq1>ew~oI*a^apZVfm3TWBuuH&A!is)vQUs`TXl)H$CbOKJ}w;Gxa_PpZZC- zi8%kwr+EaUK__8M*9_LAE^a&VV$Bhk{u9pA^Dza&}oLRzB`ms4^YxTTwuhaE6Ycr zyNsqU0C9l+vs`PK^#E4h5vnI_45it%5sJx0ETvabU*b2llj%7)k^YVJ8rHVc4(P{Y z@45HhIpADyP7Iy5J9McSHOLzOOnqO5|FU0SKk}a%(-5!&(3$KzVa;i2-r%vHr2iSu zRR-(#Ck;TJ>i6gJU%x*MIV*Qvhu4vO@m&6=emcnp&`xM(zxjWBK8?hGZGii}4MX9- zzW-xCr>6iz4IugdZsUIBC^m<~{mA;nf4A;4^({!xeJzc||K$Jc`zQZj4Ipvft#&}l z1CYsT0CM^4*E2l_-6r-Y{-5T5%pv<7vfq*H0NF41b9I1AX#mN-NPfTUcgXzY`}=q& zet^Dz^8d8~v`Ic`bFt-oTWpqp?;NNI4UN_TUWEqG7CS)Z=SMrh-{`!f#%T55)Bwtf zEjN;9K5D_}qu5MOPZzucV&OZP`$2_08YwPfmLc^?Lmn)#mTR{7UQg z7=6gum-&hJr4y^VGMfEZ^?hUcFux?reAnvh1M@5C`CCn2+!}p-`r{8G&wUv2{gDfH zNAAzO;r6g_m-XmhjO*0ydE{H+5dZHtfBEN(KMBX4{|h*r(erP?7rzA#H@*0mW1aER?u-h2FoKj-g%5l+1H3w(R{kH5a_v)?6GKwtlZ&;6UP`Ciu-_p{m>2cEJn z@CVcd{s1lD$1#R*l$gMYmw$~N@SCVTXop0*Bi0;b^n+~=eKTqnbGO|Srm$X5BRTqm z?2};r1h$p7K-5Q!2Ve(eVglp`@ZFggsU6U(mR^GO*joF>^Ju0l#z#ga^eI0%Lc^~)Od+!`@E;uJ@s4uX8v`m-r z^4(m2`%H$c4v_wqS$`^HYyNxZ?jQ1ViT}~>M+Z;~Nc?xJ|KF_pV+SPuCw{w?{f@+Y zHFSq|fa6m9_qfUbm;3TRvY*HDKaETA-_Pap-*Za-e%kt4vH{fmWq;BDqVJ#lf9-%={ekgrjDKAeHZfCy7WfRHn&a9KXQL+SrK_{MR4DkzT7XbBd$+exw=tbpFVx` z!yht*{`~Z@8MSbC7{Barn6~a#wEla-a@M0?cgI)4&IjKnAK%|4w0it_|K|_s&%^p- z^zb?PRkiqEle70%#O>ibHo>8%f6gGj5Bv4wPrUexa4UJmx4c3O|2gaf;syKA2J8uN z@pJ#?YrfadBpblj4&i4U#11enupb-XAji@7Zz3jsQT#2kYc$T#5J z_dHIn0I`8(M;;HeZX_ z(SXUZrk{RNuH_S1ujU_z{(hT%1?m9N|5slsINX+=zkkTN|GOOf!h0D%UY7g#^qZM= zfMlDG&H0b^!Mm9}z{o-J;LU|M7w|N7ZMj1RpMtp#*{Y_Hc`#1?>k9e#SwgTx2IUgI1TwN^UWztTkR*u-YAb}No&He znVazU=~2JzP?)y%RG7EzT)6h|=OXvF-v1_y{x0k%X3vPe_ZQ9K`x$X}`iT&O&-mTH z3dhOy^R=75OmC29>|O4j`A=>G%IOXPn&dHh2cH3fSN+B>n8b{b&1$uJ$X+L;xE0-*Bt0t zMVYmWOY5eWv_d0_a|Qq37=ONfrD1+%WMWFj{Iw0-I>##MNBK$p%}D%DJ@sY&2L`@# zF8?#kH}5Y~8<*IxU+v?>{m4%EpZxV`U*NmDz3*Loe%PP*f0F!yG_(V>0TTb8`_=pW z*AB23fZR_*{>%N;2QbzsVyh(n%gDrkYwptP>(0Fx`F}tyK0EaDKfr$DAzALbjs8B| zSF1RO_V0+_4Zixt{MQDE^>|tSA9)gA9sVE44*Bmm{G@9RasIGBjidpn@5}wf|1DYe z%l~8p$p2&m#QZg z$Z-D<>(a6o?NAry_@fM{3UYoVee6L z`H#>a%=~{ffTQ@_jw3w28RkYi0{{I8@dFutfIPq5!~p)qbN=RQ#uJZzFfDWN;q787&cm!I2F#$CL>kUr5#yP+IOYE6H z4qHC`R#tTUhvxBV;vV$(!AG~hk?RcR+5wqfLK!>2zDe2vHRNc@{}HS1q)uaX zi0dSnk6{glIR@lu^or{$a9^{Jd%^z9kp1&J>HoVeA{XO|&gF}8>qj#>eSazC;e-#^*_!~o=f%KMX-vG0%hZE!X6me-OUaE_R` zL-xnmI{Z!=fLr;W*q`hF%l@Y4WHb43to4^P0NJ0b0p#*OKBf*p_CLv1TOe`Y^Ky8O z4$oU#ATl4{-yQ_H{8t0e21x98o6CQht1XcDuLhw1FY`}h=O+HE)64$T&*AesvVMOP z^IaPt`ToiOPux!$fc#H3fObHvC*-r*0Ez!{KeC_t8vTEVc1`mC<-hE2;eQJ||2@9} z|B*gp|CP3d@E>14qXB3GIQ0Li2c(9({gu6!6ycNm+b{p4Pe>pB9&$gje@1aP*x$7R z?w3s|m-mj2#S^MKl}xCPe!tp3aewpux|#2fZ>oQqxL?vA&A)DDQJ=wcy7eV*y=DaL zXFa>2)7OO&3%29;Qp3OHY{uWe{mXFwP5Ovt{PCve{~X^Mjh^R+;PJ7Sei=@__Umx! zjlY4Pe*^n}9d&=%fBZ%2eenH{@frDlp)rFzg?6gt&w~1ov|u zM>)@v*Z{Y_@oTgK>j-~DF2cLS2EM_%LthPJ7ayWt;Kop8?_}*Ubd*dDWu|vR>X8&{ zC!@VJrM#SV8DhR5HbHmm2)S?e6zHK1fh}OK!8E+TJ&iTs|M$>FFrO1UuzSV$ey$tQ znmWFGwSPv;`!~mr5$8~h0TAz}o-{LB9c+{L$*cRz{eMsXzl@fV`m>4u=dcBQ9(`Qd z?_>RKZGvnJAoD!Sel&oj{kx4C0RFEwfb37UK+*sb|7E{+K&}mt{C|D^4-B~P=ac_0 z{}cOtoNN`@?|CNwzc~)TYrcLl|5N{;q_?~EoaKKSN&nCF|7Cx&0eq~_pY;D+{^$Dt z+5pA@9BKlW;(xLOK ztyWg^SGz5wZoA!O^a!>vzm@ zzhm+Eei`-)F#O20mKuYcW|!wImQ>vL5w460BR2Yjq}0xKlzF=3OWBPu7!92 zaRY4t;|5LG61Tni>u~#9UY8n%+QrY}TD!BT8ytV_kuZo_j0&`w64yc0wlc56K|CO? zgTUix2V~;|v9{1S0ng3BjJX=v0^P6+x^Z8%>C|+(V;6K|4s=DM>FTy}Qf2G*UDh}2 z{`mCvm1@m;KCM_|s(}8I?eluAY*)~Ib^C%Is}ldUG27*LTk}c&ZF%sI)wBO8=JU%t znVmag3|}3eHGquc%h=|e_-r5khw1H`cy{_lxM>XgSz_`G_vx^gfZIoYq#j`Yfc`4E zd0Bry>Hfyy)e&U8!?l1?{($QNMcaYg#Ps*m7v=wZ4DAdV?|xj%&tAuAr1P=I&$YLZ z13(>~?@gnLIK4wXL!bW~c1{}6{-H;YeR|S3{Sx*!`8jUw)vM2L4qzI7FHKLO=Vgb- zb9ip9Nu+&Z&AvnZ-_JXe|8FnPG~(YL=XXLcn0z^$Lx7BZjllRPI|&iy|Jt3T}f zT$Mk1V7~o;VZD8S?f>hztW}Ry9j>aG-o0e>z}RoUnmj)9zhHj1stosKgN*1*jK34U zeFyyf4*2^Wi^lisSgilA_AmFRlt=EX@v|R!Upf#!f9UKU6+?;f(=)Db16n_IYBi&m zv>h;!UbWNLhY?rr3X|3x4-59N7SXLwXKH!yuVv{`b$j)Fe0JmX`r791H{th3pZ|4z zesb*Lsk-`c+4}Nd5|_`6lUW-;4Iu6d4d5^_cYW@?`2F_m-TCl)9TYG0@cXs^T=LyR-1J7h=J1~4bl+{C0=97C%( z%zF-!J8*#d1alfskrQyo*M7tJ8@NL50Q!RY0V|rG2vgUdCP!jhs3lj!{>LTw?6J3! z{SzFpzE`pd(iZkdO$KeoT8xyF*%e!@i-Y`4N7Qz-^Z4AA-G_~6%UaT|DV6c{vzmXl zmNeD@paEzDbZbSPX+h8HIu@2)eR+QO)%^-TIsJZr+y9$3fLyeuFY!Lv0L^RvVgo$# z<9}>sf3gG4Q)BN){Ey7f@?Q?6{<>}x{}cP&`kFStZ{z<3>H!k}wFT@AnA;!lV*bni zT>c+^mL54-{wMak{cZeD{SR~be;U0i4Y?cje^@W?BlELbymmn1{#m{QA1Ce~_#F9q z4B4;G@AhK;TemOclke|i*}v}G8}W4?AAtX9cpfeMZ(-$c`@jCr^7=pjb7l@)MIYe8 zyeqf1ac%Zi#mlqg|2_cEs+eZNe7ALduW`zm-}HIkaXQP;HZhrd5yLWcW|i*|;I z*Eg}Q+H|DRVu1~Gs ze-iG?%~P*1q78r!fCg|3A6x!g19$-b?=#0w{^RS*{WRqM)(75UUEsH=>qi^NuJO0y zp>IdKV8?^+Z+D{s-1I29$7l!#tn0(3h?+lfiJM`$$8*HkgOABU%)EvzLOwvW0r3B| zUrt6X;IDbz{(?V?c7VA9P2?cn#&7H$XaSB}xwd`O3#_M)(8668&;pKzq15cxxV{qc z8v6)YPg!h^1q?4r_CVSikBK_KOb$~GrK(F8Yu4}I-=(Y07!k*V%jvesmwwFHfzLx&K zOpJB_oKNgm!;fqK!u@0yB){7n_^1P9b?o29fBpW{UssJi`Tnxs#~!zd9y#*gaVh^l zX#m;+>G*EVQSdXKTe1TZ|Koo3v2*yJ);vo5-*VyQuUf_ z0sa4ze9!+`e*0Ulv&H^Nb6`N>xY{fEZEn+wzW+A0`I^p~4?{_2juN&{}iM>$NPko=hJ?i_3`!atFeds2v z3^fzzVLx?k7&4o_eb?*>6IUN+eV%*6O1XdU8*ubJ{Acs>shLwFm;dD1$$p2mdUw3} zn{Yc?|81|cmf5SnLOajq_~ARBKx35ox8hse%5Ra(^tn2~akK*Ye+1v#zJAu;WqJVp zAhV9|!x>F~`)A%|{hmJxH{AO*`uF39*sn($0F7W5zP^3@)CP8<5$teFEI|7}J7FL7 z0_O2$dJAOp{?Gz4?1%Tp9~f?99DwUQMn59`eq#XI05OKabv5yt{=arW)D_szabp5m zJK!|eufAaI^RlB~2(vcdO}^w|dL(QK{m}y|sq-%D##}*dfnx4&QSRXW_P}Pd z7n3y`oz30g9(VFS^Vs-KXKaFwC1dI??>1xu2^6M4z7+K(h`2i{!p` zKpbcS>i)U>_t=hqjsKDTKmOp_0In|}_nSQDbiUbKgQWk<|1|zr_}}dJqy1|OMCLOO zn{5DmZvE~|uYT=;jP~Db2k`$P|D#sVL=NKTzkuN#3?c( z>Ht~&KiTpre<0-$oPCS+0~w$6`Pg#)EnNTKnFIg)&;J~*EGSx@Pi|JLwjDRM>ri&} zl|2Sb?pQp$zDqfI`uKZY@ee!0gUVPp)6= z6HMG6#_x(+z;}6nhW|T0s|`Rd0IzE+SoePb4d5Vli+u*X2IK#-JaRuW9~}Z)#A|d! zTSx7}yg=gt=m6>(C%%fNfkt3IBXtmU1^1(tahuoo7CmUNZ_JC_^r_d#m3)+($xnp| zE1KvhxGfBzX0VDLjTQFz=|8ut>m{iRlwjXQdm!2buEj95tcUks8^HPvayjBX_r7Nz zU)8;SiY7G0odDz96z{kZ^_HZ4YbCzV}73n_6BTI_{pvNztsPh zd~Y&t&N%b7y?E%`PtJSFe{-vU9c_TD&Yt|%OzfJPwkOExC+_diHb^|uCv})tXWwA= zp}ldjzkce~pVNnkm_l|u_{W*`3A7J<{Gb{Dc?b_<3s^UxeR7U-b*N)R?f(sO5a_v= z^ns)=#9RaRV~^n`dK0-0(CRy%jpvl|{#-xDHFVQDI_Y({ht)Een=!YaxtZ~`?K$w* zTpR2A!u!3S|4tlx9;8PvW6SxM>D~Ec*h{XSBk|ttN%Vg8gj3iPX}FJ+N8sZPpL(mA z|32RN;5Re20d+yz2uFzfpCM+LhToI91(&+NEw8mO^*`zy_{ab8|Ar2Qy_XcWzH)2Z z4!xIj=`nIhmtyJxE65ciPS5f`#cKEFf^~)e=I}@6_ZnB*34gz{{yyCA3ipi_+v}$% zEGgC3Cx^ch?pHO=@6-?O*SO{!+^?Iqo_?_~f60Ept~HWV}6qBLA@w zn)%QBqYi)uuw5Mh8$fM9onS9EMdUyBMZ6~C0O$>lBWnNrCaFW1187eIN76cEz3~7w z4f6s|y@rjW#=*7v{!~+-Mxq^X{6%^Yaowk1|8?A_afprB0V|GuG1yPgdcoLFkiN~e z^zgBVawT~JQ5PUrptrUFx{bC#W*x??7N8A)|KG7_Ty2M@Q&LzuA|s{SWs$o6G-b1Hk`S_l7^5 z_%CDSj6Sy9x8F?K%6)AB*Shm@>a8dHeJt}6|8wmKndMLeNbJwp2$}T>Jf3;?a{p5N zPdY_BH`t%}FZ&b!<2h&9FaLL5cr`3IaNz^|m-C7L=JMzAUte4HYXi7mpCfVK|MlFV z9iZkf`?UemkojlH^>f7hfNUP0{Ex8(VrZ`UrwtI-{^jq<25`HH+W!NvKaE`e$Nl*o zw&ef)hx@<$kIL;2LzyYMNj$SF?HsEm()`41qZsL z;ai_?kDjjf>_G!|$o(#`z*;`*_+psJk@vDx9>6`8dv$otF*4*|?*mmJ-#LB-P^V_1ouaA#ko9UT@pAYMs(8o`pe;X^0 z@c>x|C*{7w+`f}&{rdb48F&ZmzY|^WPV(gLBu0LQID!1vKlVNHKcoHQ`(ta^k6-rh zl>M-MJ2?Q`;Qyvie?K7eOj zRv%zqfWAR$93t1@|M&ag6qqah2|wS>XS(neeBHoW1QU1;j+wh944S%(9tz#zB-R`J zFn#<#@Y(Y4Ui$pLlRg4}Pp_Z9)ej(VqaR>D#y5E%;NMxp5q$vT|2K>OCw=hsfBn%9 z{l#DX>q+tee?l(ck6&}bgg<`O>n6YUkN&DG;{g7$%DMpSN$mggeB8Uo<9Fx-#MqzM zI@SLr9w5c*NiQ$50L5qJx=3)WB&O4_yLY7_Wxb@FZOHVz8rute~SGZh}p&dWAXo3A0Tl6;=j0W z+@D7AKgIs~04e_O2k$kpU)+B#{5KDfkN`ls z74E(7!SLlfz7bA1;e(%f!-*gI_z67EPkj4l-u*W`_vP;G3uDh1`}CanwhZ@ABnFIY z^u$`Rtd7t8{@>>E`~UE-=bZSDVE=pQGxwfP4*#=%`rKG}{))))e|*GD){yTAXHdUC zq<&Qx-F!hPMbqD~>DH)|kG*kYf4rXS%-z@OcJ$J@Gx-g>17nPtE$9 z;r*`)B?}LQ>J{*lZ~~1NPzwmQtMi`$?oSv0{eSZR5&!W4z<>P!{fRpKg_*?uatyOC z!nXmV)d5B=VB-2C?u-4@GKl-ps8i&;+}8JrW_U6!oijc90q_3ks8_q5V)O&> z1K$P*WPU(DAn5|Keok;eIUnFJ{+hKU-uV8{z4kBu;aq)ySHI?sm9Ku)8>;{Kk6u6V z&%%l2ucgQI>;KnVNB;F6z3a^9`(8etzAx4U=J@~Q0}Q|cB>Z>GuqMO*qZ|OZnS6kl z3jp)w$;|_Z|6;y)n*0F2!|#gN%(j@HH~@12YW@A2=C<*FzD3TT<8<`9jQf)%{69AS z*9Xw#|BsFT#r)sJ{p$;)xIg&;#{A;HIe^$#E5`#QA0YAmj&cWy|4$r%_%H4cP*dnA z_NVwi`U1K5-`M|H{$CCtAOH0M;v8^p$J4!3IFZ2d}%l~uI2jB3PlRkJNIseG{g8Q)^9PD>(*%OKV#eQSJSi3JjEYFXg|L;C{ z=9}dCt>1gM^?Twz@&5ZyD`&lUbNjQx$(8i!tz8yI&D~7DKI->ZAE8E`HS>1RqYp0M zUOU#fHzt1E7#Zx3xovpuR({`_et_7f4`AKC_|^el8q4b&bRUBAhuiPJ`rfdJo@0yX zv9{>QeQ{eJz}UZw&-nSc7EmtlFE-Z``^UH+{GOt1{BoFxw!dQ8)e-y0EjY+pg4c#w zYi-(w%+TGm6? z4;b6EGYn~18&0d77fu>Bi`qf>fX|eL_vHBjZ-3vJZ;})6ntOkEAE*mBK`p?WKk#(JY6X9Bv>q*K(iggZ0Ql~xnJ4Hzpq`FiL5!h}hCAUT_`Woz`apXFSSOHtg?Q}ZJU)SI6FDxs zf!__^m8^Qn{xGU-WBi+c*B?l|4Ln!%ifL_tri-4buV0wU{X2G|*>(LsEyH$4bpZC; zAYZVP*W^Mpx7+y6{zK&JbJmC7J8+me0RJ63$%E-rEWC;}1u%W3)ceoT?@Z>pK}YK@ z_+G!e`#`py!SQk*6^^5T{V&u#@N07ZKf3q+uTa6jQ-!o`yU(5I=s~HojrAF z7}mHUl=SY7_33pRZ>3M~UBvVmpWh0W8{doj`6ln*WbBW=%{;%garU{1y>oNgIk8Rt zU)@{RLHK^2r{=un_!ooui?6$n=PTIHwz0oDfPCIx3^ooIla2kw=xLk21a99FCWGS> z*HJ^f;+jyp`0_Be|1#={uL#oz4u@F_uMBgVcZccq>qBitf0#05MVQdNC*}yM(FRUj zdt>AbCU4+-HryPha?Uf*3c8O*^^E#3^!pR1#dhQK4(brpBUqEr17EM7lIaxS?~V0i zek1!_#tX<3JmU*QjzG-=pKF&R;X7ORsUg(xlXAY2en7@AsC(eqO`YS^wbzHrg_nil zb1n#{Pv{Sy8{0-+U{?6Z88z?$W#k3Myy~4F9`@RQpy&VJv6j%=;D+9U|7V|JeZx1Z z35hrzcyZKG-0rt0E++OT{1^B20gU~{ ze{tU$1jl8p37D|o&xre4)B-qy`^oeL%q_(H!q*;)zJQqTejSg+|52;~l#l=V0Qvau zb~k;m6ZX5Eu-~44TGamG1EjcK?6123jX(IWMa&oXlQ91d%1s~w~z6YL0?|;v?zaOr;_SR4{ zy(fJ7w6gFfHGFURj=J!dC1eDu3-y9DgnP5jHYxqLC*zBcyV zaqXL|KfW4yK2JW|-?tcM&AZyU$O%Ml8$AHe%x>^8*1v)83$Ky)6!(7`2CmOcUqIeJ zV!zmk&tT5qdVllrGudau_8k6$)iq#tH5gtA_Lq_KH|{T8cqmL7xH{A?J{+354~32y zyF&Mb&0+rVm0?ctvQSgMB~*D?~9tntI#cw!?3o|_xw!e3+OkPAJ7NLG=tC943G!lyY(;Z8E_Qy z`E0v90Pkg=_ix!c#WU3gpb;G1x`mz#E5m73^TKC~+ruZ|1ODyoDRG_U_nm}3;3MP( zJ~-%&Z~rH123V)z&F`RA5Z~~PtV4VPy3xP*KmYcT*Qo{g%lDn~XMgdIv;X|h|KZ%X zzWPHSf6J@>>Ez$wcRu~}f4(A~v6tWVKrC0GxL(ja`I3BL=VlaOXb@mry;QpLl>ib-8S4=nd z7yH%qtB=p>riN6R-A-e3G5zv?>T{wqSsqRS)xR}NeiCNH@r zG%mg_w6|Xo<~QsMOUkx|)x$P~-cf5q-SnNIyk~zXUT`4#4Ehazhu`IQ`rYoseKo>; zG{aqp&tkgxzTnzSqtJ&B6JK*a{a}C0UEtGrZk}W01n?7L4?}#JXMBK6LwIZrfxgaM zVxkssKlV@HwS0*=lXl*3v(Esd{EGF0H7luc-QRuS?7#Y3xS+qmFO2IruH+}R&uRrl$Pda;OO&C|z z6xzC1g>AbIh9CUszMv1_eR#b5CSJ(n$nfb?D-zX56380f_xc z>*wDSb|w5b?$=Td!1zD$|89%pVt?WQQg1+G|HS_%4#3fvU;K};e~j-l{{MI3e~SMd z#eZXdEuD|&DE7zLn{8w9lmkfof8ze-0rK%bpa0K~|HXc}f8&FM`}zfm|4;ZY|L^|X zx0di<-d_{{Q~u+HydMhRUGN27tb4#`u6qCbe)_YpWX0AnXc%?iJj34#zQ?}s^mBb9 z^?WD7CP?#lzH zC1{KN2JivMNi@NQOvh)bT6_>)z%FtE8zUcZ`ox9wW$Fx{pmyWKXQB`ITseION4@$V z|K;2h%mrm!fNKa)7xK1GzW)Os8~$gXI<+heFRBaW)pNs~)}`V63oi*b-u#vDi${JH zo_gx(SB4J&pT6#kXaeM|-DcF(sVD2^`q{raYT}Ij{X2NwPdu71zvU8g zUQ67MiR+#81xodLeTVVms2zxF60%02qx`?$xAAWD2w3z>I2Mm*1wDzh{Pm37PS}4e z|6jA_@^H?q)vTktH);{pBPLB^@*m7G7=LT}tSfGL=xE$82aw`^d;e(9Z~(*$xxRjm z`UjfZ-It<)bPn@u;nf)@&_ry}b_wyjoB+K){k;9bTm#fmOZf-!-)()9W&FnEShRln zEUS}zv7XO`{T6(K7wR5}asT5_MC`xzdg|Kh`ohPF{onC^`oV(p#`&%jBbRHe|2OZ+ z_2;*D&%fB4pB(>3&wInW>Dl+bPmg>}#QouQv3_rO^M#>&{(gGms;{|~8Z&#{64&n( z^U1F>M$8BIo6+Ppt9=81vl_o=;{U|?+kfA`8;?e9AJ4`vxb7~Vi~9N2w#fyEd-KWl zFD5o#0&XrLmRbh(8}l!{@d4H|dm!Sdynn3q=Q|STuLeKX`jKy_hm$uqKRw3&Um|Z$ zpFg<&sukCQ|5t+lSHw|FufP|WI-lHs*A=0wes7pxx+(OZvn2GLz97shS`{i9cZ9LM z`=Sp}JnsPYf>(#?HPkTio%RuMAMVS2#yUWC3^^Y_|71ST$|dwMj%%?JLoLA@8koBW z-{2DcHP#;HIH#_;9zTFOfo|3s<~pA@V^#P9e!yqPp${0=zjMmY5ubrE z*6;le{MQFaxbN7{cO+iIQT!M8^)3D@{MUy__%H7317xE;kRFQouMZ&RCX1X$4*Tr` zn2-4p_rY>MW6Yjx8MTF4KK`d|{Q$9FOW))7W+5i3pnZvi2eEi zFVr)*@Vy0mf3fa?C!c&OK5y?<@4xSwFuH`C?x)G+lE<~SOHH@@{@dP1yiafbw|_9# zpPxEDasOS^@W1!dqh9?1*5dofpc>ZWX$wPUtq*1M_Mx%8K1`<;Zsu0%+IP@HFXH~U zW881N-;A}G>j!hJZ*KwHjo%ago6}e4Z`|*DnZBReK4Q{N;?pjk6JlI9`o2y$0Ap6y z>zqgYyGXnwHeLqbAJe!n`DF1iB#|4=BIe<+j_(^vM=lcZyRXlmFKIx9AYu0e}J=V`s6 zVfa9(nzk_%x9<*P@BzkjUBdq*2e9(`FbN%@-|ar!m-}?z`T*(=6BeugQ^&9fj9->J zk2tcuoO6rkXl{dZ_S~I=9{!KDkM==|HGk+SV^2VGB<4x%qhzmv%zQ8FrRb<1ka7a8 z_yP7DY%xc(8y|pcHXFT01NDzn@rUGf#`W$ABj=(Is9POQwPujsP5*WdIf0Yu9q`F9 zuX@KvhP>|W0?pZA9M^7>y+8u^;fo>3WwkFAe+fL(j82w%GG?(oz5e-<8n z^p%qfNVuP2KXG{u|I=vvuZjKo0QuOj|8Ok+TkDswKOg_~1EMd$|1tJYen5)*SKp5I z?-=~I-Y@b5;C}o+)(yb@Yf;;m$N#7JzkyywDfW*e_hO3wvyuJW3CEDLXJJ3s?s*&g zJI4P1VE#g4_fE!W#Qo7v;IoeT_%Ftb{VD!W_;2i=cmOe9>`xZC75pua!)-A?AOAC- zr4awWSQu5*yG`W2OkP|+<8yL|8bQ~;d5t<5AXVy!LR@O51w@(i~gt$NQHRArio;f~ze8{wLDs_CL=58gwe;C}qEzH^mzKHo3 z{X21EGBE@^0!vaqdv$*L0CCM*F$i2reSXq*jQjbFb!*~$r~PZd{$BKbed^+<+e_HL zkeqqq{GW;Yv%LS}>+j>)WX|83_pByftP=x|#{J-L#`)9Zm-;;MdD2>A|C>Vf>Knp% z>io^&mx%ol{||-|V)_d3zq;pOsBOM9G)&zb=8jzzI?h`dn!x`llQxENb9O}RAJw&o z9Kb>H2-o6I+!(*xeZ;;3^b~U6>H*CKL?3|Xm3erNS0BKh1 z8TWh_AAy_z+|5kptCr)hUVb=~&c8H_Y}ypgp0WgOKs(xine-K|!4D`4?>-4X@iS;a zKf!%-(uhC(XYAit-{G`D6T^gQU18C(&Edvd?g-!i;ZMS^fBonyCJ*5A?HTOnn&rj* z*2+bE0{@z3j2X0f_xt@&m+tV}H5-=mXflColdN^Pgoo?%&uy*8At` z`;7e)|DSvSIe?`9%g29X|77OWt;rYrV?Vwe_n+`z-rf9v@&gk7Cm%rUH+Qck{7JU~AFdn{tVrXQdc`2QCMe+sz%;?ApiR^u%3|104C zfy-|Q?c1zX&rGtTt>ux*7q~^FC+FZT}b}F|3E12+aJbZ zCEfc&MJMYM%-tKRrcn1++!Z=YHix$2jiCnoFPXhFjDZ6f*?uv8z+Q3ySA_|D?*zWn zeYmfw?9*I;#}Ih{d;r%TP!nj)p1A-u3u*w&1+2K`!LStk*AIy2$~k-P&Vh5`ob=!~ zsFkpu(m9^Rx=0OZ4eIGT?C9%RYAn%Drcpm2@d1eoaK2j60kpsev|P${-TQsGlkYQr zk8AyHv>IP$O@rIQ#1-fSyDkpH=^Jo18o^VF+rp>lCHRrkCxws05qC<{YuKCx;|FcI>8VAtisc{s`W1R#3!48gj9XSR43w4Fv z>?4_eLqB@JmYw7butqpG*WajKeI%OPS@KolHhGVY*uYiHkH-Gi;rqOj?#05nzPQ-@ zhnW9_|381|;qdi)z8j9*a9fzaWK$@a*b>ehF*$tljMDJ2FA(3KJmyvZd~(tM`p{`5 z^n)!6A3C!F+@DBn*APxA>k1=gt`Akzzt^%Jp4i{K8>|-_z=c+DLjHKJTJkjJe1Hu5 zT>}JMvhN*c4WAnS_+Hcl$P1YB&*J_L*1YMmcfWOg{H8PP|6y1_E`I^qH}l^EV57Nk z^?p$|2ku9$KXJ3Qa;^hxjhlJz*>DZUzQ)`2+gRI&+_pUYRQmfw?1$f;NQ`dGKYsZU z`utxL$`@Z5vA=l!fiSj@oPO`6p{N^uAH04^`<^gi?w(Lyw=RsI0PkPY8|q3|hbc3* zhtlSYj^h95j*H0~91P>(0IFCw(0xo|Uzra;O)|$2^#B}Gj~^*9b&He9P&DKn{E%2mR*HEba5D4e?b`CxF(!8r9Yfr z-X2aFGb?;M4e<#)gJn`g{uc&9P*sl+e z@L%jd7XRhkyZKD*mLn1SrbUP}9&GiY7LP^GX}S*~N9?jIn6>N7shWj$#eoqQ-FU zl=)$N&(<(&{k5SEzJK-()|rDBo_h(H0QR>M7q;$W+c*)-Xo+zn+`qBExqjmLW@`O1 zoX@b|xL@p-i#O)Ydg0m+$2IRV&fi}C-SoDN*iSE<`PTQT^C#ym@4tw+cQM$Pjp*j# z!xv-r`kTiZfA#YFcNbg?#q3e3y=rMd;oI+^ghH#iM@fy<+qd5@21bW=i_-T&BcQ8T=8-8 z=fF8xfXM^Mm8h9e)2Htxzc0S4dDQeXqTv(h8^{O5H3_*EOmo--)Zkl`%oWGzn4G6vFHPc`6)JaOnG+We`9^|KbiP1wx#%A z{Ljb!{Pgq|L2PTlm0&+|06y>NBr+``F+RYzwv*Faxq^Othh+Ky3HKf2ToL;l|H}h7zm4VqFtOk9XxvZiA9(=w zxAmT1yyEV~Kg9iB*vE_KSJ`jnaq9l8yMFLz{}I0Py&naAfJ+Y@3B5}Uzc4f|*%bzMT^}}*S6p+1b?2$$Yv1=naEa%?vEV*=;qPVmAXf|y zi2D&g%tPm}C-Te0`1ZUJ@8`Ik!~NOR0j6HKZD3A2cq8}S1@`yg&-byG@4PFhhqtF6 z_%FsSgzpyn^abPt7J-H4`{l~#@!Gn0vELduu}@4D=Q6F|9U1nc#h=Xjd^PCuCat+C zOhD^D9=%_R`^%~MF9rMM{Kfv!#J3~ccA|a5+IEFeooM{b?{{As#*+`2)UrEFtvNqT zs9G7S>bHiXx#;Eb4~DgDkA8!-1C`*v`*2_G(|vmk)&=MTs0p+;fOUb+k9CUettLN;wI|tcZ_?l-Tb0k-y-xSwEB!?1p{muoNOXuGCjs_27FGBSY&XF96 zIg+d|vGWIy!1YMJUGpWZ>4GoNgwNOPJ#gU1^c%hxy~2;#7r9@qeIsipG;g~t%(;NL zb0P4Zc-y-fOZa)|Q>jStyIe)o-O%A~LKjJ=r z^Y71v|Hl1V!vEw0#Cp0M{^#@mDfTxHkZ?bZ;(v_$!GHZD{Sj>-=Le+tU+g!gPuQPE z|L?PWfIRHi4-ohBEuZ^O_+N*N2tc4umy3uMArb+!zjj>7H=mWw(UGU-@3R;afio2fzMsSaZwI z!-69Zf<^Y#CI;O9`>@|SGY!5U{B1%9*bEQQ6peT^x81x4jX9Xnq|X4>bcp?|Yts#u z^nm-l;C|ng#Izc?W;`Lj#Zj!oCs;_HU#)!B-}lF{&ad-;{cQMNuuOatQ(e0v|J9+AoWHz(8U6mo&D$Tw!uOAEzbK4s-4TX0ZwUwnF6MH$CP#e$e7t7yKluRYJz6eh?LjmjUEB{{ zd|xlT(7?55GOqnm7&!FJuyo(;Vdb8i!>V0}!m576x@y+FOP2EKeeeL$n9s(o#+!w5yl^gBxv+fT15MXNE%@1g)kDz~#J@C?qzuKf9C(-V0dZ{~a*f8u zy=wi5MeKv4?_pjc*7?D!*P*qKHU8%Ojs2KOm$G=Jp$i+lEl zF<|_Nx!c3AIh(`K*%wmtxG4-_9F7k#3Le1tzZ{-mJlI~n7=FM1@=!?+z;S2kq}b&waO}HG{LZjG`T{xZ&-Vk|P8RbKVm{cf4_Z1nE%)C=tQuo~@gEGEca>}Q82@W* z;}5vL&pdwnuH|Q)ROJ21k-PqnyuUt(`R<7Q#QoxF%=r`d$F=<;?|*Z|-x!Bm??<2B z@yo6uJ||BP_g_NnUj)ZL3Jf3Gv<2M1Ae`HFP(Q;)C$TI$QzhPsHB!~f*Qcp^aHTYFmeF+0MrCb<(NFST8=UH2;{hD!UI^Z z;JJ8Co}1^W9w7Dx)(+lcTBzT#eK~@ zK#Kp3{WW=kj2j@wpby}Eh$S9C%vTqZO#Dx=fARwo_IoZ`!hXku_s=yN|EKwKbiXP7 zmjlSh|HK2>i#)~uasVm*Uv`AL0^)z?Mf+XXr|^EkA9$(X1ONG-{}+tU88|Q2Yx(E( z1bTt{fBjUrnb?2F9s1r6(2GQ^*N<3B=KJvX84qlISkj2A+eVJ!{p(`%%#< zYr4F+@Bz~zvM9afGa~O{6SGKJZT3y05kwaXa&j_ z9*P`*eG+5b&%QkdkHuq3#}|79##}(g14KLx&YeDhd6XXV0M4y*>|Ccg&-|~9pZNcTc`5!E_Y((@@ZXqTA3)qs`0tqF{)GR2P7WaP z|6;!JaKHYU+j-Y{2y@}tWVhQ>ty1-aep#j zi~E|#;#|o4r_YP|Vtju5A9aBGM>+mKasP4w;=kCRkN<`E|JhiOe@_;+U;cBWFChN^ z@L|>n`tGm725Ni6-F9@|E!KeN^nMX5BBp2Yqxc^&CB~ET`5O3fbaWdo84kHUj=s+R z9^-$orjvNH8;mjj?~%I(yX3Jm4gfrhIRVzh&E>%(_7VTa9zW##<;dmAjh7?#6ZgC3 zo;iQxYS-W~&YrU2ixF?9GS;jm_J@m~K@P-_n)mP8%{q8HBj!Bfnq7=So-?SPekcz*W&Ae<1$j8;n9bVE$kXTtW$cf`6NUpD}6m z4bk`T7{q>$$zzM_1aYh$v&Wut0T~C7@&Mn7=Nx;gg8vH+gY)sZ$=onUX})3(fH`z7 z6jHR~Y`kjv61$=Cm@7s&4ic(4J*lf4Se*{Xf9OaquDHh4}Fdj%Rq{dl~*mKOlZqe9rLS&&T)W z48Rg~{~h3u`agN|EIQ(&z8pcAO4@3!SVV4_6&;rKN*IzxSWSkJQ9{@2djl|IeQtnI8bwQ|F)R^2Pax`^4s*#^>N*!v9Wu zfmkzW-C)iS5dX#gg#Y%!Nj|`H;lH@A=>r%?=i|RVKwLx5m>-`&%Y4vhd;sy^zJ19L zP_r-gr!ir__#d}<)+8T5ytfCSK7i)7n4ipgKe6As*W?GZ@Sf&z*i#@M`|UO8XOkr# zAdTx>0}<>m@c;kwdo=&IU)X+W&f{amY2W|(W8vV}9tvyeHKV?~3oQ2eZ>@KSH~>aR z4j(KrpDb>-gB3Bi40asF68wbrqXvJ>=VF{`%o(wtdO~u9Vo?XadI$ekeCj4nHD1l| zU)*<{n;gFl@7*unnfE3So~`Qx_7nHpTW}7&Z|!SSzYV>g{q?|6`|XPTDb9|#Puy<| zK8aj>HQaxU{o(yf`sndPt=}kO_F?G!&aGP)&Yrp|oIVNcuUZ&RE}s{D0N=O2|2X;r zmC+lp9N)qCUmait`Tvr>{W0br1@@1ic3?DGLG=Ws^U(n;&Nu*l0FOZq!edIjM63s} zKOngZeE`qJbMoApsSC7^vTOZ#?(^^g`kj-j>5;&EMBP7{zh3+$a{yYLKdzw~{S5zE zD~S1a?pw+Aw>f%EG_PgunzflLIGQgoKLh^j!>AP_8)`) zg=fI?{|tC8{MQfA#Qc2A$A5i>g#C{C0x9-)6u)a$9FFmS!bEXjGxk3g|MTO2d4R+P z#MnEB!D4^J;v8q6Vt?^J`T*dxcq{g6Vt+E@{NIKDsozh+ef=Iy>=*Ynw-f%$1Bm~| z{#xuIl*a?4^Q~QdImh+oXZf&&d-(akhYNFhe9q}p#A^3F@_4xUyT1%OZlm8kdAS8q zM=t*22Y|sD2aGR}!~70$Kbh}o>dZ9orUSmX!<;d=5%mH57Gqyv^lYv**M_yKZ4-~M zPD~CU>i@z0h+Q$Jr3auG2i9rEzCFai>fxf^-*s;2V;6he^4pg?H-=8wuih^9-OJ&= z8a(5EF?jsatKsG4{ps;Xo_@5L-9+9Wz27;ttKt2ZvF5>o@cGhStS6jW)gSZ!_5(D} zZ?Aw#tP1Ubv3~{q{z`lHg`y5>2f+T}JFA#YEd;rg77P(D(`MXY1v(II;0A1ufdemL12LSsc{^xYjasG&#qF$0wKBbEq zK(Ci(t$v()=0C3aM;&0&a2)jk;x)`&%cvc6ondSb{=(+FL+eK3tyNzP(-&MBI+qll zn}6u%TIBiR_m9Q@xF!I2_`C35?my}|b8&l$-}CX`JV45wNACYQ_<#SO96&z)n+p*0 z#ncr0r*YuAhv53@ISBV3a{yp|!hbn{g#GFrH8EWuAo&6LvA^4L{)zvOJ^r_dFc7ed&R)5`Foi ztK^Z@kY_wVCpZ#~9KM{rTyiITu)4B{^C{ksJ^;AS>n!dEbBOaJ_JcXD@z+Wm+qxU0 z#?6>EuJ_01BljQqe!1&hZky+f_^Ie)&(*tn5(ZW_SJ`mN^tvo(Ec ziKDHrQ{O*vjkW&7`}X(;_r>1{%jx$=Ph(^FV)*$n9q|4w+rrRU8^a(tetG{dOjs1L z|I=gJ!)J>-;Q{*L1~!Lc@t-)qg5EyH{Z+>P3omC)#LK{WY6rpl5q#G$dRWNW zIM+q&#TS|f_RqVLwGx=0dCXU)mmo*NTso&w|4(gSt3H?Wo-@~DoVz>g)fl+|uIICS zfaC|{u5kyxT*uCPLfaGw*tQq0emiyhIg2rVE|zw?iJk;n8#=i(x;`YH|-)6Kn8k=BScZz%gn5SHMNYTmpW>0M<{>E61eI@1(bY+pZB9 zeTy`D&g{qUiu(ieYsG!Eecjxv`V9@l0FDFHN4md$`eJF3gW&%=Zv$umr)#9{cj(6X+N8pb6|k z7oe_8>wvqDM%;fC`@xe~2WW2@`0Hl++cg=-+W(*5s@B4L?Zl+re217Hjs5w1SML}5 z+7jbt*pIKlGeYc-Ie+j_?4Oy#{yKWl)orHM5A2@`?=S9808^{c-A}OpUbJg6&HqyC z{fPbNXPUoJ#_Mx76W^oxL+gJ!dcRZP{690cgSBp3!)M2K#`j`PKQVq;ADTY+{_)iQ z>jS6*)F&8guVC~6)(@CR7|M4JZ{EUtJ6J<^FMa|&1K7892bpEZ6^}9Jt4xCfm=6Be z}Xzz3L3E})s7y{`2eeE{a6=OCIud?ND!ajqi%XFN)p&u(%z=33@@4VZtg zK?^++ybfNI7X2`N0=a=aA0To#>AHH2_3_NvuqNQ#<@8^H|8MF%Sa@!}i1?qL;nf3s zqaPsti~Yyqe}?L-?b_e z{)_#`;{QO-2T1teLL9FTApSRQyy>VPAm(d{Z}2&i@ZW8*zk0dnK~Dqlf5mm|D`(LM z$YKA+J0CiV|MCE7E(>D;7hehYfZD9bo_spo5BGo1Pah3OzWs}EDScZueer>?nziN! zuA%l$AAnpy|JBr-!JVyuuj{$+Yhb_Y^q>gph`wZ!+g!wtk5bNGF+MU0ul?{bbk zZmDgbLtmab*BZyTFxR;?#&&aa7CZ+CS#G@e8n?D-!1qZ@rfsv~fQ%@l2ir z4cpMmN9-qO?zjaGfWDvB_qq0tef_JJ9*%W>ZX17Rd4JaR1(T!ZuLaHD%nKs#e`XE5 zKe7Jj#&w5Jj-DGnIjSXm4nN?m$;-khIQ_AmmxSW>-JzU#zk(hB<@5|JBOhSjpwX?w z{t^4>7X+7}j&NAxh13jeLtkhP;9%T$Jcf8IxnqmRcMa<+-Vkc>UFz{;qD3Fzwz!u0 z%=i8(Yu;&{whUu~{@X&W64`BS?$2|4M^^)-c(EX_abY8p2&$Qx)HBlQG>!cXH z9!;3nMt@)~`Pt|Lm@DA(;=O$tyAIf60exnyB_#jCwSOi2K3=NlczXTnXZZle|B3S! z|5MyA{##2Y<|q93bw1|jZyy`~C+ttLe;QNlFaC@7#{Xh}>Q(8n822Y1AmM&Dx;}FY zV!kGquMgm}K>V-e*p6}md`EoW-vjrrJiq3)*srDdKj{wS0rUe>?4R)8*uN0}7cl>& z`g{MM9=Cb_-#+nl_}Q<>dJzKv2%W%av9u60M;Qv^Cl;ZtD0@&760{|8N58Adj33u8O>gyJ@O z0Mjc#&cBSjzq-Ge_owgQP0P6#=-b2jWK@F`W7C8X) zel5iObI6l8|BYOW*?gDRWe(RU`T+0%Q6oT{ucpJ=%*+QM-|P2yow(M$^a1EUpXctv zI|{zQaS;DM*E1k-04es*aQDYC=1)F=c%O81`T(U1_C|hR+?VIq#C`dHEua5C7XMRR zF6W=H-!bkNAHXp?2Do_eU-PxNFZZAD-}qnL7ytA5e|-Qg@d^H4_bKkn`^y1n3ICH1 zAm*o>gT8>gzyCLlZWr*sfd9|+8+tjvXZ-(L;(vR${NSO-!q=$%yZ+xFq3{2Hgq^ql zENs5@!D#XUZm(qhnfY)4a`ipnez$QU*dO`-i2eN5!EN(d3iZ8M?P9zdc-Jkh4p`W#eVo~F)YI|dIJ&P%KIDlH>3A!Bn}qy>(DCI;Y-Ze z1XgbT65DF$(ffn_6IWjs`}(WTx37Qf?}tvWg4fpjS&v^fe}5?M+8wbuYW}9JiZ%YH zRL&2dCH5EhKRL1`e72}9d;vaSNd3AndM>?x+IEMrtrx{!zoqy9t_5H{pgjYJfct}{ zucdFms&LM<)sasyrx5XdIwdIL#SGEb(n+?Fm>IHVa5fwgnG`c z;lf*)H#mV!<^-5O&UrQ%-a`Ik?w+q_KEMHT0g(q#6M!*?;(s@Dn&!8QXJi}KM*gMI zyaL}hQ=fuuxtJz;4mR(S2T-GdHZ%GFasfGik8ABU@1Y)~mpsAzZQlrsSKVE}|Kk+@ z^PgSj(zJnViIc6d_J0IX)!foP+;HpVge2ae}W9te&239&8_ zZrvV4Ejw9r028b0F1R6La`FWn`?>G(O}x#=f8%&9)eXjNe&_1_-4@@~{k5@=MvkwM z^%K+oX*0(U$Iu||50Ll3s+L?HMs@9oCf+Y}oxj}LM{e5-u!ZkPW8)6iK%(zb{(Kd- z3;w{%{T>kiQ_q(BA9*5t@8`b_cmDX-;fC)#60Z5yFCrIk;O>XQo;!aYHh<~Cumhi9 zAvu8shsgmv3;#1spxCdr%s5gknFGfx_KPnK#NegQ-xFgx;hDuGxr7X-h%3P? zu}dEyVi;OKfpYA&z z2gl}mLmrR%L30Cc+b5_7|7Ggh8{uWq1FpX@O!YPARm=I+#r4g;!W^T+gC}jhV6(6MtfsKET$DOH~(O-lmn$sSAvH zPyV02Uc&!A`a#bt)cw6AF(YBW_^;XTPyE;1PWYcjald8>J^^+t{_6*b{o=l+4^Xp; z`!{C^|II-pA0XxZQ%s()JmS7JgJ6Hs4jhaB`T%0S?>lPZzqqdtp!xgI2hbA!i~CJr zzMm8KV?SUujBGE2o6uhF&-=pp6?~ffd%&K5_GwWAU=4sZfbsy}Knrl!y}u4$#mosr zUjS|3*MIsO;s<&I9KJ8ZfAGLuK-O1=-Z8tuXf=*wICFde zeSyhq(fadVB^tX@aMm7urS|q?+kQQzyjJrcYyMo@w*}3ABfWmm{M+X*#{MP5{zYwI ze{1;sICOvG7lgs^_+#65gfg`MW5xew@V^ZX0KMPX4%Q1`t)C$?)`zpI2f}I844zs( zKXL|V;tLF_T^;w~zQ(do_Z^P`F2J6H_8!s?P>UFQ3d2)O!he}U&4QR8v40hD+493- z3gdKqfSLGFasYGm0hpJz=mXpXMt=*8)(_CKdDSn-=9y~+-{RcQg z&yxQ?wY-L3?M9u$fY6m9LCwN?UIE7k)&oiFN zcbz_dQ8j)LY3Fs4)&{N3uhs+IBgY}ci1Bmxis9&f-vsleJ z8NW>Cd}rYQs0Ww>7t*}ztLP|=g~0#))>2^1o49Wr)fJ6(1oz=jIp@s1c>r~Qk^d+D zS2yLgnhjs0d7YZMmUHm|ytWePvFB3k&&U4(xP2|* zf8zf;(debM2iz9_lc^^V^Yzo^0NgHZ+i}#QA3z==VZV6*abNTM9TV^Gy_@2Hu|MH| z)GFq30Qv&?*sm{O{BPW!`~c&AEpY(ie}4S0Z(HF1Uq1Koi~T!#sqH`d0Pp}$F~jB0PXL@KH2^>6{j;=RKUmfBM385KBhAn0yvZu0y+aCr8z>jvko@6*KoUiy-o%kCnl-Lc;_h2{P4j=X;zy#Lg7_U^Oa zF6-|N910WJuE8Ie2v$~uja5t0_QCTPgR|nk_-c*6IeNG4^`{nZG|#1Bvo}S4UatPs zs;t+~=ZZU`-aleLy#MIt3(@-T4HK6Tm&47A|6>}rfd9Kfc{f;24xprEM;KYVHk?yQ zpWt!5;goS*Xa@V>02ai$0doNE%YC}k2QUUogH* z&5EnTMEsn}1*|uK-%!nQOkI5>)ZqhUI?B7^9Jf;w(BT~K%do!(&9y$27T=R+G2a3Q z(6txeihe$G(P+#@2iOGmw_n7X!@O3P*@Q+wYk{k=PlH+j|6i=rH2yz8jVAS<>Aon8 zFTdw!iqjMRSM==;=kPme-0{VzAy7xqcIh*5x>#M>w>SEz`U5RH&;?*s{d+^*hA)Ou ztR3JezW4LlWPO+0yN~Ba?(^~iewSn1&iNOqE}%A7uiz;6?`P}mmz6U$fc7-fS9bJu z>{FQYXY5(v|8wkSznpe>e{D{?Z7*5^^!~Gn{b!;p&SL*->A7W5Pl-e`|>EcM^YJ z73$2z!)1=0vm+GE+#JS{|F5L(ud0vZz!w-ZV_i6xct3Ffr;O_fr}3TU0L~@9;J)1F zIC>3=_r>G_idb*Jx&hZ7um@oYK0pQeir6QR^O(3CW8dT91S;eWc)nJ`Urgd})2ZE_ zMeH6q0D1$=#Ybvq{yXgv2nWz(P9p9|968K z@Bkff0DWM~a%#?3UUx6}ZT&x30w#5cKgOf#(GF^CgYnj`b(yQi7uULTaewDN`pi)m z)Vc?3!hdMoK@9;~0`vYg;C$sG`tQ!a6s)ADF3*{2aT3m4?62Upd4AX3De6Y6&p5{3 z{$TBB^m|2J7sovO=+^Dz<-z}2xc`X*;bif@qzCH`U#RR4gKJlk>)#rx7at^Uq4tQH zxf!h4GjpVX5_N#()c%c_!aBj^{!b-`a7wW`fO+9`Gy&(5UvOVz z=ml5|-m3#pGicA@B95sT?Dsv#GI9Xw1N8wW!etomk4GzL{-LaA4}FIBg-P%Mwdfrh z;6oa>npe3K-Gw{=Jj?E{aXrviS{sNTpvenl{D9XAERWaAYX@(G=D%s{UGM<#u;l)G zH-06|TYpFB+(zt=573HFpigJNN3XfpUhJQDX#xL_*Wc+2d0fW)#{SQR|5MpL_uQfE4#z?-y(S$pNJJ-`G6m7OV->#D1Sc$Kt;}fF|av1xnbjPS!kz z`0uv(@BdFeKmq>?*#AQQUS5vh{qtWx8Fd0tua9Pb0o?tX8}6f4;GwXU9>NQ*)Hkq> z4D7fR3?dd4|Lt8L4czb84-WC0)DKXr7CHZeDp%g0)M zw14RH?Dr@BpA7b&ir)XMiHpOCSsOxG_r+lf`Gp4jj#=c}Ck_R8h9WTET7Xe4+rnu2 z2^HZ7WIVvG=mV7Cuax6gRN(_mpgwRS&(jI$11pIAOF5r%e1P%&`_Thlg+Fp5+KMm5 zeoE%^n|Zdj(jTauoQZK%mp%Y|fO*k2-fJ^Qz%}V$-J}jMy@R;kT&a10=56HsH{TUH zFT69%TXJ)l-*+VRtS27B2k6?(HH0s?|G`J2y&Ui9!a4oVa6qh1@xS<=V*lg=fKE&U}?12BGox_+#JyntGN zb$`bG;{WK5T_LW=2i}hWv-Jba!;fs*o$-VnJo`Ltw5{RHY-%q=B}ZZk z^L?!b9gx~Tdl@-4TtJ;8rmx{>4}mu78~XOUws2 z?IJY)@Z0A7js2_O;!Aqzzei5KxN8?U$#0zZD#86q@UR@LECn}X{7BJnQ<-p0YfgM$CSSygfdE^?v8nED6Kv*G0UY#4}_DvBXq#_+!cQ zk80Q$Mib|ctKS$Z=k5#>yZ44^XaOe9MBhJURT#{7omD~oUrAp$t(0;6Vsul>sSl(E zfF1&J0Hd%G)C}kY*nd#`AA?^q7H*9{D1cI{H1U&6^`-vyJm~k?#Fzy*iYOE z_uPRW-_F>^>$%`i^Db)4ci6|48e?Mo);(a(#rB`2{*3o$UPvF0O=#Q6_01;lZ(qOK z^Xcoe@-X@KePF+N^KEeEuBk&locOyOt03+-?{9tGGdX{FcDQzV|A_yr$73(P5ybAp z;Qr5@!CHUB`o{mKR?H*sKOeq+Q5ZaZH8{PQ_817SwzrC~}F{Q>GP2qS7%gtO@ZaC#Z~f9&+Ch2d;8fagtL6NZxmFy@zg z7~#4A;y=9u#>`FlZ(l()0PqUs=m4tF6;#rt6{T?vxS1+96|KElG#{b&y!+&{uYxj=j08;IrK7c0fi~n)}VttDL z3;2KhVMqbjUmn+_9qqoDuZCZ)zXgn+v%}b)p0=Cd_@0`jS5Sk` zdcEZ0$DsWi)37-d)o%*rb(_KjY5}ITp^0wV73%A@hKbY955=`>!eG`AI13Ho8S(&( z_5?g{TBZRQN!&kz;}|w;WAp*U|Iy&NngDwWmQV{&2DX>?p!KItunJ$GQh&fY0sMur z{J&zpqm0i_z~7ldP2voC1vcOV)Ni0CqPYn4k<-u!&Y(BaEPVrW1RHM&Gw6>nLw|wK z&D!`SdH{WynBSf+<_6$o!2iPU@8$9Pd#PN^=p-}pbp z{b{t8U(3${B;0pQxSvKj|C9rW{e;N}6ypEFJ^xbqy}Z#6rg-&aPizXJAh)!_YD&}r2Jy@|C@&;Ap5+>k7OvVqW zU3zu&1#0OdFjZ|7=Tp1lno!R=L*@z^H<4@EQi%0mYQL+O>+v?xmr`ql=hsqyA8TCX z4a_YjOIiWP#;x`oRUbedfcbx(1#Y{hV7~cT*EMP*2ieGa$?5y#>~D9-HuG@Mpw-`~dOa zH3mw+`!eEvWBzh90i~=vSUQKl*KG)+YuAQR)7Qd7oKGHLd#FY$IAzJzp%#u}I`REf z{FKU>o5)413l+>!74tI@9pi-Vi$WE;i7IrHllu3EsgWPJz7X#hIR3&tP`C#Q_dwwu z_=DU7QsaAlY!{*$w-JD-03}Ukxl67%mwHJfce@OFmALw0k}WhJU@B-Vf5Y|0@k|D-(YYv z`T#T8p21pu#Q&!g_n%4L|Ga4{iT&Z%`MxrI3GshCnu8K+^IOpp%(^g)o`wFdVQVNy z12Cz6Yp6#fH+RwnVNT8JFs*tZjHhQ{@zj-J2-`6Spq>!?A40A{O<~0TI`E%;59L^f z(-%M=U?l#@7<_=SXWKPDTF*siQ!oqPBVz0tI zP`C#Q_rNRf9+ehrY{J#?N3hM2(GI)ovVDKpP{Ug-(VWa9U2*qG=&5UiKv1VK7t=<+E zRBR1B6SjoeQ@5c5*c8T0W&K~Ye`ift%(`jl|H15GaQDN(?P0|4L&5*y;J-S6VY4=c zks6%-7;^l@XaejhTt?hqiA|ckAyiHT^J`Y&TdWHsC!tY5Q!tKW8Q)6nfgAvRh^8)r zTj@I#rqrWLs60Q^Vl|W2hVm)vL)DZE3YcH;@eB7r;T|a51BH9wxV#50xb()*z3Fh6 zeLfn%b=Q!mBle$f-k%))Y~psXe{h{VI=OUwff2LTftTmQn_E|JO#t}-YUI@T4JC&^ zboNHDA7hQb!Q{-(%fo+T|8t4=&q42Z<|JZuIDn!2y_oMQp|)@wK7jT1#b^jdg3;>t z&YQd{469uqMuPpL!1AhT7lawr8$#dM4PnXX3&MipjiF=mj!=shpm^%qFlapM|DXjt z&-_2V0f!O0>jO9r)d!f4FF+o`-ax|{^#?}HB(H%lFb=-I1ioQ>-GyOR$;vQ!#QacN zwJem>tO+B>4}@V=i^3Sbvy6U3<5`2y9)wfoq5ES^g4*d9hS^2SkIQRZ@bh1JetzMa z7p{5X9w^)c|1bBz)2u@<11;dx#rw!#qjm41Uk~y55b)o={KMe@#x$;@CT|lMy@i}T zwejs}>52V^iTShe7r=c-^Zt?hhX)^w4atq?!O2_ye-?TFv#A5H=U*|o1LOa(jH8>- z=kZ-)_8?;J^Cr{BrcnNud5!3N$&=;0~>t!=GhDmS~Z5 z&#)ifAOAu8HwWM-|9|eZ6>(j&bKwC-;wzMN?2J}KpB;Mu4mVFg{C*Cx{2+S!4W4Wq zzXtpVhZ(D?SA_0iE5oK!SB15M)`dmoTSL=i^Z}EJ@BMuB(l7-6f9O>4AKWJoFdQyn zII;UswugfE!|)}<{^9Tf`Uge$7$voE{!=%EsT05NEpYvG%=UjRKyWY=8_=2)7dhnqC8`DIc zfm#D}bLY~-ZxDI>bE}tt|8M~4`$mG{MT`~H`PC2U4J$t}FKjpi4xnf=dcdura`Jj| z^yK}C{fF~^hJ*hj(FBa*|BZkP@bxgZV@^QqS06y1U_Uzo4dEE_5yj*CL;1LlP&%X~ zRGd65)C^rxi0=!zyTUzCxCaXNK;a%J+ylql1GAQ0`m8xQ_H}71b$e~-_vg~9w~5?< zd;mVcV0?ff)cqUpm%{y*koR|cn0W^B4TC2T$74gm^P%ALXmb1Gh|Md})YVq53vI(! zgcTp_4XZ!i7Zwj%9@@rl=5J^O=mj`pl6WrmuL1k1-3RA=-|_ePL*QFraz5XP62~Auc#?-82ZGhEbEcmZ3um~Oh7{mrQKy}8_NgBT|3AdujgSBU literal 0 HcmV?d00001 diff --git a/code/ryzom/client/data/gamedev/adds/textures/gn_pvp_dress_hof.tga b/code/ryzom/client/data/gamedev/adds/textures/gn_pvp_dress_hof.tga new file mode 100644 index 0000000000000000000000000000000000000000..83f18a9b3b73dbea25838a1f7115d0b380597db1 GIT binary patch literal 1048620 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

Yc{)wfoS7NB|S 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 TIBMXqp)JPu9~j)P<@f#{b0Gag literal 0 HcmV?d00001 diff --git a/code/ryzom/client/data/gamedev/adds/textures/ul_mission_hall_of_fame.dds b/code/ryzom/client/data/gamedev/adds/textures/ul_mission_hall_of_fame.dds new file mode 100644 index 0000000000000000000000000000000000000000..03f9e0442d127878abfa3ab4d41840a2aac5e279 GIT binary patch literal 1048704 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 z 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�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

|-TBrkF3|wTI!1P0W{4V*hoK8+jTrDV$ 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ɌwNcCAY;~ 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 literal 0 HcmV?d00001 diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/commands.xml b/code/ryzom/client/data/gamedev/interfaces_v3/commands.xml index ca013f242..f0455028a 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/commands.xml +++ b/code/ryzom/client/data/gamedev/interfaces_v3/commands.xml @@ -78,9 +78,18 @@ - + + + + + + + + + + diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/config.xml b/code/ryzom/client/data/gamedev/interfaces_v3/config.xml index 1d593ef06..9fb0dd958 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/config.xml +++ b/code/ryzom/client/data/gamedev/interfaces_v3/config.xml @@ -258,6 +258,9 @@ + @@ -291,6 +294,9 @@ + @@ -327,6 +333,9 @@ + @@ -2797,6 +2806,9 @@ This MUST follow the Enum MISSION_DESC::TIconId + - + + + + + + + + @@ -3045,6 +3081,9 @@ This MUST follow the Enum MISSION_DESC::TIconId + @@ -3066,6 +3105,9 @@ This MUST follow the Enum MISSION_DESC::TIconId + @@ -3087,6 +3129,9 @@ This MUST follow the Enum MISSION_DESC::TIconId + @@ -3108,6 +3153,9 @@ This MUST follow the Enum MISSION_DESC::TIconId + @@ -3129,6 +3177,9 @@ This MUST follow the Enum MISSION_DESC::TIconId + @@ -3151,6 +3202,9 @@ This MUST follow the Enum MISSION_DESC::TIconId + @@ -3173,6 +3227,9 @@ This MUST follow the Enum MISSION_DESC::TIconId + + + diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/encyclopedia.xml b/code/ryzom/client/data/gamedev/interfaces_v3/encyclopedia.xml index b2db7ab26..30f2c34a0 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/encyclopedia.xml +++ b/code/ryzom/client/data/gamedev/interfaces_v3/encyclopedia.xml @@ -11,7 +11,7 @@ - + + + + + +

+ + + + diff --git a/code/ryzom/common/data_leveldesign/leveldesign/world_editor_files/world_editor_classes.xml b/code/ryzom/common/data_leveldesign/leveldesign/world_editor_files/world_editor_classes.xml index 1e4f9d723..5426361fa 100644 --- a/code/ryzom/common/data_leveldesign/leveldesign/world_editor_files/world_editor_classes.xml +++ b/code/ryzom/common/data_leveldesign/leveldesign/world_editor_files/world_editor_classes.xml @@ -688,8 +688,6 @@ - - @@ -709,6 +707,7 @@ + @@ -838,14 +837,6 @@ - - - - - - - - @@ -1108,8 +1099,6 @@ - - @@ -1122,10 +1111,6 @@ - - - - @@ -1135,45 +1120,28 @@ - - - - - - - - - + - - - - - - - - - @@ -1182,27 +1150,18 @@ - - - - - - - - - @@ -1212,9 +1171,6 @@ - - - @@ -1223,9 +1179,6 @@ - - - @@ -1233,9 +1186,6 @@ - - - @@ -1243,35 +1193,23 @@ - - - - - - - - - - - - @@ -1304,18 +1242,12 @@ - - - - - - diff --git a/code/ryzom/common/data_leveldesign/primitives/newbieland/guild_missions.primitive b/code/ryzom/common/data_leveldesign/primitives/newbieland/guild_missions.primitive new file mode 100644 index 000000000..568d89398 --- /dev/null +++ b/code/ryzom/common/data_leveldesign/primitives/newbieland/guild_missions.primitive @@ -0,0 +1,448 @@ + + + + + + + class + missions_editor + + + name + guild_missions + + + + audience + guild + + + auto_remove_from_journal + false + + + automatic + false + + + class + mission_tree + + + fail_if_inventory_is_full + false + + + giver_primitive + urban_newbieland.primitive + + + mission_category + Killing + + + mission_description + GUILD_MISSION_DESC + + + mission_giver + $givervar@fullname$ + + + mission_title + GUILD_MISSION_TITLE + + + mono_instance + false + + + name + GUILD_MISSION + + + need_validation + false + + + non_abandonnable + false + + + not_in_journal + false + + + not_proposed + false + + + replayable + true + + + run_only_once + false + + + + class + variables + + + name + variables + + + + class + var_npc + + + npc_function + fct_ranger_leader + + + npc_name + chiang_the_strong + + + var_name + givervar + + + + + + class + pre_requisite + + + name + pre_requisite + + + require_guild_grade + Leader + + + require_guild_membership + true + + + + + + class + alias + + + name + alias + + + + + class + step + + + name + step + + + + class + actions + + + name + pre_actions + + + + class + spawn_mission + + + giver_name + chiang_the_strong + + + guild + true + + + mission_name + SOLO_GUILD_MISSION + + + + + + class + mission_objectives + + + name + objectives + + + + class + do_mission + + + mission_names + SOLO_GUILD_MISSION 2 + + + overload_objective + MIS_DO_MISSION + + + + + class + kill + + + fauna/quantity + chdfa1 2 + + + name + kill chdfa1 2 + + + + + + class + actions + + + name + post_actions + + + + amount + 100 + + + class + recv_money + + + guild + true + + + name + recv_money 100 guild + + + + + amount + 50 + + + class + recv_money + + + + + + + + audience + solo + + + auto_remove_from_journal + false + + + automatic + false + + + class + mission_tree + + + fail_if_inventory_is_full + false + + + giver_primitive + urban_newbieland.primitive + + + mission_category + Killing + + + mission_description + SOLO_GUILD_MISSION_DESC + + + mission_giver + $givervar@fullname$ + + + mission_title + SOLO_GUILD_MISSION_TITLE + + + mono_instance + false + + + name + SOLO_GUILD_MISSION + + + need_validation + false + + + non_abandonnable + false + + + not_in_journal + false + + + not_proposed + true + + + replayable + true + + + run_only_once + false + + + + class + variables + + + name + variables + + + + class + var_npc + + + npc_function + fct_ranger_leader + + + npc_name + chiang_the_strong + + + var_name + givervar + + + + + + class + pre_requisite + + + name + pre_requisite + + + + + + class + alias + + + name + alias + + + + + class + step + + + name + step + + + + class + actions + + + name + pre_actions + + + + + class + mission_objectives + + + name + objectives + + + + class + kill + + + fauna/quantity + chdfa1 1 + + + name + kill chdfa1 1 + + + + + + class + actions + + + name + post_actions + + + + amount + 20 + + + class + recv_money + + + + + + + + diff --git a/code/ryzom/common/src/Makefile b/code/ryzom/common/src/Makefile deleted file mode 100644 index ef0bb500b..000000000 --- a/code/ryzom/common/src/Makefile +++ /dev/null @@ -1,36 +0,0 @@ - -BUILD_DIRS = game_share - -night: all - -all: $(foreach dir,$(BUILD_DIRS),$(dir)-all) - -%-all: - +make -k -C $* all - -clean: $(foreach dir,$(BUILD_DIRS),$(dir)-clean) - -%-clean: - +make -C $* clean - -distclean: $(foreach dir,$(BUILD_DIRS),$(dir)-distclean) - -%-distclean: - +make -C $* distclean - -cleansheets: $(foreach dir,$(BUILD_DIRS),$(dir)-cleansheets) - -%-cleansheets: - +make -C $* cleansheets - -update: $(foreach dir,$(BUILD_DIRS),$(dir)-update) - -%-update: - +make -C $* update - -touch: $(foreach dir,$(BUILD_DIRS),$(dir)-touch) - -%-touch: - +make -C $* touch - -.NOTPARALLEL: night all clean cleansheets update touch diff --git a/code/ryzom/common/src/game_share/CMakeLists.txt b/code/ryzom/common/src/game_share/CMakeLists.txt index 7883ce03d..61292431c 100644 --- a/code/ryzom/common/src/game_share/CMakeLists.txt +++ b/code/ryzom/common/src/game_share/CMakeLists.txt @@ -1,13 +1,32 @@ FILE(GLOB SRC *.cpp time_weather_season/*.cpp) FILE(GLOB PRIV_H *.h time_weather_season/*.h) -SOURCE_GROUP(headers FILES ${PRIV_H}) +FILE(GLOB R2 + dms.h dms.cpp + scenario.h scenario.cpp + user_connection_mgr.h user_connection_mgr.cpp + object.h object.cpp + server_animation_module.h server_animation_module.cpp + server_admin_module.h server_admin_module.cpp + server_edition_module.h server_edition_module.cpp + string_mgr_module.h string_mgr_module.cpp + scenario_entry_points.h scenario_entry_points.cpp + small_string_manager.h small_string_manager.cpp + ai_wrapper.h ai_wrapper.cpp + r2_*.h r2_*.cpp + ring_*.h ring_*.cpp) + +LIST(REMOVE_ITEM SRC R2) +LIST(REMOVE_ITEM PRIV_H R2) + +SOURCE_GROUP("" FILES ${SRC} ${PRIV_H}) +SOURCE_GROUP("R2" FILES ${R2}) # Filter out the source files not actually compiled. LIST(REMOVE_ITEM SRC ${CMAKE_CURRENT_SOURCE_DIR}/enum_template.cpp) LIST(REMOVE_ITEM PRIV_H ${CMAKE_CURRENT_SOURCE_DIR}/enum_template.h) -NL_TARGET_LIB(ryzom_gameshare ${PRIV_H} ${SRC}) +NL_TARGET_LIB(ryzom_gameshare ${PRIV_H} ${SRC} ${R2}) INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR} ${NEL_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) @@ -22,5 +41,6 @@ IF(WITH_PCH) ADD_NATIVE_PRECOMPILED_HEADER(ryzom_gameshare ${CMAKE_CURRENT_SOURCE_DIR}/stdpch.h ${CMAKE_CURRENT_SOURCE_DIR}/stdpch.cpp) ENDIF(WITH_PCH) -INSTALL(TARGETS ryzom_gameshare LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) - +IF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) + INSTALL(TARGETS ryzom_gameshare LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) +ENDIF((WITH_INSTALL_LIBRARIES AND WITH_STATIC) OR NOT WITH_STATIC) diff --git a/code/ryzom/common/src/game_share/Makefile b/code/ryzom/common/src/game_share/Makefile deleted file mode 100644 index ac78fd835..000000000 --- a/code/ryzom/common/src/game_share/Makefile +++ /dev/null @@ -1,56 +0,0 @@ -############################################################################# -# Simple make file for compiling GAME SHARE - -############################################################################# -# Setting up the compiler settings... - -# Global variables -include ../../../Variables.mk - -# The flags for the C++ compiler -CXXFLAGS = $(FLAGS_CMN) $(FLAGS_DBG_$(DBG)) \ - -I/usr/include/libxml2 \ - -I/usr/include/mysql \ - -I$(NEL_INCLUDE) \ - -I$(RYZOM_PATH)/common/src \ - -I./ \ - -I./character_structure \ - -I./egs_sheets \ - -I./entity_structure \ - -I./game_item_manager - -# The flags for the linker -LDFLAGS = $(LD_FLAGS_CMN) -L$(RYZOM_PATH)/install/$(DIR_DBG_$(DBG))/lib \ - -llibmysqlclient \ - -lnelnet \ - -lnelgeorges \ - -lnelpacs \ - -L/usr/lib \ - -L/usr/X11R6/lib \ - -lnelmisc \ - -lxml2 \ - -lstlport \ - -lpthread \ - -lld - -############################################################################# -# The bit that changes each time we cut paste and hack this file :o) - -# The list of targets to build -TARGETS = libgame_share.a -DSP_TARGET = game_share.vcproj - -# The default build rule -all: check-deps $(TARGETS) - - -#libgame_share.so: $(OBJS) -# $(CXX) -o $@ $(OBJS) -shared $(LDFLAGS) - -libgame_share.a: $(OBJS) - ar r libgame_share.a $(OBJS) - -############################################################################# -# Rules - -include ../../../Rules.mk diff --git a/code/ryzom/common/src/game_share/bot_chat_types.h b/code/ryzom/common/src/game_share/bot_chat_types.h index 779bc8ba3..19982f106 100644 --- a/code/ryzom/common/src/game_share/bot_chat_types.h +++ b/code/ryzom/common/src/game_share/bot_chat_types.h @@ -82,6 +82,8 @@ namespace BOTCHATTYPE ResaleKOBroken, // this item can't be sold because its Resold time has expired ResaleKONoTimeLeft, + // this item can't be sold because the owner has locked it (temporary hack to get around modifying database.xml) + ResaleKOLockedByOwner, NumBotChatResaleFlag }; diff --git a/code/ryzom/common/src/game_share/character_sync_itf.h b/code/ryzom/common/src/game_share/character_sync_itf.h index 459659732..5481045ed 100644 --- a/code/ryzom/common/src/game_share/character_sync_itf.h +++ b/code/ryzom/common/src/game_share/character_sync_itf.h @@ -1108,9 +1108,7 @@ namespace CHARSYNC void setResult(TCharacterNameResult value) { - _Result = value; - } // uint32 getUserId() const @@ -1120,9 +1118,7 @@ namespace CHARSYNC void setUserId(uint32 value) { - _UserId = value; - } // uint8 getCharIndex() const @@ -1132,9 +1128,7 @@ namespace CHARSYNC void setCharIndex(uint8 value) { - _CharIndex = value; - } // const ucstring& getFullName() const @@ -1144,9 +1138,7 @@ namespace CHARSYNC void setFullName(const ucstring &value) { - _FullName = value; - } bool operator == (const CValidateNameResult &other) const @@ -1161,7 +1153,6 @@ namespace CHARSYNC // constructor CValidateNameResult() { - } void serial(NLMISC::IStream &s) @@ -1170,7 +1161,6 @@ namespace CHARSYNC s.serial(_UserId); s.serial(_CharIndex); s.serial(_FullName); - } diff --git a/code/ryzom/common/src/game_share/deployment_configuration.cpp b/code/ryzom/common/src/game_share/deployment_configuration.cpp new file mode 100644 index 000000000..86059fc7e --- /dev/null +++ b/code/ryzom/common/src/game_share/deployment_configuration.cpp @@ -0,0 +1,1519 @@ +// Ryzom - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +//----------------------------------------------------------------------------- +// include +//----------------------------------------------------------------------------- + +// pre compiled headers +#include "stdpch.h" + +// nel +#include "nel/misc/types_nl.h" +#include "nel/misc/common.h" +#include "nel/misc/time_nl.h" +#include "nel/misc/smart_ptr.h" +#include "nel/misc/singleton.h" +#include "nel/misc/command.h" +#include "nel/misc/file.h" + +// game share +#include "utils.h" +#include "deployment_configuration.h" + + +//----------------------------------------------------------------------------- +// namespaces +//----------------------------------------------------------------------------- + +using namespace std; +using namespace NLMISC; + + +//----------------------------------------------------------------------------- +// namespace DEPCFG +//----------------------------------------------------------------------------- + +namespace DEPCFG +{ + //----------------------------------------------------------------------------- + // forward class declarations + //----------------------------------------------------------------------------- + + struct SExeRecord; + class CInfoBlock; + class CInfoContainer; + class CDeploymentConfigurationImplementation; + + + //----------------------------------------------------------------------------- + // struct SExeRecord + //----------------------------------------------------------------------------- + + struct SExeRecord + { + typedef std::set TDataEntries; + typedef std::vector TCfgEntries; + + NLMISC::CSString FullName; + + NLMISC::CSString DomainName; + NLMISC::CSString ShardName; + NLMISC::CSString UniqueName; + NLMISC::CSString CmdLine; + NLMISC::CSString Host; + NLMISC::CSString StartOrder; + TDataEntries DataEntries; + TCfgEntries CfgEntries; + TCfgEntries CfgEntriesPost; + + // serial method + void serial(NLMISC::IStream& stream) + { + stream.serial(FullName); + stream.serial(DomainName); + stream.serial(ShardName); + stream.serial(UniqueName); + stream.serial(CmdLine); + stream.serial(Host); + stream.serialCont(DataEntries); + stream.serialCont(CfgEntries); + stream.serialCont(CfgEntriesPost); + } + }; + + + //----------------------------------------------------------------------------- + // class CInfoBlock + //----------------------------------------------------------------------------- + + class CInfoBlock: public NLMISC::CRefCount + { + public: + // ctors + CInfoBlock(const NLMISC::CSString& name=""); + + // write accessors + void setDomainName(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors); + void setShardName(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors); + void setUniqueName(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors); + void setCmdLine(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors); + void setHost(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors); + void setStartOrder(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors); + + void addUseEntry(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors); + void addDataEntry(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors); + + void addCfgEntry(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors); + void addCfgEntryPost(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors); + + void addCfgFile(const NLMISC::CSString& fileName,const NLMISC::CSString& context,uint32& errors); + void addCfgFilePost(const NLMISC::CSString& fileName,const NLMISC::CSString& context,uint32& errors); + + // direct read accessors + uint32 getNumParents() const; + const NLMISC::CSString& getName() const; + const NLMISC::CSString& getDomainName() const; + + // indirect read accessors + bool isDomain() const; + bool isShard() const; + + // setup the _Children vector from the _UseEntries vector + void setupChildren(CInfoContainer* container,uint32& errors); + + // traverse the tree of children, cumulating data on exes, and instantiating the exe records in 'container' + void buildExeSet(CInfoContainer* container,uint32& errors,const SExeRecord& parentExeRecord=SExeRecord()); + + // serial + void serial(NLMISC::IStream& stream); + + // display the contents of the container + void dump(NLMISC::CLog& log) const; + + private: + // data types + typedef std::set TUseEntries; + typedef std::set TDataEntries; + typedef std::vector TCfgEntries; + + typedef std::vector TChildren; + + // private methods + bool _haveCircularRef(CInfoBlock* other) const; + + // data (basics) + NLMISC::CSString _Name; + uint32 _NumParents; + TChildren _Children; + + // data extracted from input file + NLMISC::CSString _DomainName; + NLMISC::CSString _ShardName; + NLMISC::CSString _UniqueName; + NLMISC::CSString _CmdLine; + NLMISC::CSString _Host; + NLMISC::CSString _StartOrder; + TUseEntries _UseEntries; + TDataEntries _DataEntries; + TCfgEntries _CfgEntries; + TCfgEntries _CfgEntriesPost; + }; + + + //----------------------------------------------------------------------------- + // class CInfoContainer + //----------------------------------------------------------------------------- + + class CInfoContainer + { + public: + // public interface + void clear(); + bool empty() const; + + bool read(const NLMISC::CSString& fileName); + void serial(NLMISC::IStream& stream); + + void getHostNames(THostNames& result) const; + void getDomainNames(TDomainNames& result) const; + void getShardNames(const TDomainName& domainName,TShardNames& result) const; + void getAppNames(const THostName& hostName,const TDomainName& domainName,TAppNames& result) const; + void getAppNames(const THostName& hostName,const TDomainName& domainName,const TShardName& shardName,TAppNames& result) const; + + void getHost(const THostName& hostName,SHostDescription& result) const; + void getDomain(const TDomainName& domainName, SDomainDescription& result) const; + void getShard(const TDomainName& domainName,const TShardName& shardName,SShardDescription& result) const; + void getApp(const TDomainName& domainName,const TAppName& appName,SAppDescription& result) const; + + void dumpInfoBlocks(NLMISC::CLog& log) const; + void dumpDomains(NLMISC::CLog& log) const; + + // interface used by CInfoBlock methods + CInfoBlock* getInfoBlock(const NLMISC::CSString& name); + void addExe(const SExeRecord& exeRecord,uint32& errors); + + private: + // data types + typedef NLMISC::CSmartPtr TInfoBlockPtr; + typedef std::map< NLMISC::CSString,TInfoBlockPtr > TInfoBlocks; + typedef std::set< NLMISC::CSString > TFileNameSet; + typedef std::vector< SExeRecord > TExeRecords; + typedef std::vector TExeIdx; + typedef std::map TShardExes; + typedef std::map TDomainExes; + + // private methods + void _readFile(const NLMISC::CSString& fileName,uint32& errors,TFileNameSet& fileNameStack); + void _buildDomainTree(uint32& errors); + void _buildExeSet(uint32& errors); + + // data + TInfoBlockPtr _CurrentInfoBlock; + TInfoBlocks _InfoBlocks; + TExeRecords _ExeRecords; + TDomainExes _DomainExes; + }; + + + //----------------------------------------------------------------------------- + // class CDeploymentConfigurationImplementation + //----------------------------------------------------------------------------- + + class CDeploymentConfigurationImplementation: public CSingleton, public CDeploymentConfiguration + { + public: + bool read(const NLMISC::CSString& fileName); + void write(const NLMISC::CSString& fileName); + void serial(NLMISC::IStream& stream); + + void getHostNames(THostNames& result) const; + void getDomainNames(TDomainNames& result) const; + void getShardNames(const TDomainName& domainName,TShardNames& result) const; + void getAppNames(const THostName& hostName,const TDomainName& domainName,TAppNames& result) const; + void getAppNames(const THostName& hostName,const TDomainName& domainName,const TShardName& shardName,TAppNames& result) const; + + void getHost(const THostName& hostName,SHostDescription& result) const; + void getDomain(const TDomainName& domainName, SDomainDescription& result) const; + void getShard(const TDomainName& domainName,const TShardName& shardName,SShardDescription& result) const; + void getApp(const TDomainName& domainName,const TAppName& appName,SAppDescription& result) const; + + void dumpInfoBlocks(NLMISC::CLog& log) const; + void dumpDomains(NLMISC::CLog& log) const; + + private: + CInfoContainer _InfoContainer; + }; + + + //----------------------------------------------------------------------------- + // methods CInfoBlock + //----------------------------------------------------------------------------- + + CInfoBlock::CInfoBlock(const NLMISC::CSString& name) + { + _Name= name; + _NumParents= 0; + } + + void CInfoBlock::setDomainName(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors) + { + DROP_IF(!_DomainName.empty(),context+"Attempting to set a domain name more than once for the same info block",++errors; return); + DROP_IF(entry.empty(),context+"Attempting to set an empty domain name",++errors; return); + _DomainName=entry; + } + + void CInfoBlock::setShardName(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors) + { + DROP_IF(!_ShardName.empty(),context+"Attempting to set a shard name more than once for the same info block",++errors; return); + DROP_IF(entry.empty(),context+"Attempting to set an empty shard name",++errors; return); + _ShardName=entry; + } + + void CInfoBlock::setUniqueName(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors) + { + DROP_IF(!_UniqueName.empty(),context+"Attempting to set a name more than once for the same info block",++errors; return); + DROP_IF(entry.empty(),context+"Attempting to set an empty name",++errors; return); + _UniqueName=entry; + } + + void CInfoBlock::setCmdLine(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors) + { + DROP_IF(!_CmdLine.empty(),context+"Attempting to set a cmdLine more than once for the same info block",++errors; return); + DROP_IF(entry.empty(),context+"Attempting to set an empty cmdLine",++errors; return); + _CmdLine=entry; + } + + void CInfoBlock::setHost(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors) + { + DROP_IF(!_Host.empty(),context+"Attempting to set a host more than once for the same info block",++errors; return); + DROP_IF(entry.empty(),context+"Attempting to set an empty host",++errors; return); + _Host=entry; + } + + void CInfoBlock::setStartOrder(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors) + { + DROP_IF(!_StartOrder.empty(),context+"Attempting to set a startOrder more than once for the same info block",++errors; return); + DROP_IF(entry.empty(),context+"Attempting to set an empty startOrder",++errors; return); + _StartOrder=entry; + } + + void CInfoBlock::addUseEntry(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors) + { + DROP_IF(_UseEntries.find(entry)!=_UseEntries.end(),context+"Ignoring duplicate refference to 'use' clause: "+entry,return); + _UseEntries.insert(entry); + } + + void CInfoBlock::addDataEntry(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors) + { + DROP_IF(_DataEntries.find(entry)!=_DataEntries.end(),context+"Ignoring duplicate refference to 'data' clause: "+entry,return); + _DataEntries.insert(entry); + } + + void CInfoBlock::addCfgEntry(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors) + { + _CfgEntries.push_back(entry); + } + + void CInfoBlock::addCfgEntryPost(const NLMISC::CSString& entry,const NLMISC::CSString& context,uint32& errors) + { + _CfgEntriesPost.push_back(entry); + } + + void CInfoBlock::addCfgFile(const NLMISC::CSString& fileName,const NLMISC::CSString& context,uint32& errors) + { + // make sure a file name is supplied + DROP_IF(fileName.empty(),context+"No file name found following 'cfgFile'", ++errors;return); + + // read in the src file + NLMISC::CSString fileContents; + fileContents.readFromFile(fileName); + DROP_IF(fileContents.empty(),"File not found: "+fileName, ++errors;return); + + // split the file contents into lines + NLMISC::CVectorSString lines; + fileContents.splitLines(lines); + + // append the lines to the '_CfgEntries' container + _CfgEntries.insert(_CfgEntries.end(),lines.begin(),lines.end()); + } + + void CInfoBlock::addCfgFilePost(const NLMISC::CSString& fileName,const NLMISC::CSString& context,uint32& errors) + { + // make sure a file name is supplied + DROP_IF(fileName.empty(),context+"No file name found following 'cfgFilePost'", ++errors;return); + + // read in the src file + NLMISC::CSString fileContents; + fileContents.readFromFile(fileName); + DROP_IF(fileContents.empty(),"File not found: "+fileName, ++errors;return); + + // split the file contents into lines + NLMISC::CVectorSString lines; + fileContents.splitLines(lines); + + // prepend the lines to the '_CfgEntriesPost' container + _CfgEntriesPost.insert(_CfgEntriesPost.begin(),lines.begin(),lines.end()); + } + + uint32 CInfoBlock::getNumParents() const + { + return _NumParents; + } + + const NLMISC::CSString& CInfoBlock::getName() const + { + return _Name; + } + + const NLMISC::CSString& CInfoBlock::getDomainName() const + { + return _DomainName; + } + + bool CInfoBlock::isDomain() const + { + return !_DomainName.empty(); + } + + bool CInfoBlock::isShard() const + { + return !_ShardName.empty(); + } + + void CInfoBlock::setupChildren(CInfoContainer* container,uint32& errors) + { + // start by clearing out the child vector that we're going to fill + _Children.clear(); + + // iterate over the the 'use' clauses + for (TUseEntries::iterator it= _UseEntries.begin(); it!= _UseEntries.end(); ++it) + { + const NLMISC::CSString& theEntry= *it; + + // try to get a pointer to the refferenced info block... + CInfoBlock* infoBlockPtr= container->getInfoBlock(theEntry); + DROP_IF(infoBlockPtr==NULL,"Failed to find block named '"+theEntry+"' while fixing up children of block: "+_Name, ++errors;continue); + + // make sure that this block doesn't figure amongst the children of the refferenced info block (to avoid circular refs) + DROP_IF(_haveCircularRef(infoBlockPtr),"Circular dependency found between definitions of '"+_Name+"' and '"+theEntry+"'", ++errors;continue); + + // add the info block to our children + _Children.push_back(infoBlockPtr); + ++(infoBlockPtr->_NumParents); + } + } + + void CInfoBlock::buildExeSet(CInfoContainer* container,uint32& errors,const SExeRecord& parentExeRecord) + { + // setup a record to accumulate data into as we traverse the tree, starting + // with a copy of the data passed in from parents + SExeRecord theExe= parentExeRecord; + + // add a chunk to the exe record's 'FullName' property + theExe.FullName+= (theExe.FullName.empty()?"":".")+ _Name; + + // make sure we don't have any field duplication... + DROP_IF(!_DomainName.empty() && !theExe.DomainName.empty(), "more than one domain found in: "+theExe.FullName, ++errors ); + DROP_IF(!_ShardName.empty() && !theExe.ShardName.empty(), "more than one shard found in: "+theExe.FullName, ++errors ); + DROP_IF(!_CmdLine.empty() && !theExe.CmdLine.empty(), "more than one cmdLine found in: "+theExe.FullName, ++errors ); + DROP_IF(!_Host.empty() && !theExe.Host.empty(), "more than one host found in: "+theExe.FullName, ++errors ); + WARN_IF(!_UniqueName.empty() && !theExe.UniqueName.empty(), "replacing name '"+theExe.UniqueName+"' with '"+_UniqueName+"' in: "+theExe.FullName); + + // fill our own data into the exe record + if (!_DomainName.empty()) theExe.DomainName = _DomainName; + if (!_ShardName.empty()) theExe.ShardName = _ShardName; + if (!_UniqueName.empty()) theExe.UniqueName = _UniqueName; + if (!_CmdLine.empty()) theExe.CmdLine = _CmdLine; + if (!_Host.empty()) theExe.Host = _Host; + if (!_StartOrder.empty()) theExe.StartOrder = _StartOrder; + // merge contents of 2 sets + theExe.DataEntries.insert( _DataEntries.begin(), _DataEntries.end() ); + // append or pre-pend contents of one vector to another + theExe.CfgEntries.insert( theExe.CfgEntries.end(), _CfgEntries.begin(), _CfgEntries.end() ); + theExe.CfgEntriesPost.insert( theExe.CfgEntriesPost.begin(), _CfgEntriesPost.begin(), _CfgEntriesPost.end() ); + + // if this is the node with the cmdLine then think about updating the unique name... + if (!_CmdLine.empty() && theExe.UniqueName.empty()) + { + theExe.UniqueName= _Name; + } + + // do something with the exe record depending on whetherwe're a tree branch or leaf + if (_Children.empty()) + { + // merge the cfg entries together to make a single block + theExe.CfgEntries.insert(theExe.CfgEntries.end(),theExe.CfgEntriesPost.begin(),theExe.CfgEntriesPost.end()); + theExe.CfgEntriesPost.clear(); + + // this is a leaf node (it has no children) so it must describe an executable + container->addExe(theExe,errors); + } + else + { + // this is a branch node so recurse into children + for (TChildren::iterator it=_Children.begin();it!=_Children.end();++it) + { + (*it)->buildExeSet(container,errors,theExe); + } + } + } + + void CInfoBlock::serial(NLMISC::IStream& stream) + { + if (stream.isReading()) + { + // if we're reading then we clear out the children vector - it'll be rebuilt at the end of the serial + _Children.clear(); + } + + stream.serial(_Name); + stream.serial(_NumParents); + stream.serial(_DomainName); + stream.serial(_ShardName); + stream.serial(_UniqueName); + stream.serial(_CmdLine); + stream.serial(_Host); + + stream.serialCont(_UseEntries); + stream.serialCont(_DataEntries); + stream.serialCont(_CfgEntries); + stream.serialCont(_CfgEntriesPost); + } + + void CInfoBlock::dump(NLMISC::CLog& log) const + { + //***************************** + // NOTE: + // This method is called to + // create a text save of the + // data that we contain - it + // must output ALL data that + // read() requires and in a + // read()-compatible format + //***************************** + + log.displayNL("define %s // refferenced by %u other defines",_Name.c_str(),_NumParents); + + if (!_DomainName.empty()) + { + log.displayNL("\tdomain\t%s",_DomainName.c_str()); + } + + if (!_ShardName.empty()) + { + log.displayNL("\tshard\t%s",_ShardName.c_str()); + } + + if (!_UniqueName.empty()) + { + log.displayNL("\tname\t%s",_UniqueName.c_str()); + } + + if (!_CmdLine.empty()) + { + log.displayNL("\tcmdLine\t%s",_CmdLine.c_str()); + } + + if (!_Host.empty()) + { + log.displayNL("\thost\t%s",_Host.c_str()); + } + + for (TUseEntries::const_iterator it=_UseEntries.begin(); it!=_UseEntries.end(); ++it) + { + log.displayNL("\tuse\t%s",it->c_str()); + } + + for (TDataEntries::const_iterator it=_DataEntries.begin(); it!=_DataEntries.end(); ++it) + { + log.displayNL("\tdata\t%s",it->c_str()); + } + + for (TCfgEntries::const_iterator it=_CfgEntries.begin(); it!=_CfgEntries.end(); ++it) + { + log.displayNL("\tcfg\t%s",it->c_str()); + } + + for (TCfgEntries::const_iterator it=_CfgEntriesPost.begin(); it!=_CfgEntriesPost.end(); ++it) + { + log.displayNL("\tcfgAfter\t%s",it->c_str()); + } + + log.displayNL(""); + } + + bool CInfoBlock::_haveCircularRef(CInfoBlock* other) const + { + // in the case of a circular refference we end up with the 'other'=='this' + if (this==other) + return true; + + // recurse into children looking for a deep circular ref + for (TChildren::const_iterator it= other->_Children.begin();it!=other->_Children.end();++it) + { + CInfoBlock* child= *it; + if (_haveCircularRef(child)) + return true; + } + + // no circular ref found so return false + return false; + } + + //----------------------------------------------------------------------------- + // methods CInfoContainer + //----------------------------------------------------------------------------- + + void CInfoContainer::clear() + { + _InfoBlocks.clear(); + _CurrentInfoBlock= NULL; + _ExeRecords.clear(); + _DomainExes.clear(); + } + + bool CInfoContainer::empty() const + { + return _InfoBlocks.empty(); + } + + bool CInfoContainer::read(const NLMISC::CSString& fileName) + { + // start by clearing out our contents... + clear(); + + // setup some basics + uint32 errors= 0; + TFileNameSet fileNameSet; + + // read in the src file + _readFile(fileName,errors,fileNameSet); + + // build the blocks into a tree + _buildDomainTree(errors); + + // build the set of executables from the tree + _buildExeSet(errors); + + // make sure that no errors were encountered... + DROP_IF(errors!=0,NLMISC::toString("%s: Parse Failed: %u errors found",fileName.c_str(),errors),clear(); return false); + + return true; + } + + void CInfoContainer::_readFile(const NLMISC::CSString& fileName,uint32& errors,TFileNameSet& fileNameSet) + { + // read in the src file + NLMISC::CSString fileContents; + fileContents.readFromFile(fileName); + DROP_IF(fileContents.empty(),"File not found: "+fileName, ++errors;return); + + // split the file into lines + NLMISC::CVectorSString lines; + fileContents.splitLines(lines); + + // process the lines one by one + for (uint32 i=0;i' but found: "+line, ++errors;continue); + + if (keyword=="domain") { _CurrentInfoBlock->setDomainName(args,context,errors); } + else if (keyword=="shard") { _CurrentInfoBlock->setShardName(args,context,errors); } + else if (keyword=="name") { _CurrentInfoBlock->setUniqueName(args,context,errors); } + else if (keyword=="cmdLine") { _CurrentInfoBlock->setCmdLine(args,context,errors); } + else if (keyword=="host") { _CurrentInfoBlock->setHost(args,context,errors); } + else if (keyword=="startOrder") { _CurrentInfoBlock->setStartOrder(args,context,errors); } + else if (keyword=="use") { _CurrentInfoBlock->addUseEntry(args,context,errors); } + else if (keyword=="data") { _CurrentInfoBlock->addDataEntry(args,context,errors); } + else if (keyword=="cfg") { _CurrentInfoBlock->addCfgEntry(rawArgs,context,errors); } + else if (keyword=="cfgAfter") { _CurrentInfoBlock->addCfgEntryPost(rawArgs,context,errors); } + else if (keyword=="cfgFile") { _CurrentInfoBlock->addCfgFile(args,context,errors); } + else if (keyword=="cfgFileAfter") { _CurrentInfoBlock->addCfgFilePost(args,context,errors); } + else { DROP(context+"Unrecognised keyword: "+line, ++errors;continue); } + } + } + } + + void CInfoContainer::_buildDomainTree(uint32& errors) + { + // iterate over the info block container, setting up 'child' vectors + for (TInfoBlocks::iterator it= _InfoBlocks.begin(); it!= _InfoBlocks.end(); ++it) + { + CInfoBlock& theInfoBlock= *it->second; + theInfoBlock.setupChildren(this,errors); + } + + // display the list of orphans + for (TInfoBlocks::iterator it= _InfoBlocks.begin(); it!= _InfoBlocks.end(); ++it) + { + CInfoBlock& theInfoBlock= *it->second; + WARN_IF(!theInfoBlock.isDomain() && theInfoBlock.getNumParents()==0,"Found unrefferenced info block: "+theInfoBlock.getName()); + } + } + + void CInfoContainer::_buildExeSet(uint32& errors) + { + // iterate over the info block container, looking for domains + for (TInfoBlocks::iterator it= _InfoBlocks.begin(); it!= _InfoBlocks.end(); ++it) + { + CInfoBlock& theInfoBlock= *it->second; + if (theInfoBlock.isDomain()) + { + const NLMISC::CSString& domainName= theInfoBlock.getDomainName(); + DROP_IF(_DomainExes.find(domainName)!=_DomainExes.end(),"Duplicate domain name found: "+domainName,++errors;continue); + nldebug("Building executable set for domain: %s",domainName.c_str()); + theInfoBlock.buildExeSet(this,errors); + } + + // fixup the names in the domain to make them unique + + // run through the exes a first time to determine which unique names are unique and which are not + std::map nameCounts; + for (TExeRecords::iterator it2= _ExeRecords.begin(); it2!=_ExeRecords.end(); ++it2) + { + // skip anything that's not from our domain + if (it2->DomainName!=theInfoBlock.getDomainName()) + continue; + + // get hold of the name + NLMISC::CSString& name= it2->UniqueName; + // yell if the name already looks like a 'fixed up' name + DROP_IF(name.right(3).left(1)=="_" && (name.right(2)=="00" || name.right(2).atoui()!=0),"Appending '_' to name ending in '_00' style format as this can clash with auto renumbering => "+name+'_',name+='_') + // compose a second version of the name with the shard name added + NLMISC::CSString name_with_shard= name+'_'+it2->ShardName; + // insert both versions of the name into the unique name counter + ++nameCounts[name]; + ++nameCounts[name_with_shard]; + } + + // run through the exes a second time to fix names that are not unique + std::map nameIdx; + for (TExeRecords::iterator it2= _ExeRecords.begin(); it2!=_ExeRecords.end(); ++it2) + { + // skip anything that's not from our domain + if (it2->DomainName!=theInfoBlock.getDomainName()) + continue; + + // get hold of the name + NLMISC::CSString& name= it2->UniqueName; + // if the name is unique then continue + if (nameCounts[name]==1) + continue; + + // compose a second version of the name with the shard name added + name+='_'; + name+=it2->ShardName; + // if the name is unique within the shard then continue + if (nameCounts[name]==1) + continue; + + // make the name name unique by appending a number to it + uint32 idx= ++nameIdx[name]; + name+=NLMISC::toString("_%02u",idx); + } + } + } + + void CInfoContainer::serial(NLMISC::IStream& stream) + { + if (stream.isReading()) + { + // start by clearing out our contents... + clear(); + + // get the number of info blocks from the stream + uint32 count; + stream.serial(count); + + // get the info blocks from the stream one by one + for (uint32 i=0;igetName()]= _CurrentInfoBlock; + } + + // setup an error accumulator + uint32 errors= 0; + + // build the blocks into a tree + _buildDomainTree(errors); + + // build the set of executables from the tree + _buildExeSet(errors); + + // make sure that no errors were encountered... + DROP_IF(errors!=0,NLMISC::toString("Serial Failed: %u errors found",errors), clear();return); + + // note - on exit, _CurrentInfoBlock refferences the last info block read + } + else + { + // put the number of info blocks to the stream + uint32 count= _InfoBlocks.size(); + stream.serial(count); + // put the info blocks to the stream one by one + for (TInfoBlocks::iterator it= _InfoBlocks.begin(); it!=_InfoBlocks.end(); ++it) + { + stream.serial(*(it->second)); + } + } + } + + void CInfoContainer::getHostNames(THostNames& result) const + { + // clear out the result before we begin work... + result.clear(); + + // use a little set to avoid adding host names more than once + std::set namesFound; + + // fill the result in from our internal data + bool found= false; + for (TExeRecords::const_iterator it= _ExeRecords.begin(); it!=_ExeRecords.end(); ++it) + { + const SExeRecord& theApp= *it; + + // ignore exes that are on hosts that we've already dealt with + if (namesFound.find(theApp.Host)!=namesFound.end()) continue; + + // we've found a new host so add it to our result container + result.push_back(theApp.Host); + namesFound.insert(theApp.Host); + + found=true; + } + + if (!found) + { + // as a note - if we get here it is because the request has failed - no hosts were identified with the given domain + // this is not an error case so we just add a debug for info + nldebug("getHostNames failed - no hosts found"); + } + } + + void CInfoContainer::getDomainNames(TDomainNames& result) const + { + // clear out the result before we begin work... + result.clear(); + + // fill the result in from our internal data + for (TDomainExes::const_iterator dit= _DomainExes.begin(); dit!=_DomainExes.end(); ++dit) + { + const NLMISC::CSString& domainName= dit->first; + result.push_back(domainName); + } + + if (result.empty()) + { + // as a note - if we get here it is because the request has failed - no domains were found + // this is not an error case so we just add a debug for info + nldebug("getDomainNames failed - no domains found"); + } + } + + void CInfoContainer::getShardNames(const TDomainName& domainName,TShardNames& result) const + { + // clear out the result before we begin work... + result.clear(); + + // fill the result in from our internal data + bool found= false; + for (TDomainExes::const_iterator dit= _DomainExes.begin(); dit!=_DomainExes.end(); ++dit) + { + // ignore shards that aren't in the requested domain + const NLMISC::CSString& domName= dit->first; + if (domName!=domainName) continue; + + // run throught he shards for our chosen domain... + const TShardExes& shards= dit->second; + for (TShardExes::const_iterator sit= shards.begin(); sit!=shards.end(); ++sit) + { + const NLMISC::CSString shardName= sit->first; + result.push_back(shardName); + } + + found=true; + } + + if (!found) + { + // as a note - if we get here it is because the request has failed - no shards were identified with the given domain + // this is not an error case so we just add a debug for info + nldebug("getShardNames failed for domainName('%s')",domainName.c_str()); + } + } + + void CInfoContainer::getAppNames(const THostName& hostName,const TDomainName& domainName,TAppNames& result) const + { + // clear out the result before we begin work... + result.clear(); + + // fill the result in from our internal data + bool found= false; + for (TExeRecords::const_iterator it= _ExeRecords.begin(); it!=_ExeRecords.end(); ++it) + { + const SExeRecord& theApp= *it; + + // ignore exes that aren't in the requested domain + if (theApp.DomainName!=domainName) continue; + + // ignore exes that are on the wrong host + if (theApp.Host!=hostName) continue; + + // we've found a new host so add it to our result container + result.push_back(theApp.UniqueName); + + found=true; + } + + if (!found) + { + // as a note - if we get here it is because the request has failed - no apps were identified with the given host and domain + // this is not an error case so we just add a debug for info + nldebug("getAppNames failed for hostName('%s'), domainName('%s')",hostName.c_str(),domainName.c_str()); + } + } + + void CInfoContainer::getAppNames(const THostName& hostName,const TDomainName& domainName,const TShardName& shardName,TAppNames& result) const + { + // clear out the result before we begin work... + result.clear(); + + // fill the result in from our internal data + bool found= false; + for (TExeRecords::const_iterator it= _ExeRecords.begin(); it!=_ExeRecords.end(); ++it) + { + const SExeRecord& theApp= *it; + + // ignore exes that aren't in the requested domain + if (theApp.DomainName!=domainName) continue; + + // ignore exes that are on the wrong host + if (theApp.Host!=hostName) continue; + + // ignore exes that are on the shard host + if (theApp.ShardName!=shardName) continue; + + // we've found a new host so add it to our result container + result.push_back(theApp.UniqueName); + + found=true; + } + + if (!found) + { + // as a note - if we get here it is because the request has failed - no apps were identified with the given host, shard and domain + // this is not an error case so we just add a debug for info + nldebug("getAppNames failed for hostName('%s'), domainName('%s'), shardName('%s')",hostName.c_str(),domainName.c_str(),shardName.c_str()); + } + } + + void CInfoContainer::getHost(const THostName& hostName,SHostDescription& result) const + { + // clear out the result before we begin work... + result.clear(); + result.HostName= hostName; + + // use a set to buildup lists of unique host names + typedef std::set TNameSet; + TNameSet domainNames; + + // fill the result in from our internal data + bool found= false; + for (TExeRecords::const_iterator it= _ExeRecords.begin(); it!=_ExeRecords.end(); ++it) + { + const SExeRecord& theApp= *it; + + // ignore exes that aren't on the requested host + if (theApp.Host!=hostName) continue; + + // add this exe's domain to the domains set + domainNames.insert(theApp.DomainName); + + found=true; + } + + // copy the hosts set to the result record + for (TNameSet::const_iterator it= domainNames.begin(); it!=domainNames.end(); ++it) + { + result.Domains.push_back(*it); + } + + if (!found) + { + // as a note - if we get here it is because the request has failed - no host was identified with the given name + // this is not an error case so we just add a debug for info + nldebug("getHost failed for hostName('%s')",hostName.c_str()); + } + } + + void CInfoContainer::getDomain(const TDomainName& domainName, SDomainDescription& result) const + { + // clear out the result before we begin work... + result.clear(); + result.DomainName= domainName; + + // use a couple of sets to buildup lists of unique host and shard names + typedef std::set TNameSet; + TNameSet hostNames; + TNameSet shardNames; + + // fill the result in from our internal data + bool found= false; + for (TExeRecords::const_iterator it= _ExeRecords.begin(); it!=_ExeRecords.end(); ++it) + { + const SExeRecord& theApp= *it; + + // ignore exes that aren't in the requested domain + if (theApp.DomainName!=domainName) continue; + + // add this exe's shard to the shards set + shardNames.insert(theApp.ShardName); + + // add this exe's host to the hosts set + hostNames.insert(theApp.Host); + + // add this exe's unique name to the result apps record + result.Apps.push_back(theApp.UniqueName); + + found=true; + } + + // copy the hosts set to the result record + for (TNameSet::const_iterator it= hostNames.begin(); it!=hostNames.end(); ++it) + { + result.Hosts.push_back(*it); + } + + // copy the shards set to the result record + for (TNameSet::const_iterator it= shardNames.begin(); it!=shardNames.end(); ++it) + { + result.Shards.push_back(*it); + } + + if (!found) + { + // as a note - if we get here it is because the request has failed - no domain was identified with the given name + // this is not an error case so we just add a debug for info + nldebug("getDomain failed for domainName('%s')",domainName.c_str()); + } + } + + void CInfoContainer::getShard(const TDomainName& domainName,const TShardName& shardName,SShardDescription& result) const + { + // clear out the result before we begin work... + result.clear(); + result.DomainName= domainName; + result.ShardName= shardName; + + // use a set to buildup lists of unique host names + typedef std::set TNameSet; + TNameSet hostNames; + + // fill the result in from our internal data + bool found= false; + for (TExeRecords::const_iterator it= _ExeRecords.begin(); it!=_ExeRecords.end(); ++it) + { + const SExeRecord& theApp= *it; + + // ignore exes that aren't in the requested domain + if (theApp.DomainName!=domainName) continue; + + // ignore exes that aren't in the requested shard + if (theApp.ShardName!=shardName) continue; + + // add this exe's host to the hosts set + hostNames.insert(theApp.Host); + + // add this exe's unique name to the result apps record + result.Apps.push_back(theApp.UniqueName); + + found=true; + } + + // copy the hosts set to the result record + for (TNameSet::const_iterator it= hostNames.begin(); it!=hostNames.end(); ++it) + { + result.Hosts.push_back(*it); + } + + if (!found) + { + // as a note - if we get here it is because the request has failed - no shard was identified with the given name and domain + // this is not an error case so we just add a debug for info + nldebug("getShard failed for domainName('%s'), shardName('%s')",domainName.c_str(),shardName.c_str()); + } + } + + void CInfoContainer::getApp(const TDomainName& domainName,const TAppName& appName,SAppDescription& result) const + { + // clear out the result before we begin work... + result.clear(); + result.DomainName= domainName; + result.AppName= appName; + + // use a set to buildup lists of unique host names + typedef std::set TNameSet; + TNameSet domainNames; + + // fill the result in from our internal data + for (TExeRecords::const_iterator it= _ExeRecords.begin(); it!=_ExeRecords.end(); ++it) + { + const SExeRecord& theApp= *it; + + // skip exes that aren't in the requested domain + if (theApp.DomainName!=domainName) continue; + + // skip exes that don't have the correct name + if (theApp.UniqueName!=appName) continue; + + // we've found the exe so fill in the result record... + result.ShardName= theApp.ShardName; + result.HostName= theApp.Host; + result.StartOrder= theApp.StartOrder; + result.CmdLine= theApp.CmdLine; + + // setup the config file to start initialised with the app name for this app + result.CfgFile= + "// Auto generated config file\n" + "// Use with commandline: "+theApp.CmdLine+"\n" + "AESAliasName= \""+appName+"\";\n" + "\n"; + + // copy the cfg set to the result record (the cfgAfter set should have been merged in already) + for (SExeRecord::TCfgEntries::const_iterator cit= theApp.CfgEntries.begin(); cit!=theApp.CfgEntries.end(); ++cit) + { + result.CfgFile+=*cit; + result.CfgFile+='\n'; + } + + // copy the dataEntries set to the result record + for (SExeRecord::TDataEntries::const_iterator dit= theApp.DataEntries.begin(); dit!=theApp.DataEntries.end(); ++dit) + { + result.DataPacks.push_back(*dit); + } + + // we're all done so we can return merrily + return; + } + + // as a note - if we get here it is because the request has failed - no app was identified with the given name and domain + // this is not an error case so we just add a debug for info + nldebug("getApp failed for domainName('%s'), appName('%s')",domainName.c_str(),appName.c_str()); + } + + void CInfoContainer::dumpDomains(NLMISC::CLog& log) const + { + for (TDomainExes::const_iterator dit= _DomainExes.begin(); dit!=_DomainExes.end(); ++dit) + { + const NLMISC::CSString& domainName= dit->first; + const TShardExes& shards= dit->second; + log.displayNL("-- domain: %s",domainName.c_str()); + + for (TShardExes::const_iterator sit= shards.begin(); sit!=shards.end(); ++sit) + { + const NLMISC::CSString& shardName= sit->first; + const TExeIdx& exeIdx= sit->second; + log.displayNL(" -- shard: %s",shardName.c_str()); + + for (TExeIdx::const_iterator eit= exeIdx.begin(); eit!=exeIdx.end(); ++eit) + { + uint32 idx= *eit; + nlassert(idx<_ExeRecords.size()); + const SExeRecord& theExe= _ExeRecords[idx]; + log.displayNL(" -- %s:%s (%s)",theExe.Host.c_str(),theExe.CmdLine.c_str(),theExe.UniqueName.c_str()); + } + } + } + } + + void CInfoContainer::dumpInfoBlocks(NLMISC::CLog& log) const + { + log.displayNL("//------------------------------------------------------------------------------"); + log.displayNL("// Dump of cfg database file contents"); + log.displayNL("//------------------------------------------------------------------------------"); + for (TInfoBlocks::const_iterator it=_InfoBlocks.begin(); it!=_InfoBlocks.end(); ++it) + { + it->second->dump(log); + } + log.displayNL("//------------------------------------------------------------------------------"); + } + + CInfoBlock* CInfoContainer::getInfoBlock(const NLMISC::CSString& name) + { + TInfoBlocks::iterator it= _InfoBlocks.find(name); + return (it==_InfoBlocks.end())? NULL: it->second; + } + + void CInfoContainer::addExe(const SExeRecord& exeRecord,uint32& errors) + { + // nldebug("Adding CmdLine: %s",exeRecord.FullName.c_str()); + + // note: if we hit errors then we continue anyway to make sure we display a complete set of error messages + DROP_IF(exeRecord.DomainName.empty(), "No 'domain' property found in: "+exeRecord.FullName, ++errors ); + DROP_IF(exeRecord.ShardName.empty(), "No 'shard' property found in: "+exeRecord.FullName, ++errors ); + DROP_IF(exeRecord.CmdLine.empty(), "No 'cmdLine' property found in: "+exeRecord.FullName, ++errors ); + DROP_IF(exeRecord.Host.empty(), "No 'host' property found in: "+exeRecord.FullName, ++errors ); + DROP_IF(exeRecord.CfgEntries.empty(), "No 'cfg' entriesfound in: "+exeRecord.FullName, ++errors ); + + // add a refference from the domains' shard map to the exe... + _DomainExes[exeRecord.DomainName][exeRecord.ShardName].push_back(_ExeRecords.size()); + + // we may have hit errors but we go ahead anyway as in the case of errors the whole thing will be cleared out anyway + _ExeRecords.push_back(exeRecord); + } + + //----------------------------------------------------------------------------- + // methods CDeploymentConfigurationImplementation + //----------------------------------------------------------------------------- + + bool CDeploymentConfigurationImplementation::read(const NLMISC::CSString& fileName) + { + // setup a temp container to hold the version of the file that we're reading + CInfoContainer container; + + // do the reading and make sure we catch any possible execeptions (like for read in progress) + try + { + container.read(fileName); + } + catch(...) + { + container.clear(); + } + + // if the read failed for whatever reason then giveup + DROP_IF(container.empty(),"Failed to update deployment configuration from file: "+fileName,return false); + + // copy the temp container into our internal object + _InfoContainer= container; + + // display a funky victory message + nlinfo("Deployment configuration successfully updated from file: %s",fileName.c_str()); + + return true; + } + + void CDeploymentConfigurationImplementation::write(const NLMISC::CSString& fileName) + { + // create a displayer to gather the output of the command + class CStringDisplayer: public IDisplayer + { + public: + NLMISC::CSString Data; + void doDisplay( const CLog::TDisplayInfo& args, const char *message) + { + Data += message; + } + }; + + // instantiate the displayer and a log object and assign one to the other + CStringDisplayer stringDisplayer; + NLMISC::CLog myLog; + myLog.addDisplayer(&stringDisplayer); + + // dump the info blocks to our log object (accumulating the result as a string) + dumpInfoBlocks(myLog); + + // write the text accumulated in the log object to a text file + stringDisplayer.Data.writeToFile(fileName); + } + + void CDeploymentConfigurationImplementation::serial(NLMISC::IStream& stream) + { + // setup a temp container to hold the version of the file that we're reading (if we're reading) + // and fill the container in with our internal object just in case we're writing + CInfoContainer container= _InfoContainer; + + // do the serial and make sure we catch any possible execeptions (like for read in progress) + try + { + stream.serial(container); + } + catch(...) + { + container.clear(); + } + + // if the serial failed for whatever reason then giveup + DROP_IF(container.empty(),"Failed to serial deployment configuration: ",return); + + // copy the temp container into our internal object (incase this was a read operation) + _InfoContainer= container; + + // display a funky victory message + nlinfo("Deployment configuration successfully serialised"); + } + + void CDeploymentConfigurationImplementation::getDomainNames(TDomainNames& result) const + { + _InfoContainer.getDomainNames(result); + } + + void CDeploymentConfigurationImplementation::getShardNames(const TDomainName& domainName,TShardNames& result) const + { + _InfoContainer.getShardNames(domainName,result); + } + + void CDeploymentConfigurationImplementation::getHostNames(THostNames& result) const + { + _InfoContainer.getHostNames(result); + } + + void CDeploymentConfigurationImplementation::getAppNames(const THostName& hostName,const TDomainName& domainName,TAppNames& result) const + { + _InfoContainer.getAppNames(hostName,domainName,result); + } + + void CDeploymentConfigurationImplementation::getAppNames(const THostName& hostName,const TDomainName& domainName,const TShardName& shardName,TAppNames& result) const + { + _InfoContainer.getAppNames(hostName,domainName,shardName,result); + } + + void CDeploymentConfigurationImplementation::getHost(const THostName& hostName,SHostDescription& result) const + { + _InfoContainer.getHost(hostName,result); + } + + void CDeploymentConfigurationImplementation::getDomain(const TDomainName& domainName, SDomainDescription& result) const + { + _InfoContainer.getDomain(domainName,result); + } + + void CDeploymentConfigurationImplementation::getShard(const TDomainName& domainName,const TShardName& shardName,SShardDescription& result) const + { + _InfoContainer.getShard(domainName,shardName,result); + } + + void CDeploymentConfigurationImplementation::getApp(const TDomainName& domainName,const TAppName& appName,SAppDescription& result) const + { + _InfoContainer.getApp(domainName,appName,result); + } + + void CDeploymentConfigurationImplementation::dumpInfoBlocks(NLMISC::CLog& log) const + { + _InfoContainer.dumpInfoBlocks(log); + } + + void CDeploymentConfigurationImplementation::dumpDomains(NLMISC::CLog& log) const + { + _InfoContainer.dumpDomains(log); + } + + + //----------------------------------------------------------------------------- + // methods CDeploymentConfiguration + //----------------------------------------------------------------------------- + + CDeploymentConfiguration& CDeploymentConfiguration::getInstance() + { + return CSingleton::getInstance(); + } + +} // end of namespace + +//NLMISC_CATEGORISED_COMMAND(depcfg,readDepCfgFile,"(re)read the deployment cfg file","[=\"server_park_database.txt\"]") +//{ +// NLMISC::CSString fileName= defaultDeploymentConfigurationFileName; +// +// switch (args.size()) +// { +// case 1: +// fileName=args[0]; +// break; +// +// case 0: +// break; +// +// default: +// return false; +// } +// +// DEPCFG::CDeploymentConfiguration::getInstance().read(fileName); +// +// return true; +//} +// +//NLMISC_CATEGORISED_COMMAND(depcfg,writeDepCfgFile,"write the deployment cfg file","[=\"saved_server_park_database.txt\"]") +//{ +// NLMISC::CSString fileName= CSString("saved_") + defaultDeploymentConfigurationFileName; +// +// switch (args.size()) +// { +// case 1: +// fileName=args[0]; +// break; +// +// case 0: +// break; +// +// default: +// return false; +// } +// +// DEPCFG::CDeploymentConfiguration::getInstance().read(fileName); +// +// return true; +//} +// +//NLMISC_CATEGORISED_COMMAND(depcfg,saveDepCfgBinary,"write a binary version of the deployment file to disk","") +//{ +// if (args.size()!=1) +// return false; +// +// NLMISC::COFile outf(args[0]); +// outf.serial(DEPCFG::CDeploymentConfiguration::getInstance()); +// +// return true; +//} +// +//NLMISC_CATEGORISED_COMMAND(depcfg,loadDepCfgBinary,"read a binary version of the deployment file from disk","") +//{ +// if (args.size()!=1) +// return false; +// +// NLMISC::CIFile inf(args[0]); +// inf.serial(DEPCFG::CDeploymentConfiguration::getInstance()); +// +// return true; +//} + +NLMISC_CATEGORISED_COMMAND(depcfg,dumpDepCfgInfoBlocks,"dump the raw info blocks for the deployment config singleton","") +{ + if (args.size()!=0) + return false; + + DEPCFG::CDeploymentConfiguration::getInstance().dumpInfoBlocks(log); + + return true; +} + +NLMISC_CATEGORISED_COMMAND(depcfg,dumpDepCfgDomains,"dump the domain set for the deployment config singleton","") +{ + if (args.size()!=0) + return false; + + DEPCFG::CDeploymentConfiguration::getInstance().dumpDomains(log); + + return true; +} + +NLMISC_CATEGORISED_COMMAND(depcfg,dumpDepCfgHosts,"dump the host set for the deployment config singleton","") +{ + if (args.size()!=0) + return false; + + log.displayNL("--------------------------------------------"); + log.displayNL("Hosts"); + log.displayNL("--------------------------------------------"); + + DEPCFG::THostNames hostNames; + DEPCFG::CDeploymentConfiguration::getInstance().getHostNames(hostNames); + sort(hostNames.begin(),hostNames.end()); + for (DEPCFG::THostNames::iterator hit= hostNames.begin(); hit!=hostNames.end(); ++hit) + { + DEPCFG::SHostDescription host; + DEPCFG::CDeploymentConfiguration::getInstance().getHost(*hit,host); + log.displayNL("Host %s (%d domains)",host.HostName.c_str(),host.Domains.size()); + + for (DEPCFG::TDomainNames::iterator dit= host.Domains.begin(); dit!=host.Domains.end(); ++dit) + { + log.displayNL("-- Domain %s",dit->c_str()); + } + } + + return true; +} + +NLMISC_CATEGORISED_COMMAND(depcfg,dumpDepCfgShards,"dump the shard set for the deployment config singleton","") +{ + if (args.size()!=0) + return false; + + log.displayNL("--------------------------------------------"); + log.displayNL("Shards"); + log.displayNL("--------------------------------------------"); + + DEPCFG::TDomainNames domainNames; + DEPCFG::CDeploymentConfiguration::getInstance().getDomainNames(domainNames); + sort(domainNames.begin(),domainNames.end()); + for (DEPCFG::TDomainNames::iterator dit= domainNames.begin(); dit!=domainNames.end(); ++dit) + { + DEPCFG::SDomainDescription domain; + DEPCFG::CDeploymentConfiguration::getInstance().getDomain(*dit,domain); + log.displayNL("Domain %s (%d shards with %d apps on %d hosts)",domain.DomainName.c_str(),domain.Shards.size(),domain.Apps.size(),domain.Hosts.size()); + + DEPCFG::TShardNames shardNames; + DEPCFG::CDeploymentConfiguration::getInstance().getShardNames(*dit,shardNames); + nlassert(shardNames==domain.Shards); + for (DEPCFG::TShardNames::iterator sit= shardNames.begin(); sit!=shardNames.end(); ++sit) + { + DEPCFG::SShardDescription shard; + DEPCFG::CDeploymentConfiguration::getInstance().getShard(*dit,*sit,shard); + log.displayNL("-- Shard %s/%s (%d apps on %d hosts)",shard.DomainName.c_str(),shard.ShardName.c_str(),shard.Apps.size(),shard.Hosts.size()); + + for (DEPCFG::THostNames::iterator hit= shard.Hosts.begin(); hit!=shard.Hosts.end(); ++hit) + { + log.displayNL(" -- Host %s",hit->c_str()); + DEPCFG::TAppNames appNames; + DEPCFG::CDeploymentConfiguration::getInstance().getAppNames(*hit,*dit,*sit,appNames); + for (DEPCFG::TAppNames::iterator ait= appNames.begin(); ait!=appNames.end(); ++ait) + { + DEPCFG::SAppDescription app; + DEPCFG::CDeploymentConfiguration::getInstance().getApp(*dit,*ait,app); + uint32 cfgFileLines=app.CfgFile.countLines(); + uint32 numDataPacks= app.DataPacks.size(); + log.displayNL(" -- App: %-20s: %s (cfg file length: %d lines, data packs used: %d)",app.AppName.c_str(),app.CmdLine.c_str(),cfgFileLines,numDataPacks); + } + } + } + } + + return true; +} diff --git a/code/ryzom/common/src/game_share/deployment_configuration.h b/code/ryzom/common/src/game_share/deployment_configuration.h new file mode 100644 index 000000000..457d6ee0b --- /dev/null +++ b/code/ryzom/common/src/game_share/deployment_configuration.h @@ -0,0 +1,265 @@ +// Ryzom - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +#ifndef DEPLOYMENT_CONFIGURATION_H +#define DEPLOYMENT_CONFIGURATION_H + +//----------------------------------------------------------------------------- +// include +//----------------------------------------------------------------------------- + +// nel +#include "nel/misc/types_nl.h" +#include "nel/misc/common.h" +#include "nel/misc/sstring.h" + + +//----------------------------------------------------------------------------- +// namespace DEPCFG +//----------------------------------------------------------------------------- + +namespace DEPCFG +{ + //----------------------------------------------------------------------------- + // some handy constants + //----------------------------------------------------------------------------- + + #define defaultDeploymentConfigurationFileName "server_park_database.txt" + + + //----------------------------------------------------------------------------- + // some handy typedefs for identifiers, map keys, etc + //----------------------------------------------------------------------------- + + typedef NLMISC::CSString TDomainName; + typedef NLMISC::CSString TShardName; + typedef NLMISC::CSString THostName; + typedef NLMISC::CSString TAppName; + + typedef NLMISC::CVectorSString TDomainNames; + typedef NLMISC::CVectorSString TShardNames; + typedef NLMISC::CVectorSString THostNames; + typedef NLMISC::CVectorSString TAppNames; + + typedef NLMISC::CSString TCmdLine; + typedef NLMISC::CSString TCfgFile; + typedef NLMISC::CVectorSString TDataPacks; + + + //----------------------------------------------------------------------------- + // struct SDomainDescription + //----------------------------------------------------------------------------- + + struct SDomainDescription + { + //------------------------------------------------------------------------- + // identifying the domain + TDomainName DomainName; + //------------------------------------------------------------------------- + // the set of shards and apps belonging to this domain and their hosts + TShardNames Shards; + THostNames Hosts; + TAppNames Apps; + + //------------------------------------------------------------------------- + // a handy 'clear()' method + void clear() + { + DomainName.clear(); + Shards.clear(); + Hosts.clear(); + Apps.clear(); + } + }; + + + //----------------------------------------------------------------------------- + // struct SShardDescription + //----------------------------------------------------------------------------- + + struct SShardDescription + { + //------------------------------------------------------------------------- + // identifying the shard by name and domain + TDomainName DomainName; + TShardName ShardName; + //------------------------------------------------------------------------- + // the set of hosts and apps used by this shard + THostNames Hosts; + TAppNames Apps; + + //------------------------------------------------------------------------- + // a handy 'clear()' method + void clear() + { + DomainName.clear(); + ShardName.clear(); + Hosts.clear(); + Apps.clear(); + } + }; + + + //----------------------------------------------------------------------------- + // struct SHostDescription + //----------------------------------------------------------------------------- + + struct SHostDescription + { + //------------------------------------------------------------------------- + // identifying the host (machine's network name) + THostName HostName; + //------------------------------------------------------------------------- + // the set of domains that refference this host + TDomainNames Domains; + + //------------------------------------------------------------------------- + // a handy 'clear()' method + void clear() + { + HostName.clear(); + Domains.clear(); + } + }; + + + //----------------------------------------------------------------------------- + // struct SAppDescription + //----------------------------------------------------------------------------- + + struct SAppDescription + { + //------------------------------------------------------------------------- + // identifying the app, the shard it belongs to, machine it runs on, etc + TDomainName DomainName; + TShardName ShardName; + THostName HostName; + TAppName AppName; + NLMISC::CSString StartOrder; + + //------------------------------------------------------------------------- + // some real data + TCmdLine CmdLine; // the command line to execute the app + TCfgFile CfgFile; // the cfg file contents for the app + TDataPacks DataPacks; // the set of data packs for the app + + //------------------------------------------------------------------------- + // a handy 'clear()' method + void clear() + { + DomainName.clear(); + ShardName.clear(); + HostName.clear(); + AppName.clear(); + StartOrder.clear(); + CmdLine.clear(); + CfgFile.clear(); + DataPacks.clear(); + } + }; + + + //----------------------------------------------------------------------------- + // class CDeploymentConfiguration + //----------------------------------------------------------------------------- + + class CDeploymentConfiguration + { + public : + //------------------------------------------------------------------------- + // this is a singleton so we have a getInstance() method + // remaining methods are pure virtuals... + + // get hold of the instance of the singleton that derives from CDeploymentConfiguration + static CDeploymentConfiguration& getInstance(); + + + //------------------------------------------------------------------------- + // methods for reading / serialising deployment configuration + + // read the deployment configuration from a specified file + // + // file format is line base with the following format: + // '//'... comment to end of line + // 'define' // define a new block + // 'domain' // flag this block as a domain and give it a name + // 'shard' // flag this block as a shard and give it a name + // 'use' // add a child block to this block + // 'name' // set the unique name to use for the executables derived from this block + // 'cmdLine' // setup the command line to use for exes derived from this block + // 'host' // assign the exes derived from this block to a given host + // 'cfg' // add a line to be included in the cfg file of executables derived from this block + // 'cfgAfter' // as above but cfg lines appended at end of cfg file (not at start) + // 'data' // add dependency on a given data block to exes derived from this block + // + virtual bool read(const NLMISC::CSString& fileName) =0; + + // write the info blocks out to a file (in no particular order) + // the output file can be re-read via the 'read()' method + virtual void write(const NLMISC::CSString& fileName) =0; + + // serialise the deployment configuration, for dispatch to / reception from other apps + virtual void serial(NLMISC::IStream& stream) =0; + + + //------------------------------------------------------------------------- + // read accessors - getting sets of names + + // get the complete set of hosts (machines on which we have apps running) + virtual void getHostNames(THostNames& result) const =0; + + // get the complete set of domains + virtual void getDomainNames(TDomainNames& result) const =0; + + // get the shards for a given domain + virtual void getShardNames(const TDomainName& domainName,TShardNames& result) const =0; + + // get the apps for a given host and domain + virtual void getAppNames(const THostName& hostName,const TDomainName& domainName,TAppNames& result) const =0; + + // get the apps for a given host, domain and shard + virtual void getAppNames(const THostName& hostName,const TDomainName& domainName,const TShardName& shardName,TAppNames& result) const =0; + + + //------------------------------------------------------------------------- + // read accessors - getting info structure for a named object + + // get a named host + virtual void getHost(const THostName& hostName,SHostDescription& result) const =0; + + // get a named domains + virtual void getDomain(const TDomainName& domainName, SDomainDescription& result) const =0; + + // get a named shard for a given domain + virtual void getShard(const TDomainName& domainName,const TShardName& shardName,SShardDescription& result) const =0; + + // get a named app for a given domain + virtual void getApp(const TDomainName& domainName,const TAppName& appName,SAppDescription& result) const =0; + + + //------------------------------------------------------------------------- + // methods for dumping info to a given log + + // dump raw information (organised by info block, not by domain or host) + virtual void dumpInfoBlocks(NLMISC::CLog& log) const =0; + + // dump info organised by domain + virtual void dumpDomains(NLMISC::CLog& log) const =0; + }; + +} // end of namespace + +//----------------------------------------------------------------------------- +#endif diff --git a/code/ryzom/common/src/game_share/entity_types.h b/code/ryzom/common/src/game_share/entity_types.h index 3841f9a17..68b42e954 100644 --- a/code/ryzom/common/src/game_share/entity_types.h +++ b/code/ryzom/common/src/game_share/entity_types.h @@ -130,7 +130,7 @@ const TCoord THRESHOLD_BEHAVIOUR = 60000; // Name const TPropIndex PROPERTY_NAME_STRING_ID = 6; -const TCoord THRESHOLD_NAME_STRING_ID = 25000; +const TCoord THRESHOLD_NAME_STRING_ID = 100000; // Main target const TPropIndex PROPERTY_TARGET_ID = 7; diff --git a/code/ryzom/common/src/game_share/game_share.vcproj b/code/ryzom/common/src/game_share/game_share.vcproj deleted file mode 100644 index a8a8e2d4b..000000000 --- a/code/ryzom/common/src/game_share/game_share.vcproj +++ /dev/null @@ -1,1720 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/code/ryzom/common/src/game_share/generate_client_db.xslt b/code/ryzom/common/src/game_share/generate_client_db.xslt index d14903519..0680a3e39 100644 --- a/code/ryzom/common/src/game_share/generate_client_db.xslt +++ b/code/ryzom/common/src/game_share/generate_client_db.xslt @@ -297,13 +297,13 @@ inline void _getProp(const CCDBSynchronised &db, ICDBStructNode *node, NLMISC::C - + class { public: - + private: ICDBStructNode *_BranchNode; diff --git a/code/ryzom/common/src/game_share/item_infos.cpp b/code/ryzom/common/src/game_share/item_infos.cpp index a968ff8a4..af84c5d6c 100644 --- a/code/ryzom/common/src/game_share/item_infos.cpp +++ b/code/ryzom/common/src/game_share/item_infos.cpp @@ -73,6 +73,7 @@ CItemInfos::CItemInfos() LacustreMagicResistance = 0; JungleMagicResistance = 0; PrimaryRootMagicResistance = 0; + PetNumber = 0; // 1 based! } void CItemInfos::serial(NLMISC::IStream & s) @@ -130,5 +131,6 @@ void CItemInfos::serial(NLMISC::IStream & s) s.serial( CustomText ); s.serial( R2ItemDescription ); s.serial( R2ItemComment ); + s.serial( PetNumber ); } diff --git a/code/ryzom/common/src/game_share/item_infos.h b/code/ryzom/common/src/game_share/item_infos.h index ff34bfddc..3fd94444e 100644 --- a/code/ryzom/common/src/game_share/item_infos.h +++ b/code/ryzom/common/src/game_share/item_infos.h @@ -139,6 +139,7 @@ public: ucstring CustomText; ucstring R2ItemDescription; ucstring R2ItemComment; + uint8 PetNumber; // 1 based pet index //@} }; diff --git a/code/ryzom/common/src/game_share/msg_ais_egs_gen.h b/code/ryzom/common/src/game_share/msg_ais_egs_gen.h index d7bfc39e7..e08716a4d 100644 --- a/code/ryzom/common/src/game_share/msg_ais_egs_gen.h +++ b/code/ryzom/common/src/game_share/msg_ais_egs_gen.h @@ -884,6 +884,7 @@ namespace RYMSG std::vector< NLMISC::CSheetId > _LootList; // NLMISC::CSheetId _Outpost; + uint32 _Organization; // float _MaxHitRangeForPC; // @@ -1336,6 +1337,21 @@ namespace RYMSG _Outpost = value; + } + + // + uint32 getOrganization() const + { + return _Organization; + } + + void setOrganization(uint32 value) + { + + + _Organization = value; + + } // float getMaxHitRangeForPC() const @@ -1431,6 +1447,7 @@ namespace RYMSG && _ContextOptions == other._ContextOptions && _LootList == other._LootList && _Outpost == other._Outpost + && _Organization == other._Organization && _MaxHitRangeForPC == other._MaxHitRangeForPC && _UserModelId == other._UserModelId && _CustomLootTableId == other._CustomLootTableId @@ -1489,6 +1506,7 @@ namespace RYMSG s.serialCont(_ContextOptions); s.serialCont(_LootList); s.serial(_Outpost); + s.serial(_Organization); s.serial(_MaxHitRangeForPC); s.serial(_UserModelId); s.serial(_CustomLootTableId); diff --git a/code/ryzom/common/src/game_share/persistent_data_template.h b/code/ryzom/common/src/game_share/persistent_data_template.h index ef76101cd..21cb2588d 100644 --- a/code/ryzom/common/src/game_share/persistent_data_template.h +++ b/code/ryzom/common/src/game_share/persistent_data_template.h @@ -175,18 +175,58 @@ #include "nel/misc/hierarchical_timer.h" inline uint32 saveGameCycleToSecond(NLMISC::TGameCycle tick) { + // Evaluate the UTC of this event (with the current date of save). Suppose that 1 second==10 tick + // NB: result should be positive since no event should have been launched before 1970! + if (tick < CTickEventHandler::getGameCycle()) + { + NLMISC::TGameCycle tick_dt = CTickEventHandler::getGameCycle() - tick; + uint32 s_dt = tick_dt / 10; + return NLMISC::CTime::getSecondsSince1970() - s_dt; + } + else + { + NLMISC::TGameCycle tick_dt = tick - CTickEventHandler::getGameCycle(); + uint32 s_dt = tick_dt / 10; + return NLMISC::CTime::getSecondsSince1970() + s_dt; + } +} +inline NLMISC::TGameCycle loadSecondToGameCycle(uint32 second) +{ + if (second < NLMISC::CTime::getSecondsSince1970()) + { + uint32 s_dt = NLMISC::CTime::getSecondsSince1970() - second; + NLMISC::TGameCycle tick_dt = s_dt * 10; + return CTickEventHandler::getGameCycle() - tick_dt; + } + else + { + uint32 s_dt = second - NLMISC::CTime::getSecondsSince1970(); + NLMISC::TGameCycle tick_dt = s_dt * 10; + return CTickEventHandler::getGameCycle() + tick_dt; + } +} + +/*inline uint32 saveGameCycleToSecond(NLMISC::TGameCycle tick) +{ + sint32 dt = CTickEventHandler::getGameCycle() - tick; + + // Evaluate the UTC of this event (with the current date of save). Suppose that 1 second==10 tick - return sint32(NLMISC::CTime::getSecondsSince1970()) + (sint32(tick) - sint32(CTickEventHandler::getGameCycle()))/10; + if (tick < CTickEventHandler::getGameCycle()) + return NLMISC::CTime::getSecondsSince1970(); + else + return NLMISC::CTime::getSecondsSince1970() + (tick - CTickEventHandler::getGameCycle())/10; // NB: result should be positive since no event should have been launched before 1970! } inline NLMISC::TGameCycle loadSecondToGameCycle(uint32 second) { + if (second < NLMISC::CTime::getSecondsSince1970()) + return 0; + // Convert UTC of the event to game cycle. Suppose that 1 second==10 tick - sint32 newTick= CTickEventHandler::getGameCycle() + (sint32(second) - sint32(NLMISC::CTime::getSecondsSince1970()))*10; - // If game cycle is loaded on a server where current game cycle is too young, we can have here negative values => avoid them - return std::max(newTick, sint32(0)); -} + return CTickEventHandler::getGameCycle() + (second - NLMISC::CTime::getSecondsSince1970())*10; +}*/ #endif // GameCycle property (saved as a UTC of the current game cycle, support server migration) diff --git a/code/ryzom/common/src/game_share/pvp_mode.cpp b/code/ryzom/common/src/game_share/pvp_mode.cpp index aa3ac1496..3e13fd428 100644 --- a/code/ryzom/common/src/game_share/pvp_mode.cpp +++ b/code/ryzom/common/src/game_share/pvp_mode.cpp @@ -35,6 +35,8 @@ namespace PVP_MODE NL_STRING_CONVERSION_TABLE_ENTRY(PvpZoneOutpost) NL_STRING_CONVERSION_TABLE_ENTRY(PvpFaction) NL_STRING_CONVERSION_TABLE_ENTRY(PvpFactionFlagged) + NL_STRING_CONVERSION_TABLE_ENTRY(PvpZoneSafe) + NL_STRING_CONVERSION_TABLE_ENTRY(PvpSafe) NL_END_STRING_CONVERSION_TABLE(TPVPMode, PVPModeConversion, Unknown) TPVPMode fromString(const std::string & str) diff --git a/code/ryzom/common/src/game_share/pvp_mode.h b/code/ryzom/common/src/game_share/pvp_mode.h index dd52f1fd6..0e654752f 100644 --- a/code/ryzom/common/src/game_share/pvp_mode.h +++ b/code/ryzom/common/src/game_share/pvp_mode.h @@ -32,10 +32,12 @@ namespace PVP_MODE PvpZoneOutpost = 32, PvpFaction = 64, PvpFactionFlagged = 128, + PvpZoneSafe = 256, + PvpSafe = 512, Unknown, NbModes = Unknown, - NbBits = 8 // number of bits needed to store all valid values + NbBits = 10 // number of bits needed to store all valid values }; diff --git a/code/ryzom/common/src/game_share/ryzom_mirror_properties.h b/code/ryzom/common/src/game_share/ryzom_mirror_properties.h index 0aab0b870..afd0ac892 100644 --- a/code/ryzom/common/src/game_share/ryzom_mirror_properties.h +++ b/code/ryzom/common/src/game_share/ryzom_mirror_properties.h @@ -138,7 +138,7 @@ void initRyzomVisualPropertyIndices( CMirroredDataSet& dataset ); #define TYPE_BOT_TRADE_SELECTOR2 uint64 #define TYPE_EVENT_FACTION_ID uint32 -#define TYPE_PVP_MODE uint8 +#define TYPE_PVP_MODE uint32 #define TYPE_PVP_CLAN uint32 #define TYPE_FUEL bool diff --git a/code/ryzom/common/src/game_share/send_chat.h b/code/ryzom/common/src/game_share/send_chat.h index cefb8bba0..1efa7acee 100644 --- a/code/ryzom/common/src/game_share/send_chat.h +++ b/code/ryzom/common/src/game_share/send_chat.h @@ -115,7 +115,7 @@ inline void npcChatToChannelEx(const TDataSetRow &senderId, CChatGroup::TGroupTy * Chat group can be constructed from CChatGroup class. * sentence is the sentence to be sent. */ -inline void npcChatToChannelSentence(const TDataSetRow &senderId, CChatGroup::TGroupType groupType, std::string& sentence) +inline void npcChatToChannelSentence(const TDataSetRow &senderId, CChatGroup::TGroupType groupType, ucstring& sentence) { NLNET::CMessage msgout("NPC_CHAT_SENTENCE"); msgout.serial(const_cast(senderId)); diff --git a/code/ryzom/common/src/game_share/sp_type.cpp b/code/ryzom/common/src/game_share/sp_type.cpp index 1ab59ed04..a05a8b554 100644 --- a/code/ryzom/common/src/game_share/sp_type.cpp +++ b/code/ryzom/common/src/game_share/sp_type.cpp @@ -51,4 +51,4 @@ std::map CSPType::_ValueMap; // End of static implementation of CSPType -} // End of EGSPD \ No newline at end of file +} // End of EGSPD diff --git a/code/ryzom/common/src/game_share/txt_command.h b/code/ryzom/common/src/game_share/txt_command.h new file mode 100644 index 000000000..f8d2ec39e --- /dev/null +++ b/code/ryzom/common/src/game_share/txt_command.h @@ -0,0 +1,174 @@ +// Ryzom - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . +#ifndef TXT_COMMAND_H +#define TXT_COMMAND_H + + +//------------------------------------------------------------------------------------------------- +// includes +//------------------------------------------------------------------------------------------------- + +#include "nel/misc/types_nl.h" +#include "nel/misc/common.h" +#include "nel/misc/debug.h" +#include "nel/misc/sstring.h" + + +//------------------------------------------------------------------------------------------------- +// MACRO TXT_COMMAND_SET +//------------------------------------------------------------------------------------------------- + +#define TXT_COMMAND_SET(setName,CONTEXT_CLASS)\ +class __CTxtCommandSet_##setName: public ITxtCommandSet\ +{\ +public:\ + static __CTxtCommandSet_##setName* getInstance()\ + {\ + static __CTxtCommandSet_##setName *p=NULL;\ + if (p==NULL) p= new __CTxtCommandSet_##setName;\ + return p;\ + }\ +};\ +static CTxtCommandSetPtr<__CTxtCommandSet_##setName> setName; + + +//------------------------------------------------------------------------------------------------- +// MACRO TXT_COMMAND +//------------------------------------------------------------------------------------------------- + +#define TXT_COMMAND(cmdName,setName,CONTEXT_CLASS)\ +struct __CTxtCommand_##cmdName: public ITxtCommand\ +{\ + static __CTxtCommand_##cmdName* getInstance()\ + {\ + static __CTxtCommand_##cmdName *p=NULL;\ + if (p==NULL) p= new __CTxtCommand_##cmdName;\ + return p;\ + }\ + virtual const char* getName() const {return #cmdName;}\ + virtual CTxtCommandResult execute(CONTEXT_CLASS& context,const NLMISC::CVectorSString& args,const NLMISC::CSString& rawArgs,const NLMISC::CSString& fullCmdLine);\ +private:\ + __CTxtCommand_##cmdName() {}\ +};\ +static ITxtCommandRegisterer<__CTxtCommand_##cmdName,__CTxtCommandSet_##setName> __CTxtCommand_##cmdName##_Registerer;\ +CTxtCommandResult __CTxtCommand_##cmdName::execute(CONTEXT_CLASS& context,const NLMISC::CVectorSString& args,const NLMISC::CSString& rawArgs,const NLMISC::CSString& fullCmdLine) + + +//------------------------------------------------------------------------------------------------- +// class CTxtCommandResult +//------------------------------------------------------------------------------------------------- + +class CTxtCommandResult +{ +public: + enum TType + { + SUCCESS, // command execution was successful + SYNTAX_ERROR, // there was a syntax error in the command line + BAD_PERMISSION, // the user doesn't have the right to run the given command + UNKNOWN_COMMAND, // behave as if the command was not recognised + EXECUTION_ERROR // there was an error during execution of the command + }; + CTxtCommandResult(const bool& success): _Type(success?SUCCESS:SYNTAX_ERROR) {} + CTxtCommandResult(const TType& type): _Type(type) {} + CTxtCommandResult(const TType& type,const NLMISC::CSString& reason): _Type(type), _Reason(reason) {} + TType getType() const { return _Type; } + const NLMISC::CSString& getReason() const { return _Reason; } +private: + TType _Type; + NLMISC::CSString _Reason; +}; + + +//------------------------------------------------------------------------------------------------- +// class ITxtCommand +//------------------------------------------------------------------------------------------------- + +template class ITxtCommand +{ +public: + virtual const char* getName() const =0; + virtual CTxtCommandResult execute(CONTEXT_CLASS& context,const NLMISC::CVectorSString& args,const NLMISC::CSString& rawArgs,const NLMISC::CSString& fullCmdLine) =0; +}; + + +//------------------------------------------------------------------------------------------------- +// class ITxtCommandRegisterer +//------------------------------------------------------------------------------------------------- + +template struct ITxtCommandRegisterer +{ + ITxtCommandRegisterer() + { + SET::getInstance()->registerTxtCommand(CMD::getInstance()); + } +}; + + +//------------------------------------------------------------------------------------------------- +// class ITxtCommandSet +//------------------------------------------------------------------------------------------------- + +template class ITxtCommandSet +{ +public: + void registerTxtCommand(ITxtCommand* txtCommand) + { + nlassert(_TxtCommands.find(txtCommand->getName())==_TxtCommands.end()); + _TxtCommands[txtCommand->getName()]= txtCommand; + } + CTxtCommandResult execute(CONTEXT_CLASS& context,const NLMISC::CSString& cmdLine) + { + NLMISC::CSString cmdTail=cmdLine; + NLMISC::CSString keyword=cmdTail.firstWord(true); + typename TTxtCommands::iterator it= _TxtCommands.find(keyword); + if (it==_TxtCommands.end()) return CTxtCommandResult::UNKNOWN_COMMAND; + NLMISC::CVectorSString args; + cmdTail.splitWords(args); + return it->second->execute(context,args,cmdTail,cmdLine); + } +private: + typedef ITxtCommand TTxtCommand; + typedef std::map TTxtCommands; + TTxtCommands _TxtCommands; +}; + + +//------------------------------------------------------------------------------------------------- +// class ITxtCommandRegisterer +//------------------------------------------------------------------------------------------------- + +template struct CTxtCommandSetPtr +{ + CTxtCommandSetPtr() + { + SET::getInstance(); + } + + SET& operator*() + { + return *SET::getInstance(); + } + + SET* operator->() + { + return SET::getInstance(); + } +}; + + +//------------------------------------------------------------------------------------------------- +#endif diff --git a/code/ryzom/gen_deps.sh b/code/ryzom/gen_deps.sh deleted file mode 100755 index a6a286289..000000000 --- a/code/ryzom/gen_deps.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -command='' -sources='' -phase=0 -for arg in $* -do - if [ "$phase" == 0 ] && [ "$arg" == '--' ] - then - phase=1 - elif [ "$phase" == 0 ] - then - command="$command $arg" - elif [ "$phase" == 1 ] - then - sources="$sources $arg" - fi -done - -for src in $sources -do - obj=`echo $src | sed -e 's/.cpp$/.o/'` - $command -MT $obj -M $src -done diff --git a/code/ryzom/server/Makefile b/code/ryzom/server/Makefile deleted file mode 100644 index f76559463..000000000 --- a/code/ryzom/server/Makefile +++ /dev/null @@ -1,29 +0,0 @@ -MAKE_NIGHT_ARGS=-j2 -MAKE_ALL_ARGS=-j2 -CXX=g++ -CC=g++ -BIN_DIR=$(RYZOM_PATH)/tools/scripts/linux - -night: - +make $(MAKE_NIGHT_ARGS) -k -C src night CXX=$(CXX) - -all: - +make $(MAKE_ALL_ARGS) -C src all - -mono: - +make -C src all - -clean: - +make -C src clean - -distclean: - +make -C src distclean - -cleansheets: - +make -C src cleansheets - -update: - +make -C src update - -touch: - +make -C src touch diff --git a/code/ryzom/server/data_shard/client_commands_privileges.txt b/code/ryzom/server/data_shard/client_commands_privileges.txt index c61537dfa..9b0e115d4 100644 --- a/code/ryzom/server/data_shard/client_commands_privileges.txt +++ b/code/ryzom/server/data_shard/client_commands_privileges.txt @@ -40,6 +40,9 @@ forceTargetToDie :DEV:SGM:GM:EM: // Force entity target to die getEventFaction :DEV:SGM:GM:EM: // Get the event faction of player: giveRespawnPoint :DEV:SGM:GM: // Give a respawn point to a player: guildInvite // Send a guild invite to a player character without distance constrainte +setLeague // Create a League +leagueInvite // Send a League invite to a Team Leader character without distance constrainte +leagueKick // Kick a player or team from league roomInvite // Send a room invite roomKick // Remove a room invite guildMOTD // Set the guild message of the day, command effective only for officer and more graded guild members @@ -72,8 +75,6 @@ renameGuild :DEV:SGM:GM:EM: // Rename a guild: renamePlayerForEvent :DEV:SGM:GM:EM:EG: // Rename a player temporarily for an event: resetPowerFlags :DEV:SGM:GM:EM: // Reset the ineffective aura and the power flags for given character -respawnAfterDeath // Respawn after death at re-spawn point name, it must be valid (validated by PC and usable): -resurrected // Another PC resurrect PC by giving some energy: root :DEV:SGM:GM:EM:VG:SG: // Root a player:

*=NuEbMpaxt`6h=d+H1B-(;L1 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