From fd32a099e0922786890a2975fe0dfc7da696f9ec Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Wed, 27 Apr 2011 20:03:17 +0300 Subject: [PATCH 002/118] Fix in comments --- code/README | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/README b/code/README index e880666e5..91fe60ec8 100644 --- a/code/README +++ b/code/README @@ -1,7 +1,7 @@ Introduction ------------ -NeL is a software platform for creating and running massively multi-user +Ryzom Core is a software platform for creating and running massively multi-user entertainment in a 3D environment over the Internet. The NeL library is further divided into specific modules: network, ai, 3d @@ -12,14 +12,14 @@ each other so you can use only the parts you really need in your project. If you want know more about the library content and functionalities, you should take a look on the documents present in the doc directory. -NeL is currently developped and tested under GNU/Linux and Windows +Ryzom Core is currently developped and tested under GNU/Linux and Windows environments. License ------- -NeL is a Free Software project under the GNU Affero General Public License, +Ryzom Core is a Free Software project under the GNU Affero General Public License, which means all its code is available for everyone to download, examine, use, modify, and distribute, subject to the usual restrictions attached to any GPL software. If you are not familiar with the AGPL, see the COPYING From e22bad3f8ea1796ce1f84ef110873a3b9f23477a Mon Sep 17 00:00:00 2001 From: cemycc Date: Fri, 29 Apr 2011 22:52:51 +0300 Subject: [PATCH 003/118] Create directory for the Translation Manager plugin --- .../3d/object_viewer_qt/src/plugins/translation_manager/README | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/README 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 new file mode 100644 index 000000000..c5c895519 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/translation_manager/README @@ -0,0 +1,3 @@ +OVQT Translation Manager plugin +-------------------------------- +http://dev.ryzom.com/wiki/ryzom/OVQTTranslationPluginGSoc2011 From c51bc4ff7037f08d3780bef89489043b354af6de Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 1 May 2011 17:01:11 +0200 Subject: [PATCH 004/118] Changed: #1275 Create an OpenGL ES driver --- code/CMakeModules/ConfigureChecks.cmake | 4 ++++ code/CMakeModules/nel.cmake | 9 +++++++++ code/config.h.cmake | 1 + 3 files changed, 14 insertions(+) diff --git a/code/CMakeModules/ConfigureChecks.cmake b/code/CMakeModules/ConfigureChecks.cmake index 707b85c86..baf6e0e7c 100644 --- a/code/CMakeModules/ConfigureChecks.cmake +++ b/code/CMakeModules/ConfigureChecks.cmake @@ -47,6 +47,10 @@ MACRO(NL_CONFIGURE_CHECKS) IF(WITH_DRIVER_OPENGL) SET(NL_OPENGL_AVAILABLE 1) ENDIF(WITH_DRIVER_OPENGL) + + IF(WITH_DRIVER_OPENGLES) + SET(NL_OPENGLES_AVAILABLE 1) + ENDIF(WITH_DRIVER_OPENGLES) IF(WITH_DRIVER_DIRECT3D) SET(NL_DIRECT3D_AVAILABLE 1) diff --git a/code/CMakeModules/nel.cmake b/code/CMakeModules/nel.cmake index dc6b477d0..cf6154648 100644 --- a/code/CMakeModules/nel.cmake +++ b/code/CMakeModules/nel.cmake @@ -93,6 +93,14 @@ MACRO(NL_ADD_STATIC_VID_DRIVERS name) TARGET_LINK_LIBRARIES(${name} nel_drv_opengl) ENDIF(WIN32) ENDIF(WITH_DRIVER_OPENGL) + + IF(WITH_DRIVER_OPENGLES) + IF(WIN32) + TARGET_LINK_LIBRARIES(${name} nel_drv_opengles_win) + ELSE(WIN32) + TARGET_LINK_LIBRARIES(${name} nel_drv_opengles) + ENDIF(WIN32) + ENDIF(WITH_DRIVER_OPENGLES) ENDIF(WITH_STATIC_DRIVERS) ENDMACRO(NL_ADD_STATIC_VID_DRIVERS) @@ -208,6 +216,7 @@ MACRO(NL_SETUP_NEL_DEFAULT_OPTIONS) # Drivers Support ### OPTION(WITH_DRIVER_OPENGL "Build OpenGL Driver (3D)" ON ) + OPTION(WITH_DRIVER_OPENGLES "Build OpenGL ES Driver (3D)" OFF) OPTION(WITH_DRIVER_DIRECT3D "Build Direct3D Driver (3D)" OFF) OPTION(WITH_DRIVER_OPENAL "Build OpenAL Driver (Sound)" ON ) OPTION(WITH_DRIVER_FMOD "Build FMOD Driver (Sound)" OFF) diff --git a/code/config.h.cmake b/code/config.h.cmake index a2f65aa41..2f2ff8095 100644 --- a/code/config.h.cmake +++ b/code/config.h.cmake @@ -35,6 +35,7 @@ #cmakedefine HAVE_STAT64 1 #cmakedefine NL_OPENGL_AVAILABLE ${NL_OPENGL_AVAILABLE} +#cmakedefine NL_OPENGLES_AVAILABLE ${NL_OPENGLES_AVAILABLE} #cmakedefine NL_DIRECT3D_AVAILABLE ${NL_DIRECT3D_AVAILABLE} #cmakedefine NL_FMOD_AVAILABLE ${NL_FMOD_AVAILABLE} From 8946b580cbfc0f78f9ba7490128cf8dccad4d9b2 Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 1 May 2011 18:27:05 +0200 Subject: [PATCH 005/118] Changed: #1275 Create an OpenGL ES driver --- .../3d/driver/opengl/driver_opengl_light.cpp | 5 + .../3d/driver/opengl/driver_opengl_matrix.cpp | 15 ++- .../3d/driver/opengl/driver_opengl_states.cpp | 98 ++++++++++++++++--- .../3d/driver/opengl/driver_opengl_vertex.cpp | 52 +++++++++- .../driver_opengl_vertex_buffer_hard.cpp | 15 ++- 5 files changed, 169 insertions(+), 16 deletions(-) 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 073d39176..e5c3cff6e 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_light.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_light.cpp @@ -139,8 +139,13 @@ void CDriverGL::setLightInternal(uint8 num, const CLight& light) else { // Deactivate spot properties +#ifdef USE_OPENGLES + glLightf (lightNum, GL_SPOT_CUTOFF, 180.f); + glLightf (lightNum, GL_SPOT_EXPONENT, 0.f); +#else glLighti (lightNum, GL_SPOT_CUTOFF, 180); glLighti (lightNum, GL_SPOT_EXPONENT, 0); +#endif } // Flag this light as dirt. diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_matrix.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_matrix.cpp index 0e5cea073..4106c38f2 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_matrix.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_matrix.cpp @@ -15,24 +15,35 @@ // along with this program. If not, see . #include "stdopengl.h" - #include "driver_opengl.h" + namespace NL3D { // *************************************************************************** void CDriverGL::setFrustum(float left, float right, float bottom, float top, float znear, float zfar, bool perspective) { - H_AUTO_OGL(CDriverGL_setFrustum) + H_AUTO_OGL(CDriverGL_setFrustum); + glMatrixMode(GL_PROJECTION); glLoadIdentity(); + if (perspective) { +#ifdef USE_OPENGLES + glFrustumf(left,right,bottom,top,znear,zfar); +#else glFrustum(left,right,bottom,top,znear,zfar); +#endif } else { +#ifdef USE_OPENGLES + glOrthof(left,right,bottom,top,znear,zfar); +#else glOrtho(left,right,bottom,top,znear,zfar); +#endif } + _ProjMatDirty = true; // Backup znear and zfar for zbias setup diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_states.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_states.cpp index fb4f14dc2..e0c79c504 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_states.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_states.cpp @@ -144,33 +144,62 @@ void CDriverGLStates::forceDefaults(uint nbStages) for(stage=0;stage_Extensions.OESMapBuffer) + { + unmapOk = nglUnmapBufferOES(GL_ARRAY_BUFFER); + } +#else + unmapOk = nglUnmapBufferARB(GL_ARRAY_BUFFER_ARB); +#endif + #ifdef NL_DEBUG _Unmapping = false; #endif From 41f801149895ff797c7efbae20cce36c04d7fcc4 Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 1 May 2011 19:11:10 +0200 Subject: [PATCH 006/118] Changed: #1275 Create an OpenGL ES driver --- .../src/3d/driver/opengl/driver_opengl.cpp | 8 ++- .../driver/opengl/driver_opengl_material.cpp | 20 ++++++- .../3d/driver/opengl/driver_opengl_states.cpp | 47 +++++++++++---- .../driver_opengl_vertex_buffer_hard.cpp | 58 ++++++++++++++++++- 4 files changed, 116 insertions(+), 17 deletions(-) diff --git a/code/nel/src/3d/driver/opengl/driver_opengl.cpp b/code/nel/src/3d/driver/opengl/driver_opengl.cpp index 02ba70993..f222dc5a7 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl.cpp @@ -2508,8 +2508,13 @@ void CDriverGL::checkTextureOn() const GLboolean flagCM; GLboolean flagTR; glGetBooleanv(GL_TEXTURE_2D, &flag2D); +#ifdef USE_OPENGLES + glGetBooleanv(GL_TEXTURE_CUBE_MAP_OES, &flagCM); + flagTR = true; // always true in OpenGL ES +#else glGetBooleanv(GL_TEXTURE_CUBE_MAP_ARB, &flagCM); glGetBooleanv(GL_TEXTURE_RECTANGLE_NV, &flagTR); +#endif switch(dgs.getTextureMode()) { case CDriverGLStates::TextureDisabled: @@ -2545,7 +2550,8 @@ bool CDriverGL::supportOcclusionQuery() const // *************************************************************************** bool CDriverGL::supportTextureRectangle() const { - H_AUTO_OGL(CDriverGL_supportTextureRectangle) + H_AUTO_OGL(CDriverGL_supportTextureRectangle); + return (_Extensions.NVTextureRectangle || _Extensions.EXTTextureRectangle || _Extensions.ARBTextureRectangle); } diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp index 569aceb0c..9dd08a51f 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp @@ -137,7 +137,9 @@ void CDriverGL::setTextureEnvFunction(uint stage, CMaterial& mat) _DriverGLStates.setTexGenMode (stage, GL_OBJECT_LINEAR); } else if(mode==CMaterial::TexCoordGenEyeSpace) + { _DriverGLStates.setTexGenMode (stage, GL_EYE_LINEAR); + } } else { @@ -918,7 +920,11 @@ void CDriverGL::setupLightMapPass(uint pass) if (mat._LightMapsMulx2) { // Multiply x 2 +#ifdef USE_OPENGLES + glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE, 2); +#else glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 2); +#endif } } } @@ -1027,7 +1033,11 @@ void CDriverGL::endLightMapMultiPass() for (uint32 i = 0; i < (_NLightMapPerPass+1); ++i) { _DriverGLStates.activeTextureARB(i); +#ifdef USE_OPENGLES + glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE, 1); +#else glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE_EXT, 1); +#endif } } } @@ -1102,13 +1112,16 @@ void CDriverGL::setupSpecularBegin() // todo hulud remove // _DriverGLStates.setTextureMode(CDriverGLStates::TextureCubeMap); +#ifdef USE_OPENGLES + _DriverGLStates.setTexGenMode (1, GL_REFLECTION_MAP_OES); +#else _DriverGLStates.setTexGenMode (1, GL_REFLECTION_MAP_ARB); +#endif + // setup the good matrix for stage 1. glMatrixMode(GL_TEXTURE); glLoadMatrixf( _SpecularTexMtx.get() ); glMatrixMode(GL_MODELVIEW); - - } // *************************************************************************** @@ -1292,7 +1305,8 @@ void CDriverGL::setupSpecularPass(uint pass) _DriverGLStates.setTextureMode(CDriverGLStates::TextureDisabled); } else - { // Multiply texture1 by alpha_texture0 and display with add + { + // Multiply texture1 by alpha_texture0 and display with add _DriverGLStates.enableBlend(true); _DriverGLStates.blendFunc(GL_ONE, GL_ONE); diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_states.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_states.cpp index e0c79c504..cf30758dc 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_states.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_states.cpp @@ -77,7 +77,8 @@ void CDriverGLStates::init(bool supportTextureCubeMap, bool supportTextureRect // *************************************************************************** void CDriverGLStates::forceDefaults(uint nbStages) { - H_AUTO_OGL(CDriverGLStates_forceDefaults) + H_AUTO_OGL(CDriverGLStates_forceDefaults); + // Enable / disable. _CurFog= false; _CurBlend= false; @@ -86,6 +87,7 @@ void CDriverGLStates::forceDefaults(uint nbStages) _CurLighting= false; _CurZWrite= true; _CurStencilTest=false; + // setup GLStates. glDisable(GL_FOG); glDisable(GL_BLEND); @@ -642,10 +644,14 @@ void CDriverGLStates::setTexGenMode (uint stage, GLint mode) if(mode==0) { +#ifdef USE_OPENGLES + glDisable(GL_TEXTURE_GEN_STR_OES); +#else glDisable( GL_TEXTURE_GEN_S ); glDisable( GL_TEXTURE_GEN_T ); glDisable( GL_TEXTURE_GEN_R ); glDisable( GL_TEXTURE_GEN_Q ); +#endif } else { @@ -667,6 +673,7 @@ void CDriverGLStates::setTexGenMode (uint stage, GLint mode) { glDisable( GL_TEXTURE_GEN_Q ); } + // Enable All. #ifdef USE_OPENGLES glEnable(GL_TEXTURE_GEN_STR_OES); @@ -853,22 +860,25 @@ void CDriverGLStates::enableNormalArray(bool enable) // *************************************************************************** void CDriverGLStates::enableWeightArray(bool enable) { - H_AUTO_OGL(CDriverGLStates_enableWeightArray) + H_AUTO_OGL(CDriverGLStates_enableWeightArray); + if(_WeightArrayEnabled != enable) { +#ifndef USE_OPENGLES if(enable) glEnableClientState(GL_VERTEX_WEIGHTING_EXT); else glDisableClientState(GL_VERTEX_WEIGHTING_EXT); +#endif + _WeightArrayEnabled= enable; - - } } // *************************************************************************** void CDriverGLStates::enableColorArray(bool enable) { - H_AUTO_OGL(CDriverGLStates_enableColorArray) + H_AUTO_OGL(CDriverGLStates_enableColorArray); + if(_ColorArrayEnabled != enable) { if(enable) @@ -885,14 +895,16 @@ void CDriverGLStates::enableColorArray(bool enable) // *************************************************************************** void CDriverGLStates::enableSecondaryColorArray(bool enable) { - H_AUTO_OGL(CDriverGLStates_enableSecondaryColorArray) + H_AUTO_OGL(CDriverGLStates_enableSecondaryColorArray); + if(_SecondaryColorArrayEnabled != enable) { +#ifndef USE_OPENGLES if(enable) glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT); else glDisableClientState(GL_SECONDARY_COLOR_ARRAY_EXT); - +#endif _SecondaryColorArrayEnabled= enable; @@ -910,10 +922,15 @@ void CDriverGLStates::enableSecondaryColorArray(bool enable) // *************************************************************************** void CDriverGLStates::clientActiveTextureARB(uint stage) { - H_AUTO_OGL(CDriverGLStates_clientActiveTextureARB) + H_AUTO_OGL(CDriverGLStates_clientActiveTextureARB); + if( _CurrentClientActiveTextureARB != stage ) { +#ifdef USE_OPENGLES + glClientActiveTexture(GL_TEXTURE0+stage); +#else nglClientActiveTextureARB(GL_TEXTURE0_ARB+stage); +#endif _CurrentClientActiveTextureARB= stage; } } @@ -921,7 +938,8 @@ void CDriverGLStates::clientActiveTextureARB(uint stage) // *************************************************************************** void CDriverGLStates::enableTexCoordArray(bool enable) { - H_AUTO_OGL(CDriverGLStates_enableTexCoordArray) + H_AUTO_OGL(CDriverGLStates_enableTexCoordArray); + if(_TexCoordArrayEnabled[_CurrentClientActiveTextureARB] != enable) { if(enable) @@ -937,14 +955,16 @@ void CDriverGLStates::enableTexCoordArray(bool enable) // *************************************************************************** void CDriverGLStates::enableVertexAttribArray(uint glIndex, bool enable) { - H_AUTO_OGL(CDriverGLStates_enableVertexAttribArray) + H_AUTO_OGL(CDriverGLStates_enableVertexAttribArray); + if(_VertexAttribArrayEnabled[glIndex] != enable) { +#ifndef USE_OPENGLES if(enable) glEnableClientState(glIndex+GL_VERTEX_ATTRIB_ARRAY0_NV); else glDisableClientState(glIndex+GL_VERTEX_ATTRIB_ARRAY0_NV); - +#endif _VertexAttribArrayEnabled[glIndex]= enable; } @@ -953,15 +973,18 @@ void CDriverGLStates::enableVertexAttribArray(uint glIndex, bool enable) // *************************************************************************** void CDriverGLStates::enableVertexAttribArrayARB(uint glIndex,bool enable) { - H_AUTO_OGL(CDriverGLStates_enableVertexAttribArrayARB) + H_AUTO_OGL(CDriverGLStates_enableVertexAttribArrayARB); + #ifndef NL3D_GLSTATE_DISABLE_CACHE if(_VertexAttribArrayEnabled[glIndex] != enable) #endif { +#ifndef USE_OPENGLES if(enable) nglEnableVertexAttribArrayARB(glIndex); else nglDisableVertexAttribArrayARB(glIndex); +#endif _VertexAttribArrayEnabled[glIndex]= enable; } diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_vertex_buffer_hard.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_vertex_buffer_hard.cpp index ce436dcc6..3c74d02b4 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_vertex_buffer_hard.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_vertex_buffer_hard.cpp @@ -1210,19 +1210,37 @@ IVertexBufferHardGL *CVertexArrayRangeARB::createVBHardGL(uint size, CVertexBuff // create a ARB VBHard GLuint vertexBufferID; glGetError(); + +#ifdef USE_OPENGLES + glGenBuffers(1, &vertexBufferID); +#else nglGenBuffersARB(1, &vertexBufferID); +#endif + if (glGetError() != GL_NO_ERROR) return false; _Driver->_DriverGLStates.forceBindARBVertexBuffer(vertexBufferID); switch(_VBType) { case CVertexBuffer::AGPPreferred: +#ifdef USE_OPENGLES + glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_DYNAMIC_DRAW); +#else nglBufferDataARB(GL_ARRAY_BUFFER_ARB, size, NULL, GL_DYNAMIC_DRAW_ARB); +#endif break; case CVertexBuffer::StaticPreferred: if (_Driver->getStaticMemoryToVRAM()) +#ifdef USE_OPENGLES + glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_STATIC_DRAW); +#else nglBufferDataARB(GL_ARRAY_BUFFER_ARB, size, NULL, GL_STATIC_DRAW_ARB); +#endif else +#ifdef USE_OPENGLES + glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_DYNAMIC_DRAW); +#else nglBufferDataARB(GL_ARRAY_BUFFER_ARB, size, NULL, GL_DYNAMIC_DRAW_ARB); +#endif break; default: nlassert(0); @@ -1230,7 +1248,12 @@ IVertexBufferHardGL *CVertexArrayRangeARB::createVBHardGL(uint size, CVertexBuff } if (glGetError() != GL_NO_ERROR) { +#ifdef USE_OPENGLES + glDeleteBuffers(1, &vertexBufferID); +#else nglDeleteBuffersARB(1, &vertexBufferID); +#endif + return false; } CVertexBufferHardARB *newVbHard= new CVertexBufferHardARB(_Driver, vb); @@ -1272,8 +1295,13 @@ void CVertexArrayRangeARB::updateLostBuffers() { nlassert((*it)->_VertexObjectId); GLuint id = (GLuint) (*it)->_VertexObjectId; +#ifdef USE_OPENGLES + nlassert(glIsBuffer(id)); + glDeleteBuffers(1, &id); +#else nlassert(nglIsBufferARB(id)); nglDeleteBuffersARB(1, &id); +#endif (*it)->_VertexObjectId = 0; (*it)->VB->setLocation(CVertexBuffer::NotResident); } @@ -1316,8 +1344,13 @@ CVertexBufferHardARB::~CVertexBufferHardARB() if (_VertexObjectId) { GLuint id = (GLuint) _VertexObjectId; +#ifdef USE_OPENGLES + nlassert(glIsBuffer(id)); + glDeleteBuffers(1, &id); +#else nlassert(nglIsBufferARB(id)); nglDeleteBuffersARB(1, &id); +#endif } if (_VertexArrayRange) { @@ -1341,7 +1374,8 @@ CVertexBufferHardARB::~CVertexBufferHardARB() // *************************************************************************** void *CVertexBufferHardARB::lock() { - H_AUTO_OGL(CVertexBufferHardARB_lock) + H_AUTO_OGL(CVertexBufferHardARB_lock); + if (_VertexPtr) return _VertexPtr; // already locked if (_Invalid) { @@ -1352,7 +1386,13 @@ void *CVertexBufferHardARB::lock() } // recreate a vb GLuint vertexBufferID; + +#ifdef USE_OPENGLES + glGenBuffers(1, &vertexBufferID); +#else nglGenBuffersARB(1, &vertexBufferID); +#endif + if (glGetError() != GL_NO_ERROR) { _Driver->incrementResetCounter(); @@ -1363,13 +1403,25 @@ void *CVertexBufferHardARB::lock() switch(_MemType) { case CVertexBuffer::AGPPreferred: +#ifdef USE_OPENGLES + glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_DYNAMIC_DRAW); +#else nglBufferDataARB(GL_ARRAY_BUFFER_ARB, size, NULL, GL_DYNAMIC_DRAW_ARB); +#endif break; case CVertexBuffer::StaticPreferred: if (_Driver->getStaticMemoryToVRAM()) +#ifdef USE_OPENGLES + glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_STATIC_DRAW); +#else nglBufferDataARB(GL_ARRAY_BUFFER_ARB, size, NULL, GL_STATIC_DRAW_ARB); +#endif else +#ifdef USE_OPENGLES + glBufferData(GL_ARRAY_BUFFER, size, NULL, GL_DYNAMIC_DRAW); +#else nglBufferDataARB(GL_ARRAY_BUFFER_ARB, size, NULL, GL_DYNAMIC_DRAW_ARB); +#endif break; default: nlassert(0); @@ -1378,7 +1430,11 @@ void *CVertexBufferHardARB::lock() if (glGetError() != GL_NO_ERROR) { _Driver->incrementResetCounter(); +#ifdef USE_OPENGLES + glDeleteBuffers(1, &vertexBufferID); +#else nglDeleteBuffersARB(1, &vertexBufferID); +#endif return &_DummyVB[0];; } _VertexObjectId = vertexBufferID; From 34a3816186fb74664d225bfa36a885e127457c31 Mon Sep 17 00:00:00 2001 From: Fabien_HENON Date: Wed, 4 May 2011 21:55:57 -0500 Subject: [PATCH 008/118] Test for my branch gsoc2011-guildmission --- test.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 test.txt diff --git a/test.txt b/test.txt new file mode 100644 index 000000000..30d74d258 --- /dev/null +++ b/test.txt @@ -0,0 +1 @@ +test \ No newline at end of file From 08c374a84fc2507456e6e1980702614966334a79 Mon Sep 17 00:00:00 2001 From: Fabien_HENON Date: Wed, 4 May 2011 21:58:28 -0500 Subject: [PATCH 009/118] Removing test for my branch gsoc2011-guildmissions --- test.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 test.txt diff --git a/test.txt b/test.txt deleted file mode 100644 index 30d74d258..000000000 --- a/test.txt +++ /dev/null @@ -1 +0,0 @@ -test \ No newline at end of file From 1af3224bc97e936d2538b2c3124ecba12b7d2351 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Sat, 7 May 2011 15:51:15 +0300 Subject: [PATCH 010/118] Header cascading section resizes is enabled. --- .../leveldesign/georges_editor_qt/src/georges_treeview_form.ui | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/ryzom/tools/leveldesign/georges_editor_qt/src/georges_treeview_form.ui b/code/ryzom/tools/leveldesign/georges_editor_qt/src/georges_treeview_form.ui index 4cff36c92..f5c283b55 100644 --- a/code/ryzom/tools/leveldesign/georges_editor_qt/src/georges_treeview_form.ui +++ b/code/ryzom/tools/leveldesign/georges_editor_qt/src/georges_treeview_form.ui @@ -57,6 +57,9 @@ 0 + + true + From dc07038a82d563ac146365c04833e5fb8892f76d Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Sat, 7 May 2011 18:23:23 +0300 Subject: [PATCH 011/118] Fixed: geqt correctly handles in the FileOpenDialog of cancel action and empty icon --- .../src/georges_treeview_dialog.cpp | 4 +++- .../georges_editor_qt/src/georgesform_model.cpp | 13 ++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/code/ryzom/tools/leveldesign/georges_editor_qt/src/georges_treeview_dialog.cpp b/code/ryzom/tools/leveldesign/georges_editor_qt/src/georges_treeview_dialog.cpp index dea8d8ce7..65c53ed78 100644 --- a/code/ryzom/tools/leveldesign/georges_editor_qt/src/georges_treeview_dialog.cpp +++ b/code/ryzom/tools/leveldesign/georges_editor_qt/src/georges_treeview_dialog.cpp @@ -222,7 +222,7 @@ namespace NLQT { COFile file; - std::string s = CPath::lookup(loadedForm.toStdString()); + std::string s = CPath::lookup(loadedForm.toStdString(), false); if (file.open (s)) { try @@ -323,6 +323,8 @@ namespace NLQT path, "Images (*.png *.tga)" ); + if (file.isNull()) + return; QFileInfo info = QFileInfo(file); // TODO? diff --git a/code/ryzom/tools/leveldesign/georges_editor_qt/src/georgesform_model.cpp b/code/ryzom/tools/leveldesign/georges_editor_qt/src/georgesform_model.cpp index ab3092455..956380851 100644 --- a/code/ryzom/tools/leveldesign/georges_editor_qt/src/georgesform_model.cpp +++ b/code/ryzom/tools/leveldesign/georges_editor_qt/src/georgesform_model.cpp @@ -184,10 +184,17 @@ namespace NLQT if (Modules::objViewInt()) { QIcon *icon = Modules::objViewInt()->saveOneImage(value.toStdString()); - if (icon->isNull()) - return QIcon(":/images/pqrticles.png"); + if (icon) + { + if(icon->isNull()) + return QIcon(":/images/pqrticles.png"); + else + return QIcon(*icon); + } else - return QIcon(*icon); + { + return QIcon(); + } } } else if(value.contains(".tga") || value.contains(".png")) From fa09aefe0f8ef39391242369ad5ec9d19f8b0258 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Sun, 8 May 2011 00:13:56 +0300 Subject: [PATCH 012/118] Fixed: Mouse zoom correct works in geqt. --- .../tools/3d/object_viewer_widget/src/object_viewer_widget.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.cpp b/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.cpp index 4c6d25b3a..cbee70185 100644 --- a/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.cpp +++ b/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.cpp @@ -62,7 +62,8 @@ namespace NLQT _CameraFocal(75), _CurrentInstance(""), _BloomEffect(false), _Scene(0), QWidget(parent) { - + setMouseTracking(true); + setFocusPolicy(Qt::StrongFocus); _objectViewerWidget = this; _isGraphicsEnabled = true; From 5a39f3dad3f74cd17d41f8b23f3127841b54db99 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Sun, 8 May 2011 01:10:12 +0300 Subject: [PATCH 013/118] Changed: Added particle system animation. --- .../src/object_viewer_widget.cpp | 15 ++++++++++++++- .../src/object_viewer_widget.h | 4 ++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.cpp b/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.cpp index cbee70185..67abffbcb 100644 --- a/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.cpp +++ b/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.cpp @@ -262,7 +262,7 @@ namespace NLQT //updateAnimation(_AnimationDialog->getTime()); - + updateAnimatePS(); // 10. Update Camera (depends on entities) // ... @@ -719,6 +719,19 @@ namespace NLQT //CFile::deleteFile(filename); return icon; } + + void CObjectViewerWidget::updateAnimatePS(uint64 deltaTime) + { + static sint64 firstTime = NLMISC::CTime::getLocalTime(); + static sint64 lastTime = NLMISC::CTime::getLocalTime(); + if (deltaTime == 0) + { + deltaTime = NLMISC::CTime::getLocalTime() - lastTime; + } + lastTime += deltaTime; + float fdelta = 0.001f * (float) (lastTime - firstTime); + _Scene->animate ( fdelta); + } #if defined(NL_OS_WINDOWS) diff --git a/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.h b/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.h index 82bf26f92..15c9b0fa9 100644 --- a/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.h +++ b/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.h @@ -178,6 +178,10 @@ namespace NLQT void updateRender(); private: + + /// Update the animation time for Particle System animation. + /// @param deltaTime - set the manual animation time. + void updateAnimatePS(uint64 deltaTime = 0); static CObjectViewerWidget *_objectViewerWidget; From 5cfaa92c7012d267de6de735596db1edd5025f21 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Sun, 8 May 2011 01:11:10 +0300 Subject: [PATCH 014/118] Changed: Added preview particle system in geqt. --- .../georges_editor_qt/src/georges_treeview_dialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ryzom/tools/leveldesign/georges_editor_qt/src/georges_treeview_dialog.cpp b/code/ryzom/tools/leveldesign/georges_editor_qt/src/georges_treeview_dialog.cpp index 65c53ed78..b2c3d5a64 100644 --- a/code/ryzom/tools/leveldesign/georges_editor_qt/src/georges_treeview_dialog.cpp +++ b/code/ryzom/tools/leveldesign/georges_editor_qt/src/georges_treeview_dialog.cpp @@ -335,7 +335,7 @@ namespace NLQT } else { - if (path.contains(".shape")) + if (path.contains(".shape") || path.contains(".ps")) { if (Modules::objViewInt()) { From df6d71d0b891f957a356f7cfba25f1ecaa40332f Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Sun, 8 May 2011 01:48:38 +0300 Subject: [PATCH 015/118] Fixed: The program crashes after preview ps. --- .../tools/3d/object_viewer_widget/src/object_viewer_widget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.cpp b/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.cpp index 67abffbcb..70bf51f81 100644 --- a/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.cpp +++ b/code/nel/tools/3d/object_viewer_widget/src/object_viewer_widget.cpp @@ -79,7 +79,7 @@ namespace NLQT CObjectViewerWidget::~CObjectViewerWidget() { - + release(); } void CObjectViewerWidget::showEvent ( QShowEvent * event ) From d5fd2b0825a541da1785a3705a99a68a0076cf5f Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Mon, 9 May 2011 13:25:03 +0300 Subject: [PATCH 016/118] Fixed: #1193 Compilation with GCC (SchemeManager). Fix typos in comments/code. --- .../tools/3d/object_viewer_qt/doc/ovqt.dox | 4 +-- .../src/extension_system/iplugin_manager.h | 1 - .../src/extension_system/plugin_manager.cpp | 2 +- .../src/extension_system/plugin_manager.h | 2 +- .../src/extension_system/plugin_spec.cpp | 2 +- .../src/extension_system/plugin_spec.h | 2 +- .../src/plugins/core/core_constants.h | 8 ++--- .../plugins/object_viewer/particle_editor.h | 2 +- .../object_viewer/particle_system_page.cpp | 4 --- .../object_viewer/particle_tree_model.cpp | 2 +- .../plugins/object_viewer/scheme_manager.h | 11 +++---- .../object_viewer/value_gradient_dialog.cpp | 33 ++++++++++--------- .../object_viewer/value_gradient_dialog.h | 30 ++++++++--------- 13 files changed, 50 insertions(+), 53 deletions(-) diff --git a/code/nel/tools/3d/object_viewer_qt/doc/ovqt.dox b/code/nel/tools/3d/object_viewer_qt/doc/ovqt.dox index e15e37e5a..b310ad758 100644 --- a/code/nel/tools/3d/object_viewer_qt/doc/ovqt.dox +++ b/code/nel/tools/3d/object_viewer_qt/doc/ovqt.dox @@ -31,7 +31,7 @@ PROJECT_NAME = "Object Viewer Qt" # This could be handy for archiving the generated documentation or # if some version control system is used. -PROJECT_NUMBER = r90 +PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. @@ -643,7 +643,7 @@ FILE_PATTERNS = *.c \ # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. -RECURSIVE = NO +RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a 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 e67c9e588..05d4b832c 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 @@ -40,7 +40,6 @@ class IPluginSpec; class IPluginManager: public QObject { Q_OBJECT - public: IPluginManager(QObject *parent = 0): QObject(parent) {} virtual ~IPluginManager() {} 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 49dcec785..21c6e15b1 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 @@ -292,4 +292,4 @@ void CPluginManager::deleteAll() } } -}; // namespace NLQT \ No newline at end of file +}; // namespace ExtensionSystem \ No newline at end of file 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 d1a18485b..4ef3b2208 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 @@ -74,6 +74,6 @@ private: }; // class CPluginManager -} // namespace NLQT +} // namespace ExtensionSystem #endif // PLUGINMANAGER_H 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 7158c8d9f..d77d90962 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 @@ -266,4 +266,4 @@ bool CPluginSpec::reportError(const QString &err) return false; } -} // namespace NLQT \ No newline at end of file +} // namespace ExtensionSystem \ No newline at end of file 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 e73f3ed93..0cc895ada 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 @@ -79,7 +79,7 @@ private: friend class CPluginManager; }; -} // namespace NLQT +} // namespace ExtensionSystem #endif // PLUGINSPEC_H 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 18dc11c87..2adf4f35a 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 @@ -32,7 +32,7 @@ const char * const OVQT_CORE_PLUGIN = "Core"; 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"; @@ -54,11 +54,11 @@ 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 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 ABOUT_QT = "ObjectViewerQt.AboutQt"; //settings const char * const DATA_PATH_SECTION = "DataPath"; @@ -68,7 +68,7 @@ const char * const LEVELDESIGN_PATH = "LevelDesignPath"; const char * const ASSETS_PATH = "LevelDesignPath"; //resources -const char * const ICON_NEL = ":/core/images/nel.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"; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_editor.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_editor.h index da191705f..e4d1605e3 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_editor.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_editor.h @@ -214,7 +214,7 @@ public: { return _FontGen; } - + CSchemeManager *getSchemeManager () const { return _SchemeManager; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_system_page.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_system_page.cpp index b9c07db1a..072297437 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_system_page.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/particle_system_page.cpp @@ -605,25 +605,21 @@ void CParticleSystemPage::setMaxSteps(uint32 value) void CParticleSystemPage::setUserParam1(float value) { _Node->getPSPointer()->setUserParam(0, value); - updateModifiedFlag(); } void CParticleSystemPage::setUserParam2(float value) { _Node->getPSPointer()->setUserParam(1, value); - updateModifiedFlag(); } void CParticleSystemPage::setUserParam3(float value) { _Node->getPSPointer()->setUserParam(2, value); - updateModifiedFlag(); } void CParticleSystemPage::setUserParam4(float value) { _Node->getPSPointer()->setUserParam(3, value); - updateModifiedFlag(); } void CParticleSystemPage::setMaxViewDist(float value) 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 155e6ad4c..77286ed32 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 @@ -177,7 +177,7 @@ CParticleTreeModel::~CParticleTreeModel() int CParticleTreeModel::columnCount(const QModelIndex &parent) const { if (parent.isValid()) - return static_cast(parent.internalPointer())->columnCount(); + return static_cast(parent.internalPointer())->columnCount(); else return _rootItem->columnCount(); } 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 01a2abb35..8348fae0c 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,10 +25,10 @@ namespace NL3D { - class CPSAttribMakerBase; +class CPSAttribMakerBase; } - -namespace NLQT + +namespace NLQT { class CSchemeManager @@ -50,10 +50,9 @@ public: void remove(NL3D::CPSAttribMakerBase *am); // rename a scheme, given a pointer on it void rename(NL3D::CPSAttribMakerBase *am, const std::string &newName); -protected: - typedef std::pair TSchemeInfo; +protected: typedef std::multimap TSchemeMap; - TSchemeMap _SchemeMap; + TSchemeMap _SchemeMap; }; } /* namespace NLQT */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/value_gradient_dialog.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/value_gradient_dialog.cpp index adf91c598..544ceec98 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/value_gradient_dialog.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/value_gradient_dialog.cpp @@ -1,18 +1,18 @@ -// 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 +// 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 . // Projects include @@ -154,6 +154,9 @@ void CGradientDialog::valueDown() m_ui.listWidget->setCurrentRow(currentRow); } m_ui.listWidget->setCurrentRow(currentRow); + --currentRow; + QListWidgetItem *item = m_ui.listWidget->item(currentRow); + m_clientInterface->displayValue(currentRow, item); } void CGradientDialog::valueUp() diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/value_gradient_dialog.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/value_gradient_dialog.h index 48da2f600..dc2b366d8 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/value_gradient_dialog.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/value_gradient_dialog.h @@ -1,18 +1,18 @@ -// 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 +// 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 VALUE_GRADIENT_DIALOG_H From 92e6544944b661b90b738a564117a1a4fef8cc21 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Mon, 9 May 2011 15:13:59 +0300 Subject: [PATCH 017/118] Changed: #1193 The user can specify the ovqt plugins path if not using the default path. --- code/nel/tools/3d/object_viewer_qt/src/main.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) 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 64cb1fff2..8588c148a 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/main.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/main.cpp @@ -38,6 +38,8 @@ #include #include #include +#include +#include static const char *appNameC = "ObjectViewerQt"; @@ -135,7 +137,7 @@ sint main(int argc, char **argv) QTranslator qtTranslator; QString locale = settings->value("Language", QLocale::system().name()).toString(); QString qtTrPath = QLibraryInfo::location(QLibraryInfo::TranslationsPath); - translator.load("object_viewer_qt_" + locale, ":/"); +// translator.load("object_viewer_qt_" + locale, ":/"); qtTranslator.load("qt_" + locale, qtTrPath); app.installTranslator(&translator); app.installTranslator(&qtTranslator); @@ -149,7 +151,7 @@ sint main(int argc, char **argv) pluginManager.setSettings(settings); QStringList pluginPaths; #if !defined(NL_OS_MAC) - pluginPaths << QString("./plugins"); + pluginPaths << settings->value("PluginPath", "./plugins").toString(); #else pluginPaths << qApp->applicationDirPath() + QString("/../PlugIns/ovqt"); #endif @@ -176,6 +178,15 @@ sint main(int argc, char **argv) QString absolutePaths = absolutePluginPaths.absolutePath(); const QString reason = QCoreApplication::translate("Application", "Could not find ovqt_plugin_core in %1").arg(absolutePaths); displayError(msgCoreLoadFailure(reason)); + + 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); + if (ok && !text.isEmpty()) + settings->setValue("PluginPath", text); + settings->sync(); return 1; } if (corePlugin->hasError()) From bfa32f26e16630cc58b635fa18aeda644c243ab7 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Mon, 9 May 2011 18:27:09 +0300 Subject: [PATCH 018/118] Changed: #1193 Added general settings page. ICore emits a signal changeSettings() when changing settings. Enabled sound in object viewer plugin. --- .../3d/object_viewer_qt/src/description.h | 134 ++---------- .../src/plugins/core/CMakeLists.txt | 2 + .../src/plugins/core/core_constants.h | 14 +- .../src/plugins/core/core_plugin.cpp | 42 ++-- .../src/plugins/core/core_plugin.h | 10 +- .../plugins/core/general_settings_page.cpp | 187 ++++++++++++++++ .../src/plugins/core/general_settings_page.h | 71 +++++++ .../src/plugins/core/general_settings_page.ui | 199 ++++++++++++++++++ .../object_viewer_qt/src/plugins/core/icore.h | 1 + .../src/plugins/core/main_window.cpp | 25 ++- .../src/plugins/core/main_window.h | 1 + .../core/search_paths_settings_page.cpp | 6 +- .../src/plugins/log/log_plugin.cpp | 18 +- .../src/plugins/object_viewer/attrib_form.ui | 2 +- .../object_viewer/graphics_settings_page.cpp | 17 -- .../object_viewer/graphics_settings_page.ui | 51 +---- .../src/plugins/object_viewer/main_window.cpp | 34 +-- .../src/plugins/object_viewer/main_window.h | 9 - 18 files changed, 551 insertions(+), 272 deletions(-) create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/core/general_settings_page.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/core/general_settings_page.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/core/general_settings_page.ui diff --git a/code/nel/tools/3d/object_viewer_qt/src/description.h b/code/nel/tools/3d/object_viewer_qt/src/description.h index d22a1918b..a1a041de9 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/description.h +++ b/code/nel/tools/3d/object_viewer_qt/src/description.h @@ -1,6 +1,6 @@ /** @mainpage Object Viewer Qt -@author Dzmitry Kamiahin , (C) 2010 +@author Dzmitry Kamiahin , (C) 2011 @section introduce Introduce @details @@ -15,130 +15,22 @@ The tool can be used in different tasks: - Create and modify micro-vegetation material (.vegetset files) - Viewing landscape (.zonel files) - Dialog allows to specify graphical, sound, search path and landscape settings. - -@section project_structure Overview of the Object Viewer Qt Project Structure -@details -OVQT - consists of several major subsystems. Each subsystem performs its defined part of the task. -Through Modules:: provides access to all other program subsystems. - -Program has the following subsystems: -- @ref Modules - Main modules aggregated all parts of the program. -- @ref NLQT::CConfiguration - is responsible for loading and saving settings from the configuration file. As well as search path of data. -- @ref NLQT::CObjectViewer - main subsystem of the program, which initializes the driver, creates a scene and other supporting elements. -It is a container for loaded models, which can further be viewed and animated. -- @ref NLQT::CMainWindow - is responsible for the GUI. -- @ref NLQT::CParticleEditor - is responsible for the particle systems and provides access to a container that keeps all the loaded particle systems. -And also allows you to view an animation of particle systems, with the ability to control its parameters. -- @ref NLQT::CVegetableEditor - is responsible for the landscape zones and the editor of vegetation. -Allows you to load and view the landscape. Also has the ability to create and edit the parameters of the micro-vegetation. -- @ref NLQT::CSoundSystem - is responsible for the sound in the program. - - -The structure of the GUI in the editor of the particles. -
-This can be useful for new developers who want to add more new dialogs or to improve the functionality of existing dialogues. -Particle Workspace -ParticleWorkspace dialogue uses the technique of model-view. -Using the signal/slot link QTreeView with QStackWidget, Editor properties dialog. -When you select an item in QTreeView, QStackWidget displays the necessary page(PageWidget) where you can edit the element of the particles system. -Each page is made in the designer and has a separate forms(.ui). -In accordance with the recommendations of dialogues design, with a large number of items,every page uses QTabWidget. -In case when there is a great number of controls, and not everything you want to display, -it's used the dynamic creation of tabs. Moreover, each tab uses a separate forms(.ui). - -@section for_new_developer Guide for new developers of the Object Viewer Qt. -@details - First of all, to begin developing dialogues that add new features ovqt, -it is needed to read the documentation Qt libs (http://doc.qt.nokia.com/) and NeL documentation. - - In order to have convenient using of the tool and its further development, -it is expected to make a unified interface that is why all dialogs should adhere to a standard design, -which will be written further. For this goals program provides some additional widgets, -which are recommended to use. As in the development Qt Designer is actively used. -To get access to founded here widgets from the designer,the technique promotion is used, -which can be found here . -
    -
  1. -CEditRangeUIntWidget / CEditRangeIntWidget / CEditRangeFloatWidget -
    -Widgets provides a slider that allows you to specify an integer (or float, depending on which widget used) number within a set range. -The range is also can be set by the user, or for a more accurate selection of numbers, either for receiving large values. -As there may be situations when the range that a user requests,has to be restricted, and widget provides methods that allow you to do so. -

    -CEditRangeIntWidget -
    -CEditRangeFloatWidget -@see -@ref NLQT::CEditRangeUIntWidget, @ref NLQT::CEditRangeIntWidget, @ref NLQT::CEditRangeFloatWidget - -
  2. -CColorEditWidget -
    -Using this widget you can set the color(RGBA) using the four sliders or through the color selection dialog. -

    -CColorEditWidget -@see -@ref NLQT::CColorEditWidget - -
  3. -CDirectionWidget -
    -This widget helps to choose from several preset directions, or to choose a custom one. -

    -CDirectionWidget -@see -@ref NLQT::CDirectionWidget -


- -To further convinience of instrument using dialogues interface is recommended to make as follows. -The most sophisticated tools of the program, should take the form of three dock windows (example shown in the screenshot). -Object Viewer Qt -
    -
  1. -The first dock window - is a control dock window, it should focus all of the control functions of general purpose -(for example: start/stop/pause animations or particles system). -It is recommended to perform of the horizontal type window and placed in the bottom of the main window. -
  2. -The second dock window - is a list or a tree of items. In which selecting of the current element, -which assumes to modify or viewis possible.Operations "add/remove/insert or other" items are recommended to make as a popur menu. -It is recommended to perform of the vertical type window and placed in the left of the main window. -
  3. -The third dock - is an editor for properties of the element that was selected in the list or in the tree of elements. -As all the controls occupy much space or do not fit at all, you have to use tabs QTabWidget, -which in total can contains quite a lot of elements. -For a small number of tabs it is allowed to use both horizontal and vertical location. -But with a large number of tabs, it is necessary to apply the vertical arrangement. -It is recommended to perform of the vertical type of window and placed in the right of the main window. -
-In the simple dialogues do not necessary to use all three windows, but user has to adhere to the recommendations given above as well. -Also, all dialogs must use the qt layout manager. And if you do not use the designer, -make sure you use the qt tools internationalization applications. -

-In ovqt for most dialogs their owner is NLQT::CMainWindow and in its methods creating and initializing all dependent dialogs occur. -For the convenience of the program using, most dialogues are created in the form of docking windows. -Creating all the dialogues are carried out in a private method NLQT::CMainWindow::createDialogs(). -Hence, it is necessary to add operations in this method to create new dialogues. -But we must take into account that at this moment is fully available only one component of the program CConfiguration, -to read the settings from the configuration file. The remaining components of the program are available only after the main window stays visible. -Calling the dialogues going through the menu or the toolbar, usually it is a checkable item. -Adding of the new menu items or items toolbars is need in methods NLQT::CMainWindow::createMenus(), NLQT::CMainWindow::createToolBars(). +- OVQT supports loading third-party plug-ins. @section license_ovqt License Object Viewer Qt @details - Object Viewer Qt +Object Viewer Qt - MMORPG Framework
- Copyright (C) 2010 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 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 Affero General Public License for more details.

- 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 . +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . */ \ 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 726cb4a2d..06095790b 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 @@ -20,10 +20,12 @@ SET(OVQT_CORE_PLUGIN_HDR menu_manager.h settings_dialog.h search_paths_settings_page.h + general_settings_page.h plugin_view_dialog.h) SET(OVQT_CORE_PLUGIN_UIS settings_dialog.ui plugin_view_dialog.ui + general_settings_page.ui search_paths_settings_page.ui) SET(OVQT_CORE_PLUGIN_RCS core.qrc) 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 2adf4f35a..eb59cddd2 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 @@ -24,7 +24,7 @@ namespace Constants { const char * const OVQT_VERSION_LONG = "0.0.1"; -const char * const OVQT_VENDOR = "Dzmitry Kamiahin"; +const char * const OVQT_VENDOR = "Ryzom Core"; const char * const OVQT_YEAR = "2010, 2011"; const char * const OVQT_CORE_PLUGIN = "Core"; @@ -61,6 +61,18 @@ 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 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"; 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 6d051d64d..6cb58ba67 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 @@ -20,8 +20,8 @@ #include "settings_dialog.h" #include "core_constants.h" #include "search_paths_settings_page.h" +#include "general_settings_page.h" #include "../../extension_system/iplugin_spec.h" -#include "qtwin.h" // NeL includes #include "nel/misc/debug.h" @@ -42,37 +42,37 @@ CorePlugin::CorePlugin() CorePlugin::~CorePlugin() { - 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(); - delete _mainWindow; + delete m_mainWindow; } bool CorePlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString) { Q_UNUSED(errorString); - _plugMan = pluginManager; + m_plugMan = pluginManager; - _mainWindow = new MainWindow(pluginManager); - /*if (QtWin::isCompositionEnabled()) - { - QtWin::extendFrameIntoClientArea(_mainWindow); - _mainWindow->setContentsMargins(0, 0, 0, 0); - }*/ - bool success = _mainWindow->initialize(errorString); - CSearchPathsSettingsPage *serchPathPage = new CSearchPathsSettingsPage(this); - serchPathPage->applySearchPaths(); - addAutoReleasedObject(serchPathPage); + m_mainWindow = new MainWindow(pluginManager); + bool success = m_mainWindow->initialize(errorString); + + GeneralSettingsPage *generalSettings = new GeneralSettingsPage(this); + CSearchPathsSettingsPage *searchPathPage = new CSearchPathsSettingsPage(this); + + generalSettings->applyGeneralSettings(); + searchPathPage->applySearchPaths(); + addAutoReleasedObject(generalSettings); + addAutoReleasedObject(searchPathPage); return success; } void CorePlugin::extensionsInitialized() { - _mainWindow->extensionsInitialized(); + m_mainWindow->extensionsInitialized(); } void CorePlugin::shutdown() @@ -86,7 +86,7 @@ void CorePlugin::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); + m_libContext = new NLMISC::CLibraryContext(*nelContext); } QString CorePlugin::name() const @@ -116,8 +116,8 @@ QStringList CorePlugin::dependencies() const void CorePlugin::addAutoReleasedObject(QObject *obj) { - _plugMan->addObject(obj); - _autoReleaseObjects.prepend(obj); + m_plugMan->addObject(obj); + m_autoReleaseObjects.prepend(obj); } Q_EXPORT_PLUGIN(CorePlugin) 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 ef590e1fc..5c95d22c9 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 @@ -63,16 +63,16 @@ public: ExtensionSystem::IPluginManager *pluginManager() const { - return _plugMan; + return m_plugMan; } protected: - NLMISC::CLibraryContext *_LibContext; + NLMISC::CLibraryContext *m_libContext; private: - ExtensionSystem::IPluginManager *_plugMan; - MainWindow *_mainWindow; - QList _autoReleaseObjects; + ExtensionSystem::IPluginManager *m_plugMan; + MainWindow *m_mainWindow; + QList m_autoReleaseObjects; }; } // namespace Core 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 new file mode 100644 index 000000000..47bf4026a --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/general_settings_page.cpp @@ -0,0 +1,187 @@ +// 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 "general_settings_page.h" +#include "core_constants.h" +#include "icore.h" + +// NeL includes +#include + +// Qt includes +#include +#include +#include +#include +#include +#include + +namespace Core +{ + +GeneralSettingsPage::GeneralSettingsPage(QObject *parent) + : IOptionsPage(parent), + m_page(0) +{ + m_originalPalette = QApplication::palette(); +} + +GeneralSettingsPage::~GeneralSettingsPage() +{ +} + +QString GeneralSettingsPage::id() const +{ + return QLatin1String("general_settings"); +} + +QString GeneralSettingsPage::trName() const +{ + return tr("General"); +} + +QString GeneralSettingsPage::category() const +{ + return QLatin1String(Constants::SETTINGS_CATEGORY_GENERAL); +} + +QString GeneralSettingsPage::trCategory() const +{ + return tr(Constants::SETTINGS_TR_CATEGORY_GENERAL); +} + +void GeneralSettingsPage::applyGeneralSettings() +{ + QSettings *settings = Core::ICore::instance()->settings(); + + settings->beginGroup(Constants::MAIN_WINDOW_SECTION); + QApplication::setStyle(QStyleFactory::create(settings->value(Constants::QT_STYLE, "").toString())); + + if (settings->value(Constants::QT_PALETTE, true).toBool()) + QApplication::setPalette(QApplication::style()->standardPalette()); + else + QApplication::setPalette(m_originalPalette); + settings->endGroup(); +} + +QWidget *GeneralSettingsPage::createPage(QWidget *parent) +{ + m_page = new QWidget(parent); + m_ui.setupUi(m_page); + + readSettings(); + connect(m_ui.languageComboBox, SIGNAL(currentIndexChanged(QString)), this, SLOT(changeLanguage(QString))); + 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())); + return m_page; +} + +void GeneralSettingsPage::apply() +{ + writeSettings(); + applyGeneralSettings(); +} + +void GeneralSettingsPage::finish() +{ + delete m_page; + m_page = 0; +} + +void GeneralSettingsPage::changeLanguage(const QString &lang) +{ + QMessageBox::information(0, tr("Restart required"), + tr("The language change will take effect after a restart of Object Viewer Qt.")); +} + +void GeneralSettingsPage::setPluginsPath() +{ + QString newPath = QFileDialog::getExistingDirectory(0, tr("Set the plugins path"), + m_ui.pluginsPathLineEdit->text()); + if (!newPath.isEmpty()) + { + m_ui.pluginsPathLineEdit->setText(newPath); + } +} + +void GeneralSettingsPage::setLevelDesignPath() +{ + QString newPath = QFileDialog::getExistingDirectory(0, tr("Set the level design path"), + m_ui.leveldesignPathLineEdit->text()); + if (!newPath.isEmpty()) + { + m_ui.leveldesignPathLineEdit->setText(newPath); + } +} + +void GeneralSettingsPage::setAssetsPath() +{ + QString newPath = QFileDialog::getExistingDirectory(0, tr("Set the assets path"), + m_ui.assetsPathLineEdit->text()); + if (!newPath.isEmpty()) + { + m_ui.assetsPathLineEdit->setText(newPath); + } +} + +void GeneralSettingsPage::readSettings() +{ + QSettings *settings = Core::ICore::instance()->settings(); + + m_ui.pluginsPathLineEdit->setText(settings->value(Core::Constants::PLUGINS_PATH, "./plugins").toString()); + + settings->beginGroup(Constants::MAIN_WINDOW_SECTION); + m_ui.styleComboBox->addItems(QStyleFactory::keys()); + QString style = settings->value(Constants::QT_STYLE, "").toString(); + if (style == "") + m_ui.styleComboBox->setCurrentIndex(0); + else + m_ui.styleComboBox->setCurrentIndex(m_ui.styleComboBox->findText(style)); + m_ui.paletteCheckBox->setChecked(settings->value(Constants::QT_PALETTE, true).toBool()); + settings->endGroup(); + + QStringList paths; + 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()); + settings->endGroup(); +} + +void GeneralSettingsPage::writeSettings() +{ + QSettings *settings = Core::ICore::instance()->settings(); + + settings->setValue(Core::Constants::PLUGINS_PATH, m_ui.pluginsPathLineEdit->text()); + + settings->beginGroup(Constants::MAIN_WINDOW_SECTION); + if (m_ui.styleComboBox->currentIndex() == 0) + settings->setValue(Constants::QT_STYLE, ""); + else + settings->setValue(Constants::QT_STYLE, m_ui.styleComboBox->currentText()); + settings->setValue(Constants::QT_PALETTE, m_ui.paletteCheckBox->isChecked()); + settings->endGroup(); + + 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->endGroup(); + settings->sync(); +} + +} /* namespace Core */ \ No newline at end of file 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 new file mode 100644 index 000000000..2f73f8715 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/general_settings_page.h @@ -0,0 +1,71 @@ +// 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 GENERAL_SETTINGS_PAGE_H +#define GENERAL_SETTINGS_PAGE_H + +#include + +#include "ioptions_page.h" + +#include "ui_general_settings_page.h" + +class QWidget; + +namespace Core +{ +/** +@class GeneralSettingsPage +*/ +class GeneralSettingsPage : public Core::IOptionsPage +{ + Q_OBJECT + +public: + GeneralSettingsPage(QObject *parent = 0); + ~GeneralSettingsPage(); + + QString id() const; + QString trName() const; + QString category() const; + QString trCategory() const; + QWidget *createPage(QWidget *parent); + + void apply(); + void finish(); + + void applyGeneralSettings(); + +private Q_SLOTS: + void changeLanguage(const QString &lang); + void setPluginsPath(); + void setLevelDesignPath(); + void setAssetsPath(); + +private: + void readSettings(); + void writeSettings(); + + QPalette m_originalPalette; + QWidget *m_page; + Ui::GeneralSettingsPage m_ui; +}; + +} // namespace Core + +#endif // GENERAL_SETTINGS_H 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 new file mode 100644 index 000000000..d2aa042e3 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/general_settings_page.ui @@ -0,0 +1,199 @@ + + + GeneralSettingsPage + + + + 0 + 0 + 267 + 282 + + + + Form + + + + 6 + + + 3 + + + + + Qt Style + + + + 6 + + + 6 + + + + + + default + + + + + + + + Use style's standard palette + + + + + + + + + + Language + + + + 6 + + + + + false + + + + English + + + + + German + + + + + French + + + + + Russian + + + + + + + + + + + Paths + + + + 6 + + + 6 + + + + + Plugins path: + + + + + + + + 0 + 0 + + + + + + + + ... + + + + + + + Level design path: + + + + + + + + 0 + 0 + + + + + + + + ... + + + + + + + Assets path: + + + + + + + + 0 + 0 + + + + + + + + ... + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + 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 8f0c5b4ca..71f075973 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 @@ -59,6 +59,7 @@ public: virtual ExtensionSystem::IPluginManager *pluginManager() const = 0; Q_SIGNALS: + void changeSettings(); void closeMainWindow(); }; 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 44f415a25..e048aa80b 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 @@ -60,6 +60,7 @@ MainWindow::MainWindow(ExtensionSystem::IPluginManager *pluginManager, QWidget * m_tabWidget = new QTabWidget(this); m_tabWidget->setTabPosition(QTabWidget::South); m_tabWidget->setMovable(true); + m_tabWidget->setDocumentMode(true); setCentralWidget(m_tabWidget); setDockNestingEnabled(true); @@ -118,6 +119,10 @@ ExtensionSystem::IPluginManager *MainWindow::pluginManager() const return m_pluginManager; } +void MainWindow::open() +{ +} + void MainWindow::checkObject(QObject *obj) { IContext *context = qobject_cast(obj); @@ -133,7 +138,10 @@ bool MainWindow::showOptionsDialog(const QString &group, parent = this; CSettingsDialog settingsDialog(m_pluginManager, group, page, parent); settingsDialog.show(); - return settingsDialog.execDialog(); + bool ok = settingsDialog.execDialog(); + if (ok) + Q_EMIT m_coreImpl->changeSettings(); + return ok; } void MainWindow::about() @@ -177,7 +185,7 @@ void MainWindow::createActions() m_openAction->setShortcut(QKeySequence::Open); m_openAction->setStatusTip(tr("Open an existing file")); menuManager()->registerAction(m_openAction, Constants::OPEN); -// connect(m_openAction, SIGNAL(triggered()), this, SLOT(open())); + connect(m_openAction, SIGNAL(triggered()), this, SLOT(open())); m_exitAction = new QAction(tr("E&xit"), this); m_exitAction->setShortcut(QKeySequence(tr("Ctrl+Q"))); @@ -220,6 +228,7 @@ void MainWindow::createMenus() { m_fileMenu = menuBar()->addMenu(tr("&File")); menuManager()->registerMenu(m_fileMenu, Constants::M_FILE); +// m_fileMenu->addAction(m_openAction); m_fileMenu->addSeparator(); m_fileMenu->addAction(m_exitAction); @@ -260,17 +269,17 @@ void MainWindow::createDialogs() void MainWindow::readSettings() { - m_settings->beginGroup("MainWindow"); - restoreState(m_settings->value("WindowState").toByteArray()); - restoreGeometry(m_settings->value("WindowGeometry").toByteArray()); + m_settings->beginGroup(Constants::MAIN_WINDOW_SECTION); + restoreState(m_settings->value(Constants::MAIN_WINDOW_STATE).toByteArray()); + restoreGeometry(m_settings->value(Constants::MAIN_WINDOW_GEOMETRY).toByteArray()); m_settings->endGroup(); } void MainWindow::writeSettings() { - m_settings->beginGroup("MainWindow"); - m_settings->setValue("WindowState", saveState()); - m_settings->setValue("WindowGeometry", saveGeometry()); + m_settings->beginGroup(Constants::MAIN_WINDOW_SECTION); + m_settings->setValue(Constants::MAIN_WINDOW_STATE, saveState()); + m_settings->setValue(Constants::MAIN_WINDOW_GEOMETRY, saveGeometry()); m_settings->endGroup(); } 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 21d091ef3..4cc24e5eb 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 @@ -59,6 +59,7 @@ public Q_SLOTS: QWidget *parent = 0); private Q_SLOTS: + void open(); void checkObject(QObject *obj); void about(); 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 c52624717..6f0fcb47d 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 @@ -45,7 +45,7 @@ CSearchPathsSettingsPage::~CSearchPathsSettingsPage() QString CSearchPathsSettingsPage::id() const { - return QLatin1String("SearchPaths"); + return QLatin1String("search_paths"); } QString CSearchPathsSettingsPage::trName() const @@ -55,12 +55,12 @@ QString CSearchPathsSettingsPage::trName() const QString CSearchPathsSettingsPage::category() const { - return QLatin1String("General"); + return QLatin1String(Constants::SETTINGS_CATEGORY_GENERAL); } QString CSearchPathsSettingsPage::trCategory() const { - return tr("General"); + return tr(Constants::SETTINGS_TR_CATEGORY_GENERAL); } QWidget *CSearchPathsSettingsPage::createPage(QWidget *parent) 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 439cce7d9..ad772f593 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 @@ -45,7 +45,7 @@ using namespace Plugin; namespace ExtensionSystem { - class IPluginSpec; +class IPluginSpec; } CLogPlugin::CLogPlugin(QWidget *parent): QDockWidget(parent) @@ -53,9 +53,9 @@ CLogPlugin::CLogPlugin(QWidget *parent): QDockWidget(parent) _ui.setupUi(this); } -CLogPlugin::~CLogPlugin() +CLogPlugin::~CLogPlugin() { - _plugMan->removeObject(_logSettingsPage); + //_plugMan->removeObject(_logSettingsPage); delete _logSettingsPage; NLMISC::ErrorLog->removeDisplayer(_displayer); @@ -71,7 +71,7 @@ bool CLogPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QStr Q_UNUSED(errorString); _plugMan = pluginManager; _logSettingsPage = new CLogSettingsPage(this); - _plugMan->addObject(_logSettingsPage); + //_plugMan->addObject(_logSettingsPage); return true; } @@ -96,12 +96,12 @@ void CLogPlugin::extensionsInitialized() void CLogPlugin::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()); +#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 // fdef NL_OS_WINDOWS^M - _LibContext = new NLMISC::CLibraryContext(*nelContext); + _LibContext = new NLMISC::CLibraryContext(*nelContext); _displayer = new NLQT::CQtDisplayer(_ui.plainTextEdit); 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 404444fc0..77c4b895f 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 @@ - true + false diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_settings_page.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_settings_page.cpp index 4e11ee15c..eabb67f3d 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_settings_page.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_settings_page.cpp @@ -25,8 +25,6 @@ // Qt includes #include #include -#include -#include // NeL includes #include @@ -75,11 +73,6 @@ QWidget *GraphicsSettingsPage::createPage(QWidget *parent) m_ui.squareBloomCheckBox->setChecked(NL3D::CBloomEffect::instance().getSquareBloom()); m_ui.bloomDensityHorizontalSlider->setValue(NL3D::CBloomEffect::instance().getDensityBloom()); - m_ui.styleComboBox->addItems(QStyleFactory::keys()); - QString style = settings->value(Constants::QT_STYLE, "").toString(); - m_ui.styleComboBox->setCurrentIndex(m_ui.styleComboBox->findText(style)); - m_ui.paletteCheckBox->setChecked(settings->value(Constants::QT_PALETTE, true).toBool()); - settings->endGroup(); connect(m_ui.enableBloomCheckBox, SIGNAL(toggled(bool)), this, SLOT(setEnableBloom(bool))); @@ -103,16 +96,6 @@ void GraphicsSettingsPage::apply() settings->setValue(Constants::ENABLE_BLOOM, m_ui.enableBloomCheckBox->isChecked()); settings->setValue(Constants::ENABLE_SQUARE_BLOOM, m_ui.squareBloomCheckBox->isChecked()); settings->setValue(Constants::BLOOM_DENSITY, m_ui.bloomDensityHorizontalSlider->value()); - settings->setValue(Constants::QT_STYLE, m_ui.styleComboBox->currentText()); - settings->setValue(Constants::QT_PALETTE, m_ui.paletteCheckBox->isChecked()); - - // apply qt style and palette - QApplication::setStyle(QStyleFactory::create(m_ui.styleComboBox->currentText())); - - if (m_ui.paletteCheckBox->isChecked()) - QApplication::setPalette(QApplication::style()->standardPalette()); - else - QApplication::setPalette(Modules::mainWin().getOriginalPalette()); settings->endGroup(); settings->sync(); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_settings_page.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_settings_page.ui index 24058d3d3..e6b4952a5 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_settings_page.ui +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_settings_page.ui @@ -117,50 +117,7 @@ - - - - Qt Style - - - - - - - - Style - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - Use style's standard palette - - - - - - - + false @@ -170,14 +127,14 @@ - + false - + false @@ -187,7 +144,7 @@ - + Qt::Vertical diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp index fa077cfed..6e183d913 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp @@ -66,7 +66,7 @@ CMainWindow::CMainWindow(QWidget *parent) _isGraphicsInitialized(false), _isGraphicsEnabled(false), _isSoundInitialized(false), - _isSoundEnabled(false), + _isSoundEnabled(true), _GraphicsViewport(NULL), _lastDir("."), _mouseMode(NL3D::U3dMouseListener::edit3d) @@ -80,19 +80,6 @@ CMainWindow::CMainWindow(QWidget *parent) setDockNestingEnabled(true); - QSettings *settings = Core::ICore::instance()->settings(); - settings->beginGroup(Constants::OBJECT_VIEWER_SECTION); - - // setup Qt style and palette from config file - _originalPalette = QApplication::palette(); - - QApplication::setStyle(QStyleFactory::create(settings->value(Constants::QT_STYLE, "").toString())); - - if (settings->value(Constants::QT_PALETTE, true).toBool()) - QApplication::setPalette(QApplication::style()->standardPalette()); - else - QApplication::setPalette(_originalPalette); - _GraphicsViewport->init(); _isGraphicsInitialized = true; @@ -111,6 +98,9 @@ CMainWindow::CMainWindow(QWidget *parent) setWindowIcon(QIcon(":/images/nel.png")); + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(Constants::OBJECT_VIEWER_SECTION); + restoreState(settings->value("QtWindowState").toByteArray()); restoreGeometry(settings->value("QtWindowGeometry").toByteArray()); @@ -484,22 +474,6 @@ bool CMainWindow::loadFile(const QString &fileName, const QString &skelName) return true; } -void CMainWindow::cfcbQtStyle(NLMISC::CConfigFile::CVar &var) -{ - QApplication::setStyle(QStyleFactory::create(var.asString().c_str())); -} - -void CMainWindow::cfcbQtPalette(NLMISC::CConfigFile::CVar &var) -{ - if (var.asBool()) QApplication::setPalette(QApplication::style()->standardPalette()); - else QApplication::setPalette(_originalPalette); -} - -void CMainWindow::cfcbSoundEnabled(NLMISC::CConfigFile::CVar &var) -{ - _isSoundEnabled = var.asBool(); // update loop inits -} - void CMainWindow::updateRender() { if (isVisible()) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.h index 3a6411df2..52b3dc8d5 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.h @@ -71,10 +71,6 @@ public: { return _SkeletonTreeModel; } - QPalette getOriginalPalette() const - { - return _originalPalette; - } private Q_SLOTS: void open(); @@ -96,10 +92,6 @@ private: bool loadFile(const QString &fileName, const QString &skelName); - void cfcbQtStyle(NLMISC::CConfigFile::CVar &var); - void cfcbQtPalette(NLMISC::CConfigFile::CVar &var); - void cfcbSoundEnabled(NLMISC::CConfigFile::CVar &var); - bool _isGraphicsInitialized, _isGraphicsEnabled; bool _isSoundInitialized, _isSoundEnabled; @@ -122,7 +114,6 @@ private: CCameraControl *_cameraControl; - QPalette _originalPalette; QString _lastDir; QTimer *_mainTimer; From 787ebd0f6f013350127243b16a37c6ddd440f231 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Mon, 9 May 2011 20:51:29 +0300 Subject: [PATCH 019/118] Fixed: Crash the ovqt in ps editor. --- code/nel/tools/3d/object_viewer_qt/src/main.cpp | 2 +- .../plugins/object_viewer/particle_workspace_dialog.cpp | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) 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 8588c148a..15173fa5c 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/main.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/main.cpp @@ -153,7 +153,7 @@ sint main(int argc, char **argv) #if !defined(NL_OS_MAC) pluginPaths << settings->value("PluginPath", "./plugins").toString(); #else - pluginPaths << qApp->applicationDirPath() + QString("/../PlugIns/ovqt"); + pluginPaths << settings->value("PluginPath", qApp->applicationDirPath() + QString("/../PlugIns/ovqt")).toString(); #endif pluginManager.setPluginPaths(pluginPaths); 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 50698198b..4d6d35c9f 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 @@ -222,24 +222,27 @@ void CParticleWorkspaceDialog::touchPSState(CParticleTreeItem *item) void CParticleWorkspaceDialog::clickedItem(const QModelIndex & index) { - if (_currentItem != NULL) + if (_currentItem != 0) _treeModel->getOwnerNode(_currentItem)->getPSPointer()->setCurrentEditedElement(NULL); _currentItem = static_cast(index.internalPointer()); + + if (_currentItem == 0) + return; if (index.flags() != Qt::NoItemFlags) _PropertyDialog->setCurrentEditedElement(_currentItem); if ((_currentItem->itemType() == ItemType::Workspace) || (_currentItem->itemType() == ItemType::ParticleSystemNotLoaded)) - _currentItem = NULL; + _currentItem = 0; } void CParticleWorkspaceDialog::customContextMenu() { if (!Modules::psEdit().getParticleWorkspace()) return; clickedItem(_ui.treeView->currentIndex()); - if (_currentItem == NULL) return; + if (_currentItem == 0) return; QMenu *popurMenu = new QMenu(this); switch (_currentItem->itemType()) { From 68f5753c670f72c6d0b3ef51b4af5ed3886bc2a4 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Mon, 9 May 2011 23:46:14 +0300 Subject: [PATCH 020/118] Fixed: #1193 Fixed flickering graphics viewport under windows. --- .../src/plugins/core/core_constants.h | 2 +- .../src/plugins/example/qnel_widget.cpp | 3 ++ .../plugins/object_viewer/global_wind_form.ui | 10 ++++- .../object_viewer/graphics_viewport.cpp | 38 ++----------------- .../plugins/object_viewer/graphics_viewport.h | 4 -- .../plugins/object_viewer/tune_timer_form.ui | 14 +++++-- 6 files changed, 26 insertions(+), 45 deletions(-) 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 eb59cddd2..a3b7c0d72 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 @@ -77,7 +77,7 @@ 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 = "LevelDesignPath"; +const char * const ASSETS_PATH = "AssetsPath"; //resources const char * const ICON_NEL = ":/core/images/nel.png"; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/qnel_widget.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/qnel_widget.cpp index 9a67abb80..759e8f304 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/qnel_widget.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/qnel_widget.cpp @@ -38,6 +38,9 @@ QNLWidget::QNLWidget(QWidget *parent) m_initialized(false), m_interval(25) { + setAttribute(Qt::WA_OpaquePaintEvent); + setAttribute(Qt::WA_NoSystemBackground); + setAttribute(Qt::WA_PaintOnScreen); setMouseTracking(true); setFocusPolicy(Qt::StrongFocus); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/global_wind_form.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/global_wind_form.ui index 971d16c60..bb266f650 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/global_wind_form.ui +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/global_wind_form.ui @@ -6,8 +6,8 @@ 0 0 - 195 - 64 + 192 + 52 @@ -21,6 +21,12 @@ + + 3 + + + 3 + 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 2a15932b7..7eaed0a1b 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 @@ -49,6 +49,9 @@ namespace NLQT CGraphicsViewport::CGraphicsViewport(QWidget *parent) : QNLWidget(parent) { + setAttribute(Qt::WA_OpaquePaintEvent); + setAttribute(Qt::WA_NoSystemBackground); + setAttribute(Qt::WA_PaintOnScreen); } CGraphicsViewport::~CGraphicsViewport() @@ -77,7 +80,7 @@ void CGraphicsViewport::release() { //H_AUTO2 nldebug("CGraphicsViewport::release"); - + Modules::veget().release(); Modules::psEdit().release(); Modules::objView().release(); @@ -119,39 +122,6 @@ void CGraphicsViewport::resizeEvent(QResizeEvent *resizeEvent) Modules::objView().setSizeViewport(resizeEvent->size().width(), resizeEvent->size().height()); } -#if defined(NL_OS_MAC) -// Qt does not provide wheel events through winEvent() and macEvent() (but it -// does through x11Event(), which is inconsistent...) -// Workaround is to handle wheel events like implemented below. -// -// TODO: this is not a clean solution, because all but wheel events are -// handled using winEvent(), x11Event(), macEvent(). But this seems to be a -// limitation of current (4.7.1) Qt versions. (see e.g. qapplication_mac.mm) -void CGraphicsViewport::wheelEvent(QWheelEvent *event) -{ - // Get relative positions. - float fX = 1.0f - (float)event->pos().x() / this->width(); - float fY = 1.0f - (float)event->pos().y() / this->height(); - - // Get the buttons currently pressed. - uint32 buttons = NLMISC::noButton; - if(event->buttons() & Qt::LeftButton) buttons |= NLMISC::leftButton; - if(event->buttons() & Qt::RightButton) buttons |= NLMISC::rightButton; - if(event->buttons() & Qt::MidButton) buttons |= NLMISC::middleButton; - if(event->modifiers() & Qt::ControlModifier) buttons |= NLMISC::ctrlButton; - if(event->modifiers() & Qt::ShiftModifier) buttons |= NLMISC::shiftButton; - if(event->modifiers() & Qt::AltModifier) buttons |= NLMISC::altButton; - - if(event->delta() > 0) - Modules::objView().getDriver()->EventServer.postEvent( - new NLMISC::CEventMouseWheel(-fX, fY, (NLMISC::TMouseButton)buttons, true, NULL)); - else - Modules::objView().getDriver()->EventServer.postEvent( - new NLMISC::CEventMouseWheel(-fX, fY, (NLMISC::TMouseButton)buttons, false, NULL)); -} -#endif // defined(NL_OS_MAC) - - #if defined(NL_OS_WINDOWS) typedef bool (*winProc)(NL3D::IDriver *driver, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 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 00b2c80d2..d810d8c01 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 @@ -80,10 +80,6 @@ private Q_SLOTS: protected: virtual void resizeEvent(QResizeEvent *resizeEvent); -#if defined(NL_OS_MAC) - virtual void wheelEvent(QWheelEvent *event); -#endif - #if defined(NL_OS_WINDOWS) virtual bool winEvent(MSG *message, long *result); #elif defined(NL_OS_MAC) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/tune_timer_form.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/tune_timer_form.ui index f2f883263..8288747ce 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/tune_timer_form.ui +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/tune_timer_form.ui @@ -6,14 +6,14 @@ 0 0 - 460 - 64 + 452 + 52 - 86 - 64 + 0 + 0 @@ -24,6 +24,12 @@ + + 3 + + + 3 + From 5d5f8a964f1d48660823ec1b4373b2f98b0bdf9c Mon Sep 17 00:00:00 2001 From: kervala Date: Thu, 12 May 2011 12:49:17 +0200 Subject: [PATCH 021/118] Fixed: #1177 VS 2010 does not work under CMake --- code/CMakeLists.txt | 9 +++---- code/CMakeModules/nel.cmake | 27 ++++++++++--------- .../src/interface_v3/ctrl_text_button.cpp | 4 +-- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 151dd5e4d..3f477d9c4 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -41,10 +41,6 @@ INCLUDE(${CMAKE_ROOT}/Modules/Documentation.cmake OPTIONAL) # Force out of source builds. CHECK_OUT_OF_SOURCE() -# Variables which must be set before PROJECT -NL_SETUP_BUILD() -NL_SETUP_BUILD_FLAGS() - CMAKE_MINIMUM_REQUIRED(VERSION 2.6) PROJECT(RyzomCore CXX C) SET(NL_VERSION_MAJOR 0) @@ -52,6 +48,9 @@ SET(NL_VERSION_MINOR 8) SET(NL_VERSION_PATCH 0) SET(NL_VERSION "${NL_VERSION_MAJOR}.${NL_VERSION_MINOR}.${NL_VERSION_PATCH}") +NL_SETUP_BUILD() +NL_SETUP_BUILD_FLAGS() + #----------------------------------------------------------------------------- # Redirect output files SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) @@ -109,7 +108,7 @@ IF(WIN32) GET_FILENAME_COMPONENT(VC_ROOT_PATH "[HKEY_CURRENT_USER\\Software\\Microsoft\\VCExpress\\10.0_Config;InstallDir]" ABSOLUTE) # convert IDE fullpath to VC++ path STRING(REGEX REPLACE "Common7/.*" "VC" VC_DIR ${VC_ROOT_PATH}) - ENDIF(${CMAKE_CXX_COMPILER} MATCHES "VC") + ENDIF(${CMAKE_CXX_COMPILER} MATCHES "VC") ENDIF(${CMAKE_MAKE_PROGRAM} MATCHES "Common7") IF(WITH_MFC) diff --git a/code/CMakeModules/nel.cmake b/code/CMakeModules/nel.cmake index cf6154648..dbe0991a4 100644 --- a/code/CMakeModules/nel.cmake +++ b/code/CMakeModules/nel.cmake @@ -37,16 +37,15 @@ ENDMACRO(NL_TARGET_DRIVER) # Argument: ### MACRO(NL_DEFAULT_PROPS name label) + IF(NOT MSVC10) + SET_TARGET_PROPERTIES(${name} PROPERTIES PROJECT_LABEL ${label}) + ENDIF(NOT MSVC10) GET_TARGET_PROPERTY(type ${name} TYPE) IF(${type} STREQUAL SHARED_LIBRARY) # Set versions only if target is a shared library SET_TARGET_PROPERTIES(${name} PROPERTIES VERSION ${NL_VERSION} SOVERSION ${NL_VERSION_MAJOR} - INSTALL_NAME_DIR ${NL_LIB_PREFIX} - PROJECT_LABEL ${label}) - ELSE(${type} STREQUAL SHARED_LIBRARY) - SET_TARGET_PROPERTIES(${name} PROPERTIES - PROJECT_LABEL ${label}) + INSTALL_NAME_DIR ${NL_LIB_PREFIX}) ENDIF(${type} STREQUAL SHARED_LIBRARY) IF(WITH_STLPORT AND WIN32) SET_TARGET_PROPERTIES(${name} PROPERTIES COMPILE_FLAGS "/X") @@ -288,10 +287,17 @@ MACRO(NL_SETUP_BUILD) ENDIF(CMAKE_BUILD_TYPE MATCHES "Debug") IF(WIN32) - # 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") + 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) + # 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") + ENDIF(MSVC10) SET(PLATFORM_CFLAGS "/D_CRT_SECURE_NO_WARNINGS /DWIN32 /D_WINDOWS /W3 /Zi /Zm1000") @@ -347,9 +353,6 @@ MACRO(NL_SETUP_BUILD) ENDMACRO(NL_SETUP_BUILD) MACRO(NL_SETUP_BUILD_FLAGS) - #SET(CMAKE_DEBUG_POSTFIX "_d") - #SET(CMAKE_RELEASE_POSTFIX "_r") - SET(CMAKE_C_FLAGS ${PLATFORM_CFLAGS} CACHE STRING "" FORCE) SET(CMAKE_CXX_FLAGS ${PLATFORM_CXXFLAGS} CACHE STRING "" FORCE) diff --git a/code/ryzom/client/src/interface_v3/ctrl_text_button.cpp b/code/ryzom/client/src/interface_v3/ctrl_text_button.cpp index d2191a4eb..55cae37e3 100644 --- a/code/ryzom/client/src/interface_v3/ctrl_text_button.cpp +++ b/code/ryzom/client/src/interface_v3/ctrl_text_button.cpp @@ -113,8 +113,8 @@ bool CCtrlTextButton::parse(xmlNodePtr cur, CInterfaceGroup * parentGroup) _TextureIdOver[2].setTexture((TxName+"_r.tga").c_str()); } - // Compute Bmp Sizes - nlctassert(NumTexture==3); + // Compute Bmp Sizes (crash with VC++ 2010) +// nlctassert(NumTexture==3); rVR.getTextureSizeFromId(_TextureIdNormal[0], _BmpLeftW, _BmpH); rVR.getTextureSizeFromId(_TextureIdNormal[1], _BmpMiddleW, _BmpH); rVR.getTextureSizeFromId(_TextureIdNormal[2], _BmpRightW, _BmpH); From 1324fc10932889d9a9ba209f4efc16b71a65c3d6 Mon Sep 17 00:00:00 2001 From: kervala Date: Sat, 14 May 2011 13:56:25 +0200 Subject: [PATCH 022/118] Fixed: Some parameters were forgotten while compiling PCH --- code/CMakeModules/PCHSupport.cmake | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/code/CMakeModules/PCHSupport.cmake b/code/CMakeModules/PCHSupport.cmake index 74d009864..7bd202d0d 100644 --- a/code/CMakeModules/PCHSupport.cmake +++ b/code/CMakeModules/PCHSupport.cmake @@ -45,8 +45,6 @@ MACRO(_PCH_GET_COMPILE_FLAGS _out_compile_flags) 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) - ELSE(CMAKE_COMPILER_IS_GNUCXX) - ## TODO ... ? or does it work out of the box ENDIF(CMAKE_COMPILER_IS_GNUCXX) GET_DIRECTORY_PROPERTY(DIRINC INCLUDE_DIRECTORIES ) @@ -115,6 +113,11 @@ MACRO(GET_PRECOMPILED_HEADER_OUTPUT _targetName _input _output) ENDMACRO(GET_PRECOMPILED_HEADER_OUTPUT _targetName _input) MACRO(ADD_PRECOMPILED_HEADER_TO_TARGET _targetName _input _pch_output_to_use ) + GET_TARGET_PROPERTY(oldProps ${_targetName} COMPILE_FLAGS) + IF(${oldProps} MATCHES NOTFOUND) + SET(oldProps "") + ENDIF(${oldProps} MATCHES NOTFOUND) + IF(CMAKE_COMPILER_IS_GNUCXX) # to do: test whether compiler flags match between target _targetName # and _pch_output_to_use @@ -123,19 +126,15 @@ MACRO(ADD_PRECOMPILED_HEADER_TO_TARGET _targetName _input _pch_output_to_use ) # for use with distcc and gcc >4.0.1 if preprocessed files are accessible # on all remote machines set # PCH_ADDITIONAL_COMPILER_FLAGS to -fpch-preprocess - SET(_target_cflags "${PCH_ADDITIONAL_COMPILER_FLAGS}-include ${_input} -Winvalid-pch") + SET(_target_cflags "${oldProps} ${PCH_ADDITIONAL_COMPILER_FLAGS}-include ${_input} -Winvalid-pch") ELSE(CMAKE_COMPILER_IS_GNUCXX) IF(MSVC) - GET_TARGET_PROPERTY(oldProps ${_targetName} COMPILE_FLAGS) - IF(${oldProps} MATCHES NOTFOUND) - SET(oldProps "") - ENDIF(${oldProps} MATCHES NOTFOUND) - SET(_target_cflags "${oldProps} /Yu\"${_input}\" /FI\"${_input}\" /Fp\"${_pch_output_to_use}\"") ENDIF(MSVC) ENDIF(CMAKE_COMPILER_IS_GNUCXX) SET_TARGET_PROPERTIES(${_targetName} PROPERTIES COMPILE_FLAGS ${_target_cflags}) + SET_TARGET_PROPERTIES(${_targetName}_pch_dephelp PROPERTIES COMPILE_FLAGS ${_target_cflags}) ADD_CUSTOM_TARGET(pch_Generate_${_targetName} DEPENDS ${_pch_output_to_use}) ADD_DEPENDENCIES(${_targetName} pch_Generate_${_targetName}) ENDMACRO(ADD_PRECOMPILED_HEADER_TO_TARGET) From 1787101c66d77037b237d295c45a7099a9989782 Mon Sep 17 00:00:00 2001 From: kervala Date: Sat, 14 May 2011 13:58:39 +0200 Subject: [PATCH 023/118] Fixed: Use of Windows SDK 7.1 with VC++ 2010 if found --- code/CMakeModules/FindWindowsSDK.cmake | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/code/CMakeModules/FindWindowsSDK.cmake b/code/CMakeModules/FindWindowsSDK.cmake index 04059a6a5..30e507f85 100644 --- a/code/CMakeModules/FindWindowsSDK.cmake +++ b/code/CMakeModules/FindWindowsSDK.cmake @@ -9,17 +9,32 @@ IF(WINSDK_INCLUDE_DIR) SET(WINSDK_FIND_QUIETLY TRUE) ENDIF(WINSDK_INCLUDE_DIR) +GET_FILENAME_COMPONENT(WINSDK71_DIR "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.1;InstallationFolder]" ABSOLUTE CACHE) +GET_FILENAME_COMPONENT(WINSDK71_VERSION "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\v7.1;ProductVersion]" NAME) + +IF(WINSDK71_DIR) + IF(NOT WINSDK_FIND_QUIETLY) + MESSAGE(STATUS "Found Windows SDK ${WINSDK71_VERSION} in ${WINSDK71_DIR}") + ENDIF(NOT WINSDK_FIND_QUIETLY) +ENDIF(WINSDK71_DIR) + +GET_FILENAME_COMPONENT(WINSDKCURRENT_DIR "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows;CurrentInstallFolder]" ABSOLUTE CACHE) +GET_FILENAME_COMPONENT(WINSDKCURRENT_VERSION "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows;CurrentVersion]" NAME) + +IF(WINSDKCURRENT_DIR) + IF(NOT WINSDK_FIND_QUIETLY) + MESSAGE(STATUS "Found Windows SDK ${WINSDKCURRENT_VERSION} in ${WINSDKCURRENT_DIR}") + ENDIF(NOT WINSDK_FIND_QUIETLY) +ENDIF(WINSDKCURRENT_DIR) + FIND_PATH(WINSDK_INCLUDE_DIR Windows.h PATHS - "[HKEY_CURRENT_USER\\Software\\Microsoft\\Microsoft SDKs\\Windows;CurrentInstallFolder]/Include" - "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows;CurrentInstallFolder]/Include" + ${WINSDK71_DIR}/Include + ${WINSDKCURRENT_DIR}/Include ) IF(WINSDK_INCLUDE_DIR) SET(WINSDK_FOUND TRUE) - IF(NOT WINSDK_FIND_QUIETLY) - MESSAGE(STATUS "Found Windows SDK.") - ENDIF(NOT WINSDK_FIND_QUIETLY) ELSE(WINSDK_INCLUDE_DIR) IF(NOT WINSDK_FIND_QUIETLY) MESSAGE(STATUS "Warning: Unable to find Windows SDK!") From bbbf8754fba379d738dd3ccb90f48bdeb5b3a044 Mon Sep 17 00:00:00 2001 From: kervala Date: Sat, 14 May 2011 14:02:53 +0200 Subject: [PATCH 024/118] Changed: Use of LIB_PREFIX only if defined Changed: Compilation with all cores for VC++ 2008 and 2010 Changed: New method to determine the target CPU --- code/CMakeModules/nel.cmake | 42 ++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/code/CMakeModules/nel.cmake b/code/CMakeModules/nel.cmake index dbe0991a4..c123ca8a8 100644 --- a/code/CMakeModules/nel.cmake +++ b/code/CMakeModules/nel.cmake @@ -44,8 +44,10 @@ MACRO(NL_DEFAULT_PROPS name label) IF(${type} STREQUAL SHARED_LIBRARY) # Set versions only if target is a shared library SET_TARGET_PROPERTIES(${name} PROPERTIES - VERSION ${NL_VERSION} SOVERSION ${NL_VERSION_MAJOR} - INSTALL_NAME_DIR ${NL_LIB_PREFIX}) + VERSION ${NL_VERSION} SOVERSION ${NL_VERSION_MAJOR}) + IF(LIB_PREFIX) + SET_TARGET_PROPERTIES(${name} PROPERTIES INSTALL_NAME_DIR ${LIB_PREFIX}) + ENDIF(LIB_PREFIX) ENDIF(${type} STREQUAL SHARED_LIBRARY) IF(WITH_STLPORT AND WIN32) SET_TARGET_PROPERTIES(${name} PROPERTIES COMPILE_FLAGS "/X") @@ -299,7 +301,7 @@ MACRO(NL_SETUP_BUILD) SET(MIN_OPTIMIZATIONS "/Ob1") ENDIF(MSVC10) - SET(PLATFORM_CFLAGS "/D_CRT_SECURE_NO_WARNINGS /DWIN32 /D_WINDOWS /W3 /Zi /Zm1000") + SET(PLATFORM_CFLAGS "/D_CRT_SECURE_NO_WARNINGS /DWIN32 /D_WINDOWS /W3 /Zi /Zm1000 /MP") # Exceptions are only set for C++ SET(PLATFORM_CXXFLAGS "${PLATFORM_CFLAGS} /EHa") @@ -332,23 +334,25 @@ MACRO(NL_SETUP_BUILD) ENDIF(WIN32) - # Determine host CPU - IF(UNIX AND NOT WIN32) - FIND_PROGRAM(CMAKE_UNAME uname /bin /usr/bin /usr/local/bin ) - IF(CMAKE_UNAME) - EXEC_PROGRAM(uname ARGS -m OUTPUT_VARIABLE CMAKE_SYSTEM_PROCESSOR) - SET(CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR} CACHE INTERNAL "processor type (i386 and x86_64)") - IF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") - ADD_DEFINITIONS(-DHAVE_X86_64) - ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "ia64") - ADD_DEFINITIONS(-DHAVE_IA64) - ELSE(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") - ADD_DEFINITIONS(-DHAVE_X86) - ENDIF(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") - ELSE(CMAKE_UNAME) # Assume that if uname is not found that we're x86. + # 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) + + # Using 32 or 64 bits libraries + 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_UNAME) - ENDIF(UNIX AND NOT WIN32) + ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 8) +# ADD_DEFINITIONS(-DHAVE_IA64) + ENDIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86") ENDMACRO(NL_SETUP_BUILD) From 144410cfd4eeda8ad4c35528cd6500756722a1b7 Mon Sep 17 00:00:00 2001 From: kervala Date: Sat, 14 May 2011 14:04:03 +0200 Subject: [PATCH 025/118] Changed: Some code simplifications --- code/CMakeModules/FindExternal.cmake | 39 ++++++++++++++-------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/code/CMakeModules/FindExternal.cmake b/code/CMakeModules/FindExternal.cmake index 3ca7774ba..436997d99 100644 --- a/code/CMakeModules/FindExternal.cmake +++ b/code/CMakeModules/FindExternal.cmake @@ -7,7 +7,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/png.h") +SET(EXTERNAL_TEMP_FILE "include/zlib.h") SET(EXTERNAL_NAME "external") # If using STLport preprend external_stlport @@ -17,36 +17,35 @@ IF(WITH_STLPORT) SET(EXTERNAL_NAME "external with STLport") ENDIF(WITH_STLPORT) -SET(EXTERNAL_FOUND FALSE) -FOREACH(ITEM ${EXTERNAL_TEMP_PATH}) - IF(EXISTS "${ITEM}/${EXTERNAL_TEMP_FILE}" AND NOT EXTERNAL_FOUND) - SET(EXTERNAL_FOUND TRUE) - # Get absolute path to avoid .. - GET_FILENAME_COMPONENT(ITEM ${ITEM} ABSOLUTE) - SET(EXTERNAL_PATH ${ITEM} CACHE PATH "" FORCE) - ENDIF(EXISTS "${ITEM}/${EXTERNAL_TEMP_FILE}" AND NOT EXTERNAL_FOUND) -ENDFOREACH(ITEM ${EXTERNAL_TEMP_PATH}) +FIND_PATH(EXTERNAL_PATH + ${EXTERNAL_TEMP_FILE} + PATHS + $ENV{EXTERNAL_PATH} + ${EXTERNAL_TEMP_PATH} + /usr/local + /usr + /sw + /opt/local + /opt/csw + /opt +) -IF(EXTERNAL_FOUND) +IF(EXTERNAL_PATH) + SET(EXTERNAL_FOUND TRUE) SET(EXTERNAL_INCLUDE_PATH "${EXTERNAL_PATH}/include") - 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) + IF(TARGET_X64) SET(EXTERNAL_LIBRARY_PATH "${EXTERNAL_PATH}/lib64") - ELSE(CMAKE_SIZEOF_VOID_P EQUAL 8) + ELSE(TARGET_X64) SET(EXTERNAL_LIBRARY_PATH "${EXTERNAL_PATH}/lib") - ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 8) + ENDIF(TARGET_X64) SET(CMAKE_INCLUDE_PATH "${EXTERNAL_INCLUDE_PATH};${CMAKE_INCLUDE_PATH}") # Stupid hack for FindOpenAL.cmake SET(CMAKE_INCLUDE_PATH "${EXTERNAL_PATH};${CMAKE_INCLUDE_PATH}") SET(CMAKE_LIBRARY_PATH "${EXTERNAL_LIBRARY_PATH};${CMAKE_LIBRARY_PATH}") -ENDIF(EXTERNAL_FOUND) +ENDIF(EXTERNAL_PATH) IF(EXTERNAL_FOUND) IF(NOT External_FIND_QUIETLY) From 6937e6977e755b6b8f08885356e1a7bacae2502d Mon Sep 17 00:00:00 2001 From: kervala Date: Sat, 14 May 2011 14:05:31 +0200 Subject: [PATCH 026/118] Fixed: Didn't display any error when DirectX SDK was not found Changed: Use of new variables to detect 64bits arch --- code/CMakeModules/FindDirectXSDK.cmake | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/code/CMakeModules/FindDirectXSDK.cmake b/code/CMakeModules/FindDirectXSDK.cmake index d21261b95..1f832cf95 100644 --- a/code/CMakeModules/FindDirectXSDK.cmake +++ b/code/CMakeModules/FindDirectXSDK.cmake @@ -30,16 +30,11 @@ ENDMACRO(FIND_DXSDK_LIBRARY MYLIBRARY MYLIBRARYNAME) IF(DXSDK_DIR) SET(DXSDK_INCLUDE_DIR "${DXSDK_DIR}/Include") - IF(NOT CMAKE_SIZEOF_VOID_P) - INCLUDE (CheckTypeSize) - CHECK_TYPE_SIZE("void*" CMAKE_SIZEOF_VOID_P) - ENDIF(NOT CMAKE_SIZEOF_VOID_P) - - IF(CMAKE_SIZEOF_VOID_P EQUAL 8) + IF(TARGET_X64) SET(DXSDK_LIBRARY_DIR "${DXSDK_DIR}/Lib/x64") - ELSE(CMAKE_SIZEOF_VOID_P EQUAL 8) + ELSE(TARGET_X64) SET(DXSDK_LIBRARY_DIR "${DXSDK_DIR}/Lib/x86") - ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 8) + ENDIF(TARGET_X64) FIND_DXSDK_LIBRARY(DXSDK_GUID_LIBRARY dxguid) FIND_DXSDK_LIBRARY(DXSDK_DINPUT_LIBRARY dinput8) @@ -59,7 +54,7 @@ ENDIF(DXSDK_DIR) # all listed variables are TRUE. INCLUDE(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(DIRECTXSDK DEFAULT_MSG DXSDK_DIR DXSDK_GUID_LIBRARY DXSDK_DINPUT_LIBRARY) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(DirectXSDK DEFAULT_MSG DXSDK_DIR DXSDK_GUID_LIBRARY DXSDK_DINPUT_LIBRARY) MARK_AS_ADVANCED(DXSDK_INCLUDE_DIR DXSDK_GUID_LIBRARY From 2709cd0c10b697c911f8f82e215db15bca84ffba Mon Sep 17 00:00:00 2001 From: kervala Date: Sat, 14 May 2011 14:05:45 +0200 Subject: [PATCH 027/118] Changed: Use of new variables to detect 64bits arch --- code/CMakeModules/FindCustomMFC.cmake | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/code/CMakeModules/FindCustomMFC.cmake b/code/CMakeModules/FindCustomMFC.cmake index e37936ef0..7dd87c15f 100644 --- a/code/CMakeModules/FindCustomMFC.cmake +++ b/code/CMakeModules/FindCustomMFC.cmake @@ -40,17 +40,12 @@ ENDIF(WITH_STLPORT OR NOT MFC_FOUND) # Only if using a custom path IF(CUSTOM_MFC_DIR) - 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) + IF(TARGET_X64) SET(MFC_LIBRARY_DIR "${MFC_DIR}/lib/amd64") - ELSE(CMAKE_SIZEOF_VOID_P EQUAL 8) + ELSE(TARGET_X64) SET(MFC_LIBRARY_DIR "${MFC_DIR}/lib") - ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 8) + ENDIF(TARGET_X64) # Add MFC libraries directory to default library path LINK_DIRECTORIES(${MFC_LIBRARY_DIR}) From 7edcf208d2a7274aa0d3a93df4148800a4dae708 Mon Sep 17 00:00:00 2001 From: kervala Date: Sat, 14 May 2011 16:08:58 +0200 Subject: [PATCH 028/118] Changed: Replaced LIB_PREFIX by NL_LIB_PREFIX --- code/CMakeModules/nel.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/CMakeModules/nel.cmake b/code/CMakeModules/nel.cmake index c123ca8a8..f20febe4d 100644 --- a/code/CMakeModules/nel.cmake +++ b/code/CMakeModules/nel.cmake @@ -45,9 +45,9 @@ MACRO(NL_DEFAULT_PROPS name label) # Set versions only if target is a shared library SET_TARGET_PROPERTIES(${name} PROPERTIES VERSION ${NL_VERSION} SOVERSION ${NL_VERSION_MAJOR}) - IF(LIB_PREFIX) - SET_TARGET_PROPERTIES(${name} PROPERTIES INSTALL_NAME_DIR ${LIB_PREFIX}) - ENDIF(LIB_PREFIX) + IF(NL_LIB_PREFIX) + SET_TARGET_PROPERTIES(${name} PROPERTIES INSTALL_NAME_DIR ${NL_LIB_PREFIX}) + ENDIF(NL_LIB_PREFIX) ENDIF(${type} STREQUAL SHARED_LIBRARY) IF(WITH_STLPORT AND WIN32) SET_TARGET_PROPERTIES(${name} PROPERTIES COMPILE_FLAGS "/X") From ae70be18fafcac3b3bf5414c1c78dc43d432be9d Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 15 May 2011 17:11:16 +0200 Subject: [PATCH 029/118] Changed: #1275 Create an OpenGL ES driver --- .../driver/opengl/driver_opengl_material.cpp | 29 ++++++++-- .../3d/driver/opengl/driver_opengl_states.h | 14 +++-- .../driver/opengl/driver_opengl_texture.cpp | 29 ++++++++++ .../driver_opengl_vertex_buffer_hard.cpp | 53 ++++++++++++++++++- .../3d/driver/opengl/driver_opengl_window.cpp | 4 ++ 5 files changed, 119 insertions(+), 10 deletions(-) diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp index 9dd08a51f..c7bc0d35d 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp @@ -35,10 +35,18 @@ static void convBlend(CMaterial::TBlend blend, GLenum& glenum) case CMaterial::srccolor: glenum=GL_SRC_COLOR; break; case CMaterial::invsrccolor:glenum=GL_ONE_MINUS_SRC_COLOR; break; // Extended Blend modes. +#ifdef USE_OPENGLES + case CMaterial::blendConstantColor: glenum=GL_CONSTANT_COLOR; break; + case CMaterial::blendConstantInvColor: glenum=GL_ONE_MINUS_CONSTANT_COLOR; break; + case CMaterial::blendConstantAlpha: glenum=GL_CONSTANT_ALPHA; break; + case CMaterial::blendConstantInvAlpha: glenum=GL_ONE_MINUS_CONSTANT_ALPHA; break; +#else case CMaterial::blendConstantColor: glenum=GL_CONSTANT_COLOR_EXT; break; case CMaterial::blendConstantInvColor: glenum=GL_ONE_MINUS_CONSTANT_COLOR_EXT; break; case CMaterial::blendConstantAlpha: glenum=GL_CONSTANT_ALPHA_EXT; break; case CMaterial::blendConstantInvAlpha: glenum=GL_ONE_MINUS_CONSTANT_ALPHA_EXT; break; +#endif + default: nlstop; } } @@ -242,7 +250,9 @@ void CDriverGL::setTextureShaders(const uint8 *addressingModes, const CSmartPtr< if (glAddrMode != _CurrentTexAddrMode[stage]) // addressing mode different from the one in the device? { _DriverGLStates.activeTextureARB(stage); +#ifndef USE_OPENGLES glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, glAddrMode); +#endif _CurrentTexAddrMode[stage] = glAddrMode; } } @@ -1971,7 +1981,9 @@ void CDriverGL::endCloudMultiPass() nlassert(_CurrentMaterial->getShader() == CMaterial::Cloud); if (ATICloudShaderHandle) { +#ifndef USE_OPENGLES glDisable(GL_FRAGMENT_SHADER_ATI); +#endif } } @@ -1989,7 +2001,9 @@ sint CDriverGL::beginWaterMultiPass() */ void CDriverGL::setupWaterPassR200(const CMaterial &mat) { - H_AUTO_OGL(CDriverGL_setupWaterPassR200) + H_AUTO_OGL(CDriverGL_setupWaterPassR200); + +#ifndef USE_OPENGLES uint k; ITexture *tex = mat.getTexture(0); if (tex) @@ -2061,6 +2075,7 @@ void CDriverGL::setupWaterPassR200(const CMaterial &mat) float cst[4] = { 1.f, 1.f, 1.f, 0.f }; nglSetFragmentShaderConstantATI(GL_CON_0_ATI, cst); } +#endif } // *************************************************************************** @@ -2068,7 +2083,9 @@ void CDriverGL::setupWaterPassR200(const CMaterial &mat) */ void CDriverGL::setupWaterPassARB(const CMaterial &mat) { - H_AUTO_OGL(CDriverGL_setupWaterPassARB) + H_AUTO_OGL(CDriverGL_setupWaterPassARB); + +#ifndef USE_OPENGLES uint k; ITexture *tex = mat.getTexture(0); if (tex) @@ -2147,6 +2164,7 @@ void CDriverGL::setupWaterPassARB(const CMaterial &mat) } } } +#endif } // *************************************************************************** @@ -2175,6 +2193,7 @@ void CDriverGL::setupWaterPassNV20(const CMaterial &mat) { H_AUTO_OGL(CDriverGL_setupWaterPassNV20) +#ifndef USE_OPENGLES static bool setupDone = false; static CMaterial::CTexEnv texEnvReplace; static CMaterial::CTexEnv texEnvModulate; @@ -2259,6 +2278,7 @@ void CDriverGL::setupWaterPassNV20(const CMaterial &mat) activateTexEnvMode(2, texEnvReplace); activateTexEnvMode(3, texEnvModulate); } +#endif } // *************************************************************************** @@ -2286,7 +2306,9 @@ void CDriverGL::setupWaterPass(uint /* pass */) // *************************************************************************** void CDriverGL::endWaterMultiPass() { - H_AUTO_OGL(CDriverGL_endWaterMultiPass) + H_AUTO_OGL(CDriverGL_endWaterMultiPass); + +#ifndef USE_OPENGLES nlassert(_CurrentMaterial->getShader() == CMaterial::Water); // NB : as fragment shaders / programs bypass the texture envs, no special env enum is added (c.f CTexEnvSpecial) if (_Extensions.NVTextureShader) return; @@ -2298,6 +2320,7 @@ void CDriverGL::endWaterMultiPass() { glDisable(GL_FRAGMENT_SHADER_ATI); } +#endif } } // NL3D diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_states.h b/code/nel/src/3d/driver/opengl/driver_opengl_states.h index 9a8aa3e4f..e3820c4a8 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_states.h +++ b/code/nel/src/3d/driver/opengl/driver_opengl_states.h @@ -20,11 +20,15 @@ #include "nel/misc/types_nl.h" #include "nel/3d/vertex_buffer.h" -#ifdef NL_OS_MAC -# define GL_GLEXT_LEGACY -# include +#ifdef USE_OPENGLES +# include #else -# include +# ifdef NL_OS_MAC +# define GL_GLEXT_LEGACY +# include +# else +# include +# endif #endif @@ -41,7 +45,7 @@ namespace NL3D - GL_ALPHA_TEST - GL_LIGHTING - GL_LIGHT0 + i ..... - - GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP_ARB. + - GL_TEXTURE_2D or GL_TEXTURE_CUBE_MAP_ARB/OES. - GL_TEXTURE_GEN_S, GL_TEXTURE_GEN_T, GL_TEXTURE_GEN_R - GL_COLOR_MATERIAL - GL_FOG diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp index 6079dc6f3..f3e59c65e 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp @@ -155,7 +155,11 @@ bool CTextureDrvInfosGL::initFrameBufferObject(ITexture * tex) // check status GLenum status; +#ifdef USE_OPENGLES + status = (GLenum) nglCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES); +#else status = (GLenum) nglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); +#endif switch(status) { case GL_FRAMEBUFFER_COMPLETE_EXT: InitFBO = true; @@ -204,12 +208,24 @@ bool CTextureDrvInfosGL::initFrameBufferObject(ITexture * tex) // clean up resources if allocation failed if (!InitFBO) { +#ifdef USE_OPENGLES + nglDeleteFramebuffersOES(1, &FBOId); +#else nglDeleteFramebuffersEXT(1, &FBOId); +#endif if (AttachDepthStencil) { +#ifdef USE_OPENGLES + nglDeleteRenderbuffersOES(1, &DepthFBOId); +#else nglDeleteRenderbuffersEXT(1, &DepthFBOId); +#endif if(!UsePackedDepthStencil) +#ifdef USE_OPENGLES + nglDeleteRenderbuffersOES(1, &StencilFBOId); +#else nglDeleteRenderbuffersEXT(1, &StencilFBOId); +#endif } } @@ -226,14 +242,22 @@ bool CTextureDrvInfosGL::activeFrameBufferObject(ITexture * tex) if(initFrameBufferObject(tex)) { glBindTexture(TextureMode, 0); +#ifdef USE_OPENGLES + nglBindFramebufferOES(GL_FRAMEBUFFER_OES, FBOId); +#else nglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBOId); +#endif } else return false; } else { +#ifdef USE_OPENGLES + nglBindFramebufferOES(GL_FRAMEBUFFER_OES, 0); +#else nglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); +#endif } return true; @@ -840,8 +864,13 @@ bool CDriverGL::setupTextureEx (ITexture& tex, bool bUpload, bool &bAllUploaded, sint size= tex.getPixels(i).size(); if (bUpload) { +#ifdef USE_OPENGLES + glCompressedTexImage2D (GL_TEXTURE_2D, i-decalMipMapResize, glfmt, + tex.getWidth(i),tex.getHeight(i), 0, size, ptr); +#else nglCompressedTexImage2DARB (GL_TEXTURE_2D, i-decalMipMapResize, glfmt, tex.getWidth(i),tex.getHeight(i), 0, size, ptr); +#endif bAllUploaded = true; } else diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_vertex_buffer_hard.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_vertex_buffer_hard.cpp index 3c74d02b4..ba471b8dd 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_vertex_buffer_hard.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_vertex_buffer_hard.cpp @@ -69,7 +69,7 @@ IVertexBufferHardGL::~IVertexBufferHardGL() H_AUTO_OGL(IVertexBufferHardGL_IVertexBufferHardGLDtor) } - +#ifndef USE_OPENGLES // *************************************************************************** // *************************************************************************** @@ -1133,7 +1133,7 @@ void CVertexArrayRangeMapObjectATI::updateLostBuffers() } #endif - +#endif // USE_OPENGLES // *************************************************************************** @@ -1328,6 +1328,12 @@ CVertexBufferHardARB::CVertexBufferHardARB(CDriverGL *drv, CVertexBuffer *vb) : #ifdef NL_DEBUG _Unmapping = false; #endif + +#ifdef USE_OPENGLES + _Buffer = NULL; + _BufferSize = 0; + _LastBufferSize = 0; +#endif } // *************************************************************************** @@ -1369,6 +1375,14 @@ CVertexBufferHardARB::~CVertexBufferHardARB() _VertexArrayRange->_MappedVBList.erase(_IteratorInMappedVBList); } #endif + +#ifdef USE_OPENGLES + if (_Buffer) + { + delete [] _Buffer; + _Buffer = NULL; + } +#endif } // *************************************************************************** @@ -1450,6 +1464,39 @@ void *CVertexBufferHardARB::lock() beforeLock= CTime::getPerformanceTime(); } _Driver->_DriverGLStates.bindARBVertexBuffer(_VertexObjectId); + +#ifdef USE_OPENGLES + if (_Driver->_Extensions.OESMapBuffer) + { + _VertexPtr = nglMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES); + if (!_VertexPtr) + { + nglUnmapBufferOES(GL_ARRAY_BUFFER); + nlassert(glIsBuffer(_VertexObjectId)); + invalidate(); + return &_DummyVB[0]; + } + } + else + { + const uint size = VB->getNumVertices() * VB->getVertexSize(); + + if (size > _BufferSize) + { + if (_Buffer) delete [] _Buffer; + + _Buffer = new uint8[size+3]; + _BufferSize = size; + } + + uint8 offset = (size_t)_Buffer % 4; + + if (offset > 0) offset = 4 - offset; + + _VertexPtr = _Buffer + offset; + _LastBufferSize = size; + } +#else _VertexPtr = nglMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB); if (!_VertexPtr) { @@ -1458,6 +1505,8 @@ void *CVertexBufferHardARB::lock() invalidate(); return &_DummyVB[0]; } +#endif + #ifdef NL_DEBUG _VertexArrayRange->_MappedVBList.push_front(this); _IteratorInMappedVBList = _VertexArrayRange->_MappedVBList.begin(); 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 48af6cf05..eb3083729 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_window.cpp @@ -2376,11 +2376,15 @@ void CDriverGL::getWindowSize(uint32 &width, uint32 &height) if (_CurrentMode.OffScreen) { #ifdef NL_OS_WINDOWS + +#ifndef USE_OPENGLES if (_PBuffer) { nwglQueryPbufferARB( _PBuffer, WGL_PBUFFER_WIDTH_ARB, (int*)&width ); nwglQueryPbufferARB( _PBuffer, WGL_PBUFFER_HEIGHT_ARB, (int*)&height ); } +#endif + #endif } else From 65eaa95bf88cc3f8f963c626a626034da0fbea6f Mon Sep 17 00:00:00 2001 From: kervala Date: Fri, 20 May 2011 21:32:31 +0200 Subject: [PATCH 030/118] Fixed: #1297 CMake - improper detection architecture under linux (patch provided by Naush) --- code/CMakeModules/nel.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/CMakeModules/nel.cmake b/code/CMakeModules/nel.cmake index f20febe4d..20364b1ef 100644 --- a/code/CMakeModules/nel.cmake +++ b/code/CMakeModules/nel.cmake @@ -335,7 +335,7 @@ MACRO(NL_SETUP_BUILD) ENDIF(WIN32) # Determine target CPU - IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86") +# IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86") IF(NOT CMAKE_SIZEOF_VOID_P) INCLUDE (CheckTypeSize) CHECK_TYPE_SIZE("void*" CMAKE_SIZEOF_VOID_P) @@ -352,7 +352,7 @@ MACRO(NL_SETUP_BUILD) ADD_DEFINITIONS(-DHAVE_X86) ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 8) # ADD_DEFINITIONS(-DHAVE_IA64) - ENDIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86") +# ENDIF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86") ENDMACRO(NL_SETUP_BUILD) From d612e6fdfb045389bb30e8d0b1efc3dc72a10ebd Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Sat, 21 May 2011 01:54:20 +0300 Subject: [PATCH 031/118] Fixed: #1193 Settings of "remap extensions" loads from settings file. --- .../object_viewer_qt/src/plugins/core/core_constants.h | 1 + .../src/plugins/core/search_paths_settings_page.cpp | 9 ++++++--- .../src/plugins/core/search_paths_settings_page.h | 1 + .../object_viewer_qt/src/plugins/example/qnel_widget.cpp | 2 +- .../src/plugins/object_viewer/graphics_viewport.cpp | 2 +- .../plugins/object_viewer/particle_workspace_dialog.cpp | 2 +- 6 files changed, 11 insertions(+), 6 deletions(-) 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 a3b7c0d72..b902b6c0f 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 @@ -78,6 +78,7 @@ 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"; //resources const char * const ICON_NEL = ":/core/images/nel.png"; 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 6f0fcb47d..94ebec8d1 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 @@ -92,17 +92,20 @@ void CSearchPathsSettingsPage::finish() void CSearchPathsSettingsPage::applySearchPaths() { - QStringList paths; + QStringList paths, remapExt; QSettings *settings = Core::ICore::instance()->settings(); settings->beginGroup(Core::Constants::DATA_PATH_SECTION); paths = settings->value(Core::Constants::SEARCH_PATHS).toStringList(); + remapExt = settings->value(Core::Constants::REMAP_EXTENSIONS).toStringList(); settings->endGroup(); + + for (int i = 1; i < remapExt.size(); i += 2) + NLMISC::CPath::remapExtension(remapExt.at(i - 1).toStdString(), remapExt.at(i).toStdString(), true); + Q_FOREACH(QString path, paths) { NLMISC::CPath::addSearchPath(path.toStdString(), false, false); } - NLMISC::CPath::remapExtension("png", "tga", true); - NLMISC::CPath::remapExtension("png", "dds", true); } void CSearchPathsSettingsPage::addPath() 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 15f28f6c8..90eab513a 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 @@ -49,6 +49,7 @@ public: void apply(); void finish(); + // Set of the search paths(not recursive) and the remap extensions (loading from settings file) void applySearchPaths(); private Q_SLOTS: diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/qnel_widget.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/qnel_widget.cpp index 759e8f304..4872923db 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/example/qnel_widget.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/example/qnel_widget.cpp @@ -38,7 +38,7 @@ QNLWidget::QNLWidget(QWidget *parent) m_initialized(false), m_interval(25) { - setAttribute(Qt::WA_OpaquePaintEvent); + setAttribute(Qt::WA_OpaquePaintEvent); setAttribute(Qt::WA_NoSystemBackground); setAttribute(Qt::WA_PaintOnScreen); setMouseTracking(true); 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 7eaed0a1b..c5d1ae677 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 @@ -49,7 +49,7 @@ namespace NLQT CGraphicsViewport::CGraphicsViewport(QWidget *parent) : QNLWidget(parent) { - setAttribute(Qt::WA_OpaquePaintEvent); + setAttribute(Qt::WA_OpaquePaintEvent); setAttribute(Qt::WA_NoSystemBackground); setAttribute(Qt::WA_PaintOnScreen); } 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 4d6d35c9f..858922af1 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 @@ -226,7 +226,7 @@ void CParticleWorkspaceDialog::clickedItem(const QModelIndex & index) _treeModel->getOwnerNode(_currentItem)->getPSPointer()->setCurrentEditedElement(NULL); _currentItem = static_cast(index.internalPointer()); - + if (_currentItem == 0) return; From b5e9f376900d975e8135cb56a7c53bdf6c219aff Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Sat, 21 May 2011 03:50:01 +0300 Subject: [PATCH 032/118] Fixed: #1193 Updated icon. --- .../src/plugins/object_viewer/animation_form.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/animation_form.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/animation_form.ui index 90d496d17..3660afe45 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/animation_form.ui +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/animation_form.ui @@ -193,7 +193,7 @@ - :/images/animset.png:/images/animset.png + :/icons/ic_nel_animset.png:/icons/ic_nel_animset.png From 87dbe3abc4e3ae40092bc6fe6c2eb6b991225b6b Mon Sep 17 00:00:00 2001 From: kervala Date: Mon, 23 May 2011 12:52:35 +0200 Subject: [PATCH 033/118] Fixed: Luabind detection when compiled from sources --- code/CMakeModules/FindLuabind.cmake | 31 +++++++++++++++++------------ 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/code/CMakeModules/FindLuabind.cmake b/code/CMakeModules/FindLuabind.cmake index b73530ef5..75dfbd73f 100644 --- a/code/CMakeModules/FindLuabind.cmake +++ b/code/CMakeModules/FindLuabind.cmake @@ -6,7 +6,7 @@ IF(LUABIND_LIBRARIES AND LUABIND_INCLUDE_DIR) # in cache already - SET(LUABIND_FIND_QUIETLY TRUE) + SET(Luabind_FIND_QUIETLY TRUE) ENDIF(LUABIND_LIBRARIES AND LUABIND_INCLUDE_DIR) FIND_PATH(LUABIND_INCLUDE_DIR @@ -62,30 +62,35 @@ FIND_LIBRARY(LUABIND_LIBRARY_DEBUG FIND_PACKAGE(Boost REQUIRED) IF(LUABIND_INCLUDE_DIR AND Boost_INCLUDE_DIR) - IF(LUABIND_LIBRARY_RELEASE) + IF(LUABIND_LIBRARY_RELEASE AND LUABIND_LIBRARY_DEBUG) + # Case where both Release and Debug versions are provided SET(LUABIND_FOUND TRUE) - SET(LUABIND_INCLUDE_DIR ${LUABIND_INCLUDE_DIR} ${Boost_INCLUDE_DIR}) - IF(LUABIND_LIBRARY_DEBUG) - SET(LUABIND_LIBRARIES "optimized;${LUABIND_LIBRARY_RELEASE};debug;${LUABIND_LIBRARY_DEBUG}") - ELSE(LUABIND_LIBRARY_DEBUG) - SET(LUABIND_LIBRARIES "${LUABIND_LIBRARY_RELEASE}") - ENDIF(LUABIND_LIBRARY_DEBUG) - ENDIF(LUABIND_LIBRARY_RELEASE) + SET(LUABIND_LIBRARIES optimized ${LUABIND_LIBRARY_RELEASE} debug ${LUABIND_LIBRARY_DEBUG}) + ELSEIF(LUABIND_LIBRARY_RELEASE) + # Normal case + SET(LUABIND_FOUND TRUE) + SET(LUABIND_LIBRARIES ${LUABIND_LIBRARY_RELEASE}) + ELSEIF(LUABIND_LIBRARY_DEBUG) + # Case where Luabind is compiled from sources (debug version is compiled by default) + SET(LUABIND_FOUND TRUE) + SET(LUABIND_LIBRARIES ${LUABIND_LIBRARY_DEBUG}) + ENDIF(LUABIND_LIBRARY_RELEASE AND LUABIND_LIBRARY_DEBUG) ENDIF(LUABIND_INCLUDE_DIR AND Boost_INCLUDE_DIR) IF(LUABIND_FOUND) + SET(LUABIND_INCLUDE_DIR ${LUABIND_INCLUDE_DIR} ${Boost_INCLUDE_DIR}) # Check if luabind/version.hpp exists FIND_FILE(LUABIND_VERSION_FILE luabind/version.hpp PATHS ${LUABIND_INCLUDE_DIR}) IF(LUABIND_VERSION_FILE) SET(LUABIND_DEFINITIONS "-DHAVE_LUABIND_VERSION") ENDIF(LUABIND_VERSION_FILE) - IF(NOT LUABIND_FIND_QUIETLY) + IF(NOT Luabind_FIND_QUIETLY) MESSAGE(STATUS "Found Luabind: ${LUABIND_LIBRARIES}") - ENDIF(NOT LUABIND_FIND_QUIETLY) + ENDIF(NOT Luabind_FIND_QUIETLY) ELSE(LUABIND_FOUND) - IF(NOT LUABIND_FIND_QUIETLY) + IF(NOT Luabind_FIND_QUIETLY) MESSAGE(STATUS "Warning: Unable to find Luabind!") - ENDIF(NOT LUABIND_FIND_QUIETLY) + ENDIF(NOT Luabind_FIND_QUIETLY) ENDIF(LUABIND_FOUND) MARK_AS_ADVANCED(LUABIND_LIBRARY_RELEASE LUABIND_LIBRARY_DEBUG Boost_LIB_DIAGNOSTIC_DEFINITIONS) From ae02411ddf607e3a363ee8c29f38eb2ade1f7069 Mon Sep 17 00:00:00 2001 From: Fabien_HENON Date: Mon, 23 May 2011 16:09:14 +0200 Subject: [PATCH 034/118] Updating the world_editor_classes.xml file for the guild missions - Adding new actions for guild missions - Adding the guild option for some actions - Adding the nb_guild_members_needed option for the objectives --- .../world_editor_classes.xml | 85 ++++++++++++++++--- 1 file changed, 72 insertions(+), 13 deletions(-) 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 be7ce1beb..1e4f9d723 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,12 +688,15 @@ + + + @@ -835,11 +838,20 @@ + + + + + + + + + @@ -852,6 +864,7 @@ + @@ -1007,6 +1020,7 @@ + @@ -1019,6 +1033,7 @@ + @@ -1093,6 +1108,8 @@ + + @@ -1106,6 +1123,9 @@ + + + @@ -1115,7 +1135,9 @@ - + + + @@ -1124,24 +1146,34 @@ + + + + - + + + - + + + - + + + @@ -1150,20 +1182,27 @@ + + + - + + + - + + + @@ -1173,7 +1212,9 @@ - + + + @@ -1182,7 +1223,9 @@ - + + + @@ -1190,7 +1233,9 @@ - + + + @@ -1198,26 +1243,35 @@ - + + + - + + + - + + + + + + @@ -1250,13 +1304,18 @@ + + + - + + + From 024f41d69aab35f251bf24dceb72b18cb70839a6 Mon Sep 17 00:00:00 2001 From: kervala Date: Tue, 24 May 2011 09:36:56 +0200 Subject: [PATCH 035/118] Fixed: __PRI64_PREFIX not defined under NetBSD --- code/nel/include/nel/misc/types_nl.h | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/code/nel/include/nel/misc/types_nl.h b/code/nel/include/nel/misc/types_nl.h index 04b56f63e..d0ad3cec7 100644 --- a/code/nel/include/nel/misc/types_nl.h +++ b/code/nel/include/nel/misc/types_nl.h @@ -287,20 +287,18 @@ typedef unsigned int uint; // at least 32bits (depend of processor) #define __STDC_FORMAT_MACROS #include -#ifdef NL_OS_MAC -#define NL_I64 __PRI_64_LENGTH_MODIFIER__ +#if defined(__PRI_64_LENGTH_MODIFIER__) +# define NL_I64 __PRI_64_LENGTH_MODIFIER__ +#elif defined(__PRI64_PREFIX) +# define NL_I64 __PRI64_PREFIX #else -#define NL_I64 __PRI64_PREFIX +# ifdef _LP64 +# define NL_I64 "l" +# else +# define NL_I64 "ll" +# endif // _LP64 #endif -/* -#ifdef _LP64 -# define NL_I64 "l" -#else -# define NL_I64 "ll" -#endif // _LP64 -*/ - #endif // NL_OS_UNIX // CHashMap, CHashSet and CHashMultiMap definitions From 0d4ed33812ac84b55d2d637a6957a56dc0f21e01 Mon Sep 17 00:00:00 2001 From: kervala Date: Tue, 24 May 2011 10:54:17 +0200 Subject: [PATCH 036/118] Changed: #1272 Fixed gpm_service compilation with GCC 4.6 (and added PCH to project) --- .../server/src/gpm_service/CMakeLists.txt | 4 + code/ryzom/server/src/gpm_service/cell.cpp | 1 + .../src/gpm_service/client_messages.cpp | 1 + .../ryzom/server/src/gpm_service/commands.cpp | 1 + .../server/src/gpm_service/gpm_service.cpp | 1 + .../ryzom/server/src/gpm_service/messages.cpp | 1 + .../server/src/gpm_service/move_checker.cpp | 2 + .../server/src/gpm_service/patat_grid.cpp | 1 + .../gpm_service/patat_subscribe_manager.cpp | 1 + code/ryzom/server/src/gpm_service/sheets.cpp | 1 + code/ryzom/server/src/gpm_service/stdpch.cpp | 17 ++++ code/ryzom/server/src/gpm_service/stdpch.h | 98 +++++++++++++++++++ .../server/src/gpm_service/variables.cpp | 1 + .../src/gpm_service/vision_delta_manager.cpp | 2 + .../server/src/gpm_service/world_entity.cpp | 1 + .../gpm_service/world_position_manager.cpp | 2 + 16 files changed, 135 insertions(+) create mode 100644 code/ryzom/server/src/gpm_service/stdpch.cpp create mode 100644 code/ryzom/server/src/gpm_service/stdpch.h diff --git a/code/ryzom/server/src/gpm_service/CMakeLists.txt b/code/ryzom/server/src/gpm_service/CMakeLists.txt index bee0c0e7c..802380761 100644 --- a/code/ryzom/server/src/gpm_service/CMakeLists.txt +++ b/code/ryzom/server/src/gpm_service/CMakeLists.txt @@ -20,4 +20,8 @@ NL_ADD_RUNTIME_FLAGS(ryzom_gpm_service) ADD_DEFINITIONS(${LIBXML2_DEFINITIONS}) +IF(WITH_PCH) + ADD_NATIVE_PRECOMPILED_HEADER(ryzom_gpm_service ${CMAKE_CURRENT_SOURCE_DIR}/stdpch.h ${CMAKE_CURRENT_SOURCE_DIR}/stdpch.cpp) +ENDIF(WITH_PCH) + INSTALL(TARGETS ryzom_gpm_service RUNTIME DESTINATION sbin COMPONENT services) diff --git a/code/ryzom/server/src/gpm_service/cell.cpp b/code/ryzom/server/src/gpm_service/cell.cpp index d5e0a01a1..b67989b69 100644 --- a/code/ryzom/server/src/gpm_service/cell.cpp +++ b/code/ryzom/server/src/gpm_service/cell.cpp @@ -16,6 +16,7 @@ +#include "stdpch.h" #include "cell.h" using namespace std; diff --git a/code/ryzom/server/src/gpm_service/client_messages.cpp b/code/ryzom/server/src/gpm_service/client_messages.cpp index df1521dbf..cdf4fffe2 100644 --- a/code/ryzom/server/src/gpm_service/client_messages.cpp +++ b/code/ryzom/server/src/gpm_service/client_messages.cpp @@ -15,6 +15,7 @@ // along with this program. If not, see . +#include "stdpch.h" // include files #include "nel/misc/types_nl.h" diff --git a/code/ryzom/server/src/gpm_service/commands.cpp b/code/ryzom/server/src/gpm_service/commands.cpp index d24f830e7..c1d3e9296 100644 --- a/code/ryzom/server/src/gpm_service/commands.cpp +++ b/code/ryzom/server/src/gpm_service/commands.cpp @@ -15,6 +15,7 @@ // along with this program. If not, see . +#include "stdpch.h" // Nel Misc #include "nel/misc/command.h" diff --git a/code/ryzom/server/src/gpm_service/gpm_service.cpp b/code/ryzom/server/src/gpm_service/gpm_service.cpp index 14583f01b..7e82d1d3d 100644 --- a/code/ryzom/server/src/gpm_service/gpm_service.cpp +++ b/code/ryzom/server/src/gpm_service/gpm_service.cpp @@ -15,6 +15,7 @@ // along with this program. If not, see . +#include "stdpch.h" // misc #include "nel/misc/command.h" diff --git a/code/ryzom/server/src/gpm_service/messages.cpp b/code/ryzom/server/src/gpm_service/messages.cpp index 8fd774750..b2a47a576 100644 --- a/code/ryzom/server/src/gpm_service/messages.cpp +++ b/code/ryzom/server/src/gpm_service/messages.cpp @@ -14,6 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +#include "stdpch.h" // include files #include "nel/misc/types_nl.h" diff --git a/code/ryzom/server/src/gpm_service/move_checker.cpp b/code/ryzom/server/src/gpm_service/move_checker.cpp index beca3531a..f8415761e 100644 --- a/code/ryzom/server/src/gpm_service/move_checker.cpp +++ b/code/ryzom/server/src/gpm_service/move_checker.cpp @@ -14,6 +14,8 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +#include "stdpch.h" + #include "nel/misc/common.h" #include "game_share/utils.h" diff --git a/code/ryzom/server/src/gpm_service/patat_grid.cpp b/code/ryzom/server/src/gpm_service/patat_grid.cpp index eef3e5886..fc48fc717 100644 --- a/code/ryzom/server/src/gpm_service/patat_grid.cpp +++ b/code/ryzom/server/src/gpm_service/patat_grid.cpp @@ -15,6 +15,7 @@ // along with this program. If not, see . +#include "stdpch.h" #include "patat_grid.h" diff --git a/code/ryzom/server/src/gpm_service/patat_subscribe_manager.cpp b/code/ryzom/server/src/gpm_service/patat_subscribe_manager.cpp index 9e5c6a67d..6616ad4e6 100644 --- a/code/ryzom/server/src/gpm_service/patat_subscribe_manager.cpp +++ b/code/ryzom/server/src/gpm_service/patat_subscribe_manager.cpp @@ -15,6 +15,7 @@ // along with this program. If not, see . +#include "stdpch.h" #include "patat_subscribe_manager.h" diff --git a/code/ryzom/server/src/gpm_service/sheets.cpp b/code/ryzom/server/src/gpm_service/sheets.cpp index 6d0e43c87..bdad20489 100644 --- a/code/ryzom/server/src/gpm_service/sheets.cpp +++ b/code/ryzom/server/src/gpm_service/sheets.cpp @@ -16,6 +16,7 @@ +#include "stdpch.h" // Misc #include "nel/misc/path.h" diff --git a/code/ryzom/server/src/gpm_service/stdpch.cpp b/code/ryzom/server/src/gpm_service/stdpch.cpp new file mode 100644 index 000000000..d4b14ffe2 --- /dev/null +++ b/code/ryzom/server/src/gpm_service/stdpch.cpp @@ -0,0 +1,17 @@ +// 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 "stdpch.h" diff --git a/code/ryzom/server/src/gpm_service/stdpch.h b/code/ryzom/server/src/gpm_service/stdpch.h new file mode 100644 index 000000000..72a71657d --- /dev/null +++ b/code/ryzom/server/src/gpm_service/stdpch.h @@ -0,0 +1,98 @@ +// 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 "nel/misc/types_nl.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +// STL +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// NeL georges +#include "nel/georges/u_form.h" +#include "nel/georges/u_form_elm.h" + +// NeL ligo +#include "nel/ligo/ligo_config.h" +#include "nel/ligo/primitive.h" + +// NeL misc +#include "nel/misc/aabbox.h" +#include "nel/misc/block_memory.h" +#include "nel/misc/command.h" +#include "nel/misc/common.h" +#include "nel/misc/debug.h" +#include "nel/misc/entity_id.h" +#include "nel/misc/file.h" +#include "nel/misc/hierarchical_timer.h" +#include "nel/misc/i_xml.h" +#include "nel/misc/path.h" +#include "nel/misc/sheet_id.h" +#include "nel/misc/smart_ptr.h" +#include "nel/misc/stream.h" +#include "nel/misc/time_nl.h" +#include "nel/misc/variable.h" +#include "nel/misc/vector.h" +#include "nel/misc/vector_2d.h" +#include "nel/misc/vectord.h" + +// NeL net +#include "nel/net/message.h" +#include "nel/net/service.h" +#include "nel/net/unified_network.h" + +// NeL pacs +#include "nel/pacs/u_collision_desc.h" +#include "nel/pacs/u_global_position.h" +#include "nel/pacs/u_global_retriever.h" +#include "nel/pacs/u_move_container.h" +#include "nel/pacs/u_move_primitive.h" +#include "nel/pacs/u_primitive_block.h" + +// GameShare +#include "game_share/mirror_prop_value.h" +#include "game_share/player_vision_delta.h" +#include "game_share/ryzom_entity_id.h" +#include "game_share/ryzom_mirror_properties.h" +#include "game_share/synchronised_message.h" +#include "game_share/tick_event_handler.h" +#include "game_share/utils.h" + +// ServerShare +#include "server_share/effect_manager.h" +#include "server_share/msg_gpm_service.h" +#include "server_share/pet_interface_msg.h" +#include "server_share/r2_variables.h" +#include "server_share/r2_vision.h" +#include "server_share/used_continent.h" diff --git a/code/ryzom/server/src/gpm_service/variables.cpp b/code/ryzom/server/src/gpm_service/variables.cpp index 82ce9e605..6634431fa 100644 --- a/code/ryzom/server/src/gpm_service/variables.cpp +++ b/code/ryzom/server/src/gpm_service/variables.cpp @@ -15,6 +15,7 @@ // along with this program. If not, see . +#include "stdpch.h" #include "variables.h" diff --git a/code/ryzom/server/src/gpm_service/vision_delta_manager.cpp b/code/ryzom/server/src/gpm_service/vision_delta_manager.cpp index 32aea0c0e..fa337c2cd 100644 --- a/code/ryzom/server/src/gpm_service/vision_delta_manager.cpp +++ b/code/ryzom/server/src/gpm_service/vision_delta_manager.cpp @@ -14,6 +14,8 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +#include "stdpch.h" + #include "nel/net/unified_network.h" #include "vision_delta_manager.h" #include "gpm_service.h" diff --git a/code/ryzom/server/src/gpm_service/world_entity.cpp b/code/ryzom/server/src/gpm_service/world_entity.cpp index fd6725598..23e1debcb 100644 --- a/code/ryzom/server/src/gpm_service/world_entity.cpp +++ b/code/ryzom/server/src/gpm_service/world_entity.cpp @@ -15,6 +15,7 @@ // along with this program. If not, see . +#include "stdpch.h" #include "world_entity.h" #include "sheets.h" diff --git a/code/ryzom/server/src/gpm_service/world_position_manager.cpp b/code/ryzom/server/src/gpm_service/world_position_manager.cpp index cd2e563c2..ef11c30d2 100644 --- a/code/ryzom/server/src/gpm_service/world_position_manager.cpp +++ b/code/ryzom/server/src/gpm_service/world_position_manager.cpp @@ -14,6 +14,8 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +#include "stdpch.h" + // Nel Misc #include "nel/misc/types_nl.h" #include "nel/misc/file.h" From 570051bbbdf67ece8b1c5cd7063b57fbd33211e7 Mon Sep 17 00:00:00 2001 From: kervala Date: Tue, 24 May 2011 13:37:04 +0200 Subject: [PATCH 037/118] Changed: #1272 Fixed compilation with GCC 4.6 (patch provided by Naush) --- code/ryzom/server/src/ai_service/stdpch.h | 1 + .../src/entities_game_service/phrase_manager/phrase_manager.h | 3 ++- code/ryzom/server/src/entities_game_service/stdpch.h | 1 + code/ryzom/server/src/frontend_service/stdpch.h | 1 + code/ryzom/server/src/input_output_service/stdpch.h | 1 + code/ryzom/server/src/monitor_service/stdpch.h | 1 + code/ryzom/server/src/server_share/stdpch.h | 1 + 7 files changed, 8 insertions(+), 1 deletion(-) diff --git a/code/ryzom/server/src/ai_service/stdpch.h b/code/ryzom/server/src/ai_service/stdpch.h index c2f2190e4..c94346568 100644 --- a/code/ryzom/server/src/ai_service/stdpch.h +++ b/code/ryzom/server/src/ai_service/stdpch.h @@ -34,6 +34,7 @@ #include #include +#include #include diff --git a/code/ryzom/server/src/entities_game_service/phrase_manager/phrase_manager.h b/code/ryzom/server/src/entities_game_service/phrase_manager/phrase_manager.h index 1f4616b63..85d09a655 100644 --- a/code/ryzom/server/src/entities_game_service/phrase_manager/phrase_manager.h +++ b/code/ryzom/server/src/entities_game_service/phrase_manager/phrase_manager.h @@ -52,10 +52,11 @@ struct CCyclicActionInfos TDataSetRow TargetRowId; std::vector CyclicActionBricks; + CCyclicActionInfos() { } inline void reset() { CyclicActionBricks.clear(); } }; -static const CCyclicActionInfos NoCyclicInfo; +static const CCyclicActionInfos NoCyclicInfo = CCyclicActionInfos(); class CPhraseManager; diff --git a/code/ryzom/server/src/entities_game_service/stdpch.h b/code/ryzom/server/src/entities_game_service/stdpch.h index 8989c1d04..f368c741d 100644 --- a/code/ryzom/server/src/entities_game_service/stdpch.h +++ b/code/ryzom/server/src/entities_game_service/stdpch.h @@ -21,6 +21,7 @@ #include #include #include +#include #include #include diff --git a/code/ryzom/server/src/frontend_service/stdpch.h b/code/ryzom/server/src/frontend_service/stdpch.h index 9cb7e70e1..2575817c5 100644 --- a/code/ryzom/server/src/frontend_service/stdpch.h +++ b/code/ryzom/server/src/frontend_service/stdpch.h @@ -18,6 +18,7 @@ #include #include +#include #include #include diff --git a/code/ryzom/server/src/input_output_service/stdpch.h b/code/ryzom/server/src/input_output_service/stdpch.h index 62e634de7..c1a8fea5c 100644 --- a/code/ryzom/server/src/input_output_service/stdpch.h +++ b/code/ryzom/server/src/input_output_service/stdpch.h @@ -25,6 +25,7 @@ #include #include #include +#include #include "nel/georges/load_form.h" #include "nel/georges/u_form.h" diff --git a/code/ryzom/server/src/monitor_service/stdpch.h b/code/ryzom/server/src/monitor_service/stdpch.h index 77da84ad4..dd5068a0c 100644 --- a/code/ryzom/server/src/monitor_service/stdpch.h +++ b/code/ryzom/server/src/monitor_service/stdpch.h @@ -32,6 +32,7 @@ #include #include +#include #include diff --git a/code/ryzom/server/src/server_share/stdpch.h b/code/ryzom/server/src/server_share/stdpch.h index 2a4418a54..7a9c49c2f 100644 --- a/code/ryzom/server/src/server_share/stdpch.h +++ b/code/ryzom/server/src/server_share/stdpch.h @@ -18,6 +18,7 @@ #include #include +#include #include #include From 6058264aed2cd0d5a6b625b28536f7f8a788b24b Mon Sep 17 00:00:00 2001 From: kervala Date: Tue, 24 May 2011 13:38:34 +0200 Subject: [PATCH 038/118] Changed: Renamed monitor_service to ryzom_monitor_service for homogeneity --- code/ryzom/server/src/monitor_service/CMakeLists.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/ryzom/server/src/monitor_service/CMakeLists.txt b/code/ryzom/server/src/monitor_service/CMakeLists.txt index 29379371c..b2400918b 100644 --- a/code/ryzom/server/src/monitor_service/CMakeLists.txt +++ b/code/ryzom/server/src/monitor_service/CMakeLists.txt @@ -1,9 +1,9 @@ FILE(GLOB SRC *.cpp *.h) -ADD_EXECUTABLE(monitor_service WIN32 ${SRC}) +ADD_EXECUTABLE(ryzom_monitor_service WIN32 ${SRC}) INCLUDE_DIRECTORIES(${RZ_SERVER_SRC_DIR} ${LIBXML2_INCLUDE_DIR} ${MYSQL_INCLUDE_DIR} ${ZLIB_INCLUDE_DIR}) -TARGET_LINK_LIBRARIES(monitor_service +TARGET_LINK_LIBRARIES(ryzom_monitor_service ryzom_gameshare ${LIBXML2_LIBRARIES} ${ZLIB_LIBRARY} @@ -12,15 +12,15 @@ TARGET_LINK_LIBRARIES(monitor_service nelnet nelgeorges) -NL_DEFAULT_PROPS(monitor_service "Ryzom, Services: Monitor Service (MOS)") -NL_ADD_RUNTIME_FLAGS(monitor_service) +NL_DEFAULT_PROPS(ryzom_monitor_service "Ryzom, Services: Monitor Service (MOS)") +NL_ADD_RUNTIME_FLAGS(ryzom_monitor_service) ADD_DEFINITIONS(${LIBXML2_DEFINITIONS}) IF(WITH_PCH) - ADD_NATIVE_PRECOMPILED_HEADER(monitor_service ${CMAKE_CURRENT_SOURCE_DIR}/stdpch.h ${CMAKE_CURRENT_SOURCE_DIR}/stdpch.cpp) + ADD_NATIVE_PRECOMPILED_HEADER(ryzom_monitor_service ${CMAKE_CURRENT_SOURCE_DIR}/stdpch.h ${CMAKE_CURRENT_SOURCE_DIR}/stdpch.cpp) ENDIF(WITH_PCH) -INSTALL(TARGETS monitor_service RUNTIME DESTINATION sbin COMPONENT services) +INSTALL(TARGETS ryzom_monitor_service RUNTIME DESTINATION sbin COMPONENT services) From 4d8038085cb584d113c43b75ee8d544b67945619 Mon Sep 17 00:00:00 2001 From: kervala Date: Tue, 24 May 2011 13:40:23 +0200 Subject: [PATCH 039/118] Changed: #825 Remove all warnings when compiling Ryzom --- .../src/entities_game_service/phrase_manager/faber_phrase.cpp | 4 ++-- .../src/entities_game_service/player_manager/character.cpp | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/ryzom/server/src/entities_game_service/phrase_manager/faber_phrase.cpp b/code/ryzom/server/src/entities_game_service/phrase_manager/faber_phrase.cpp index 79c0429d0..f83c8ec25 100644 --- a/code/ryzom/server/src/entities_game_service/phrase_manager/faber_phrase.cpp +++ b/code/ryzom/server/src/entities_game_service/phrase_manager/faber_phrase.cpp @@ -454,8 +454,8 @@ void CFaberPhrase::apply() return; } - neededMp = _RootFaberPlan->Faber->NeededMps.size(); - EGSPD::CPeople::TPeople civRestriction = _RootFaberPlan->CivRestriction; + neededMp = (uint32)_RootFaberPlan->Faber->NeededMps.size(); + EGSPD::CPeople::TPeople civRestriction = _RootFaberPlan->CivRestriction; uint32 usedMp=0; vector< const CStaticItem * > usedMps = _Mps; diff --git a/code/ryzom/server/src/entities_game_service/player_manager/character.cpp b/code/ryzom/server/src/entities_game_service/player_manager/character.cpp index 0d244fb46..510ae28da 100644 --- a/code/ryzom/server/src/entities_game_service/player_manager/character.cpp +++ b/code/ryzom/server/src/entities_game_service/player_manager/character.cpp @@ -344,7 +344,6 @@ CCharacter::CCharacter(): CEntityBase(false), _AggroableSave(true), _GodModeSave(false) { - // todo : uncomment that when sadge item api is plugged _AggroCount = 0; // _Bulk = 0; From dd36396d7252d0d8c9f304658df66ab05d6361f4 Mon Sep 17 00:00:00 2001 From: kervala Date: Tue, 24 May 2011 13:46:40 +0200 Subject: [PATCH 040/118] Fixed: #1272 Compilation with GCC 4.6 (patch provided by Krop) --- .../src/frontend_service/distance_prioritizer.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/code/ryzom/server/src/frontend_service/distance_prioritizer.h b/code/ryzom/server/src/frontend_service/distance_prioritizer.h index 2698eb4aa..3ce4a94bc 100644 --- a/code/ryzom/server/src/frontend_service/distance_prioritizer.h +++ b/code/ryzom/server/src/frontend_service/distance_prioritizer.h @@ -549,13 +549,13 @@ public: bool discreetPropertyHasChanged(const CPropertyHistory::CPropertyEntry& entry, const CMirrorPropValueRO& currentValue, CLFECOMMON::TPropIndex propIndex, T* ) const { // Although the client should already know the sheet id of the controlled player, let's send it - //if ( (propIndex==PROPERTY_SHEET) && (TVPNodeServer::PrioContext.Slot == 0) ) + //if ( (propIndex==CLFECOMMON::PROPERTY_SHEET) && (TVPNodeServer::PrioContext.Slot == 0) ) // return false; if (entry.HasValue) { #ifdef NL_DEBUG - if ( (propIndex==PROPERTY_SHEET) && (currentValue() != *((T*)&(entry.LastSent))) ) + if ( (propIndex==CLFECOMMON::PROPERTY_SHEET) && (currentValue() != *((T*)&(entry.LastSent))) ) LOG_WHAT_IS_SENT( "C%hu S%hu: sheet changes from %u to %u", TVPNodeServer::PrioContext.ClientId, TVPNodeServer::PrioContext.Slot, (uint32)entry.LastSent, asUInt32(currentValue()) ); #endif return (currentValue() != *((T*)&(entry.LastSent))); @@ -569,7 +569,7 @@ public: { // Not sent yet //nldebug( "No history yet for C%hu - slot %hu - prop %hu", TVPNodeServer::PrioContext.ClientHost->clientId(), (uint16)TVPNodeServer::PrioContext.Slot, propIndex ); - if ( (propIndex==PROPERTY_SHEET) ) + if ( (propIndex==CLFECOMMON::PROPERTY_SHEET) ) { CMirrorPropValueRO currentValue( TheDataset, TVPNodeServer::PrioContext.EntityIndex, dsPropertyIndex ); LOG_WHAT_IS_SENT( "C%hu S%hu: sheet initializes to %u", TVPNodeServer::PrioContext.ClientId, TVPNodeServer::PrioContext.Slot, asUInt32(currentValue()) ); @@ -614,7 +614,7 @@ public: bool discreetPropertyHasChanged(const CPropertyHistory::CPropertyEntry& entry, TPropIndex propIndex, T* ) const { // Although the client should already know the sheet id of the controlled player, let's send it - //if ( (propIndex==PROPERTY_SHEET) && (TVPNodeServer::PrioContext.Slot == 0) ) + //if ( (propIndex==CLFECOMMON::PROPERTY_SHEET) && (TVPNodeServer::PrioContext.Slot == 0) ) // return false; TPropertyIndex dsPropertyIndex = CEntityContainer::propertyIndexInDataSetToVisualPropIndex( propIndex ); @@ -625,7 +625,7 @@ public: CMirrorPropValueRO currentValue( TheDataset, TVPNodeServer::PrioContext.EntityIndex, dsPropertyIndex ); #ifdef NL_DEBUG - if ( (propIndex==PROPERTY_SHEET) && (currentValue() != *((T*)&(entry.LastSent))) ) + if ( (propIndex==CLFECOMMON::PROPERTY_SHEET) && (currentValue() != *((T*)&(entry.LastSent))) ) LOG_WHAT_IS_SENT( "C%hu S%hu: sheet changes from %u to %u", TVPNodeServer::PrioContext.ClientId, TVPNodeServer::PrioContext.Slot, (uint32)entry.LastSent, asUInt32(currentValue()) ); #endif @@ -639,7 +639,7 @@ public: { // Not sent yet //nldebug( "No history yet for C%hu - slot %hu - prop %hu", TVPNodeServer::PrioContext.ClientHost->clientId(), (uint16)TVPNodeServer::PrioContext.Slot, propIndex ); - if ( (propIndex==PROPERTY_SHEET) ) + if ( (propIndex==CLFECOMMON::PROPERTY_SHEET) ) { CMirrorPropValueRO currentValue( TheDataset, TVPNodeServer::PrioContext.EntityIndex, dsPropertyIndex ); LOG_WHAT_IS_SENT( "C%hu S%hu: sheet initializes to %u", TVPNodeServer::PrioContext.ClientId, TVPNodeServer::PrioContext.Slot, asUInt32(currentValue()) ); @@ -681,7 +681,7 @@ public: bool targetListHasChanged(const CPropertyHistory::CPropertyEntry& entry, CLFECOMMON::TPropIndex propIndex, T* ) const { // Although the client should already know the sheet id of the controlled player, let's send it - //if ( (propIndex==PROPERTY_SHEET) && (TVPNodeServer::PrioContext.Slot == 0) ) + //if ( (propIndex==CLFECOMMON::PROPERTY_SHEET) && (TVPNodeServer::PrioContext.Slot == 0) ) // return false; TPropertyIndex dsPropertyIndex = CEntityContainer::propertyIndexInDataSetToVisualPropIndex( propIndex ); From 5dd2caadf33a85fd6ef840180a8be661caad951b Mon Sep 17 00:00:00 2001 From: kervala Date: Tue, 24 May 2011 14:05:13 +0200 Subject: [PATCH 041/118] Changed: Use default FindZLIB.cmake module from CMake --- code/CMakeModules/FindZLIB.cmake | 39 -------------------------------- 1 file changed, 39 deletions(-) delete mode 100644 code/CMakeModules/FindZLIB.cmake diff --git a/code/CMakeModules/FindZLIB.cmake b/code/CMakeModules/FindZLIB.cmake deleted file mode 100644 index cb055740e..000000000 --- a/code/CMakeModules/FindZLIB.cmake +++ /dev/null @@ -1,39 +0,0 @@ -# - Find zlib -# Find the native ZLIB includes and library -# -# ZLIB_INCLUDE_DIRS - where to find zlib.h, etc. -# ZLIB_LIBRARIES - List of libraries when using zlib. -# ZLIB_FOUND - True if zlib found. - -#============================================================================= -# Copyright 2001-2009 Kitware, Inc. -# -# 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 distributed this file outside of CMake, substitute the full -# License text for the above reference.) - -IF (ZLIB_INCLUDE_DIR) - # Already in cache, be silent - SET(ZLIB_FIND_QUIETLY TRUE) -ENDIF (ZLIB_INCLUDE_DIR) - -FIND_PATH(ZLIB_INCLUDE_DIR zlib.h) - -SET(ZLIB_NAMES z zlib zdll) -FIND_LIBRARY(ZLIB_LIBRARY NAMES ${ZLIB_NAMES} ) -MARK_AS_ADVANCED( ZLIB_LIBRARY ZLIB_INCLUDE_DIR ) - -# Per-recommendation -SET(ZLIB_INCLUDE_DIRS "${ZLIB_INCLUDE_DIR}") -SET(ZLIB_LIBRARIES "${ZLIB_LIBRARY}") - -# handle the QUIETLY and REQUIRED arguments and set ZLIB_FOUND to TRUE if -# all listed variables are TRUE -INCLUDE(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(ZLIB DEFAULT_MSG ZLIB_LIBRARIES ZLIB_INCLUDE_DIRS) From d5ff9fb85689714e91e53a72cf2864fca27c8ad6 Mon Sep 17 00:00:00 2001 From: kervala Date: Tue, 24 May 2011 14:14:19 +0200 Subject: [PATCH 042/118] Added: autoexp.dat for Visual C++ 2010 (support for Qt and STLport) --- .../visual_studio_macros/autoexp_vc10.dat | 6130 +++++++++++++++++ 1 file changed, 6130 insertions(+) create mode 100644 code/tool/visual_studio_macros/autoexp_vc10.dat diff --git a/code/tool/visual_studio_macros/autoexp_vc10.dat b/code/tool/visual_studio_macros/autoexp_vc10.dat new file mode 100644 index 000000000..c39287ebd --- /dev/null +++ b/code/tool/visual_studio_macros/autoexp_vc10.dat @@ -0,0 +1,6130 @@ +; AutoExp.Dat - templates for automatically expanding data +; Copyright(c) Microsoft Corporation. All Rights Reserved. +;--------------------------------------------------------------- +; +; Location: C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Packages\Debugger\autoexp.dat +; +; While debugging, Data Tips and items in the Watch and Variable +; windows are automatically expanded to show their most important +; elements. The expansion follows the format given by the rules +; in this file. You can add rules for your types or change the +; predefined rules. +; +; For good examples, read the rules in this file. +; +; To find what the debugger considers the type of a variable to +; be, add it to the Watch window and look at the Type column. +; +; An AutoExpand rule is a line with the name of a type, an equals +; sign, and text with replaceable parts in angle brackets. The +; part in angle brackets names a member of the type and an +; optional Watch format specifier. +; +; AutoExpand rules use the following syntax. The equals sign (=), +; angle brackets (<>), and comma are taken literally. Square +; brackets ([]) indicate optional items. +; +; type=[text]... +; +; type Name of the type (may be followed by <*> for template +; types such as the ATL types listed below). +; +; text Any text.Usually the name of the member to display, +; or a shorthand name for the member. +; +; member Name of a member to display. +; +; format Watch format specifier. One of the following: +; +; Letter Description Sample Display +; ------ -------------------------- ------------ ------------- +; d,i Signed decimal integer 0xF000F065,d -268373915 +; u Unsigned decimal integer 0x0065,u 101 +; o Unsigned octal integer 0xF065,o 0170145 +; x,X Hexadecimal integer 61541,X 0X0000F065 +; l,h long or short prefix for 00406042,hx 0x0c22 +; d, i, u, o, x, X +; f Signed floating-point 3./2.,f 1.500000 +; e Signed scientific-notation 3./2.,e 1.500000e+000 +; g Shorter of e and f 3./2.,g 1.5 +; c Single character 0x0065,c 'e' +; s Zero-terminated string pVar,s "Hello world" +; su Unicode string pVar,su "Hello world" +; +; For details of other format specifiers see Help under: +; "format specifiers/watch variable" +; +; The special format <,t> specifies the name of the most-derived +; type of the object. This is especially useful with pointers or +; references to a base class. +; +; If there is no rule for a class, the base classes are checked for +; a matching rule. +; +; There are some special entries allowed in the AutoExpand section: +; $BUILTIN is used to display more complex types that need to do more +; than just show a member variable or two. +; $ADDIN allows external DLLs to be added to display even more complex +; types via the EE Add-in API. The first argument is the DLL name, the +; second argument is the name of the export from the DLL to use. For +; further information on this API see the sample called EEAddIn. +; +; WARNING: if hexadecimal mode is on in the watch window, all numbers here are +; evaluated in hex, e.g. 42 becomes 0x42 + +[AutoExpand] + +; from windef.h +tagPOINT =x= y= +tagRECT =top= bottom= left= right= + +; from winuser.h +tagMSG =msg= wp= lp= + +; intrinsics +__m64 = +__m128=$BUILTIN(M128) +__m128i=$BUILTIN(M128I) +__m128d=$BUILTIN(M128D) + +; from afxwin.h +CDC =hDC= attrib= +CPaintDC =<,t> hWnd= +CPoint =x= y= +CRect =top= bottom= left= right= +CSize =cx= cy= +CWnd =<,t> hWnd= +CWinApp =<,t> +CWinThread =<,t> h= proc= + +; from afxcoll.h +CPtrList =cnt= + +; from afxstat_.h +CProcessLocalObject =<,t> +CThreadLocalObject =<,t> + +; from afx.h +CArchiveException =cause= +CFile =hFile= name= +CFileException =cause= OS Error=m_lOsError +CMemFile =pos= size= +CObject =<,t> +CRuntimeClass = +CStdioFile =FILE*= name= +CTimeSpan =time= +CTime =time= + +; from afxcoll.h +CByteArray =count= +CStringList =count= +; same for all CXXXArray classes +; same for CXXXList +; same for CMapXXToXX + +; various string classes from MFC & ATL + +_com_error= +_bstr_t=m_wstr,su> (m_RefCount,u>) +_com_ptr_t<*>= +_LARGE_INTEGER= +_ULARGE_INTEGER= +ATL::CComPtr<*>=

+ +ATL::CComQIPtr<*>=

+ +tagVARIANT=$BUILTIN(VARIANT) +VARIANT=$BUILTIN(VARIANT) +_GUID=$BUILTIN(GUID) + +; see EEAddIn sample for how to use these +;_SYSTEMTIME=$ADDIN(EEAddIn.dll,AddIn_SystemTime) +;_FILETIME=$ADDIN(EEAddIn.dll,AddIn_FileTime) + +; Qt autoexpand +QByteArray=data,s> size=size,u> +QPoint =x= y= +QPointF =x= y= +QRect =x1= y1= x2= y2= +QRectF =x= y= w= h= +QSize =width= height= +QSizeF =width= height= +QHash<*> =size=size> +QVarLengthArray<*> =size= data= + +[Visualizer] +; This section contains visualizers for STL and ATL containers +; DO NOT MODIFY +ATL::CStringT|CSimpleStringT|ATL::CSimpleStringT{ + preview ([$e.m_pszData,s]) + stringview ([$e.m_pszData,sb]) +} +ATL::CStringT|CSimpleStringT|ATL::CSimpleStringT|ATL::CStringT|CSimpleStringT|ATL::CSimpleStringT{ + preview ([$e.m_pszData,su]) + stringview ([$e.m_pszData,sub]) +} +ATL::CComBSTR{ + preview ([$e.m_str,su]) + stringview ([$e.m_str,sub]) +} + + +; Many visualizers use nested #()s. +; Why not use #(foo, bar) instead of #(#(foo), #(bar))? +; The former alphabetically sorts its fields, while the latter does not. + +;------------------------------------------------------------------------------ +; std::pair from +;------------------------------------------------------------------------------ +std::pair<*>{ + ; pair is previewed with "(, )". + preview ( + #( + "(", + $e.first, + ", ", + $e.second, + ")" + ) + ) + + ; We gloss over the fact that first and second are actually stored in _Pair_base. + children ( + #( + #(first : $e.first), + #(second : $e.second) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::plus, etc. from +;------------------------------------------------------------------------------ +; STL functors are previewed with their names. +; They have no state, so they have no children. +std::plus<*>{ + preview ( "plus" ) + children ( #array(expr: 0, size: 0) ) +} +std::minus<*>{ + preview ( "minus" ) + children ( #array(expr: 0, size: 0) ) +} +std::multiplies<*>{ + preview ( "multiplies" ) + children ( #array(expr: 0, size: 0) ) +} +std::divides<*>{ + preview ( "divides" ) + children ( #array(expr: 0, size: 0) ) +} +std::modulus<*>{ + preview ( "modulus" ) + children ( #array(expr: 0, size: 0) ) +} +std::negate<*>{ + preview ( "negate" ) + children ( #array(expr: 0, size: 0) ) +} +std::equal_to<*>{ + preview ( "equal_to" ) + children ( #array(expr: 0, size: 0) ) +} +std::not_equal_to<*>{ + preview ( "not_equal_to" ) + children ( #array(expr: 0, size: 0) ) +} +std::greater<*>{ + preview ( "greater" ) + children ( #array(expr: 0, size: 0) ) +} +std::less<*>{ + preview ( "less" ) + children ( #array(expr: 0, size: 0) ) +} +std::greater_equal<*>{ + preview ( "greater_equal" ) + children ( #array(expr: 0, size: 0) ) +} +std::less_equal<*>{ + preview ( "less_equal" ) + children ( #array(expr: 0, size: 0) ) +} +std::logical_and<*>{ + preview ( "logical_and" ) + children ( #array(expr: 0, size: 0) ) +} +std::logical_or<*>{ + preview ( "logical_or" ) + children ( #array(expr: 0, size: 0) ) +} +std::logical_not<*>{ + preview ( "logical_not" ) + children ( #array(expr: 0, size: 0) ) +} + +;------------------------------------------------------------------------------ +; std::not1() from +; std::not2() from +;------------------------------------------------------------------------------ +; STL negators are previewed with "not[12]()". +; They have a child with the fake name of [pred], so that the +; stored functor can be inspected. +std::unary_negate<*>{ + preview ( + #( + "not1(", + $e._Functor, + ")" + ) + ) + + children ( + #([pred] : $e._Functor) + ) +} +std::binary_negate<*>{ + preview ( + #( + "not2(", + $e._Functor, + ")" + ) + ) + + children ( + #([pred] : $e._Functor) + ) +} + +;------------------------------------------------------------------------------ +; std::bind1st() from +; std::bind2nd() from +;------------------------------------------------------------------------------ +; STL binders are previewed with "bind1st(, )" or "bind2nd(, )". +; We gloss over the fact that they derive from unary_function. +std::binder1st<*>{ + preview ( + #( + "bind1st(", + $e.op, + ", ", + $e.value, + ")" + ) + ) + + children ( + #( + #(op : $e.op), + #(value : $e.value) + ) + ) +} +std::binder2nd<*>{ + preview ( + #( + "bind2nd(", + $e.op, + ", ", + $e.value, + ")" + ) + ) + + children ( + #( + #(op : $e.op), + #(value : $e.value) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::ptr_fun() from +;------------------------------------------------------------------------------ +; STL function pointer adaptors are previewed with "ptr_fun()". +; Function pointers have no children, so the adaptors have no children. +std::pointer_to_unary_function<*>|std::pointer_to_binary_function<*>{ + preview ( + #( + "ptr_fun(", + $e._Pfun, + ")" + ) + ) + + children ( #array(expr: 0, size: 0) ) +} + +;------------------------------------------------------------------------------ +; std::mem_fun() from +; std::mem_fun_ref() from +;------------------------------------------------------------------------------ +; See ptr_fun(). +std::mem_fun_t<*>|std::mem_fun1_t<*>|std::const_mem_fun_t<*>|std::const_mem_fun1_t<*>{ + preview ( + #( + "mem_fun(", + $e._Pmemfun, + ")" + ) + ) + + children ( #array(expr: 0, size: 0) ) +} +std::mem_fun_ref_t<*>|std::mem_fun1_ref_t<*>|std::const_mem_fun_ref_t<*>|std::const_mem_fun1_ref_t<*>{ + preview ( + #( + "mem_fun_ref(", + $e._Pmemfun, + ")" + ) + ) + + children ( #array(expr: 0, size: 0) ) +} + +;------------------------------------------------------------------------------ +; std::auto_ptr from +;------------------------------------------------------------------------------ +std::auto_ptr<*>{ + ; An empty auto_ptr is previewed with "empty". + ; Otherwise, it is previewed with "auto_ptr ". + preview ( + #if ($e._Myptr == 0) ( + "empty" + ) #else ( + #( + "auto_ptr ", + *$e._Myptr + ) + ) + ) + + ; An empty auto_ptr has no children. + ; Otherwise, it has a single child, its stored pointer, with a fake name of [ptr]. + children ( + #if ($e._Myptr == 0) ( + #array(expr: 0, size: 0) + ) #else ( + #([ptr] : $e._Myptr) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::basic_string from +;------------------------------------------------------------------------------ +; basic_string is previewed with its stored string. +; It has [size] and [capacity] children, followed by [0], [1], [2], etc. children +; displaying its stored characters. +; The ($e._Myres) < ($e._BUF_SIZE) test determines whether the Small String Optimization +; is in effect. +; NOTE: The parentheses in ($e._Myres) < ($e._BUF_SIZE) are necessary. +std::basic_string{ + preview ( #if (($e._Myres) < ($e._BUF_SIZE)) ( [$e._Bx._Buf,s] ) #else ( [$e._Bx._Ptr,s] )) + stringview ( #if (($e._Myres) < ($e._BUF_SIZE)) ( [$e._Bx._Buf,sb] ) #else ( [$e._Bx._Ptr,sb] )) + + children ( + #( + #([size] : $e._Mysize), + #([capacity] : $e._Myres), + #if (($e._Myres) < ($e._BUF_SIZE)) ( + #array(expr: $e._Bx._Buf[$i], size: $e._Mysize) + ) #else ( + #array(expr: $e._Bx._Ptr[$i], size: $e._Mysize) + ) + ) + ) +} +std::basic_string|std::basic_string{ + preview ( #if (($e._Myres) < ($e._BUF_SIZE)) ( [$e._Bx._Buf,su] ) #else ( [$e._Bx._Ptr,su] )) + stringview ( #if (($e._Myres) < ($e._BUF_SIZE)) ( [$e._Bx._Buf,sub] ) #else ( [$e._Bx._Ptr,sub] )) + + children ( + #( + #([size] : $e._Mysize), + #([capacity] : $e._Myres), + #if (($e._Myres) < ($e._BUF_SIZE)) ( + #array(expr: $e._Bx._Buf[$i], size: $e._Mysize) + ) #else ( + #array(expr: $e._Bx._Ptr[$i], size: $e._Mysize) + ) + ) + ) +} +std::_String_iterator|std::_String_const_iterator{ + preview ( [$e._Ptr,s] ) + stringview ( [$e._Ptr,sb] ) + children ( #([ptr] : $e._Ptr) ) +} +std::_String_iterator|std::_String_const_iterator|std::_String_iterator|std::_String_const_iterator{ + preview ( [$e._Ptr,su] ) + stringview ( [$e._Ptr,sub] ) + children ( #([ptr] : $e._Ptr) ) +} + +;------------------------------------------------------------------------------ +; std::vector from +;------------------------------------------------------------------------------ +; Despite its packed representation, vector is visualized like vector. +std::vector{ + preview ( + #( + "[", + $e._Mysize, + "](", + #array( + expr: (bool)(($e._Myvec._Myfirst[$i / _VBITS] >> ($i % _VBITS)) & 1), + size: $e._Mysize + ), + ")" + ) + ) + + children ( + #( + #([size] : $e._Mysize), + #([capacity] : ($e._Myvec._Myend - $e._Myvec._Myfirst) * _VBITS), + #array( + expr: (bool)(($e._Myvec._Myfirst[$i / _VBITS] >> ($i % _VBITS)) & 1), + size: $e._Mysize + ) + ) + ) +} +std::_Vb_reference<*>|std::_Vb_iterator<*>|std::_Vb_const_iterator<*>{ + preview ( + (bool)((*$e._Myptr >> $e._Myoff) & 1) + ) + + children ( + #( + #([ptr] : $e._Myptr), + #([offset] : $e._Myoff) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::vector from +;------------------------------------------------------------------------------ +; vector is previewed with "[]()". +; It has [size] and [capacity] children, followed by its elements. +; The other containers follow its example. +std::vector<*>{ + preview ( + #( + "[", + $e._Mylast - $e._Myfirst, + "](", + #array( + expr: $e._Myfirst[$i], + size: $e._Mylast - $e._Myfirst + ), + ")" + ) + ) + + children ( + #( + #([size] : $e._Mylast - $e._Myfirst), + #([capacity] : $e._Myend - $e._Myfirst), + #array( + expr: $e._Myfirst[$i], + size: $e._Mylast - $e._Myfirst + ) + ) + ) +} +std::_Vector_iterator<*>|std::_Vector_const_iterator<*>{ + preview ( + *$e._Ptr + ) + + children ( + #([ptr] : $e._Ptr) + ) +} + +;------------------------------------------------------------------------------ +; std::deque from +;------------------------------------------------------------------------------ +std::deque<*>{ + preview ( + #( + "[", + $e._Mysize, + "](", + #array( + expr: $e._Map[(($i + $e._Myoff) / $e._EEN_DS) % $e._Mapsize][($i + $e._Myoff) % $e._EEN_DS], + size: $e._Mysize + ), + ")" + ) + ) + + children ( + #( + #array( + expr: $e._Map[(($i + $e._Myoff) / $e._EEN_DS) % $e._Mapsize][($i + $e._Myoff) % $e._EEN_DS], + size: $e._Mysize + ) + ) + ) +} +std::_Deque_iterator<*,*>|std::_Deque_const_iterator<*,*>{ + preview ( + #if ($e._Myoff >= ((std::deque<$T1,$T2> *)$e._Myproxy->_Mycont)->_Myoff + ((std::deque<$T1,$T2> *)$e._Myproxy->_Mycont)->_Mysize) ( + "end" + ) #else ( + ((std::deque<$T1,$T2> *)$e._Myproxy->_Mycont)->_Map[($e._Myoff / ((std::deque<$T1,$T2> *)$e._Myproxy->_Mycont)->_EEN_DS) % ((std::deque<$T1,$T2> *)$e._Myproxy->_Mycont)->_Mapsize][$e._Myoff % ((std::deque<$T1,$T2> *)$e._Myproxy->_Mycont)->_EEN_DS] + ) + ) + + children ( + #if ($e._Myoff >= ((std::deque<$T1,$T2> *)$e._Myproxy->_Mycont)->_Myoff + ((std::deque<$T1,$T2> *)$e._Myproxy->_Mycont)->_Mysize) ( + #array(expr: 0, size: 0) + ) #else ( + #( + #([index] : $e._Myoff - ((std::deque<$T1,$T2> *)$e._Myproxy->_Mycont)->_Myoff), + #([ptr] : &((std::deque<$T1,$T2> *)$e._Myproxy->_Mycont)->_Map[($e._Myoff / ((std::deque<$T1,$T2> *)$e._Myproxy->_Mycont)->_EEN_DS) % ((std::deque<$T1,$T2> *)$e._Myproxy->_Mycont)->_Mapsize][$e._Myoff % ((std::deque<$T1,$T2> *)$e._Myproxy->_Mycont)->_EEN_DS] ) + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::list from +;------------------------------------------------------------------------------ +std::list<*>{ + preview ( + #( + "[", + $e._Mysize, + "](", + #list( + head: $e._Myhead->_Next, + size: $e._Mysize, + next: _Next + ) : $e._Myval, + ")" + ) + ) + + children ( + #list( + head: $e._Myhead->_Next, + size: $e._Mysize, + next: _Next + ) : $e._Myval + ) +} +std::_List_iterator<*>|std::_List_const_iterator<*>{ + preview ( $e._Ptr->_Myval ) + children ( #([ptr] : &$e._Ptr->_Myval) ) +} + +;------------------------------------------------------------------------------ +; std::queue from +; std::stack from +;------------------------------------------------------------------------------ +std::queue<*>|std::stack<*>{ + preview ( $e.c ) + children ( #(c : $e.c) ) +} + +;------------------------------------------------------------------------------ +; std::priority_queue from +;------------------------------------------------------------------------------ +std::priority_queue<*>{ + preview ( $e.c ) + + children ( + #( + #(c [heap]: $e.c), + #(comp : $e.comp) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::map from +; std::multimap from +; std::set from +; std::multiset from +;------------------------------------------------------------------------------ +std::map<*>|std::multimap<*>|std::set<*>|std::multiset<*>{ + preview ( + #( + "[", + $e._Mysize, + "](", + #tree( + head: $e._Myhead->_Parent, + skip: $e._Myhead, + left: _Left, + right: _Right, + size: $e._Mysize + ) : $e._Myval, + ")" + ) + ) + + children ( + #( + #([comp] : $e.comp), + #tree( + head: $e._Myhead->_Parent, + skip: $e._Myhead, + left: _Left, + right: _Right, + size: $e._Mysize + ) : $e._Myval + ) + ) +} +std::_Tree_iterator<*>|std::_Tree_const_iterator<*>{ + preview ( $e._Ptr->_Myval ) + children ( #([ptr] : &$e._Ptr->_Myval) ) +} + +;------------------------------------------------------------------------------ +; std::bitset from +;------------------------------------------------------------------------------ +std::bitset<*>{ + preview ( + #( + "[", + $e._EEN_BITS, + "](", + #array( + expr: [($e._Array[$i / $e._Bitsperword] >> ($i % $e._Bitsperword)) & 1,d], + size: $e._EEN_BITS + ), + ")" + ) + ) + + children ( + #array( + expr: [($e._Array[$i / $e._Bitsperword] >> ($i % $e._Bitsperword)) & 1,d], + size: $e._EEN_BITS + ) + ) +} +std::bitset<*>::reference{ + preview ( + [($e._Pbitset->_Array[$i / $e._Pbitset->_Bitsperword] >> ($e._Mypos % $e._Pbitset->_Bitsperword)) & 1,d] + ) + + children ( + #( + #([bitset] : $e._Pbitset), + #([pos] : $e._Mypos) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::reverse_iterator from +;------------------------------------------------------------------------------ +std::reverse_iterator >|std::reverse_iterator >{ + preview ( + #( + "reverse_iterator to ", + $e.current._Ptr[-1] + ) + ) + + children ( + #( + #([to] : $e.current._Ptr - 1), + #(current : $e.current) + ) + ) +} +std::reverse_iterator >|std::reverse_iterator >{ + preview ( + #( + "reverse_iterator to ", + #if ($e.current._Myoff != 0) ( + (bool)((*$e.current._Myptr >> ($e.current._Myoff - 1)) & 1) + ) #else ( + (bool)(($e.current._Myptr[-1] >> (_VBITS - 1)) & 1) + ) + ) + ) + + children ( + #if ($e.current._Myoff != 0) ( + #( + #([to ptr] : $e.current._Myptr), + #([to offset] : $e.current._Myoff - 1), + #(current : $e.current) + ) + ) #else ( + #( + #([to ptr] : $e.current._Myptr - 1), + #([to offset] : _VBITS - 1), + #(current : $e.current) + ) + ) + ) +} +std::reverse_iterator >|std::reverse_iterator >{ + preview ( + #( + "reverse_iterator to ", + $e.current._Ptr[-1] + ) + ) + + children ( + #( + #([to] : $e.current._Ptr - 1), + #(current : $e.current) + ) + ) +} +std::reverse_iterator >|std::reverse_iterator >{ + preview ( + #( + "reverse_iterator to ", + #if ($e.current._Myoff == ((std::deque<$T1,$T2> *)$e.current._Myproxy->_Mycont)->_Myoff) ( + "end" + ) #else ( + ((std::deque<$T1,$T2> *)$e.current._Myproxy->_Mycont)->_Map[(($e.current._Myoff - 1) / ((std::deque<$T1,$T2> *)$e.current._Myproxy->_Mycont)->_EEN_DS) % ((std::deque<$T1,$T2> *)$e.current._Myproxy->_Mycont)->_Mapsize][($e.current._Myoff - 1) % ((std::deque<$T1,$T2> *)$e.current._Myproxy->_Mycont)->_EEN_DS] + ) + ) + ) + + children ( + #if ($e.current._Myoff == ((std::deque<$T1,$T2> *)$e.current._Myproxy->_Mycont)->_Myoff) ( + #(current : $e.current) + ) #else ( + #( + #([to index] : ($e.current._Myoff - 1) - ((std::deque<$T1,$T2> *)$e.current._Myproxy->_Mycont)->_Myoff), + #([to ptr] : &((std::deque<$T1,$T2> *)$e.current._Myproxy->_Mycont)->_Map[(($e.current._Myoff - 1) / ((std::deque<$T1,$T2> *)$e.current._Myproxy->_Mycont)->_EEN_DS) % ((std::deque<$T1,$T2> *)$e.current._Myproxy->_Mycont)->_Mapsize][($e.current._Myoff - 1) % ((std::deque<$T1,$T2> *)$e.current._Myproxy->_Mycont)->_EEN_DS] ), + #(current : $e.current) + ) + ) + ) +} +std::reverse_iterator >|std::reverse_iterator >{ + preview ( + #( + "reverse_iterator to ", + $e.current._Ptr->_Prev->_Myval + ) + ) + + children ( + #( + #([to] : &$e.current._Ptr->_Prev->_Myval), + #(current : $e.current) + ) + ) +} +std::reverse_iterator >|std::reverse_iterator >{ + preview ( + #( + "reverse_iterator to ", + #if ($e.current._EEN_IDL == 0) ( + $e.current._Ptr[-1] + ) #else ( + #if ($e.current._Idx == 0) ( + "end" + ) #else ( + $e.current._Ptr[$e.current._Idx - 1] + ) + ) + ) + ) + + children ( + #if ($e.current._EEN_IDL == 0) ( + #( + #([to] : $e.current._Ptr - 1), + #(current : $e.current) + ) + ) #else ( + #if ($e.current._Idx == 0) ( + #(current : $e.current) + ) #else ( + #( + #([to] : $e.current._Ptr + $e.current._Idx - 1), + #(current : $e.current) + ) + ) + ) + ) +} +std::reverse_iterator<*>{ + preview ( + #( + "reverse_iterator current ", + $e.current + ) + ) + + children ( + #(current : $e.current) + ) +} + +;------------------------------------------------------------------------------ +; std::complex from +;------------------------------------------------------------------------------ +std::complex<*>{ + preview ( + #if ($e._Val[1] == 0) ( + ; Purely real. + $e._Val[0] + ) #else ( + #if ($e._Val[0] == 0) ( + ; Purely imaginary. + #if ($e._Val[1] < 0) ( + #("-i*", -$e._Val[1]) + ) #else ( + #("i*", $e._Val[1]) + ) + ) #else ( + ; Mixed. + #if ($e._Val[1] < 0) ( + #($e._Val[0], "-i*", -$e._Val[1]) + ) #else ( + #($e._Val[0], "+i*", $e._Val[1]) + ) + ) + ) + ) + + children ( + #( + #(real : $e._Val[0]), + #(imag : $e._Val[1]) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::valarray from +;------------------------------------------------------------------------------ +std::valarray<*>{ + preview ( + #( + "[", + $e._Mysize, + "](", + #array( + expr: $e._Myptr[$i], + size: $e._Mysize + ), + ")" + ) + ) + + children ( + #array( + expr: $e._Myptr[$i], + size: $e._Mysize + ) + ) +} + +;------------------------------------------------------------------------------ +; std::tr1::reference_wrapper from +;------------------------------------------------------------------------------ +std::tr1::reference_wrapper<*>{ + preview ( + #if ($e._Callee._EEN_INDIRECT == 1) ( + ; For ordinary T, reference_wrapper stores a T * _Callee._Ptr + ; which is non-null. Actual references are previewed with what they + ; refer to, so reference_wrapper is previewed with dereferencing its + ; stored pointer. + *$e._Callee._Ptr + ) #else ( + ; When T is a pointer to data member type, reference_wrapper + ; stores a T _Callee._Object directly. + $e._Callee._Object + ) + ) + + children ( + #if ($e._Callee._EEN_INDIRECT == 1) ( + ; Actual references have the same children as what they refer to. + ; Unfortunately, there appears to be no way to imitate this exactly. + ; Therefore, we make reference_wrapper appear to have a single + ; child, its stored pointer, with a fake name of [ptr]. + #([ptr] : $e._Callee._Ptr) + ) #else ( + ; When T is a pointer to data member type, T has no children, + ; so we make reference_wrapper appear to have no children. + #array(expr: 0, size: 0) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::tr1::shared_ptr from +;------------------------------------------------------------------------------ +std::tr1::_Ref_count<*>{ + preview ( "default" ) + children ( #array(expr: 0, size: 0) ) +} +std::tr1::_Ref_count_del<*>{ + preview ( "custom deleter" ) + children ( #([deleter] : $e._Dtor) ) +} +std::tr1::_Ref_count_del_alloc<*>{ + preview ( "custom deleter, custom allocator" ) + children ( + #( + #([deleter] : $e._Dtor), + #([allocator] : $e._Myal) + ) + ) +} +std::tr1::_Ref_count_obj<*>{ + preview ( "make_shared" ) + children ( #array(expr: 0, size: 0) ) +} +std::tr1::_Ref_count_obj_alloc<*>{ + preview ( "allocate_shared" ) + children ( #([allocator] : $e._Myal) ) +} +std::tr1::shared_ptr<*>{ + preview ( + ; shared_ptr stores a T * _Ptr . + #if ($e._Ptr == 0) ( + ; A default-constructed shared_ptr has a null _Ptr and a null _Rep, + ; and is formally said to be empty. + ; A shared_ptr constructed from a null pointer has a null _Ptr + ; and a NON-null _Rep . It is formally said to own the null pointer. + ; We preview both with "empty". + "empty" + ) #else ( + ; Raw pointers are previewed with " ". + ; auto_ptr is previewed with "auto_ptr ". + ; Following these examples, shared_ptr is previewed with + ; "shared_ptr [N strong refs, M weak refs]". + #( + "shared_ptr ", + *$e._Ptr, + " [", + $e._Rep->_Uses, + #if ($e._Rep->_Uses == 1) (" strong ref") #else (" strong refs"), + #if ($e._Rep->_Weaks - 1 > 0) ( + #( + ", ", + $e._Rep->_Weaks - 1, + #if ($e._Rep->_Weaks - 1 == 1) (" weak ref") #else (" weak refs") + ) + ), + "] [", + *$e._Rep, + "]" + ) + ; Note: _Rep->_Uses counts how many shared_ptrs share ownership of the object, + ; so we directly display it as the strong reference count. + ; _Rep->_Weaks counts how many shared_ptrs and weak_ptrs share ownership of + ; the "representation object" (or "control block"). All of the shared_ptrs are + ; counted as a single owner. That is, _Weaks is initialized to 1, and when + ; _Uses falls to 0, _Weaks is decremented. This avoids incrementing and decrementing + ; _Weaks every time that a shared_ptr gains or loses ownership. Therefore, + ; _Weaks - 1 is the weak reference count, the number of weak_ptrs that are observing + ; the shared object. + ) + ) + + children ( + #if ($e._Ptr == 0) ( + ; We make empty shared_ptrs (and shared_ptrs that own + ; the null pointer) appear to have no children. + #array(expr: 0, size: 0) + ) #else ( + #( + ; We make shared_ptr appear to have two children: + + ; Its stored pointer, with a fake name of [ptr]. + #([ptr] : $e._Ptr), + + ; Its deleter and allocator, which may be default or custom. + #([deleter and allocator] : *$e._Rep) + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::tr1::weak_ptr from +;------------------------------------------------------------------------------ +std::tr1::weak_ptr<*>{ + preview ( + #if ($e._Ptr == 0) ( + "empty" + ) #elif ($e._Rep->_Uses == 0) ( + ; weak_ptr is just like shared_ptr, except that a weak_ptr can be expired. + #( + "expired [", + *$e._Rep, + "]" + ) + ) #else ( + #( + "weak_ptr ", + *$e._Ptr, + " [", + $e._Rep->_Uses, + #if ($e._Rep->_Uses == 1) (" strong ref") #else (" strong refs"), + #if ($e._Rep->_Weaks - 1 > 0) ( + #( + ", ", + $e._Rep->_Weaks - 1, + #if ($e._Rep->_Weaks - 1 == 1) (" weak ref") #else (" weak refs") + ) + ), + "] [", + *$e._Rep, + "]" + ) + ) + ) + + children ( + #if ($e._Ptr == 0) ( + #array(expr: 0, size: 0) + ) #elif ($e._Rep->_Uses == 0) ( + ; When a weak_ptr is expired, we show its deleter and allocator. + ; The deleter has already been used, but the control block has not yet been deallocated. + #([deleter and allocator] : *$e._Rep) + ) #else ( + #( + #([ptr] : $e._Ptr), + #([deleter and allocator] : *$e._Rep) + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::tr1::mem_fn() from +;------------------------------------------------------------------------------ +; Note that when mem_fn() is given a data member pointer, it returns a _Call_wrapper<_Callable_pmd<*> > . +; Data member pointers themselves don't have useful previews, so we don't attempt to visualize this. +; When mem_fn() is given a member function pointer, it returns a _Mem_fn[N], which we can visualize. +std::tr1::_Mem_fn1<*>|std::tr1::_Mem_fn2<*>|std::tr1::_Mem_fn3<*>|std::tr1::_Mem_fn4<*>|std::tr1::_Mem_fn5<*>|std::tr1::_Mem_fn6<*>|std::tr1::_Mem_fn7<*>|std::tr1::_Mem_fn8<*>|std::tr1::_Mem_fn9<*>|std::tr1::_Mem_fn10<*>{ + preview ( + ; We preview the functor returned by mem_fn() with "mem_fn()". + #( + "mem_fn(", + $e._Callee._Object, + ")" + ) + ) + + children ( + ; Member function pointers have no children. + #array(expr: 0, size: 0) + ) +} + +;------------------------------------------------------------------------------ +; std::tr1::bind() from +;------------------------------------------------------------------------------ +; bind() placeholders are previewed with their names. +; They have no state, so they have no children. +std::tr1::_Ph<1>{ + preview ( "_1" ) + children ( #array(expr: 0, size: 0) ) +} +std::tr1::_Ph<2>{ + preview ( "_2" ) + children ( #array(expr: 0, size: 0) ) +} +std::tr1::_Ph<3>{ + preview ( "_3" ) + children ( #array(expr: 0, size: 0) ) +} +std::tr1::_Ph<4>{ + preview ( "_4" ) + children ( #array(expr: 0, size: 0) ) +} +std::tr1::_Ph<5>{ + preview ( "_5" ) + children ( #array(expr: 0, size: 0) ) +} +std::tr1::_Ph<6>{ + preview ( "_6" ) + children ( #array(expr: 0, size: 0) ) +} +std::tr1::_Ph<7>{ + preview ( "_7" ) + children ( #array(expr: 0, size: 0) ) +} +std::tr1::_Ph<8>{ + preview ( "_8" ) + children ( #array(expr: 0, size: 0) ) +} +std::tr1::_Ph<9>{ + preview ( "_9" ) + children ( #array(expr: 0, size: 0) ) +} +std::tr1::_Ph<10>{ + preview ( "_10" ) + children ( #array(expr: 0, size: 0) ) +} + +; The functor returned by bind(f, t1, t2) is previewed with "bind(f, t1, t2)". +; It has children with the fake names of [f], [t1], [t2], etc. +std::tr1::_Bind<*,*,std::tr1::_Bind0<*> >|std::tr1::_Bind_fty<*,*,std::tr1::_Bind0<*> >{ + preview ( + #( + "bind(", $e._Bx._Callee._Object, + ")" + ) + ) + + children ( + #( + #([f] : $e._Bx._Callee._Object) + ) + ) +} +std::tr1::_Bind<*,*,std::tr1::_Bind1<*> >|std::tr1::_Bind_fty<*,*,std::tr1::_Bind1<*> >{ + preview ( + #( + "bind(", $e._Bx._Callee._Object, + ", ", $e._Bx._Vx0, + ")" + ) + ) + + children ( + #( + #([f] : $e._Bx._Callee._Object), + #([t1] : $e._Bx._Vx0) + ) + ) +} +std::tr1::_Bind<*,*,std::tr1::_Bind2<*> >|std::tr1::_Bind_fty<*,*,std::tr1::_Bind2<*> >{ + preview ( + #( + "bind(", $e._Bx._Callee._Object, + ", ", $e._Bx._Vx0, + ", ", $e._Bx._Vx1, + ")" + ) + ) + + children ( + #( + #([f] : $e._Bx._Callee._Object), + #([t1] : $e._Bx._Vx0), + #([t2] : $e._Bx._Vx1) + ) + ) +} +std::tr1::_Bind<*,*,std::tr1::_Bind3<*> >|std::tr1::_Bind_fty<*,*,std::tr1::_Bind3<*> >{ + preview ( + #( + "bind(", $e._Bx._Callee._Object, + ", ", $e._Bx._Vx0, + ", ", $e._Bx._Vx1, + ", ", $e._Bx._Vx2, + ")" + ) + ) + + children ( + #( + #([f] : $e._Bx._Callee._Object), + #([t1] : $e._Bx._Vx0), + #([t2] : $e._Bx._Vx1), + #([t3] : $e._Bx._Vx2) + ) + ) +} +std::tr1::_Bind<*,*,std::tr1::_Bind4<*> >|std::tr1::_Bind_fty<*,*,std::tr1::_Bind4<*> >{ + preview ( + #( + "bind(", $e._Bx._Callee._Object, + ", ", $e._Bx._Vx0, + ", ", $e._Bx._Vx1, + ", ", $e._Bx._Vx2, + ", ", $e._Bx._Vx3, + ")" + ) + ) + + children ( + #( + #([f] : $e._Bx._Callee._Object), + #([t1] : $e._Bx._Vx0), + #([t2] : $e._Bx._Vx1), + #([t3] : $e._Bx._Vx2), + #([t4] : $e._Bx._Vx3) + ) + ) +} +std::tr1::_Bind<*,*,std::tr1::_Bind5<*> >|std::tr1::_Bind_fty<*,*,std::tr1::_Bind5<*> >{ + preview ( + #( + "bind(", $e._Bx._Callee._Object, + ", ", $e._Bx._Vx0, + ", ", $e._Bx._Vx1, + ", ", $e._Bx._Vx2, + ", ", $e._Bx._Vx3, + ", ", $e._Bx._Vx4, + ")" + ) + ) + + children ( + #( + #([f] : $e._Bx._Callee._Object), + #([t1] : $e._Bx._Vx0), + #([t2] : $e._Bx._Vx1), + #([t3] : $e._Bx._Vx2), + #([t4] : $e._Bx._Vx3), + #([t5] : $e._Bx._Vx4) + ) + ) +} +std::tr1::_Bind<*,*,std::tr1::_Bind6<*> >|std::tr1::_Bind_fty<*,*,std::tr1::_Bind6<*> >{ + preview ( + #( + "bind(", $e._Bx._Callee._Object, + ", ", $e._Bx._Vx0, + ", ", $e._Bx._Vx1, + ", ", $e._Bx._Vx2, + ", ", $e._Bx._Vx3, + ", ", $e._Bx._Vx4, + ", ", $e._Bx._Vx5, + ")" + ) + ) + + children ( + #( + #([f] : $e._Bx._Callee._Object), + #([t1] : $e._Bx._Vx0), + #([t2] : $e._Bx._Vx1), + #([t3] : $e._Bx._Vx2), + #([t4] : $e._Bx._Vx3), + #([t5] : $e._Bx._Vx4), + #([t6] : $e._Bx._Vx5) + ) + ) +} +std::tr1::_Bind<*,*,std::tr1::_Bind7<*> >|std::tr1::_Bind_fty<*,*,std::tr1::_Bind7<*> >{ + preview ( + #( + "bind(", $e._Bx._Callee._Object, + ", ", $e._Bx._Vx0, + ", ", $e._Bx._Vx1, + ", ", $e._Bx._Vx2, + ", ", $e._Bx._Vx3, + ", ", $e._Bx._Vx4, + ", ", $e._Bx._Vx5, + ", ", $e._Bx._Vx6, + ")" + ) + ) + + children ( + #( + #([f] : $e._Bx._Callee._Object), + #([t1] : $e._Bx._Vx0), + #([t2] : $e._Bx._Vx1), + #([t3] : $e._Bx._Vx2), + #([t4] : $e._Bx._Vx3), + #([t5] : $e._Bx._Vx4), + #([t6] : $e._Bx._Vx5), + #([t7] : $e._Bx._Vx6) + ) + ) +} +std::tr1::_Bind<*,*,std::tr1::_Bind8<*> >|std::tr1::_Bind_fty<*,*,std::tr1::_Bind8<*> >{ + preview ( + #( + "bind(", $e._Bx._Callee._Object, + ", ", $e._Bx._Vx0, + ", ", $e._Bx._Vx1, + ", ", $e._Bx._Vx2, + ", ", $e._Bx._Vx3, + ", ", $e._Bx._Vx4, + ", ", $e._Bx._Vx5, + ", ", $e._Bx._Vx6, + ", ", $e._Bx._Vx7, + ")" + ) + ) + + children ( + #( + #([f] : $e._Bx._Callee._Object), + #([t1] : $e._Bx._Vx0), + #([t2] : $e._Bx._Vx1), + #([t3] : $e._Bx._Vx2), + #([t4] : $e._Bx._Vx3), + #([t5] : $e._Bx._Vx4), + #([t6] : $e._Bx._Vx5), + #([t7] : $e._Bx._Vx6), + #([t8] : $e._Bx._Vx7) + ) + ) +} +std::tr1::_Bind<*,*,std::tr1::_Bind9<*> >|std::tr1::_Bind_fty<*,*,std::tr1::_Bind9<*> >{ + preview ( + #( + "bind(", $e._Bx._Callee._Object, + ", ", $e._Bx._Vx0, + ", ", $e._Bx._Vx1, + ", ", $e._Bx._Vx2, + ", ", $e._Bx._Vx3, + ", ", $e._Bx._Vx4, + ", ", $e._Bx._Vx5, + ", ", $e._Bx._Vx6, + ", ", $e._Bx._Vx7, + ", ", $e._Bx._Vx8, + ")" + ) + ) + + children ( + #( + #([f] : $e._Bx._Callee._Object), + #([t1] : $e._Bx._Vx0), + #([t2] : $e._Bx._Vx1), + #([t3] : $e._Bx._Vx2), + #([t4] : $e._Bx._Vx3), + #([t5] : $e._Bx._Vx4), + #([t6] : $e._Bx._Vx5), + #([t7] : $e._Bx._Vx6), + #([t8] : $e._Bx._Vx7), + #([t9] : $e._Bx._Vx8) + ) + ) +} +std::tr1::_Bind<*,*,std::tr1::_Bind10<*> >|std::tr1::_Bind_fty<*,*,std::tr1::_Bind10<*> >{ + preview ( + #( + "bind(", $e._Bx._Callee._Object, + ", ", $e._Bx._Vx0, + ", ", $e._Bx._Vx1, + ", ", $e._Bx._Vx2, + ", ", $e._Bx._Vx3, + ", ", $e._Bx._Vx4, + ", ", $e._Bx._Vx5, + ", ", $e._Bx._Vx6, + ", ", $e._Bx._Vx7, + ", ", $e._Bx._Vx8, + ", ", $e._Bx._Vx9, + ")" + ) + ) + + children ( + #( + #([f] : $e._Bx._Callee._Object), + #([t1] : $e._Bx._Vx0), + #([t2] : $e._Bx._Vx1), + #([t3] : $e._Bx._Vx2), + #([t4] : $e._Bx._Vx3), + #([t5] : $e._Bx._Vx4), + #([t6] : $e._Bx._Vx5), + #([t7] : $e._Bx._Vx6), + #([t8] : $e._Bx._Vx7), + #([t9] : $e._Bx._Vx8), + #([t10] : $e._Bx._Vx9) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::tr1::function from +;------------------------------------------------------------------------------ +std::tr1::_Impl_no_alloc0<*>|std::tr1::_Impl_no_alloc1<*>|std::tr1::_Impl_no_alloc2<*>|std::tr1::_Impl_no_alloc3<*>|std::tr1::_Impl_no_alloc4<*>|std::tr1::_Impl_no_alloc5<*>|std::tr1::_Impl_no_alloc6<*>|std::tr1::_Impl_no_alloc7<*>|std::tr1::_Impl_no_alloc8<*>|std::tr1::_Impl_no_alloc9<*>|std::tr1::_Impl_no_alloc10<*>{ + preview ( $e._Callee._Object ) + children ( #([functor] : $e._Callee._Object) ) +} +std::tr1::_Impl0<*>|std::tr1::_Impl1<*>|std::tr1::_Impl2<*>|std::tr1::_Impl3<*>|std::tr1::_Impl4<*>|std::tr1::_Impl5<*>|std::tr1::_Impl6<*>|std::tr1::_Impl7<*>|std::tr1::_Impl8<*>|std::tr1::_Impl9<*>|std::tr1::_Impl10<*>{ + preview ( $e._Callee._Object ) + children ( + #( + #([functor] : $e._Callee._Object), + #([allocator] : $e._Myal) + ) + ) +} +std::tr1::function<*>{ + preview ( + #if ($e._Impl == 0) ( + ; Detecting empty functions is trivial. + "empty" + ) #else ( + *$e._Impl + ) + ) + + children ( + #if ($e._Impl == 0) ( + ; We make empty functions appear to have no children. + #array(expr: 0, size: 0) + ) #else ( + #([functor and allocator] : *$e._Impl) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::tr1::tuple from +;------------------------------------------------------------------------------ +; tuple is visualized like pair, except that we have to give fake names to tuple's children. +std::tr1::tuple{ + preview ( + "()" + ) + + children ( + #array(expr: 0, size: 0) + ) +} +std::tr1::tuple<*,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil>{ + preview ( + #( + "(", $e._Impl._Value, + ")" + ) + ) + + children ( + #( + [0] : $e._Impl._Value + ) + ) +} +std::tr1::tuple<*,*,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil>{ + preview ( + #( + "(", $e._Impl._Value, + ", ", $e._Impl._Tail._Value, + ")" + ) + ) + + children ( + #( + [0] : $e._Impl._Value, + [1] : $e._Impl._Tail._Value + ) + ) +} +std::tr1::tuple<*,*,*,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil>{ + preview ( + #( + "(", $e._Impl._Value, + ", ", $e._Impl._Tail._Value, + ", ", $e._Impl._Tail._Tail._Value, + ")" + ) + ) + + children ( + #( + [0] : $e._Impl._Value, + [1] : $e._Impl._Tail._Value, + [2] : $e._Impl._Tail._Tail._Value + ) + ) +} +std::tr1::tuple<*,*,*,*,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil>{ + preview ( + #( + "(", $e._Impl._Value, + ", ", $e._Impl._Tail._Value, + ", ", $e._Impl._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Value, + ")" + ) + ) + + children ( + #( + [0] : $e._Impl._Value, + [1] : $e._Impl._Tail._Value, + [2] : $e._Impl._Tail._Tail._Value, + [3] : $e._Impl._Tail._Tail._Tail._Value + ) + ) +} +std::tr1::tuple<*,*,*,*,*,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil>{ + preview ( + #( + "(", $e._Impl._Value, + ", ", $e._Impl._Tail._Value, + ", ", $e._Impl._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Value, + ")" + ) + ) + + children ( + #( + [0] : $e._Impl._Value, + [1] : $e._Impl._Tail._Value, + [2] : $e._Impl._Tail._Tail._Value, + [3] : $e._Impl._Tail._Tail._Tail._Value, + [4] : $e._Impl._Tail._Tail._Tail._Tail._Value + ) + ) +} +std::tr1::tuple<*,*,*,*,*,*,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil>{ + preview ( + #( + "(", $e._Impl._Value, + ", ", $e._Impl._Tail._Value, + ", ", $e._Impl._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Tail._Value, + ")" + ) + ) + + children ( + #( + [0] : $e._Impl._Value, + [1] : $e._Impl._Tail._Value, + [2] : $e._Impl._Tail._Tail._Value, + [3] : $e._Impl._Tail._Tail._Tail._Value, + [4] : $e._Impl._Tail._Tail._Tail._Tail._Value, + [5] : $e._Impl._Tail._Tail._Tail._Tail._Tail._Value + ) + ) +} +std::tr1::tuple<*,*,*,*,*,*,*,std::tr1::_Nil,std::tr1::_Nil,std::tr1::_Nil>{ + preview ( + #( + "(", $e._Impl._Value, + ", ", $e._Impl._Tail._Value, + ", ", $e._Impl._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Value, + ")" + ) + ) + + children ( + #( + [0] : $e._Impl._Value, + [1] : $e._Impl._Tail._Value, + [2] : $e._Impl._Tail._Tail._Value, + [3] : $e._Impl._Tail._Tail._Tail._Value, + [4] : $e._Impl._Tail._Tail._Tail._Tail._Value, + [5] : $e._Impl._Tail._Tail._Tail._Tail._Tail._Value, + [6] : $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Value + ) + ) +} +std::tr1::tuple<*,*,*,*,*,*,*,*,std::tr1::_Nil,std::tr1::_Nil>{ + preview ( + #( + "(", $e._Impl._Value, + ", ", $e._Impl._Tail._Value, + ", ", $e._Impl._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Value, + ")" + ) + ) + + children ( + #( + [0] : $e._Impl._Value, + [1] : $e._Impl._Tail._Value, + [2] : $e._Impl._Tail._Tail._Value, + [3] : $e._Impl._Tail._Tail._Tail._Value, + [4] : $e._Impl._Tail._Tail._Tail._Tail._Value, + [5] : $e._Impl._Tail._Tail._Tail._Tail._Tail._Value, + [6] : $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Value, + [7] : $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Value + ) + ) +} +std::tr1::tuple<*,*,*,*,*,*,*,*,*,std::tr1::_Nil>{ + preview ( + #( + "(", $e._Impl._Value, + ", ", $e._Impl._Tail._Value, + ", ", $e._Impl._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Value, + ")" + ) + ) + + children ( + #( + [0] : $e._Impl._Value, + [1] : $e._Impl._Tail._Value, + [2] : $e._Impl._Tail._Tail._Value, + [3] : $e._Impl._Tail._Tail._Tail._Value, + [4] : $e._Impl._Tail._Tail._Tail._Tail._Value, + [5] : $e._Impl._Tail._Tail._Tail._Tail._Tail._Value, + [6] : $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Value, + [7] : $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Value, + [8] : $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Value + ) + ) +} +std::tr1::tuple<*,*,*,*,*,*,*,*,*,*>{ + preview ( + #( + "(", $e._Impl._Value, + ", ", $e._Impl._Tail._Value, + ", ", $e._Impl._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Value, + ", ", $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Value, + ")" + ) + ) + + children ( + #( + [0] : $e._Impl._Value, + [1] : $e._Impl._Tail._Value, + [2] : $e._Impl._Tail._Tail._Value, + [3] : $e._Impl._Tail._Tail._Tail._Value, + [4] : $e._Impl._Tail._Tail._Tail._Tail._Value, + [5] : $e._Impl._Tail._Tail._Tail._Tail._Tail._Value, + [6] : $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Value, + [7] : $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Value, + [8] : $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Value, + [9] : $e._Impl._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Tail._Value + ) + ) +} + +;------------------------------------------------------------------------------ +; std::tr1::array from +;------------------------------------------------------------------------------ +std::tr1::array<*>{ + preview ( + ; An actual array is previewed with its address. + ; array is previewed like vector. + #( + "[", + $e._EEN_SIZE, + "](", + #array(expr: $e._Elems[$i], size: $e._EEN_SIZE), + ")" + ) + ) + + children ( + ; Just like an actual array. + #array(expr: $e._Elems[$i], size: $e._EEN_SIZE) + ) +} +std::_Array_iterator<*>|std::_Array_const_iterator<*>{ + preview ( + #if ($e._EEN_IDL == 0) ( + *$e._Ptr + ) #else ( + #if ($e._Idx == $e._EEN_SIZE) ( + ; array iterators are represented by _Ptr + _Idx, + ; and they know how large their parent arrays are. Therefore, detecting + ; end iterators is trivial. + "end" + ) #else ( + ; Like vector iterators, array iterators are previewed with what they point to. + $e._Ptr[$e._Idx] + ) + ) + ) + + children ( + #if ($e._EEN_IDL == 0) ( + #([ptr] : $e._Ptr) + ) #else ( + #if ($e._Idx == $e._EEN_SIZE) ( + ; We make end iterators appear to have no children. + #array(expr: 0, size: 0) + ) #else ( + ; An array iterator is conceptually a pointer, so we make it appear to store one. + #([ptr] : $e._Ptr + $e._Idx) + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; stdext::hash_map from +; stdext::hash_multimap from +; stdext::hash_set from +; stdext::hash_multiset from +;------------------------------------------------------------------------------ +stdext::hash_map<*>|stdext::hash_multimap<*>|stdext::hash_set<*>|stdext::hash_multiset<*>{ + preview ( + #( + "[", + $e._List._Mysize, + "](", + #list( + head: $e._List._Myhead->_Next, + size: $e._List._Mysize, + next: _Next + ) : $e._Myval, + ")" + ) + ) + + children ( + #list( + head: $e._List._Myhead->_Next, + size: $e._List._Mysize, + next: _Next + ) : $e._Myval + ) +} + +;------------------------------------------------------------------------------ +; std::tr1::unordered_map from +; std::tr1::unordered_multimap from +; std::tr1::unordered_set from +; std::tr1::unordered_multiset from +;------------------------------------------------------------------------------ +std::hash<*>{ + preview ( "hash" ) + children ( #array(expr: 0, size: 0) ) +} +std::tr1::unordered_map<*>|std::tr1::unordered_multimap<*>|std::tr1::unordered_set<*>|std::tr1::unordered_multiset<*>{ + preview ( + #( + "[", + $e._List._Mysize, + "](", + #list( + head: $e._List._Myhead->_Next, + size: $e._List._Mysize, + next: _Next + ) : $e._Myval, + ")" + ) + ) + + children ( + #( + #([hash] : $e.comp._Hashobj), + #([equal] : $e.comp._Keyeqobj), + #list( + head: $e._List._Myhead->_Next, + size: $e._List._Mysize, + next: _Next + ) : $e._Myval + ) + ) +} + +;------------------------------------------------------------------------------ +; std::tr1::basic_regex from +;------------------------------------------------------------------------------ +std::tr1::basic_regex<*>{ + preview ( + #if ($e._Rep == 0) ( + ; Default construction creates an empty basic_regex. + "empty" + ) #elif ($e._EEN_VIS == 1) ( + ; By default, _ENHANCED_REGEX_VISUALIZER is defined to be 1 in debug and 0 in ship. + ; When it is 1, basic_regex stores the string from which it was constructed. + ; When it is 0, basic_regex stores only the resulting finite state machine. + $e._Visualization + ) #else ( + ; basic_regex contains many static const flags, which would be shown in the preview by default. + ; Its actual members are _Rep and _Traits. _Rep holds the finite state machine, so we + ; use it to preview basic_regex. (It does contain some human-readable information.) + *$e._Rep + ) + ) + + children ( + #if ($e._Rep == 0) ( + ; We make empty basic_regexes appear to have no children. + #array(expr: 0, size: 0) + ) #elif ($e._EEN_VIS == 1) ( + ; We want to hide those static const flags. + ; We also want to give _Visualization a fake name. + #( + #([str] : $e._Visualization), + #(_Rep : $e._Rep), + #(_Traits : $e._Traits) + ) + ) #else ( + ; We want to hide those static const flags. + #( + _Rep : $e._Rep, + _Traits : $e._Traits + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::tr1::sub_match from +;------------------------------------------------------------------------------ +std::tr1::sub_match|std::tr1::sub_match|std::tr1::sub_match|std::tr1::sub_match|std::tr1::sub_match|std::tr1::sub_match{ + preview ( + ; It would be nice if we could preview sub_match with its str(). + ; However, visualizers cannot handle strings represented by pointer pairs. + ; Therefore, our preview contains more limited information. + #if ($e.matched) ( + ; If this sub_match participated in a match, + ; we preview it with its length(). + $e.second - $e.first + ) #else ( + ; Otherwise, we preview it with its matched bool (i.e. "false"). + ; (Why not length() (i.e. "0")? It's meaningful to have + ; matched == true and length() == 0. + "false" + ) + ) + + children ( + #( + ; sub_match's three data members are public, but we list them here + ; (a) to display matched before first and second, and + ; (b) to gloss over the fact that sub_match derives from std::pair. + #(matched : $e.matched), + #(first : $e.first), + #(second : $e.second) + ) + ) +} +std::tr1::sub_match >|std::tr1::sub_match >{ + preview ( + #if ($e.matched) ( + ; We visualize ssub_match and wssub_match just like csub_match and wcsub_match, + ; except that when determining the length(), we can't subtract iterators. + ; We have to subtract their stored pointers. + $e.second._Ptr - $e.first._Ptr + ) #else ( + "false" + ) + ) + + children ( + #( + #(matched : $e.matched), + #(first : $e.first), + #(second : $e.second) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::tr1::match_results from +;------------------------------------------------------------------------------ +std::tr1::match_results<*>{ + preview ( + ; A match_results object is empty iff its vector _Matches is empty. + #if ($e._Matches._Myfirst == $e._Matches._Mylast) ( + "empty" + ) #else ( + ; We preview a non-empty match_results object with its vector. + $e._Matches + ) + ) + + children ( + #if ($e._Matches._Myfirst == $e._Matches._Mylast) ( + ; We make empty match_results appear to have no children. + #array(expr: 0, size: 0) + ) #else ( + ; As match_results has operator[](), prefix(), and suffix() member functions, + ; we make it appear to directly contain [0], [1], [2], etc. elements, + ; as well as [prefix] and [suffix] elements. + #( + #array(expr: $e._Matches._Myfirst[$i], size: $e._Matches._Mylast - $e._Matches._Myfirst), + #([prefix] : $e._Prefix), + #([suffix] : $e._Suffix) + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::tr1::regex_iterator from +;------------------------------------------------------------------------------ +std::tr1::regex_iterator<*>{ + preview ( + #if ($e._MyRe == 0) ( + ; We represent end-of-sequence regex_iterators with null regex pointers. + "end" + ) #else ( + ; Dereferenceable regex_iterators return match_results when dereferenced, + ; so we'll preview them with that. + $e._MyVal + ) + ) + + children ( + #if ($e._MyRe == 0) ( + ; We make end-of-sequence regex_iterators appear to have no children. + #array(expr: 0, size: 0) + ) #else ( + ; For ease of understanding, we make dereferenceable regex_iterators + ; appear to have data members with the "for exposition only" names from TR1. + #( + #([begin] : $e._Begin), + #([end] : $e._End), + #([pregex] : $e._MyRe), + #([flags] : $e._Flags), + #([match] : $e._MyVal) + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::tr1::regex_token_iterator from +;------------------------------------------------------------------------------ +std::tr1::regex_token_iterator<*>{ + preview ( + #if ($e._Res == 0) ( + ; We represent end-of-sequence regex_token_iterators with null result pointers. + "end" + ) #else ( + ; Dereferenceable regex_token_iterators return *result when dereferenced, + ; so we'll preview them with that. + *$e._Res + ) + ) + + children ( + #if ($e._Res == 0) ( + ; We make end-of-sequence regex_token_iterators appear to have no children. + #array(expr: 0, size: 0) + ) #else ( + ; For ease of understanding, we make dereferenceable regex_token_iterators + ; appear to have data members with the "for exposition only" names from TR1. + #( + #([position] : $e._Pos), + #([result] : $e._Res), + #([suffix] : $e._Suffix), + #([N] : $e._Cur), + #([subs] : $e._Subs) + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::identity, etc. from +;------------------------------------------------------------------------------ +std::identity<*>{ + preview ( "identity" ) + children ( #array(expr: 0, size: 0) ) +} +std::bit_and<*>{ + preview ( "bit_and" ) + children ( #array(expr: 0, size: 0) ) +} +std::bit_or<*>{ + preview ( "bit_or" ) + children ( #array(expr: 0, size: 0) ) +} +std::bit_xor<*>{ + preview ( "bit_xor" ) + children ( #array(expr: 0, size: 0) ) +} + +;------------------------------------------------------------------------------ +; std::unique_ptr from +;------------------------------------------------------------------------------ +std::unique_ptr<*>{ + preview ( + #if ($e._Myptr == 0) ( + "empty" + ) #else ( + #( + "unique_ptr ", + *$e._Myptr + ) + ) + ) + + children ( + #if ($e._Myptr == 0) ( + #array(expr: 0, size: 0) + ) #else ( + #([ptr] : $e._Myptr) + ) + ) +} + +;------------------------------------------------------------------------------ +; std::forward_list from +;------------------------------------------------------------------------------ +std::forward_list<*>{ + preview ( + #( + "(", + #list( + head: $e._Myhead, + next: _Next + ) : $e._Myval, + ")" + ) + ) + + children ( + #list( + head: $e._Myhead, + next: _Next + ) : $e._Myval + ) +} +std::_Flist_iterator<*>|std::_Flist_const_iterator<*>{ + preview ( + #if ($e._Ptr == 0) ( + "end" + ) #else ( + $e._Ptr->_Myval + ) + ) + + children ( + #if ($e._Ptr == 0) ( + #array(expr: 0, size: 0) + ) #else ( + #([ptr] : &$e._Ptr->_Myval) + ) + ) +} + + +;------------------------------------------------------------------------------ +; PROPVARIANT +;------------------------------------------------------------------------------ +; Visualizers for VT_VECTOR C arrays +tagCAC|tagCAUB|tagCAI|tagCAUI|tagCAL|tagCAUL|tagCAFLT|tagCADBL|tagCACY|tagCADATE|tagCABSTR|tagCABSTRBLOB|tagCABOOL|tagCASCODE|tagCAPROPVARIANT|tagCAH|tagCAUH|tagCALPSTR|tagCALPWSTR|tagCAFILETIME|tagCACLIPDATA|tagCACLSID{ + preview( + #( + "[", $e.cElems , "](", + #array + ( + expr : ($e.pElems)[$i], + size : $e.cElems + ), + ")" + ) + ) + children + ( + #array + ( + expr : ($e.pElems)[$i], + size : $e.cElems + ) + ) +} +; Visualizers for SAFE ARRAY +tagSAFEARRAY|SAFEARRAY{ + preview( + #if ($e.fFeatures & 0x0080) ; FADF_HAVEVARTYPE + ( + ; Switch on the variant type field - which is stored 4 bytes + ; before the beginning of the SAFEARRAY type + #switch( ((unsigned *)&($e))[-1] ) + #case 0x2 ; VT_I2 | VT_ARRAY + ( + #( + "safearray of I2 = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((signed short *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x3 ; VT_I4 | VT_ARRAY + ( + #( + "safearray of I4 = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((signed int *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x4 ; VT_R4 | VT_ARRAY + ( + #( + "safearray of R4 = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((float *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x5 ; VT_R8 | VT_ARRAY + ( + #( + "safearray of R8 = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((double *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x6 ; VT_CY | VT_ARRAY + ( + #( + "safearray of CY = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((CY *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x7 ; VT_DATE | VT_ARRAY + ( + #( + "safearray of DATE = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((DATE *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x8 ; VT_BSTR | VT_ARRAY + ( + #( + "safearray of BSTR = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((wchar_t **)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0xa ; VT_ERROR | VT_ARRAY + ( + #( + "safearray of ERROR = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((long *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0xb ; VT_BOOL | VT_ARRAY + ( + #( + "safearray of BOOL = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((short *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0xc ; VT_VARIANT | VT_ARRAY + ( + #( + "safearray of VARIANT = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((tagVARIANT *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x10 ; VT_I1 | VT_ARRAY + ( + #( + "safearray of I1 = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((signed char *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x11 ; VT_UI1 | VT_ARRAY + ( + #( + "safearray of UI1 = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((unsigned char *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x12 ; VT_UI2 | VT_ARRAY + ( + #( + "safearray of UI2 = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((unsigned short *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x13 ; VT_UI4 | VT_ARRAY + ( + #( + "safearray of UI4 = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((unsigned int *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x14 ; VT_I8 | VT_ARRAY + ( + #( + "safearray of I8 = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((signed __int64 *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x15 ; VT_UI8 | VT_ARRAY + ( + #( + "safearray of UI8 = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((unsigned __int64 *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x16 ; VT_INT | VT_ARRAY + ( + #( + "safearray of INT = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((int *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x17 ; VT_UINT | VT_ARRAY + ( + #( + "safearray of UINT = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((unsigned *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x1e ; VT_LPSTR | VT_ARRAY + ( + #( + "safearray of LPSTR = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((char **)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x1f ; VT_LPWSTR | VT_ARRAY + ( + #( + "safearray of LPWSTR = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((wchar_t **)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x40 ; VT_FILETIME | VT_ARRAY + ( + #( + "safearray of FILETIME = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((FILETIME *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x47 ; VT_CLIPDATA | VT_ARRAY + ( + #( + "safearray of CLIPDATA = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((CLIPDATA *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + #case 0x48 ; VT_CLSID | VT_ARRAY + ( + #( + "safearray of CLSID = [", + ; output the rank array + #array( expr: $e.rgsabound[$i].cElements, size: $e.cDims), + "](", + ; output the data elements + #array( + expr: ((CLSID *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ), + ")" + ) + ) + ) + #elif ($e.fFeatures & 0x0100) ; FADF_BSTR + ( + #("safearray of BSTR = ",#array(expr: $e.rgsabound[$i].cElements, size: $e.cDims) : #("[",$e,"]"), "(", #array(expr: ((wchar_t * *)$e.pvData)[$i], size: $e.rgsabound[$r].cElements, rank: $e.cDims, base: $e.rgsabound[$r].lLbound ), ")") + ) + #elif ($e.fFeatures & 0x0200) ; FADF_UNKNOWN + ( + #("safearray of IUnknown* = [",#array(expr: $e.rgsabound[$i].cElements, size: $e.cDims), "](", #array(expr: ((IUnknown * *)$e.pvData)[$i], size: $e.rgsabound[$r].cElements, rank: $e.cDims, base: $e.rgsabound[$r].lLbound ), ")") + ) + #elif ($e.fFeatures & 0x0400) ; FADF_DISPATCH + ( + #("safearray of IDispatch* = [",#array(expr: $e.rgsabound[$i].cElements, size: $e.cDims), "](", #array(expr: ((IDispatch * *)$e.pvData)[$i], size: $e.rgsabound[$r].cElements, rank: $e.cDims, base: $e.rgsabound[$r].lLbound ), ")") + ) + #elif ($e.fFeatures & 0x0800) ; FADF_VARIANT + ( + #("safearray of VARIANT = ",#array(expr: $e.rgsabound[$i].cElements, size: $e.cDims) : #("[",$e,"]"), "(", #array(expr: ((tagVARIANT *)$e.pvData)[$i], size: $e.rgsabound[$r].cElements, rank: $e.cDims, base: $e.rgsabound[$r].lLbound ), ")") + ) + ) + children + ( + #( ;[actual members]: [$e,!], + #if ($e.fFeatures & 0x0080) ; FADF_HAVEVARTYPE + ( + #switch( ((unsigned *)&($e))[-1] ) ; for some reason the VT field is before the SAFEARRAY struct + #case 2 ; VT_I2|VT_ARRAY + ( + #array( + expr: ((signed short *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 3 ; VT_I4|VT_ARRAY + ( + #array( + expr: ((signed int *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 4 ; VT_R4|VT_ARRAY + ( + #array( + expr: ((float *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 5 ; VT_R8|VT_ARRAY + ( + #array( + expr: ((double *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 0x10 ; VT_I1|VT_ARRAY + ( + #array( + expr: ((signed char *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 0x11 ; VT_UI1|VT_ARRAY + ( + #array( + expr: ((unsigned char *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 0x12 ; VT_UI2|VT_ARRAY + ( + #array( + expr: ((unsigned short *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 0x13 ; VT_UI4|VT_ARRAY + ( + #array( + expr: ((unsigned int *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 0x14 ; VT_I8|VT_ARRAY + ( + #array( + expr: ((signed __int64 *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 0x15 ; VT_UI8|VT_ARRAY + ( + #array( + expr: ((unsigned __int64 *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 0x1e ; VT_LPSTR|VT_ARRAY + ( + #array( + expr: ((char * *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 0x1f ; VT_LPWSTR|VT_ARRAY + ( + #array( + expr: ((wchar_t **)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 0xc ; VT_VARIANT|VT_ARRAY + ( + #array( + expr: ((tagVARIANT *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 0xb ; VT_BOOL|VT_ARRAY + ( + #array( + expr: ((short *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 0xa ; VT_ERROR|VT_ARRAY + ( + #array( + expr: ((long *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 6 ; VT_CY|VT_ARRAY + ( + #array( + expr: ((CY *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 7 ; VT_DATE|VT_ARRAY + ( + #array( + expr: ((DATE *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 0x40 ; VT_FILETIME|VT_ARRAY + ( + #array( + expr: ((FILETIME *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 0x48 ; VT_CLSID|VT_ARRAY + ( + #array( + expr: ((CLSID *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 0x47 ; VT_CF|VT_ARRAY + ( + #array( + expr: ((CLIPDATA *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 8 ; VT_BSTR|VT_ARRAY + ( + #array( + expr: ((wchar_t * *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 0x16 ; VT_INT|VT_ARRAY + ( + #array( + expr: ((int *)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #case 0x17 ; VT_UINT|VT_ARRAY + ( + #array( + expr: ((unsigned int*)$e.pvData)[$i], + size: $e.rgsabound[$r].cElements, + rank: $e.cDims, + base: $e.rgsabound[$r].lLbound + ) + ) + #default + ( + #([actual members]: [$e,!]) + ) + #except + ( + #([actual members]: [$e,!]) + ) + ) + #elif ($e.fFeatures & 0x0100) ; FADF_BSTR + ( + #array(expr: ((wchar_t * *)$e.pvData)[$i], size: $e.rgsabound[$r].cElements, rank: $e.cDims, base: $e.rgsabound[$r].lLbound ) + ) + #elif ($e.fFeatures & 0x0200) ; FADF_UNKNOWN + ( + #array(expr: ((IUnknown * *)$e.pvData)[$i], size: $e.rgsabound[$r].cElements, rank: $e.cDims, base: $e.rgsabound[$r].lLbound ) + ) + #elif ($e.fFeatures & 0x0400) ; FADF_DISPATCH + ( + #array(expr: ((IDispatch * *)$e.pvData)[$i], size: $e.rgsabound[$r].cElements, rank: $e.cDims, base: $e.rgsabound[$r].lLbound ) + ) + #elif ($e.fFeatures & 0x0800) ; FADF_VARIANT + ( + #array(expr: ((tagVARIANT *)$e.pvData)[$i], size: $e.rgsabound[$r].cElements, rank: $e.cDims, base: $e.rgsabound[$r].lLbound ) + ) + ) + ) +} +tagPROPVARIANT|tagVARIANT|PROPVARIANT|VARIANT{ + preview( + #switch ($e.vt) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Base Types ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + #case 0 ( #("Empty") ) ; VT_EMPTY + #case 1 ( #("NULL") ) ; VT_NULL + #case 2 ( #("I2 = ", $e.iVal) ) ; VT_I2 + #case 3 ( #("I4 = ", $e.lVal) ) ; VT_I4 + #case 4 ( #("R4 = ", $e.fltVal) ) ; VT_R4 + #case 5 ( #("R8 = ", $e.dblVal) ) ; VT_R8 + #case 6 ( #("CY = ", $e.cyVal) ) ; VT_CY + #case 7 ( #("DATE = ", $e.date) ) ; VT_DATE + #case 8 ( #("BSTR = ", $e.bstrVal) ) ; VT_BSTR + #case 9 ( #("DISPATCH = ", $e.pdispVal) ) ; VT_DISPATCH + #case 10 ( #("ERROR = ", $e.scode) ) ; VT_ERROR + #case 0xB ( #("BOOL = ", $e.boolVal) ) ; VT_BOOL + #case 0xC ( #("VARIANT ") ) ; VT_VARIANT + #case 0xD ( #("UNKNOWN = ", $e.punkVal) ) ; VT_UNKOWN + #case 0xE ( #("DECIMAL = ", $e.decVal) ) ; VT_DECIMAL + #case 0x10 ( #("I1 = ", $e.cVal) ) ; VT_I1 + #case 0x11 ( #("UI1 = ", $e.bVal) ) ; VT_UI1 + #case 0x12 ( #("UI2 = ", $e.uiVal) ) ; VT_UI2 + #case 0x13 ( #("UI4 = ", $e.ulVal) ) ; VT_UI4 + #case 0x14 ( #("I8 = ", *(__int64*)&$e.dblVal) ) ; VT_I8 + #case 0x15 ( #("UI8 = ", *(unsigned __int64*)&$e.dblVal) ) ; VT_UI8 + #case 0x16 ( #("INT = ", $e.intVal) ) ; VT_INT + #case 0x17 ( #("UINT = ", $e.uintVal) ) ; VT_UINT + #case 0x18 ( #("VOID ") ) ; VT_VOID + #case 0x19 ( #("HRESULT ") ) ; VT_HRESULT + #case 0x1A ( #("PTR ") ) ; VT_PTR + #case 0x1B ( #("SAFEARRAY ") ) ; VT_SAFEARRAY + #case 0x1C ( #("CARRAY ") ) ; VT_CARRAY + #case 0x1D ( #("USERDEFINED ") ) ; VT_USERDEFINED + #case 0x1E ( #("LPSTR = ", $e.pszVal) ) ; VT_LPSTR + #case 0x1F ( #("LPWSTR = ", $e.pwszVal) ) ; VT_LPWSTR + #case 0x24 ( #("RECORD ") ) ; VT_RECORD + #case 0x26 ( #("UINT_PTR ") ) ; VT_UINT_PTR + #case 0x40 ( #("FILETIME = ", $e.filetime) ) ; VT_FILETIME + #case 0x42 ( #("STREAM = ", $e.pStream) ) ; VT_STREAM + #case 0x43 ( #("STORAGE = ", $e.pStorage) ) ; VT_STORAGE + #case 0x44 ( #("STREAMED_OBJECT = ", $e.pStream) ) ; VT_STREAMED_OBJECT + #case 0x45 ( #("STORED_OBJECT = ", $e.pStorage) ) ; VT_STORED_OBJECT + #case 0x46 ( #("BLOB_OBJECT = ", $e.blob ) ) ; VT_BLOB_OBJECT + #case 0x47 ( #("CF = ", $e.pclipdata) ) ; VT_CF + #case 0x48 ( #("CLSID = ", $e.puuid) ) ; VT_CLSID + #case 0x49 ( #("VERSIONED_STREAM = ", $e.pVersionedStream) ) ; VT_VERSIONED_STREAM + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Vector types ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + #case 0x1002 ( #("vector of I2 = ", $e.cai) ) ; VT_I2|VT_VECTOR + #case 0x1003 ( #("vector of I4 = ", $e.cal) ) ; VT_I4|VT_VECTOR + #case 0x1004 ( #("vector of R4 = ", $e.caflt) ) ; VT_R4|VT_VECTOR + #case 0x1005 ( #("vector of R8 = ", $e.cadbl) ) ; VT_R8|VT_VECTOR + #case 0x1010 ( #("vector of I1 = ", $e.cac) ) ; VT_I1|VT_VECTOR + #case 0x1011 ( #("vector of UI1 = ", $e.caub) ) ; VT_UI1|VT_VECTOR + #case 0x1012 ( #("vector of UI2 = ", $e.caui) ) ; VT_UI2|VT_VECTOR + #case 0x1013 ( #("vector of UI4 = ", $e.caul) ) ; VT_UI4|VT_VECTOR + #case 0x1014 ( #("vector of I8 = ", $e.cah) ) ; VT_I8|VT_VECTOR + #case 0x1015 ( #("vector of UI8 = ", $e.cauh) ) ; VT_UI8|VT_VECTOR + #case 0x101E ( #("vector of LPSTR = ", $e.calpstr) ) ; VT_LPSTR|VT_VECTOR + #case 0x101F ( #("vector of LPWSTR = ", $e.calpwstr) ) ; VT_LPWSTR|VT_VECTOR + #case 0x100C ( #("vector of VARIANT ", $e.capropvar) ) ; VT_VARIANT|VT_VECTOR + #case 0x100B ( #("vector of BOOL = ", $e.cabool) ) ; VT_BOOL|VT_VECTOR + #case 0x100A ( #("vector of ERROR = ", $e.cascode) ) ; VT_ERROR|VT_VECTOR + #case 0x1006 ( #("vector of CY = ", $e.cacy) ) ; VT_CY|VT_VECTOR + #case 0x1007 ( #("vector of DATE = ", $e.cadate) ) ; VT_DATE|VT_VECTOR + #case 0x1040 ( #("vector of FILETIME = ", $e.cafiletime) ) ; VT_FILETIME|VT_VECTOR + #case 0x1048 ( #("vector of CLSID = ", $e.cauuid) ) ; VT_CLSID|VT_VECTOR + #case 0x1047 ( #("vector of CF = ", $e.caclipdata) ) ; VT_CF|VT_VECTOR + #case 0x1008 ( #("vector of BSTR = ", $e.cabstr) ) ; VT_BSTR|VT_VECTOR + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Byref Types ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + #case 0x4016 ( #("byref of INT = ", $e.pintVal) ) ; VT_INT|VT_BYREF + #case 0x4017 ( #("byref of UINT = ", $e.puintVal) ) ; VT_UINT|VT_BYREF + #case 0x4002 ( #("byref of I2 = ", $e.piVal) ) ; VT_I2|VT_BYREF + #case 0x4003 ( #("byref of I4 = ", $e.plVal) ) ; VT_I4|VT_BYREF + #case 0x4004 ( #("byref of R4 = ", $e.pfltVal) ) ; VT_R4|VT_BYREF + #case 0x4005 ( #("byref of R8 = ", $e.pdblVal) ) ; VT_R8|VT_BYREF + #case 0x4010 ( #("byref of I1 = ", $e.pcVal) ) ; VT_I1|VT_BYREF + #case 0x4011 ( #("byref of UI1 = ", $e.pbVal) ) ; VT_UI1|VT_BYREF + #case 0x4012 ( #("byref of UI2 = ", $e.puiVal) ) ; VT_UI2|VT_BYREF + #case 0x4013 ( #("byref of UI4 = ", $e.pulVal) ) ; VT_UI4|VT_BYREF + #case 0x4014 ( #("byref of I8 = ", (__int64*)$e.pdblVal) ) ; VT_I8|VT_BYREF + #case 0x4015 ( #("byref of UI8 = ", (unsigned __int64*)$e.pudblVal) ) ; VT_UI8|VT_BYREF + #case 0x400C ( #("byref of VARIANT ", $e.pvarVal) ) ; VT_VARIANT|VT_BYREF + #case 0x400B ( #("byref of BOOL = ", $e.pboolVal) ) ; VT_BOOL|VT_BYREF + #case 0x400A ( #("byref of ERROR = ", $e.pscode) ) ; VT_ERROR|VT_BYREF + #case 0x4006 ( #("byref of CY = ", $e.pcyVal) ) ; VT_CY|VT_BYREF + #case 0x4007 ( #("byref of DATE = ", $e.pdate) ) ; VT_DATE|VT_BYREF + #case 0x4008 ( #("byref of BSTR = ", $e.pbstrVal) ) ; VT_BSTR|VT_BYREF + #case 0x400E ( #("byref of DECIMAL = ", $e.pdecVal) ) ; VT_DECIMAL|VT_BYREF + #case 0x400D ( #("byref of UNKNOWN = ", $e.ppunkVal) ) ; VT_UNKOWN|VT_BYREF + #case 0x4009 ( #("byref of DISPATCH = ", $e.ppdispVal) ) ; VT_DISPATCH|VT_BYREF + #case 0x6000 ( #("byref of ARRAY = ", $e.pparray) ) ; VT_ARRAY|VT_BYREF + #default + ( + #if ($e.vt & 0x2000) ( $e.parray) + #else ( #("Unknown vt type = ", $e.vt)) + ) + ) + children( + #( + vt: $e.vt, + #switch ($e.vt) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Base Types ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + #case 0x2 ( #(I2 : $e.iVal) ) ; VT_I2 + #case 0x3 ( #(I4 : $e.lVal) ) ; VT_I4 + #case 0x4 ( #(R4 : $e.fltVal) ) ; VT_R4 + #case 0x5 ( #(R8 : $e.dblVal) ) ; VT_R8 + #case 0x6 ( #(CY : $e.cyVal) ) ; VT_CY + #case 0x7 ( #(DATE : $e.date) ) ; VT_DATE + #case 0x8 ( #(BSTR : $e.bstrVal) ) ; VT_BSTR + #case 0x9 ( #(DISPATCH : $e.pdispVal) ) ; VT_DISPATCH + #case 0xA ( #(ERROR : $e.scode) ) ; VT_ERROR + #case 0xB ( #(BOOL : $e.boolVal) ) ; VT_BOOL + #case 0xD ( #(UNKNOWN : $e.punkVal) ) ; VT_UNKOWN + #case 0xE ( #(DECIMAL : $e.decVal) ) ; VT_DECIMAL + #case 0x10 ( #(I1 : $e.cVal) ) ; VT_I1 + #case 0x11 ( #(UI1 : $e.bVal) ) ; VT_UI1 + #case 0x12 ( #(UI2 : $e.uiVal) ) ; VT_UI2 + #case 0x13 ( #(UI4 : $e.ulVal) ) ; VT_UI4 + #case 0x14 ( #(I8 : *(__int64*)&$e.dblVal) ) ; VT_I8 + #case 0x15 ( #(UI8 : *(unsigned __int64*)&$e.dblVal) ) ; VT_UI8 + #case 0x16 ( #(INT : $e.intVal) ) ; VT_INT + #case 0x17 ( #(UINT : $e.uintVal) ) ; VT_UINT + #case 0x1E ( #(LPSTR : $e.pszVal) ) ; VT_LPSTR + #case 0x1F ( #(LPWSTR : $e.pwszVal) ) ; VT_LPWSTR + #case 0x40 ( #(FILETIME : $e.filetime) ) ; VT_FILETIME + #case 0x42 ( #(STREAM : $e.pStream) ) ; VT_STREAM + #case 0x43 ( #(STORAGE : $e.pStorage) ) ; VT_STORAGE + #case 0x44 ( #(STREAMED_OBJECT : $e.pStream) ) ; VT_STREAMED_OBJECT + #case 0x45 ( #(STORED_OBJECT : $e.pStorage) ) ; VT_STORED_OBJECT + #case 0x46 ( #(BLOB_OBJECT : $e.blob ) ) ; VT_BLOB_OBJECT + #case 0x47 ( #(CF : $e.pclipdata) ) ; VT_CF + #case 0x48 ( #(CLSID : $e.puuid) ) ; VT_CLSID + #case 0x49 ( #(VERSIONED_STREAM : $e.pVersionedStream) ) ; VT_VERSIONED_STREAM + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Vector types ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + #case 0x1002 ( #(vector of I2 : $e.cai) ) ; VT_I2|VT_VECTOR + #case 0x1003 ( #(vector of I4 : $e.cal) ) ; VT_I4|VT_VECTOR + #case 0x1004 ( #(vector of R4 : $e.caflt) ) ; VT_R4|VT_VECTOR + #case 0x1005 ( #(vector of R8 : $e.cadbl) ) ; VT_R8|VT_VECTOR + #case 0x1010 ( #(vector of I1 : $e.cac) ) ; VT_I1|VT_VECTOR + #case 0x1011 ( #(vector of UI1 : $e.caub) ) ; VT_UI1|VT_VECTOR + #case 0x1012 ( #(vector of UI2 : $e.caui) ) ; VT_UI2|VT_VECTOR + #case 0x1013 ( #(vector of UI4 : $e.caul) ) ; VT_UI4|VT_VECTOR + #case 0x1014 ( #(vector of I8 : $e.cah) ) ; VT_I8|VT_VECTOR + #case 0x1015 ( #(vector of UI8 : $e.cauh) ) ; VT_UI8|VT_VECTOR + #case 0x101E ( #(vector of LPSTR : $e.calpstr) ) ; VT_LPSTR|VT_VECTOR + #case 0x101F ( #(vector of LPWSTR : $e.calpwstr) ) ; VT_LPWSTR|VT_VECTOR + #case 0x100C ( #(vector of VARIANT : $e.capropvar) ) ; VT_VARIANT|VT_VECTOR + #case 0x100B ( #(vector of BOOL : $e.cabool) ) ; VT_BOOL|VT_VECTOR + #case 0x100A ( #(vector of ERROR : $e.cascode) ) ; VT_ERROR|VT_VECTOR + #case 0x1006 ( #(vector of CY : $e.cacy) ) ; VT_CY|VT_VECTOR + #case 0x1007 ( #(vector of DATE : $e.cadate) ) ; VT_DATE|VT_VECTOR + #case 0x1040 ( #(vector of FILETIME : $e.cafiletime) ) ; VT_FILETIME|VT_VECTOR + #case 0x1048 ( #(vector of CLSID : $e.cauuid) ) ; VT_CLSID|VT_VECTOR + #case 0x1047 ( #(vector of CF : $e.caclipdata) ) ; VT_CF|VT_VECTOR + #case 0x1008 ( #(vector of BSTR : $e.cabstr) ) ; VT_BSTR|VT_VECTOR + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Byref Types ;; + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + #case 0x4016 ( #(byref of INT : $e.pintVal) ) ; VT_INT|VT_BYREF + #case 0x4017 ( #(byref of UINT : $e.puintVal) ) ; VT_UINT|VT_BYREF + #case 0x4002 ( #(byref of I2 : $e.piVal) ) ; VT_I2|VT_BYREF + #case 0x4003 ( #(byref of I4 : $e.plVal) ) ; VT_I4|VT_BYREF + #case 0x4004 ( #(byref of R4 : $e.pfltVal) ) ; VT_R4|VT_BYREF + #case 0x4005 ( #(byref of R8 : $e.pdblVal) ) ; VT_R8|VT_BYREF + #case 0x4010 ( #(byref of I1 : $e.pcVal) ) ; VT_I1|VT_BYREF + #case 0x4011 ( #(byref of UI1 : $e.pbVal) ) ; VT_UI1|VT_BYREF + #case 0x4012 ( #(byref of UI2 : $e.puiVal) ) ; VT_UI2|VT_BYREF + #case 0x4013 ( #(byref of UI4 : $e.pulVal) ) ; VT_UI4|VT_BYREF + #case 0x4014 ( #(byref of I8 : (__int64*)$e.pdblVal) ) ; VT_I8|VT_BYREF + #case 0x4015 ( #(byref of UI8 : (unsigned __int64*)$e.pdblVal) ) ; VT_UI8|VT_BYREF + #case 0x400C ( #(byref of VARIANT : $e.pvarVal) ) ; VT_VARIANT|VT_BYREF + #case 0x400B ( #(byref of BOOL : $e.pboolVal) ) ; VT_BOOL|VT_BYREF + #case 0x400A ( #(byref of ERROR : $e.pscode) ) ; VT_ERROR|VT_BYREF + #case 0x4006 ( #(byref of CY : $e.pcyVal) ) ; VT_CY|VT_BYREF + #case 0x4007 ( #(byref of DATE : $e.pdate) ) ; VT_DATE|VT_BYREF + #case 0x4008 ( #(byref of BSTR : $e.pbstrVal) ) ; VT_BSTR|VT_BYREF + #case 0x400E ( #(byref of DECIMAL : $e.pdecVal) ) ; VT_DECIMAL|VT_BYREF + #case 0x400D ( #(byref of UNKNOWN : $e.ppunkVal) ) ; VT_UNKOWN|VT_BYREF + #case 0x4009 ( #(byref of DISPATCH : $e.ppdispVal) ) ; VT_DISPATCH|VT_BYREF + #case 0x6000 ( #(byref of ARRAY : $e.pparray) ) ; VT_ARRAY|VT_BYREF + + ; the following are either empty or invalid vt values for a variant + ; #case 0 ( #(Empty :) ) ; VT_EMPTY + ; #case 0x1 ( #(NULL :) ) ; VT_NULL + ; #case 0xC ( #(VARIANT :) ) ; VT_VARIANT + ; #case 0x18 ( #(VOID :) ) ; VT_VOID + ; #case 0x19 ( #(HRESULT :) ) ; VT_HRESULT + ; #case 0x1A ( #(PTR :) ) ; VT_PTR + ; #case 0x1B ( #(SAFEARRAY :) ) ; VT_SAFEARRAY + ; #case 0x1C ( #(CARRAY :) ) ; VT_CARRAY + ; #case 0x1D ( #(USERDEFINED :) ) ; VT_USERDEFINED + ; #case 0x24 ( #(RECORD :) ) ; VT_RECORD + ; #case 0x26 ( #(UINT_PTR :) ) ; VT_UINT_PTR + #default + ( + #if ($e.vt & 0x2000 ) + ( #(safearray: $e.parray)) + #else + ( + #( + [raw members]: [$e,!] ; unformatted data members + ) + ) + ) + #except + ( + #( + [raw members]: [$e,!] ; unformatted data members + ) + ) + ) + ) +} + +; Visualizers for data structures in namespace Concurrency +;------------------------------------------------------------------------------ +; Concurrency::message from +;------------------------------------------------------------------------------ +Concurrency::message<*>{ + preview ( + #( + $e.payload + ) + ) + + children ( + #( + #(payload: $e.payload), + #([msg_id]: $e._M_id) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::multi_link_registry from +;------------------------------------------------------------------------------ +Concurrency::multi_link_registry<*>{ + preview ( + #( + "[", + $e._M_vector._M_index, + "](", + #array( + expr: *($e._M_vector._M_array[$i]), + size: $e._M_vector._M_index + ), + ")" + ) + ) + + children ( + #( + #([size]: $e._M_vector._M_index), + #array( + expr: *($e._M_vector._M_array[$i]), + size: $e._M_vector._M_index + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::details::_Queue from +;------------------------------------------------------------------------------ +Concurrency::details::_Queue<*>{ + preview ( + #( + "[", + $e._M_count, + "](", + #list( + head: $e._M_pHead, + next: _M_pNext, + size: _M_count + ), + ")" + ) + ) + + children ( + #( + #([size]: $e._M_count), + #list( + head: $e._M_pHead, + next: _M_pNext, + size: _M_count + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::unbounded_buffer from +;------------------------------------------------------------------------------ +Concurrency::unbounded_buffer<*>{ + preview ( + #( + $e._M_messageBuffer + ) + ) + + children ( + #( + #(unprocessed_messages: $e._M_messageProcessor._M_queuedMessages._M_queue), + #(messages: $e._M_messageBuffer), + #(message_filter: *($e._M_pFilter)), + #(linked_sources: $e._M_connectedSources._M_links), + #(linked_targets: $e._M_connectedTargets), + #(reserving_target: *($e._M_pReservedFor)), + #(Scheduler: *($e._M_messageProcessor._M_pScheduler)), + #(ScheduleGroup: *($e._M_messageProcessor._M_pScheduleGroup)) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::overwrite_buffer from +;------------------------------------------------------------------------------ +Concurrency::overwrite_buffer<*>{ + preview ( + #( + $e._M_pMessage + ) + ) + + children ( + #( + #(value: *($e._M_pMessage)), + #(unprocessed_messages: $e._M_messageProcessor._M_queuedMessages._M_queue), + #(message_filter: *($e._M_pFilter)), + #(linked_sources: $e._M_connectedSources._M_links), + #(linked_targets: $e._M_connectedTargets), + #(reserving_target: *($e._M_pReservedFor)), + #(reserved_message: *($e._M_pReservedMessage)), + #(Scheduler: *($e._M_messageProcessor._M_pScheduler)), + #(ScheduleGroup: *($e._M_messageProcessor._M_pScheduleGroup)) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::single_assignment from +;------------------------------------------------------------------------------ +Concurrency::single_assignment<*>{ + preview ( + #( + $e._M_pMessage + ) + ) + + children ( + #( + #(value: *($e._M_pMessage)), + #(unprocessed_messages: $e._M_messageProcessor._M_queuedMessages._M_queue), + #(message_filter: *($e._M_pFilter)), + #(linked_sources: $e._M_connectedSources._M_links), + #(linked_targets: $e._M_connectedTargets), + #(reserving_target: *($e._M_pReservedFor)), + #(Scheduler: *($e._M_messageProcessor._M_pScheduler)), + #(ScheduleGroup: *($e._M_messageProcessor._M_pScheduleGroup)) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::call from +;------------------------------------------------------------------------------ +Concurrency::call<*>{ + preview ( + #( + $e._M_pFunc + ) + ) + + children ( + #( + #(call_method: $e._M_pFunc), + #(unprocessed_messages: $e._M_messageProcessor._M_queuedMessages._M_queue), + #(message_filter: *($e._M_pFilter)), + #(linked_sources: $e._M_connectedSources._M_links), + #(Scheduler: *($e._M_messageProcessor._M_pScheduler)), + #(ScheduleGroup: *($e._M_messageProcessor._M_pScheduleGroup)) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::transformer from +;------------------------------------------------------------------------------ +Concurrency::transformer<*>{ + preview ( + #( + $e._M_pFunc + ) + ) + + children ( + #( + #(transform_method: $e._M_pFunc), + #(unprocessed_messages: $e._M_messageProcessor._M_queuedMessages._M_queue), + #(messages: $e._M_messageBuffer), + #(message_filter: *($e._M_pFilter)), + #(linked_sources: $e._M_connectedSources._M_links), + #(linked_target: *($e._M_connectedTargets._M_connectedLink)), + #(reserving_target: *($e._M_pReservedFor)), + #(Scheduler: *($e._M_messageProcessor._M_pScheduler)), + #(ScheduleGroup: *($e._M_messageProcessor._M_pScheduleGroup)) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::choice from +;------------------------------------------------------------------------------ +Concurrency::choice<*>{ + preview ( + #( + "[", + #if ($e._M_pSingleAssignment->_M_fIsInitialized) ("initialized") + #else ("not_initialized"), + "] ", + $e._M_sourceTuple + ) + ) + + children ( + #( + #([input_count]: $e._M_pSingleAssignment->_M_connectedSources._M_links._M_vector._M_index), + #(index: $e._M_pSingleAssignment->_M_pMessage->payload), + #(source_tuple: $e._M_sourceTuple), + #(linked_sources: $e._M_pSingleAssignment->_M_connectedSources._M_links), + #(linked_targets: $e._M_pSingleAssignment->_M_connectedTargets), + #(reserving_target: *($e._M_pSingleAssignment->_M_pReservedFor)), + #(Scheduler: *($e._M_pScheduler)), + #(ScheduleGroup: *($e._M_pScheduleGroup)), + #([raw _M_pSourceChoices] : $e._M_pSourceChoices) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::join<*,*>::_MessageArray from +;------------------------------------------------------------------------------ +Concurrency::join<*,*>::_MessageArray{ + preview ( + #( + "[", + $e._M_count, + "](", + #array( + expr: *(((Concurrency::message<$T1>**)$e._M_messages)[$i]), + size: $e._M_count + ), + ")" + ) + ) + + children ( + #( + #([size]: $e._M_count), + #array( + expr: *(((Concurrency::message<$T1>**)$e._M_messages)[$i]), + size: $e._M_count + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::join<*,*>::_SavedMessageIdArray from +;------------------------------------------------------------------------------ +Concurrency::join<*,*>::_SavedMessageIdArray{ + preview ( + #( + "[", + $e._M_count, + "](", + #array( + expr: ((int*)$e._M_savedIds)[$i], + size: $e._M_count + ), + ")" + ) + ) + + children ( + #( + #([size]: $e._M_count), + #array( + expr: ((int*)$e._M_savedIds)[$i], + size: $e._M_count + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::join from +;------------------------------------------------------------------------------ +Concurrency::join<*,*>{ + preview ( + #( + "[", + $e._M_messageArray._M_count - $e._M_messagesRemaining, + "/", + $e._M_messageArray._M_count, + "](", + #array( + expr: *($e._M_connectedSources._M_links._M_vector._M_array[$i]), + size: $e._M_connectedSources._M_links._M_vector._M_index + ), + ")" + ) + ) + + children ( + #( + #([join_type]: (Concurrency::join_type)$T2), + #([offer_count]: $e._M_messageArray._M_count - $e._M_messagesRemaining), + #(offer_IDs: $e._M_savedMessageIdArray), + #([input_count]: $e._M_messageArray._M_count), + #(input_values: $e._M_messageArray), + #(messages: $e._M_messageBuffer), + #(message_filter: *($e._M_pFilter)), + #(linked_sources: $e._M_connectedSources._M_links), + #(linked_target: $e._M_connectedTargets._M_connectedLink), + #(reserving_target: *($e._M_pReservedFor)), + #(Scheduler: *($e._M_messageProcessor._M_pScheduler)), + #(ScheduleGroup: *($e._M_messageProcessor._M_pScheduleGroup)) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::multitype_join from +;------------------------------------------------------------------------------ +Concurrency::multitype_join<*,*>{ + preview ( + #( + "[", + $e._M_pJoinNode->_M_connectedSources._M_links._M_vector._M_index - $e._M_pJoinNode->_M_counter, + "/", + $e._M_pJoinNode->_M_connectedSources._M_links._M_vector._M_index, + "]", + $e._M_sourceTuple + ) + ) + + children ( + #( + #([join_type]: (Concurrency::join_type)$T2), + #([offer_count]: $e._M_pJoinNode->_M_connectedSources._M_links._M_vector._M_index - $e._M_pJoinNode->_M_counter), + #([input_count]: $e._M_pJoinNode->_M_connectedSources._M_links._M_vector._M_index), + #(source_tuple: $e._M_sourceTuple), + #(messages: $e._M_pJoinNode->_M_messageBuffer), + #(linked_sources: $e._M_pJoinNode->_M_connectedSources._M_links), + #(linked_target: $e._M_pJoinNode->_M_connectedTargets._M_connectedLink), + #(reserving_target: *($e._M_pJoinNode->_M_pReservedFor)), + #(Scheduler: *($e._M_pJoinNode->_M_messageProcessor._M_pScheduler)), + #(ScheduleGroup: *($e._M_pJoinNode->_M_messageProcessor._M_pScheduleGroup)), + #([raw _M_pSourceJoins] : $e._M_pSourceJoins) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::timer from +;------------------------------------------------------------------------------ +Concurrency::timer<*>{ + preview ( + #( + $e._M_state + ) + ) + + children ( + #( + #(state: $e._M_state), + #(value: $e._M_value), + #(repeating: $e._M_fRepeating), + #(interval_ms: $e._M_ms), + #(linked_target: *($e._M_connectedTargets._M_connectedLink)), + #(reserving_target: *($e._M_pReservedFor)), + #(Scheduler: *($e._M_messageProcessor._M_pScheduler)), + #(ScheduleGroup: *($e._M_messageProcessor._M_pScheduleGroup)) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::details::SchedulerBase from +; Concurrency::details::ThreadScheduler from +; Concurrency::details::UMSThreadScheduler from +;------------------------------------------------------------------------------ +Concurrency::details::SchedulerBase|Concurrency::details::ThreadScheduler|Concurrency::details::UMSThreadScheduler{ + preview ( + #( + "[", + $e.m_id, + "] ", + #if ($e.m_schedulerKind == 0) ("ThreadScheduler") + #else ("UmsScheduler"), + #if ($e.m_id == $e.s_pDefaultScheduler->m_id) (", default") + #else ("") + ) + ) + + children ( + #( + #(ID: $e.m_id), + #(SchedulerPolicy: $e.m_policy), + #(VirtualProcessorCount: $e.m_virtualProcessorCount), + #(ReferenceCount: $e.m_refCount), + #([isDefaultScheduler]: $e.m_id == $e.s_pDefaultScheduler->m_id) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::details::ScheduleGroupBase from +; Concurrency::details::CacheLocalScheduleGroup from +; Concurrency::details::FairScheduleGroup from +;------------------------------------------------------------------------------ +Concurrency::details::ScheduleGroupBase|Concurrency::details::CacheLocalScheduleGroup|Concurrency::details::FairScheduleGroup{ + preview ( + #( + "[", + $e.m_id, + "]", + #if ($e.m_kind & 4) (" AnonymousScheduleGroup") + #else ("") + ) + ) + + children ( + #( + #(ID: $e.m_id), + #(Scheduler: *($e.m_pScheduler)) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::details::ContextBase from +; Concurrency::details::InternalContextBase from +; Concurrency::details::ThreadInternalContext from +; Concurrency::details::UMSThreadInternalContext from +;------------------------------------------------------------------------------ +Concurrency::details::ContextBase|Concurrency::details::InternalContextBase|Concurrency::details::ThreadInternalContext|Concurrency::details::UMSThreadInternalContext{ + preview ( + #( + "[", + $e.m_threadId, + "] ", + #if ($e.m_blockedState == 0) ("not_concrt_blocked") + #elif ($e.m_blockedState == 1) ("concrt_blocked") + #elif ($e.m_blockedState == 2) ("ums_sync_blocked") + #elif ($e.m_blockedState == 4) ("ums_async_blocked") + #else ("") + ) + ) + + children ( + #( + #(ID: $e.m_id), + #(ThreadID: $e.m_threadId), + #(Scheduler: *($e.m_pScheduler)), + #(ScheduleGroup: *($e.m_pGroup)) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::details::ExternalContextBase from +;------------------------------------------------------------------------------ +Concurrency::details::ExternalContextBase{ + preview ( + #( + "[", + $e.m_threadId, + "] ", + #if ($e.m_contextSwitchingFence == 1) ("concrt_blocked") + #else ("not_concrt_blocked") + ) + ) + + children ( + #( + #(ID: $e.m_id), + #(ThreadID: $e.m_threadId), + #(Scheduler: *($e.m_pScheduler)), + #(ScheduleGroup: *($e.m_pGroup)) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::SchedulerPolicy from +;------------------------------------------------------------------------------ +Concurrency::SchedulerPolicy{ + preview ( + #( + $e._M_pPolicyBag->_M_values._M_specificValues._M_schedulerKind, + ", Min=", + $e._M_pPolicyBag->_M_values._M_specificValues._M_minConcurrency, + ", Max=", + $e._M_pPolicyBag->_M_values._M_specificValues._M_maxConcurrency + ) + ) + + children ( + #( + #(SchedulerKind: $e._M_pPolicyBag->_M_values._M_specificValues._M_schedulerKind), + #(MinConcurrency: $e._M_pPolicyBag->_M_values._M_specificValues._M_minConcurrency), + #(MaxConcurrency: $e._M_pPolicyBag->_M_values._M_specificValues._M_maxConcurrency), + #(TargetOversubscriptionFactor: $e._M_pPolicyBag->_M_values._M_specificValues._M_targetOversubscriptionFactor), + #(LocalContextCacheSize: $e._M_pPolicyBag->_M_values._M_specificValues._M_localContextCacheSize), + #(ContextStackSize: $e._M_pPolicyBag->_M_values._M_specificValues._M_contextStackSize), + #(ContextPriority: $e._M_pPolicyBag->_M_values._M_specificValues._M_contextPriority), + #(SchedulingProtocol: $e._M_pPolicyBag->_M_values._M_specificValues._M_schedulingProtocol), + #(DynamicProgressFeedback: $e._M_pPolicyBag->_M_values._M_specificValues._M_dynamicProgressFeedback) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::event from +;------------------------------------------------------------------------------ +Concurrency::event{ + preview ( + #( + #if ($e._M_pWaitChain == 1) ("set") + #else ("not_set") + ) + ) + + children ( + #( + #([is_set]: ($e._M_pWaitChain == 1)), + #([has_waiters]: (($e._M_pWaitChain != 0) && ($e._M_pWaitChain != 1))) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::critical_section from +;------------------------------------------------------------------------------ +Concurrency::critical_section{ + preview ( + #( + #if ($e._M_pHead != 0) ("locked") + #else ("not_locked") + ) + ) + + children ( + #( + #([is_locked]: ($e._M_pHead != 0)), + #(OwningContext: *((Concurrency::Context*)($e._M_activeNode[0]))) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::critical_section::scoped_lock from +;------------------------------------------------------------------------------ +Concurrency::critical_section::scoped_lock{ + preview ( + #( + $e._M_critical_section + ) + ) + + children ( + #( + CriticalSection: $e._M_critical_section + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::reader_writer_lock from +;------------------------------------------------------------------------------ +Concurrency::reader_writer_lock{ + preview ( + #( + #if (($e._M_lockState < 8) && ($e._M_lockState & 2)) ("held_by_writer") + #elif ($e._M_lockState >= 8) ( + #( + "held_by_reader(s) [", + ($e._M_lockState / 8), + "]" + ) + ) + #else ("not_held") + ) + ) + + children ( + #( + #([is_reader_lock_held]: ($e._M_lockState >= 8)), + #([num_reader_lock_holders]: ($e._M_lockState / 8)), + #([is_writer_lock_held]: ($e._M_lockState < 8) && ($e._M_lockState & 2)), + #(OwningWriterContext: *((Concurrency::Context*)($e._M_activeWriter[0]))) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::reader_writer_lock::scoped_lock from +; Concurrency::reader_writer_lock::scoped_lock_read from +;------------------------------------------------------------------------------ +Concurrency::reader_writer_lock::scoped_lock|Concurrency::reader_writer_lock::scoped_lock_read{ + preview ( + #( + $e._M_reader_writer_lock + ) + ) + + children ( + #( + ReaderWriterLock: $e._M_reader_writer_lock + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::details::_TaskCollectionBase from +;------------------------------------------------------------------------------ +Concurrency::details::_TaskCollectionBase{ + preview ( + #( + #if ((((int)$e._M_pException & ~0x3) != 0) && (((int)$e._M_pException & ~0x3) != 0xC)) ("exception") + #else ("no_exception") + ) + ) + + children ( + #( + #([has_exception]: (((int)$e._M_pException & ~0x3) != 0) && (((int)$e._M_pException & ~0x3) != 0xC)), + #(CreatingContext: *((Concurrency::Context*)$e._M_pOwningContext)) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::task_group from +; Concurrency::structured_task_group from +;------------------------------------------------------------------------------ +Concurrency::task_group|Concurrency::structured_task_group{ + preview ( + #( + #if ((((int)$e._M_task_collection._M_pException & ~0x3) != 0) && (((int)$e._M_task_collection._M_pException & ~0x3) != 0xC)) ("exception") + #else ("no_exception") + ) + ) + + children ( + #( + #([has_exception]: (((int)$e._M_task_collection._M_pException & ~0x3) != 0) && (((int)$e._M_task_collection._M_pException & ~0x3) != 0xC)), + #(CreatingContext: *((Concurrency::Context*)$e._M_task_collection._M_pOwningContext)) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::task_handle from +;------------------------------------------------------------------------------ +Concurrency::task_handle<*>{ + preview ( + #( + $e._M_function + ) + ) + + children ( + #( + #(Function: $e._M_function), + #(RuntimeOwnsLifetime: $e._M_fRuntimeOwnsLifetime), + #(TaskCollection: *($e._M_pTaskCollection)) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::combinable from +;------------------------------------------------------------------------------ +Concurrency::combinable<*>{ + preview( + #( + "(", + #array( + expr: *($e._M_buckets[$i]), + size: $e._M_size + ) : #list( + head: $e, + next: _M_chain + ) : $e._M_value, + ")" + ) + ) + children( + #( + #array( + expr: *($e._M_buckets[$i]), + size: $e._M_size + ) : #list( + head: $e, + next: _M_chain + ) : $e._M_value, + #(InitFunction : $e._M_fnInitialize) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::concurrent_vector from +;------------------------------------------------------------------------------ +Concurrency::concurrent_vector<*,*>{ + preview( + #( + "[", + $e._My_early_size._M_value, + "](", + #array ( + expr: #( + #if (($i >> 1) == 0) ((($T1*)$e._My_segment._M_value[0]._My_array)[$i]) + #else ((($T1*)$e._My_segment._M_value[__log2($i)]._My_array)[$i - (0x1 << __log2($i))]) + ), + size: $e._My_early_size._M_value + ), + ")" + ) + ) + children( + #( + [size] : $e._My_early_size._M_value, + #array ( + expr: #( + #if (($i >> 1) == 0) ((($T1*)$e._My_segment._M_value[0]._My_array)[$i]) + #else ((($T1*)$e._My_segment._M_value[__log2($i)]._My_array)[$i - (0x1 << __log2($i))]) + ), + size: $e._My_early_size._M_value + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::details::_Vector_iterator from +;------------------------------------------------------------------------------ +Concurrency::details::_Vector_iterator,*>{ + preview( + #( + #if (($e._My_index >> 1) == 0) ((($T1*)$e._My_vector->_My_segment._M_value[0]._My_array)[$e._My_index]) + #else ((($T1*)$e._My_vector->_My_segment._M_value[__log2($e._My_index)]._My_array)[$e._My_index - (0x1 << __log2($e._My_index))]) + ) + ) + children( + #( + [ptr]: #if (($e._My_index >> 1) == 0) (&((($T1*)$e._My_vector->_My_segment._M_value[0]._My_array)[$e._My_index])) + #else (&((($T1*)$e._My_vector->_My_segment._M_value[__log2($e._My_index)]._My_array)[$e._My_index - (0x1 << __log2($e._My_index))])) + + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::concurrent_queue from +;------------------------------------------------------------------------------ +Concurrency::concurrent_queue<*,*>{ + preview + ( + #( + "[", + $e._My_rep->_Tail_counter._M_value - $e._My_rep->_Head_counter._M_value, + "](", + #array + ( + expr : #if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 0) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 1) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 2) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 3) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 4) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 5) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 6) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 7) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 8) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 9) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 10) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 11) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 12) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 13) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 14) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 15) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 16) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 17) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 18) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 19) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1])))))))))))))))))))), + size : #if ($e._My_rep->_Tail_counter._M_value-$e._My_rep->_Head_counter._M_value < 20*8*$e._Items_per_page) ($e._My_rep->_Tail_counter._M_value-$e._My_rep->_Head_counter._M_value) + #else (20*8*$e._Items_per_page) + ), + ")" + ) + ) + children + ( + #( + #([unsafe_size]: $e._My_rep->_Tail_counter._M_value-$e._My_rep->_Head_counter._M_value), + #array + ( + expr : #if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 0) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 1) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 2) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 3) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 4) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 5) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 6) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 7) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 8) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 9) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 10) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 11) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 12) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 13) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 14) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 15) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 16) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 17) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 18) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else (#if (($i+($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)))/(8*$e._Items_per_page)-($e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>(8*($e._Items_per_page-1)))*($i%8+$e._My_rep->_Head_counter._M_value%(8*$e._Items_per_page)>=(8*$e._Items_per_page)) == 19) ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1]) + #else ((($T1*)(($e._My_rep->_Array[(($i+$e._My_rep->_Head_counter._M_value)*3%8)]._Head_page._M_value->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next->_Next) + 1))[(($i+$e._My_rep->_Head_counter._M_value)&-8)/8&$e._Items_per_page-1])))))))))))))))))))), + size : #if ($e._My_rep->_Tail_counter._M_value-$e._My_rep->_Head_counter._M_value < 20*8*$e._Items_per_page) ($e._My_rep->_Tail_counter._M_value-$e._My_rep->_Head_counter._M_value) + #else (20*8*$e._Items_per_page) + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; Concurrency::details::_Concurrent_queue_iterator from +;------------------------------------------------------------------------------ +Concurrency::details::_Concurrent_queue_iterator,*>{ + preview( + #( + *(($T1*)$e._My_item) + ) + ) + children( + #( + [ptr]: (($T1*)$e._My_item) + + ) + ) +} + +; Qt visualizers +; Nokia Qt 4.x visualizers -----------------------------------------[ start ]-- +;------------------------------------------------------------------------------ +; Feel free to modify these visualizers to suit yours needs! But please let us +; know about the changes you make, so we continuously improve the visualizers. + +QString|*::QString{ + preview ([$e.d->data,su]) + stringview ([$e.d->data,sub]) + children + ( + #( + d: $c.d, + [size]: $c.d->size, + [referenced]: $c.d->ref._q_value + ) + ) +} + +QByteArray|*::QByteArray{ + preview ([$e.d->data,s]) + stringview ([$e.d->data,sb]) + children + ( + #( + d: $c.d, + [size]: $c.d->size, + [referenced]: $c.d->ref._q_value + ) + ) +} + +QFileInfo|*::QFileInfo{ + preview + ( + #( + "private=", $c.d_ptr + ) + ) +} + +QUrl|*::QUrl{ + preview + ( + #if ($e.d.stateFlags == 0) ( + $e.d + ) #else ( + #( $e.d->scheme, $e.d->host, $e.d->path ) + ) + ) + children + ( + #( + scheme: $c.d->scheme, + host: $c.d->host, + path: $c.d->path, + username: $c.d->userName, + password: $c.d->password, + encodedOriginal: $c.d->encodedOriginal, + query: $c.d->query, + fragment: $c.d->fragment + ) + ) +} + +QTime|*::QTime{ + preview + ( + #( + "hour=", [$e.mds / 3600000, d], + ", minute=", [($e.mds % 3600000) / 60000, d], + ", second=", [($e.mds / 1000) % 60, d], + ", millisecond=", [$e.mds % 1000, d] + ) + ) + children + ( + #( + [hour]: [$e.mds / 3600000, d], + [minute]: [($e.mds % 3600000) / 60000, d], + [second]: [($e.mds / 1000) % 60, d], + [millisecond]: [$e.mds % 1000, d] + ) + ) +} + +QVariant{ + preview + ( + #if ($e.d.type == 1) ( + #("bool = ", [$e.d.data.b]) + ) #elif ($e.d.type == 2) ( + #("int = ", [$e.d.data.i]) + ) #elif ($e.d.type == 3) ( + #("usigned int = ", [$e.d.data.u]) + ) #elif ($e.d.type == 4) ( + #("long long = ", [$e.d.data.ll]) + ) #elif ($e.d.type == 5) ( + #("unsigned long long = ", [$e.d.data.ull]) + ) #elif ($e.d.type == 6) ( + #("double = ", [$e.d.data.d]) + ) #elif ($e.d.type == 7) ( + #("char = ", [$e.d.data.c]) + ) #elif ($e.d.type == 8) ( + #("QMap = ", [(QMap) $e.d.data.ptr]) + ) #elif ($e.d.type == 10) ( + #("QString = ", [(QString) $e.d.data.ptr]) + ) #elif ($e.d.type == 11) ( + #("QStringList = ", [(QStringList) $e.d.data.ptr]) + ) #elif ($e.d.type == 17) ( + #("QUrl = ", [(QUrl) $e.d.data.ptr]) + ) #else ( + #("type = ", [$e.d.type]) + ) + ) + children + ( + #if ($e.d.type == 1) ( + $c.d.data.b + ) #elif ($e.d.type == 2) ( + $c.d.data.i + ) #elif ($e.d.type == 3) ( + $c.d.data.u + ) #elif ($e.d.type == 4) ( + $c.d.data.ll + ) #elif ($e.d.type == 5) ( + $c.d.data.ull + ) #elif ($e.d.type == 6) ( + $c.d.data.d + ) #elif ($e.d.type == 7) ( + $c.d.data.c + ) #elif ($e.d.type == 8) ( + ) #elif ($e.d.type == 10) ( + #( + [size]: ((QString) $c.d.data.ptr).d->size + ) + ) #elif ($e.d.type == 11) ( + #if ((((QStringList) $e.d.data.ptr).d->end - ((QStringList) $e.d.data.ptr).d->begin) <= 10) ( + #array + ( + expr: (QString)((((QStringList) $e.d.data.ptr).d->array + ((QStringList) $e.d.data.ptr).d->begin)[$i]), + size: ((QStringList) $e.d.data.ptr).d->end-((QStringList) $e.d.data.ptr).d->begin + ) + ) #else ( + #array + ( + expr: (QString)((((QStringList) $e.d.data.ptr).d->array + ((QStringList) $e.d.data.ptr).d->begin)[$i]), + size: 10 + ) + ) + ) #elif ($e.d.type == 17) ( + #( + scheme: ((QUrl) $e.d.data.ptr).d->scheme, + host: ((QUrl) $e.d.data.ptr).d->host, + path: ((QUrl) $e.d.data.ptr).d->path, + username: ((QUrl) $e.d.data.ptr).d->userName, + password: ((QUrl) $e.d.data.ptr).d->password, + encodedOriginal: ((QUrl) $e.d.data.ptr).d->encodedOriginal, + query: ((QUrl) $e.d.data.ptr).d->query, + fragment: ((QUrl) $e.d.data.ptr).d->fragment + ) + ) #else ( + #("type = ", [$e.d.type]) + ) + ) +} + +*::QVariant{ + preview + ( + #if ($e.d.type == 1) ( + #("bool = ", [$e.d.data.b]) + ) #elif ($e.d.type == 2) ( + #("int = ", [$e.d.data.i]) + ) #elif ($e.d.type == 3) ( + #("usigned int = ", [$e.d.data.u]) + ) #elif ($e.d.type == 4) ( + #("long long = ", [$e.d.data.ll]) + ) #elif ($e.d.type == 5) ( + #("unsigned long long = ", [$e.d.data.ull]) + ) #elif ($e.d.type == 6) ( + #("double = ", [$e.d.data.d]) + ) #elif ($e.d.type == 7) ( + #("char = ", [$e.d.data.c]) + ) #elif ($e.d.type == 8) ( + #("QMap = ", [($T1::QMap) $e.d.data.ptr]) + ) #elif ($e.d.type == 10) ( + #("QString = ", [($T1::QString) $e.d.data.ptr]) + ) #elif ($e.d.type == 11) ( + #("QStringList = ", [($T1::QStringList) $e.d.data.ptr]) + ) #elif ($e.d.type == 17) ( + #("QUrl = ", [($T1::QUrl) $e.d.data.ptr]) + ) #else ( + #("type = ", [$e.d.type]) + ) + ) + children + ( + #if ($e.d.type == 1) ( + $c.d.data.b + ) #elif ($e.d.type == 2) ( + $c.d.data.i + ) #elif ($e.d.type == 3) ( + $c.d.data.u + ) #elif ($e.d.type == 4) ( + $c.d.data.ll + ) #elif ($e.d.type == 5) ( + $c.d.data.ull + ) #elif ($e.d.type == 6) ( + $c.d.data.d + ) #elif ($e.d.type == 7) ( + $c.d.data.c + ) #elif ($e.d.type == 8) ( + ) #elif ($e.d.type == 10) ( + #( + [size]: (($T1::QString) $c.d.data.ptr).d->size + ) + ) #elif ($e.d.type == 11) ( + #if (((($T1::QStringList) $e.d.data.ptr).d->end - (($T1::QStringList) $e.d.data.ptr).d->begin) <= 10) ( + #array + ( + expr: ($T1::QString)(((($T1::QStringList) $e.d.data.ptr).d->array + (($T1::QStringList) $e.d.data.ptr).d->begin)[$i]), + size: (($T1::QStringList) $e.d.data.ptr).d->end-(($T1::QStringList) $e.d.data.ptr).d->begin + ) + ) #else ( + #array + ( + expr: ($T1::QString)(((($T1::QStringList) $e.d.data.ptr).d->array + (($T1::QStringList) $e.d.data.ptr).d->begin)[$i]), + size: 10 + ) + ) + ) #elif ($e.d.type == 17) ( + #( + scheme: (($T1::QUrl) $e.d.data.ptr).d->scheme, + host: (($T1::QUrl) $e.d.data.ptr).d->host, + path: (($T1::QUrl) $e.d.data.ptr).d->path, + username: (($T1::QUrl) $e.d.data.ptr).d->userName, + password: (($T1::QUrl) $e.d.data.ptr).d->password, + encodedOriginal: (($T1::QUrl) $e.d.data.ptr).d->encodedOriginal, + query: (($T1::QUrl) $e.d.data.ptr).d->query, + fragment: (($T1::QUrl) $e.d.data.ptr).d->fragment + ) + ) #else ( + #("type = ", [$e.d.type]) + ) + ) +} + +;------------------------------------------------------------------------------ +; QStringList +;------------------------------------------------------------------------------ +QStringList{ + preview + ( + #if (($c.d->end - $c.d->begin) <= 10) ( + #( + "[", $c.d->end - $c.d->begin, "](", + #array + ( + expr: (QString)(($c.d->array + $c.d->begin)[$i]), + size: $c.d->end-$c.d->begin + ), ")" + ) + ) #else ( + #( + "[", $c.d->end - $c.d->begin, "](", + #array + ( + expr: (QString)(($c.d->array + $c.d->begin)[$i]), + size: 10 + ), ", ...)" + ) + ) + ) +} + +*::QStringList{ + preview + ( + #if (($c.d->end - $c.d->begin) <= 10) ( + #( + "[", $c.d->end - $c.d->begin, "](", + #array + ( + expr: ($T1::QString)(($c.d->array + $c.d->begin)[$i]), + size: $c.d->end-$c.d->begin + ), ")" + ) + ) #else ( + #( + "[", $c.d->end - $c.d->begin, "](", + #array + ( + expr: ($T1::QString)(($c.d->array + $c.d->begin)[$i]), + size: 10 + ), ", ...)" + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; QList, QQueue +;------------------------------------------------------------------------------ +QList<*>|QQueue<*>{ + preview + ( + #if (int(sizeof($T1)) <= int(sizeof(void*))) ( + #if (($c.d->end - $c.d->begin) <= 10) ( + #( + "[", $c.d->end - $c.d->begin, "](", + #array + ( + expr: ($T1)(($c.d->array + $c.d->begin)[$i]), + size: $c.d->end-$c.d->begin + ), ")" + ) + ) #else ( + #( + "[", $c.d->end - $c.d->begin, "](", + #array + ( + expr: ($T1)(($c.d->array + $c.d->begin)[$i]), + size: 10 + ), ", ...)" + ) + ) + ) #else ( + #if (($c.d->end - $c.d->begin) <= 10) ( + #( + "[", $c.d->end - $c.d->begin, "](", + #array + ( + expr: *($T1*)(($c.d->array + $c.d->begin)[$i]), + size: $c.d->end-$c.d->begin + ), ")" + ) + ) #else ( + #( + "[", $c.d->end - $c.d->begin, "](", + #array + ( + expr: *($T1*)(($c.d->array + $c.d->begin)[$i]), + size: 10 + ), ", ...)" + ) + ) + ) + ) + children + ( + #if (int(sizeof($T1)) <= int(sizeof(void*))) ( + #array ( + expr: ($T1)(($c.d->array + $c.d->begin)[$i]), + size: $c.d->end - $c.d->begin + ) + ) #else ( + #array ( + expr: *($T1*)(($c.d->array + $c.d->begin)[$i]), + size: $c.d->end - $c.d->begin + ) + ) + ) +} + +*::QList<*>|*::QQueue<*>{ + preview + ( + #if (int(sizeof($T2)) <= int(sizeof(void*))) ( + #if (($c.d->end - $c.d->begin) <= 10) ( + #( + "[", $c.d->end - $c.d->begin, "](", + #array + ( + expr: ($T2)(($c.d->array + $c.d->begin)[$i]), + size: $c.d->end-$c.d->begin + ), ")" + ) + ) #else ( + #( + "[", $c.d->end - $c.d->begin, "](", + #array + ( + expr: ($T2)(($c.d->array + $c.d->begin)[$i]), + size: 10 + ), ", ...)" + ) + ) + ) #else ( + #if (($c.d->end - $c.d->begin) <= 10) ( + #( + "[", $c.d->end - $c.d->begin, "](", + #array + ( + expr: *($T2*)(($c.d->array + $c.d->begin)[$i]), + size: $c.d->end-$c.d->begin + ), ")" + ) + ) #else ( + #( + "[", $c.d->end - $c.d->begin, "](", + #array + ( + expr: *($T2*)(($c.d->array + $c.d->begin)[$i]), + size: 10 + ), ", ...)" + ) + ) + ) + ) + children + ( + #if (int(sizeof($T2)) <= int(sizeof(void*))) ( + #array ( + expr: ($T2)(($c.d->array + $c.d->begin)[$i]), + size: $c.d->end - $c.d->begin + ) + ) #else ( + #array ( + expr: *($T2*)(($c.d->array + $c.d->begin)[$i]), + size: $c.d->end - $c.d->begin + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; QList::iterator, QQueue::iterator +;------------------------------------------------------------------------------ +QList<*>::iterator|QList<*>::const_iterator|QQueue<*>::iterator|QQueue<*>::const_iterator{ + preview + ( + #( + ($T1*)$c.ptr + ) + ) + children + ( + #( + ptr: ($T1)$c.ptr + ) + ) +} + +*::QList<*>::iterator|*::QList<*>::const_iterator|*::QQueue<*>::iterator|*::QQueue<*>::const_iterator{ + preview + ( + #( + ($T2)$c.i->v + ) + ) + children + ( + #( + ptr: ($T2)$c.i->v + ) + ) +} + +;------------------------------------------------------------------------------ +; QListIterator +;------------------------------------------------------------------------------ +QListIterator<*>|QMutableListIterator<*>{ + preview + ( + #( + *($T1*)($c.i.i->v) + ) + ) + children + ( + #( + Value: *($T1*)($c.i.i->v) + ) + ) +} + +*::QListIterator<*>|*::QMutableListIterator<*>{ + preview + ( + #( + *($T2*)($c.i.i->v) + ) + ) + children + ( + #( + Value: *($T2*)($c.i.i->v) + ) + ) +} + +;------------------------------------------------------------------------------ +; QLinkedList +;------------------------------------------------------------------------------ +QLinkedList<*>{ + preview + ( + #if ($e.d->size >= 10) ( + #( + "[", $e.d->size, "](", + #list + ( + head: $c.d->n, + size: 10, + next: n + ) : ( (*(QLinkedListNode<$T1>*)&$e).t ), ", ...)" + ) + ) #else ( + #( + "[", $e.d->size, "](", + #list + ( + head: $c.d->n, + size: $c.d->size, + next: n + ) : ( (*(QLinkedListNode<$T1>*)&$e).t ), ")" + ) + ) + ) + children + ( + #( + #list + ( + head: $c.d->n, + size: $c.d->size, + next: n + ) : (*(QLinkedListNode<$T1>*)&$e).t + ) + ) +} + +*::QLinkedList<*>{ + preview + ( + #if ($e.d->size >= 10) ( + #( + "[", $e.d->size, "](", + #list + ( + head: $c.d->n, + size: 10, + next: n + ) : ( (*($T1::QLinkedListNode<$T2>*)&$e).t ), ", ...)" + ) + ) #else ( + #( + "[", $e.d->size, "](", + #list + ( + head: $c.d->n, + size: $c.d->size, + next: n + ) : ( (*($T1::QLinkedListNode<$T2>*)&$e).t ), ")" + ) + ) + ) + children + ( + #( + #list + ( + head: $c.d->n, + size: $c.d->size, + next: n + ) : (*($T1::QLinkedListNode<$T2>*)&$e).t + ) + ) +} + +;------------------------------------------------------------------------------ +; QLinkedList::iterator +;------------------------------------------------------------------------------ +QLinkedList<*>::iterator|*::QLinkedList<*>::iterator|QLinkedList<*>::const_iterator|*::QLinkedList<*>::const_iterator{ + preview + ( + #( + $e.i->t + ) + ) + children + ( + #( + ptr: $e.i->t + ) + ) +} + +QLinkedListIterator<*>|*::QLinkedListIterator<*>{ + preview + ( + #( + $c.i + ) + ) + children + ( + #( + value: $c.i + ) + ) +} + +;------------------------------------------------------------------------------ +; QVector, QStack +; +; By default, this visualizer supports only Qt 4.6.x. If you're going to use +; Qt 4.5.x code, then you may want to replace all expr lines with this: +; expr: (((size_t)($c.d) + (size_t)(sizeof(QVectorData)) ))[$i], +; +; This will allow this visualizer to display Qt 4.5.x and Qt 4.6.x QVector +; objects. But be aware of some limitations. For example enum types can't be +; displayed properly this way. +; +; Qt 4.5.x: +; QVector::d is QVectorTypedData +; QVector::p is QVectorData +; expr: $c.d->array[$i] +; +; Qt 4.6.x: +; QVector::d is QVectorData +; QVector::p is QVectorTypedData +; expr: $c.p->array[$i] +; +;------------------------------------------------------------------------------ +QVector<*>|*::QVector<*>|QStack<*>|*::QStack<*>{ + preview + ( + #if ($c.d->size <= 10) ( + #( + "[", $c.d->size, "](", + #array + ( + expr: $c.p->array[$i], + size: $c.d->size + ), ")" + ) + ) #else ( + #( + "[", $c.d->size, "](", + #array + ( + expr: $c.p->array[$i], + size: 10 + ), ", ...)" + ) + ) + ) + children + ( + #array + ( + expr: $c.p->array[$i], + size: $c.d->size + ) + ) +} + +;------------------------------------------------------------------------------ +; QMap +;------------------------------------------------------------------------------ +QMapNode<*,*>{ + preview + ( + #( + "(", + $e.key, + "; ", + $e.value, + ")" + ) + ) + + children + ( + #( + key: $e.key, + value: $e.value + ) + ) +} + +QMap<*>{ + children + ( + #( + raw data: [$c,!], + #tree + ( + head : $c.d->forward[0], + skip : $c.d, + size : $c.d->size, + left : backward, + right : forward + ) : ( (QMapNode<$T1>*)((char*)&$e - (sizeof(QMapPayloadNode<$T1>) - sizeof(QMapData::Node*))) ) + ) + ) + + preview + ( + #( + "[", + $e.d->size, + "](", + #tree + ( + head : $c.d->forward[0], + size : $c.d->size, + left : backward, + right : forward + ) : $e, + ")" + ) + ) +} + +;------------------------------------------------------------------------------ +; QHash +;------------------------------------------------------------------------------ +QHash<*>{ + preview + ( + #( + "[", $e.d->size, "] (...)" + ) + ) + children + ( + #( + #array ( + expr: (QHashNode<$T1>*)$c.d->buckets[$i], + size: $c.d->numBuckets + ) : #list ( + head: $e, + next: next + ) : #switch ($e.next != 0) #case 1 ( + $e + ) + ) + ) +} + +*::QHash<*>{ + preview + ( + #( + "[", $e.d->size, "] (...)" + ) + ) + children + ( + #( + #array ( + expr: ($T1::QHashNode<$T2> *)$c.d->buckets[$i], + size: $c.d->numBuckets + ) : #list ( + head: $e, + next: next + ) : #switch ($e.next != 0) #case 1 ( + $e + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; QMultiHash +;------------------------------------------------------------------------------ +QMultiHash<*>{ + preview + ( + (*(QHash<$T1>*)(&$c)) + ) +} + +*::QMultiHash<*>{ + preview + ( + (*($T1::QHash<$T2>*)(&$c)) + ) +} + +;------------------------------------------------------------------------------ +; QHash::iterator +;------------------------------------------------------------------------------ +QHash<*>::iterator{ + preview + ( + #( + "(", ((QHashNode<$T1>*)($c.i))->key, ", ", ((QHashNode<$T1>*)($c.i))->value, ")" + ) + ) + children + ( + #( + key: ((QHashNode<$T1>*)($c.i))->key, + value: ((QHashNode<$T1>*)($c.i))->value + ) + ) +} + +*::QHash<*>::iterator{ + preview + ( + #( + "(", (($T1::QHashNode<$T2>*)($c.i))->key, ", ", (($T1::QHashNode<$T2>*)($c.i))->key, ")" + ) + ) + children + ( + #( + key: (($T1::QHashNode<$T2>*)($c.i))->key, + value: (($T1::QHashNode<$T2>*)($c.i))->value + ) + ) +} + +;------------------------------------------------------------------------------ +; QHashIterator +;------------------------------------------------------------------------------ +QHashIterator<*>{ + preview + ( + #( + "(", ((QHashNode<$T1>*)((($c).i).i))->key, ", ", ((QHashNode<$T1>*)((($c).i).i))->key, ")" + ) + ) + children + ( + #( + key: ((QHashNode<$T1>*)((($c).i).i))->key, + value: ((QHashNode<$T1>*)((($c).i).i))->value + ) + ) +} + +*::QHashIterator<*>{ + preview + ( + #( + "(", (($T1::QHashNode<$T2>*)((($c).i).i))->key, ", ", (($T1::QHashNode<$T2>*)((($c).i).i))->key, ")" + ) + ) + children + ( + #( + key: (($T1::QHashNode<$T2>*)((($c).i).i))->key, + value: (($T1::QHashNode<$T2>*)((($c).i).i))->value + ) + ) +} + +;------------------------------------------------------------------------------ +; QHashNode +;------------------------------------------------------------------------------ +QHashNode<*>|*::QHashNode<*>{ + preview + ( + #( + "(key = ", $c.key,"; value = ", $c.value, ")" + ) + ) + children + ( + #( + key: $c.key, + value: $c.value + ) + ) +} + +;------------------------------------------------------------------------------ +; QSet +;------------------------------------------------------------------------------ +QSet<*>{ + preview + ( + #( + "[", $e.q_hash.d->size, "] (...)" + ) + ) + children + ( + #( + #array ( + expr: (QHashNode<$T1,QHashDummyValue> *)$c.q_hash.d->buckets[$i], + size: $c.q_hash.d->numBuckets + ) : #list ( + head: $e, + next: next + ) : #switch ($e.next != 0) #case 1 ( + $e.key + ) + ) + ) +} + +*::QSet<*>{ + preview + ( + #( + "[", $e.q_hash.d->size, "] (...)" + ) + ) + children + ( + #( + #array ( + expr: ($T1::QHashNode<$T2,QHashDummyValue> *)$c.q_hash.d->buckets[$i], + size: $c.q_hash.d->numBuckets + ) : #list ( + head: $e, + next: next + ) : #switch ($e.next != 0) #case 1 ( + $e.key + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; QPalette +;------------------------------------------------------------------------------ +QPalette{ + children + ( + #( + WindowText_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 0)->d, + Button_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 1)->d, + Light_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 2)->d, + Midlight_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 3)->d, + Dark_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 4)->d, + Mid_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 5)->d, + Text_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 6)->d, + BrightText_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 7)->d, + ButtonText_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 8)->d, + Base_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 9)->d, + Window_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+10)->d, + Shadow_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+11)->d, + Highlight_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+12)->d, + HighlightedText_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+13)->d, + Link_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+14)->d, + LinkVisited_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+15)->d, + AlternateBase_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+16)->d, + NoRole_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+17)->d, + ToolTipBase_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+18)->d, + ToolTipText_active: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+19)->d, + + WindowText_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 0)->d, + Button_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 1)->d, + Light_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 2)->d, + Midlight_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 3)->d, + Dark_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 4)->d, + Mid_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 5)->d, + Text_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 6)->d, + BrightText_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 7)->d, + ButtonText_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 8)->d, + Base_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 9)->d, + Window_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+10)->d, + Shadow_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+11)->d, + Highlight_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+12)->d, + HighlightedText_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+13)->d, + Link_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+14)->d, + LinkVisited_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+15)->d, + AlternateBase_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+16)->d, + NoRole_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+17)->d, + ToolTipBase_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+18)->d, + ToolTipText_disabled: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+19)->d, + + WindowText_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 0)->d, + Button_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 1)->d, + Light_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 2)->d, + Midlight_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 3)->d, + Dark_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 4)->d, + Mid_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 5)->d, + Text_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 6)->d, + BrightText_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 7)->d, + ButtonText_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 8)->d, + Base_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 9)->d, + Window_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+10)->d, + Shadow_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+11)->d, + Highlight_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+12)->d, + HighlightedText_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+13)->d, + Link_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+14)->d, + LinkVisited_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+15)->d, + AlternateBase_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+16)->d, + NoRole_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+17)->d, + ToolTipBase_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+18)->d, + ToolTipText_inactive: + ((QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+19)->d + ) + ) +} + +*::QPalette{ + children + ( + #( + WindowText_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 0)->d, + Button_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 1)->d, + Light_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 2)->d, + Midlight_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 3)->d, + Dark_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 4)->d, + Mid_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 5)->d, + Text_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 6)->d, + BrightText_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 7)->d, + ButtonText_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 8)->d, + Base_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+ 9)->d, + Window_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+10)->d, + Shadow_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+11)->d, + Highlight_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+12)->d, + HighlightedText_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+13)->d, + Link_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+14)->d, + LinkVisited_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+15)->d, + AlternateBase_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+16)->d, + NoRole_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+17)->d, + ToolTipBase_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+18)->d, + ToolTipText_active: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+19)->d, + + WindowText_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 0)->d, + Button_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 1)->d, + Light_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 2)->d, + Midlight_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 3)->d, + Dark_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 4)->d, + Mid_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 5)->d, + Text_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 6)->d, + BrightText_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 7)->d, + ButtonText_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 8)->d, + Base_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+ 9)->d, + Window_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+10)->d, + Shadow_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+11)->d, + Highlight_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+12)->d, + HighlightedText_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+13)->d, + Link_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+14)->d, + LinkVisited_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+15)->d, + AlternateBase_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+16)->d, + NoRole_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+17)->d, + ToolTipBase_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+18)->d, + ToolTipText_disabled: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+20+19)->d, + + WindowText_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 0)->d, + Button_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 1)->d, + Light_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 2)->d, + Midlight_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 3)->d, + Dark_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 4)->d, + Mid_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 5)->d, + Text_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 6)->d, + BrightText_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 7)->d, + ButtonText_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 8)->d, + Base_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+ 9)->d, + Window_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+10)->d, + Shadow_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+11)->d, + Highlight_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+12)->d, + HighlightedText_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+13)->d, + Link_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+14)->d, + LinkVisited_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+15)->d, + AlternateBase_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+16)->d, + NoRole_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+17)->d, + ToolTipBase_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+18)->d, + ToolTipText_inactive: + (($T1::QBrush*)((char*)$c.d+sizeof(QAtomicInt))+40+19)->d + ) + ) +} + +;------------------------------------------------------------------------------ +; QBrush +;------------------------------------------------------------------------------ +QBrush|*::QBrush{ + preview + ( + #( + "[", $c.d->style, "] (...)" + ) + ) + children + ( + #( + style: $c.d->style, + color: $c.d->color, + transform: $c.d->transform + ) + ) +} + +QBrushData|*::QBrushData{ + preview + ( + #( + "[", $c.style, "] (...)" + ) + ) + children + ( + #( + style: $c.style, + color: $c.color, + transform: $c.transform + ) + ) +} + +;------------------------------------------------------------------------------ +; QColor +;------------------------------------------------------------------------------ +QColor|*::QColor{ + preview + ( + #( + #if ($c.cspec == 1) ( + #( + "[", $c.cspec, "] [", "r = ", [$c.ct.argb.red,x], + ", g = ", [$c.ct.argb.green,x], + ", b = ", [$c.ct.argb.blue,x], "] (...)" + ) + ) #elif ($c.cspec == 2) ( + #( + "[", $c.cspec, "] [", "h = ", [$c.ct.ahsv.hue,x], + ", s = ", [$c.ct.ahsv.saturation,x], + ", v = ", [$c.ct.ahsv.value,x], "] (...)" + ) + ) #elif ($c.cspec == 3) ( + #( + "[", $c.cspec, "] [", "c = ", [$c.ct.acmyk.cyan,x], + ", m = ", [$c.ct.acmyk.magenta,x], + ", y = ", [$c.ct.acmyk.yellow,x], + ", k = ", [$c.ct.acmyk.black,x], "] (...)" + ) + ) #else ( + #( + "[Invalid]" + ) + ) + ) + ) + children + ( + #( + #if ($c.cspec == 1) ( + #( + red: [$c.ct.argb.red,x], + green: [$c.ct.argb.green,x], + blue: [$c.ct.argb.blue,x], + alpha: [$c.ct.argb.alpha,x], + pad: [$c.ct.argb.pad,x] + ) + ) #elif ($c.cspec == 2) ( + #( + hue: [$c.ct.ahsv.hue,x], + saturation: [$c.ct.ahsv.saturation,x], + value: [$c.ct.ahsv.value,x], + alpha: [$c.ct.ahsv.alpha,x], + pad: [$c.ct.ahsv.pad,x] + ) + ) #elif ($c.cspec == 3) ( + #( + cyan: [$c.ct.acmyk.cyan,x], + magenta: [$c.ct.acmyk.magenta,x], + yellow: [$c.ct.acmyk.yellow,x], + black: [$c.ct.acmyk.black,x], + alpha: [$c.ct.acmyk.alpha,x] + ) + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; QTransform +;------------------------------------------------------------------------------ +QTransform|*::QTransform{ + preview + ( + #( + "[",[$c.affine._m11,g]," ",[$c.affine._m12,g]," ",[$c.m_13,g],"]", + "[",[$c.affine._m21,g]," ",[$c.affine._m22,g]," ",[$c.m_23,g],"]", + "[",[$c.affine._dx,g]," ",[$c.affine._dy,g]," ",[$c.m_33,g],"]" + ) + ) + children + ( + #( + translation_horizontal_m31_dx: [$c.affine._dx,g], + translation_vertical_m32_dy: [$c.affine._dy,g], + scaling_horizontal_m11: [$c.affine._m11,g], + scaling_vertical_m22: [$c.affine._m22,g], + projection_factor_m33: [$c.m_33,g], + projection_horizontal_m13: [$c.m_13,g], + projection_vertical_m23: [$c.m_23,g], + shearing_horizontal_m21: [$c.affine._m21,g], + shearing_vertical_m12: [$c.affine._m12,g], + type: $c.m_type, + dirty: (bool)$c.m_dirty + ) + ) +} + +;------------------------------------------------------------------------------ +; QMatrix +;------------------------------------------------------------------------------ +QMatrix|*::QMatrix{ + preview + ( + #( + "[",[$c._m11,g]," ",[$c._m12,g],"]", + "[",[$c._m21,g]," ",[$c._m22,g],"]", + "[",[$c._dx,g]," ",[$c._dy,g],"]" + ) + ) + children + ( + #( + translation_horizontal_dx: [$c._dx,g], + translation_vertical_dy: [$c._dy,g], + scaling_horizontal_m11: [$c._m11,g], + scaling_vertical_m22: [$c._m22,g], + shearing_horizontal_m21: [$c._m21,g], + shearing_vertical_m12: [$c._m12,g] + ) + ) +} + +;------------------------------------------------------------------------------ +; QPolygon +;------------------------------------------------------------------------------ +QPolygon{ + preview + ( + #( + "[", ((QVector*)(&$c))->d->size, "] (...)" + ) + ) + children + ( + #( + #array + ( + expr: ((QVector*)(&$c))->d->array[$i], + size: ((QVector*)(&$c))->d->size + ) + ) + ) +} + +*::QPolygon{ + preview + ( + #( + "[", (($T1::QVector<$T1::QPoint>*)(&$c))->d->size, "] (...)" + ) + ) + children + ( + #( + #array + ( + expr: (($T1::QVector<$T1::QPoint>*)(&$c))->d->array[$i], + size: (($T1::QVector<$T1::QPoint>*)(&$c))->d->size + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; QPolygonF +;------------------------------------------------------------------------------ +QPolygonF{ + preview + ( + #( + "[", ((QVector*)(&$c))->d->size, "] (...)" + ) + ) + children + ( + #( + #array + ( + expr: ((QVector*)(&$c))->d->array[$i], + size: ((QVector*)(&$c))->d->size + ) + ) + ) +} + +*::QPolygonF{ + preview + ( + #( + "[", (($T1::QVector<$T1::QPointF>*)(&$c))->d->size, "] (...)" + ) + ) + children + ( + #( + #array + ( + expr: (($T1::QVector<$T1::QPointF>*)(&$c))->d->array[$i], + size: (($T1::QVector<$T1::QPointF>*)(&$c))->d->size + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; Nokia Qt 4.x visualizers -------------------------------------------[ end ]-- + +; STLport visualizers +;------------------------------------------------------------------------------ +; stlport::basic_string +;------------------------------------------------------------------------------ +stlp_std::basic_string|stlpx_std::basic_string|stlpmtx_std::basic_string|stlpxmtx_std::basic_string|stlpd_std::priv::_NonDbg_str|stlpdx_std::priv::_NonDbg_str|stlpdmtx_std::priv::_NonDbg_str|stlpdxmtx_std::priv::_NonDbg_str{ + preview + ( + [$c._M_start_of_storage._M_data, s] + ) + + stringview + ( + [$c._M_start_of_storage._M_data, s] + ) + + children + ( + #( + [raw view]: [$c,!], + buffer: [(unsigned int)$c._M_start_of_storage._M_data, x], + length: $c._M_finish - $c._M_start_of_storage._M_data, + capacity: #if($c._M_start_of_storage._M_data == $c._M_buffers._M_static_buf) + ( + $c._DEFAULT_SIZE + ) + #else + ( + $c._M_buffers._M_end_of_storage - $c._M_start_of_storage._M_data + ), + #array + ( + expr: $c._M_start_of_storage._M_data[$i], + size: $c._M_finish - $c._M_start_of_storage._M_data + ) + ) + ) +} + +stlp_std::basic_string|stlp_std::basic_string|stlpx_std::basic_string|stlpx_std::basic_string|stlpmtx_std::basic_string|stlpmtx_std::basic_string|stlpxmtx_std::basic_string|stlpxmtx_std::basic_string|stlpd_std::priv::_NonDbg_str|stlpd_std::priv::_NonDbg_str|stlpdx_std::priv::_NonDbg_str|stlpdx_std::priv::_NonDbg_str|stlpdmtx_std::priv::_NonDbg_str|stlpdmtx_std::priv::_NonDbg_str|stlpdxmtx_std::priv::_NonDbg_str|stlpdxmtx_std::priv::_NonDbg_str{ + preview + ( + [$c._M_start_of_storage._M_data, su] + ) + + stringview + ( + [$c._M_start_of_storage._M_data, su] + ) + + children + ( + #( + [raw view]: [$c,!], + buffer: [(unsigned int)$c._M_start_of_storage._M_data, x], + length: $c._M_finish - $c._M_start_of_storage._M_data, + capacity: #if($c._M_start_of_storage._M_data == $c._M_buffers._M_static_buf) + ( + $c._DEFAULT_SIZE + ) + #else + ( + $c._M_buffers._M_end_of_storage - $c._M_start_of_storage._M_data + ), + #array + ( + expr: $c._M_start_of_storage._M_data[$i], + size: $c._M_finish - $c._M_start_of_storage._M_data + ) + ) + ) +} + +stlpd_std::basic_string<*>|stlpdx_std::basic_string<*>|stlpdmtx_std::basic_string<*>|stlpdxmtx_std::basic_string<*>{ + preview + ( + $c._M_non_dbg_impl + ) + + stringview + ( + $c._M_non_dbg_impl + ) + + children + ( + #( + [raw view]: [$c,!], + string: $c._M_non_dbg_impl + ) + ) +} + +;------------------------------------------------------------------------------ +; stlport::vector +;------------------------------------------------------------------------------ +stlp_std::vector|stlpx_std::vector|stlpmtx_std::vector|stlpxmtx_std::vector|stlpd_std::priv::_NonDbg_vector|stlpdx_std::priv::_NonDbg_vector|stlpdmtx_std::priv::_NonDbg_vector|stlpdxmtx_std::priv::_NonDbg_vector{ + preview + ( + #( + "[", + ($c._M_finish._M_p - $c._M_start._M_p) * sizeof(unsigned int) * 8 + $c._M_finish._M_offset, + "](", + #array + ( + expr : ($c._M_start._M_p[$i / (sizeof(unsigned int) * 8)] >> ($i % (sizeof(unsigned int) * 8))), + size : (($c._M_finish._M_p - $c._M_start._M_p) * sizeof(unsigned int) * 8 + $c._M_finish._M_offset) + ) : (bool)($e & 1), + ")" + ) + ) + children + ( + #( + [raw view]: [$c,!], + buffer : [(unsigned int)$c._M_start._M_p, x], + size : (($c._M_finish._M_p - $c._M_start._M_p) * sizeof(unsigned int) * 8 + $c._M_finish._M_offset), + #array + ( + expr : ($c._M_start._M_p[$i / (sizeof(unsigned int) * 8)] >> ($i % (sizeof(unsigned int) * 8))), + size : (($c._M_finish._M_p - $c._M_start._M_p) * sizeof(unsigned int) * 8 + $c._M_finish._M_offset) + ) : (bool)($e & 1) + ) + ) +} + +stlp_std::priv::_Bit_iter<*>|stlpx_std::priv::_Bit_iter<*>|stlpmtx_std::priv::_Bit_iter<*>|stlpxmtx_std::priv::_Bit_iter<*>|stlpd_std::priv::_Bit_iter<*>|stlpdx_std::priv::_Bit_iter<*>|stlpdmtx_std::priv::::_Bit_iter<*>|stlpdxmtx_std::priv::_Bit_iter<*>{ + preview + ( + #( + (bool) (((*$c._M_p) >> $c._M_offset) & 1) + ) + ) + children + ( + #( + [raw view]: [$c,!], + value : (bool) (((*$c._M_p) >> $c._M_offset) & 1) + ) + ) +} + +stlp_std::vector<*>|stlpx_std::vector<*>|stlpmtx_std::vector<*>|stlpxmtx_std::vector<*>|stlpd_std::priv::_NonDbg_vector<*>|stlpdx_std::priv::_NonDbg_vector<*>|stlpdmtx_std::priv::_NonDbg_vector<*>|stlpdxmtx_std::priv::_NonDbg_vector<*>{ + preview + ( + #( + "[", + $c._M_finish - $c._M_start, + "/", + $c._M_end_of_storage._M_data - $c._M_start, + "](", + #array + ( + expr : ($c._M_start)[$i], + size : $c._M_finish - $c._M_start + ), + ")" + ) + ) + children + ( + #( + [raw view]: [$c,!], + size : $c._M_finish - $c._M_start, + capacity : $c._M_end_of_storage._M_data - $c._M_start, + #array + ( + expr : ($c._M_start)[$i], + size : $c._M_finish - $c._M_start + ) + ) + ) +} + +stlpd_std::vector<*>|stlpdx_std::vector<*>|stlpdmtx_std::vector<*>|stlpdxmtx_std::vector<*>{ + preview + ( + $c._M_non_dbg_impl + ) + children + ( + #( + [raw view] : [$c,!], + vector : $c._M_non_dbg_impl + ) + ) +} + +;------------------------------------------------------------------------------ +; stlport::deque +;------------------------------------------------------------------------------ +stlp_std::deque<*,*>|stlpx_std::deque<*,*>|stlpmtx_std::deque<*,*>|stlpxmtx_std::deque<*,*>|stlpd_std::priv::_NonDbg_deque<*,*>|stlpdx_std::priv::_NonDbg_deque<*,*>|stlpdmtx_std::priv::_NonDbg_deque<*,*>|stlpdxmtx_std::priv::_NonDbg_deque<*,*>{ + preview + ( + #if (((unsigned int)($c._M_start._M_cur + 1) - ((unsigned int)$c._M_start._M_cur)) < _MAX_BYTES) + ( + #( + "[", + (($c._M_finish._M_node - $c._M_start._M_node + 1) * (_MAX_BYTES / sizeof($T1))) - ($c._M_start._M_cur - $c._M_start._M_first) - ($c._M_finish._M_last - $c._M_finish._M_cur), + "/", + ($c._M_finish._M_node - $c._M_start._M_node + 1) * (_MAX_BYTES / sizeof($T1)) - 1, + "](", + #array + ( + expr : *(*($c._M_start._M_node + (($i + ($c._M_start._M_cur - $c._M_start._M_first)) / (_MAX_BYTES / sizeof($T1)))) + (($i + ($c._M_start._M_cur - $c._M_start._M_first)) % (_MAX_BYTES / sizeof($T1)))), + size : (($c._M_finish._M_node - $c._M_start._M_node + 1) * (_MAX_BYTES / sizeof($T1))) - ($c._M_start._M_cur - $c._M_start._M_first) - ($c._M_finish._M_last - $c._M_finish._M_cur) + ), + ")" + ) + ) + #else + ( + #( + "[", + $c._M_finish._M_node - $c._M_start._M_node, + "/", + $c._M_finish._M_node - $c._M_start._M_node, + "](", + #array + ( + expr : **($c._M_start._M_node + $i), + size : $c._M_finish._M_node - $c._M_start._M_node + ), + ")" + ) + ) + ) + children + ( + #if (((unsigned int)($c._M_start._M_cur + 1) - ((unsigned int)$c._M_start._M_cur)) < _MAX_BYTES) + ( + #( + [raw view]: [$c,!], + size : (($c._M_finish._M_node - $c._M_start._M_node + 1) * (_MAX_BYTES / sizeof($T1))) - ($c._M_start._M_cur - $c._M_start._M_first) - ($c._M_finish._M_last - $c._M_finish._M_cur), + capacity : ($c._M_finish._M_node - $c._M_start._M_node + 1) * (_MAX_BYTES / sizeof($T1)) - 1, + front free space : $c._M_start._M_cur - $c._M_start._M_first, + back free space : $c._M_finish._M_last - $c._M_finish._M_cur - 1, + #array + ( + expr : *(*($c._M_start._M_node + (($i + ($c._M_start._M_cur - $c._M_start._M_first)) / (_MAX_BYTES / sizeof($T1)))) + (($i + ($c._M_start._M_cur - $c._M_start._M_first)) % (_MAX_BYTES / sizeof($T1)))), + size : (($c._M_finish._M_node - $c._M_start._M_node + 1) * (_MAX_BYTES / sizeof($T1))) - ($c._M_start._M_cur - $c._M_start._M_first) - ($c._M_finish._M_last - $c._M_finish._M_cur) + ) + ) + ) + #else + ( + #( + [raw view] : [$c,!], + size : $c._M_finish._M_node - $c._M_start._M_node, + capacity : $c._M_finish._M_node - $c._M_start._M_node, + front free space : $c._M_start._M_cur - $c._M_start._M_first, + back free space : $c._M_finish._M_last - $c._M_finish._M_cur - 1, + #array + ( + expr : **($c._M_start._M_node + $i), + size : $c._M_finish._M_node - $c._M_start._M_node + ) + ) + ) + ) +} + +stlp_std::priv::_Deque_iterator<*>|stlpx_std::priv::_Deque_iterator<*>|stlpmtx_std::priv::_Deque_iterator<*>|stlpxmtx_std::priv::_Deque_iterator<*>|stlpd_std::priv::_Deque_iterator<*>|stlpdx_std::priv::_Deque_iterator<*>|stlpdmtx_std::priv::_Deque_iterator<*>|stlpdxmtx_std::priv::_Deque_iterator<*>{ + preview + ( + *($c._M_cur) + ) + children + ( + #( + [raw view] : [$c, !], + ptr : [(unsigned int)($c._M_cur), x], + value : *($c._M_cur) + ) + ) +} + +stlpd_std::deque<*>|stlpdx_std::deque<*>|stlpdmtx_std::deque<*>|stlpdxmtx_std::deque<*>{ + preview + ( + $c._M_non_dbg_impl + ) + children + ( + #( + [raw view] : [$c,!], + deque : $c._M_non_dbg_impl + ) + ) +} + +;------------------------------------------------------------------------------ +; stlport::list +;------------------------------------------------------------------------------ +stlp_std::list<*,*>|stlpx_std::list<*,*>|stlpmtx_std::list<*,*>|stlpxmtx_std::list<*,*>|stlpd_std::priv::_NonDbg_list<*,*>|stlpdx_std::priv::_NonDbg_list<*,*>|stlpdmtx_std::priv::_NonDbg_list<*,*>|stlpdxmtx_std::priv::_NonDbg_list<*,*>{ + preview + ( + #( + "(", + #list + ( + head : $c._M_node._M_data._M_next, + skip : &($c._M_node._M_data), + next : _M_next, + ): #( *($T1*)(&($e) + 1)), + ")" + ) + ) + children + ( + #( + [raw view]: [$c,!], + #list + ( + head : $c._M_node._M_data._M_next, + skip : &($c._M_node._M_data), + next : _M_next, + ): #( *($T1*)(&($e) + 1)) + ) + ) +} + +stlp_std::priv::_List_iterator<*,*>|stlpx_std::priv::_List_iterator<*,*>|stlpmtx_std::priv::_List_iterator<*,*>|stlpxmtx_std::priv::_List_iterator<*,*>|stlpd_std::priv::_List_iterator<*,*>|stlpdx_std::priv::_List_iterator<*,*>|stlpdmtx_std::priv::_List_iterator<*,*>|stlpdxmtx_std::priv::_List_iterator<*,*>{ + preview + ( + #(*($T1 *)($c._M_node + 1)) + ) + children + ( + #( + [raw view] : [$c, !], + ptr : [(unsigned int)($c._M_node + 1), x], + value : *($T1 *)($c._M_node + 1) + ) + ) +} + +stlpd_std::list<*,*>|stlpdx_std::list<*,*>|stlpdmtx_std::list<*,*>|stlpdxmtx_std::list<*,*>{ + preview + ( + $c._M_non_dbg_impl + ) + children + ( + #( + [raw view] : [$c,!], + list : $c._M_non_dbg_impl + ) + ) +} + +;------------------------------------------------------------------------------ +; stlport::slist +;------------------------------------------------------------------------------ +stlp_std::slist<*,*>|stlpx_std::slist<*,*>|stlpmtx_std::slist<*,*>|stlpxmtx_std::slist<*,*>|stlpd_std::priv::_NonDbg_slist<*,*>|stlpdx_std::priv::_NonDbg_slist<*,*>|stlpdmtx_std::priv::_NonDbg_slist<*,*>|stlpdxmtx_std::priv::_NonDbg_slist<*,*>{ + preview + ( + #( + "(", + #list + ( + head : $c._M_head._M_data._M_next, + skip : &($c._M_head._M_data), + next : _M_next, + ): #( *($T1*)(&($e) + 1)), + ")" + ) + ) + children + ( + #( + [raw view]: [$c,!], + #list + ( + head : $c._M_head._M_data._M_next, + skip : &($c._M_head._M_data), + next : _M_next, + ): #( *($T1*)(&($e) + 1)) + ) + ) +} + +stlp_std::priv::_Slist_iterator<*,*>|stlpx_std::priv::_Slist_iterator<*,*>|stlpmtx_std::priv::_Slist_iterator<*,*>|stlpxmtx_std::priv::_Slist_iterator<*,*>|stlpd_std::priv::_Slist_iterator<*,*>|stlpdx_std::priv::_Slist_iterator<*,*>|stlpdmtx_std::priv::_Slist_iterator<*,*>|stlpdxmtx_std::priv::_Slist_iterator<*,*>{ + preview + ( + #(*($T1 *)($c._M_node + 1)) + ) + children + ( + #( + [raw view] : [$c,!], + ptr : [(unsigned int)($c._M_node + 1), x], + value : *($T1 *)($c._M_node + 1) + ) + ) +} + +stlpd_std::slist<*,*>|stlpdx_std::slist<*,*>|stlpdmtx_std::slist<*,*>|stlpdxmtx_std::slist<*,*>{ + preview + ( + $c._M_non_dbg_impl + ) + children + ( + #( + [raw view] : [$c,!], + [slist] : $c._M_non_dbg_impl + ) + ) +} + +;------------------------------------------------------------------------------ +; stlport::pair +;------------------------------------------------------------------------------ +stlp_std::pair<*,*>|stlpx_std::pair<*,*>|stlpmtx_std::pair<*,*>|stlpxmtx_std::pair<*,*>|stlpd_std::pair<*,*>|stlpdx_std::pair<*,*>|stlpdmtx_std::pair<*,*>|stlpdxmtx_std::pair<*,*>{ + preview + ( + #( + "(", + $c.first, + ", ", + $c.second, + ")" + ) + ) +} + +;------------------------------------------------------------------------------ +; stlport::map, stlport::multimap, stlport::set, stlport::multiset +;------------------------------------------------------------------------------ +stlp_std::map<*>|stlpx_std::map<*>|stlpmtx_std::map<*>|stlpxmtx_std::map<*>|stlp_std::multimap<*>|stlpx_std::multimap<*>|stlpmtx_std::multimap<*>|stlpxmtx_std::multimap<*>|stlp_std::set<*>|stlpx_std::set<*>|stlpmtx_std::set<*>|stlpxmtx_std::set<*>|stlp_std::multiset<*>|stlpx_std::multiset<*>|stlpmtx_std::multiset<*>|stlpxmtx_std::multiset<*>{ + preview + ( + #( + "[", + $c._M_t._M_node_count, + "](", + $c._M_t, + ")" + ) + ) + children + ( + #( + [raw view]: [$c,!], + size: [$c._M_t._M_node_count], + tree: $c._M_t + ) + ) +} + +stlpd_std::map<*>|stlpdx_std::map<*>|stlpdmtx_std::map<*>|stlpdxmtx_std::map<*>|stlpd_std::multimap<*>|stlpdx_std::multimap<*>|stlpdmtx_std::multimap<*>|stlpdxmtx_std::multimap<*>|stlpd_std::set<*>|stlpdx_std::set<*>|stlpdmtx_std::set<*>|stlpdxmtx_std::set<*>|stlpd_std::multiset<*>|stlpdx_std::multiset<*>|stlpdmtx_std::multiset<*>|stlpdxmtx_std::multiset<*>{ + preview + ( + #( + "[", + $c._M_t._M_non_dbg_impl._M_node_count, + "](", + $c._M_t._M_non_dbg_impl, + ")" + ) + ) + children + ( + #( + [raw view]: [$c,!], + size: $c._M_t._M_non_dbg_impl._M_node_count, + tree: $c._M_t._M_non_dbg_impl + ) + ) +} + +stlp_std::priv::_Rb_tree<*,*,*,*,*>|stlpx_std::priv::_Rb_tree<*,*,*,*,*>|stlpmtx_std::priv::_Rb_tree<*,*,*,*,*>|stlpxmtx_std::priv::_Rb_tree<*,*,*,*,*>|stlpd_std::priv::_NonDbg_Rb_tree<*,*,*,*,*>|stlpdx_std::priv::_NonDbg_Rb_tree<*,*,*,*,*>|stlpdmtx_std::priv::_NonDbg_Rb_tree<*,*,*,*,*>|stlpdxmtx_std::priv::_NonDbg_Rb_tree<*,*,*,*,*>{ + preview + ( + #tree + ( + head : $c._M_header._M_data._M_parent, + skip : &($c._M_header._M_data), + size : $c._M_node_count, + left : _M_left, + right : _M_right + ): #(*($T3 *)(&($e) + 1)) + ) + children + ( + #( + [raw view]: [$c,!], + #tree + ( + head : $c._M_header._M_data._M_parent, + skip : &($c._M_header._M_data), + size : $c._M_node_count, + left : _M_left, + right : _M_right + ) : #(*($T3 *)(&($e) + 1)) + ) + ) +} + +stlp_std::priv::_Rb_tree_iterator<*,*>|stlpx_std::priv::_Rb_tree_iterator<*,*>|stlpmtx_std::priv::_Rb_tree_iterator<*,*>|stlpxmtx_std::priv::_Rb_tree_iterator<*,*>|stlpd_std::priv::_Rb_tree_iterator<*,*>|stlpdx_std::priv::_Rb_tree_iterator<*,*>|stlpdmtx_std::priv::_Rb_tree_iterator<*,*>|stlpdxmtx_std::priv::_Rb_tree_iterator<*,*>{ + preview + ( + [*($T1*)($c._M_node + 1)] + ) + children + ( + #( + [raw view]: [$c,!], + value: [*($T1*)($c._M_node + 1)], + ptr: [(unsigned int)($c._M_node + 1), x] + ) + ) +} + +;------------------------------------------------------------------------------ +; stlport::hash_map, stlport::hash_multimap, stlport::hash_set, stlport::hash_multiset +; stlport::unordered_map, stlport::unordered_multimap, stlport::unordered_set, stlport::unordered_multiset +;------------------------------------------------------------------------------ +stlp_std::hash_map<*>|stlpx_std::hash_map<*>|stlpmtx_std::hash_map<*>|stlpxmtx_std::hash_map<*>|stlp_std::hash_multimap<*>|stlpx_std::hash_multimap<*>|stlpmtx_std::hash_multimap<*>|stlpxmtx_std::hash_multimap<*>|stlp_std::hash_set<*>|stlpx_std::hash_set<*>|stlpmtx_std::hash_set<*>|stlpxmtx_std::hash_set<*>|stlp_std::hash_multiset<*>|stlpx_std::hash_multiset<*>|stlpmtx_std::hash_multiset<*>|stlpxmtx_std::hash_multiset<*>|stlp_std::tr1::unordered_map<*>|stlpx_std::tr1::unordered_map<*>|stlpmtx_std::tr1::unordered_map<*>|stlpxmtx_std::tr1::unordered_map<*>|stlp_std::tr1::unordered_multimap<*>|stlpx_std::tr1::unordered_multimap<*>|stlpmtx_std::tr1::unordered_multimap<*>|stlpxmtx_std::tr1::unordered_multimap<*>|stlp_std::tr1::unordered_set<*>|stlpx_std::tr1::unordered_set<*>|stlpmtx_std::tr1::unordered_set<*>|stlpxmtx_std::tr1::unordered_set<*>|stlp_std::tr1::unordered_multiset<*>|stlpx_std::tr1::unordered_multiset<*>|stlpmtx_std::tr1::unordered_multiset<*>|stlpxmtx_std::tr1::unordered_multiset<*>{ + preview + ( + #( + "[", + $c._M_ht._M_num_elements, + "]", + $c._M_ht + ) + ) + children + ( + #( + [raw view]: [$c,!], + hashtable: $c._M_ht + ) + ) +} + +stlpd_std::hash_map<*>|stlpdx_std::hash_map<*>|stlpdmtx_std::hash_map<*>|stlpdxmtx_std::hash_map<*>|stlpd_std::hash_multimap<*>|stlpdx_std::hash_multimap<*>|stlpdmtx_std::hash_multimap<*>|stlpdxmtx_std::hash_multimap<*>|stlpd_std::hash_set<*>|stlpdx_std::hash_set<*>|stlpdmtx_std::hash_set<*>|stlpdxmtx_std::hash_set<*>|stlpd_std::hash_multiset<*>|stlpdx_std::hash_multiset<*>|stlpdmtx_std::hash_multiset<*>|stlpdxmtx_std::hash_multiset<*>|stlpd_std::tr1::unordered_map<*>|stlpdx_std::tr1::unordered_map<*>|stlpdmtx_std::tr1::unordered_map<*>|stlpdxmtx_std::tr1::unordered_map<*>|stlpd_std::tr1::unordered_multimap<*>|stlpdx_std::tr1::unordered_multimap<*>|stlpdmtx_std::tr1::unordered_multimap<*>|stlpdxmtx_std::tr1::unordered_multimap<*>|stlpd_std::tr1::unordered_set<*>|stlpdx_std::tr1::unordered_set<*>|stlpdmtx_std::tr1::unordered_set<*>|stlpdxmtx_std::tr1::unordered_set<*>|stlpd_std::tr1::unordered_multiset<*>|stlpdx_std::tr1::unordered_multiset<*>|stlpdmtx_std::tr1::unordered_multiset<*>|stlpdxmtx_std::tr1::unordered_multiset<*>{ + preview + ( + #( + "[", + $c._M_ht._M_non_dbg_impl._M_num_elements, + "]", + $c._M_ht._M_non_dbg_impl + ) + ) + children + ( + #( + [raw view]: [$c,!], + hashtable: $c._M_ht._M_non_dbg_impl + ) + ) +} + +stlp_std::hashtable<*,*>|stlpx_std::hashtable<*,*>|stlpmtx_std::hashtable<*,*>|stlpxmtx_std::hashtable<*,*>|stlpd_std::priv::_NonDbg_hashtable<*,*>|stlpdx_std::priv::_NonDbg_hashtable<*,*>|stlpdmtx_std::priv::_NonDbg_hashtable<*,*>|stlpdxmtx_std::priv::_NonDbg_hashtable<*,*>{ + preview + ( + $c._M_elems + ) + children + ( + #( + [raw view]: [$c,!], + size : $c._M_num_elements, + load factor : (float)$c._M_num_elements / ($c._M_buckets._M_finish - $c._M_buckets._M_start), + max load factor: $c._M_max_load_factor, + buckets : $c._M_buckets, + elements : $c._M_elems + ) + ) +} + +;------------------------------------------------------------------------------ +; stlport::queue, stlport::priority_queue, stlport::stack +;------------------------------------------------------------------------------ +stlp_std::queue<*>|stlpx_std::queue<*>|stlpmtx_std::queue<*>|stlpxmtx_std::queue<*>|stlpd_std::queue<*>|stlpdx_std::queue<*>|stlpdmtx_std::queue<*>|stlpdxmtx_std::queue<*>|stlp_std::priority_queue<*>|stlpx_std::priority_queue<*>|stlpmtx_std::priority_queue<*>|stlpxmtx_std::priority_queue<*>|stlpd_std::priority_queue<*>|stlpdx_std::priority_queue<*>|stlpdmtx_std::priority_queue<*>|stlpdxmtx_std::priority_queue<*>|stlp_std::stack<*>|stlpx_std::stack<*>|stlpmtx_std::stack<*>|stlpxmtx_std::stack<*>|stlpd_std::stack<*>|stlpdx_std::stack<*>|stlpdmtx_std::stack<*>|stlpdxmtx_std::stack<*>{ + preview + ( + $c.c + ) + children + ( + #( + [raw view] : [$c,!], + container : $c.c + ) + ) +} + +;------------------------------------------------------------------------------ +; stlport debug iterator +;------------------------------------------------------------------------------ +stlp_std::priv::_DBG_iter<*>|stlpx_std::priv::_DBG_iter<*>|stlpmtx_std::priv::_DBG_iter<*>|stlpxmtx_std::priv::_DBG_iter<*>|stlpd_std::priv::_DBG_iter<*>|stlpdx_std::priv::_DBG_iter<*>|stlpdmtx_std::priv::_DBG_iter<*>|stlpdxmtx_std::priv::_DBG_iter<*>{ + preview + ( + #if($c._M_owner != 0) + ( + $c._M_iterator + ) + #else + ( + "undefined" + ) + ) + children + ( + #( + #if($c._M_owner != 0) + ( + #( + [raw view] : [$c,!], + [iterator] : $c._M_iterator, + [valid] : [true] + ) + ) + #else + ( + #( + [raw view] : [$c,!], + [valid] : [false] + ) + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; stlport::bitset +; TODO: Fix it, it doesn't work as expected even when adding an enum to the bitset +; class to get access to the bitset static size rather than using $T1. +;------------------------------------------------------------------------------ +stdp_std::bitset<*,*>|stdpx_std::bitset<*,*>|stdpmtx_std::bitset<*,*>|stdpxmtx_std::bitset<*,*>|stdpd_std::bitset<*>|stdpdx_std::bitset<*>|stdpdmtx_std::bitset<*>|stdpdxmtx_std::bitset<*>{ + preview + ( + #( + "[", + $T1, + "](", + #array + ( + expr : ($c._M_w[$i / (sizeof(unsigned long) * 8)] >> ($i % (sizeof(unsigned long) * 8))), + size : $T1 + ) : [($e & 1),d], + ")" + ) + ) + children + ( + #array + ( + expr : ($c._M_w[$i / (sizeof(unsigned long) * 8)] >> ($i % (sizeof(unsigned long) * 8))), + size : $T1 + ) : (bool)($e & 1) + ) +} + +stdp_std::bitset<*>::reference|stdpx_std::bitset<*>::reference|stdpmtx_std::bitset<*>::reference|stdpxmtx_std::bitset<*>::reference|stdpd_std::bitset<*>::reference|stdpdx_std::bitset<*>::reference|stdpdmtx_std::bitset<*>::reference|stdpdxmtx_std::bitset<*>{ + preview + ( + #( + "bitset[", $c._M_bpos, "] = ", + (bool)(*($c._M_wp) >> $c._M_bpos) & 1) + ) + ) +} + +;------------------------------------------------------------------------------ +; stlport::auto_ptr +;------------------------------------------------------------------------------ +stlp_std::auto_ptr<*>|stlpx_std::auto_ptr<*>|stlpmtx_std::auto_ptr<*>|stlpxmtx_std::auto_ptr<*>|stlpd_std::auto_ptr<*>|stlpdx_std::auto_ptr<*>|stlpdmtx_std::auto_ptr<*>|stlpdxmtx_std::auto_ptr<*>{ + preview + ( + #if(($c._M_p) != 0) + ( + [*($T1 *)$c._M_p] + ) + #else + ( + "null" + ) + ) + children + ( + #if(($c._M_p) != 0) + ( + #( + [raw view]: [$c,!], + ptr: [(unsigned int)$c._M_p, x], + value: [*($T1 *)$c._M_p] + ) + ) + #else + ( + #( + [raw view]: [$c,!] + ) + ) + ) +} + +;------------------------------------------------------------------------------ +; stlport::complex +;------------------------------------------------------------------------------ +stlp_std::complex<*>|stlpx_std::complex<*>|stlpmtx_std::complex<*>|stlpxmtx_std::complex<*>|stlpd_std::complex<*>|stlpdx_std::complex<*>|stlpdmtx_std::complex<*>|stlpdxmtx_std::complex<*>{ + children + ( + #( + real: $e._M_re, + imaginary: $e._M_im + ) + ) + preview + ( + #if($e._M_im != 0) + ( + #if ($e._M_re != 0) + ( ; Real and Imaginary components + #if ($e._M_im >= 0) + ( + #($e._M_re,"+i*", $e._M_im) + ) + #else + ( + #($e._M_re,"-i*", -$e._M_im) + ) + ) + #else + ( ; Purely imaginary + #if ($e._M_im >= 0.0) + ( + #("i*", $e._M_im) + ) + #else + ( + #("-i*", -$e._M_im) + ) + ) + ) + #else + ( ; Purely real + $e._M_re + ) + ) +} + +;------------------------------------------------------------------------------ +; stlport::valarray +;------------------------------------------------------------------------------ + +stlp_std::valarray<*>|stlpx_std::valarray<*>|stlpmtx_std::valarray<*>|stlpxmtx_std::valarray<*>|stlpd_std::valarray<*>|stlpdx_std::valarray<*>|stlpdmtx_std::valarray<*>|stlpdxmtx_std::valarray<*>{ + preview + ( + #( + "[", + $c._M_size , + "](", + #array + ( + expr : ($c._M_first)[$i], + size : $c._M_size + ), + ")" + ) + ) + + children + ( + #array + ( + expr : ($c._M_first)[$i], + size : $c._M_size + ) + ) +} + +stlp_std::slice|stlpx_std::slice|stlpmtx_std::slice|stlpxmtx_std::slice|stlpd_std::slice|stlpdx_std::slice|stlpdmtx_std::slice|stlpdxmtx_std::slice{ + preview + ( + #( + "start = ", + $c._M_start, + ", size = ", + $c._M_length, + ", stride = ", + $c._M_stride + ) + ) + children + ( + #( + [raw view] : [$c,!], + start : $c._M_start, + size : $c._M_length, + stride : $c._M_stride + ) + ) +} + +stlp_std::gslice|stlpx_std::gslice|stlpmtx_std::gslice|stlpxmtx_std::gslice|stlpd_std::gslice|stlpdx_std::gslice|stlpdmtx_std::gslice|stlpdxmtx_std::gslice{ + preview + ( + #( + "start = ", + $c._M_start, + ", sizes = ", + $c._M_lengths, + ", strides = ", + $c._M_strides + ) + ) + children + ( + #( + [raw view] : [$c,!], + start : $c._M_start, + sizes : $c._M_lengths, + strides : $c._M_strides + ) + ) +} + +; This section lets you define your own errors for the HRESULT display. +; You need to list the error code in unsigned decimal, followed by the message. +; Changes will take effect the next time you redisplay the variable. + +[hresult] +;1234=my custom error code + From fc8be41ad1bcd50b36353171b8a4b79a163408f2 Mon Sep 17 00:00:00 2001 From: kervala Date: Tue, 24 May 2011 20:25:03 +0200 Subject: [PATCH 043/118] Changed: Added luabindd as luabind debug library name --- code/CMakeModules/FindLuabind.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/CMakeModules/FindLuabind.cmake b/code/CMakeModules/FindLuabind.cmake index 75dfbd73f..c94a61e30 100644 --- a/code/CMakeModules/FindLuabind.cmake +++ b/code/CMakeModules/FindLuabind.cmake @@ -22,7 +22,7 @@ FIND_PATH(LUABIND_INCLUDE_DIR ) SET(LIBRARY_NAME_RELEASE luabind libluabind) -SET(LIBRARY_NAME_DEBUG luabind_d libluabind_d libluabindd) +SET(LIBRARY_NAME_DEBUG luabind_d luabindd libluabind_d libluabindd) IF(WITH_STLPORT) SET(LIBRARY_NAME_RELEASE luabind_stlport ${LIBRARY_NAME_RELEASE}) From 3e5290add717825c2b0ff3f57959befbab26ad34 Mon Sep 17 00:00:00 2001 From: kervala Date: Tue, 24 May 2011 20:25:39 +0200 Subject: [PATCH 044/118] Changed: Minor changes in STLport CMake module --- code/CMakeModules/FindSTLport.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/CMakeModules/FindSTLport.cmake b/code/CMakeModules/FindSTLport.cmake index a235d42f3..22e0745ba 100644 --- a/code/CMakeModules/FindSTLport.cmake +++ b/code/CMakeModules/FindSTLport.cmake @@ -71,9 +71,9 @@ IF(STLPORT_INCLUDE_DIR) IF(STLPORT_LIBRARY_RELEASE) SET(STLPORT_FOUND TRUE) - SET(STLPORT_LIBRARIES "optimized;${STLPORT_LIBRARY_RELEASE}") + SET(STLPORT_LIBRARIES ${STLPORT_LIBRARY_RELEASE}) IF(STLPORT_LIBRARY_DEBUG) - SET(STLPORT_LIBRARIES "${STLPORT_LIBRARIES};debug;${STLPORT_LIBRARY_DEBUG}") + SET(STLPORT_LIBRARIES optimized ${STLPORT_LIBRARIES} debug ${STLPORT_LIBRARY_DEBUG}) ENDIF(STLPORT_LIBRARY_DEBUG) ENDIF(STLPORT_LIBRARY_RELEASE) ENDIF(STLPORT_INCLUDE_DIR) From 1c7d8571d7c0e04dd886560ead3aa0fcc730e645 Mon Sep 17 00:00:00 2001 From: rti Date: Wed, 25 May 2011 16:52:52 +0200 Subject: [PATCH 045/118] Fixed: crash when using SelectCharacter = [0,4] (thanks ace) --- code/ryzom/client/src/interface_v3/interface_manager.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/ryzom/client/src/interface_v3/interface_manager.cpp b/code/ryzom/client/src/interface_v3/interface_manager.cpp index 45514f3c5..478da960b 100644 --- a/code/ryzom/client/src/interface_v3/interface_manager.cpp +++ b/code/ryzom/client/src/interface_v3/interface_manager.cpp @@ -524,12 +524,12 @@ void CInterfaceManager::initOutGame() ActionsContext.addActionsManager(&Actions, ""); ActionsContext.addActionsManager(&EditActions, RZ_CATEGORY_EDIT); - - if (ClientCfg.SelectCharacter != -1) return; - // Init LUA Scripting initLUA(); + if (ClientCfg.SelectCharacter != -1) + return; + { if (SoundMngr != NULL) { From 04ad41f4a7017009ed7fa0851cdee90240adfe41 Mon Sep 17 00:00:00 2001 From: rti Date: Wed, 25 May 2011 19:28:18 +0200 Subject: [PATCH 046/118] Added: Error message when building OVQT with WITH_STATIC on UNIX --- code/nel/tools/3d/object_viewer_qt/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/nel/tools/3d/object_viewer_qt/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/CMakeLists.txt index 9341954ab..11196091e 100644 --- a/code/nel/tools/3d/object_viewer_qt/CMakeLists.txt +++ b/code/nel/tools/3d/object_viewer_qt/CMakeLists.txt @@ -8,6 +8,10 @@ # This tells the application(s) where to fidn the installed data. ADD_DEFINITIONS(-DDATA_DIR="\\"${NL_SHARE_PREFIX}/object_viewer_qt/\\"") +IF(UNIX AND WITH_STATIC) + MESSAGE(FATAL_ERROR "OVQT does not work with static NeL builds on Unix atm.") +ENDIF() + ADD_SUBDIRECTORY(src) INSTALL(DIRECTORY data/ From 1721bc51d2f1d21da12cb5b24ca01134dcb7b491 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Wed, 25 May 2011 21:22:10 +0300 Subject: [PATCH 047/118] Added: #1301 Added initial basic shell of Landscape editor plugin. --- .../src/plugins/CMakeLists.txt | 1 + .../plugins/landscape_editor/CMakeLists.txt | 48 +++++++ .../icons/ic_nel_landscape_item.png | Bin 0 -> 56924 bytes .../icons/ic_nel_landscape_settings.png | Bin 0 -> 30656 bytes .../icons/ic_nel_world_editor.png | Bin 0 -> 44031 bytes .../landscape_editor/icons/ic_nel_zone.png | Bin 0 -> 47312 bytes .../landscape_editor/icons/ic_nel_zonel.png | Bin 0 -> 57867 bytes .../landscape_editor/landscape_editor.qrc | 9 ++ .../landscape_editor_constants.h | 37 ++++++ .../landscape_editor_global.h | 30 +++++ .../landscape_editor_plugin.cpp | 118 ++++++++++++++++++ .../landscape_editor_plugin.h | 103 +++++++++++++++ .../landscape_editor_window.cpp | 65 ++++++++++ .../landscape_editor_window.h | 49 ++++++++ .../landscape_editor_window.ui | 43 +++++++ 15 files changed, 503 insertions(+) create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/CMakeLists.txt create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/icons/ic_nel_landscape_item.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/icons/ic_nel_landscape_settings.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/icons/ic_nel_world_editor.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/icons/ic_nel_zone.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/icons/ic_nel_zonel.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor.qrc create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_constants.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_global.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_window.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_window.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_window.ui 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 d5a792acd..7da567023 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,6 +1,7 @@ ADD_SUBDIRECTORY(core) ADD_SUBDIRECTORY(example) ADD_SUBDIRECTORY(ovqt_sheet_builder) +ADD_SUBDIRECTORY(landscape_editor) ADD_SUBDIRECTORY(log) ADD_SUBDIRECTORY(disp_sheet_id) ADD_SUBDIRECTORY(object_viewer) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/CMakeLists.txt new file mode 100644 index 000000000..3b6a61c5e --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/CMakeLists.txt @@ -0,0 +1,48 @@ +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_PLUGIN_LANDSCAPE_EDITOR_HDR landscape_editor_plugin.h + landscape_editor_window.h +) + +SET(OVQT_PLUGIN_LANDSCAPE_EDITOR_UIS landscape_editor_window.ui +) + +SET(OVQT_PLUGIN_LANDSCAPE_EDITOR_RCS landscape_editor.qrc) + +SET(QT_USE_QTGUI TRUE) +SET(QT_USE_QTOPENGL TRUE) + +QT4_ADD_RESOURCES(OVQT_PLUGIN_LANDSCAPE_EDITOR_RC_SRCS ${OVQT_PLUGIN_LANDSCAPE_EDITOR_RCS}) +QT4_WRAP_CPP(OVQT_PLUGIN_LANDSCAPE_EDITOR_MOC_SRC ${OVQT_PLUGIN_LANDSCAPE_EDITOR_HDR}) +QT4_WRAP_UI(OVQT_PLUGIN_LANDSCAPE_EDITOR_UI_HDRS ${OVQT_PLUGIN_LANDSCAPE_EDITOR_UIS}) + +SOURCE_GROUP(QtResources FILES ${OVQT_PLUGIN_LANDSCAPE_EDITOR_UIS}) +SOURCE_GROUP(QtGeneratedUiHdr FILES ${OVQT_PLUGIN_LANDSCAPE_EDITOR_UI_HDRS}) +SOURCE_GROUP(QtGeneratedMocQrcSrc FILES ${OVQT_PLUGIN_LANDSCAPE_EDITOR_MOC_SRC} OVQT_PLUGIN_LANDSCAPE_EDITOR_RC_SRCS) +SOURCE_GROUP("Landscape Editor Plugin" FILES ${SRC}) +SOURCE_GROUP("OVQT Extension System" FILES ${OVQT_EXT_SYS_SRC}) + +ADD_LIBRARY(ovqt_plugin_landscape_editor MODULE ${SRC} + ${OVQT_PLUGIN_LANDSCAPE_EDITOR_MOC_SRC} + ${OVQT_EXT_SYS_SRC} + ${OVQT_PLUGIN_LANDSCAPE_EDITOR_UI_HDRS} + ${OVQT_PLUGIN_LANDSCAPE_EDITOR_RC_SRCS}) + +TARGET_LINK_LIBRARIES(ovqt_plugin_landscape_editor ovqt_plugin_core nelmisc nel3d ${QT_LIBRARIES} ${QT_QTOPENGL_LIBRARY}) + +NL_DEFAULT_PROPS(ovqt_plugin_landscape_editor "NeL, Tools, 3D: Object Viewer Qt Plugin: Landscape Editor") +NL_ADD_RUNTIME_FLAGS(ovqt_plugin_landscape_editor) +NL_ADD_LIB_SUFFIX(ovqt_plugin_landscape_editor) + +ADD_DEFINITIONS(-DLANDSCAPE_EDITOR_LIBRARY ${LIBXML2_DEFINITIONS} -DQT_PLUGIN -DQT_SHARED ${QT_DEFINITIONS}) + +INSTALL(TARGETS ovqt_plugin_landscape_editor LIBRARY DESTINATION lib RUNTIME DESTINATION bin ARCHIVE DESTINATION lib COMPONENT tools3d) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/icons/ic_nel_landscape_item.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/icons/ic_nel_landscape_item.png new file mode 100644 index 0000000000000000000000000000000000000000..7a51400b39aec9a48b23f573cd091693466b80ce GIT binary patch literal 56924 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 literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/icons/ic_nel_landscape_settings.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/icons/ic_nel_landscape_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..4197f7f974481968f968fd3e9267a5fd7b84d4db GIT binary patch literal 30656 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 literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/icons/ic_nel_world_editor.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/icons/ic_nel_world_editor.png new file mode 100644 index 0000000000000000000000000000000000000000..d41f64e2fa43da9d64f9b528cc173593d4a94c59 GIT binary patch literal 44031 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 GHST}F+s82g literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/icons/ic_nel_zone.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/icons/ic_nel_zone.png new file mode 100644 index 0000000000000000000000000000000000000000..73be2752843040e6e3c0736b03eb3990210a9dc8 GIT binary patch literal 47312 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 b!8cqqH?6*Ah8^bs;iq%o@Lq*FD)RpT^Q{UA literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/icons/ic_nel_zonel.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/icons/ic_nel_zonel.png new file mode 100644 index 0000000000000000000000000000000000000000..40f75828b8f40646b66b9bb2e0fc8e831b629b64 GIT binary patch literal 57867 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 ZK*BeDhjmq-TLANCc+FJ5;;K{B{{a=o&Qt&Z literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor.qrc b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor.qrc new file mode 100644 index 000000000..5dba9074b --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor.qrc @@ -0,0 +1,9 @@ + + + icons/ic_nel_landscape_item.png + icons/ic_nel_landscape_settings.png + icons/ic_nel_world_editor.png + icons/ic_nel_zone.png + icons/ic_nel_zonel.png + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_constants.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_constants.h new file mode 100644 index 000000000..52775f4c4 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_constants.h @@ -0,0 +1,37 @@ +// 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 LANDSCAPE_EDITOR_CONSTANTS_H +#define LANDSCAPE_EDITOR_CONSTANTS_H + +namespace LandscapeEditor +{ +namespace Constants +{ +const char * const LANDSCAPE_EDITOR_PLUGIN = "LandscapeEditor"; + +//settings +const char * const LANDSCAPE_EDITOR_SECTION = "LandscapeEditor"; + +//resources +const char * const ICON_LANDSCAPE_ITEM = ":/icons/ic_nel_landscape_item.png"; + + +} // namespace Constants +} // namespace LandscapeEditor + +#endif // LANDSCAPE_EDITOR_CONSTANTS_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_global.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_global.h new file mode 100644 index 000000000..167c8e24f --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_global.h @@ -0,0 +1,30 @@ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2011 Dzmitry Kamiahin +// Parts by Nokia Corporation (qt-info@nokia.com) Copyright (C) 2009. +// +// 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 LANDSCAPE_EDITOR_GLOBAL_H +#define LANDSCAPE_EDITOR_GLOBAL_H + +#include + +#if defined(LANDSCAPE_EDITOR_LIBRARY) +# define LANDSCAPE_EDITOR_EXPORT Q_DECL_EXPORT +#else +# define LANDSCAPE_EDITOR_EXPORT Q_DECL_IMPORT +#endif + +#endif // LANDSCAPE_EDITOR_GLOBAL_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.cpp new file mode 100644 index 000000000..2c51a5d68 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.cpp @@ -0,0 +1,118 @@ +// 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 "landscape_editor_plugin.h" +#include "landscape_editor_window.h" + +#include "../core/icore.h" +#include "../core/core_constants.h" + +// NeL includes +#include "nel/misc/debug.h" + +// Qt includes +#include + +namespace LandscapeEditor +{ + +LandscapeEditorPlugin::~LandscapeEditorPlugin() +{ + Q_FOREACH(QObject *obj, m_autoReleaseObjects) + { + m_plugMan->removeObject(obj); + } + qDeleteAll(m_autoReleaseObjects); + m_autoReleaseObjects.clear(); +} + +bool LandscapeEditorPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString) +{ + Q_UNUSED(errorString); + m_plugMan = pluginManager; + + addAutoReleasedObject(new LandscapeEditorContext(this)); + return true; +} + +void LandscapeEditorPlugin::extensionsInitialized() +{ +} + +void LandscapeEditorPlugin::shutdown() +{ +} + +void LandscapeEditorPlugin::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); +} + +QString LandscapeEditorPlugin::name() const +{ + return tr("LandscapeEditor"); +} + +QString LandscapeEditorPlugin::version() const +{ + return "0.0.1"; +} + +QString LandscapeEditorPlugin::vendor() const +{ + return "GSoC2011_dnk-88"; +} + +QString LandscapeEditorPlugin::description() const +{ + return "Landscape editor ovqt plugin."; +} + +QStringList LandscapeEditorPlugin::dependencies() const +{ + QStringList list; + list.append(Core::Constants::OVQT_CORE_PLUGIN); + return list; +} + +void LandscapeEditorPlugin::addAutoReleasedObject(QObject *obj) +{ + m_plugMan->addObject(obj); + m_autoReleaseObjects.prepend(obj); +} + +LandscapeEditorContext::LandscapeEditorContext(QObject *parent) + : IContext(parent), + m_landEditorWindow(0) +{ + m_landEditorWindow = new LandscapeEditorWindow(); +} + +QWidget *LandscapeEditorContext::widget() +{ + return m_landEditorWindow; +} + +} + +Q_EXPORT_PLUGIN(LandscapeEditor::LandscapeEditorPlugin) \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.h new file mode 100644 index 000000000..3b7df3777 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.h @@ -0,0 +1,103 @@ +// 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 LANDSCAPE_EDITOR_PLUGIN_H +#define LANDSCAPE_EDITOR_PLUGIN_H + +// Project includes +#include "landscape_editor_constants.h" +#include "../../extension_system/iplugin.h" +#include "../core/icontext.h" + +// NeL includes +#include "nel/misc/app_context.h" + +// Qt includes +#include +#include + +namespace NLMISC +{ +class CLibraryContext; +} + +namespace ExtensionSystem +{ +class IPluginSpec; +} + +namespace LandscapeEditor +{ +class LandscapeEditorWindow; + +class LandscapeEditorPlugin : public QObject, public ExtensionSystem::IPlugin +{ + Q_OBJECT + Q_INTERFACES(ExtensionSystem::IPlugin) +public: + + virtual ~LandscapeEditorPlugin(); + + 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: + NLMISC::CLibraryContext *m_libContext; + +private: + ExtensionSystem::IPluginManager *m_plugMan; + QList m_autoReleaseObjects; +}; + +class LandscapeEditorContext: public Core::IContext +{ + Q_OBJECT +public: + LandscapeEditorContext(QObject *parent = 0); + virtual ~LandscapeEditorContext() {} + + virtual QString id() const + { + return QLatin1String("LandscapeEditorContext"); + } + virtual QString trName() const + { + return tr("LandscapeEditor"); + } + virtual QIcon icon() const + { + return QIcon(); + } + virtual QWidget *widget(); + + LandscapeEditorWindow *m_landEditorWindow; +}; + +} // namespace LandscapeEditor + +#endif // LANDSCAPE_EDITOR_PLUGIN_H 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 new file mode 100644 index 000000000..1588f6252 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_window.cpp @@ -0,0 +1,65 @@ +// 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 "landscape_editor_window.h" +#include "landscape_editor_constants.h" + +#include "../core/icore.h" +#include "../core/imenu_manager.h" +#include "../core/core_constants.h" + +// Qt includes +#include + +namespace LandscapeEditor +{ + +LandscapeEditorWindow::LandscapeEditorWindow(QWidget *parent) + : QMainWindow(parent) +{ + m_ui.setupUi(this); + createMenus(); +// readSettings(); +} + +LandscapeEditorWindow::~LandscapeEditorWindow() +{ +// writeSettings(); +} + +void LandscapeEditorWindow::createMenus() +{ + Core::IMenuManager *menuManager = Core::ICore::instance()->menuManager(); +} + +void LandscapeEditorWindow::readSettings() +{ + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(Constants::LANDSCAPE_EDITOR_SECTION); + settings->endGroup(); +} + +void LandscapeEditorWindow::writeSettings() +{ + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(Constants::LANDSCAPE_EDITOR_SECTION); + settings->endGroup(); + settings->sync(); +} + +} /* namespace LandscapeEditor */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_window.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_window.h new file mode 100644 index 000000000..0af41961f --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_window.h @@ -0,0 +1,49 @@ +// 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 LANDSCAPE_EDITOR_WINDOW_H +#define LANDSCAPE_EDITOR_WINDOW_H + +#include "ui_landscape_editor_window.h" + +// Qt includes + +namespace LandscapeEditor +{ + +class LandscapeEditorWindow: public QMainWindow +{ + Q_OBJECT + +public: + LandscapeEditorWindow(QWidget *parent = 0); + ~LandscapeEditorWindow(); + +Q_SIGNALS: +public Q_SLOTS: +private Q_SLOTS: +private: + void createMenus(); + void readSettings(); + void writeSettings(); + + Ui::LandscapeEditorWindow m_ui; +}; /* class LandscapeEditorWindow */ + +} /* namespace LandscapeEditor */ + +#endif // LANDSCAPE_EDITOR_WINDOW_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_window.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_window.ui new file mode 100644 index 000000000..5d9606ddf --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_window.ui @@ -0,0 +1,43 @@ + + + LandscapeEditorWindow + + + + 0 + 0 + 800 + 600 + + + + MainWindow + + + + :/icons/ic_nel_landscape_item.png:/icons/ic_nel_landscape_item.png + + + + + + + + + + + toolBar + + + TopToolBarArea + + + false + + + + + + + + From 3c49ee36e965e052cfafec8ea2bce533aff07530 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Thu, 26 May 2011 13:19:38 +0300 Subject: [PATCH 048/118] Added: #1193 Added recursive search paths settings page. --- .../src/plugins/core/core_plugin.cpp | 4 ++- .../core/search_paths_settings_page.cpp | 31 ++++++++++++++----- .../plugins/core/search_paths_settings_page.h | 3 +- 3 files changed, 29 insertions(+), 9 deletions(-) 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 6cb58ba67..468c79700 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 @@ -61,12 +61,14 @@ bool CorePlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QStr bool success = m_mainWindow->initialize(errorString); GeneralSettingsPage *generalSettings = new GeneralSettingsPage(this); - CSearchPathsSettingsPage *searchPathPage = new CSearchPathsSettingsPage(this); + CSearchPathsSettingsPage *searchPathPage = new CSearchPathsSettingsPage(false, this); + CSearchPathsSettingsPage *recureseSearchPathPage = new CSearchPathsSettingsPage(true, this); generalSettings->applyGeneralSettings(); searchPathPage->applySearchPaths(); addAutoReleasedObject(generalSettings); addAutoReleasedObject(searchPathPage); + addAutoReleasedObject(recureseSearchPathPage); return success; } 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 94ebec8d1..8238ef6ff 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,8 +33,9 @@ namespace Core QString lastDir = "."; -CSearchPathsSettingsPage::CSearchPathsSettingsPage(QObject *parent) +CSearchPathsSettingsPage::CSearchPathsSettingsPage(bool recurse, QObject *parent) : IOptionsPage(parent), + m_recurse(recurse), m_page(0) { } @@ -45,12 +46,18 @@ CSearchPathsSettingsPage::~CSearchPathsSettingsPage() QString CSearchPathsSettingsPage::id() const { - return QLatin1String("search_paths"); + if (m_recurse) + return QLatin1String("search_recurse_paths"); + else + return QLatin1String("search_paths"); } QString CSearchPathsSettingsPage::trName() const { - return tr("Search Paths"); + if (m_recurse) + return tr("Search Recurse Paths"); + else + return tr("Search Paths"); } QString CSearchPathsSettingsPage::category() const @@ -95,7 +102,11 @@ void CSearchPathsSettingsPage::applySearchPaths() QStringList paths, remapExt; QSettings *settings = Core::ICore::instance()->settings(); settings->beginGroup(Core::Constants::DATA_PATH_SECTION); - paths = settings->value(Core::Constants::SEARCH_PATHS).toStringList(); + if (m_recurse) + paths = settings->value(Core::Constants::RECURSIVE_SEARCH_PATHS).toStringList(); + else + paths = settings->value(Core::Constants::SEARCH_PATHS).toStringList(); + remapExt = settings->value(Core::Constants::REMAP_EXTENSIONS).toStringList(); settings->endGroup(); @@ -104,7 +115,7 @@ void CSearchPathsSettingsPage::applySearchPaths() Q_FOREACH(QString path, paths) { - NLMISC::CPath::addSearchPath(path.toStdString(), false, false); + NLMISC::CPath::addSearchPath(path.toStdString(), m_recurse, false); } } @@ -159,7 +170,10 @@ void CSearchPathsSettingsPage::readSettings() QStringList paths; QSettings *settings = Core::ICore::instance()->settings(); settings->beginGroup(Core::Constants::DATA_PATH_SECTION); - paths = settings->value(Core::Constants::SEARCH_PATHS).toStringList(); + if (m_recurse) + paths = settings->value(Core::Constants::RECURSIVE_SEARCH_PATHS).toStringList(); + else + paths = settings->value(Core::Constants::SEARCH_PATHS).toStringList(); settings->endGroup(); Q_FOREACH(QString path, paths) { @@ -178,7 +192,10 @@ void CSearchPathsSettingsPage::writeSettings() QSettings *settings = Core::ICore::instance()->settings(); settings->beginGroup(Core::Constants::DATA_PATH_SECTION); - settings->setValue(Core::Constants::SEARCH_PATHS, paths); + if (m_recurse) + paths = settings->value(Core::Constants::RECURSIVE_SEARCH_PATHS).toStringList(); + else + paths = settings->value(Core::Constants::SEARCH_PATHS).toStringList(); settings->endGroup(); } 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 90eab513a..fc8e6003c 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 @@ -37,7 +37,7 @@ class CSearchPathsSettingsPage : public Core::IOptionsPage Q_OBJECT public: - CSearchPathsSettingsPage(QObject *parent = 0); + explicit CSearchPathsSettingsPage(bool recurse, QObject *parent = 0); ~CSearchPathsSettingsPage(); QString id() const; @@ -63,6 +63,7 @@ private: void writeSettings(); void checkEnabledButton(); + bool m_recurse; QWidget *m_page; Ui::CSearchPathsSettingsPage m_ui; }; From b15546dd95d426cb3c7cd7a72ad9d462040e74e9 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Thu, 26 May 2011 13:45:24 +0300 Subject: [PATCH 049/118] Fixed: #1193 Correct save recursive search paths. --- .../3d/object_viewer_qt/src/plugins/core/core_plugin.cpp | 1 + .../src/plugins/core/search_paths_settings_page.cpp | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) 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 468c79700..92e776068 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 @@ -66,6 +66,7 @@ bool CorePlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QStr generalSettings->applyGeneralSettings(); searchPathPage->applySearchPaths(); + recureseSearchPathPage->applySearchPaths(); addAutoReleasedObject(generalSettings); addAutoReleasedObject(searchPathPage); addAutoReleasedObject(recureseSearchPathPage); 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 8238ef6ff..2d7e7a24f 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 @@ -193,10 +193,11 @@ void CSearchPathsSettingsPage::writeSettings() QSettings *settings = Core::ICore::instance()->settings(); settings->beginGroup(Core::Constants::DATA_PATH_SECTION); if (m_recurse) - paths = settings->value(Core::Constants::RECURSIVE_SEARCH_PATHS).toStringList(); + settings->setValue(Core::Constants::RECURSIVE_SEARCH_PATHS, paths); else - paths = settings->value(Core::Constants::SEARCH_PATHS).toStringList(); + settings->setValue(Core::Constants::SEARCH_PATHS, paths); settings->endGroup(); + settings->sync(); } void CSearchPathsSettingsPage::checkEnabledButton() From f5e72a4da79d99485bbcbb44f1070f0f50b34111 Mon Sep 17 00:00:00 2001 From: kervala Date: Thu, 26 May 2011 14:14:29 +0200 Subject: [PATCH 050/118] Changed: Merge changes from next patch --- code/nel/include/nel/misc/sha1.h | 3 ++ code/nel/src/misc/sha1.cpp | 71 ++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/code/nel/include/nel/misc/sha1.h b/code/nel/include/nel/misc/sha1.h index 6a32d47e3..d0bee0cd9 100644 --- a/code/nel/include/nel/misc/sha1.h +++ b/code/nel/include/nel/misc/sha1.h @@ -105,4 +105,7 @@ CHashKey getSHA1(const std::string &filename, bool forcePath = false); // This function get a buffer with size and returns his SHA hash key CHashKey getSHA1(const uint8 *buffer, uint32 size); +// This function get a buffer and key with size and returns his HMAC-SHA1 hash key +CHashKey getHMacSHA1(const uint8 *text, uint32 text_len, const uint8 *key, uint32 key_len); + #endif // NL_SHA1_H diff --git a/code/nel/src/misc/sha1.cpp b/code/nel/src/misc/sha1.cpp index bb375a928..cb262ce9b 100644 --- a/code/nel/src/misc/sha1.cpp +++ b/code/nel/src/misc/sha1.cpp @@ -187,6 +187,77 @@ CHashKey getSHA1(const string &filename, bool forcePath) return hk; } +/* +* +* HMAC = hash( (Key ^ 0x5c) .. hash( (Key ^0x36) .. Message ) ) +* +*/ + +CHashKey getHMacSHA1(const uint8 *text, uint32 text_len, const uint8 *key, uint32 key_len) +{ + SHA1Context sha; + + uint8_t SHA1_Key[64]; + uint8_t SHA1_Key1[20]; + uint8_t SHA1_Key2[20]; + + string buffer1; + string buffer2; + + // Init some vars + for (uint i = 0; i < 64; i++) + SHA1_Key[i] = 0; + + // If lenght of key > 64 use sha1 hash + if (key_len > 64) { + uint8_t SHA1_Key0[20]; + SHA1Reset(&sha); + SHA1Input(&sha, (const uint8_t*)key, key_len); + SHA1Result(&sha, SHA1_Key0); + CHashKey hk0 (SHA1_Key0); + for (uint i = 0; i < 20; i++) + SHA1_Key[i] = hk0.HashKeyString[i]; + } else { + for (uint i = 0; i < key_len; i++) + SHA1_Key[i] = key[i]; + } + + // Do 0x36 XOR Key + for (uint i = 0; i < 64; i++) + buffer1 += 0x36 ^ SHA1_Key[i]; + + // Append text + for (uint i = 0; i < text_len; i++) + buffer1 += text[i]; + + // Get hash + SHA1Reset(&sha); + SHA1Input(&sha, (const uint8_t*)buffer1.c_str(), buffer1.size()); + SHA1Result(&sha, SHA1_Key1); + CHashKey hk1 (SHA1_Key1); + + // Do 0x5c XOR Key + for (uint i = 0; i < 64; i++) + buffer2 += 0x5c ^ SHA1_Key[i]; + + // Append previous hash + for (uint i = 0; i < 20; i++) + buffer2 += hk1.HashKeyString[i]; + + // Get new hash + SHA1Reset(&sha); + SHA1Input(&sha, (const uint8_t*)buffer2.c_str(), buffer2.size()); + SHA1Result(&sha, SHA1_Key2); + CHashKey hk (SHA1_Key2); + + return hk; +} + + +#ifdef _MFC_VER + #pragma runtime_checks( "", off ) +#endif + /* * Define the SHA1 circular left shift macro */ From 28279644799479a754e5359b7e31d49eaf700c8a Mon Sep 17 00:00:00 2001 From: kervala Date: Thu, 26 May 2011 14:16:13 +0200 Subject: [PATCH 051/118] Changed: Merge changes from next patch --- code/ryzom/common/src/game_share/action_nature.cpp | 1 + code/ryzom/common/src/game_share/action_nature.h | 1 + code/ryzom/common/src/game_share/magic_fx.h | 3 +++ 3 files changed, 5 insertions(+) diff --git a/code/ryzom/common/src/game_share/action_nature.cpp b/code/ryzom/common/src/game_share/action_nature.cpp index 04d8fc132..456cfcbc1 100644 --- a/code/ryzom/common/src/game_share/action_nature.cpp +++ b/code/ryzom/common/src/game_share/action_nature.cpp @@ -38,6 +38,7 @@ namespace ACTNATURE NL_STRING_CONVERSION_TABLE_ENTRY(DODGE) NL_STRING_CONVERSION_TABLE_ENTRY(PARRY) NL_STRING_CONVERSION_TABLE_ENTRY(SHIELD_USE) + NL_STRING_CONVERSION_TABLE_ENTRY(RECHARGE) NL_END_STRING_CONVERSION_TABLE(TActionNature, ActionNatureConversion, UNKNOWN) diff --git a/code/ryzom/common/src/game_share/action_nature.h b/code/ryzom/common/src/game_share/action_nature.h index 36494b1ff..333656101 100644 --- a/code/ryzom/common/src/game_share/action_nature.h +++ b/code/ryzom/common/src/game_share/action_nature.h @@ -35,6 +35,7 @@ namespace ACTNATURE DODGE, PARRY, SHIELD_USE, + RECHARGE, NEUTRAL, //only for multi effect on spell,progression consider it as OFFENSIVE_MAGIC diff --git a/code/ryzom/common/src/game_share/magic_fx.h b/code/ryzom/common/src/game_share/magic_fx.h index df1d927ad..1d1df3bc4 100644 --- a/code/ryzom/common/src/game_share/magic_fx.h +++ b/code/ryzom/common/src/game_share/magic_fx.h @@ -133,6 +133,9 @@ namespace MAGICFX WaterWall = 11, ThornWall = 12, LightningWall = 13, + OtherFireWall = 14, + TeleportKami = 15, // No effect aura + TeleportKara = 16, // No effect aura }; } From db6f3defa228376c346e6ebd97eafda89c9ee09f Mon Sep 17 00:00:00 2001 From: kervala Date: Thu, 26 May 2011 14:33:04 +0200 Subject: [PATCH 052/118] Changed: Merge changes from next patch --- code/ryzom/client/src/attached_fx.h | 4 + code/ryzom/client/src/character_cl.cpp | 53 ++++- code/ryzom/client/src/character_cl.h | 1 + code/ryzom/client/src/client_chat_manager.cpp | 5 + code/ryzom/client/src/commands.cpp | 24 +++ code/ryzom/client/src/cursor_functions.cpp | 4 +- code/ryzom/client/src/init.cpp | 2 +- .../src/interface_v3/action_handler_item.cpp | 2 +- .../interface_v3/action_handler_phrase.cpp | 27 ++- .../client/src/interface_v3/chat_filter.cpp | 2 +- .../client/src/interface_v3/chat_window.cpp | 19 +- .../client/src/interface_v3/chat_window.h | 2 +- .../src/interface_v3/ctrl_base_button.h | 3 +- .../client/src/interface_v3/ctrl_button.cpp | 14 +- .../client/src/interface_v3/ctrl_button.h | 2 + .../client/src/interface_v3/group_editbox.cpp | 81 ++++++- .../client/src/interface_v3/group_editbox.h | 5 +- .../client/src/interface_v3/group_html.cpp | 201 +++++++++++++++++- .../client/src/interface_v3/group_html.h | 17 ++ .../src/interface_v3/group_quick_help.cpp | 7 +- .../src/interface_v3/interface_element.h | 5 + .../interface_v3/item_consumable_effect.cpp | 82 +++++++ .../ryzom/client/src/interface_v3/lua_ihm.cpp | 25 +++ code/ryzom/client/src/interface_v3/lua_ihm.h | 1 + .../src/interface_v3/people_interraction.cpp | 8 +- .../client/src/interface_v3/people_list.cpp | 14 +- .../client/src/interface_v3/people_list.h | 2 +- .../src/interface_v3/sphrase_manager.cpp | 63 +++++- .../client/src/interface_v3/sphrase_manager.h | 3 + code/ryzom/client/src/libwww.cpp | 10 + code/ryzom/client/src/libwww.h | 7 + .../ryzom/client/src/motion/user_controls.cpp | 1 + code/ryzom/client/src/net_manager.cpp | 46 ++-- .../client/src/string_manager_client.cpp | 59 ++++- 34 files changed, 730 insertions(+), 71 deletions(-) diff --git a/code/ryzom/client/src/attached_fx.h b/code/ryzom/client/src/attached_fx.h index c58a9e92c..6cd8d2ef7 100644 --- a/code/ryzom/client/src/attached_fx.h +++ b/code/ryzom/client/src/attached_fx.h @@ -71,6 +71,8 @@ public: const NLMISC::CMatrix *StaticMatrix; // Useful if stick mode is "StaticMatrix" uint MaxNumAnimCount; // Number of frame on which the fx can overlap when it is being shutdown float TimeOut; + double StartTime; + float DelayBeforeStart; public: CBuildInfo() { @@ -80,6 +82,8 @@ public: StaticMatrix = NULL; MaxNumAnimCount = 0; TimeOut = FX_MANAGER_DEFAULT_TIMEOUT; + StartTime = 0.0; + DelayBeforeStart = 0.f; } }; CAttachedFX(); diff --git a/code/ryzom/client/src/character_cl.cpp b/code/ryzom/client/src/character_cl.cpp index 9a651e331..87332f42d 100644 --- a/code/ryzom/client/src/character_cl.cpp +++ b/code/ryzom/client/src/character_cl.cpp @@ -5874,6 +5874,27 @@ void CCharacterCL::updateAttachedFX() CMatrix alignMatrix; buildAlignMatrix(alignMatrix); + std::list::iterator itAttachedFxToStart = _AttachedFXListToStart.begin(); + while(itAttachedFxToStart != _AttachedFXListToStart.end()) + { + if ((*itAttachedFxToStart).DelayBeforeStart < (float)(TimeInSec - (*itAttachedFxToStart).StartTime)) + { + uint index = (*itAttachedFxToStart).MaxNumAnimCount; + (*itAttachedFxToStart).MaxNumAnimCount = 0; + CAttachedFX::TSmartPtr fx = new CAttachedFX; + fx->create(*this, (*itAttachedFxToStart), CAttachedFX::CTargeterInfo()); + if (!fx->FX.empty()) + { + _AuraFX[index] = fx; + } + itAttachedFxToStart = _AttachedFXListToStart.erase(itAttachedFxToStart); + } + else + { + ++itAttachedFxToStart; + } + } + // update tracks & pos for anim attachedfxs std::list::iterator itAttachedFx = _AttachedFXListForCurrentAnim.begin(); while(itAttachedFx != _AttachedFXListForCurrentAnim.end()) @@ -8993,16 +9014,40 @@ void CCharacterCL::setAuraFX(uint index, const CAnimationFX *sheet) } else { + std::list::iterator itAttachedFxToStart = _AttachedFXListToStart.begin(); + while(itAttachedFxToStart != _AttachedFXListToStart.end()) + { + if ((*itAttachedFxToStart).MaxNumAnimCount == index) + return; + } // remove previous aura _AuraFX[index] = NULL; - CAttachedFX::TSmartPtr fx = new CAttachedFX; CAttachedFX::CBuildInfo bi; bi.Sheet = sheet; bi.TimeOut = 0.f; - fx->create(*this, bi, CAttachedFX::CTargeterInfo()); - if (!fx->FX.empty()) + + if (sheet->Sheet->PSName == "misc_caravan_teleportout.ps") { - _AuraFX[index] = fx; + bi.MaxNumAnimCount = index; + bi.StartTime = TimeInSec; + bi.DelayBeforeStart = 12.5f; + _AttachedFXListToStart.push_front(bi); + } + else if (sheet->Sheet->PSName == "misc_kami_teleportout.ps") + { + bi.MaxNumAnimCount = index; + bi.StartTime = TimeInSec; + bi.DelayBeforeStart = 11.5f; + _AttachedFXListToStart.push_front(bi); + } + else + { + CAttachedFX::TSmartPtr fx = new CAttachedFX; + fx->create(*this, bi, CAttachedFX::CTargeterInfo()); + if (!fx->FX.empty()) + { + _AuraFX[index] = fx; + } } } } diff --git a/code/ryzom/client/src/character_cl.h b/code/ryzom/client/src/character_cl.h index 1a0e864d0..a5d7ba880 100644 --- a/code/ryzom/client/src/character_cl.h +++ b/code/ryzom/client/src/character_cl.h @@ -675,6 +675,7 @@ protected: /// List of attached to remove as soon as possible (when there are no particles left) std::list _AttachedFXListToRemove; + std::list _AttachedFXListToStart; CAttachedFX::TSmartPtr _AuraFX[MaxNumAura]; // special case for aura CAttachedFX::TSmartPtr _LinkFX; // special case for link diff --git a/code/ryzom/client/src/client_chat_manager.cpp b/code/ryzom/client/src/client_chat_manager.cpp index 184c3fac3..0eafbd007 100644 --- a/code/ryzom/client/src/client_chat_manager.cpp +++ b/code/ryzom/client/src/client_chat_manager.cpp @@ -1199,6 +1199,11 @@ class CHandlerTell : public IActionHandler // display msg with good color // TDataSetIndex dsi; // not used .... PeopleInterraction.ChatInput.Tell.displayTellMessage(/*dsi, */finalMsg, receiver, prop.getRGBA()); + + ucstring s = CI18N::get("youTellPlayer"); + strFindReplace(s, "%name", receiver); + strFindReplace(finalMsg, CI18N::get("youTell"), s); + CInterfaceManager::getInstance()->log(finalMsg); } }; REGISTER_ACTION_HANDLER( CHandlerTell, "tell"); diff --git a/code/ryzom/client/src/commands.cpp b/code/ryzom/client/src/commands.cpp index 0e27ff487..fbea6da96 100644 --- a/code/ryzom/client/src/commands.cpp +++ b/code/ryzom/client/src/commands.cpp @@ -1271,6 +1271,30 @@ NLMISC_COMMAND(7,"talk in 7th dynamic chat channel"," ") { return talkInChan(7,args); } + + +NLMISC_COMMAND(setItemName, "set name of items, sbrick, etc.."," ") +{ + if (args.size() < 2) return false; + CSheetId id(args[0]); + ucstring name; + name.fromUtf8(args[1]); + ucstring desc; + ucstring desc2; + if (args.size() > 2) + desc.fromUtf8(args[2]); + if (args.size() > 2) + desc2.fromUtf8(args[3]); + + STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance(); + if (pSMC) + pSMC->replaceSBrickName(id, name, desc, desc2); + else + return false; + return true; +} + + ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// diff --git a/code/ryzom/client/src/cursor_functions.cpp b/code/ryzom/client/src/cursor_functions.cpp index 437624a86..c212dbb0d 100644 --- a/code/ryzom/client/src/cursor_functions.cpp +++ b/code/ryzom/client/src/cursor_functions.cpp @@ -550,7 +550,9 @@ void checkUnderCursor() if (!instref.ContextText.empty()) { selectedInstanceURL = instref.ContextURL; - if(ContextCur.context("WEBIG", 0.f, ucstring(instref.ContextText))) + ucstring contextText; + contextText.fromUtf8(instref.ContextText); + if(ContextCur.context("WEBIG", 0.f, contextText)) return; } } diff --git a/code/ryzom/client/src/init.cpp b/code/ryzom/client/src/init.cpp index 7ae13500c..f94fa8321 100644 --- a/code/ryzom/client/src/init.cpp +++ b/code/ryzom/client/src/init.cpp @@ -1326,7 +1326,7 @@ void postlogInit() ProgressBar.newMessage ( ClientCfg.buildLoadingString(nmsg) ); CSBrickManager::getInstance()->init(); // Must be done after sheet loading - STRING_MANAGER::CStringManagerClient::specialWordsMemoryCompress(); // Must be done after brick manager init + //STRING_MANAGER::CStringManagerClient::specialWordsMemoryCompress(); // Must be done after brick manager init initLast = initCurrent; initCurrent = ryzomGetLocalTime(); diff --git a/code/ryzom/client/src/interface_v3/action_handler_item.cpp b/code/ryzom/client/src/interface_v3/action_handler_item.cpp index f6e397c26..819b8c0d4 100644 --- a/code/ryzom/client/src/interface_v3/action_handler_item.cpp +++ b/code/ryzom/client/src/interface_v3/action_handler_item.cpp @@ -1761,7 +1761,7 @@ class CHandlerItemMenuCheck : public IActionHandler if (pCS->getInventoryIndex()==INVENTORIES::bag) { bool isTextEditionActive = false; - static const string itemTextEditionPriv = ":DEV:SGM:EM:"; + static const string itemTextEditionPriv = ":DEV:SGM:GM:EM:"; if (!UserPrivileges.empty() && itemTextEditionPriv.find(UserPrivileges)!=std::string::npos) { isTextEditionActive = true; diff --git a/code/ryzom/client/src/interface_v3/action_handler_phrase.cpp b/code/ryzom/client/src/interface_v3/action_handler_phrase.cpp index 4c7c081f8..a24c49ad0 100644 --- a/code/ryzom/client/src/interface_v3/action_handler_phrase.cpp +++ b/code/ryzom/client/src/interface_v3/action_handler_phrase.cpp @@ -60,6 +60,7 @@ void launchPhraseComposition(bool creation); const std::string PhraseComposition="ui:interface:phrase_composition"; const std::string PhraseCompositionGroup="ui:interface:phrase_composition:header_opened"; const std::string PhraseMemoryCtrlBase= "ui:interface:gestionsets:shortcuts:s"; +const std::string PhraseMemoryAltCtrlBase= "ui:interface:gestionsets2:header_closed:shortcuts:s"; // ********************************************************************************************************** @@ -129,7 +130,11 @@ public: if(pCSDst && pCSDst->isSPhraseId() && pCSDst->isSPhraseIdMemory()) { // then will auto-memorize it in this slot - pPM->CompositionPhraseMemoryLineDest= pPM->getSelectedMemoryLineDB(); + if (pCSDst->isShortCut()) + pPM->CompositionPhraseMemoryLineDest= pPM->getSelectedMemoryLineDB(); + else + pPM->CompositionPhraseMemoryLineDest= 0; + pPM->CompositionPhraseMemorySlotDest= pCSDst->getIndexInDB(); } // else no auto memorize @@ -1110,7 +1115,11 @@ public: return; // Ok, the user try to cast a phrase slot. - sint32 memoryLine= pPM->getSelectedMemoryLineDB(); + sint32 memoryLine; + if (pCSDst->isShortCut()) + memoryLine = pPM->getSelectedMemoryLineDB(); + else + memoryLine = 0; if(memoryLine<0) return; @@ -1249,12 +1258,16 @@ public: { sint shortcut; fromString(Params, shortcut); - if (shortcut>=0 && shortcut <= RYZOM_MAX_SHORTCUT) + if (shortcut>=0 && shortcut <= 2*RYZOM_MAX_SHORTCUT) { CInterfaceManager *pIM= CInterfaceManager::getInstance(); // get the control - CInterfaceElement *elm= pIM->getElementFromId(PhraseMemoryCtrlBase + toString(shortcut) ); + CInterfaceElement *elm; + if (shortcut < RYZOM_MAX_SHORTCUT) + elm = pIM->getElementFromId(PhraseMemoryCtrlBase + toString(shortcut) ); + else + elm = pIM->getElementFromId(PhraseMemoryAltCtrlBase + toString(shortcut-RYZOM_MAX_SHORTCUT) ); CDBCtrlSheet *ctrl= dynamic_cast(elm); if(ctrl) { @@ -1491,7 +1504,11 @@ public: return; // Ok, the user try to cast a phrase slot. - sint32 memoryLine= pPM->getSelectedMemoryLineDB(); + sint32 memoryLine; + if (pCSDst->isShortCut()) + memoryLine = pPM->getSelectedMemoryLineDB(); + else + memoryLine = 0; if(memoryLine<0) return; diff --git a/code/ryzom/client/src/interface_v3/chat_filter.cpp b/code/ryzom/client/src/interface_v3/chat_filter.cpp index 8f5db8f20..ef370b689 100644 --- a/code/ryzom/client/src/interface_v3/chat_filter.cpp +++ b/code/ryzom/client/src/interface_v3/chat_filter.cpp @@ -313,7 +313,7 @@ void CChatTargetFilter::msgEntered(const ucstring &msg, CChatWindow *chatWindow) // the target must be a player, make a tell on him ChatMngr.tell(_TargetPlayer.toString(), msg); // direct output in the chat - chatWindow->displayLocalPlayerTell(msg); + chatWindow->displayLocalPlayerTell(_TargetPlayer.toString(), msg); } else { diff --git a/code/ryzom/client/src/interface_v3/chat_window.cpp b/code/ryzom/client/src/interface_v3/chat_window.cpp index d58ccde77..6f13b1bed 100644 --- a/code/ryzom/client/src/interface_v3/chat_window.cpp +++ b/code/ryzom/client/src/interface_v3/chat_window.cpp @@ -199,7 +199,7 @@ bool CChatWindow::isVisible() const } //================================================================================= -void CChatWindow::displayMessage(const ucstring &msg, NLMISC::CRGBA col, CChatGroup::TGroupType /* gt */, uint32 /* dynamicChatDbIndex */, uint numBlinks /* = 0*/, bool *windowVisible /*= NULL*/) +void CChatWindow::displayMessage(const ucstring &msg, NLMISC::CRGBA col, CChatGroup::TGroupType gt, uint32 dynamicChatDbIndex, uint numBlinks /* = 0*/, bool *windowVisible /*= NULL*/) { if (!_Chat) { @@ -466,7 +466,7 @@ void CChatWindow::setHeaderColor(const std::string &n) } //================================================================================= -void CChatWindow::displayLocalPlayerTell(const ucstring &msg, uint numBlinks /*= 0*/) +void CChatWindow::displayLocalPlayerTell(const ucstring &receiver, const ucstring &msg, uint numBlinks /*= 0*/) { ucstring finalMsg; CInterfaceProperty prop; @@ -484,7 +484,12 @@ void CChatWindow::displayLocalPlayerTell(const ucstring &msg, uint numBlinks /*= prop.readRGBA("UI:SAVE:CHAT:COLORS:TELL"," "); encodeColorTag(prop.getRGBA(), finalMsg, true); finalMsg += msg; + + ucstring s = CI18N::get("youTellPlayer"); + strFindReplace(s, "%name", receiver); + strFindReplace(finalMsg, CI18N::get("youTell"), s); displayMessage(finalMsg, prop.getRGBA(), CChatGroup::tell, 0, numBlinks); + CInterfaceManager::getInstance()->log(finalMsg); } void CChatWindow::encodeColorTag(const NLMISC::CRGBA &color, ucstring &text, bool append) @@ -797,14 +802,6 @@ CGroupContainer *CChatGroupWindow::createFreeTeller(const ucstring &winNameIn, c } } - // Create the free teller in all the desktops - uint8 nMode = pIM->getMode(); - pGC->setActive(false); - for (uint8 m = 0; m < MAX_NUM_MODES; ++m) - { - if (m != nMode) - pIM->updateGroupContainerImage(*pGC, m); - } // the group is only active on the current desktop pGC->setActive(true); } @@ -812,7 +809,7 @@ CGroupContainer *CChatGroupWindow::createFreeTeller(const ucstring &winNameIn, c if (!winColor.empty()) _FreeTellers[i]->setHeaderColor(winColor); - updateFreeTellerHeader(*_FreeTellers[i]); +// updateFreeTellerHeader(*_FreeTellers[i]); return _FreeTellers[i]; } diff --git a/code/ryzom/client/src/interface_v3/chat_window.h b/code/ryzom/client/src/interface_v3/chat_window.h index a18b950f6..5daf24c36 100644 --- a/code/ryzom/client/src/interface_v3/chat_window.h +++ b/code/ryzom/client/src/interface_v3/chat_window.h @@ -143,7 +143,7 @@ public: void setAHOnCloseButtonParams(const std::string &n); void setHeaderColor(const std::string &n); // - void displayLocalPlayerTell(const ucstring &msg, uint numBlinks = 0); + void displayLocalPlayerTell(const ucstring &receiver, const ucstring &msg, uint numBlinks = 0); /// Encode a color tag '@{RGBA}' in the text. If append is true, append at end of text, otherwise, replace the text static void encodeColorTag(const NLMISC::CRGBA &color, ucstring &text, bool append=true); diff --git a/code/ryzom/client/src/interface_v3/ctrl_base_button.h b/code/ryzom/client/src/interface_v3/ctrl_base_button.h index c1d993aec..06a27b276 100644 --- a/code/ryzom/client/src/interface_v3/ctrl_base_button.h +++ b/code/ryzom/client/src/interface_v3/ctrl_base_button.h @@ -114,7 +114,7 @@ public: /// \name Handlers // @{ // Event part - void setActionOnLeftClick (const std::string &actionHandlerName) { _AHOnLeftClick = getAH(actionHandlerName, _AHLeftClickParams); } + void setActionOnLeftClick (const std::string &actionHandlerName) { _AHOnLeftClickString = actionHandlerName; _AHOnLeftClick = getAH(actionHandlerName, _AHLeftClickParams); } void setActionOnRightClick (const std::string &actionHandlerName) { _AHOnRightClick = getAH(actionHandlerName, _AHRightClickParams); } void setActionOnClockTick (const std::string &ahName) { _AHOnClockTick = getAH(ahName, _AHClockTickParams); } void setParamsOnLeftClick (const std::string ¶msHandlerName) { _AHLeftClickParams = paramsHandlerName; } @@ -203,6 +203,7 @@ protected: //@{ IActionHandler *_AHOnOver; CStringShared _AHOverParams; + std::string _AHOnLeftClickString; IActionHandler *_AHOnLeftClick; CStringShared _AHLeftClickParams; IActionHandler *_AHOnLeftDblClick; diff --git a/code/ryzom/client/src/interface_v3/ctrl_button.cpp b/code/ryzom/client/src/interface_v3/ctrl_button.cpp index 17d89e900..fd1ba049b 100644 --- a/code/ryzom/client/src/interface_v3/ctrl_button.cpp +++ b/code/ryzom/client/src/interface_v3/ctrl_button.cpp @@ -333,4 +333,16 @@ void CCtrlButton::fitTexture() setH(h); } - +// *************************************************************************** +bool CCtrlButton::getMouseOverShape(string &texName, uint8 &rot, CRGBA &col) +{ + if (_AHOnLeftClickString == "browse") + { + texName = "curs_pick.tga"; + rot= 0; + col = CRGBA::White; + return true; + } + + return false; +} diff --git a/code/ryzom/client/src/interface_v3/ctrl_button.h b/code/ryzom/client/src/interface_v3/ctrl_button.h index 3dcb0f896..ff769e6c4 100644 --- a/code/ryzom/client/src/interface_v3/ctrl_button.h +++ b/code/ryzom/client/src/interface_v3/ctrl_button.h @@ -50,6 +50,8 @@ public: virtual uint32 getMemory() { return (uint32)(sizeof(*this)+_Id.size()); } + virtual bool getMouseOverShape(std::string &/* texName */, uint8 &/* rot */, NLMISC::CRGBA &/* col */); + // Display part virtual void draw(); diff --git a/code/ryzom/client/src/interface_v3/group_editbox.cpp b/code/ryzom/client/src/interface_v3/group_editbox.cpp index b87d95f2d..66318a893 100644 --- a/code/ryzom/client/src/interface_v3/group_editbox.cpp +++ b/code/ryzom/client/src/interface_v3/group_editbox.cpp @@ -21,6 +21,7 @@ #include "group_editbox.h" #include "interface_manager.h" #include "input_handler_manager.h" +#include "nel/misc/command.h" #include "view_text.h" #include "game_share/xml_auto_ptr.h" #include "interface_options.h" @@ -56,6 +57,7 @@ CGroupEditBox::CGroupEditBox(const TCtorParam ¶m) : _MaxCharsSize(32768), _FirstVisibleChar(0), _LastVisibleChar(0), + _SelectingText(false), _ViewText(NULL), _MaxHistoric(0), _CurrentHistoricIndex(-1), @@ -354,16 +356,27 @@ void CGroupEditBox::paste() if (Driver->pasteTextFromClipboard(sString)) { // append string now - appendString(sString); + appendStringFromClipboard(sString); } } // ---------------------------------------------------------------------------- -void CGroupEditBox::appendString(const ucstring &str) +void CGroupEditBox::appendStringFromClipboard(const ucstring &str) { stopParentBlink(); makeTopWindow(); + writeString(str, true, false); + nlinfo ("Chat input was pasted from the clipboard"); + + triggerOnChangeAH(); + + _CursorAtPreviousLineEnd = false; +} + +// ---------------------------------------------------------------------------- +void CGroupEditBox::writeString(const ucstring &str, bool replace, bool atEnd) +{ sint length = (sint)str.length(); ucstring toAppend; @@ -500,13 +513,41 @@ void CGroupEditBox::appendString(const ucstring &str) length = _MaxNumChar - (sint)_InputString.length(); } ucstring toAdd = toAppend.substr(0, length); - _InputString = _InputString.substr(0, _CursorPos) + toAdd + _InputString.substr(_CursorPos); - _CursorPos += (sint32)toAdd.length(); - nlinfo ("Chat input was pasted from the clipboard"); + sint32 minPos; + sint32 maxPos; + if (_CurrSelection == this) + { + minPos = min(_CursorPos, _SelectCursorPos); + maxPos = max(_CursorPos, _SelectCursorPos); + } + else + { + minPos = _CursorPos; + maxPos = _CursorPos; + } - triggerOnChangeAH(); + nlinfo("%d, %d", minPos, maxPos); + if (replace) + { + _InputString = _InputString.substr(0, minPos) + toAdd + _InputString.substr(maxPos); + _CursorPos = minPos+(sint32)toAdd.length(); + } + else + { + if (atEnd) + { + _InputString = _InputString.substr(0, maxPos) + toAdd + _InputString.substr(maxPos); + _CursorPos = maxPos; + _SelectCursorPos = _CursorPos; - _CursorAtPreviousLineEnd = false; + } + else + { + _InputString = _InputString.substr(0, minPos) + toAdd + _InputString.substr(minPos); + _CursorPos = minPos+(sint32)toAdd.length(); + _SelectCursorPos = maxPos+(sint32)toAdd.length(); + } + } } // ---------------------------------------------------------------------------- @@ -862,6 +903,7 @@ bool CGroupEditBox::handleEvent (const CEventDescriptor& event) // if click, and not frozen, then get the focus if (eventDesc.getEventTypeExtended() == CEventDescriptorMouse::mouseleftdown && !_Frozen) { + _SelectingText = true; stopParentBlink(); pIM->setCaptureKeyboard (this); // set the right cursor position @@ -872,9 +914,34 @@ bool CGroupEditBox::handleEvent (const CEventDescriptor& event) _CursorPos = newCurPos; _CursorPos -= (sint32)_Prompt.length(); _CursorPos = std::max(_CursorPos, sint32(0)); + _SelectCursorPos = _CursorPos; + _CurrSelection = NULL; return true; } + // if click, and not frozen, then get the focus + if (eventDesc.getEventTypeExtended() == CEventDescriptorMouse::mousemove && !_Frozen && _SelectingText) + { + // set the right cursor position + uint newCurPos; + bool cursorAtPreviousLineEnd; + _CurrSelection = this; + _ViewText->getCharacterIndexFromPosition(eventDesc.getX() - _ViewText->getXReal(), eventDesc.getY() - _ViewText->getYReal(), newCurPos, cursorAtPreviousLineEnd); + _SelectCursorPos = newCurPos; + _SelectCursorPos -= (sint32)_Prompt.length(); + _SelectCursorPos = std::max(_SelectCursorPos, sint32(0)); + return true; + } + + // if click, and not frozen, then get the focus + if (eventDesc.getEventTypeExtended() == CEventDescriptorMouse::mouseleftup && !_Frozen) + { + _SelectingText = false; + if (_SelectCursorPos == _CursorPos) + _CurrSelection = NULL; + + return true; + } if (eventDesc.getEventTypeExtended() == CEventDescriptorMouse::mouserightdown) { diff --git a/code/ryzom/client/src/interface_v3/group_editbox.h b/code/ryzom/client/src/interface_v3/group_editbox.h index 3a067cf25..f2856709a 100644 --- a/code/ryzom/client/src/interface_v3/group_editbox.h +++ b/code/ryzom/client/src/interface_v3/group_editbox.h @@ -125,6 +125,8 @@ public: void copy(); // Paste the selection into buffer void paste(); + // Write the string into buffer + void writeString(const ucstring &str, bool replace = true, bool atEnd = true); // Expand the expression (true if there was a '/' at the start of the line) bool expand(); @@ -217,6 +219,7 @@ protected: // Text selection static sint32 _SelectCursorPos; static CGroupEditBox *_CurrSelection; // the edit box for which the selection is currently active, or NULL if there's none + bool _SelectingText; NLMISC::CRGBA _TextSelectColor; NLMISC::CRGBA _BackSelectColor; @@ -291,7 +294,7 @@ private: void handleEventString(const CEventDescriptorKey &event); void setup(); void triggerOnChangeAH(); - void appendString(const ucstring &str); + void appendStringFromClipboard(const ucstring &str); ucstring getSelection(); diff --git a/code/ryzom/client/src/interface_v3/group_html.cpp b/code/ryzom/client/src/interface_v3/group_html.cpp index 43ff1ca75..dda2250a8 100644 --- a/code/ryzom/client/src/interface_v3/group_html.cpp +++ b/code/ryzom/client/src/interface_v3/group_html.cpp @@ -442,6 +442,9 @@ void CGroupHTML::addText (const char * buf, int len) { if (_Browsing) { + if (_IgnoreText) + return; + // Build a UTF8 string string inputString(buf, buf+len); // inputString.resize (len); @@ -525,6 +528,11 @@ void CGroupHTML::addLink (uint element_number, uint /* attribute_number */, HTCh // in ah: command we don't respect the uri standard so the HTAnchor_address doesn't work correctly _Link.push_back (suri); } + else if (suri[0] == '#') + { + // Direct url (hack for lua beginElement) + _Link.push_back (suri.substr(1)); + } else { HTAnchor * dest = HTAnchor_followMainLink((HTAnchor *) anchor); @@ -839,6 +847,14 @@ void CGroupHTML::beginElement (uint element_number, const BOOL *present, const c } } break; + case HTML_DIV: + { + if (present[MY_HTML_DIV_NAME] && value[MY_HTML_DIV_NAME]) + { + _DivName = value[MY_HTML_DIV_NAME]; + } + } + break; case HTML_FONT: { bool found = false; @@ -856,7 +872,7 @@ void CGroupHTML::beginElement (uint element_number, const BOOL *present, const c _TextColor.push_back(_TextColor.empty() ? CRGBA::White : _TextColor.back()); } } - break; + break; case HTML_BR: addString(ucstring ("\n")); break; @@ -1372,6 +1388,9 @@ void CGroupHTML::beginElement (uint element_number, const BOOL *present, const c _ObjectAction = value[HTML_OBJECT_STANDBY]; _Object = true; + break; + case HTML_STYLE: + _IgnoreText = true; break; } } @@ -1409,6 +1428,10 @@ void CGroupHTML::endElement (uint element_number) case HTML_PRE: popIfNotEmpty (_PRE); break; + case HTML_DIV: + _DivName = ""; + break; + case HTML_TABLE: popIfNotEmpty (_CellParams); popIfNotEmpty (_TR); @@ -1493,6 +1516,9 @@ void CGroupHTML::endElement (uint element_number) popIfNotEmpty (_UL); } break; + case HTML_STYLE: + _IgnoreText = false; + break; case HTML_OBJECT: if (_ObjectType=="application/ryzom-data") { @@ -1560,6 +1586,7 @@ CGroupHTML::CGroupHTML(const TCtorParam ¶m) // init _ParsingLua = false; + _IgnoreText = false; _BrowseNextTime = false; _PostNextTime = false; _Browsing = false; @@ -2506,6 +2533,7 @@ void CGroupHTML::clearContext() _Cells.clear(); _TR.clear(); _Forms.clear(); + _Groups.clear(); _CellParams.clear(); _Title = false; _TextArea = false; @@ -2584,6 +2612,12 @@ void CGroupHTML::addGroup (CInterfaceGroup *group, uint beginSpace) _Paragraph = NULL; } + if (!_DivName.empty()) + { + group->setName(_DivName); + _Groups.push_back(group); + } + group->setSizeRef(CInterfaceElement::width); // Compute begin space between paragraph and tables @@ -3337,6 +3371,171 @@ int CGroupHTML::luaRefresh(CLuaState &ls) return 0; } +// *************************************************************************** +int CGroupHTML::luaRemoveContent(CLuaState &ls) +{ + const char *funcName = "refresh"; + CLuaIHM::checkArgCount(ls, funcName, 0); + removeContent(); + return 0; +} + +// *************************************************************************** +int CGroupHTML::luaInsertText(CLuaState &ls) +{ + const char *funcName = "insertText"; + CLuaIHM::checkArgCount(ls, funcName, 3); + CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING); + CLuaIHM::checkArgType(ls, funcName, 2, LUA_TSTRING); + CLuaIHM::checkArgType(ls, funcName, 3, LUA_TBOOLEAN); + + string name = ls.toString(1); + + ucstring text; + text.fromUtf8(ls.toString(2)); + + if (!_Forms.empty()) { + for (uint i=0; i<_Forms.back().Entries.size(); i++) + { + if (_Forms.back().Entries[i].TextArea && _Forms.back().Entries[i].Name == name) + { + // Get the edit box view + CInterfaceGroup *group = _Forms.back().Entries[i].TextArea->getGroup ("eb"); + if (group) + { + // Should be a CGroupEditBox + CGroupEditBox *editBox = dynamic_cast(group); + if (editBox) + editBox->writeString(text, false, ls.toBoolean(3)); + } + } + } + } + + return 0; +} + +// *************************************************************************** +int CGroupHTML::luaAddString(CLuaState &ls) +{ + const char *funcName = "addString"; + CLuaIHM::checkArgCount(ls, funcName, 1); + CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING); + addString(ucstring(ls.toString(1))); + return 0; +} + +// *************************************************************************** +int CGroupHTML::luaAddImage(CLuaState &ls) +{ + const char *funcName = "addImage"; + CLuaIHM::checkArgCount(ls, funcName, 2); + CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING); + CLuaIHM::checkArgType(ls, funcName, 2, LUA_TBOOLEAN); + if (!_Paragraph) + { + newParagraph(0); + paragraphChange(); + } + string url = getLink(); + if (!url.empty()) { + string params = "name=" + getId() + "|url=" + getLink (); + addButton(CCtrlButton::PushButton, ls.toString(1), ls.toString(1), ls.toString(1), + "", ls.toBoolean(2), "browse", params.c_str(), ""); + } else { + addImage(ls.toString(1), ls.toBoolean(2)); + } + + + return 0; +} + +// *************************************************************************** +int CGroupHTML::luaBeginElement(CLuaState &ls) +{ + const char *funcName = "beginElement"; + CLuaIHM::checkArgCount(ls, funcName, 2); + CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER); + CLuaIHM::checkArgType(ls, funcName, 2, LUA_TTABLE); + + uint element_number = (uint)ls.toNumber(1); + std::vector present; + std::vector value; + present.resize(30, false); + value.resize(30); + + CLuaObject params; + params.pop(ls); + uint max_idx = 0; + + + ENUM_LUA_TABLE(params, it) + { + if (!it.nextKey().isNumber()) + { + nlwarning("%s : bad key encountered with type %s, number expected.", funcName, it.nextKey().getTypename()); + continue; + } + if (!it.nextValue().isString()) + { + nlwarning("%s : bad value encountered with type %s for key %s, string expected.", funcName, it.nextValue().getTypename(), it.nextKey().toString().c_str()); + continue; + } + uint idx = (uint)it.nextKey().toNumber(); + + present.insert(present.begin() + (uint)it.nextKey().toNumber(), true); + + string str = it.nextValue().toString(); + size_t size = str.size() + 1; + char * buffer = new char[ size ]; + strncpy(buffer, str.c_str(), size ); + + value.insert(value.begin() + (uint)it.nextKey().toNumber(), buffer); + } + + beginElement(element_number, &present[0], &value[0]); + if (element_number == HTML_A) + addLink(element_number, 0, NULL, &present[0], &value[0]); + + return 0; +} + + +// *************************************************************************** +int CGroupHTML::luaEndElement(CLuaState &ls) +{ + const char *funcName = "endElement"; + CLuaIHM::checkArgCount(ls, funcName, 1); + CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER); + + uint element_number = (uint)ls.toNumber(1); + endElement(element_number); + + return 0; +} + + +// *************************************************************************** +int CGroupHTML::luaShowDiv(CLuaState &ls) +{ + const char *funcName = "showDiv"; + CLuaIHM::checkArgCount(ls, funcName, 2); + CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING); + CLuaIHM::checkArgType(ls, funcName, 2, LUA_TBOOLEAN); + + if (!_Groups.empty()) { + for (uint i=0; i<_Groups.size(); i++) + { + CInterfaceGroup *group = _Groups[i]; + if (group->getName() == ls.toString(1)) + { + group->setActive(ls.toBoolean(2)); + } + } + } + return 0; +} + // *************************************************************************** void CGroupHTML::setURL(const std::string &url) { diff --git a/code/ryzom/client/src/interface_v3/group_html.h b/code/ryzom/client/src/interface_v3/group_html.h index b4f4ee00b..92cb81e6e 100644 --- a/code/ryzom/client/src/interface_v3/group_html.h +++ b/code/ryzom/client/src/interface_v3/group_html.h @@ -165,10 +165,24 @@ public: int luaBrowse(CLuaState &ls); int luaRefresh(CLuaState &ls); + int luaRemoveContent(CLuaState &ls); + int luaInsertText(CLuaState &ls); + int luaAddString(CLuaState &ls); + int luaAddImage(CLuaState &ls); + int luaBeginElement(CLuaState &ls); + int luaEndElement(CLuaState &ls); + int luaShowDiv(CLuaState &ls); REFLECT_EXPORT_START(CGroupHTML, CGroupScrollText) REFLECT_LUA_METHOD("browse", luaBrowse) REFLECT_LUA_METHOD("refresh", luaRefresh) + REFLECT_LUA_METHOD("removeContent", luaRemoveContent) + REFLECT_LUA_METHOD("insertText", luaInsertText) + REFLECT_LUA_METHOD("addString", luaAddString) + REFLECT_LUA_METHOD("addImage", luaAddImage) + REFLECT_LUA_METHOD("beginElement", luaBeginElement) + REFLECT_LUA_METHOD("endElement", luaEndElement) + REFLECT_LUA_METHOD("showDiv", luaShowDiv) REFLECT_STRING("url", getURL, setURL) REFLECT_FLOAT("timeout", getTimeout, setTimeout) REFLECT_EXPORT_END @@ -290,6 +304,7 @@ protected : // element has been found // True when the element has been encountered bool _ParsingLua; + bool _IgnoreText; // the script to execute std::string _LuaScript; @@ -303,6 +318,7 @@ protected : class CLibWWWData *_LibWWW; // Current paragraph + std::string _DivName; CGroupParagraph* _Paragraph; inline CGroupParagraph *getParagraph() { @@ -442,6 +458,7 @@ protected : std::vector Entries; }; std::vector _Forms; + std::vector _Groups; // Cells parameters class CCellParams diff --git a/code/ryzom/client/src/interface_v3/group_quick_help.cpp b/code/ryzom/client/src/interface_v3/group_quick_help.cpp index 9df6c343e..210c7110e 100644 --- a/code/ryzom/client/src/interface_v3/group_quick_help.cpp +++ b/code/ryzom/client/src/interface_v3/group_quick_help.cpp @@ -278,8 +278,11 @@ void CGroupQuickHelp::browse (const char *url) _IsQuickHelp = false; string completeURL = url; - completeURL = completeURL.substr(0, completeURL.size()-5); // Substract the ".html" - completeURL += "_" + ClientCfg.getHtmlLanguageCode() + ".html"; + if (completeURL.substr(completeURL.size()-5, 5) == ".html") + { + completeURL = completeURL.substr(0, completeURL.size()-5); // Substract the ".html" + completeURL += "_" + ClientCfg.getHtmlLanguageCode() + ".html"; + } CGroupHTML::browse (completeURL.c_str()); } diff --git a/code/ryzom/client/src/interface_v3/interface_element.h b/code/ryzom/client/src/interface_v3/interface_element.h index c77fc41b6..24982cad2 100644 --- a/code/ryzom/client/src/interface_v3/interface_element.h +++ b/code/ryzom/client/src/interface_v3/interface_element.h @@ -250,6 +250,9 @@ public: /// Accessors : SET void setId (const std::string &newID) { _Id = newID; } + inline void setName(const std::string &name) { _Name = name; } + inline const std::string& getName() { return _Name; } + virtual void setIdRecurse(const std::string &newID); void setParent (CInterfaceGroup *pIG) { _Parent = pIG; } @@ -510,6 +513,8 @@ protected: ///the id of the element std::string _Id; + std::string _Name; + ///is the element active? bool _Active; diff --git a/code/ryzom/client/src/interface_v3/item_consumable_effect.cpp b/code/ryzom/client/src/interface_v3/item_consumable_effect.cpp index bbd664ad5..35afeb618 100644 --- a/code/ryzom/client/src/interface_v3/item_consumable_effect.cpp +++ b/code/ryzom/client/src/interface_v3/item_consumable_effect.cpp @@ -113,6 +113,33 @@ void CItemConsumableEffectHelper::getItemConsumableEffectText(const CItemSheet * effects += "\n"; } + if ( name == "SP_LIFE_AURA2" ) + { + + uint16 regenMod; + fromString(params[0].c_str(), regenMod); + uint32 bonus = regenMod * itemQuality; + uint32 duration; + fromString(params[1].c_str(), duration); + uint32 radius; + fromString(params[2].c_str(), radius); + uint32 targetDisableTime; + fromString(params[3].c_str(), targetDisableTime); + uint32 userDisableTime; + fromString(params[4].c_str(), userDisableTime); + + ucstring result = CI18N::get("uiItemConsumableEffectLifeAura"); + strFindReplace(result, "%modifier", toString(bonus)); + strFindReplace(result, "%minutes", toString(duration/60)); + strFindReplace(result, "%secondes", toString(duration%60)); + strFindReplace(result, "%radius", toString(radius)); + strFindReplace(result, "%targetDisableTime", toString(targetDisableTime)); + strFindReplace(result, "%userDisableTime", toString(userDisableTime)); + + effects += result; + effects += "\n"; + } + if ( name == "SP_STAMINA_AURA" ) { @@ -139,6 +166,34 @@ void CItemConsumableEffectHelper::getItemConsumableEffectText(const CItemSheet * effects += "\n"; } + + if ( name == "SP_STAMINA_AURA2" ) + { + + uint16 regenMod; + fromString(params[0].c_str(), regenMod); + uint32 bonus = regenMod * itemQuality; + uint32 duration; + fromString(params[1].c_str(), duration); + uint32 radius; + fromString(params[2].c_str(), radius); + uint32 targetDisableTime; + fromString(params[3].c_str(), targetDisableTime); + uint32 userDisableTime; + fromString(params[4].c_str(), userDisableTime); + + ucstring result = CI18N::get("uiItemConsumableEffectStaminaAura"); + strFindReplace(result, "%modifier", toString(regenMod)); + strFindReplace(result, "%minutes", toString(duration/60)); + strFindReplace(result, "%secondes", toString(duration%60)); + strFindReplace(result, "%radius", toString(radius)); + strFindReplace(result, "%targetDisableTime", toString(targetDisableTime)); + strFindReplace(result, "%userDisableTime", toString(userDisableTime)); + + effects += result; + effects += "\n"; + } + if ( name == "SP_SAP_AURA" ) { @@ -165,6 +220,33 @@ void CItemConsumableEffectHelper::getItemConsumableEffectText(const CItemSheet * effects += "\n"; } + if ( name == "SP_SAP_AURA2" ) + { + + uint16 regenMod; + fromString(params[0].c_str(), regenMod); + uint32 bonus = regenMod * itemQuality; + uint32 duration; + fromString(params[1].c_str(), duration); + uint32 radius; + fromString(params[2].c_str(), radius); + uint32 targetDisableTime; + fromString(params[3].c_str(), targetDisableTime); + uint32 userDisableTime; + fromString(params[4].c_str(), userDisableTime); + + ucstring result = CI18N::get("uiItemConsumableEffectSapAura"); + strFindReplace(result, "%modifier", toString(bonus)); + strFindReplace(result, "%minutes", toString(duration/60)); + strFindReplace(result, "%secondes", toString(duration%60)); + strFindReplace(result, "%radius", toString(radius)); + strFindReplace(result, "%targetDisableTime", toString(targetDisableTime)); + strFindReplace(result, "%userDisableTime", toString(userDisableTime)); + + effects += result; + effects += "\n"; + } + // skill modifier consumables //--------------------------- ucstring result(""); diff --git a/code/ryzom/client/src/interface_v3/lua_ihm.cpp b/code/ryzom/client/src/interface_v3/lua_ihm.cpp index 6fee6811a..cf34912f8 100644 --- a/code/ryzom/client/src/interface_v3/lua_ihm.cpp +++ b/code/ryzom/client/src/interface_v3/lua_ihm.cpp @@ -115,6 +115,7 @@ #include "game_share/scenario_entry_points.h" #include "game_share/bg_downloader_msg.h" #include "game_share/constants.h" +#include "game_share/visual_slot_manager.h" #ifdef LUA_NEVRAX_VERSION #include "lua_ide_dll_nevrax/include/lua_ide_dll/ide_interface.h" // external debugger @@ -1368,6 +1369,8 @@ void CLuaIHM::registerIHM(CLuaState &ls) ls.registerFunc("isPlayerNewbie", isPlayerNewbie); ls.registerFunc("isInRingMode", isInRingMode); ls.registerFunc("getUserRace", getUserRace); + ls.registerFunc("getSheet2idx", getSheet2idx); + // Through LUABind API lua_State *L= ls.getStatePointer(); @@ -4412,3 +4415,25 @@ int CLuaIHM::getUserRace(CLuaState &ls) return 1; } +// *************************************************************************** +int CLuaIHM::getSheet2idx(CLuaState &ls) +{ + CLuaIHM::checkArgCount(ls, "getSheet2idx", 2); + CLuaIHM::checkArgType(ls, "getSheet2idx", 1, LUA_TSTRING); + CLuaIHM::checkArgType(ls, "getSheet2idx", 2, LUA_TNUMBER); + + const std::string & sheedtName = ls.toString(1); + uint32 slotId = (uint32)ls.toNumber(2); + + NLMISC::CSheetId sheetId; + + if (sheetId.buildSheetId(sheedtName)) + { + uint32 idx = CVisualSlotManager::getInstance()->sheet2Index(sheetId, (SLOTTYPE::EVisualSlot)slotId); + ls.push((lua_Number)idx); + } + else + return 0; + return 1; +} + diff --git a/code/ryzom/client/src/interface_v3/lua_ihm.h b/code/ryzom/client/src/interface_v3/lua_ihm.h index f2a0e2628..6a11a5c91 100644 --- a/code/ryzom/client/src/interface_v3/lua_ihm.h +++ b/code/ryzom/client/src/interface_v3/lua_ihm.h @@ -351,6 +351,7 @@ private: static int isPlayerNewbie(CLuaState &ls); static int isInRingMode(CLuaState &ls); static int getUserRace(CLuaState &ls); + static int getSheet2idx(CLuaState &ls); // LUA functions exported for Dev only (debug) diff --git a/code/ryzom/client/src/interface_v3/people_interraction.cpp b/code/ryzom/client/src/interface_v3/people_interraction.cpp index 3b5a4fb43..170d20ffd 100644 --- a/code/ryzom/client/src/interface_v3/people_interraction.cpp +++ b/code/ryzom/client/src/interface_v3/people_interraction.cpp @@ -999,7 +999,7 @@ class CHandlerChatGroupFilter : public IActionHandler } - rCTF.setTargetGroup(PeopleInterraction.TheUserChat.Filter.getTargetGroup()); + rCTF.setTargetGroup(PeopleInterraction.TheUserChat.Filter.getTargetGroup(), PeopleInterraction.TheUserChat.Filter.getTargetDynamicChannelDbIndex()); } else { @@ -1813,8 +1813,6 @@ void CPeopleInterraction::setupUserChatFromSummary(const CFilteredChatSummary &s //================================================================================================================= void CPeopleInterraction::setupUserDynChatFromSummary(const CFilteredDynChatSummary &summary, CFilteredChat &dest) { - // User Dest - dest.Filter.setTargetGroup(summary.Target, 0, false); // src for (uint8 i = 0; i < CChatGroup::MaxDynChanPerPlayer; i++) { @@ -2666,12 +2664,12 @@ class CHandlerChatTargetSelected : public IActionHandler // Case of user chat in grouped chat window if (cw == PeopleInterraction.ChatGroup.Window) { - PeopleInterraction.TheUserChat.Filter.setTargetGroup(cf.getTargetGroup()); + PeopleInterraction.TheUserChat.Filter.setTargetGroup(cf.getTargetGroup(), cf.getTargetDynamicChannelDbIndex()); CInterfaceManager::getInstance()->runActionHandler("chat_group_filter", NULL, "user"); } if (cw == PeopleInterraction.TheUserChat.Window) { - PeopleInterraction.TheUserChat.Filter.setTargetGroup(cf.getTargetGroup()); + PeopleInterraction.TheUserChat.Filter.setTargetGroup(cf.getTargetGroup(), cf.getTargetDynamicChannelDbIndex()); CInterfaceManager::getInstance()->runActionHandler("user_chat_active", NULL, ""); } diff --git a/code/ryzom/client/src/interface_v3/people_list.cpp b/code/ryzom/client/src/interface_v3/people_list.cpp index 66ce8a2a8..cd3d75067 100644 --- a/code/ryzom/client/src/interface_v3/people_list.cpp +++ b/code/ryzom/client/src/interface_v3/people_list.cpp @@ -441,7 +441,7 @@ void CPeopleList::setContactId(uint index, uint32 contactId) } //================================================================== -void CPeopleList::displayLocalPlayerTell(uint index,const ucstring &msg,uint numBlinks /*=0*/) +void CPeopleList::displayLocalPlayerTell(const ucstring &receiver, uint index, const ucstring &msg,uint numBlinks /*=0*/) { if (_ContactType == CPeopleListDesc::Ignore) { @@ -475,7 +475,12 @@ void CPeopleList::displayLocalPlayerTell(uint index,const ucstring &msg,uint num // display msg with good color CInterfaceProperty prop; prop.readRGBA("UI:SAVE:CHAT:COLORS:TELL"," "); + + ucstring s = CI18N::get("youTellPlayer"); + strFindReplace(s, "%name", receiver); + strFindReplace(finalMsg, CI18N::get("youTell"), s); gl->addChild(getChatTextMngr().createMsgText(finalMsg, prop.getRGBA())); + CInterfaceManager::getInstance()->log(finalMsg); // if the group is closed, make it blink if (!gc->isOpen()) @@ -924,7 +929,7 @@ class CHandlerContactEntry : public IActionHandler uint index; if (PeopleInterraction.getPeopleFromContainerID(str, peopleList, index)) { - peopleList->displayLocalPlayerTell(index, text); + peopleList->displayLocalPlayerTell(str2, index, text); } } else @@ -948,6 +953,11 @@ class CHandlerContactEntry : public IActionHandler CChatWindow::encodeColorTag(prop.getRGBA(), final, true); final += text; pWin->displayTellMessage(final, prop.getRGBA(), pWin->getFreeTellerName(str)); + + ucstring s = CI18N::get("youTellPlayer"); + strFindReplace(s, "%name", pWin->getFreeTellerName(str)); + strFindReplace(final, CI18N::get("youTell"), s); + CInterfaceManager::getInstance()->log(final); } } diff --git a/code/ryzom/client/src/interface_v3/people_list.h b/code/ryzom/client/src/interface_v3/people_list.h index 0ab0f3508..a3748c01a 100644 --- a/code/ryzom/client/src/interface_v3/people_list.h +++ b/code/ryzom/client/src/interface_v3/people_list.h @@ -111,7 +111,7 @@ public: * If the window is closed, it causes it to blink (and also the parent window) */ void displayMessage(uint index, const ucstring &msg, NLMISC::CRGBA col, uint numBlinks = 0); - void displayLocalPlayerTell(uint index, const ucstring &msg, uint numBlinks = 0); + void displayLocalPlayerTell(const ucstring &receiver, uint index, const ucstring &msg, uint numBlinks = 0); // Is the given people window visible ? bool isPeopleChatVisible(uint index) const; // reset remove everything from the interface diff --git a/code/ryzom/client/src/interface_v3/sphrase_manager.cpp b/code/ryzom/client/src/interface_v3/sphrase_manager.cpp index 8058e41da..6820a10e8 100644 --- a/code/ryzom/client/src/interface_v3/sphrase_manager.cpp +++ b/code/ryzom/client/src/interface_v3/sphrase_manager.cpp @@ -57,6 +57,7 @@ const std::string PhraseMemoryViewNextAction= "ui:interface:gestionsets:shortcu const std::string PhraseMemoryViewCycleAction= "ui:interface:gestionsets:shortcuts:view_cycle_action"; const std::string PhraseMemoryViewSlotBase= "ui:interface:gestionsets:shortcuts:s"; const std::string PhraseMemoryCtrlBase= "ui:interface:gestionsets:shortcuts:s"; +const std::string PhraseMemoryAltCtrlBase= "ui:interface:gestionsets2:header_closed:shortcuts:s"; const std::string PhraseMemoryPhraseMenu= "ui:interface:cm_memory_phrase"; const std::string PhraseMemoryPhraseAction= "cast_phrase_or_create_new"; @@ -118,11 +119,16 @@ void CSPhraseManager::initInGame() _BookDbLeaves[i]= node; } _MemoryDbLeaves.resize(PHRASE_MAX_MEMORY_SLOT, NULL); + _MemoryAltDbLeaves.resize(PHRASE_MAX_MEMORY_SLOT, NULL); + for(i=0;igetDbProp(PHRASE_DB_MEMORY + ":" + toString(i) + ":PHRASE"); node->setValue32(0); _MemoryDbLeaves[i]= node; + CCDBNodeLeaf *node_alt= pIM->getDbProp(PHRASE_DB_MEMORY_ALT + ":" + toString(i) + ":PHRASE"); + node_alt->setValue32(0); + _MemoryAltDbLeaves[i]= node_alt; } // Progression Db leaves @@ -497,6 +503,7 @@ void CSPhraseManager::updateMemoryDBAll() for(uint i=0;isetValue32(0); + _MemoryAltDbLeaves[i]->setValue32(0); } } else @@ -508,6 +515,12 @@ void CSPhraseManager::updateMemoryDBAll() _MemoryDbLeaves[i]->setValue32(0); else _MemoryDbLeaves[i]->setValue32(slot.Id); + + CMemorySlot &slotAlt= _Memories[0].Slot[i]; + if(!slotAlt.isPhrase()) + _MemoryAltDbLeaves[i]->setValue32(0); + else + _MemoryAltDbLeaves[i]->setValue32(slotAlt.Id); } } } @@ -530,6 +543,15 @@ void CSPhraseManager::updateMemoryDBSlot(uint32 memorySlot) else _MemoryDbLeaves[memorySlot]->setValue32(slot.Id); } + + if (_SelectedMemoryDB == 0) + { + CMemorySlot &slotAlt= _Memories[0].Slot[memorySlot]; + if(!slotAlt.isPhrase()) + _MemoryAltDbLeaves[memorySlot]->setValue32(0); + else + _MemoryAltDbLeaves[memorySlot]->setValue32(slotAlt.Id); + } } // *************************************************************************** @@ -873,6 +895,7 @@ void CSPhraseManager::reset() _LastProgressionNumDbFill[i]= 0; } _MemoryDbLeaves.clear(); + _MemoryAltDbLeaves.clear(); _NextExecuteLeaf= NULL; _NextExecuteIsCyclicLeaf= NULL; @@ -2645,7 +2668,13 @@ static sint getRightHandEnchantValue() void CSPhraseManager::updateMemoryCtrlRegenTickRange(uint memorySlot, CDBCtrlSheet *ctrl) { // - uint memoryLine= getSelectedMemoryLineDB(); + sint32 memoryLine; + if (ctrl->isShortCut()) + memoryLine = getSelectedMemoryLineDB(); + else + memoryLine = 0; + if (memoryLine < 0) + return; sint32 phraseId= getMemorizedPhrase(memoryLine, memorySlot); // if(phraseId) @@ -2780,8 +2809,12 @@ void CSPhraseManager::updateMemoryCtrlState(uint memorySlot, CDBCtrlSheet *ctrl, CSBrickManager *pBM = CSBrickManager::getInstance(); CSkillManager *pSM = CSkillManager::getInstance(); + uint memoryLine; // get the slot info - uint memoryLine= getSelectedMemoryLineDB(); + if (ctrl->isShortCut()) // No memoryLine defined + memoryLine= getSelectedMemoryLineDB(); + else + memoryLine= 0; bool newIsMacro= isMemorizedMacro(memoryLine, memorySlot); sint32 macroId= getMemorizedMacro(memoryLine, memorySlot); sint32 phraseId= getMemorizedPhrase(memoryLine, memorySlot); @@ -3004,6 +3037,9 @@ void CSPhraseManager::updateAllMemoryCtrlState() // update the valid state. updateMemoryCtrlState(i, ctrl, itemSkill); } + CDBCtrlSheet *ctrlAlt= dynamic_cast(pIM->getElementFromId(PhraseMemoryAltCtrlBase + toString(i)) ); + if(ctrlAlt) + updateMemoryCtrlState(i, ctrlAlt, itemSkill); } TTicks endTime = CTime::getPerformanceTime(); //nldebug("***** %d ms for CSPhraseManager::updateAllMemoryCtrlState", (int) (1000 * CTime::ticksToSecond(endTime - startTime))); @@ -3030,26 +3066,49 @@ CDBCtrlSheet *CSPhraseManager::getMemorySlotCtrl(uint memorySlot) return dynamic_cast(pIM->getElementFromId(PhraseMemoryCtrlBase + toString(memorySlot))); } +// *************************************************************************** +CDBCtrlSheet *CSPhraseManager::getMemoryAltSlotCtrl(uint memorySlot) +{ + if(memorySlot>=PHRASE_MAX_MEMORY_SLOT) + return NULL; + + // Get the ctrl + CInterfaceManager *pIM= CInterfaceManager::getInstance(); + return dynamic_cast(pIM->getElementFromId(PhraseMemoryAltCtrlBase + toString(memorySlot))); +} + // *************************************************************************** void CSPhraseManager::updateMemoryCtrlState(uint memorySlot) { CDBCtrlSheet *ctrl= getMemorySlotCtrl(memorySlot); + CDBCtrlSheet *ctrlAlt= getMemoryAltSlotCtrl(memorySlot); if(ctrl) { // update the valid state. updateMemoryCtrlState(memorySlot, ctrl, getRightHandItemSkill()); } + if(ctrlAlt) + { + // update the valid state. + updateMemoryCtrlState(memorySlot, ctrlAlt, getRightHandItemSkill()); + } } // *************************************************************************** void CSPhraseManager::updateMemoryCtrlRegenTickRange(uint memorySlot) { CDBCtrlSheet *ctrl= getMemorySlotCtrl(memorySlot); + CDBCtrlSheet *ctrlAlt= getMemoryAltSlotCtrl(memorySlot); if(ctrl) { // update the valid state. updateMemoryCtrlRegenTickRange(memorySlot, ctrl); } + if(ctrlAlt) + { + // update the valid state. + updateMemoryCtrlRegenTickRange(memorySlot, ctrlAlt); + } } // *************************************************************************** diff --git a/code/ryzom/client/src/interface_v3/sphrase_manager.h b/code/ryzom/client/src/interface_v3/sphrase_manager.h index 0a934f4e2..bf40dcc35 100644 --- a/code/ryzom/client/src/interface_v3/sphrase_manager.h +++ b/code/ryzom/client/src/interface_v3/sphrase_manager.h @@ -34,6 +34,7 @@ const std::string PHRASE_DB_BOOK="UI:PHRASE:BOOK"; const std::string PHRASE_DB_PROGRESSION[2]= {"UI:PHRASE:PROGRESS_ACTIONS", "UI:PHRASE:PROGRESS_UPGRADES"}; const std::string PHRASE_DB_MEMORY="UI:PHRASE:MEMORY"; +const std::string PHRASE_DB_MEMORY_ALT="UI:PHRASE:MEMORY_ALT"; const std::string PHRASE_DB_EXECUTE_NEXT="UI:PHRASE:EXECUTE_NEXT:PHRASE"; const std::string PHRASE_DB_EXECUTE_NEXT_IS_CYCLIC="UI:PHRASE:EXECUTE_NEXT:ISCYCLIC"; const std::string PHRASE_DB_BOTCHAT="LOCAL:TRADING"; @@ -458,6 +459,7 @@ private: // Shortcut To Phrases Leaves std::vector _BookDbLeaves; std::vector _MemoryDbLeaves; + std::vector _MemoryAltDbLeaves; CCDBNodeLeaf *_NextExecuteLeaf; CCDBNodeLeaf *_NextExecuteIsCyclicLeaf; @@ -698,6 +700,7 @@ private: void updateMemoryCtrlRegenTickRange(uint memorySlot); CDBCtrlSheet *getMemorySlotCtrl(uint memorySlot); + CDBCtrlSheet *getMemoryAltSlotCtrl(uint memorySlot); CTickRange getRegenTickRange(const CSPhraseCom &phrase) const; diff --git a/code/ryzom/client/src/libwww.cpp b/code/ryzom/client/src/libwww.cpp index dc5c151bd..c4695840d 100644 --- a/code/ryzom/client/src/libwww.cpp +++ b/code/ryzom/client/src/libwww.cpp @@ -218,6 +218,14 @@ HTAttr p_attr[] = HTML_ATTR(P,QUICK_HELP_CONDITION), HTML_ATTR(P,QUICK_HELP_EVENTS), HTML_ATTR(P,QUICK_HELP_LINK), + HTML_ATTR(P,NAME), + { 0 } +}; + + +HTAttr div_attr[] = +{ + HTML_ATTR(DIV,NAME), { 0 } }; @@ -684,6 +692,8 @@ void initLibWWW() HTML_DTD->tags[HTML_A].number_of_attributes = sizeof(a_attr) / sizeof(HTAttr) - 1; //HTML_DTD->tags[HTML_I].attributes = a_attr; HTML_DTD->tags[HTML_I].number_of_attributes = 0; + HTML_DTD->tags[HTML_DIV].attributes = div_attr; + HTML_DTD->tags[HTML_DIV].number_of_attributes = sizeof(div_attr) / sizeof(HTAttr) - 1; // Set a request timeout // HTHost_setEventTimeout (30000); diff --git a/code/ryzom/client/src/libwww.h b/code/ryzom/client/src/libwww.h index f3f681268..5c686e39b 100644 --- a/code/ryzom/client/src/libwww.h +++ b/code/ryzom/client/src/libwww.h @@ -201,8 +201,15 @@ enum HTML_ATTR(P,QUICK_HELP_CONDITION) = 0, HTML_ATTR(P,QUICK_HELP_EVENTS), HTML_ATTR(P,QUICK_HELP_LINK), + HTML_ATTR(P,NAME), }; +enum +{ + HTML_ATTR(DIV,NAME) = 0, +}; + + #undef HTML_ATTR // *************************************************************************** diff --git a/code/ryzom/client/src/motion/user_controls.cpp b/code/ryzom/client/src/motion/user_controls.cpp index 8b20ae026..7ce5523b2 100644 --- a/code/ryzom/client/src/motion/user_controls.cpp +++ b/code/ryzom/client/src/motion/user_controls.cpp @@ -619,6 +619,7 @@ void CUserControls::commonMove() // MOUSE WHEEL // CEventsListener::TWheelState wheelState = EventsListener.getWheelState(); // Done all the time, to reset the state View.changeCameraDist((wheelState == CEventsListener::foreward), (wheelState == CEventsListener::backward)); + View.changeCameraDist(Actions.valide("camera_foreward"), Actions.valide("camera_backward")); // Camera Up/Down. View.changeCameraHeight(Actions.valide("camera_up"), Actions.valide("camera_down")); ////////////////// diff --git a/code/ryzom/client/src/net_manager.cpp b/code/ryzom/client/src/net_manager.cpp index 608eae45b..36a0767cd 100644 --- a/code/ryzom/client/src/net_manager.cpp +++ b/code/ryzom/client/src/net_manager.cpp @@ -895,6 +895,7 @@ void CInterfaceChatDisplayer::displayTell(/*TDataSetIndex senderIndex, */const u colorizeSender(finalString, senderPart, prop.getRGBA()); PeopleInterraction.ChatInput.Tell.displayTellMessage(/*senderIndex, */finalString, goodSenderName, prop.getRGBA(), 2, &windowVisible); + CInterfaceManager::getInstance()->log(finalString); // Open the free teller window CChatGroupWindow *pCGW = PeopleInterraction.getChatGroupWindow(); @@ -3216,9 +3217,13 @@ private: // get the content string (should have been received!) ucstring contentStr; + ucstring titleStr; if(!pSMC->getDynString(_TextId[ContentType], contentStr)) return; + if(!pSMC->getDynString(_TextId[TitleType], titleStr)) + return; + // if the string start with a @{Wxxxx} code, remove it and get the wanted window size sint w = 256; // default size to 256 !! bool is_webig = false; @@ -3273,23 +3278,36 @@ private: if (is_webig) { - CGroupHTML *groupHtml = dynamic_cast(pIM->getElementFromId("ui:interface:webig:content:html")); + CGroupHTML *groupHtml; + string group = titleStr.toString(); + // + group = group.substr(9, group.size()-10); + nlinfo("group = %s", group.c_str()); + groupHtml = dynamic_cast(pIM->getElementFromId("ui:interface:"+group+":content:html")); + if (!groupHtml) + { + groupHtml = dynamic_cast(pIM->getElementFromId("ui:interface:webig:content:html")); + group = "webig"; + } + if (groupHtml) { - - CGroupContainer *pGC = dynamic_cast(pIM->getElementFromId("ui:interface:webig")); - - if (contentStr.empty()) + CGroupContainer *pGC = dynamic_cast(pIM->getElementFromId("ui:interface:"+group)); + if (pGC) { - pGC->setActive(false); - } - else - { - pGC->setActive(true); - string url = contentStr.toString(); - addWebIGParams(url); - groupHtml->browse(url.c_str()); - pIM->setTopWindow(pGC); + if (contentStr.empty()) + { + pGC->setActive(false); + } + else + { + if (group == "webig") + pGC->setActive(true); + string url = contentStr.toString(); + addWebIGParams(url); + groupHtml->browse(url.c_str()); + pIM->setTopWindow(pGC); + } } } } diff --git a/code/ryzom/client/src/string_manager_client.cpp b/code/ryzom/client/src/string_manager_client.cpp index e46895368..6fd3400ae 100644 --- a/code/ryzom/client/src/string_manager_client.cpp +++ b/code/ryzom/client/src/string_manager_client.cpp @@ -1641,8 +1641,6 @@ const ucchar *CStringManagerClient::getSquadLocalizedDescription(NLMISC::CSheetI // *************************************************************************** void CStringManagerClient::replaceSBrickName(NLMISC::CSheetId id, const ucstring &name, const ucstring &desc, const ucstring &desc2) { - nlassert(!_SpecItem_MemoryCompressed); - std::string label= id.toString(); if (label.empty()) { @@ -1654,14 +1652,57 @@ void CStringManagerClient::replaceSBrickName(NLMISC::CSheetId id, const ucstrin lwrLabel= label; strlwr(lwrLabel); - map::iterator it(_SpecItem_TempMap.find(lwrLabel)); - if (it == _SpecItem_TempMap.end()) - return; + if (_SpecItem_MemoryCompressed) + { + ucchar *strName = (ucchar *)name.c_str(); + ucchar *strDesc = (ucchar *)desc.c_str(); + ucchar *strDesc2 = (ucchar *)desc2.c_str(); + CItemLight tmp; + tmp.Label = (char*)lwrLabel.c_str(); + vector::iterator it = lower_bound(_SpecItems.begin(), _SpecItems.end(), tmp, CItemLightComp()); - // Then replace - it->second.Name= name; - it->second.Desc= desc; - it->second.Desc2= desc2; + if (it != _SpecItems.end()) + { + if (strcmp(it->Label, lwrLabel.c_str()) == 0) + { + it->Name = strName; + it->Desc = strDesc; + it->Desc2 = strDesc2; + } + else + { + it->Label = tmp.Label; + it->Name = strName; + it->Desc = strDesc; + it->Desc2 = strDesc2; + } + } + else + { + tmp.Name = strName; + tmp.Desc = strDesc; + tmp.Desc2 = strDesc2; + _SpecItems.push_back(tmp); + } + } + else + { + map::iterator it(_SpecItem_TempMap.find(lwrLabel)); + if (it != _SpecItem_TempMap.end()) + { + it->second.Name= name; + it->second.Desc= desc; + it->second.Desc2= desc2; + } + else + { + CItem newItem; + newItem.Name = name; + newItem.Desc = desc; + newItem.Desc2 = desc2; + _SpecItem_TempMap.insert(pair(lwrLabel,newItem)); + } + } } From 1f52dfb05aa783ac30f3798e35d8ce98c012d656 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Thu, 26 May 2011 15:35:04 +0300 Subject: [PATCH 053/118] Added: #1303 Added initial context manager. --- .../src/plugins/core/CMakeLists.txt | 7 +- .../src/plugins/core/context_manager.cpp | 101 ++++++++++++++++++ .../src/plugins/core/context_manager.h | 67 ++++++++++++ .../src/plugins/core/core.cpp | 6 ++ .../object_viewer_qt/src/plugins/core/core.h | 1 + .../src/plugins/core/icontext.h | 10 ++ .../object_viewer_qt/src/plugins/core/icore.h | 2 + .../src/plugins/core/main_window.cpp | 11 +- .../src/plugins/core/main_window.h | 3 + 9 files changed, 205 insertions(+), 3 deletions(-) create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.h 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 06095790b..3140f02fb 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 @@ -18,15 +18,18 @@ SET(OVQT_CORE_PLUGIN_HDR core.h main_window.h menu_manager.h + context_manager.h settings_dialog.h search_paths_settings_page.h general_settings_page.h - plugin_view_dialog.h) + plugin_view_dialog.h +) SET(OVQT_CORE_PLUGIN_UIS settings_dialog.ui plugin_view_dialog.ui general_settings_page.ui - search_paths_settings_page.ui) + search_paths_settings_page.ui +) SET(OVQT_CORE_PLUGIN_RCS core.qrc) 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 new file mode 100644 index 000000000..5e3d2864c --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.cpp @@ -0,0 +1,101 @@ +// 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 "context_manager.h" +#include "icontext.h" + +// NeL includes +#include + +// Qt includes +#include + +namespace Core +{ + +struct ContextManagerPrivate +{ + explicit ContextManagerPrivate(QTabWidget *tabWidget); + QTabWidget *m_tabWidget; + QVector m_contexts; + int m_oldCurrent; +}; + +ContextManagerPrivate::ContextManagerPrivate(QTabWidget *tabWidget) + : m_tabWidget(tabWidget), + m_oldCurrent(-1) +{ +} + +ContextManager::ContextManager(QTabWidget *tabWidget) + : d(new ContextManagerPrivate(tabWidget)) +{ +} + +ContextManager::~ContextManager() +{ + delete d; +} + +Core::IContext* ContextManager::currentContext() const +{ + int currentIndex = d->m_tabWidget->currentIndex(); + if (currentIndex < 0) + return 0; + return d->m_contexts.at(currentIndex); +} + +Core::IContext* ContextManager::context(const QString &id) const +{ + const int index = indexOf(id); + if (index >= 0) + return d->m_contexts.at(index); + return 0; +} + +void ContextManager::activateContext(const QString &id) +{ + const int index = indexOf(id); + if (index >= 0) + d->m_tabWidget->setCurrentIndex(index); +} + +void ContextManager::addContextObject(IContext *context) +{ +} + +void ContextManager::removeContextObject(IContext *context) +{ +} + +void ContextManager::currentTabChanged(int index) +{ +} + +int ContextManager::indexOf(const QString &id) const +{ + for (int i = 0; i < d->m_contexts.count(); ++i) + { + if (d->m_contexts.at(i)->id() == id) + return i; + } + nlwarning(QString("Warning, no such context: %1").arg(id).toStdString().c_str()); + return -1; +} + +} /* namespace Core */ \ No newline at end of file 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 new file mode 100644 index 000000000..c0d4a2209 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/context_manager.h @@ -0,0 +1,67 @@ +// 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 CONTEXT_MANAGER_H +#define CONTEXT_MANAGER_H + +// Project includes +#include "core_global.h" + +// Qt includes +#include + +QT_BEGIN_NAMESPACE +class QTabWidget; +QT_END_NAMESPACE + +namespace Core +{ +class IContext; +struct ContextManagerPrivate; + +class CORE_EXPORT ContextManager : public QObject +{ + Q_OBJECT + +public: + explicit ContextManager(QTabWidget *tabWidget); + virtual ~ContextManager(); + + Core::IContext* currentContext() const; + Core::IContext* context(const QString &id) const; + +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); + +private Q_SLOTS: + void addContextObject(IContext *context); + void removeContextObject(IContext *context); + void currentTabChanged(int index); + +private: + int indexOf(const QString &id) const; + + ContextManagerPrivate *d; +}; + +} // namespace Core + +#endif // CONTEXT_MANAGER_H 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 6c681f15a..fa61b5700 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 @@ -18,6 +18,7 @@ #include "core.h" #include "imenu_manager.h" +#include "context_manager.h" #include "main_window.h" #include "../../extension_system/iplugin_manager.h" @@ -54,6 +55,11 @@ IMenuManager *CoreImpl::menuManager() const return m_mainWindow->menuManager(); } +ContextManager *CoreImpl::contextManager() const +{ + return m_mainWindow->contextManager(); +} + QSettings *CoreImpl::settings() const { return m_mainWindow->settings(); 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 d3b25b918..2613a06a5 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 @@ -38,6 +38,7 @@ public: QWidget *parent = 0); virtual IMenuManager *menuManager() const; + virtual ContextManager *contextManager() const; virtual QSettings *settings() const; virtual QMainWindow *mainWindow() const; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icontext.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icontext.h index 776246d8d..c012b5a0c 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icontext.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icontext.h @@ -56,6 +56,16 @@ public: /// The widget will be destroyed by the widget hierarchy when the main window closes virtual QWidget *widget() = 0; + + virtual bool open() + { + return false; + } + + virtual bool help() + { + return false; + } }; } // namespace Core 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 71f075973..13b22bfa5 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 @@ -36,6 +36,7 @@ class IPluginManager; namespace Core { class IMenuManager; +class ContextManager; class CORE_EXPORT ICore : public QObject { @@ -52,6 +53,7 @@ public: QWidget *parent = 0) = 0; virtual IMenuManager *menuManager() const = 0; + virtual ContextManager *contextManager() const = 0; virtual QSettings *settings() const = 0; virtual QMainWindow *mainWindow() const = 0; 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 e048aa80b..4d7ffc35e 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 @@ -20,6 +20,7 @@ #include "icontext.h" #include "icore_listener.h" #include "menu_manager.h" +#include "context_manager.h" #include "core.h" #include "core_constants.h" #include "settings_dialog.h" @@ -38,6 +39,7 @@ MainWindow::MainWindow(ExtensionSystem::IPluginManager *pluginManager, QWidget * : QMainWindow(parent), m_pluginManager(0), m_menuManager(0), + m_contextManager(0), m_coreImpl(0), m_lastDir("."), m_settings(0) @@ -59,10 +61,12 @@ MainWindow::MainWindow(ExtensionSystem::IPluginManager *pluginManager, QWidget * m_tabWidget = new QTabWidget(this); m_tabWidget->setTabPosition(QTabWidget::South); - m_tabWidget->setMovable(true); + m_tabWidget->setMovable(false); m_tabWidget->setDocumentMode(true); setCentralWidget(m_tabWidget); + m_contextManager = new ContextManager(m_tabWidget); + setDockNestingEnabled(true); m_originalPalette = QApplication::palette(); @@ -109,6 +113,11 @@ IMenuManager *MainWindow::menuManager() const return m_menuManager; } +ContextManager *MainWindow::contextManager() const +{ + return m_contextManager; +} + QSettings *MainWindow::settings() const { return m_settings; 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 4cc24e5eb..61ebddf30 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 @@ -35,6 +35,7 @@ class CorePlugin; class IContext; class IMenuManager; class MenuManager; +class ContextManager; class CoreImpl; class MainWindow : public QMainWindow @@ -49,6 +50,7 @@ public: void extensionsInitialized(); IMenuManager *menuManager() const; + ContextManager *contextManager() const; QSettings *settings() const; ExtensionSystem::IPluginManager *pluginManager() const; @@ -80,6 +82,7 @@ private: ExtensionSystem::IPluginManager *m_pluginManager; ExtensionSystem::CPluginView *m_pluginView; MenuManager *m_menuManager; + ContextManager *m_contextManager; CoreImpl *m_coreImpl; QPalette m_originalPalette; From 03475c59b202029492a266dc7f84d5d9892fe7f5 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Thu, 26 May 2011 17:03:49 +0300 Subject: [PATCH 054/118] Changed: #1303 Completed work on the context manager. --- .../src/plugins/core/context_manager.cpp | 55 +++++++++++++++++-- .../src/plugins/core/context_manager.h | 6 +- .../src/plugins/core/main_window.cpp | 27 +-------- .../src/plugins/core/main_window.h | 3 - .../landscape_editor_plugin.h | 2 +- .../landscape_editor_window.cpp | 7 ++- 6 files changed, 62 insertions(+), 38 deletions(-) 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 5e3d2864c..b0a13aee6 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 @@ -24,27 +24,36 @@ // Qt includes #include +#include namespace Core { struct ContextManagerPrivate { - explicit ContextManagerPrivate(QTabWidget *tabWidget); + explicit ContextManagerPrivate(ExtensionSystem::IPluginManager *pluginManager, QTabWidget *tabWidget); + ExtensionSystem::IPluginManager *m_pluginManager; QTabWidget *m_tabWidget; QVector m_contexts; int m_oldCurrent; }; -ContextManagerPrivate::ContextManagerPrivate(QTabWidget *tabWidget) - : m_tabWidget(tabWidget), +ContextManagerPrivate::ContextManagerPrivate(ExtensionSystem::IPluginManager *pluginManager, QTabWidget *tabWidget) + : m_pluginManager(pluginManager), + m_tabWidget(tabWidget), m_oldCurrent(-1) { } -ContextManager::ContextManager(QTabWidget *tabWidget) - : d(new ContextManagerPrivate(tabWidget)) +ContextManager::ContextManager(ExtensionSystem::IPluginManager *pluginManager, QTabWidget *tabWidget) + : d(new ContextManagerPrivate(pluginManager, tabWidget)) { + QObject::connect(d->m_pluginManager, SIGNAL(objectAdded(QObject *)), + this, SLOT(objectAdded(QObject *))); + QObject::connect(d->m_pluginManager, SIGNAL(aboutToRemoveObject(QObject *)), + this, SLOT(aboutToRemoveObject(QObject *))); + + QObject::connect(d->m_tabWidget, SIGNAL(currentChanged(int)), this, SLOT(currentTabChanged(int))); } ContextManager::~ContextManager() @@ -75,16 +84,52 @@ void ContextManager::activateContext(const QString &id) d->m_tabWidget->setCurrentIndex(index); } +void ContextManager::objectAdded(QObject *obj) +{ + IContext *context = qobject_cast(obj); + if (context) + addContextObject(context); +} + +void ContextManager::aboutToRemoveObject(QObject *obj) +{ + IContext *context = qobject_cast(obj); + if (context) + removeContextObject(context); +} + void ContextManager::addContextObject(IContext *context) { + d->m_contexts.push_back(context); + + QWidget *tabWidget = new QWidget(d->m_tabWidget); + d->m_tabWidget->addTab(tabWidget, context->icon(), context->trName()); + QGridLayout *gridLayout = new QGridLayout(tabWidget); + gridLayout->setObjectName(QString::fromUtf8("gridLayout_") + context->id()); + gridLayout->setContentsMargins(0, 0, 0, 0); + gridLayout->addWidget(context->widget(), 0, 0, 1, 1); } void ContextManager::removeContextObject(IContext *context) { + const int index = indexOf(context->id()); + QWidget *widget = d->m_tabWidget->widget(index); + d->m_tabWidget->removeTab(index); + d->m_contexts.remove(index); + delete widget; } void ContextManager::currentTabChanged(int index) { + if (index >= 0) + { + IContext *context = d->m_contexts.at(index); + IContext *oldContext = 0; + if (d->m_oldCurrent >= 0) + oldContext = d->m_contexts.at(d->m_oldCurrent); + d->m_oldCurrent = index; + Q_EMIT currentContextChanged(context, oldContext); + } } int ContextManager::indexOf(const QString &id) const 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 c0d4a2209..5264617a3 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 @@ -21,6 +21,8 @@ // Project includes #include "core_global.h" +#include "../../extension_system/iplugin_manager.h" + // Qt includes #include @@ -38,7 +40,7 @@ class CORE_EXPORT ContextManager : public QObject Q_OBJECT public: - explicit ContextManager(QTabWidget *tabWidget); + explicit ContextManager(ExtensionSystem::IPluginManager *pluginManager, QTabWidget *tabWidget); virtual ~ContextManager(); Core::IContext* currentContext() const; @@ -52,6 +54,8 @@ public Q_SLOTS: void activateContext(const QString &id); private Q_SLOTS: + void objectAdded(QObject *obj); + void aboutToRemoveObject(QObject *obj); void addContextObject(IContext *context); void removeContextObject(IContext *context); void currentTabChanged(int index); 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 4d7ffc35e..a4bc542b2 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,7 +65,7 @@ MainWindow::MainWindow(ExtensionSystem::IPluginManager *pluginManager, QWidget * m_tabWidget->setDocumentMode(true); setCentralWidget(m_tabWidget); - m_contextManager = new ContextManager(m_tabWidget); + m_contextManager = new ContextManager(m_pluginManager, m_tabWidget); setDockNestingEnabled(true); m_originalPalette = QApplication::palette(); @@ -96,14 +96,6 @@ bool MainWindow::initialize(QString *errorString) void MainWindow::extensionsInitialized() { - QList listContexts = m_pluginManager->getObjects(); - - Q_FOREACH(IContext *context, listContexts) - { - addContextObject(context); - } - - connect(m_pluginManager, SIGNAL(objectAdded(QObject *)), this, SLOT(checkObject(QObject *))); readSettings(); show(); } @@ -132,13 +124,6 @@ void MainWindow::open() { } -void MainWindow::checkObject(QObject *obj) -{ - IContext *context = qobject_cast(obj); - if (context) - addContextObject(context); -} - bool MainWindow::showOptionsDialog(const QString &group, const QString &page, QWidget *parent) @@ -177,16 +162,6 @@ void MainWindow::closeEvent(QCloseEvent *event) event->accept(); } -void MainWindow::addContextObject(IContext *context) -{ - QWidget *tabWidget = new QWidget(m_tabWidget); - m_tabWidget->addTab(tabWidget, context->icon(), context->trName()); - QGridLayout *gridLayout = new QGridLayout(tabWidget); - gridLayout->setObjectName(QString::fromUtf8("gridLayout_") + context->id()); - gridLayout->setContentsMargins(0, 0, 0, 0); - gridLayout->addWidget(context->widget(), 0, 0, 1, 1); -} - void MainWindow::createActions() { m_openAction = new QAction(tr("&Open..."), 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 61ebddf30..8c4a4aafe 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 @@ -62,15 +62,12 @@ public Q_SLOTS: private Q_SLOTS: void open(); - void checkObject(QObject *obj); void about(); protected: virtual void closeEvent(QCloseEvent *event); private: - void addContextObject(IContext *appPage); - void createActions(); void createMenus(); void createStatusBar(); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.h index 3b7df3777..bd5040843 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.h @@ -87,7 +87,7 @@ public: } virtual QString trName() const { - return tr("LandscapeEditor"); + return tr("Landscape Editor"); } virtual QIcon icon() const { 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 1588f6252..ef4f81a1c 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 @@ -23,6 +23,9 @@ #include "../core/imenu_manager.h" #include "../core/core_constants.h" +// NeL includes +#include + // Qt includes #include @@ -34,12 +37,12 @@ LandscapeEditorWindow::LandscapeEditorWindow(QWidget *parent) { m_ui.setupUi(this); createMenus(); -// readSettings(); + readSettings(); } LandscapeEditorWindow::~LandscapeEditorWindow() { -// writeSettings(); + writeSettings(); } void LandscapeEditorWindow::createMenus() From 35ccf299350631f4c661e7f9278350d33f6ee400 Mon Sep 17 00:00:00 2001 From: kervala Date: Thu, 26 May 2011 16:06:21 +0200 Subject: [PATCH 055/118] Changed: Merge changes from next patch --- code/ryzom/client/src/interface_v3/group_editbox.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ryzom/client/src/interface_v3/group_editbox.cpp b/code/ryzom/client/src/interface_v3/group_editbox.cpp index 66318a893..5bc516f47 100644 --- a/code/ryzom/client/src/interface_v3/group_editbox.cpp +++ b/code/ryzom/client/src/interface_v3/group_editbox.cpp @@ -713,7 +713,7 @@ void CGroupEditBox::handleEventChar(const CEventDescriptorKey &rEDK) // ---------------------------------------------------------------------------- void CGroupEditBox::handleEventString(const CEventDescriptorKey &rEDK) { - appendString(rEDK.getString()); + appendStringFromClipboard(rEDK.getString()); } // ---------------------------------------------------------------------------- From 28d1e2538b57dc224dc9deb7a4149d6e320d21f0 Mon Sep 17 00:00:00 2001 From: kervala Date: Thu, 26 May 2011 16:07:35 +0200 Subject: [PATCH 056/118] Changed: #825 Remove all warnings when compiling Ryzom --- code/nel/src/misc/sha1.cpp | 4 ++-- code/ryzom/client/src/client_cfg.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/nel/src/misc/sha1.cpp b/code/nel/src/misc/sha1.cpp index cb262ce9b..92929b469 100644 --- a/code/nel/src/misc/sha1.cpp +++ b/code/nel/src/misc/sha1.cpp @@ -232,7 +232,7 @@ CHashKey getHMacSHA1(const uint8 *text, uint32 text_len, const uint8 *key, uint3 // Get hash SHA1Reset(&sha); - SHA1Input(&sha, (const uint8_t*)buffer1.c_str(), buffer1.size()); + SHA1Input(&sha, (const uint8_t*)buffer1.c_str(), (uint)buffer1.size()); SHA1Result(&sha, SHA1_Key1); CHashKey hk1 (SHA1_Key1); @@ -246,7 +246,7 @@ CHashKey getHMacSHA1(const uint8 *text, uint32 text_len, const uint8 *key, uint3 // Get new hash SHA1Reset(&sha); - SHA1Input(&sha, (const uint8_t*)buffer2.c_str(), buffer2.size()); + SHA1Input(&sha, (const uint8_t*)buffer2.c_str(), (uint)buffer2.size()); SHA1Result(&sha, SHA1_Key2); CHashKey hk (SHA1_Key2); diff --git a/code/ryzom/client/src/client_cfg.cpp b/code/ryzom/client/src/client_cfg.cpp index 8a73510e1..94900e123 100644 --- a/code/ryzom/client/src/client_cfg.cpp +++ b/code/ryzom/client/src/client_cfg.cpp @@ -1942,7 +1942,7 @@ void CClientConfig::init(const string &configFileName) // save the updated config file NLMISC::COFile configFile(configFileName, false, true, false); - configFile.serialBuffer((uint8*)contentUtf8.c_str(), contentUtf8.size()); + configFile.serialBuffer((uint8*)contentUtf8.c_str(), (uint)contentUtf8.size()); configFile.close(); // now we can continue loading and parsing the config file From e655b0a7770d5a309d6f5fe2e950d06b41e5cc13 Mon Sep 17 00:00:00 2001 From: kervala Date: Thu, 26 May 2011 16:14:45 +0200 Subject: [PATCH 057/118] Changed: Use static_assert in nlctassert macro if C++0X is supported by compiler --- code/nel/include/nel/misc/debug.h | 6 +++++- code/nel/include/nel/misc/types_nl.h | 4 ++++ code/ryzom/client/src/interface_v3/ctrl_text_button.cpp | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/code/nel/include/nel/misc/debug.h b/code/nel/include/nel/misc/debug.h index f794e6fca..91f9d9c43 100644 --- a/code/nel/include/nel/misc/debug.h +++ b/code/nel/include/nel/misc/debug.h @@ -583,7 +583,11 @@ template inline T type_cast(U o) /** Compile time assertion */ -#define nlctassert(cond) sizeof(uint[(cond) ? 1 : 0]) +#ifdef NL_ISO_CPP0X_AVAILABLE +# define nlctassert(cond) static_assert(cond, "Compile time assert in "#cond) +#else +# define nlctassert(cond) sizeof(uint[(cond) ? 1 : 0]) +#endif /** * Allow to verify an object was accessed before its destructor call. diff --git a/code/nel/include/nel/misc/types_nl.h b/code/nel/include/nel/misc/types_nl.h index d0ad3cec7..de86c7659 100644 --- a/code/nel/include/nel/misc/types_nl.h +++ b/code/nel/include/nel/misc/types_nl.h @@ -117,6 +117,10 @@ # define NL_COMP_GCC #endif +#if defined(_HAS_CPP0X) || defined(__GXX_EXPERIMENTAL_CXX0X__) +# define NL_ISO_CPP0X_AVAILABLE +#endif + // gcc 3.4 introduced ISO C++ with tough template rules // // NL_ISO_SYNTAX can be used using #if NL_ISO_SYNTAX or #if !NL_ISO_SYNTAX diff --git a/code/ryzom/client/src/interface_v3/ctrl_text_button.cpp b/code/ryzom/client/src/interface_v3/ctrl_text_button.cpp index 55cae37e3..d2191a4eb 100644 --- a/code/ryzom/client/src/interface_v3/ctrl_text_button.cpp +++ b/code/ryzom/client/src/interface_v3/ctrl_text_button.cpp @@ -113,8 +113,8 @@ bool CCtrlTextButton::parse(xmlNodePtr cur, CInterfaceGroup * parentGroup) _TextureIdOver[2].setTexture((TxName+"_r.tga").c_str()); } - // Compute Bmp Sizes (crash with VC++ 2010) -// nlctassert(NumTexture==3); + // Compute Bmp Sizes + nlctassert(NumTexture==3); rVR.getTextureSizeFromId(_TextureIdNormal[0], _BmpLeftW, _BmpH); rVR.getTextureSizeFromId(_TextureIdNormal[1], _BmpMiddleW, _BmpH); rVR.getTextureSizeFromId(_TextureIdNormal[2], _BmpRightW, _BmpH); From 30819b35a7273b579ebf1c8b6361135e129958ba Mon Sep 17 00:00:00 2001 From: kervala Date: Thu, 26 May 2011 16:18:38 +0200 Subject: [PATCH 058/118] Changed: #1177 VS 2010 does not work under CMake --- code/nel/include/nel/misc/debug.h | 6 +++--- code/nel/include/nel/misc/smart_ptr.h | 2 +- code/nel/include/nel/misc/types_nl.h | 18 +++++++++--------- code/nel/src/3d/fasthls_modifier.cpp | 4 ++-- code/nel/src/net/sock.cpp | 4 +--- code/nel/src/net/tcp_sock.cpp | 4 +--- .../misc/extract_filename/extract_filename.cpp | 2 +- .../common/src/game_share/character_sync_itf.h | 4 +--- .../common/src/game_share/msg_ais_egs_gen.h | 4 +--- .../common/src/game_share/r2_modules_itf.h | 4 +--- .../ryzom/common/src/game_share/r2_share_itf.h | 4 +--- .../guild_manager/guild_unifier_itf.h | 4 +--- .../src/server_share/login_service_itf.h | 4 +--- .../shard_unifier_service/database_mapping.h | 4 +--- .../nel_database_mapping.h | 4 +--- 15 files changed, 26 insertions(+), 46 deletions(-) diff --git a/code/nel/include/nel/misc/debug.h b/code/nel/include/nel/misc/debug.h index 91f9d9c43..af92c4a16 100644 --- a/code/nel/include/nel/misc/debug.h +++ b/code/nel/include/nel/misc/debug.h @@ -169,7 +169,7 @@ void setCrashAlreadyReported(bool state); *\endcode */ #ifdef NL_NO_DEBUG -# if defined(NL_COMP_VC71) || defined(NL_COMP_VC8) || defined(NL_COMP_VC9) +# if defined(NL_COMP_VC71) || defined(NL_COMP_VC8) || defined(NL_COMP_VC9) || defined(NL_COMP_VC10) # define nldebug __noop # else # define nldebug 0&& @@ -184,7 +184,7 @@ void setCrashAlreadyReported(bool state); * Same as nldebug but it will be display in debug and in release mode. */ #ifdef NL_NO_DEBUG -# if defined(NL_COMP_VC71) || defined(NL_COMP_VC8) || defined(NL_COMP_VC9) +# if defined(NL_COMP_VC71) || defined(NL_COMP_VC8) || defined(NL_COMP_VC9) || defined(NL_COMP_VC10) # define nlinfo __noop # else # define nlinfo 0&& @@ -212,7 +212,7 @@ void setCrashAlreadyReported(bool state); */ #ifdef NL_NO_DEBUG -# if defined(NL_COMP_VC71) || defined(NL_COMP_VC8) || defined(NL_COMP_VC9) +# if defined(NL_COMP_VC71) || defined(NL_COMP_VC8) || defined(NL_COMP_VC9) || defined(NL_COMP_VC10) # define nlwarning __noop # else # define nlwarning 0&& diff --git a/code/nel/include/nel/misc/smart_ptr.h b/code/nel/include/nel/misc/smart_ptr.h index 50fbf4a4a..81b5c0e75 100644 --- a/code/nel/include/nel/misc/smart_ptr.h +++ b/code/nel/include/nel/misc/smart_ptr.h @@ -352,7 +352,7 @@ public: } }; -#if defined(NL_COMP_VC8) || defined(NL_COMP_VC9) +#if defined(NL_COMP_VC8) || defined(NL_COMP_VC9) || defined(NL_COMP_VC10) // This operator only purpose is to compare with NULL value template diff --git a/code/nel/include/nel/misc/types_nl.h b/code/nel/include/nel/misc/types_nl.h index de86c7659..08db88924 100644 --- a/code/nel/include/nel/misc/types_nl.h +++ b/code/nel/include/nel/misc/types_nl.h @@ -51,14 +51,10 @@ # ifndef _WIN32_WINNT # define _WIN32_WINNT 0x0500 // Minimal OS = Windows 2000 (NeL is not supported on Windows 95/98) # endif -# if _MSC_VER >= 1500 +# if _MSC_VER >= 1600 +# define NL_COMP_VC10 +# elif _MSC_VER >= 1500 # define NL_COMP_VC9 -# ifndef _STLPORT_VERSION // STLport doesn't depend on MS STL features -# if defined(_HAS_TR1) && (_HAS_TR1 + 0) // VC9 TR1 feature pack -# define NL_ISO_STDTR1_AVAILABLE -# define NL_ISO_STDTR1_HEADER(header)
-# endif -# endif # elif _MSC_VER >= 1400 # define NL_COMP_VC8 # undef nl_time @@ -79,6 +75,10 @@ # define NL_COMP_VC6 # define NL_COMP_NEED_PARAM_ON_METHOD # endif +# if defined(_HAS_TR1) && (_HAS_TR1 + 0) // VC9 TR1 feature pack or later +# define NL_ISO_STDTR1_AVAILABLE +# define NL_ISO_STDTR1_HEADER(header)
+# endif # ifdef _DEBUG # define NL_DEBUG # elif defined (NDEBUG) @@ -153,7 +153,7 @@ # pragma warning (disable : 4390) // don't warn in empty block "if(exp) ;" # pragma warning (disable : 4996) // 'vsnprintf': This function or variable may be unsafe. Consider using vsnprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. // Debug : Sept 01 2006 -# if defined(NL_COMP_VC8) || defined(NL_COMP_VC9) +# if defined(NL_COMP_VC8) || defined(NL_COMP_VC9) || defined(NL_COMP_VC10) # pragma warning (disable : 4005) // don't warn on redefinitions caused by xp platform sdk # endif // NL_COMP_VC8 || NL_COMP_VC9 #endif // NL_OS_WINDOWS @@ -366,7 +366,7 @@ typedef uint16 ucchar; // To define a 64bits constant; ie: UINT64_CONSTANT(0x123456781234) #ifdef NL_OS_WINDOWS -# if defined(NL_COMP_VC8) || defined(NL_COMP_VC9) +# if defined(NL_COMP_VC8) || defined(NL_COMP_VC9) || defined(NL_COMP_VC10) # define INT64_CONSTANT(c) (c##LL) # define SINT64_CONSTANT(c) (c##LL) # define UINT64_CONSTANT(c) (c##LL) diff --git a/code/nel/src/3d/fasthls_modifier.cpp b/code/nel/src/3d/fasthls_modifier.cpp index 6f90e574a..fb3fdd31d 100644 --- a/code/nel/src/3d/fasthls_modifier.cpp +++ b/code/nel/src/3d/fasthls_modifier.cpp @@ -109,7 +109,7 @@ CRGBA CFastHLSModifier::convert(uint H, uint L, uint S) return col; } -#if defined(NL_COMP_VC71) || defined(NL_COMP_VC8) || defined(NL_COMP_VC9) +#if defined(NL_COMP_VC71) || defined(NL_COMP_VC8) || defined(NL_COMP_VC9) || defined(NL_COMP_VC10) # pragma warning( push ) # pragma warning( disable : 4799 ) #endif @@ -262,7 +262,7 @@ uint16 CFastHLSModifier::applyHLSMod(uint16 colorIn, uint8 dHue, uint dLum, uin #pragma managed(pop) #endif -#if defined(NL_COMP_VC71) || defined(NL_COMP_VC8) || defined(NL_COMP_VC9) +#if defined(NL_COMP_VC71) || defined(NL_COMP_VC8) || defined(NL_COMP_VC9) || defined(NL_COMP_VC10) # pragma warning( pop ) #endif diff --git a/code/nel/src/net/sock.cpp b/code/nel/src/net/sock.cpp index 475548821..e2a0c4205 100644 --- a/code/nel/src/net/sock.cpp +++ b/code/nel/src/net/sock.cpp @@ -22,10 +22,8 @@ #include "nel/misc/hierarchical_timer.h" #ifdef NL_OS_WINDOWS -# if defined(NL_COMP_VC7) || defined(NL_COMP_VC71) || defined(NL_COMP_VC8) || defined(NL_COMP_VC9) -# include -# endif # define NOMINMAX +# include # include # define socklen_t int # define ERROR_NUM WSAGetLastError() diff --git a/code/nel/src/net/tcp_sock.cpp b/code/nel/src/net/tcp_sock.cpp index d51281db6..9773e0b00 100644 --- a/code/nel/src/net/tcp_sock.cpp +++ b/code/nel/src/net/tcp_sock.cpp @@ -20,9 +20,7 @@ #include "nel/net/net_log.h" #ifdef NL_OS_WINDOWS -# if defined(NL_COMP_VC7) || defined(NL_COMP_VC71) || defined(NL_COMP_VC8) || defined(NL_COMP_VC9) -# include -# endif +# include # define NOMINMAX # include # define socklen_t int diff --git a/code/nel/tools/misc/extract_filename/extract_filename.cpp b/code/nel/tools/misc/extract_filename/extract_filename.cpp index c8ca13452..39fead0e4 100644 --- a/code/nel/tools/misc/extract_filename/extract_filename.cpp +++ b/code/nel/tools/misc/extract_filename/extract_filename.cpp @@ -23,7 +23,7 @@ using namespace NLMISC; #ifdef NL_DEBUG #define INFO nlinfo #else // NL_DEBUG -# if defined(NL_COMP_VC71) || defined(NL_COMP_VC8) || defined(NL_COMP_VC9) +# if defined(NL_COMP_VC71) || defined(NL_COMP_VC8) || defined(NL_COMP_VC9) || defined(NL_COMP_VC10) # define INFO __noop # else # define INFO 0&& 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 728104322..840dd2845 100644 --- a/code/ryzom/common/src/game_share/character_sync_itf.h +++ b/code/ryzom/common/src/game_share/character_sync_itf.h @@ -21,9 +21,7 @@ #ifndef CHARACTER_SYNC_ITF #define CHARACTER_SYNC_ITF #include "nel/misc/types_nl.h" -#if defined(NL_COMP_VC8) || defined(NL_COMP_VC9) -# include -#endif +#include #include "nel/misc/hierarchical_timer.h" #include "nel/misc/string_conversion.h" #include "nel/net/message.h" 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 99de7c001..d7bfc39e7 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 @@ -21,9 +21,7 @@ #ifndef MSG_AIS_EGS_GEN #define MSG_AIS_EGS_GEN #include "nel/misc/types_nl.h" -#if defined(NL_COMP_VC8) || defined(NL_COMP_VC9) -# include -#endif +#include #include "nel/misc/hierarchical_timer.h" #include "nel/misc/string_conversion.h" #include "nel/net/message.h" diff --git a/code/ryzom/common/src/game_share/r2_modules_itf.h b/code/ryzom/common/src/game_share/r2_modules_itf.h index e8626cafd..d44f0ea5a 100644 --- a/code/ryzom/common/src/game_share/r2_modules_itf.h +++ b/code/ryzom/common/src/game_share/r2_modules_itf.h @@ -21,9 +21,7 @@ #ifndef R2_MODULES_ITF #define R2_MODULES_ITF #include "nel/misc/types_nl.h" -#if defined(NL_COMP_VC8) || defined(NL_COMP_VC9) -# include -#endif +#include #include "nel/misc/hierarchical_timer.h" #include "nel/misc/string_conversion.h" #include "nel/net/message.h" diff --git a/code/ryzom/common/src/game_share/r2_share_itf.h b/code/ryzom/common/src/game_share/r2_share_itf.h index 0d2956089..4e2abdf10 100644 --- a/code/ryzom/common/src/game_share/r2_share_itf.h +++ b/code/ryzom/common/src/game_share/r2_share_itf.h @@ -21,9 +21,7 @@ #ifndef R2_SHARE_ITF #define R2_SHARE_ITF #include "nel/misc/types_nl.h" -#if defined(NL_COMP_VC8) || defined(NL_COMP_VC9) -# include -#endif +#include #include "nel/misc/hierarchical_timer.h" #include "nel/misc/string_conversion.h" #include "nel/net/message.h" diff --git a/code/ryzom/server/src/entities_game_service/guild_manager/guild_unifier_itf.h b/code/ryzom/server/src/entities_game_service/guild_manager/guild_unifier_itf.h index 663497b62..1280fe6c2 100644 --- a/code/ryzom/server/src/entities_game_service/guild_manager/guild_unifier_itf.h +++ b/code/ryzom/server/src/entities_game_service/guild_manager/guild_unifier_itf.h @@ -21,9 +21,7 @@ #ifndef GUILD_UNIFIER_ITF #define GUILD_UNIFIER_ITF #include "nel/misc/types_nl.h" -#if defined(NL_COMP_VC8) || defined(NL_COMP_VC9) -# include -#endif +#include #include "nel/misc/hierarchical_timer.h" #include "nel/misc/string_conversion.h" #include "nel/net/message.h" diff --git a/code/ryzom/server/src/server_share/login_service_itf.h b/code/ryzom/server/src/server_share/login_service_itf.h index 3095b5d3b..bac7e2105 100644 --- a/code/ryzom/server/src/server_share/login_service_itf.h +++ b/code/ryzom/server/src/server_share/login_service_itf.h @@ -21,9 +21,7 @@ #ifndef LOGIN_SERVICE_ITF #define LOGIN_SERVICE_ITF #include "nel/misc/types_nl.h" -#if defined(NL_COMP_VC8) || defined(NL_COMP_VC9) -# include -#endif +#include #include "nel/misc/hierarchical_timer.h" #include "nel/misc/string_conversion.h" #include "nel/net/message.h" diff --git a/code/ryzom/server/src/shard_unifier_service/database_mapping.h b/code/ryzom/server/src/shard_unifier_service/database_mapping.h index 19503aa8e..d6f9b8689 100644 --- a/code/ryzom/server/src/shard_unifier_service/database_mapping.h +++ b/code/ryzom/server/src/shard_unifier_service/database_mapping.h @@ -21,9 +21,7 @@ #ifndef DATABASE_MAPPING #define DATABASE_MAPPING #include "nel/misc/types_nl.h" -#if defined(NL_COMP_VC8) || defined(NL_COMP_VC9) -# include -#endif +#include #include "nel/misc/hierarchical_timer.h" #include "nel/misc/string_conversion.h" #include "nel/net/message.h" diff --git a/code/ryzom/server/src/shard_unifier_service/nel_database_mapping.h b/code/ryzom/server/src/shard_unifier_service/nel_database_mapping.h index baae9bc4f..4081db824 100644 --- a/code/ryzom/server/src/shard_unifier_service/nel_database_mapping.h +++ b/code/ryzom/server/src/shard_unifier_service/nel_database_mapping.h @@ -21,9 +21,7 @@ #ifndef NEL_DATABASE_MAPPING #define NEL_DATABASE_MAPPING #include "nel/misc/types_nl.h" -#if defined(NL_COMP_VC8) || defined(NL_COMP_VC9) -# include -#endif +#include #include "nel/misc/hierarchical_timer.h" #include "nel/misc/string_conversion.h" #include "nel/net/message.h" From 24e2e07ef42932c42bf5c55c8f57b6f9b26d182b Mon Sep 17 00:00:00 2001 From: kervala Date: Thu, 26 May 2011 16:20:17 +0200 Subject: [PATCH 059/118] Changed: #878 Fix typos in comments/code --- code/nel/samples/3d/font/main.cpp | 3 +-- code/nel/src/georges/form_elm.cpp | 1 + code/nel/src/misc/shared_memory.cpp | 7 ++++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/code/nel/samples/3d/font/main.cpp b/code/nel/samples/3d/font/main.cpp index 1a417cae7..e834c4620 100644 --- a/code/nel/samples/3d/font/main.cpp +++ b/code/nel/samples/3d/font/main.cpp @@ -42,7 +42,6 @@ using namespace std; using namespace NL3D; using namespace NLMISC; - #ifdef NL_OS_WINDOWS int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, @@ -139,7 +138,7 @@ int main(int argc, char **argv) tc.setScaleX (scale); tc.setScaleZ (scale); tc.printAt (0.1f, 0.3f, string("printAt Scale String")); - + // display the same string with no scale tc.setHotSpot (CComputedString::TopLeft); tc.setScaleX (1.0f); diff --git a/code/nel/src/georges/form_elm.cpp b/code/nel/src/georges/form_elm.cpp index 528f6eec9..6f2f4c523 100644 --- a/code/nel/src/georges/form_elm.cpp +++ b/code/nel/src/georges/form_elm.cpp @@ -233,6 +233,7 @@ const CType* CFormElm::getType () warning (false, "getType", "This node is not an atom."); return 0; } + // *************************************************************************** bool CFormElm::getValue (string &/* result */, TEval /* evaluate */) const diff --git a/code/nel/src/misc/shared_memory.cpp b/code/nel/src/misc/shared_memory.cpp index 60d63b7d7..bb19981eb 100644 --- a/code/nel/src/misc/shared_memory.cpp +++ b/code/nel/src/misc/shared_memory.cpp @@ -36,8 +36,8 @@ namespace NLMISC { // Storage for file handles, necessary to close the handles map AccessAddressesToHandles; #else - // Storage for shmid, necessary to destroy the segments - map SharedMemIdsToShmids; + // Storage for shmid, necessary to destroy the segments + map SharedMemIdsToShmids; #endif @@ -71,7 +71,7 @@ void *CSharedMemory::createSharedMemory( TSharedMemId sharedMemId, uint32 size #else // Create a shared memory segment - int shmid = shmget( sharedMemId, size, IPC_CREAT | IPC_EXCL | 0666 ); + sint shmid = shmget( sharedMemId, size, IPC_CREAT | IPC_EXCL | 0666 ); if ( shmid == -1 ) return NULL; SharedMemIdsToShmids.insert( make_pair( sharedMemId, shmid ) ); @@ -82,6 +82,7 @@ void *CSharedMemory::createSharedMemory( TSharedMemId sharedMemId, uint32 size return NULL; else return accessAddress; + #endif } From 9f204828e767c275ce5b9a654a63c4b50c7b4b90 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Thu, 26 May 2011 17:28:10 +0300 Subject: [PATCH 060/118] Changed: #1303 Fix typos in comments/code --- .../src/plugins/core/context_manager.cpp | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) 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 b0a13aee6..23d544593 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 @@ -49,9 +49,9 @@ ContextManager::ContextManager(ExtensionSystem::IPluginManager *pluginManager, Q : d(new ContextManagerPrivate(pluginManager, tabWidget)) { QObject::connect(d->m_pluginManager, SIGNAL(objectAdded(QObject *)), - this, SLOT(objectAdded(QObject *))); + this, SLOT(objectAdded(QObject *))); QObject::connect(d->m_pluginManager, SIGNAL(aboutToRemoveObject(QObject *)), - this, SLOT(aboutToRemoveObject(QObject *))); + this, SLOT(aboutToRemoveObject(QObject *))); QObject::connect(d->m_tabWidget, SIGNAL(currentChanged(int)), this, SLOT(currentTabChanged(int))); } @@ -86,15 +86,15 @@ void ContextManager::activateContext(const QString &id) void ContextManager::objectAdded(QObject *obj) { - IContext *context = qobject_cast(obj); - if (context) + IContext *context = qobject_cast(obj); + if (context) addContextObject(context); } void ContextManager::aboutToRemoveObject(QObject *obj) { - IContext *context = qobject_cast(obj); - if (context) + IContext *context = qobject_cast(obj); + if (context) removeContextObject(context); } @@ -102,11 +102,11 @@ void ContextManager::addContextObject(IContext *context) { d->m_contexts.push_back(context); - QWidget *tabWidget = new QWidget(d->m_tabWidget); - d->m_tabWidget->addTab(tabWidget, context->icon(), context->trName()); - QGridLayout *gridLayout = new QGridLayout(tabWidget); - gridLayout->setObjectName(QString::fromUtf8("gridLayout_") + context->id()); - gridLayout->setContentsMargins(0, 0, 0, 0); + QWidget *tabWidget = new QWidget(d->m_tabWidget); + d->m_tabWidget->addTab(tabWidget, context->icon(), context->trName()); + QGridLayout *gridLayout = new QGridLayout(tabWidget); + gridLayout->setObjectName(QString::fromUtf8("gridLayout_") + context->id()); + gridLayout->setContentsMargins(0, 0, 0, 0); gridLayout->addWidget(context->widget(), 0, 0, 1, 1); } @@ -121,15 +121,15 @@ void ContextManager::removeContextObject(IContext *context) void ContextManager::currentTabChanged(int index) { - if (index >= 0) + if (index >= 0) { IContext *context = d->m_contexts.at(index); - IContext *oldContext = 0; - if (d->m_oldCurrent >= 0) - oldContext = d->m_contexts.at(d->m_oldCurrent); - d->m_oldCurrent = index; - Q_EMIT currentContextChanged(context, oldContext); - } + IContext *oldContext = 0; + if (d->m_oldCurrent >= 0) + oldContext = d->m_contexts.at(d->m_oldCurrent); + d->m_oldCurrent = index; + Q_EMIT currentContextChanged(context, oldContext); + } } int ContextManager::indexOf(const QString &id) const From bc3a3f6f7cf33683527da55b16212360974ee8dd Mon Sep 17 00:00:00 2001 From: kervala Date: Thu, 26 May 2011 18:08:04 +0200 Subject: [PATCH 061/118] Added: CMake project for mission_compiler_lib --- code/ryzom/tools/leveldesign/CMakeLists.txt | 4 +-- .../mission_compiler_lib/CMakeLists.txt | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 code/ryzom/tools/leveldesign/mission_compiler_lib/CMakeLists.txt diff --git a/code/ryzom/tools/leveldesign/CMakeLists.txt b/code/ryzom/tools/leveldesign/CMakeLists.txt index bcd1ed9a6..6cd25a9d3 100644 --- a/code/ryzom/tools/leveldesign/CMakeLists.txt +++ b/code/ryzom/tools/leveldesign/CMakeLists.txt @@ -3,6 +3,8 @@ ADD_SUBDIRECTORY(prim_export) ADD_SUBDIRECTORY(uni_conv) ADD_SUBDIRECTORY(csv_transform) ADD_SUBDIRECTORY(icon_search) +#ADD_SUBDIRECTORY(mission_compiler_fe) +ADD_SUBDIRECTORY(mission_compiler_lib) ADD_SUBDIRECTORY(mp_generator) ADD_SUBDIRECTORY(named_items_2_csv) @@ -24,8 +26,6 @@ ENDIF(WITH_QT) #icon_search #install #master -#mission_compiler_fe -#mission_compiler_lib #mission_simulator # #primitive_id_assignator diff --git a/code/ryzom/tools/leveldesign/mission_compiler_lib/CMakeLists.txt b/code/ryzom/tools/leveldesign/mission_compiler_lib/CMakeLists.txt new file mode 100644 index 000000000..c2dd48d41 --- /dev/null +++ b/code/ryzom/tools/leveldesign/mission_compiler_lib/CMakeLists.txt @@ -0,0 +1,27 @@ +FILE(GLOB LIBSRC mission_compiler.cpp + mission_compiler.h + step.h + step_content.cpp + steps.cpp + variables.cpp) + +INCLUDE_DIRECTORIES(${NEL_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}) + +NL_TARGET_LIB(ryzom_mission_compiler_lib ${LIBSRC}) + +TARGET_LINK_LIBRARIES(ryzom_mission_compiler_lib nelmisc nelligo) +NL_DEFAULT_PROPS(ryzom_mission_compiler_lib "Ryzom, Library: Mission Compiler") +NL_ADD_RUNTIME_FLAGS(ryzom_mission_compiler_lib) +NL_ADD_LIB_SUFFIX(ryzom_mission_compiler_lib) + +INSTALL(TARGETS ryzom_mission_compiler_lib LIBRARY DESTINATION lib ARCHIVE DESTINATION lib COMPONENT libraries) + +FILE(GLOB EXESRC main.cpp) + +ADD_EXECUTABLE(ryzom_mission_compiler ${EXESRC}) + +TARGET_LINK_LIBRARIES(ryzom_mission_compiler ryzom_mission_compiler_lib) +NL_DEFAULT_PROPS(ryzom_mission_compiler "Ryzom, Tools, Misc: Mission Compiler") +NL_ADD_RUNTIME_FLAGS(ryzom_mission_compiler) + +INSTALL(TARGETS ryzom_mission_compiler RUNTIME DESTINATION bin COMPONENT tools) From 39c30152b9f9bdfe74c5c55f610ff29fb2dcae01 Mon Sep 17 00:00:00 2001 From: kervala Date: Thu, 26 May 2011 18:21:06 +0200 Subject: [PATCH 062/118] Added: CMake project for mission_compiler_fe --- code/ryzom/tools/leveldesign/CMakeLists.txt | 5 ++++- .../mission_compiler_fe/CMakeLists.txt | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 code/ryzom/tools/leveldesign/mission_compiler_fe/CMakeLists.txt diff --git a/code/ryzom/tools/leveldesign/CMakeLists.txt b/code/ryzom/tools/leveldesign/CMakeLists.txt index 6cd25a9d3..be22df62c 100644 --- a/code/ryzom/tools/leveldesign/CMakeLists.txt +++ b/code/ryzom/tools/leveldesign/CMakeLists.txt @@ -3,7 +3,6 @@ ADD_SUBDIRECTORY(prim_export) ADD_SUBDIRECTORY(uni_conv) ADD_SUBDIRECTORY(csv_transform) ADD_SUBDIRECTORY(icon_search) -#ADD_SUBDIRECTORY(mission_compiler_fe) ADD_SUBDIRECTORY(mission_compiler_lib) ADD_SUBDIRECTORY(mp_generator) ADD_SUBDIRECTORY(named_items_2_csv) @@ -13,6 +12,10 @@ IF(WIN32) ADD_SUBDIRECTORY(world_editor) ENDIF(WIN32) +IF(WITH_MFC) + ADD_SUBDIRECTORY(mission_compiler_fe) +ENDIF(WITH_MFC) + IF(WITH_QT) ADD_SUBDIRECTORY(georges_editor_qt) ENDIF(WITH_QT) diff --git a/code/ryzom/tools/leveldesign/mission_compiler_fe/CMakeLists.txt b/code/ryzom/tools/leveldesign/mission_compiler_fe/CMakeLists.txt new file mode 100644 index 000000000..572060089 --- /dev/null +++ b/code/ryzom/tools/leveldesign/mission_compiler_fe/CMakeLists.txt @@ -0,0 +1,16 @@ +FILE(GLOB SRC *.cpp *.h) + +ADD_DEFINITIONS(${MFC_DEFINITIONS}) +SET(CMAKE_MFC_FLAG 2) +ADD_EXECUTABLE(ryzom_mission_compiler_fe WIN32 ${SRC} mission_compiler_fe.rc) + +TARGET_LINK_LIBRARIES(ryzom_mission_compiler_fe nelmisc nelligo ryzom_mission_compiler_lib) + +NL_DEFAULT_PROPS(ryzom_mission_compiler_fe "Ryzom, Tools, Misc: Mission Compiler Frontend") +NL_ADD_RUNTIME_FLAGS(ryzom_mission_compiler_fe) + +IF(WITH_PCH) + ADD_NATIVE_PRECOMPILED_HEADER(ryzom_mission_compiler_fe ${CMAKE_CURRENT_SOURCE_DIR}/StdAfx.h ${CMAKE_CURRENT_SOURCE_DIR}/StdAfx.cpp) +ENDIF(WITH_PCH) + +INSTALL(TARGETS ryzom_mission_compiler_fe RUNTIME DESTINATION bin COMPONENT tools) From aa8000d0e0ecab56e45d536a04ffddb3ae56d2a9 Mon Sep 17 00:00:00 2001 From: rti Date: Thu, 26 May 2011 20:16:57 +0200 Subject: [PATCH 063/118] Changed: #1206 only search for plugins having the ovqt_plugin prefix in its name --- .../object_viewer_qt/src/extension_system/plugin_manager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 21c6e15b1..be5f18c74 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 @@ -151,9 +151,9 @@ void CPluginManager::readPluginPaths() { const QDir dir(searchPaths.takeFirst()); #ifdef Q_OS_WIN - const QFileInfoList files = dir.entryInfoList(QStringList() << QString("*.dll"), QDir::Files); + const QFileInfoList files = dir.entryInfoList(QStringList() << QString("ovqt_plugin_*.dll"), QDir::Files); #else - const QFileInfoList files = dir.entryInfoList(QStringList() << QString("*.so"), QDir::Files); + const QFileInfoList files = dir.entryInfoList(QStringList() << QString("libovqt_plugin_*.so"), QDir::Files); #endif Q_FOREACH (const QFileInfo &file, files) pluginsList << file.absoluteFilePath(); From 785c5be8d884789f628269d7bedd0908bc0a20da Mon Sep 17 00:00:00 2001 From: kervala Date: Thu, 26 May 2011 20:47:04 +0200 Subject: [PATCH 064/118] Changed: #878 Fix typos in comments/code --- .../common/src/game_share/mirror_prop_value.h | 35 +++++++++---------- code/ryzom/server/src/ai_service/commands.cpp | 2 +- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/code/ryzom/common/src/game_share/mirror_prop_value.h b/code/ryzom/common/src/game_share/mirror_prop_value.h index 553c73b96..08e96761d 100644 --- a/code/ryzom/common/src/game_share/mirror_prop_value.h +++ b/code/ryzom/common/src/game_share/mirror_prop_value.h @@ -1022,14 +1022,14 @@ struct _CMirrorPropValueListIterator CMirrorPropValueList *_ParentList; TSharedListRow _Index; - typedef T value_type; - typedef value_type* pointer; - typedef const value_type* const_pointer; - typedef value_type& reference; - typedef const value_type& const_reference; - typedef size_t size_type; - typedef ptrdiff_t difference_type; - // typedef typename std::forward_iterator_tag iterator_category; + typedef T value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + // typedef typename std::forward_iterator_tag iterator_category; }; @@ -1050,15 +1050,14 @@ struct _CCMirrorPropValueListIterator CMirrorPropValueList *_ParentList; TSharedListRow _Index; - typedef T value_type; - typedef value_type* pointer; - typedef const value_type* const_pointer; - typedef value_type& reference; - typedef const value_type& const_reference; - typedef size_t size_type; - typedef ptrdiff_t difference_type; - // typedef typename std::forward_iterator_tag iterator_category; - + typedef T value_type; + typedef value_type* pointer; + typedef const value_type* const_pointer; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef size_t size_type; + typedef ptrdiff_t difference_type; + // typedef typename std::forward_iterator_tag iterator_category; }; @@ -1232,7 +1231,7 @@ class CMirrorPropValueList { public: - typedef CPropLocationUnpacked CPropLocationClass; + typedef CPropLocationUnpacked CPropLocationClass; typedef uint32 size_type; typedef _CMirrorPropValueListIterator iterator; diff --git a/code/ryzom/server/src/ai_service/commands.cpp b/code/ryzom/server/src/ai_service/commands.cpp index f3317e68f..49b5af2a8 100644 --- a/code/ryzom/server/src/ai_service/commands.cpp +++ b/code/ryzom/server/src/ai_service/commands.cpp @@ -2437,7 +2437,7 @@ NLMISC_COMMAND(setGrpTimers,"set the timer values for a given group"," < void cbTick(); extern uint ForceTicks; -NLMISC_COMMAND(updateAI,"call CAIS::update() (simulate a tick off-line)","") +NLMISC_COMMAND(updateAI,"call CAIS::update() (simulate a tick off-line)","[tick]") { if(args.size() >1) return false; From ef98e683a35fe137f88b28f9f987eae891f2347d Mon Sep 17 00:00:00 2001 From: rti Date: Thu, 26 May 2011 20:57:23 +0200 Subject: [PATCH 065/118] Fixed: Build error and assert when disabling NL_FORCE_INDEX_BUFFER_16 --- code/nel/src/3d/mesh_mrm_skinned.cpp | 2 +- code/nel/src/3d/ps_mesh.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/nel/src/3d/mesh_mrm_skinned.cpp b/code/nel/src/3d/mesh_mrm_skinned.cpp index 8b7f1fa63..f1c49bd56 100644 --- a/code/nel/src/3d/mesh_mrm_skinned.cpp +++ b/code/nel/src/3d/mesh_mrm_skinned.cpp @@ -1867,7 +1867,7 @@ void CMeshMRMSkinnedGeom::updateRawSkinNormal(bool enabled, CMeshMRMSkinnedInst CIndexBufferReadWrite ibaWrite; skinLod.RdrPass[i].lock (ibaWrite); #ifndef NL_SKINNED_MESH_MRM_INDEX16 - nlassert(ibaWrite.getFormat() == CIndexBuffer::Indices32) + nlassert(ibaWrite.getFormat() == CIndexBuffer::Indices32); uint32 *dstTriPtr= (uint32 *) ibaWrite.getPtr(); uint32 numIndices= lod.RdrPass[i].PBlock.size(); for(uint j=0;j Date: Thu, 26 May 2011 22:07:59 +0300 Subject: [PATCH 066/118] Changed: #1193 Added a button to clear the zone list in settings page. --- .../plugins/object_viewer/vegetable_settings_page.cpp | 1 + .../plugins/object_viewer/vegetable_settings_page.ui | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_settings_page.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_settings_page.cpp index f794e0b73..7349a8465 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_settings_page.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_settings_page.cpp @@ -81,6 +81,7 @@ QWidget *VegetableSettingsPage::createPage(QWidget *parent) connect(m_ui.coarseToolButton, SIGNAL(clicked()), this, SLOT(setCoarseMeshTexture())); connect(m_ui.addZoneToolButton, SIGNAL(clicked()), this, SLOT(addZone())); connect(m_ui.removeZoneToolButton, SIGNAL(clicked()), this, SLOT(removeZone())); + connect(m_ui.clearButton, SIGNAL(clicked()), m_ui.zonesListWidget, SLOT(clear())); return m_page; } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_settings_page.ui b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_settings_page.ui index 0d4a41cf2..13deb2d4e 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_settings_page.ui +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_settings_page.ui @@ -181,6 +181,17 @@ + + + + + + + + :/icons/ic_nel_reset_all.png:/icons/ic_nel_reset_all.png + + + From 9bcc675bca8362d1bb084e0d79699d5467b5f8a6 Mon Sep 17 00:00:00 2001 From: rti Date: Thu, 26 May 2011 21:50:00 +0200 Subject: [PATCH 067/118] Added: FindIconv which is needed for a completely static client build on Mac OS X --- code/CMakeLists.txt | 6 +++ code/CMakeModules/FindIconv.cmake | 83 +++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 code/CMakeModules/FindIconv.cmake diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 3f477d9c4..004dee0db 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -125,6 +125,12 @@ IF(WITH_STATIC) # libxml2 could need winsock2 library SET(LIBXML2_DEFINITIONS ${LIBXML2_DEFINITIONS} -DLIBXML_STATIC) SET(LIBXML2_LIBRARIES ${LIBXML2_LIBRARIES} ${WINSOCK2_LIB}) + + # on Mac OS X libxml2 requieres iconv + IF(APPLE) + FIND_PACKAGE(Iconv REQUIRED) + SET(LIBXML2_LIBRARIES ${LIBXML2_LIBRARIES} ${ICONV_LIBRARIES}) + ENDIF(APPLE) ENDIF(WITH_STATIC) IF(WITH_STLPORT) diff --git a/code/CMakeModules/FindIconv.cmake b/code/CMakeModules/FindIconv.cmake new file mode 100644 index 000000000..5e9e48250 --- /dev/null +++ b/code/CMakeModules/FindIconv.cmake @@ -0,0 +1,83 @@ +# - Try to find Iconv on Mac OS X +# Once done this will define +# +# ICONV_FOUND - system has Iconv +# ICONV_INCLUDE_DIR - the Iconv include directory +# ICONV_LIBRARIES - Link these to use Iconv +# ICONV_SECOND_ARGUMENT_IS_CONST - the second argument for iconv() is const +# + +IF(APPLE) + include(CheckCCompilerFlag) + include(CheckCSourceCompiles) + + IF (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) + # Already in cache, be silent + SET(ICONV_FIND_QUIETLY TRUE) + ENDIF (ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) + + IF(APPLE) + FIND_PATH(ICONV_INCLUDE_DIR iconv.h + PATHS + /opt/local/include/ + NO_CMAKE_SYSTEM_PATH + ) + + FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv c + PATHS + /opt/local/lib/ + NO_CMAKE_SYSTEM_PATH + ) + ENDIF(APPLE) + + FIND_PATH(ICONV_INCLUDE_DIR iconv.h PATHS /opt/local/include /sw/include) + + string(REGEX REPLACE "(.*)/include/?" "\\1" ICONV_INCLUDE_BASE_DIR "${ICONV_INCLUDE_DIR}") + + FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv c HINTS "${ICONV_INCLUDE_BASE_DIR}/lib" PATHS /opt/local/lib) + + IF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) + SET(ICONV_FOUND TRUE) + ENDIF(ICONV_INCLUDE_DIR AND ICONV_LIBRARIES) + + set(CMAKE_REQUIRED_INCLUDES ${ICONV_INCLUDE_DIR}) + set(CMAKE_REQUIRED_LIBRARIES ${ICONV_LIBRARIES}) + IF(ICONV_FOUND) + check_c_compiler_flag("-Werror" ICONV_HAVE_WERROR) + set (CMAKE_C_FLAGS_BACKUP "${CMAKE_C_FLAGS}") + if(ICONV_HAVE_WERROR) + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") + endif(ICONV_HAVE_WERROR) + check_c_source_compiles(" + #include + int main(){ + iconv_t conv = 0; + const char* in = 0; + size_t ilen = 0; + char* out = 0; + size_t olen = 0; + iconv(conv, &in, &ilen, &out, &olen); + return 0; + } + " ICONV_SECOND_ARGUMENT_IS_CONST ) + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS_BACKUP}") + ENDIF(ICONV_FOUND) + set(CMAKE_REQUIRED_INCLUDES) + set(CMAKE_REQUIRED_LIBRARIES) + + IF(ICONV_FOUND) + IF(NOT ICONV_FIND_QUIETLY) + MESSAGE(STATUS "Found Iconv: ${ICONV_LIBRARIES}") + ENDIF(NOT ICONV_FIND_QUIETLY) + ELSE(ICONV_FOUND) + IF(Iconv_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find Iconv") + ENDIF(Iconv_FIND_REQUIRED) + ENDIF(ICONV_FOUND) + + MARK_AS_ADVANCED( + ICONV_INCLUDE_DIR + ICONV_LIBRARIES + ICONV_SECOND_ARGUMENT_IS_CONST + ) +ENDIF(APPLE) From a0b1d0e77882627f5518324928c0d2ac0b74636f Mon Sep 17 00:00:00 2001 From: rti Date: Thu, 26 May 2011 23:29:56 +0200 Subject: [PATCH 068/118] Changed: #1193 Let Qt handle events in GraphicsViewport widget as well (solves focus problem, tested on mac) --- .../src/plugins/object_viewer/graphics_viewport.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) 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 c5d1ae677..93bc1043e 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 @@ -134,6 +134,9 @@ bool CGraphicsViewport::winEvent(MSG *message, long *result) if (driver) { winProc proc = (winProc)driver->getWindowProc(); + + // 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); } } @@ -156,10 +159,12 @@ bool CGraphicsViewport::macEvent(EventHandlerCallRef caller, EventRef event) if (driver) { cocoaProc proc = (cocoaProc)driver->getWindowProc(); - return proc(driver, event); + proc(driver, event); } } + // return false to let Qt handle the event as well, + // else the widget would never get focus return false; } @@ -175,10 +180,13 @@ bool CGraphicsViewport::x11Event(XEvent *event) if (driver) { x11Proc proc = (x11Proc)driver->getWindowProc(); - return proc(driver, event); + proc(driver, event); } } + // 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; } #endif From fbbdb15ad2a10b2cf2d027efa7d3ebc416033c3b Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Fri, 27 May 2011 17:06:30 +0300 Subject: [PATCH 069/118] Changed: #1303 Each context must have its own file open dialog, which will be called when the context is active. The beginning of work on adding undo/redo. --- .../src/plugins/core/context_manager.cpp | 21 ++++++++++--------- .../src/plugins/core/context_manager.h | 9 ++++---- .../plugins/core/general_settings_page.cpp | 5 +++++ .../src/plugins/core/general_settings_page.h | 1 + .../src/plugins/core/icontext.h | 10 +-------- .../src/plugins/core/ioptions_page.h | 3 +++ .../src/plugins/core/main_window.cpp | 10 +++++++-- .../src/plugins/core/main_window.h | 2 ++ .../core/search_paths_settings_page.cpp | 5 +++++ .../plugins/core/search_paths_settings_page.h | 1 + .../plugins/example/example_settings_page.cpp | 5 +++++ .../plugins/example/example_settings_page.h | 1 + .../src/plugins/example/plugin1.h | 4 ++++ .../landscape_editor_plugin.h | 5 +++++ .../object_viewer/graphics_settings_page.cpp | 5 +++++ .../object_viewer/graphics_settings_page.h | 1 + .../src/plugins/object_viewer/main_window.cpp | 4 ++-- .../src/plugins/object_viewer/main_window.h | 4 +++- .../object_viewer/object_viewer_plugin.cpp | 5 +++++ .../object_viewer/object_viewer_plugin.h | 5 +++++ .../object_viewer/sound_settings_page.cpp | 5 +++++ .../object_viewer/sound_settings_page.h | 1 + .../object_viewer/vegetable_settings_page.cpp | 5 +++++ .../object_viewer/vegetable_settings_page.h | 1 + 24 files changed, 89 insertions(+), 29 deletions(-) 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 23d544593..23dbe02f4 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 @@ -18,6 +18,7 @@ // Project includes #include "context_manager.h" #include "icontext.h" +#include "main_window.h" // NeL includes #include @@ -31,26 +32,26 @@ namespace Core struct ContextManagerPrivate { - explicit ContextManagerPrivate(ExtensionSystem::IPluginManager *pluginManager, QTabWidget *tabWidget); - ExtensionSystem::IPluginManager *m_pluginManager; + explicit ContextManagerPrivate(Core::MainWindow *mainWindow, QTabWidget *tabWidget); + Core::MainWindow *m_mainWindow; QTabWidget *m_tabWidget; QVector m_contexts; int m_oldCurrent; }; -ContextManagerPrivate::ContextManagerPrivate(ExtensionSystem::IPluginManager *pluginManager, QTabWidget *tabWidget) - : m_pluginManager(pluginManager), +ContextManagerPrivate::ContextManagerPrivate(Core::MainWindow *mainWindow, QTabWidget *tabWidget) + : m_mainWindow(mainWindow), m_tabWidget(tabWidget), m_oldCurrent(-1) { } -ContextManager::ContextManager(ExtensionSystem::IPluginManager *pluginManager, QTabWidget *tabWidget) - : d(new ContextManagerPrivate(pluginManager, tabWidget)) +ContextManager::ContextManager(Core::MainWindow *mainWindow, QTabWidget *tabWidget) + : d(new ContextManagerPrivate(mainWindow, tabWidget)) { - QObject::connect(d->m_pluginManager, SIGNAL(objectAdded(QObject *)), + QObject::connect(d->m_mainWindow->pluginManager(), SIGNAL(objectAdded(QObject *)), this, SLOT(objectAdded(QObject *))); - QObject::connect(d->m_pluginManager, SIGNAL(aboutToRemoveObject(QObject *)), + QObject::connect(d->m_mainWindow->pluginManager(), SIGNAL(aboutToRemoveObject(QObject *)), this, SLOT(aboutToRemoveObject(QObject *))); QObject::connect(d->m_tabWidget, SIGNAL(currentChanged(int)), this, SLOT(currentTabChanged(int))); @@ -61,7 +62,7 @@ ContextManager::~ContextManager() delete d; } -Core::IContext* ContextManager::currentContext() const +Core::IContext *ContextManager::currentContext() const { int currentIndex = d->m_tabWidget->currentIndex(); if (currentIndex < 0) @@ -69,7 +70,7 @@ Core::IContext* ContextManager::currentContext() const return d->m_contexts.at(currentIndex); } -Core::IContext* ContextManager::context(const QString &id) const +Core::IContext *ContextManager::context(const QString &id) const { const int index = indexOf(id); if (index >= 0) 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 5264617a3..7a3658fff 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 @@ -21,8 +21,6 @@ // Project includes #include "core_global.h" -#include "../../extension_system/iplugin_manager.h" - // Qt includes #include @@ -33,6 +31,7 @@ QT_END_NAMESPACE namespace Core { class IContext; +class MainWindow; struct ContextManagerPrivate; class CORE_EXPORT ContextManager : public QObject @@ -40,11 +39,11 @@ class CORE_EXPORT ContextManager : public QObject Q_OBJECT public: - explicit ContextManager(ExtensionSystem::IPluginManager *pluginManager, QTabWidget *tabWidget); + explicit ContextManager(Core::MainWindow *mainWindow, QTabWidget *tabWidget); virtual ~ContextManager(); - Core::IContext* currentContext() const; - Core::IContext* context(const QString &id) const; + Core::IContext *currentContext() const; + Core::IContext *context(const QString &id) const; Q_SIGNALS: // the default argument '=0' is important for connects without the oldContext argument. 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 47bf4026a..51da80f67 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 @@ -65,6 +65,11 @@ QString GeneralSettingsPage::trCategory() const return tr(Constants::SETTINGS_TR_CATEGORY_GENERAL); } +QIcon GeneralSettingsPage::categoryIcon() const +{ + return QIcon(); +} + void GeneralSettingsPage::applyGeneralSettings() { QSettings *settings = Core::ICore::instance()->settings(); 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 2f73f8715..2fbcb842a 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 @@ -44,6 +44,7 @@ public: QString trName() const; QString category() const; QString trCategory() const; + QIcon categoryIcon() const; QWidget *createPage(QWidget *parent); void apply(); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icontext.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icontext.h index c012b5a0c..c6784dafe 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icontext.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icontext.h @@ -57,15 +57,7 @@ public: /// The widget will be destroyed by the widget hierarchy when the main window closes virtual QWidget *widget() = 0; - virtual bool open() - { - return false; - } - - virtual bool help() - { - return false; - } + virtual void open() = 0; }; } // namespace Core diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/ioptions_page.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/ioptions_page.h index 74692833a..4d9ed6fda 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/ioptions_page.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/ioptions_page.h @@ -27,6 +27,7 @@ QT_BEGIN_NAMESPACE class QWidget; +class QIcon; QT_END_NAMESPACE namespace Core @@ -56,6 +57,8 @@ public: /// trCategory() is the translated category virtual QString trCategory() const = 0; + virtual QIcon categoryIcon() const = 0; + /// createPage() is called to retrieve the widget to show in the preferences dialog /// The widget will be destroyed by the widget hierarchy when the dialog closes virtual QWidget *createPage(QWidget *parent) = 0; 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 a4bc542b2..1c8850508 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 @@ -42,6 +42,7 @@ MainWindow::MainWindow(ExtensionSystem::IPluginManager *pluginManager, QWidget * m_contextManager(0), m_coreImpl(0), m_lastDir("."), + m_undoGroup(0), m_settings(0) { QCoreApplication::setApplicationName(QLatin1String("ObjectViewerQt")); @@ -65,10 +66,11 @@ MainWindow::MainWindow(ExtensionSystem::IPluginManager *pluginManager, QWidget * m_tabWidget->setDocumentMode(true); setCentralWidget(m_tabWidget); - m_contextManager = new ContextManager(m_pluginManager, m_tabWidget); + m_contextManager = new ContextManager(this, m_tabWidget); setDockNestingEnabled(true); m_originalPalette = QApplication::palette(); + m_undoGroup = new QUndoGroup(this); createDialogs(); createActions(); @@ -122,6 +124,7 @@ ExtensionSystem::IPluginManager *MainWindow::pluginManager() const void MainWindow::open() { + m_contextManager->currentContext()->open(); } bool MainWindow::showOptionsDialog(const QString &group, @@ -212,11 +215,14 @@ void MainWindow::createMenus() { m_fileMenu = menuBar()->addMenu(tr("&File")); menuManager()->registerMenu(m_fileMenu, Constants::M_FILE); -// m_fileMenu->addAction(m_openAction); + m_fileMenu->addAction(m_openAction); m_fileMenu->addSeparator(); m_fileMenu->addAction(m_exitAction); m_editMenu = menuBar()->addMenu(tr("&Edit")); + m_editMenu->addAction(m_undoGroup->createUndoAction(this)); + m_editMenu->addAction(m_undoGroup->createRedoAction(this)); + m_editMenu->addSeparator(); menuManager()->registerMenu(m_editMenu, Constants::M_EDIT); m_viewMenu = menuBar()->addMenu(tr("&View")); 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 8c4a4aafe..cd34098a7 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 @@ -26,6 +26,7 @@ // Qt includes #include +#include #include namespace Core @@ -85,6 +86,7 @@ private: QPalette m_originalPalette; QString m_lastDir; + QUndoGroup *m_undoGroup; QSettings *m_settings; QTimer *m_mainTimer; 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 94ebec8d1..336f5ad48 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 @@ -63,6 +63,11 @@ QString CSearchPathsSettingsPage::trCategory() const return tr(Constants::SETTINGS_TR_CATEGORY_GENERAL); } +QIcon CSearchPathsSettingsPage::categoryIcon() const +{ + return QIcon(); +} + QWidget *CSearchPathsSettingsPage::createPage(QWidget *parent) { m_page = new QWidget(parent); 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 90eab513a..6ceaf88bf 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 @@ -44,6 +44,7 @@ public: QString trName() const; QString category() const; QString trCategory() const; + QIcon categoryIcon() const; QWidget *createPage(QWidget *parent); void apply(); 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 0cb885163..50e7c9db5 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 @@ -53,6 +53,11 @@ QString CExampleSettingsPage::trCategory() const return tr("General"); } +QIcon CExampleSettingsPage::categoryIcon() const +{ + return QIcon(); +} + QWidget *CExampleSettingsPage::createPage(QWidget *parent) { _currentPage = new QWidget(parent); 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 64dd940f8..3475f843f 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 @@ -43,6 +43,7 @@ public: virtual QString trName() const; virtual QString category() const; virtual QString trCategory() const; + QIcon categoryIcon() const; virtual QWidget *createPage(QWidget *parent); virtual void apply(); 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/plugin1.h index d3be3bc38..f9d5c2d9d 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/plugin1.h @@ -86,6 +86,10 @@ public: return m_simpleViewer; } + virtual void open() + { + } + CSimpleViewer *m_simpleViewer; }; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.h index bd5040843..20db2eb15 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.h @@ -93,6 +93,11 @@ public: { return QIcon(); } + + virtual void open() + { + } + virtual QWidget *widget(); LandscapeEditorWindow *m_landEditorWindow; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_settings_page.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_settings_page.cpp index eabb67f3d..6c2736895 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_settings_page.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_settings_page.cpp @@ -58,6 +58,11 @@ QString GraphicsSettingsPage::trCategory() const return tr("Object Viewer"); } +QIcon GraphicsSettingsPage::categoryIcon() const +{ + return QIcon(); +} + QWidget *GraphicsSettingsPage::createPage(QWidget *parent) { m_page = new QWidget(parent); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_settings_page.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_settings_page.h index e1402939f..74df1b140 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_settings_page.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/graphics_settings_page.h @@ -42,6 +42,7 @@ public: virtual QString trName() const; virtual QString category() const; virtual QString trCategory() const; + QIcon categoryIcon() const; virtual QWidget *createPage(QWidget *parent); virtual void apply(); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp index 6e183d913..d9b732521 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp @@ -272,8 +272,8 @@ void CMainWindow::createMenus() // add actions in file menu QMenu *fileMenu = menuManager->menu(Core::Constants::M_FILE); QAction *exitAction = menuManager->action(Core::Constants::EXIT); - fileMenu->insertAction(exitAction, _openAction); - fileMenu->insertSeparator(exitAction); + //fileMenu->insertAction(exitAction, _openAction); + //fileMenu->insertSeparator(exitAction); // register actions for view menu menuManager->registerAction(_setBackColorAction, "ObjectViewer.View.SetBackgroundColor"); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.h index 52b3dc8d5..6da360901 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.h @@ -72,10 +72,12 @@ public: return _SkeletonTreeModel; } -private Q_SLOTS: +public Q_SLOTS: void open(); void resetScene(); void reloadTextures(); + +private Q_SLOTS: void updateStatusBar(); void updateRender(); void setInterval(int value); 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 b48eb82cc..193ad8fac 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 @@ -89,6 +89,11 @@ void ObjectViewerPlugin::addAutoReleasedObject(QObject *obj) _autoReleaseObjects.prepend(obj); } +void CObjectViewerContext::open() +{ + Modules::mainWin().open(); +} + QWidget *CObjectViewerContext::widget() { return &Modules::mainWin(); 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 dae298fce..e7f9b8197 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 @@ -66,14 +66,19 @@ public: { return QLatin1String("ObjectViewer"); } + virtual QString trName() const { return tr("Object Viewer"); } + virtual QIcon icon() const { return QIcon(); } + + virtual void open(); + virtual QWidget *widget(); }; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/sound_settings_page.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/sound_settings_page.cpp index 4c677f4bf..1bceeb80b 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/sound_settings_page.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/sound_settings_page.cpp @@ -56,6 +56,11 @@ QString SoundSettingsPage::trCategory() const return tr("Object Viewer"); } +QIcon SoundSettingsPage::categoryIcon() const +{ + return QIcon(); +} + QWidget *SoundSettingsPage::createPage(QWidget *parent) { m_page = new QWidget(parent); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/sound_settings_page.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/sound_settings_page.h index c27a82e1f..0e5361f54 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/sound_settings_page.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/sound_settings_page.h @@ -44,6 +44,7 @@ public: virtual QString trName() const; virtual QString category() const; virtual QString trCategory() const; + QIcon categoryIcon() const; virtual QWidget *createPage(QWidget *parent); virtual void apply(); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_settings_page.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_settings_page.cpp index f794e0b73..aa15b312f 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_settings_page.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_settings_page.cpp @@ -59,6 +59,11 @@ QString VegetableSettingsPage::trCategory() const return tr("Object Viewer"); } +QIcon VegetableSettingsPage::categoryIcon() const +{ + return QIcon(); +} + QWidget *VegetableSettingsPage::createPage(QWidget *parent) { m_page = new QWidget(parent); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_settings_page.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_settings_page.h index bf49e2d2c..b66d070ba 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_settings_page.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/vegetable_settings_page.h @@ -43,6 +43,7 @@ public: virtual QString trName() const; virtual QString category() const; virtual QString trCategory() const; + QIcon categoryIcon() const; virtual QWidget *createPage(QWidget *parent); virtual void apply(); From d7ce82b4bf4ecfb60b42289c4f8a3040cdde8431 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Fri, 27 May 2011 19:21:16 +0300 Subject: [PATCH 070/118] Changed: #1303 Added undo/redo framework in core plugin. --- .../src/plugins/core/context_manager.cpp | 3 +++ .../src/plugins/core/icontext.h | 3 +++ .../src/plugins/core/main_window.cpp | 18 +++++++++++++ .../src/plugins/core/main_window.h | 4 +++ .../src/plugins/example/plugin1.h | 5 ++++ .../src/plugins/example/simple_viewer.cpp | 2 ++ .../src/plugins/example/simple_viewer.h | 4 ++- .../landscape_editor_plugin.cpp | 10 ++++++++ .../landscape_editor_plugin.h | 6 ++--- .../landscape_editor_window.cpp | 25 +++++++++++++++++++ .../landscape_editor_window.h | 7 ++++++ .../src/plugins/object_viewer/main_window.cpp | 1 + .../src/plugins/object_viewer/main_window.h | 7 ++++++ .../src/plugins/object_viewer/modules.cpp | 2 +- .../object_viewer/object_viewer_plugin.cpp | 9 +++++-- .../object_viewer/object_viewer_plugin.h | 2 ++ 16 files changed, 101 insertions(+), 7 deletions(-) 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 23dbe02f4..68e28429d 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 @@ -102,6 +102,7 @@ void ContextManager::aboutToRemoveObject(QObject *obj) void ContextManager::addContextObject(IContext *context) { d->m_contexts.push_back(context); + d->m_mainWindow->addContextObject(context); QWidget *tabWidget = new QWidget(d->m_tabWidget); d->m_tabWidget->addTab(tabWidget, context->icon(), context->trName()); @@ -113,6 +114,8 @@ void ContextManager::addContextObject(IContext *context) void ContextManager::removeContextObject(IContext *context) { + d->m_mainWindow->removeContextObject(context); + const int index = indexOf(context->id()); QWidget *widget = d->m_tabWidget->widget(index); d->m_tabWidget->removeTab(index); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icontext.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icontext.h index c6784dafe..8af601418 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icontext.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icontext.h @@ -28,6 +28,7 @@ QT_BEGIN_NAMESPACE class QWidget; +class QUndoStack; QT_END_NAMESPACE namespace Core @@ -57,6 +58,8 @@ public: /// The widget will be destroyed by the widget hierarchy when the main window closes virtual QWidget *widget() = 0; + virtual QUndoStack *undoStack() = 0; + virtual void open() = 0; }; 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 1c8850508..55d6d4579 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 @@ -99,6 +99,9 @@ bool MainWindow::initialize(QString *errorString) void MainWindow::extensionsInitialized() { readSettings(); + connect(m_contextManager, SIGNAL(currentContextChanged(Core::IContext*)), + this, SLOT(updateContext(Core::IContext*))); + updateContext(m_contextManager->currentContext()); show(); } @@ -122,6 +125,16 @@ ExtensionSystem::IPluginManager *MainWindow::pluginManager() const return m_pluginManager; } +void MainWindow::addContextObject(IContext *context) +{ + m_undoGroup->addStack(context->undoStack()); +} + +void MainWindow::removeContextObject(IContext *context) +{ + m_undoGroup->removeStack(context->undoStack()); +} + void MainWindow::open() { m_contextManager->currentContext()->open(); @@ -148,6 +161,11 @@ void MainWindow::about() "

Ryzom Core team

Compiled on %1 %2").arg(__DATE__).arg(__TIME__)); } +void MainWindow::updateContext(Core::IContext *context) +{ + m_undoGroup->setActiveStack(context->undoStack()); +} + void MainWindow::closeEvent(QCloseEvent *event) { QList listeners = m_pluginManager->getObjects(); 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 cd34098a7..74ec08957 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 @@ -56,6 +56,9 @@ public: ExtensionSystem::IPluginManager *pluginManager() const; + void addContextObject(IContext *context); + void removeContextObject(IContext *context); + public Q_SLOTS: bool showOptionsDialog(const QString &group = QString(), const QString &page = QString(), @@ -64,6 +67,7 @@ public Q_SLOTS: private Q_SLOTS: void open(); void about(); + void updateContext(Core::IContext *context); protected: virtual void closeEvent(QCloseEvent *event); 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/plugin1.h index f9d5c2d9d..5077ff59e 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/plugin1.h @@ -86,6 +86,11 @@ public: return m_simpleViewer; } + virtual QUndoStack *undoStack() + { + return m_simpleViewer->m_undoStack; + } + virtual void open() { } 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 e128710c4..1f6df9117 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 @@ -37,6 +37,8 @@ CSimpleViewer::CSimpleViewer(QWidget *parent) gridLayout->setContentsMargins(0, 0, 0, 0); NLQT::QNLWidget *_nelWidget = new NLQT::QNLWidget(this); gridLayout->addWidget(_nelWidget, 0, 0, 1, 1); + + m_undoStack = new QUndoStack(this); } bool CCoreListener::closeMainWindow() const 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 bbff7e9e0..14b782c22 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 @@ -25,7 +25,7 @@ // Qt includes #include - +#include class QWidget; namespace Plugin @@ -37,6 +37,8 @@ class CSimpleViewer : public QWidget public: CSimpleViewer(QWidget *parent = 0); virtual ~CSimpleViewer() {} + + QUndoStack *m_undoStack; }; class CCoreListener : public Core::ICoreListener diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.cpp index 2c51a5d68..ac7782343 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.cpp @@ -108,6 +108,16 @@ LandscapeEditorContext::LandscapeEditorContext(QObject *parent) m_landEditorWindow = new LandscapeEditorWindow(); } +QUndoStack *LandscapeEditorContext::undoStack() +{ + return m_landEditorWindow->undoStack(); +} + +void LandscapeEditorContext::open() +{ + m_landEditorWindow->open(); +} + QWidget *LandscapeEditorContext::widget() { return m_landEditorWindow; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.h index 20db2eb15..67a3172ee 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_plugin.h @@ -94,9 +94,9 @@ public: return QIcon(); } - virtual void open() - { - } + virtual void open(); + + virtual QUndoStack *undoStack(); virtual QWidget *widget(); 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 ef4f81a1c..4b075adfc 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 @@ -28,14 +28,19 @@ // Qt includes #include +#include namespace LandscapeEditor { +QString _lastDir; LandscapeEditorWindow::LandscapeEditorWindow(QWidget *parent) : QMainWindow(parent) { m_ui.setupUi(this); + + m_undoStack = new QUndoStack(this); + createMenus(); readSettings(); } @@ -45,6 +50,26 @@ LandscapeEditorWindow::~LandscapeEditorWindow() writeSettings(); } +QUndoStack *LandscapeEditorWindow::undoStack() const +{ + return m_undoStack; +} + +void LandscapeEditorWindow::open() +{ + QStringList fileNames = QFileDialog::getOpenFileNames(this, + tr("Open NeL Ligo land file"), _lastDir, + tr("All NeL Ligo land files (*.land)")); + + setCursor(Qt::WaitCursor); + if (!fileNames.isEmpty()) + { + QStringList list = fileNames; + _lastDir = QFileInfo(list.front()).absolutePath(); + } + setCursor(Qt::ArrowCursor); +} + void LandscapeEditorWindow::createMenus() { Core::IMenuManager *menuManager = Core::ICore::instance()->menuManager(); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_window.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_window.h index 0af41961f..cc17e6cbc 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_window.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/landscape_editor/landscape_editor_window.h @@ -18,9 +18,11 @@ #ifndef LANDSCAPE_EDITOR_WINDOW_H #define LANDSCAPE_EDITOR_WINDOW_H +// Project includes #include "ui_landscape_editor_window.h" // Qt includes +#include namespace LandscapeEditor { @@ -33,14 +35,19 @@ public: LandscapeEditorWindow(QWidget *parent = 0); ~LandscapeEditorWindow(); + QUndoStack *undoStack() const; + Q_SIGNALS: public Q_SLOTS: + void open(); + private Q_SLOTS: private: void createMenus(); void readSettings(); void writeSettings(); + QUndoStack *m_undoStack; Ui::LandscapeEditorWindow m_ui; }; /* class LandscapeEditorWindow */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp index d9b732521..dd8a4bb1e 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp @@ -89,6 +89,7 @@ CMainWindow::CMainWindow(QWidget *parent) _isSoundInitialized = true; } + _undoStack = new QUndoStack(this); _SkeletonTreeModel = new CSkeletonTreeModel(this); createDialogs(); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.h index 6da360901..5a392c191 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.h @@ -25,6 +25,7 @@ // Qt includes #include #include +#include // NeL includes #include @@ -72,6 +73,11 @@ public: return _SkeletonTreeModel; } + QUndoStack *getUndoStack() const + { + return _undoStack; + } + public Q_SLOTS: void open(); void resetScene(); @@ -132,6 +138,7 @@ private: QAction *_resetSceneAction; QAction *_saveScreenshotAction; QLabel *_statusInfo; + QUndoStack *_undoStack; float _fps; uint _numTri; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/modules.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/modules.cpp index 76afed779..605f484f7 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/modules.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/modules.cpp @@ -37,7 +37,7 @@ void Modules::init() void Modules::release() { - delete _mainWindow; +// delete _mainWindow; _mainWindow = NULL; delete _particleEditor; _particleEditor = NULL; 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 193ad8fac..f82789e66 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 @@ -22,7 +22,7 @@ ObjectViewerPlugin::~ObjectViewerPlugin() } qDeleteAll(_autoReleaseObjects); _autoReleaseObjects.clear(); - //Modules::release(); + Modules::release(); } bool ObjectViewerPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString) @@ -43,7 +43,7 @@ void ObjectViewerPlugin::extensionsInitialized() void ObjectViewerPlugin::shutdown() { - Modules::release(); +// Modules::release(); } void ObjectViewerPlugin::setNelContext(NLMISC::INelContext *nelContext) @@ -94,6 +94,11 @@ void CObjectViewerContext::open() Modules::mainWin().open(); } +QUndoStack *CObjectViewerContext::undoStack() +{ + return Modules::mainWin().getUndoStack(); +} + QWidget *CObjectViewerContext::widget() { return &Modules::mainWin(); 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 e7f9b8197..b5f9c2881 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 @@ -77,6 +77,8 @@ public: return QIcon(); } + virtual QUndoStack *undoStack(); + virtual void open(); virtual QWidget *widget(); From fbec2565e9b73fa4ccec4e218fbfea18861f7116 Mon Sep 17 00:00:00 2001 From: kervala Date: Sat, 28 May 2011 15:52:48 +0200 Subject: [PATCH 071/118] Changed: Compilation with VC++ 2010 without STLport --- .../nel/src/3d/driver/direct3d/driver_direct3d_material.cpp | 2 +- code/nel/src/3d/driver/direct3d/driver_direct3d_shader.cpp | 2 +- code/nel/src/3d/driver/direct3d/driver_direct3d_texture.cpp | 2 +- code/nel/src/3d/driver/opengl/driver_opengl_material.cpp | 2 +- code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp | 2 +- code/nel/src/3d/driver/opengl/driver_opengl_vertex.cpp | 2 +- .../src/3d/driver/opengl/driver_opengl_vertex_program.cpp | 6 +++--- code/nel/src/3d/packed_zone.cpp | 1 + code/nel/src/sound/audio_mixer_user.cpp | 2 +- code/nel/src/sound/simple_sound.cpp | 2 +- code/nel/src/sound/stdsound.h | 1 + code/ryzom/client/src/interface_v3/group_menu.cpp | 4 ++-- code/ryzom/client/src/interface_v3/group_tab.cpp | 6 +++--- code/ryzom/client/src/r2/displayer_visual_entity.cpp | 2 +- code/ryzom/client/src/stdpch.h | 1 + code/ryzom/server/src/ai_service/stdpch.h | 1 + code/ryzom/server/src/logger_service/log_query.h | 1 + code/ryzom/tools/leveldesign/mp_generator/main.cpp | 2 +- code/ryzom/tools/translation_tools/main.cpp | 1 + 19 files changed, 24 insertions(+), 18 deletions(-) diff --git a/code/nel/src/3d/driver/direct3d/driver_direct3d_material.cpp b/code/nel/src/3d/driver/direct3d/driver_direct3d_material.cpp index 8a9e864cc..a4ccb437a 100644 --- a/code/nel/src/3d/driver/direct3d/driver_direct3d_material.cpp +++ b/code/nel/src/3d/driver/direct3d/driver_direct3d_material.cpp @@ -318,7 +318,7 @@ bool CDriverD3D::setupMaterial(CMaterial &mat) if (!mat._MatDrvInfo) { // Insert into driver list. (so it is deleted when driver is deleted). - ItMatDrvInfoPtrList it= _MatDrvInfos.insert(_MatDrvInfos.end(), NULL); + ItMatDrvInfoPtrList it= _MatDrvInfos.insert(_MatDrvInfos.end(), (NL3D::IMaterialDrvInfos*)NULL); *it = mat._MatDrvInfo = new CMaterialDrvInfosD3D(this, it); diff --git a/code/nel/src/3d/driver/direct3d/driver_direct3d_shader.cpp b/code/nel/src/3d/driver/direct3d/driver_direct3d_shader.cpp index 445b52451..5f1c1bc43 100644 --- a/code/nel/src/3d/driver/direct3d/driver_direct3d_shader.cpp +++ b/code/nel/src/3d/driver/direct3d/driver_direct3d_shader.cpp @@ -347,7 +347,7 @@ bool CDriverD3D::activeShader(CShader *shd) if ( !shd->_DrvInfo ) { // insert into driver list. (so it is deleted when driver is deleted). - ItShaderDrvInfoPtrList it= _ShaderDrvInfos.insert(_ShaderDrvInfos.end(), NULL); + ItShaderDrvInfoPtrList it= _ShaderDrvInfos.insert(_ShaderDrvInfos.end(), (NL3D::IShaderDrvInfos*)NULL); // create and set iterator, for future deletion. shaderInfo = new CShaderDrvInfosD3D(this, it); *it= shd->_DrvInfo = shaderInfo; diff --git a/code/nel/src/3d/driver/direct3d/driver_direct3d_texture.cpp b/code/nel/src/3d/driver/direct3d/driver_direct3d_texture.cpp index 0c10a3eb8..94615628b 100644 --- a/code/nel/src/3d/driver/direct3d/driver_direct3d_texture.cpp +++ b/code/nel/src/3d/driver/direct3d/driver_direct3d_texture.cpp @@ -514,7 +514,7 @@ bool CDriverD3D::setupTextureEx (ITexture& tex, bool bUpload, bool &bAllUploaded if ( !tex.TextureDrvShare ) { // insert into driver list. (so it is deleted when driver is deleted). - ItTexDrvSharePtrList it= _TexDrvShares.insert(_TexDrvShares.end(), NULL); + ItTexDrvSharePtrList it= _TexDrvShares.insert(_TexDrvShares.end(), (NL3D::CTextureDrvShare*)NULL); // create and set iterator, for future deletion. *it= tex.TextureDrvShare= new CTextureDrvShare(this, it, &tex); diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp index c7bc0d35d..9a2d6c596 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_material.cpp @@ -276,7 +276,7 @@ bool CDriverGL::setupMaterial(CMaterial& mat) if (!mat._MatDrvInfo) { // insert into driver list. (so it is deleted when driver is deleted). - ItMatDrvInfoPtrList it= _MatDrvInfos.insert(_MatDrvInfos.end(), NULL); + ItMatDrvInfoPtrList it= _MatDrvInfos.insert(_MatDrvInfos.end(), (NL3D::IMaterialDrvInfos*)NULL); // create and set iterator, for future deletion. *it= mat._MatDrvInfo= new CShaderGL(this, it); diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp index f3e59c65e..43c2441d4 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_texture.cpp @@ -626,7 +626,7 @@ bool CDriverGL::setupTextureEx (ITexture& tex, bool bUpload, bool &bAllUploaded, { //nldebug("3D: creating CTextureDrvShare()"); // insert into driver list. (so it is deleted when driver is deleted). - ItTexDrvSharePtrList it= _TexDrvShares.insert(_TexDrvShares.end(), NULL); + ItTexDrvSharePtrList it= _TexDrvShares.insert(_TexDrvShares.end(), (NL3D::CTextureDrvShare*)NULL); // create and set iterator, for future deletion. *it= tex.TextureDrvShare= new CTextureDrvShare(this, it, &tex); 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 09ff88748..502c971f1 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_vertex.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_vertex.cpp @@ -140,7 +140,7 @@ bool CDriverGL::setupVertexBuffer(CVertexBuffer& VB) // 1. Retrieve/Create driver shader. //================================== // insert into driver list. (so it is deleted when driver is deleted). - ItVBDrvInfoPtrList it= _VBDrvInfos.insert(_VBDrvInfos.end(), NULL); + ItVBDrvInfoPtrList it= _VBDrvInfos.insert(_VBDrvInfos.end(), (NL3D::IVBDrvInfos*)NULL); // create and set iterator, for future deletion. CVBDrvInfosGL *info = new CVBDrvInfosGL(this, it, &VB); *it= VB.DrvInfos = info; diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_vertex_program.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_vertex_program.cpp index 4c255e1d9..45da4d218 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_vertex_program.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_vertex_program.cpp @@ -111,7 +111,7 @@ bool CDriverGL::activeNVVertexProgram (CVertexProgram *program) } // Insert into driver list. (so it is deleted when driver is deleted). - ItVtxPrgDrvInfoPtrList it= _VtxPrgDrvInfos.insert(_VtxPrgDrvInfos.end(), NULL); + ItVtxPrgDrvInfoPtrList it= _VtxPrgDrvInfos.insert(_VtxPrgDrvInfos.end(), (NL3D::IVertexProgramDrvInfos*)NULL); // Create a driver info *it = drvInfo = new CVertexProgamDrvInfosGL (this, it); @@ -1472,7 +1472,7 @@ bool CDriverGL::activeARBVertexProgram (CVertexProgram *program) return false; } // Insert into driver list. (so it is deleted when driver is deleted). - ItVtxPrgDrvInfoPtrList it= _VtxPrgDrvInfos.insert(_VtxPrgDrvInfos.end(), NULL); + ItVtxPrgDrvInfoPtrList it= _VtxPrgDrvInfos.insert(_VtxPrgDrvInfos.end(), (NL3D::IVertexProgramDrvInfos*)NULL); // Create a driver info *it = drvInfo = new CVertexProgamDrvInfosGL (this, it); @@ -1554,7 +1554,7 @@ bool CDriverGL::activeEXTVertexShader (CVertexProgram *program) */ // Insert into driver list. (so it is deleted when driver is deleted). - ItVtxPrgDrvInfoPtrList it= _VtxPrgDrvInfos.insert(_VtxPrgDrvInfos.end(), NULL); + ItVtxPrgDrvInfoPtrList it= _VtxPrgDrvInfos.insert(_VtxPrgDrvInfos.end(), (NL3D::IVertexProgramDrvInfos*)NULL); // Create a driver info *it = drvInfo = new CVertexProgamDrvInfosGL (this, it); diff --git a/code/nel/src/3d/packed_zone.cpp b/code/nel/src/3d/packed_zone.cpp index d56f34400..78d559f7d 100644 --- a/code/nel/src/3d/packed_zone.cpp +++ b/code/nel/src/3d/packed_zone.cpp @@ -29,6 +29,7 @@ #include "nel/misc/bit_mem_stream.h" // #include +#include // diff --git a/code/nel/src/sound/audio_mixer_user.cpp b/code/nel/src/sound/audio_mixer_user.cpp index 7f17f9d35..a80592727 100644 --- a/code/nel/src/sound/audio_mixer_user.cpp +++ b/code/nel/src/sound/audio_mixer_user.cpp @@ -836,7 +836,7 @@ void CAudioMixerUser::buildSampleBankList() nlinfo("Compiling sample bank [%s]", bankname.c_str()); std::string filename = buildSampleBank(bankDir[i], sbp, bankname); if (bankFile.size() < i + 1) bankFile.resize(i + 1); - else bankFile.insert(bankFile.begin() + i, NULL); + else bankFile.insert(bankFile.begin() + i, std::string()); bankFile[i] = filename; } else if (bankname < CFile::getFilenameWithoutExtension(bankDir[i])) diff --git a/code/nel/src/sound/simple_sound.cpp b/code/nel/src/sound/simple_sound.cpp index dd69a19bb..405b25264 100644 --- a/code/nel/src/sound/simple_sound.cpp +++ b/code/nel/src/sound/simple_sound.cpp @@ -77,7 +77,7 @@ void CSimpleSound::getSubSoundList(std::vector(this)->getBuffer() == 0) - subsounds.push_back(pair(CStringMapper::unmap(_Buffername)+" (sample)", 0)); + subsounds.push_back(pair(CStringMapper::unmap(_Buffername)+" (sample)", (CSound*)NULL)); } diff --git a/code/nel/src/sound/stdsound.h b/code/nel/src/sound/stdsound.h index a4cc08094..a656fa387 100644 --- a/code/nel/src/sound/stdsound.h +++ b/code/nel/src/sound/stdsound.h @@ -36,6 +36,7 @@ #include #include #include +#include #include "nel/misc/vector.h" #include "nel/misc/path.h" diff --git a/code/ryzom/client/src/interface_v3/group_menu.cpp b/code/ryzom/client/src/interface_v3/group_menu.cpp index 93d2ee4bb..22ff2b07c 100644 --- a/code/ryzom/client/src/interface_v3/group_menu.cpp +++ b/code/ryzom/client/src/interface_v3/group_menu.cpp @@ -1156,7 +1156,7 @@ void CGroupSubMenu::addSeparatorAtIndex(uint index, const std::string &id) tmp.CheckBox = NULL; tmp.RightArrow = NULL; _Lines.insert(_Lines.begin() + index, tmp); - _SubMenus.insert(_SubMenus.begin() + index, NULL); + _SubMenus.insert(_SubMenus.begin() + index, (CGroupSubMenu*)NULL); _GroupMenu->invalidateCoords(); } @@ -1304,7 +1304,7 @@ CViewTextMenu* CGroupSubMenu::addLineAtIndex(uint index, const ucstring &name, _Lines.insert(_Lines.begin() + index, tmp); // Add an empty sub menu by default - _SubMenus.insert(_SubMenus.begin() + index, NULL); + _SubMenus.insert(_SubMenus.begin() + index, (CGroupSubMenu*)NULL); _GroupMenu->invalidateCoords(); diff --git a/code/ryzom/client/src/interface_v3/group_tab.cpp b/code/ryzom/client/src/interface_v3/group_tab.cpp index 33588cbb9..27e6aa3a4 100644 --- a/code/ryzom/client/src/interface_v3/group_tab.cpp +++ b/code/ryzom/client/src/interface_v3/group_tab.cpp @@ -155,7 +155,7 @@ void CGroupTab::addTab(CCtrlTabButton * tabB, sint index) { if(i==index) { - tabB->setId(string("tab") + count); + tabB->setId("tab" + NLMISC::toString(count)); tabB->setParentPos(lastTab); if(i==0) tabB->setParentPosRef(Hotspot_TL); @@ -168,7 +168,7 @@ void CGroupTab::addTab(CCtrlTabButton * tabB, sint index) count++; } - buttons[i]->setId(string("tab") + count); + buttons[i]->setId("tab" + NLMISC::toString(count)); buttons[i]->setParentPos(lastTab); if(i==0 && index!=0) buttons[i]->setParentPosRef(Hotspot_TL); @@ -297,7 +297,7 @@ void CGroupTab::removeTab(sint index) { if(i!=index) { - buttons[i]->setId(string("tab")+count); + buttons[i]->setId("tab"+NLMISC::toString(count)); buttons[i]->setParentPos(lastTab); if((i==0) || (index==0 && i==1)) buttons[i]->setParentPosRef(Hotspot_TL); diff --git a/code/ryzom/client/src/r2/displayer_visual_entity.cpp b/code/ryzom/client/src/r2/displayer_visual_entity.cpp index f8f6bfd9d..20f84c90f 100644 --- a/code/ryzom/client/src/r2/displayer_visual_entity.cpp +++ b/code/ryzom/client/src/r2/displayer_visual_entity.cpp @@ -986,7 +986,7 @@ void CDisplayerVisualEntity::updateName() } std::string firstPart = ""; if(actNb>0) - firstPart = CI18N::get("uiR2EDDefaultActTitle").toString() + " " + actNb; + firstPart = CI18N::get("uiR2EDDefaultActTitle").toString() + " " + NLMISC::toString(actNb); if (act->isString("Name")) actName = act->toString("Name"); diff --git a/code/ryzom/client/src/stdpch.h b/code/ryzom/client/src/stdpch.h index fdb16ef93..48c1a3c06 100644 --- a/code/ryzom/client/src/stdpch.h +++ b/code/ryzom/client/src/stdpch.h @@ -37,6 +37,7 @@ #include #include #include +#include #include #include diff --git a/code/ryzom/server/src/ai_service/stdpch.h b/code/ryzom/server/src/ai_service/stdpch.h index c94346568..0ff2ba7ea 100644 --- a/code/ryzom/server/src/ai_service/stdpch.h +++ b/code/ryzom/server/src/ai_service/stdpch.h @@ -52,6 +52,7 @@ #include #include #include +#include //---------------------------------------------------------------- diff --git a/code/ryzom/server/src/logger_service/log_query.h b/code/ryzom/server/src/logger_service/log_query.h index 8fab1be35..60d6206fb 100644 --- a/code/ryzom/server/src/logger_service/log_query.h +++ b/code/ryzom/server/src/logger_service/log_query.h @@ -21,6 +21,7 @@ #include "nel/misc/types_nl.h" #include +#include #include "nel/misc/common.h" diff --git a/code/ryzom/tools/leveldesign/mp_generator/main.cpp b/code/ryzom/tools/leveldesign/mp_generator/main.cpp index bbd7102b8..68e18172e 100644 --- a/code/ryzom/tools/leveldesign/mp_generator/main.cpp +++ b/code/ryzom/tools/leveldesign/mp_generator/main.cpp @@ -1305,7 +1305,7 @@ void ItemNamesSave() output = "i"; output += data.splitTo( "prospector", true ); - set::iterator it = itemNames.begin(); + CSortedStringSet::const_iterator it = itemNames.begin(); while ( it != itemNames.end() ) { diff --git a/code/ryzom/tools/translation_tools/main.cpp b/code/ryzom/tools/translation_tools/main.cpp index 5655442e9..0a664a137 100644 --- a/code/ryzom/tools/translation_tools/main.cpp +++ b/code/ryzom/tools/translation_tools/main.cpp @@ -78,6 +78,7 @@ #include #include #include +#include using namespace std; using namespace NLMISC; From 56cf892b9c8830d9f8ee72e4babe369a7aed6e14 Mon Sep 17 00:00:00 2001 From: aquiles Date: Sat, 28 May 2011 19:23:00 +0200 Subject: [PATCH 072/118] Changed: #1206 fixed bug on context update when only core plugin is loaded --- .../3d/object_viewer_qt/src/plugins/core/main_window.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) 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 55d6d4579..79316424a 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 @@ -98,10 +98,11 @@ bool MainWindow::initialize(QString *errorString) void MainWindow::extensionsInitialized() { - readSettings(); - connect(m_contextManager, SIGNAL(currentContextChanged(Core::IContext*)), - this, SLOT(updateContext(Core::IContext*))); - updateContext(m_contextManager->currentContext()); + readSettings(); + connect(m_contextManager, SIGNAL(currentContextChanged(Core::IContext*)), + this, SLOT(updateContext(Core::IContext*))); + if (m_contextManager->currentContext() != NULL) + updateContext(m_contextManager->currentContext()); show(); } From 2d12ef943d9ecc6fce51591c2686e6bac36c5526 Mon Sep 17 00:00:00 2001 From: aquiles Date: Sat, 28 May 2011 22:06:01 +0200 Subject: [PATCH 073/118] Changed: #1206 log plugin saves changes now and loads/unloads displayer on the fly --- .../src/plugins/core/core_constants.h | 193 ++++++------- .../src/plugins/log/CMakeLists.txt | 6 +- .../src/plugins/log/log_plugin.cpp | 261 +++++++++++------- .../src/plugins/log/log_plugin.h | 27 +- .../src/plugins/log/log_settings_page.cpp | 102 +++++-- .../src/plugins/log/log_settings_page.h | 50 ++-- .../src/plugins/log/qt_displayer.cpp | 35 ++- 7 files changed, 403 insertions(+), 271 deletions(-) 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 b902b6c0f..1f75eb81e 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 @@ -1,93 +1,100 @@ -// Object Viewer Qt - MMORPG Framework -// Copyright (C) 2010 Winch Gate Property Limited -// Copyright (C) 2010 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 CORE_CONSTANTS_H -#define CORE_CONSTANTS_H - -namespace Core -{ -namespace Constants -{ - -const char * const OVQT_VERSION_LONG = "0.0.1"; -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"; - -//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_SHEET = "ObjectViewerQt.Menu.Sheet"; - -//actions -const char * const NEW = "ObjectViewerQt.New"; -const char * const OPEN = "ObjectViewerQt.Open"; -const char * const EXIT = "ObjectViewerQt.Exit"; - -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"; - -//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 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"; - -//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_CRASH = ":/core/icons/ic_nel_crash.png"; - -} // namespace Constants -} // namespace Core - -#endif // CORE_CONSTANTS_H +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// Copyright (C) 2010 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 CORE_CONSTANTS_H +#define CORE_CONSTANTS_H + +namespace Core +{ +namespace Constants +{ + +const char * const OVQT_VERSION_LONG = "0.0.1"; +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"; + +//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_SHEET = "ObjectViewerQt.Menu.Sheet"; + +//actions +const char * const NEW = "ObjectViewerQt.New"; +const char * const OPEN = "ObjectViewerQt.Open"; +const char * const EXIT = "ObjectViewerQt.Exit"; + +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"; + +//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 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 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_CRASH = ":/core/icons/ic_nel_crash.png"; + +} // namespace Constants +} // namespace Core + +#endif // CORE_CONSTANTS_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/log/CMakeLists.txt b/code/nel/tools/3d/object_viewer_qt/src/plugins/log/CMakeLists.txt index 555eac232..b497e3332 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/log/CMakeLists.txt +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/log/CMakeLists.txt @@ -1,7 +1,7 @@ INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_CURRENT_SOURCE_DIR} - ${LIBXML2_INCLUDE_DIR} - ${QT_INCLUDES}) + ${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 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 ad772f593..d6403592d 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 @@ -1,24 +1,29 @@ -/* -Log Plugin Qt -Copyright (C) 2010 Adrian Jaekel - -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 . - -*/ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// 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 "log_plugin.h" #include "log_settings_page.h" +#include "qt_displayer.h" + +#include "../core/icore.h" +#include "../core/core_constants.h" +#include "../core/imenu_manager.h" +#include "../../extension_system/iplugin_spec.h" // Qt includes #include @@ -35,103 +40,153 @@ along with this program. If not, see . // NeL includes #include -// Project includes -#include "../core/icore.h" -#include "../core/core_constants.h" -#include "../core/imenu_manager.h" -#include "qt_displayer.h" - -using namespace Plugin; - -namespace ExtensionSystem +namespace Plugin { -class IPluginSpec; -} -CLogPlugin::CLogPlugin(QWidget *parent): QDockWidget(parent) -{ - _ui.setupUi(this); -} + CLogPlugin::CLogPlugin(QWidget *parent): QDockWidget(parent) + { + m_ui.setupUi(this); + } -CLogPlugin::~CLogPlugin() -{ - //_plugMan->removeObject(_logSettingsPage); - delete _logSettingsPage; + CLogPlugin::~CLogPlugin() + { + Q_FOREACH(QObject *obj, m_autoReleaseObjects) + { + m_plugMan->removeObject(obj); + } + qDeleteAll(m_autoReleaseObjects); + m_autoReleaseObjects.clear(); - NLMISC::ErrorLog->removeDisplayer(_displayer); - NLMISC::WarningLog->removeDisplayer(_displayer); - NLMISC::DebugLog->removeDisplayer(_displayer); - NLMISC::AssertLog->removeDisplayer(_displayer); - NLMISC::InfoLog->removeDisplayer(_displayer); - delete _displayer; -} + NLMISC::ErrorLog->removeDisplayer(m_displayer); + NLMISC::WarningLog->removeDisplayer(m_displayer); + NLMISC::DebugLog->removeDisplayer(m_displayer); + NLMISC::AssertLog->removeDisplayer(m_displayer); + NLMISC::InfoLog->removeDisplayer(m_displayer); + delete m_displayer; + } -bool CLogPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString) -{ - Q_UNUSED(errorString); - _plugMan = pluginManager; - _logSettingsPage = new CLogSettingsPage(this); - //_plugMan->addObject(_logSettingsPage); - return true; -} + bool CLogPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString) + { + Q_UNUSED(errorString); + m_plugMan = pluginManager; + m_logSettingsPage = new CLogSettingsPage(this); + addAutoReleasedObject(m_logSettingsPage); + return true; + } -void CLogPlugin::extensionsInitialized() -{ - NLMISC::ErrorLog->addDisplayer(_displayer); - NLMISC::WarningLog->addDisplayer(_displayer); - NLMISC::DebugLog->addDisplayer(_displayer); - NLMISC::AssertLog->addDisplayer(_displayer); - NLMISC::InfoLog->addDisplayer(_displayer); + void CLogPlugin::extensionsInitialized() + { + setDisplayers(); - Core::ICore *core = Core::ICore::instance(); - Core::IMenuManager *menuManager = core->menuManager(); - QMenu *viewMenu = menuManager->menu(Core::Constants::M_VIEW); + Core::ICore *core = Core::ICore::instance(); + Core::IMenuManager *menuManager = core->menuManager(); + QMenu *viewMenu = menuManager->menu(Core::Constants::M_VIEW); - QMainWindow *wnd = Core::ICore::instance()->mainWindow(); - wnd->addDockWidget(Qt::RightDockWidgetArea, this); - hide(); + QMainWindow *wnd = Core::ICore::instance()->mainWindow(); + wnd->addDockWidget(Qt::RightDockWidgetArea, this); + hide(); - viewMenu->addAction(this->toggleViewAction()); -} + viewMenu->addAction(this->toggleViewAction()); + } -void CLogPlugin::setNelContext(NLMISC::INelContext *nelContext) -{ + void CLogPlugin::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()); + // Ensure that a context doesn't exist yet. + // This only applies to platforms without PIC, e.g. Windows. + nlassert(!NLMISC::INelContext::isContextInitialised()); #endif // fdef NL_OS_WINDOWS^M - _LibContext = new NLMISC::CLibraryContext(*nelContext); + m_libContext = new NLMISC::CLibraryContext(*nelContext); - _displayer = new NLQT::CQtDisplayer(_ui.plainTextEdit); + m_displayer = new NLQT::CQtDisplayer(m_ui.plainTextEdit); + } + + QString CLogPlugin::name() const + { + return "LogPlugin"; + } + + QString CLogPlugin::version() const + { + return "1.1"; + } + + QString CLogPlugin::vendor() const + { + return "aquiles"; + } + + QString CLogPlugin::description() const + { + return "DockWidget to display all log messages from NeL."; + } + + QStringList CLogPlugin::dependencies() const + { + QStringList list; + list.append(Core::Constants::OVQT_CORE_PLUGIN); + return list; + } + + void CLogPlugin::addAutoReleasedObject(QObject *obj) + { + m_plugMan->addObject(obj); + m_autoReleaseObjects.prepend(obj); + } + + void CLogPlugin::setDisplayers() + { + QSettings *settings = Core::ICore::instance()->settings(); + + settings->beginGroup(Core::Constants::LOG_SECTION); + bool error = settings->value(Core::Constants::LOG_ERROR, true).toBool(); + bool warning = settings->value(Core::Constants::LOG_WARNING, true).toBool(); + bool debug = settings->value(Core::Constants::LOG_DEBUG, true).toBool(); + bool assert = settings->value(Core::Constants::LOG_ASSERT, true).toBool(); + bool info = settings->value(Core::Constants::LOG_INFO, true).toBool(); + settings->endGroup(); + + if (error) { + if (!NLMISC::ErrorLog->attached(m_displayer)) + NLMISC::ErrorLog->addDisplayer(m_displayer); + } else { + if (m_displayer) { + NLMISC::ErrorLog->removeDisplayer(m_displayer); + } + } + if (warning) { + if (!NLMISC::WarningLog->attached(m_displayer)) + NLMISC::WarningLog->addDisplayer(m_displayer); + } else { + if (m_displayer) { + NLMISC::WarningLog->removeDisplayer(m_displayer); + } + } + if (debug) { + if (!NLMISC::DebugLog->attached(m_displayer)) + NLMISC::DebugLog->addDisplayer(m_displayer); + } else { + if (m_displayer) { + NLMISC::DebugLog->removeDisplayer(m_displayer); + } + } + if (assert) { + if (!NLMISC::AssertLog->attached(m_displayer)) + NLMISC::AssertLog->addDisplayer(m_displayer); + } else { + if (m_displayer) { + NLMISC::AssertLog->removeDisplayer(m_displayer); + } + } + if (info) { + if (!NLMISC::InfoLog->attached(m_displayer)) + NLMISC::InfoLog->addDisplayer(m_displayer); + } else { + if (m_displayer) { + NLMISC::InfoLog->removeDisplayer(m_displayer); + } + } + } } - -QString CLogPlugin::name() const -{ - return "LogPlugin"; -} - -QString CLogPlugin::version() const -{ - return "1.0"; -} - -QString CLogPlugin::vendor() const -{ - return "aquiles"; -} - -QString CLogPlugin::description() const -{ - return "DockWidget to display all log messages from NeL."; -} - -QStringList CLogPlugin::dependencies() const -{ - QStringList list; - list.append(Core::Constants::OVQT_CORE_PLUGIN); - return list; -} - -Q_EXPORT_PLUGIN(CLogPlugin) +Q_EXPORT_PLUGIN(Plugin::CLogPlugin) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/log/log_plugin.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/log/log_plugin.h index d07469541..6a2d78f79 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/log/log_plugin.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/log/log_plugin.h @@ -1,6 +1,6 @@ /* Log Plugin Qt -Copyright (C) 2010 Adrian Jaekel +Copyright (C) 2011 Adrian Jaekel 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 @@ -20,16 +20,16 @@ along with this program. If not, see . #ifndef LOG_PLUGIN_H #define LOG_PLUGIN_H +// Project includes +#include "ui_log_form.h" #include "../../extension_system/iplugin.h" +// NeL includes #include "nel/misc/app_context.h" // Qt includes #include -// Project includes -#include "ui_log_form.h" - namespace NLMISC { class CLibraryContext; @@ -52,7 +52,7 @@ namespace Plugin class CLogPlugin : public QDockWidget, public ExtensionSystem::IPlugin { Q_OBJECT - Q_INTERFACES(ExtensionSystem::IPlugin) + Q_INTERFACES(ExtensionSystem::IPlugin) public: CLogPlugin(QWidget *parent = 0); ~CLogPlugin(); @@ -61,7 +61,7 @@ namespace Plugin void extensionsInitialized(); void setNelContext(NLMISC::INelContext *nelContext); - NLQT::CQtDisplayer* displayer() { return _displayer; } + NLQT::CQtDisplayer* displayer() { return m_displayer; } QString name() const; QString version() const; @@ -69,16 +69,21 @@ namespace Plugin QString description() const; QStringList dependencies() const; + void addAutoReleasedObject(QObject *obj); + + void setDisplayers(); + protected: - NLMISC::CLibraryContext *_LibContext; + NLMISC::CLibraryContext *m_libContext; private: - ExtensionSystem::IPluginManager *_plugMan; - CLogSettingsPage *_logSettingsPage; + ExtensionSystem::IPluginManager *m_plugMan; + QList m_autoReleaseObjects; + CLogSettingsPage *m_logSettingsPage; - Ui::CLogPlugin _ui; + Ui::CLogPlugin m_ui; - NLQT::CQtDisplayer *_displayer; + NLQT::CQtDisplayer *m_displayer; }; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/log/log_settings_page.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/log/log_settings_page.cpp index 83cfdc979..f75d6ab37 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/log/log_settings_page.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/log/log_settings_page.cpp @@ -1,6 +1,6 @@ // Object Viewer Qt - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited -// Copyright (C) 2011 Dzmitry Kamiahin +// 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 @@ -15,31 +15,43 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +// Project includes #include "log_settings_page.h" - -// Qt includes -#include +#include "log_plugin.h" +#include "../core/core_constants.h" +#include "../core/icore.h" +#include "../../extension_system/plugin_manager.h" // NeL includes -// Project includes +// Qt includes +#include +#include + namespace ExtensionSystem { - class IPluginManager; + class IPluginManager; } namespace Plugin { + class CLogPlugin; + CLogSettingsPage::CLogSettingsPage(QObject *parent) : IOptionsPage(parent), - _currentPage(NULL) + m_currentPage(NULL), + m_error(true), + m_warning(true), + m_debug(true), + m_assert(true), + m_info(true) { } QString CLogSettingsPage::id() const { - return QLatin1String("Log"); + return QLatin1String("log"); } QString CLogSettingsPage::trName() const @@ -49,32 +61,78 @@ namespace Plugin QString CLogSettingsPage::category() const { - return QLatin1String("General"); + return QLatin1String(Core::Constants::SETTINGS_CATEGORY_GENERAL); } QString CLogSettingsPage::trCategory() const { - return tr("General"); + return tr(Core::Constants::SETTINGS_TR_CATEGORY_GENERAL); + } + + QIcon CLogSettingsPage::categoryIcon() const + { + return QIcon(); } QWidget *CLogSettingsPage::createPage(QWidget *parent) { - _currentPage = new QWidget(parent); - _ui.setupUi(_currentPage); - return _currentPage; + m_currentPage = new QWidget(parent); + m_ui.setupUi(m_currentPage); + + readSettings(); + m_ui.errorCheck->setChecked(m_error); + m_ui.warningCheck->setChecked(m_warning); + m_ui.debugCheck->setChecked(m_debug); + m_ui.assertCheck->setChecked(m_assert); + m_ui.infoCheck->setChecked(m_info); + + return m_currentPage; } void CLogSettingsPage::apply() { - //ExtensionSystem::IPluginSpec *spec, _plugMan->plugins() - //ExtensionSystem::IPluginManager; - //if (_ui.errorCheck->isChecked()) { - //displayer(); - //} - //if (_ui.warningCheck->isChecked()); - //if (_ui.debugCheck->isChecked()); - //if (_ui.assertCheck->isChecked()); - //if (_ui.infoCheck->isChecked()); + m_error = m_ui.errorCheck->isChecked(); + m_warning = m_ui.warningCheck->isChecked(); + m_debug = m_ui.debugCheck->isChecked(); + m_assert = m_ui.assertCheck->isChecked(); + m_info = m_ui.infoCheck->isChecked(); + + writeSettings(); + ExtensionSystem::IPluginManager *p = Core::ICore::instance()->pluginManager(); + ExtensionSystem::IPlugin *plugin = p->pluginByName("LogPlugin")->plugin(); + CLogPlugin* lp = dynamic_cast(plugin); + if (lp) + { + lp->setDisplayers(); + } + } + + void CLogSettingsPage::readSettings() + { + QSettings *settings = Core::ICore::instance()->settings(); + + settings->beginGroup(Core::Constants::LOG_SECTION); + m_error = settings->value(Core::Constants::LOG_ERROR, true).toBool(); + m_warning = settings->value(Core::Constants::LOG_WARNING, true).toBool(); + m_debug = settings->value(Core::Constants::LOG_DEBUG, true).toBool(); + m_assert = settings->value(Core::Constants::LOG_ASSERT, true).toBool(); + m_info = settings->value(Core::Constants::LOG_INFO, true).toBool(); + settings->endGroup(); + } + + void CLogSettingsPage::writeSettings() + { + QSettings *settings = Core::ICore::instance()->settings(); + + settings->beginGroup(Core::Constants::LOG_SECTION); + settings->setValue(Core::Constants::LOG_ERROR, m_error); + settings->setValue(Core::Constants::LOG_WARNING, m_warning); + settings->setValue(Core::Constants::LOG_DEBUG, m_debug); + settings->setValue(Core::Constants::LOG_ASSERT, m_assert); + settings->setValue(Core::Constants::LOG_INFO, m_info); + settings->endGroup(); + + settings->sync(); } } /* namespace Plugin */ \ No newline at end of file diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/log/log_settings_page.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/log/log_settings_page.h index 396afcdd3..2c0c5ed98 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/log/log_settings_page.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/log/log_settings_page.h @@ -29,29 +29,39 @@ class QWidget; namespace Plugin { -/** -@class CLogSettingsPage -*/ -class CLogSettingsPage : public Core::IOptionsPage -{ - Q_OBJECT -public: - CLogSettingsPage(QObject *parent = 0); - virtual ~CLogSettingsPage() {} + /** + @class CLogSettingsPage + */ + class CLogSettingsPage : public Core::IOptionsPage + { + Q_OBJECT + public: + CLogSettingsPage(QObject *parent = 0); + virtual ~CLogSettingsPage() {} - virtual QString id() const; - virtual QString trName() const; - virtual QString category() const; - virtual QString trCategory() const; - virtual QWidget *createPage(QWidget *parent); + virtual QString id() const; + virtual QString trName() const; + virtual QString category() const; + virtual QString trCategory() const; + QIcon categoryIcon() const; + virtual QWidget *createPage(QWidget *parent); - virtual void apply(); - virtual void finish() {} + virtual void apply(); + virtual void finish() {} -private: - QWidget *_currentPage; - Ui::CLogSettingsPage _ui; -}; + private: + void readSettings(); + void writeSettings(); + + QWidget *m_currentPage; + Ui::CLogSettingsPage m_ui; + + bool m_error; + bool m_warning; + bool m_debug; + bool m_assert; + bool m_info; + }; } // namespace Core diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/log/qt_displayer.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/log/qt_displayer.cpp index aaeae9a1a..fc694d779 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/log/qt_displayer.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/log/qt_displayer.cpp @@ -1,24 +1,21 @@ -/* -Georges Editor Qt -Copyright (C) 2010 Adrian Jaekel - -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 . - -*/ +// Object Viewer Qt - MMORPG Framework +// Copyright (C) 2010 Winch Gate Property Limited +// 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 "qt_displayer.h" #include #include From bc994d4bec2e99d92b1d16dfba25e311609f84b1 Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 29 May 2011 13:57:08 +0200 Subject: [PATCH 074/118] Changed: Use of CFile::createEmptyFile Changed: #142 Replace atoi and sscanf by fromString when it's possible --- code/nel/src/misc/debug.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/code/nel/src/misc/debug.cpp b/code/nel/src/misc/debug.cpp index 472e2cd35..f6b80c9b3 100644 --- a/code/nel/src/misc/debug.cpp +++ b/code/nel/src/misc/debug.cpp @@ -969,14 +969,12 @@ void force_exception_frame(...) {std::cout.flush();} static void exceptionTranslator(unsigned, EXCEPTION_POINTERS *pexp) { #ifndef NL_NO_DEBUG_FILES - FILE *file = fopen ("exception_catched", "wb"); - fclose (file); + CFile::createEmptyFile(getLogDirectory() + "exception_catched"); #endif if (pexp->ExceptionRecord->ExceptionCode == EXCEPTION_BREAKPOINT) { #ifndef NL_NO_DEBUG_FILES - FILE *file2 = fopen ("breakpointed", "wb"); - fclose (file2); + CFile::createEmptyFile(getLogDirectory() + "breakpointed"); #endif return; } @@ -1684,11 +1682,15 @@ NLMISC_CATEGORISED_COMMAND(nel, writeaccess, "write a uint8 value in an invalid uint8 *adr = (uint8*)0; if(args.size() >= 1) #ifdef HAVE_X86_64 - adr = (uint8*)(uint64)atoi(args[0].c_str()); + uint64 addr64; + NLMISC::fromString(args[0], addr64); + adr = (uint8*)addr64; #else - adr = (uint8*)atoi(args[0].c_str()); + uint32 addr32; + NLMISC::fromString(args[0], addr32); + adr = (uint8*)addr32; #endif - if(args.size() >= 2) val = (uint8)atoi(args[1].c_str()); + if(args.size() >= 2) NLMISC::fromString(args[1], val); *adr = val; return true; } @@ -1699,9 +1701,13 @@ NLMISC_CATEGORISED_COMMAND(nel, readaccess, "read a uint8 value in an invalid ad uint8 *adr = (uint8*)0; if(args.size() == 1) #ifdef HAVE_X86_64 - adr = (uint8*)(uint64)atoi(args[0].c_str()); + uint64 addr64; + NLMISC::fromString(args[0], addr64); + adr = (uint8*)addr64; #else - adr = (uint8*)atoi(args[0].c_str()); + uint32 addr32; + NLMISC::fromString(args[0], addr32); + adr = (uint8*)addr32; #endif val = *adr; log.displayNL("value is %hu", (uint16)val); From 5da70e5d9dbd1d2f7e5f594399053ba642e13efd Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 29 May 2011 13:57:31 +0200 Subject: [PATCH 075/118] Changed: #825 Remove all warnings when compiling Ryzom --- code/ryzom/server/src/ai_service/nf_static.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/ryzom/server/src/ai_service/nf_static.cpp b/code/ryzom/server/src/ai_service/nf_static.cpp index 0168d80ad..fa1699b4b 100644 --- a/code/ryzom/server/src/ai_service/nf_static.cpp +++ b/code/ryzom/server/src/ai_service/nf_static.cpp @@ -674,7 +674,7 @@ void md5sum_s_s(CStateInstance* entity, CScriptStack& stack) { std::string str = (std::string)stack.top(); - std::string value = NLMISC::getMD5((uint8*)&str[0], str.size() ).toString(); + std::string value = NLMISC::getMD5((uint8*)&str[0], (uint32)str.size() ).toString(); nlinfo(value.c_str()); stack.top() = value; } From 44b79123303c4cc73b89a010b3c93d5237bc6319 Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 29 May 2011 16:20:34 +0200 Subject: [PATCH 076/118] Changed: #825 Remove all warnings when compiling Ryzom --- code/nel/src/misc/debug.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/code/nel/src/misc/debug.cpp b/code/nel/src/misc/debug.cpp index f6b80c9b3..505f88a7d 100644 --- a/code/nel/src/misc/debug.cpp +++ b/code/nel/src/misc/debug.cpp @@ -1700,15 +1700,17 @@ NLMISC_CATEGORISED_COMMAND(nel, readaccess, "read a uint8 value in an invalid ad uint8 val; uint8 *adr = (uint8*)0; if(args.size() == 1) + { #ifdef HAVE_X86_64 - uint64 addr64; - NLMISC::fromString(args[0], addr64); - adr = (uint8*)addr64; + uint64 addr64; + NLMISC::fromString(args[0], addr64); + adr = (uint8*)addr64; #else - uint32 addr32; - NLMISC::fromString(args[0], addr32); - adr = (uint8*)addr32; + uint32 addr32; + NLMISC::fromString(args[0], addr32); + adr = (uint8*)addr32; #endif + } val = *adr; log.displayNL("value is %hu", (uint16)val); return true; From 49c3ae1b8583422f014a0de1dcadc8506675d6cd Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 29 May 2011 16:23:08 +0200 Subject: [PATCH 077/118] Changed: #825 Remove all warnings when compiling Ryzom --- code/nel/src/misc/debug.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/code/nel/src/misc/debug.cpp b/code/nel/src/misc/debug.cpp index 505f88a7d..17cf2fd3b 100644 --- a/code/nel/src/misc/debug.cpp +++ b/code/nel/src/misc/debug.cpp @@ -1681,15 +1681,17 @@ NLMISC_CATEGORISED_COMMAND(nel, writeaccess, "write a uint8 value in an invalid uint8 val = 123; uint8 *adr = (uint8*)0; if(args.size() >= 1) + { #ifdef HAVE_X86_64 - uint64 addr64; - NLMISC::fromString(args[0], addr64); - adr = (uint8*)addr64; + uint64 addr64; + NLMISC::fromString(args[0], addr64); + adr = (uint8*)addr64; #else - uint32 addr32; - NLMISC::fromString(args[0], addr32); - adr = (uint8*)addr32; + uint32 addr32; + NLMISC::fromString(args[0], addr32); + adr = (uint8*)addr32; #endif + } if(args.size() >= 2) NLMISC::fromString(args[1], val); *adr = val; return true; From 35a4beeec3328209520815d21e9337eca308db35 Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 29 May 2011 17:54:58 +0200 Subject: [PATCH 078/118] Added: VC++ flags to fix some warnings and errors --- code/CMakeModules/nel.cmake | 60 +++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/code/CMakeModules/nel.cmake b/code/CMakeModules/nel.cmake index 20364b1ef..220e4132d 100644 --- a/code/CMakeModules/nel.cmake +++ b/code/CMakeModules/nel.cmake @@ -288,6 +288,26 @@ 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) + + # Using 32 or 64 bits libraries + 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) IF(MSVC10) # /Ox is working with VC++ 2010, but custom optimizations don't exist @@ -301,13 +321,23 @@ MACRO(NL_SETUP_BUILD) SET(MIN_OPTIMIZATIONS "/Ob1") ENDIF(MSVC10) - SET(PLATFORM_CFLAGS "/D_CRT_SECURE_NO_WARNINGS /DWIN32 /D_WINDOWS /W3 /Zi /Zm1000 /MP") - - # Exceptions are only set for C++ - SET(PLATFORM_CXXFLAGS "${PLATFORM_CFLAGS} /EHa") + SET(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") + # Fix a compilation error for some big C++ files + SET(MIN_OPTIMIZATIONS "${MIN_OPTIMIZATIONS} /bigobj") + ELSE(TARGET_X64) + # Allows 32 bits applications to use 3 GB of RAM + SET(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} /LARGEADDRESSAWARE") + ENDIF(TARGET_X64) + + # Exceptions are only set for C++ + SET(PLATFORM_CXXFLAGS "${PLATFORM_CFLAGS} /EHa") SET(NL_DEBUG_CFLAGS "/MDd /RTC1 /D_DEBUG ${MIN_OPTIMIZATIONS}") SET(NL_RELEASE_CFLAGS "/MD /D NDEBUG ${SPEED_OPTIMIZATIONS}") @@ -331,29 +361,7 @@ MACRO(NL_SETUP_BUILD) SET(NL_DEBUG_CFLAGS "-DNL_DEBUG -D_DEBUG") SET(NL_RELEASE_CFLAGS "-DNL_RELEASE -DNDEBUG -O6") - ENDIF(WIN32) - - # 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) - - # Using 32 or 64 bits libraries - 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") - ENDMACRO(NL_SETUP_BUILD) MACRO(NL_SETUP_BUILD_FLAGS) From 8e6cdce8ee67ea842e1f451d76a3d2917a529e97 Mon Sep 17 00:00:00 2001 From: kervala Date: Sun, 29 May 2011 17:55:18 +0200 Subject: [PATCH 079/118] Fixed: Compilation with VC++ 2010 without STLport --- code/nel/include/nel/misc/sstring.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/nel/include/nel/misc/sstring.h b/code/nel/include/nel/misc/sstring.h index 7b4fa717d..513c681c9 100644 --- a/code/nel/include/nel/misc/sstring.h +++ b/code/nel/include/nel/misc/sstring.h @@ -945,10 +945,13 @@ inline CSString operator+(const char* s0,const CSString& s1) return CSString(s0)+s1; } +#ifndef NL_COMP_VC10 +// TODO: check if it can be disabled for other compilers too inline CSString operator+(const std::string& s0,const CSString& s1) { return s0+static_cast(s1); } +#endif // NL_COMP_VC10 } // NLMISC From fdefb39d673c9f7f40bbbde284618cbd3361157a Mon Sep 17 00:00:00 2001 From: aquiles Date: Sun, 29 May 2011 17:58:48 +0200 Subject: [PATCH 080/118] Changed: #1306 basic structure for georges editor plugin added --- .../src/plugins/CMakeLists.txt | 3 +- .../src/plugins/core/core.qrc | 3 + .../src/plugins/core/core_constants.h | 3 + .../src/plugins/core/icons/ic_nel_new.png | Bin 0 -> 21396 bytes .../src/plugins/core/icons/ic_nel_save.png | Bin 0 -> 43738 bytes .../src/plugins/core/icons/ic_nel_save_as.png | Bin 0 -> 52871 bytes .../src/plugins/georges_editor/CMakeLists.txt | 41 ++++++ .../plugins/georges_editor/georges_editor.qrc | 5 + .../georges_editor/georges_editor_constants.h | 31 +++++ .../georges_editor/georges_editor_form.cpp | 111 +++++++++++++++ .../georges_editor/georges_editor_form.h | 61 +++++++++ .../georges_editor/georges_editor_form.ui | 28 ++++ .../georges_editor/georges_editor_plugin.cpp | 127 ++++++++++++++++++ .../georges_editor/georges_editor_plugin.h | 105 +++++++++++++++ .../images/ic_nel_georges_editor.png | Bin 0 -> 37356 bytes .../src/plugins/log/log_plugin.cpp | 3 +- 16 files changed, 518 insertions(+), 3 deletions(-) create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/core/icons/ic_nel_new.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/core/icons/ic_nel_save.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/core/icons/ic_nel_save_as.png create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/CMakeLists.txt create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor.qrc create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_constants.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.ui create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_plugin.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_plugin.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/ic_nel_georges_editor.png 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 7da567023..bec71cf94 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 @@ -5,4 +5,5 @@ ADD_SUBDIRECTORY(landscape_editor) ADD_SUBDIRECTORY(log) ADD_SUBDIRECTORY(disp_sheet_id) ADD_SUBDIRECTORY(object_viewer) -ADD_SUBDIRECTORY(zone_painter) \ No newline at end of file +ADD_SUBDIRECTORY(zone_painter) +ADD_SUBDIRECTORY(georges_editor) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core.qrc b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core.qrc index 85b4702b0..a4c87d29c 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core.qrc +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/core.qrc @@ -6,6 +6,9 @@ icons/ic_nel_down_item.png icons/ic_nel_generic_settings.png icons/ic_nel_open.png + icons/ic_nel_new.png + icons/ic_nel_save.png + icons/ic_nel_save_as.png icons/ic_nel_path_settings.png icons/ic_nel_pill.png icons/ic_nel_reset_all.png 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 1f75eb81e..7f0b5cd15 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 @@ -92,6 +92,9 @@ 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"; } // namespace Constants diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icons/ic_nel_new.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icons/ic_nel_new.png new file mode 100644 index 0000000000000000000000000000000000000000..159e3e18e388c82cb44e1cd0ce628f81d3bd59c0 GIT binary patch literal 21396 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 literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icons/ic_nel_save.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icons/ic_nel_save.png new file mode 100644 index 0000000000000000000000000000000000000000..5aeb3bbe94a27c3528cecf0f2e849fb82a85b4b3 GIT binary patch literal 43738 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 %I{nv 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 literal 0 HcmV?d00001 diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icons/ic_nel_save_as.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/core/icons/ic_nel_save_as.png new file mode 100644 index 0000000000000000000000000000000000000000..6cb71a33436e58801b73476821800b1b95a1018e GIT binary patch literal 52871 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 z + + images/ic_nel_georges_editor.png + + diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_constants.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_constants.h new file mode 100644 index 000000000..bb9fe3306 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_constants.h @@ -0,0 +1,31 @@ +// 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_EDITOR_CONSTANTS_H +#define GEORGES_EDITOR_CONSTANTS_H + +namespace Plugin +{ +namespace Constants +{ +//settings +const char * const GEORGES_EDITOR_SECTION = "GeorgesEditor"; + + +} // namespace Constants +} // namespace Plugin + +#endif // GEORGES_EDITOR_CONSTANTS_H 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 new file mode 100644 index 000000000..2e3b9efb3 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.cpp @@ -0,0 +1,111 @@ +// 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 "georges_editor_form.h" +#include "georges_editor_constants.h" + +#include "../core/icore.h" +#include "../core/imenu_manager.h" +#include "../core/core_constants.h" + +// NeL includes +#include + +// Qt includes +#include +#include +#include + +namespace Plugin +{ + +GeorgesEditorForm::GeorgesEditorForm(QWidget *parent) + : QMainWindow(parent) +{ + 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(); +} + +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(); +} + +void GeorgesEditorForm::writeSettings() +{ + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(Constants::GEORGES_EDITOR_SECTION); + settings->endGroup(); + settings->sync(); +} + +} /* 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 new file mode 100644 index 000000000..65c37cb8d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.h @@ -0,0 +1,61 @@ +// 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_EDITOR_FORM_H +#define GEORGES_EDITOR_FORM_H + +// Project includes +#include "ui_georges_editor_form.h" + +// Qt includes +#include + +namespace Plugin +{ + +class GeorgesEditorForm: public QMainWindow +{ + Q_OBJECT + +public: + GeorgesEditorForm(QWidget *parent = 0); + ~GeorgesEditorForm(); + + QUndoStack *undoStack() const; + +Q_SIGNALS: +public Q_SLOTS: + void open(); + void newFile(); + void save(); + +private Q_SLOTS: +private: + void readSettings(); + void writeSettings(); + + QUndoStack *m_undoStack; + Ui::GeorgesEditorForm m_ui; + + QToolBar *_fileToolBar; + QAction *_openAction; + QAction *_newAction; + QAction *_saveAction; +}; /* class GeorgesEditorForm */ + +} /* namespace Plugin */ + +#endif // GEORGES_EDITOR_FORM_H 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 new file mode 100644 index 000000000..905814cc7 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_form.ui @@ -0,0 +1,28 @@ + + + GeorgesEditorForm + + + + 0 + 0 + 800 + 600 + + + + 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 new file mode 100644 index 000000000..941722994 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_plugin.cpp @@ -0,0 +1,127 @@ +// 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 "georges_editor_plugin.h" +#include "georges_editor_form.h" + +#include "../core/icore.h" +#include "../core/core_constants.h" + +// NeL includes +#include "nel/misc/debug.h" + +// Qt includes +#include + +namespace Plugin +{ + +GeorgesEditorPlugin::~GeorgesEditorPlugin() +{ + Q_FOREACH(QObject *obj, m_autoReleaseObjects) + { + m_plugMan->removeObject(obj); + } + qDeleteAll(m_autoReleaseObjects); + m_autoReleaseObjects.clear(); +} + +bool GeorgesEditorPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString) +{ + Q_UNUSED(errorString); + m_plugMan = pluginManager; + + addAutoReleasedObject(new GeorgesEditorContext(this)); + return true; +} + +void GeorgesEditorPlugin::extensionsInitialized() +{ +} + +void GeorgesEditorPlugin::shutdown() +{ +} + +void GeorgesEditorPlugin::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); +} + +QString GeorgesEditorPlugin::name() const +{ + return tr("GeorgesEditor"); +} + +QString GeorgesEditorPlugin::version() const +{ + return "0.1"; +} + +QString GeorgesEditorPlugin::vendor() const +{ + return "aquiles"; +} + +QString GeorgesEditorPlugin::description() const +{ + return "Tool to create & edit sheets or forms."; +} + +QStringList GeorgesEditorPlugin::dependencies() const +{ + QStringList list; + list.append(Core::Constants::OVQT_CORE_PLUGIN); + return list; +} + +void GeorgesEditorPlugin::addAutoReleasedObject(QObject *obj) +{ + m_plugMan->addObject(obj); + m_autoReleaseObjects.prepend(obj); +} + +GeorgesEditorContext::GeorgesEditorContext(QObject *parent) + : IContext(parent), + m_georgesEditorForm(0) +{ + m_georgesEditorForm = new GeorgesEditorForm(); +} + +QUndoStack *GeorgesEditorContext::undoStack() +{ + return m_georgesEditorForm->undoStack(); +} + +void GeorgesEditorContext::open() +{ + m_georgesEditorForm->open(); +} + +QWidget *GeorgesEditorContext::widget() +{ + return m_georgesEditorForm; +} + +} + +Q_EXPORT_PLUGIN(Plugin::GeorgesEditorPlugin) \ No newline at end of file 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 new file mode 100644 index 000000000..7cc93dfb4 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_editor_plugin.h @@ -0,0 +1,105 @@ +// 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_EDITOR_PLUGIN_H +#define GEORGES_EDITOR_PLUGIN_H + +// Project includes +#include "../../extension_system/iplugin.h" +#include "../core/icontext.h" + +// NeL includes +#include "nel/misc/app_context.h" + +// Qt includes +#include +#include + +namespace NLMISC +{ +class CLibraryContext; +} + +namespace ExtensionSystem +{ +class IPluginSpec; +} + +namespace Plugin +{ +class GeorgesEditorForm; +class GeorgesEditorPlugin : public QObject, public ExtensionSystem::IPlugin +{ + Q_OBJECT + Q_INTERFACES(ExtensionSystem::IPlugin) +public: + + virtual ~GeorgesEditorPlugin(); + + 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: + NLMISC::CLibraryContext *m_libContext; + +private: + ExtensionSystem::IPluginManager *m_plugMan; + QList m_autoReleaseObjects; +}; + +class GeorgesEditorContext: public Core::IContext +{ + Q_OBJECT +public: + GeorgesEditorContext(QObject *parent = 0); + virtual ~GeorgesEditorContext() {} + + virtual QString id() const + { + return QLatin1String("GeorgesEditorContext"); + } + virtual QString trName() const + { + return tr("Georges Editor"); + } + virtual QIcon icon() const + { + return QIcon(":/images/ic_nel_georges_editor.png"); + } + + virtual void open(); + + virtual QUndoStack *undoStack(); + + virtual QWidget *widget(); + + GeorgesEditorForm *m_georgesEditorForm; +}; + +} // namespace Plugin + +#endif // LANDSCAPE_EDITOR_PLUGIN_H diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/ic_nel_georges_editor.png b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/images/ic_nel_georges_editor.png new file mode 100644 index 0000000000000000000000000000000000000000..b293fec5286b9f86d8ad6e03602b041fdaf18c26 GIT binary patch literal 37356 zcmcG#`!{T0&a7mL(*mQRxySJ}97+QcDRU-OUmb z(z(Pgd-J_tzX$g}@Ov^KAeCDAd)I4FCXiQw0Ge zL^qEYZ_4cd*YYw@eFA(PWZk-HKphmd6#<|oi413b>!wZWp=Rm@0F<5oE1(|tGCKfB z2~$^AH1fCD4I%b_(c|;grN=YnRqQP`IGQpQPD%|OA!}a@+PB$P*=fP*#N8BqT6KM+ zng^!ea=Q}KK7L%2j&+Fc?ax(?c%8tnG?CfIxvAWLIUI-=-iVwY*6-o}V-UQg_*^py!{x3hr zV69apW~?KtL?Tn_1H?a&kjV0cTxT>;jvv^=$uhpL`W1^KOYx<5^T*G^7w3|By zmg*~#+uFZ>as8w{ww)aM2op-AHhTNr$S2i5`bI|d>@S;q8HC$#--L%F?$x_3+<#VO zA;>6b#%({C!_TXebB|Xm1O6)sCj2Xbh3{7)8w(P)lPzi+C3|OTXR*bERqBnh%XD>Y zOhL5cL`93^V)HJ+aq@w!K?ISYkay zMNVU^DU;l~Vs2T&NAc0I0c5^0KG`~>hi_7Ho}D|{*yxZgS@KGX{x3v|vOz@K#p-GI zX;2j7Zdcyu25!>DB9+gMlSQ8#M=R;VSh;kIC4}ht6XI1g?z zUsSO&8h&=VBDV<6#zcLgosYJwBK z$S;->!Om(B|T-<=NU_ z|9X}fJk?8%Lg1$|-pqm$u1);RkN4l=m*W4Qp4^Nyr2It6rtjTEk!FJ@_uu2+jKb*! zNxDM%6;dFt_LWtGitU0ao~s+2h@~w=?`{SUu41i;l=C_X$3M21AmWb-UQ}9ys;B$q z^I*jt^^!NY$!_u8`X5dNCNr6e+uQeOR}H^w z7^25nxLV*5M=JHxccyoEf#&@T((JC{a+$T(jII^Z>o#K#`~MqRS)j6u*o50LfNxCd z5x)V21I9LHj9>> zr>(6uAyfj#4SIs0~I9_H+vwF zP5QEN^vZ8f!tfGw5MYz4(W643$RA`F$bPI_q}8iXdT7p^mN(c$v`^cQrW*txAzOXl z>EmIhq^RV+pSf<3nsN@K_w+isS7oDDT;#n-)O2y`cinRz=d~mIfh=*JVFHCgVT#E} zh4Ft&^)54SY!aGHJ;tnvDm;ngd!W_6s|+I&&d+&(C- z!L6pplcOW=^R>_CIOuPQNFTL6G zK=4b~8oEIj3_GR2SJB~oqPjT(384VfmXWoYxFVy5>Kqr`y=*jQl4uS3u2XiV+x+=I z8(z)g5V%EQv3^%dJ@HQ!GSrAP#ufq4!M}lh1${?dEY&#&G*P44sl$By7Mzwk+bHm7 z{YGMOpe6WBcw~iqKTTKx#Z{D0h-XR3{sbYjJ8@jjjBMaDxREk5|!b1ht6**6G!wid=oTA-h{_nri^ z#}aCx4mpTB4Vt-fE4Jd|2>x{)@i9*4)~aZzLgj!I*FjRz;dXd9_#dj)&}F{aaP9AV z!$bN&n9(~?+t0KhRytxzR)&_V#1DAtRD*9lQ|k^?i&y1?h<_iiD4z$DY*ng#Zts+F zAJNZToRtq!zU%0z&ZF?@L4)Aw_6CpKM3SoenL#IxmfGOi;Jq6A&R6O>>y3oXDp|U) zW|DS+`vr91^x5BoRAp*UuKewcqNv~X?SJ0snsxLu z-(v39dDd6{=Qv8PttTC4>h&!CWzeAE-!+vH2eh}TElqyvon-VFayb9&s+*gBzl8X7 z%Ky1}Jrm+=n^M&JNW#h1Z&yn7fn`YEzm25dQxAN$=9iKKgSaH>xd~1oi&35zAqPyy zal9IDzJZ1wTpyLqA*N~ zU*;-R8&>-EDeuXIkrBC(k%XJs14dyvm}%wHFOSHv#U#l>@TlPmL8&)I`SjwXs9``Z#P8Sq4cDI3S0KYKW` zGMB2hW}K)k#VGUZYX5kv>+x=;j{TH=b{?Sa^GIOW9csPPHIN7uvFo~@VlEkWJ3>Qe z@?`!1Zy8*J*Ys3>>n{G<;3=s(OV{PVhO**_9ymA=+)|mhc3Z>Pq@BQ5LQlJerTz0P zmy>QgYWmx%bmqhOSHHbv2k>K;lslyH?l$Ir&a>;U57I6?1$Z)D9Bj z!vhjkbeZ#+N&%9~pmcF!l?3Co;|^?M!hkbN_Va_OFOM$cRWy_0cmxt-Cz(P>(cN}K zcMPhaU>R5Awn!WPg_^%%6@8J#HevUE_4#bX0&abx9-9WHo=n+BVrNdlNf^1;9z>hg z^ZjU5Y}WFpsoUHW^nQ8w&sZB_gP(dJi6SPZQ%vt!T|GJmOb;qtP@=YjAW)Er#%fn; zXi}^&^D{$OK5L5ma>(bw;zsd_g=}U3*!Zxy%17G!#}4he;NrhK(B{Dn^dA?M@RiI& zQrl|}kS$=3YYyLztHu@Ba91DB+ zi6#pm%E@Y^$_xRKj$^1yBN}wh?}riSh$ym5(O-K26qY@>psu50GyQl{CX~xHl+MM! zvFS8R;5URBR7*^)aqqPrmtf7k?|U#0g7LOcpEPj%sQodT8D-MnCS4aH53%s%2Az;X zf71rIeu;(MNgTFpo%9n*VOUl6jR4mv>qcCN zA^;C^1jmq1yq}NC$`~42lVjmtEA8P;$3=!dS35n;u8K{uol4^>%Z4fxXYC{WJ`=XM=|=Im^4ow%69i=WGDx+h~(jqR{zImzscDQA2g8LN_CD_?akbsB%yX0{`m+zXsI7!Ammbv`Z z)@&?&RB*JqJkHa$MKiVg%6o82#-rvv^uTKQE{e1+rNql86%o|d%)?rLxkat>Z!pkpT`-yV#t7v>3S=98mt>sCUY%={pu`g6cE z9*TlVvZ47)v{3W&xRDPO+E!glyK7r zI;pMqBT+vT_4UlY=S>cE<9NLxF)!Xi2~B#6qn7=U!7F^QP^r4^q(=`D6?P_x3i1HonyRNzw9(}#L9!me4L0yVAi&sj4}a2+g#ygr105_1OXib z-~W%Uw~>B&5~!`n3Pa|a3xN{baUqmE-cMyXxwt1&w&wRrq;mX8#&mLu zv>s-j+1SRa4NwjIy+!EG5y{29sNQBW7RM@+RAl9FB~ zlUwhj3|!@^AFq?Ai!ddt5Frc(DYvxYFh(!*Ql~_<8 z^KJ*ajjka__Mu$(JNYm>@Rn0}eCzl0EPx~}YjJ(>P4wp?IGQMgqy@blqn4hmX9w=9G$iY}Cq zlWpsUK!3M6Zh6KLV-KNiu%xyz$X{g=|LGagzbAcABv8lHwJrC25N8}@w@(YW&F zDAp)3f#=Hr4%fRQMCudfy9ZV*1h+;v35OH)zStOX$X8{(Th}Q{z~DK zcT6)@dNTMjJhFMtEd?-Ku!qBIdiRzSwdUKE-jRSDxU$eF?`#R@{1@J7VS}`K1lT%= z)nKG-XW|S0G;77Vtlpo2fGDO&J@%i(s!Bv^UQtR6AtV<~StFF!+WkudNkk6WbZPX7 zxtCF&_)!j&Z8EH#aF7l&nOZ@V8Y)Y>{`0$POE@%=`1YWre;5-^2HR@!o7XqZ#rTk3 z=7KWWf93t%h-g?o1H)TDdPi0ANG~kLUtS|g|5HH(Th%F{FpyJwVh5x*vF|h%hwG1r zp=Wwee&s6A%=xwP%3Z@fB*7_-5wy0+%m7s#^Gpo+M3J=>%IHP(2Q4gH=>dTKmglAFDc8Ld-DA5igb zdf8w-FqP~92TdmrQ^IF_V%=YZ4y3tuqUm4pp-qgB0&b3j5guS;?O^uOC9c_}*?kAd zZ%o4xCnyK0O2JhPK*2My3PAO!E#tKB`NLkzH`i2CrR=lm5K|a`0y*ln4YQ67DXo{> zzci*;D5e;HO3(58^yrDTtk*Ua3BWQv^so!XM#f1qY7esZcRrFA=}#>5P9}Y39B>!~ z?fbATvb6Ek0u4H9yrLMto_#7l4*XuI>3f%9zVJbZ<(28KW^*7kjZyAzM}|l8)>+-o zWYPOxPCDwsdu^j#RMbTylrE7dTBBegzJu>+R7i4e^1_Vn{S9oOzxMC-TMvaPIGK$X zcE1NK^iah%<*xc!)PvfA@}Udx)`C?BP?GMcOc#%D4x281j+W)U zT9Rm=!s!|{QClWFViVvlrHjGIzOY~pPoSS?m-cTRxtGQx?>-Z(SjS{DC}BLlK3DcN zy6yhIKv(D6NVTS)>pkQ21-IZcT6d%+9-<1K2t!No@4xz2pf4UYo4$GDJJc7)Do^B)5^kCLXoMFVN%XhzQIK*dO z1)vv5`ZRz3%oMahdm3~v^ww95N}BCzCiL(HPA_aY({ zf)43G#D!`1_w2{!*gg2r&r~#2|D$MDx;S!Sxf-cx?&UEnI^g{2sE{^?mz)CfYhGom zQK0GN9UloB#*~{rcrvB0a6NQ+tK7+yFI(()L0pYux*_tdQF(-s(^;Gg6r>I8W`mH9 z5DRY9iI%X>wK_?A?7jZzB$$x-Q6kG`ek66X*q!Tlf%dtU)LG>XjUNrgi|%;-Ncplf zWcxbM;&^?-FJ5wkrR*WDW+%M3)FB(AxmoyIYQZ%1ka1bfzaI-nCN8I^R?3-$U zgl(!ljEp_8C4Irm8{&+7+|aLdEF6CB^lGfa7(+?(^7q5}b)sSS-cpMX6>`wE(SavLdlLS*0@jFtJClWjNa5BA(=(#}x} z!&}`+FCAwuC43gCsJ)v;o{Aw!+PA+eJIilkh%rlq13nHgaISAoz-B!y7){`+gVyOz zG3Ts@i$_%?f26><*}Z%@8_r@{=*#s@>_^cs*(sAhrDwB+7E-a6its2D`Q*voxA9-5 zMX&yRxVgTshpq=}6!y0rZbSeX1Xi5OC^dsfa`6d0PYtxx}B*`>jkCp`(kI@#$^l>V&^Gz=6M zELHh$wccqd>GlWS;nzRN%K3lWXAXydbEqV?Lc+2Y5RXZ{mr$;5u1kM34XZxem_9 zDsIfXdh{1?-<=5Sg?Mm*&Z(QZ8|lvRS>(u_SC8k$tG?`<2i$|k4FRN~yOUVEw#dAe zjb8RkQPPWIeuiGx7Y0Hq&!tme&xNhGd{NVM7G!?xrvBfS{cvF5?v{U|Y*MYrOm&)= zuxZ7+fTxCuezl{P=7ys&AyKB(6u<&^GwjQrdhhZL6lpEI(-#hx0OnM6Ix{geI&Ws_ z_+p-@^pL!ZcTGoAeSq=#SS|@>HKVJ)%((0$Gb4T4>fe2I-vQ3HF%wcYeY3YU5dTp( zwmW@J+>rg!@})#uK)&WwtH38dHtB?P;6ni)wV{1Uj3#`T&$meB;r}k_cS#PuD5u#A zDt{loA$_Fqly?RHigK=zZ~{yy5|QC%=<>64?0vcpH}*1*<)x-)qSERikBdCG^vB*E zJpAFp9U)7x=9VGHltHd{4(Wk?iNwWM_0Wq^=)HW)6rPSf<|FKb;@- z`cJ!wYTlY0+FFB1m2W=@n0}T3)XgDL|Lzq3e7W?3j&{PMkY1`!fYth#Aaz(9n ztxHd2yc&o#)L$f53+x7`-R-oI*Xq4H#uH;X9C*Rh%x?A~$>LmCcTNW_lmsAij82b9 zPNa$l9r&G=Y8lio?Kw#IDXwq3B67(_QRS$hZ%zej1vYSvN7hG-Gu^5mag`t|vTrMg zXF&||blFUWmZfb`-t}yq$dJu_hKtsejYIKZ%39?hJW))Q+HIyE!0Q(yep~I8lMd5U z5$ri@vJl~JMshgA>BoC4zFeRT(q^54wDGeytrrv2xY<*;f~h+4$dcjkzVtIdu2>F1 zRSiA?gp7jehK=zsETj-ca)6Wup~V11wTdEnRxz9`l{oOyy7^*~s;= zVz5e|F){3&W{6d5e@MNT$Knk)^Io4P4LHcHrrM_KI3%Vx?v4sz13#E-XF^CuF}q*C zQwNM+=wzXOSQHG@i-kFn8E47^!l%y^zG^BMe#;!C-0d(uO-zV>nJ+wXT%5jB{n9cQ z<;NMvt8Er37QREmX$1q_k>iLYa$v4~-{g)9@JDE(^{%cBfM6ZS)IZ2n##R67WzeBB za;O*k^<2xu9jTDxYL*EYooz{)r5j1OCJ4wH5X0~ou0wLGSPx0!>@n%EVJI~}nyR-x zr&T56k9vY1xYTWK7D0x2QWE*HpO*S2clFtdnflBfNpDvkn9MHK2B41sPd9<2jclahl3+2q&x;x!~G~L#Fe8CO26ED20%~%aW{o@M4YxP>^O0 zdWdj^pBfl4l}SvzPulud&cB<(%{&`c<5k6>j(fh%L@B`?>@N9ifz@FQnmq{F+alG)w&!Y1yyO!{ozabn%`= zKFn0l=pQGTCa-L>hZz4{+Bi-*ZicUc zOB{9>2n@27WoBmDjF;)#9IkZR{P`fbGF@Z4vObW#a=6;FlIypaV(xWt?L750_J+5P z{o%C{2Z9jAR8~H)ECx6c=^$ll&HOu&Z_C2i<&}N-Qsaj&J`x-43p{RBRoXR-)Du1N z%C*Rz!i2U><+kB+HNH%1KSX@jJq=n5y<4#D=R(BXwI;keOp)axodQg=abuu5*%aF* z6g~#J0c}EGFgZrEw^y*$`@akMY|jQ*OG4rq1(mBTTDUQ~`SOB`$gAB0|C7xWk!U1q z)xfHI%jt(<;$BFxh|9D{X5H3j9t4Y;wyVl4g4YR>%S|($q(TXzjZc?Aeb~HHbsbg) z5U_ULY(!^=dR=;=^NE=omn}L;SQ#f!&LP&|g>~CfO^?EP#UmM;Iej(lmB*;756@}~H2-@9h9xXvc^AQbY3v0Ay|n5@zA!RLAzolr4C zRX!He4r%XfwovfBI&-ag^H*b}MDvabr=u3LqQ+~MQ48teoCp%5UTQnkNLH%TFi}ES zk{~DX-Aj4oK+nmS-DbzHDw5BW4sXJ7h{A<%d8k78IJ_2AI0XdwI1>HqX2dZe9V-VT zHc<&sD`&{`2r!vc(YKLtzg+0A70ahw`eN?!4Wra^9Ro&M|NacomGN@JL{uH<>KcC) z-jnU#%J08<1@guXp?aM0FPbNZ6oSqwGj4J5yx4?*B`Baw@L-HRDV>OV=k(cViJ!&jVB4a@@k%wmj1Z|#v%RZ~O1DhUTNVHCIsT}IOs9(L(ScN8@AWMO zu?{B*Frty#0D=&2cbWYl9h1AGWB8@z4FvnFLa@GaUC7i^L!;aOXy-q%mrbgned+uw zgSj#^qt8FCOFswM;6snaBc`BD*KPSz^;k)-^>^N^(oVu64jCjitH1T{X7i~7ydW1( zWjO%JKKyR*McH{icH7Px(ukx&4n!7N#&^LUr%@*$FppnTo1An?A3Y$3am_OMi++Zu z#Y_Dp#8msaHcC16*Y%p0DQzJly5wW4`*@>xdT*K%<#&lh1K9G<)t)31 za4j7|TkqdSyDmoTT(-gM#I~yCEDP-+9lF2RQdCzK6)!ZH|v<+guzKagcyl7(keV0 z|8Ya#8eg{8RP(XZjt`*Oudmvyu5NXa8fAT?WwK3c(BFltPHo}gBgX2 zXT?dl&c@s%sOqRptE&6SOtlkrEkW3?!^C3rUP}U1%`2}NF-;M`GB$?P3EVp;`DR59 ze60$_x&JOy!`=~&w0FQf24MNZ)U)$O$*bt;MW)AK4zT>G@s`Gp9Z}$|x4Ax2|GuX*43Yi29 z_`i3kNN>I!=9ClLJY6d{Bt5UvJb+k{^YWFuh9?jCfj?2|w6^7Y-AHe>>$P(vs{A4q?3jGvdzAP!OvH^A&t|-LmtW{W`X*kGej&pi-*X zAuck`wkSSx=;LJ_;7`9pgbZ{JTrjJAUiWmKE9oaIb}^aTDy>!`cDHT_y8FevAyWSN zo9vA(LiW@F0r^#tljb3LPXfzErZI^tFp}ID>2f>ajNyt(0e%qr2zpJ`MQZl^Ehu5? z!A!t^5eq}krEArSozHqdocP=4T?KAmj>rYJ&(z67geQksB4Jb#>^~b2v)fQ$gOd9l z6EY53le)G(tj;lNdP}`({24V+Ot|>7R75GK^omjeJ%n~w|A7@WucOIila31^rqs_m zRJv~-A|S>dGsVA72^MLmKud*X$ES3hWz zSdwUD(XjpA5lNm+mZJm_B1jG*0E}4IBQMNRL2|6_%KTO z8^w{HLj3_1a2}re@fFs}@Y0sy<85KDx8HyN&a{(G_1-XAb56Z1{+icvUdSpJsLfX= zp}BsbboA)JJoQsmb?u{Eugrg|ON{Qafvh#%^2r^}Rdh7Njo4oyKUy>s+hzR9eh$7R z$pL!dJLrIxzljJ6gS62VN!)h-q^S@z_W^R9_UeEK4tqSdFV%r;4n0p1^(EjUMh6Zy( zq$tu@Jr-}|b!=SFO13iarw=yf*wx6ZVp^i5%!uqDD6wa0B`8Yd5EJCm34ztF!*ww>-1YCVh$MGKU zVAK~jY^w=Xw3{^(J^v>D3wi&@>t*{-?VebGo$g?XflsG}FEPKXKAa>m&nOFop!xzp zI8=}cU)1kP!X}Uss_+gJQ>Ie+MriwWSsog*Hk%Eqn9A$+3@!7(b-rm}b{T4e&!6eD3>1Pc?&bw z{tfXTAZ%~+VgHTt1y=6Qaal(fGc2_p# za#=f*=hvVaoOd8ZMeBxw?0;VSqTixXx$^mUot>Em-50IF#^D5s6bK2J8G7viZVWuF z7$&}d7k>grq!$=xKk&p18yn!4IN@#Dm{8T!uu&5FVV{F-v|nJtvHp%N7vL=)1w%pm zEXNn=*qXoZGodRgi@)N*3cN_8^z$revWb}Jj+DJ>3j4#+Ty-}KJG|`Qn82hx&D4$a zkZEGd8d{bA<^j!oc!q@?l6!092VAmjtp}#~Soh4{Xm^ zwyv+{K2hc%RZImh2q@Fi*wIL{%iB|v(dl;M=`S#$NMUtE;dTZJA$=~t>*eH`vhzZJ zw66576td`fwYQWHWL8+nf{z%UNv~lGe+Z{-yh&623$Q2{En*OOmMrbFP8mi3IRQz< z5eL1oevUW6boRN+K@gR6=vfRpMwB|TfZ(n*^*Oz5ZybLm?#)XOq0fwTm>sH|$EmjrXF9 z_aNuFeLTxauf)BP%-wIUiLi+cA8I6HO~M82_8m7=mS|Y2PKGMXb>MW5Xo_gG`Uz!X^Fo zDAlj8pyv%Fy-915!8@**h&5%X7LlYX3=S^6uYUrH5%`=u70e+_SNnbDZN z9@`M&CT5qqvg%9=c{%T_2R&!PyjMp!L6AhX5TY`j+tQ8$Q>pML%C<7Pt-{&d97XLH z%h>js;a}PDco(yP|HiuhcvEJkt8#{-Lowz_hoj0a?I9a^V+^ zD#wJ+l25rk*1G1D!AYG4Yz31gtwM(bQ*cP-gI8nV0+o)GcX8SeZ&{q3iV*S1Eij!2 zYFT{0thrF=OnRH4P|tg=?*g7%BJ%Lc-@ErsDuI&}s36FscQQfA>u7*c$OJ*6JavkES6}zPvFo}E84jtBG5bT&Xgf}*rQ({5v_wJf84;tabl-gU{ig zh0XaGE0=_L1z&IwrB1arE{RyKccwMBeGKKS6d%T_oPcJ5{;>YUT(xk^RQP01S1etK z6X-?^f3pqbz`>382J_oAKBKdtYpU7?ne}S(G5&X}X z4Tb)GMUxlG-@wKk0x$9F%J6ypMFMh;3vE->Rw;9Bh?kxLod?}uo( zF04&AR6RN!Xj1$we}GylEM_SI1!o5XOI#=+GCD*pMu0`qKI3l~{`gBPuYul`p} zp`7f5_I$G*7T9%I#y5YTFDXFwZ5QTh-eglF-iOlOv;rnoJhY9}qI$AMMn-G#(BZQ5 zDusYcUK+I0Lt%PS$*^4Pz5@C8J#l_jtOP5@tK@(9V8(A>gyW(DjlHP}({ZDdXYQr)V ztdD#88BUP;Sxm$12YH$edkn;bmUsBvTRDVUE)pB@LOj$ovDP;Ml-qdtb2@Y{>&6c- zEk-5bS8#zKbDSzi(5Hp2HK$`XxQKFsEyN+R`{oU9@2B#lyx#VIdCXI$O*>2q>gjK{ zLu-aN(SSb4D^(%9-FbU3GL{z_SH-0XVGc+5yiobaUy)kZJUSS8PyZ@zSGYfYKlzO300OoxuV_`^L7@@W02b8j6FLmq`#Q@#lLH<=B_ zj<&I=0Z`O|!_~YE6Z@@cj?+^RVkl2;?jz%HOORi{ZswzpF}?dK$|g{Z#NC5S#tqvP z>clMAFsjVf@UeFOYjkzZ<%rgk%@Oy$rzK6 z4S~7qVRFDOk&v|vGyL1|Hco5kQ2(}gu6$4u`z$_j@V=T*?NPXEV9Jx1Bmpl=&#}40 z?rB7b@&*{b@OcwfO|r0u6j!}lxIV}IQyogKK~zLK+O!|Kq7KMC)uO&*5!ytXaT+v> z-cuoIM=^?w+>K5 zj^Kq@)?~hwXuyL~SdMt(k;T}fbAGw_sdB~=O)F+2GJ!5RUE0ul0Tu-MZYGb>8wsj~ zhL1nqbhn|L;CNbhBZhj&SQ!*_I-Df**R{raLBA_+WtDF~tuJt4_E@K`-R(Z6D-}aU zkx4{m3A_bchDN_R_${=A#8pBg&F4ce&hYPxe`s??z+F-;mm2nWjCH}NEO&_HSxsM+ zd+uPJ6GVhcOB>J!Wq_2T$m8L_By`v}_!@W7N@6u!pqL6+$OUGjuRn`jxpeYgXn*r~ zO}nB@UdHph{$I`smG`EYncT;kw+c^Wq#x*;2#D3+AJcmMc+!#Y19eX1~!=nvF%CXXF7SZOp3sP zhh=ME?j&o$)2w^bg)8|GsM@2`sd4C6`Qm>Fa6U_;PxX&n;zu2Sh|y51*L38US8Gk^ z>J-q~3`tm34Gqvy(975_{Ggr|_(^VykGL@l`KJQURHcK@t0mv;e3%YB@VPCz_)!xr zLlf2tgQ5wmS)^$V7n3&!^S9C`Y;4GBXxESm$%FGlUR$63|5 zw+=)@@~xX2$uIQVtQViWZo}O@o$}~{ugAr9McP;e@Rs4E$sU0+c!8fd>9D17z$5SL zdQ*2|Qm#M3y43KSQ>hL>j&!j^UcB0RKPe6%6T0qXfZX*M7HgdSI{2G)&^dK)Z13VE z%3p&=o&xTvKSVFy8|Ptq97MDMx^r@Suk9NrLz34}%h|I?QuNXtd*F8A!!rK96fV^c zc|Z*rVkHMvum^BLs)-A5I+T_e_}h{-7pW2GQvBA*adLFH2ZyxYrzyZ7_HPGg;kpBC$S)i{%!K)oVu^2(-=T#Ox^f1Ybot&f7jGfP?%;_i|T;YTc^u7`pF} z2fC!p5Ua*7wiq{H1IqaqiTM%*SN{yOZgkO9Ngl=;`gQfDaIv*7WxcuPsByu3EWAGo z{kl+u45g=#47x%}k_~G=q{@^vXKe|5e7~IR8*l(0Ng>1VTnwyw%(Jy2by2c8i2XX) z)C&9RhM-SC==(dvAKrk6Z!ys>Nl_hbM3)k{<{r2 z5FZ%5(ntWfQ5$#V_^p2y$*~0+4pW{O$2k5i%#Wb&^_GmW_#iCNzkQJDsQg5M`e!*# zep5j3%ND9JGEt$cPvrHNE1Mg!v|_~zS$*>Bt?yW}%0Kp3G+JQHUBTA??sMoj?W%}H zxuBc0D=~-kam{c^tJ_t!s4H%WL#Vk`i?V%=3Ks9|-pVF~J%tPlDgEkQ%R9YFisv%f zQ!5X|(@boJ9yhJjxd)rS2#%;&aU`6ruE~|oM-E0jRiOwz_PXIlf2+hl-e(Nr@ABQ5 zb*9;m$Nq9aJAl-8r9w>e;+;LdOkq=LKz-CM`Ih&8rJg*!FG58f_Vtz(=|crGbQHx^ zFR@27!j)J;3sTh{DH4eL#m5Pf{dk~KSbVqq*H5cX=W`0Zy4!`fIEX3ktP9XVUJ_WC zmnvW;%_}7t9ZN0rcHpPC6XH)gb3YyGk9`&_mwQI}_aBxTPb~bI`RLfdcqKM$A(7p+ z`f6d?gb&DxzQt3&)A&;TNT&Q4Xrr6feu5?(+=WR8=8s=FEk_SO1%l3Y%GU<$qZ!lC zukOEXQDO_R;BtU}1cE?+zX!cAX5wTP@jn>8@oCX)&H_dEb)2dHb%_L?(5nMMl+84g z;JXLOXKtNO$&+Vwi%2)8>YWsn>q}LO+qogvFn?4%V1wwOskNbw5Mx`3zYhDg6)1Xf zL&_C&B>GI|9|VAZbJcdN=$p;HZJjm)<6mU~CCq{^eV$2QeDmrtdOf$xgQp2>k8Atf z=MHH#zkM&?Jqy6K-DX;#bDgtS2UmwF2n!F<-~xlMz<-Gl5Py72lCu7Od!E73cQT~0 z2NaA5LF6OxH-5RVH0WAp`QXM<#^FMxFiHRO57SMAI+5v->x3|>bry&QAq{6q$|L@BUYepX~)X)BE0d5qM$cXJ_4;L5F{$NW0T-TQ+_glp~S0RLcRPSxf*hKDPLFKy3L9Q-xl3kE}H9=`2wW4&lUo3(^ZIAKK z3AezAr&H|_#N`j_qs2frf6We4PA}IZm&t4lBzI{mXy$e;d|Qz@#{P1Low4NJu|qY> zkSfjw97iS--p;|24?Nu#8X7t9Iu&sqdIXto_OqNX`H8x=Exo6JNaz1)ENAIMcQj>= zampoD0K`xoD=Qkz0J@3}ePiU58;cl8vR>a2F9yx0p!}F6641NBtaCq)6A>*yo(eYs zKK?OH*O@K3Q<&MHItAqlE0zc-k=0ZKpYK|Kx| zVg~AO%&p!N;9(gLbbRWjt)_aZ&RVPaXsTawC8f80FnrdBEG|BH8%Q?L@n12ic%%d1j^}YLEmR- zJ#phc5m4`MH|v}>WSC6F8*QQk3xQ7%Qa+jV@w6Ox%!mQO3g+j1u~4CxO&o41Tpsf~ zZ}Ya$6StlYN{%;OE7R)QU#Wt zMh0aBrp#*m!}6(ojZ<;r@f$hpma-Ks0F%*;51TI#!Hk z4H!c)25G&AdVx=6Oy{c7P#4VH9;mFC#;W^~-B0IIh&<9zp$(~wXbjONM_s^l?JX94 zjO^S2=j~(sc?eBQ_&TZ@dobesDi08|Hu@<|6QKk6znl-K@QxBNEI1(ci2^pGFIlJo zR=ecX%{17ZLD0Q)D9VmB8;aHF6HW8e@>$XqfBrVDs>q|O7XR3_Nk?FET?1V01nkb% zd1+aR)`2Nqa}`4M=Yv;MGQPhF8Ruz7qTOUliwu*Fq^7S3P6-I5+^GNBv`veto@4=Q zEU$BCQkt>RJfsI6oDm%zPfTdlJ~6y~<}RtTcs*6jXqC39gILGwOaYA+Q?oIh+$?;w z%h+x?jK6Xu`TOWVBuX7Phy4%}kvfoO<*jt(g@ey&NUV<5ey2haKs5mr>`zEDkkKTK zcl&C8Z?JYZcjZ{;$`xAROcGdVXhL6^JI5Bv7{D;kQ6q^mUT=U_`W`8d6N?!yPT0yqojIDWK z_;g0NFTpRT5kABw8q!*&4Cm#nbV9Aen|yaujnnT+(_~cjyklC`01{XlXpir>ae+}> zdg?AjB^3S=9{=F$&L_t?7C|Wy$ob~zxjIdgy!YC!Qtup7fkX~>1dYlvaa}^l#kDe^ z00O}k*twI_!%OlRKvrvabV=&o`0g#)k3r{+LWFzrEzYeOBSrY{fg6Rjf#9c(z;9(h z;xu%$Se=FvkxMT5&iHp;3H6ju9JF$#PS?I8fCfOs*f0ZZHwW1xTgsiDMr^xZ2L!mq zv}qdll`UK;t9@E3zU#kn|24|qw|k)K)fP{8Bn;o;(a+jQWC!Iux8V-}PiCf!MZ6xYx_n4DD=F-@hmfOfOkkG_jTEewUgw_KTl3R`QUd*KBP z3Hk9st&{4gT-3d!TYA+`gj4|xMDO4Kq3A5bqUzcxd?pwex}-a$1f@Y?0F@4rdI3q5 zP6?@DXaS`Kq`ON}$pJ*VJA_fXyX%|p@BEnSaIw#xy`Qz#y=3Rab!*?bez=eN!1kPBb-uH`6N#6Kn0eO1%*O-go zmcbhDkBvKP;rU?pgNV5`O6?n@UGPamEO6$v3Nd>VN|yV69ACZRSN)p?n}x6St@H=( zrhv&Z9iha58c{pE$oI?7Q;20~$Q9x1?3> zw2bMy<$!CA4E@pz>r&7riySMds^9C5d5%_MZHlT?(`UOp;n{0^fIt7F4A$+vI>&PPqZ#SQRRU*y1pM zy_$~Ld4Z=Uah4Ui`BOA(BpP&+_5e1_--8d0i5n}3gP|&F3(}nkOwBX@+W>>H z!C&tecFvK^z?&eoIwRcHc#iiD2yT!L%)9s>3y`>?23+}U>&>}ELG z>U1EXjo6#cpz~}unzdvKxJb6!?okCK9H{vJQL9(^OG5w+T0|7Yn9x{{UZ1P4w`*1k zQf_ai;%(CaYu%Dr@b5m+{WcShqq+qKDG{0N%zU>v*%*BS|FnGX4DRUP%m*cFFDS2y zTV80KwZxO4_|O3Iqs8|Z?c|S(ML_mgD}h^MZP;`Q96ew;9sZZFuCY-?pkrvUS#h;0 zyAH$;Me$0f>P$~Mye7w*NM0wE9dZCgn_AQE&NWnKDo8E}{VO5Xs$5bcg+FRQ9>j8$ zg`alFRu)|mwB(!q?c1grkWe|=a;@bGUSv6aqwN2tyuk)yf^d^^1pnE7`esf#HYC$0 zi}*JO@RlIwh*Sm`GbWkF0bfv)0%%!_Uk~x~-9NJcIxl{D9sb$zc}*~);ElBR8|OFc z9Ufzzv&p}>Zkxrj>W94W#6Pxe>y_fp50?=$m}o=Hwi6#6{mn3q7+ANB5x!70yi zsB>%TNu3SOfiyY**Ex5)k^-KbmvtY#O-g$(9*#!`NI}ZqH0hOGYoMpq1LESy6~QQv zk%oO|!}1H;9$c-zxJ40^V(?!?CyrS!2QtG_3(TYoOe3eg1%NQTSE@p87p|KSmO*!? zH!P@oTriEOZ32y$eJ}^0i<@Qmk@dG@$;Hmb@z$UB$G95~=>uFO8hKf&$Qt`v%SCG& zuml;9LtlTQ%Powmnau(jw<`0kj`6l%X&Z6TjCKzTVjPCVNg;D?(w8&~YGC7_g1pYc z!Px9)!AzrZ3}Xx}xQ;S+TExx2Wf(do@m>>WiVb_x2&ECLakiK0mB*$BAb^5DPI2JrF?u_Lh%k=5b_)(I2QcEl!=jsJx$w z&eejRt|(R7BUsTh&zoQdpMSV5M{%HrATK4rZnO1%WLqCaqQqy8 zgSZAybgt8t(8mAz`~43%x_`3ZE&6c*sZ?3<9Wks5#&ENZgIFC>w{RW*cQD{N7si3* zM7u2=HE>=}_SuWb_RYy(#edu92+^`HK zdp%~)A`rFXuCHqbErn=D9v2Cg5c+XZOQx?Ee0#dtGPo@VSmReeeGagI1l6;!QU404 zkn4(d3GNRiFCYTQ(Zx=ooY_gZ+5X;2&HNDo-6kuOUt~t-nihNkNcF-fw8#;@cV&jt zfYOU=N~n{KzP3NU0TV^fLeY0bAY;HA%+f(2_I(=1pvsbdqF4Bea)Zfowf(k#Gl#) zhfCs0_6gq)(Un~unNI1baxq&@su=|qFt6n<`SME)SmN^>S z+t)Wr{nHuZv!yP8hPhTw4HtaSEI$9*)RBCBrp1AHV)F^m)}Gf^4{3Lpo8o(BK-OtjZ`9|cUz2~6Q53jpDfuT|l;VM^ zH%sq&qEhmtoutY#`I;=iItVi#?9AEFBOe znc^{A(70d7&2SBjjF5#RzK44~A?qo_LF_eFfT|?T$Wh-$Lzk_F-eh^B6fImo#*U;U z)sCW$ZBl>>V-{3?zy8bTfWchuk}L^VaCP+)eQ>gv1D$BLB%8iM_=! z`eKlwh|+VWh;RK1WMlffcZsQttc6cy5)=Ze7Y%{og<~<{K(EMoUe9P@!r-qd=@WkSZ{I zou-2{q8Tn;Zz_l9J-R%VvPUr&=WJXSObPZB4llN9E09irJ{DhV1UpCI2O@xe>#vx? zS?ZBW+JjnAKnMDWm74{!m~c}7k4aD8RRN0l(4t}1;b)9Zk3w$&4fF{_MsU-fo#>dZ zX0(u509DyOM{7-K!H%lWE7!I z4M#jQJ*yGI^QX=O=kmH9_SMA!Zn{g#6xOrV`RpLGO))M)Yd|`WU1+Syac<58Q-LqH z5scbC6%}%mUfNu|G6enb7@J^>+LD#RiOyPlAOy0YAef%u0dM?i^85rOz*#J}--6AE z5JrxzMpT&;tU@ujXTIXP{zkYoY7!Jc4}rSesXK@iHsRn?c%(Z8K6#$_dIj1nUy9?z zrRgq$#fs6P?EVF=x`w+X?6d7oF<4W&F7G<^O?qqL@8};bH$Sd1jqQ&xpJX1o7;pH| zAnDAo-wnaeQhy|6o)2ZaVe(6-DL^AqBq`&=XWpHmL=|Igs!5MjZe@Lgv6PDl2WejH z0;5OgL&iwZ=~TyN_kr`z?5B^e=X;d7AKsM#KjUwgn(lM7$g$}}%|2$mLOdYd*eBQ* z@MZ#PffLAEE$NU;`z&!kh$G5_9jDO5ktNtY^-)+4ZxTcD13ExD)6A+dBBKu(@I zlgLohfxU@-kb!DZoOWU(M|O(8vK7LNl>yphM`8qJW&m);D52~HB)z3HJ3gZy>vRJ5 z!_;I^Cv1>oiJ(6PI5T*`a?!_+wZwxQ(Hc+`j&fulm-hG{a6p~-HYJGVeZK}8AFO2u zVJYp^Sxwh=Q)m11{wwtqX|s3RwmSQ$M#+EPPP1eW0~*2N`7bH1g2dnTQBD(!HTF5J z)px@2z%%}9ae`pfFGapbskPJRj}6qrKi66aDt|UcQVdANq;s@=0o>To&*~Ya*RSqI z0;wt&l@9MLPoj)<4L#Ou?+Sj#f=W#?K~Lj#akgaaq-Rw3@*RRR~GKl~@JLETka+2Piho=1W#c)k%;e~mugpCBL&M)`hS zrPPk*zLtIT_}(L(6@?|L^|*tu7jYFjR0P-R%t+mY}Y#Qq_HY|8p?Zf(DNxAu$9ug ze1}-71!g&LC^ib1fw!plIgVTiWTl)o0T|S*vSO{`&jnqyp!MLUVBzC4`hC~1*Gw68 z4{=`G8W#(9z@}q>RK(=7(~p9J@>Pu8?oX55wEnDfoO;R91zNm%^BhZ;a$TR~0R!-a zq$E}B$lyzVKqo;^4=lT@*7xX@G8kwuni=LvTYtYUoOOGGoSu&Byrkb$3}6>}#M(p- z!m$2Qu(2~*wOV??3zzX+SJwxls~0p%#LuK9HwSKu_Rq(Fi;Io_BJ=c_O_1WK)NVHc zVEW1h48EcHxUaA05W|Hk25mr5J&_a_v4x}M-K5|B)^W7Ydyh3sYTysY7d>2uHqG85 znrw&(t&gSVuTvNOjt$>lvw}nF@cwYfQlK$^`BuHbET~YT8tDm1Fkhhr6u#Pt; z@{2xqs&lz?J|qaJh|!?rBT}0 z14HTxu7rBHlyWX95KKGm$C_W@yAJ!_Y*e`~Cm^`~LrnBx@8%E3rJy2e zq*7qWEc#_cP0)x3Q4f&rZT>IENK>x2Kj%%@Usq)ze(^mkWg$T@8k}=%D#^P4Aai2V zB|Y};f<+CmUYcm~H2o>0lnlr}2-qQfOOASpee3OMs}Gk~8zfKNqTA>XW;sS0VpBkg z$;dBU7gg*abX&HnUxT(DDavFWdAFrL1}ql*xHIdvN8c?M_Es^MUTc^jxpf%{LO-W{ zXW>1lfoY}BqQpj0uc^ul>oMG#VQ>VljLH6dgC>>(slx_bypJiK&BHl;u;8s6n&>_` zKgi^%-F-WEAcnCl76h0!eULP+mcO65<~cXnrS)8mHUFdtmWLct$bz zw?oW}=LYIDx1)!-*<$lHn^v+VvZeQHVB&=bFlfwI;b1*+J#{%Xa)U;nxo3(Rl$G{#oDL48;Ka?q;BIpBs?ONchC_@p)~QlZRC90t z#ycYcdIL7iP~<{`S3nHXWO9HM?Mxy}lfB8bAo=z7S$==?_;HrKfBk$qs_#0N6aHsP z+yN=^?}8SoeQ@n^7XVag$2=9!#;B!(+Z@3w>+6vw*vmrVR8+E|BxsfluXq0ipz+IW zPmx5n_Qgx>V51+y#^-~un+QJx+BM>DAlza;QYzeVH5izdkVXhymy}+fOQeLE2vJQS zzDcA}vb~E}no0Sg*Kl9@kKhyj%@cAV#6bQ-G^;B(WsKPno$+j9r=#aSY%7{`9+Tzp zr$R8`PNfI#`J(L4$NaeCq5jwVFR8BT2z}E5On4=6vD1gUF771ddm8O^GFlXKw&kJ$ zmNXb@%#>N#h&NQf1aQM3{SJwE~+s64J; zP367njt~8QO{ELb8-hVWSr^dvsMNXPL4gxu@e(GCz+)Y$jU7Lb9e4q`2OnvYnVEH*Z-R5_O_Y=b{G7nNnRNkdJm$xLb{-Jc=bzU_|gZ2z40xh2BCu{6( zGhDb6WnlrQt^p%hSB;Xgl+PYg`%V2P*4h-F39gx|WYRk8qLiL3nx6E~pXjJ(mG4s1 zMFJS(l=eQ!-2Rpf&BBfpspNq75?GOzd)Oqe4#X7xIAI3@-@r|FUrpo2Y1;MXPrBoM z0Xo}XVrEhUW1*^1$=9`9TDN~+Zz&B`%Ew(K1EHFSJNmY@lRzC(bb*GTe-vc6NnwJ0PiS?AE zbc_II=kZzBoL>ao$#1fCF!yUpK>Zi`_!_RCsOGw7?;Jl&XVk1f)l%#9s~M5c%cwuW zK|F|6FLE{%7a%X!JV|)`&F+_%;Kj$(xIhgFa-ie27!exUS^-Lv_@H46#IFg)W4c`z zq=dHUW)8hfQ9-+$9}JY#}o z>}^~2xT}^aYapgy&o3!IYQ`tg#mXI8BYon<<992MlA~l z=-eA@O?{Rxmn0zW?Nd*@)8K6(`sH|?%#t?L+ef>~d-=0Fro=MFtx#yOTFu15c zD^}?qj5iCny5&!N6x33`KV6_ke})aDiVN-#)`FH6!ji?k!2?`XRk?#CAQt-{Z~K|P zF`KO|e#j+$jzi_Jz~lWYxP3drB#v?LWmPlHQfk8|L^5PH;3yJX^!7>kWb% z#~O4%k0Q)sL>r@0Ru%aWW5G!)4doP-@o0|{L8sWoQ92@o3n};Y4`rknB<9rP8(mPV zysFc85;VcXm=mD&KOZN(<->b`-5Zake0qDae%as+-nlcRk=UD_hlObNx&`+WZU1xx z1tsmMDA01o%sMlnHDF4H$e3rUy4n5((D|NA+Rqv<~<#{7hL$+XJ)_dlj!PX z2dS+)ZQabuyV2%%tRbRCdc33^5u)`n9`%0R$`BNZnSj9A-~7}L?F!{HVHSfx@= z!g6Ubg;obir(3JFUPs*0KNNI?5Avz!3(3gRAeg@*&nZE(uQk>H@1hqqdcHWU3pw7$ z^wrb8$BFq*q(}HEep?i2q&u8)B`Nvffb0t$8yz(eI!Bu&vH-E!6)SMdU<@ftGX*35 zKY>H+h%9`<@|mUHMe%_!*KN(#KP8ZNIUE3gQ|S9AC2+eBCG2v)GmmZ*t_0Zxh|Mka zc4x)TRe?1xF?8xW%NhyM*h>KKko9{Z7P_;};Kx!+A+S&C_#W>S~EB?shv#C#UN5T00WyhGiS5jjUft6(VKPq`D1`~-{d zSzf_p8T?&1ZY>|KQey-ketW3v|3_|}<9o}F7q?*Bu2j_1Z%`m0cjqq0v-I4Ccuy~% z_TzUsq@)c*R$)>%9ZJ-^MFI&CUyyL-5j;?#^_T;+_*}>L4hpgJ5eqwr@=pELHH(W9X zp*PmK6$VK7CE@|?r$iy&_Oi;Mn8@3_?pcWsb()(F8qvfI76 zB6I1b;}|n}CT?cf{r8CP^FAs>C_LwzGMrlNlUI+ujwY&3y5sB*DUTFdWmS4(@%x8l zU~NP_8oYkBDd0?!w%GWs=%J~TvNz>-g%UrODF)Gzr^k)*M@b2q@v{bE0$4f&(3S)v z{mF2m4o7}=cn&Rku3%VVET3ktM{Jb+Af*+ZKf6QTJ@lrDlQ^SE-l6^Kxd_fE2m&^X zxvslbpJW7N{P$xwgx^;?ff2GGdW?gZ?9ezIWol{jL9>H(3<8QukxHeCkmPrj-@apY zXV_K_1XymD<5lx&LxN!&vG3Ml)~V^0@gbLUnI7;z(&W9ZzJNy@*w1&u>4H~pAu3rH<7=iKzqdY`d~ zsnC21G4=j#Nx?zP%1L4GAdFK5P5yRanF76;;8ykKLTz%&tTovnJM+YJ{TBK zvl*YGYC_8dw-As0V@Yp3OVl2rB0^A*%0khjpx19?<;uImG*j0pK0ojR4D4dy=-%;4 zRb&j|@6Gx1-rRkKqp(I$Clr0oEaj17&q_jsA0=z+@&G0q*F1B$u6UI?mKH!%9uP)N zi(w*V5ZfdfC!a0CqA>5Ne%)l!6o~pjN*+r9y(GF7wf!e5hJeAs8pKQ+od^d`p|+#l z^l?xO0UAL)m+(734mxtB#tm|-eoX)7sDqlDXQys|#VcUaWtF!*(HeNVVNK#VclQ2w zrZNDqkD+2mslTjD5C6I0EjL>s2aDw2+p5^gmj_N?KR99H$09m4TS%o6-Kkff`KWF# zCHwLiD1gVX={^_buIk>%NA0&tAJU=CXh(KDQk;ghDP=$&%G&;UAUg+Xd>E19=N;4} zdq~J)M+yaWiT^_t&;pu|un2*X$s7KAo__N!l(Dzj?#NmV0e^{Mm!X~(MV+mX=_cCMpxDX z5wPG|Pz>UIcXoA<&=DjhMiw9^Vt@ARjs3!p$AM5%900VFk0bv<>YPoKh6}O6E60^p zwIZ%_+?DFtKenLTL<|p})#3<#n`*7<+yeA>%W=h1RmAK=PMP|nbLWNdIyRZid6;27 zN?UgK>|3MXn+vh;9G_7S-)3e$gFof*umA&f;tkZKQFH;)xV<99&o!t?f1HrRKLkVqMj2XRcYa9?581GLwuT7c1oXt9_N3^@U>rio zO(h?s2F4a!P-2TQ;yGBP;jbT)&IRsDBMskr?#US;cum@DHP#_brNgm)Rc?>*moR%k`eY${?}q(ez82qb* zM)hwB$tO9-kRd!M2{8(w-WlI&~vpzBQm5LHEGgs}Quq z9lN!cm(_@0ywi4+oI4yEM?c#q{u6S09+6B%>g$G(VwzSUuQBZVXR`%j=R_}TRtb)E9MY^i(Bth7kK-v2Wlr}AieFVBt4N{5dr6u*R=TcN$PZI9pLLvT& zifk>P2ckG`$KSQ}1XF(9!v@%|@QN!-50MjIve2w0MOo%s_CwzpJV5mGlG8k6@_74bwl=+o zvgiO;$pM8QYN*}nQ(C|K;$@fy8(&*;Ey^_?C+4-<8V;Ig;~z;?0P!eThor+i?0K43 z?Hn;fD4!=&!Yxp*z54gj*1Tu()ANUf@*bEMbpOv!rTU|D+ro12jEFPi9J;y2{a~7D za)Zx9L$@ACXlIL17RtcL^4Q{2VLc4EtIHeg)v8V59@xKCnO=JmnXs?PHJ-&88F%;1BJefKq}A>PfiDRGJ5TejH2@+D%K)}Edt@uc!BOyr08;2=S%WE z|HE9ipxOL49B>w17KNZZ>=~m&5)9>FG;Xn}V?i;Jfldg~ymGvbmH1v2PZ1Zyx?a4> z>*VFngUOKU>!x{AD?j$YqTD|bHr+Jq#cH&wNtS6Xx1kb##~CvpZpxBd-+tYAVwOCi zm$$_B+~A_@B5kXN_aAuVF=gzi-PNOmi)HEeR0*HN{=-(k94C%F58Rct?vekFpJiGI z49B(cqCCJ&HoQUyE;1=2Y{C;fCt-W9CpOo^PV$hgYZ+6Rp-CCYM7X;wQYZK-2Jh{4 zz~7VbP^^S+;$-5`dq?sDHs#d%oXOsB!F=$)EmbWhwgCG+62#ZkBOJu3!;9}uAJJs6 z{sBI+*{<|_+p+-=DS(E$BrIvM=vdL+f}uMomrG5SEBWON?j`{XJid zYyu)FXb-0ua7SvFVCvq!UwjG3G?=ZIScTcz#&tra_8HnUABVKS-t z@e1`k~bua`NhW+ghO7O6_nA(M1 zvjO93=n?^5>4VUOyVQ+mW-yGXiXIk+{F3$){kv;h-I1KMzzApp)kukhQ85lS@}0y2 z*1}NgXxBH1z!5-AvBQ}Qm{WCwpz;|hwY47tX9ZvA_>O>l1URS1pPBH%@GBqHi0^AZ zz>-sW$u!6DyMW7Z0)4!dq#}lM21#z45R;NVY3B`H+aVXF9fdHa+5B}>*+y@1id!4wGDhBasUyY%$u+SPcOS@a z`08}tVBM#VTtc55jKsm%L)?kD{_$#;q!$)YyM%>+S`NyTxBn@1hiT;!=_#hZ=l}WE z@?%*`sEJc!`F=hTa3K)}&$1}31K7_<3pqbMD1wh@+wz$S_gvDTqFmN~GrGh9kK~Yt-ZU5kKU}*5#saMs zIm6ro%wKlsnSzCEd3%Gu>~G|36ul_n%+XAfXCMX;h#$bPPaUZO$01^1=eP$(W?doO8o?4#^~#jfCZi@RbhoevIc%q#jL z$yc=AVoW#w-Wb=(WVH|4dcf#@KQIB%hYH)W)f&*EE!U`1MJW*N$(6T5^Kaj-R(x`^ zL9?@)pfP6Dj#wT6cmDfVo6ZlPkg|a`NrOc=0npPjZKpXO0~LFKuH^C?Hr}PMR~YwC zSl=;xoTGPC_gq59J#NLomOhRFSn@xpf{Js9=Sd)lg_iw4n6(l6HcTI{4<|uGhl$mJ zl+PUCF}w*D`78(eCl7?2HMTvzJC7I=+=9QuvL=h1? zE2xKYBn9P3LT*Xl(a6U^RvLdroz>BAT$&hE6A-k?M=Cp|vnm6b^ekZs>#X;Mx8*`T z3$((Hfio{sy4K1S@ooz9rurdm@Vcif|L?3gBy8qiOGazLgdrDE3M4O4i^r8B49G zJDQCZ`R}H2ZvQ#3z4`2fv)F|xK5)(?9*X*oMQA?(spP*V{qFRDNk>_}KH%$D2Nv=3 z!~0PcAHB;KB{MAO&GoAl|CIT4nt)+mSRD-)SQ)mmJKQ%!wJl~(>hmehW0x)7ZreQW z?(KE_N*D~&y>?!G{SE4d+Wv)k0Z7QagBdpeZQy}NcZ~H`H*k=l1vfya#!Zz{%>OVZ zx@jQ(R=n`&gD(PS(Y|{jXm-Nx1_F|vq8C)qdW3BRjsq9dgI^a63?%X>-#5Wt0zAZFw(UaTG`y6 zER6=dsw`dBhgvK;3*!HNY|C6>;=+?HX@+}$ym)*=4xuWXgaeFuhfRI>=$Q^jU0;r% z{){QYEEPVn?2Dz*jiAzdw^L@G_9FPf(aCnVI$GKW+>8we#UN&=Nxg~44XQ45ZH*Sy zV-YHkLU13zXJF{b6rG&_2yR5aYEoZ`{2wp<2VksYVg7V`I`aQ`yjQs|!}tC)McT*B zXk>N`BYhV&(xrN-Otmh_Ud`0mk<_U!sYbQ2kInDnUWh$d?A>-^hocr>0w!~SA!?fg z7(|@GJ_}yuvXCFt#u#^d0bD}$922$p_@K-DnW?jDasM|P&lQ)xu3W0ECYa-fG15BPpnzw7_SSE;oT zug9MuYL}QSIt?t~p|F_+s%AYTuu2gVu8{ETN1{C@ z?dFw^L_(ob*0&li40Ujw3sas<;_+OSc@6X~>J4s@)|L>bB4eS!eQ(U5X358gLr%vh z(jlAJTBi5fF^?|)gB+B?54?)5!`42n<03&f(XDY`Qcf;(t-bbAkZD2JSb9$_3;QkB zpwx_RKa$|7D1 zbnUDm98mMS&*ri1f-gVQymtc=+v&F(x9x|(zS@>-H`Un6-n2#*k7iedSya8 zF0wdM8e5I2ux!;2ZBVm}uzNBv^y2Y>arR@L8GKMiLDe0hyOH&x; zJ7NP{1XE1d@H7x87+Tmix@zjWzD%~E69QFDh&Qk>PeI+V6jRR^Q7-XfuX@TF_}Mia zCjyjE9RbA1fVl+{8&mC<1QtWd+!WrVav8pLD#atMiCMmO2TIZbbg)sE{A1*}hnwHEKO8sc6q_w6o9iiW%L-GUo zd_S?;Rloa#Cf|5**o<`W5@hic33Ki`FmRJXw6W6p)lX?RpVD;j&?<0h z0@|GBmbPQL21%Zt&1-bT-;enizi)6tl_~hQg5uwA6(;EUU0NbB(FdcK^Xz%{#ESvVS}a%}(0S&+^r}JbK8_dp;R}zZ~(*e%V;f+w~kqp4r$YLFx02tZ3gsGsTSiqexBxpW}JQ&w_+=Hpm6Uu%4Dw4s5{8((G$saTsTdYz~_LIfzyzB8UKaOk6E@4+&;a z63?P2bKsYo-;koLx2Jdk@HI5KFBB8z(@ z1sc?QJ{moias5e5$1Ndt))dP*(81P2AP}U*XL%g z=A^>#18m)WPtaQm-iMGPD9&BLCRqxgemj>|u6 zAdN$0>Y7=}oe9cQ%F!0DS&NGzNU8!+<_pIkSTKv18+zkGv$2(i4{pCdVo=ZF7iNKp>x1&n~?;dfaIInqQn_hB#{zrE#k>Wlim7V8QB@ldM=f0X}i z(}l)2EcFr!4dcRD=7RBG#{gJt-wHWTaKZ4R>KxjU_k{PR_EoOOswiHN)$!Cu?@Oj> z)AloeuQ`oTtUVU5kT4BZACo!w*Gk1-_PJKn?@h*l1G+2DGt+n~Rp5A<~F{X!G{e{LJJAI$zz!Gp5l+YgO zk8Tg?rWJPAZ-9KFgpvF7{MYVtpX+oU%&y5A)!BZ%wr8v3YIVQWFy-#OXGbyf)&9dZ zgS{sLTIM;bR>>EKItg|(Smlh$mJ%+H;I}Ait(l*A)=e@#**WGPg3p zTOs_2YPE=|At7!XF;ka6-K_*#QaPq6oa{p+u(@)`5>_7$m=PG-U%MHv0jsm2j}v3G zRXG2s5GbiVVk3W8z*bggu{JOph=*CHL^|kGIDcH*Q%2w8Ar!4lZ%EaPWsEe30NRZ) z?2~lA@w*{MDMKB}mw0eyPOknRm_KI&jwMjhej5EI!aYB~hgQI=-dZ_h1yo>|Ba6YW zaeXN|eP6G59p|IbdsC6I`RD?Sn{48V375jF+5SE#3!9Q7RDdN@FK8$sf5bXVp5x#( z-C(99T5p}&Ft z4Kf;-nI7n9w>UpFOyD^SS9TWz*+<%?^joFw{%q#(*WE=vYhGW?KL^{1bjKpztN7lv z{gWx|ve-J9DA@(@NfJpxl%s5glFtF!>H%+TW;e%ke~~3XaWXv2YRkmMC7;$s`CS|M z;#ift*Mj-c=)|+{LIiAjJEMuGN8?ld0(bk{-;1+U-DKZ2n5;L=UXOBYUmTKrBnzZKIf%9V2hGd0{D4hoyBnHiEq{odYUza= zsKNDdCfFap7ITuLE|mPRhB?jD?r%u8!mpjYeE0W)egCdf4ge%Y0KHpxY{>j(uKGTw zch4tIO;#6NR(+|Z1de~<7193|r2N7nnip>@OkfXd0V}&ot#6~IeLf!Btyi|pT|TYn zV)gr`WdLP8`H>4JYQ70HyU8FJh+t2`rX)ycu*K-(;GbmmqA3pIT9Ws6)wR_7wt?@ee*hs(i?`Kq(O5c{0+-+}3wt0+koqQ<$cXPGz60&$)De}aR9D`lDxxsYYwgmGE!t8Wl_K_i^#cFKI6rVp04s z`ByO8>PeDZ7!%u5wTn@Mh*a{WL2j+DZl+3n$A8OvDD*G?Az>&~{s4A|sAck>qAc0E z46CighfC;Q{%w$ZgnMsN|8v=|*X9k5VIynWR>EFC5}c~Pq)H*g=r2WcK8o6PfZes^C2zt@!455Q(vfcHoCO5M6^Y0QvAL#^$I>Mx03ys zIYKxQ*~`b_bKP)I#4hql4G|BWbEo0ybU-R)@t)qMHx0V^#vK0CDhvLE!^HLU2L+cC zg|z@qj1MTwXW#3q61sA$vhY?f@9rfP{2R&>Tlqzf+VypN_j0vh`ut2P>gV>TRqI5; zLY!ywzxy9k|Lw~1ME`BjK0{hvuTUw2w5qoBt+U#CxVNbr0iamF3fB{mWXt za7lRuAq9w(#iiiCMj!L<;W-PF35}==qX+&SyMn0_Sa6NqLq~B@B*g)^g!#Q%+oM@f zXvk`xSv6oUL_a1BYXpPKhX5{NxgOQAd3oe$$^HAk8ns>0_Jxolt@9St?zzN$YqFKd z`Y-G`s(IXnyO3D~wa@`K$8hHd0(~2vJF24hVGnCQ;N{;^F=cn(eW*Lxz;&We2^j9; z`uen^Gw59^%R8M9 z{e?Nmvg(??6vE`9J0o$4;0j8_u3$h3JQtL)KU{Z%{De+y+zunm!D&Xy1TilWMLiXF z4x(Wl{eH)k=+eEw7M9boR&gPqPDFBlY`pcHRJ}S{1FWjNHSE9oiNoQ|*0TGy2gK&p zbWmOwVUAUqnLi3GB@8Lwrl`6j9%B+?(}O;#1D>j}|1OJ9K{11!pt#UjC=(cydmp4`;`%RyTi`G1*{H-3R8<2ehY!W<`kC4Ljj)IDRJFB(j1 zGR=#xhuK7DbNEZ1>NBX(t+Dc6ZE};-J=iN3jz%8HO%RHx@%OT6`9OMV83JPOllA9m$wR9h}XpRq)RU3 z^n{j^`fTI?O0FRXmY!8XDu{9#Vpkci&I~}SI?o=xT+h9f4rhTht_5b5w>)ocrMYt7 zfeo_pwc#hE&2Olqxu}tjU+0prLlG%wQQhrK0O_7OcSdu%zR^QOBAiYM8}2ob8VtBN z%ueK-mr-s1Ez$vfek|dy7aKC&4T#Gi!%H^B$~uS6&POG07n@@W3IJZ})vxCRAUiC0 z_XpGz4OaI?EXP$#*0AcgW#ru@@0Vjxa$Me2f%x0pjo$9ouHHjgYyJ$B-S6l+Wbh~P z8AAhv^Tllo_Rr)wCziv(U|$-hF}};iMR^C|Mu&Ib3Rxe^k5+qMagPas0+Zb6q;qFZ zV}NI2f~j)TdB1-w&f}Z+xvBArU;o&fT#v`35gq5l++pCtOxg*6QCNUC!t(EOF#sh!V;Ertj?|rG!WJZjB3y7b9kM`_4>H{INpi+kV<1&O~j|uPYNdFj=H|Y$xjavdL4dfE%=?jbB`R1JV zTvBb6B;)qZt?A04HL?u8(Te7_js`vP-ND`GelNuv`3&f#!Mngl+)Z&og88oh9AJJa zE0k*%wZue~3Ngg~Jx1cknVj$`QGEv$Qj#EvX3C6II2_iS+3*E=SU~J88j=${6*6FL zaoLtCB}eT)J_#^!Oa8#BCb|E31ui!G@h3u(piC+S-8k`UkrEHlN{pQdtK~9jz>DO& zPL`D`C~8&Rl>Z9N3u}yK>!bww$~pHz^&T^~H4~8^y49WWk_mEs^;x#Y4u^KwDbN2! z>au^?^nz@e;0;az$Z@AjvSbFLuPB|7lK-pvvp$LJWz=xYbb&ecE;Hyx&=<69Ya7s@_G8}3 zcTW#d!w4ZaaXgjdxHZNR5v56vUxeBiUuMIaDdr&JrYP)QLMpigL&Yx#Z@7fYb{7@6 zNTH23=vEm#I}7$fvZpe8?5c6iqJ`)ItlM)_-AU_DGUTNMnV$0GoQktqeWTCrpYrN` zdcqT%<4;)S7Lcb4IlCBae`AYg@DwR2P2xgB~kW|814`69sS> zXK;(nF~Y4Qc&}mYfu7JizOxJ=_m%ip16Wdq72(^3Dmpr@Ko(HViYpW__po%&!OJz* zn&n@U-myf7m|^G^DTGAnIPyXzh8J_FA3QyS_46wZ4e(I@cFWF2zdR9>5g;Pt$5b}x zj3WKB!_Q6n$r~VDa+&TY2%O>9{#PMQGfsp^dFNw3E$H?@izYW7Um0`O%?4q@+;cp9 zp&z}yUpvAs5R}K+lTYL+Z~i#ZMIBoG5fXf5DfoxY zPJ{i)-P=Jn*rS8?y5+sD_yq~@#?!!$nL%^c4^+n)*juw!G!>3Oxxe;oa@BboSSkhv zopWOcwUk5sUYLai!kY}`9QU8D1CCqqUs@6xeUzprjgf2rZERE7blcH*_xKmL>XIeG zdNWGc+;RR|&D4XnPjd1|kk?O0fqV+}^uupYGtlee9LTqUAG@A#5obbQdnzP*vC6$V zQxSHX71?*PrYplhM{QEq>IG+2)-@8-qmGZoNDi2WhE_rFY*o(nsjqCX7?{B_rm98F zk}gDaS7?KOxJg++->Dfv*gChg<8l_mRdBPE`E_Z52jw{FGK|>XV*IfRt!#K z5*^hJ{I0&H@(c{~{%Mfqx`mR!31)wCX| zv@Moyxf-K*wB29To-sN$$2_HsEM;RNj(Q0oFzp~fQ`fLlQ9YuW0UvN9QU3}U~7!D zHM~l{kA|oT?O$?abxjs2aw|su31Cyzy*$#LGWy?iC$+?E5XI<76`ta4ykhx1W~DFc z^8H&w5I6$htb?Q%@ftnl0bb)Q$l0p{)rO@8sK`^6v)7EaNJ2G}1*LlmD|T}~H66qq zQ8t0(&*k5L7gh;}nN=D-_jD@LuGU)8iP-Sr3gmhg#k(e?ppf$vzBGs6aNC8=&;VoV#V-@?QZDSGi(|%Z3kvZVh|Tm=yj<1%GLolEyT?pe!pp zeRs!A)^rS{d~o&!4}n~(&)}Q3<~!XJz^m4IAd?6s*U*ZZ_OixZsPXF!L$TX-0v$Q3 zyPHgF`;h0)nH=s;osVWHqpqYxMfH7Q_KVo>oo01esIrk7c=+4bH!EL$^ED>FwDcET z^5%K05F$ht8c+L8<(5%$AU+n{I&j&c_Hjs}xzGTc&`sPJE?yeak(Mhx+mog&S-B}+ z7yR&h%qyrrwfQ_4(q!k{oMG^sX!M@#$otk~R!4-8O@s;A?+3&|HHXTDV!j3rtm|#0 z1MfVJ5lE(6XL*S~E?xNkfp%im;i$UqMPVOGPI8a0Nf)`hcP1 zLDiw-kuM}3&Tc-N2+>}Aw3CPVNnw|Ohtr@&0)lMH1HbmJ-@NziPB7^>4g<(gRcvI? zKuK9+j);&tj6C*K8_A_-O~-lO!K;=)+Ys#7}&DblGxIRpY|t-BA@q zZcj13-pgZr!2uI3*DrCL3x|5ysT}jYsc#Aod167Wbrq=asw9}7+;N&_jIPA9OsbKG zJgx^W_okf(uD%fBUb0XUc0iNClHu%g`6o=NXsAJ?!%7`|Q6J1(Rmg%6q}2U*>ky3& z!T?kdXd$F;ZJww=A|~(X%V^!yRp$QSBap@>pig(Xygah6R6`%IG0S7UWANKBNr>EKc!uUH{({Fex9UVgUON&G28htC%&Pbu=vz=fsjzPh=!{!S8M# zCbB(p3H=!XNp8)e2|C-@q?xc+BTd-9t`{0U`qpd%Z9Q``ZuuNgY**0ath+Um!qduK znHQ42-*!}4L*&F(UBNl@j0w*h=0*ox<5Du&)a8+W6>>UyH$;=B+fA$I*i2eup?XJRMm=oNLP$>g6yn3DVVZKCV$ zO$Lhcir>GOD}YeCf*=Ty9X!fFO0*o2eLa!aR`TTh7A4sVpDs8->sFKL+TYf)94%eS znM#GjGS=2VV?$>7aKI#4-b!)`eD?S>~-;i9OX(ZEaHj3 z^!e5`W!`b(USS!MTrl~!sEMyYvCcCu(aX(NqreA#^4j~sDwqNWHz~UB-s()9YE253 zC$!vMt&uuP!VHhtNkmTgaCHO_M3It1e_lh*2^j}FjskE{CSsRF_?pQBR2#OjWrp2^ zzXgq~>=nS8+}ZmlhtSs-TzY>!xCkEoCyHIyPwwpY4KY&(Q~0%qjBYwS)B{qYYv2zo zb`_~$Mhfqa>j;ORbYe6?Z7`Pj!hR1HBAa%5<1Y;E9{P{CHCGGvd&4qrLs35K7bo(@ ze@D^ZU1e$Nw5}}( zhp;r{>*k(W^RMR&#HTVO9vI{lOh&0iN9uGIr5DVmh++|HW^Q*pJzu## zt5jnQSz~F&>}|g9FHKhoy#FlMwLn-bN6M;Z1$WfGU;od7uxWsZjvCVN7k&^(dd1{{TRI+5-Rp literal 0 HcmV?d00001 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 d6403592d..8344b5217 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 @@ -1,5 +1,4 @@ -// Object Viewer Qt - MMORPG Framework -// Copyright (C) 2010 Winch Gate Property Limited +// Object Viewer Qt - Log Plugin - MMORPG Framework // Copyright (C) 2011 Adrian Jaekel // // This program is free software: you can redistribute it and/or modify From 50d15e4c86c03b8f74a05d8c2353d46b143958ab Mon Sep 17 00:00:00 2001 From: sfb Date: Sun, 29 May 2011 14:08:46 -0500 Subject: [PATCH 081/118] Changed: Applied patch fixing the mission_compiler_lib build under Linux --- code/ryzom/tools/leveldesign/CMakeLists.txt | 6 +- .../mission_compiler_lib/mission_compiler.cpp | 27 +++++-- .../mission_compiler_lib/steps.cpp | 77 +++++++++++++++---- 3 files changed, 86 insertions(+), 24 deletions(-) diff --git a/code/ryzom/tools/leveldesign/CMakeLists.txt b/code/ryzom/tools/leveldesign/CMakeLists.txt index be22df62c..c490de731 100644 --- a/code/ryzom/tools/leveldesign/CMakeLists.txt +++ b/code/ryzom/tools/leveldesign/CMakeLists.txt @@ -10,11 +10,11 @@ ADD_SUBDIRECTORY(named_items_2_csv) IF(WIN32) ADD_SUBDIRECTORY(export) ADD_SUBDIRECTORY(world_editor) + IF(WITH_MFC) + ADD_SUBDIRECTORY(mission_compiler_fe) + ENDIF(WITH_MFC) ENDIF(WIN32) -IF(WITH_MFC) - ADD_SUBDIRECTORY(mission_compiler_fe) -ENDIF(WITH_MFC) IF(WITH_QT) ADD_SUBDIRECTORY(georges_editor_qt) diff --git a/code/ryzom/tools/leveldesign/mission_compiler_lib/mission_compiler.cpp b/code/ryzom/tools/leveldesign/mission_compiler_lib/mission_compiler.cpp index bc3b21cb8..814239949 100644 --- a/code/ryzom/tools/leveldesign/mission_compiler_lib/mission_compiler.cpp +++ b/code/ryzom/tools/leveldesign/mission_compiler_lib/mission_compiler.cpp @@ -17,6 +17,7 @@ #include "mission_compiler.h" #include "step.h" #include "nel/misc/i18n.h" +#include "nel/ligo/primitive_utils.h" using namespace std; using namespace NLMISC; @@ -526,7 +527,12 @@ bool CMissionCompiler::compileMission(NLLIGO::IPrimitive *rootPrim, const std::s } // first, start by reading mission variables - IPrimitive *variables = getPrimitiveChild(mission, TPrimitiveClassPredicate("variables")); + IPrimitive *variables; + { + TPrimitiveClassPredicate predTmp("variables"); + variables= NLLIGO::getPrimitiveChild(mission, predTmp); + } + if (!variables) { nlwarning("Can't find variables !"); @@ -540,7 +546,12 @@ bool CMissionCompiler::compileMission(NLLIGO::IPrimitive *rootPrim, const std::s // now, we can init the mission header phrase (they need variable knwoled) md.initHeaderPhrase(rootPrim); - IPrimitive *preReq = getPrimitiveChild(mission, TPrimitiveClassPredicate("pre_requisite")); + IPrimitive *preReq; + { + TPrimitiveClassPredicate predTmp("pre_requisite"); + preReq = getPrimitiveChild(mission, predTmp); + } + if (!preReq) { nlwarning("Can't find pre requisite !"); @@ -598,7 +609,8 @@ bool CMissionCompiler::compileMissions(IPrimitive *rootPrim, const std::string & CPrimitiveSet scriptsSet; - scriptsSet.buildSet(rootPrim, TPrimitiveClassPredicate("mission_tree"), missionTrees); + TPrimitiveClassPredicate pred("mission_tree"); + scriptsSet.buildSet(rootPrim, pred, missionTrees); nlinfo("Found %u mission tree in the primitive file", missionTrees.size()); @@ -667,7 +679,8 @@ bool CMissionCompiler::installCompiledMission(NLLIGO::CLigoConfig &ligoConfig, c TPrimitiveSet scripts; CPrimitiveSet filter; - filter.buildSet(primDoc->RootNode, TPrimitiveClassPredicate("mission"), scripts); + TPrimitiveClassPredicate pred("mission"); + filter.buildSet(primDoc->RootNode, pred, scripts); // for each script, check if it was generated, and if so, check the name // of the source primitive file. @@ -732,7 +745,8 @@ bool CMissionCompiler::installCompiledMission(NLLIGO::CLigoConfig &ligoConfig, c TPrimitiveSet bots; CPrimitiveSet filter; - filter.buildSet(primDoc->RootNode, TPrimitiveClassAndNamePredicate("npc_bot", mission.getGiverName()), bots); + TPrimitiveClassAndNamePredicate pred("npc_bot", mission.getGiverName()); + filter.buildSet(primDoc->RootNode, pred, bots); if (bots.empty()) { @@ -961,7 +975,8 @@ bool CMissionCompiler::parseOneStep(CMissionData &md, IPrimitive *stepToParse, I bool CMissionCompiler::parseSteps(CMissionData &md, IPrimitive *steps, IStep *parent) { TPrimitiveSet childs; - filterPrimitiveChilds(steps, TPrimitivePropertyPredicate("step_tag", "true"), childs); + TPrimitivePropertyPredicate pred("step_tag", "true"); + filterPrimitiveChilds(steps, pred, childs); if (childs.empty()) { diff --git a/code/ryzom/tools/leveldesign/mission_compiler_lib/steps.cpp b/code/ryzom/tools/leveldesign/mission_compiler_lib/steps.cpp index 10842c97c..44e6e96cc 100644 --- a/code/ryzom/tools/leveldesign/mission_compiler_lib/steps.cpp +++ b/code/ryzom/tools/leveldesign/mission_compiler_lib/steps.cpp @@ -55,7 +55,11 @@ IStep::IStep(CMissionData &md, NLLIGO::IPrimitive *prim) // parse the sub prim to create action & objectives; IPrimitive *child; // parse the preactions - child = getPrimitiveChild(prim, TPrimitiveClassAndNamePredicate("actions", "pre_actions")); + { + TPrimitiveClassAndNamePredicate pred("actions", "pre_actions"); + child = getPrimitiveChild(prim, pred); + } + if (child) { for (uint i=0; igetNumChildren(); ++i) @@ -72,7 +76,10 @@ IStep::IStep(CMissionData &md, NLLIGO::IPrimitive *prim) } } // parse the objectives - child = getPrimitiveChild(prim, TPrimitiveClassAndNamePredicate("mission_objectives", "objectives")); + { + TPrimitiveClassAndNamePredicate pred("mission_objectives", "objectives"); + child = getPrimitiveChild(prim, pred); + } if (child) { for (uint i=0; igetNumChildren(); ++i) @@ -89,7 +96,10 @@ IStep::IStep(CMissionData &md, NLLIGO::IPrimitive *prim) } } // parse the post actions - child = getPrimitiveChild(prim, TPrimitiveClassAndNamePredicate("actions", "post_actions")); + { + TPrimitiveClassAndNamePredicate pred("actions", "post_actions"); + child = getPrimitiveChild(prim, pred); + } if (child) { for (uint i=0; igetNumChildren(); ++i) @@ -447,7 +457,10 @@ public: // parse the sub prim to create action & objectives; IPrimitive *child; // parse the pre-actions - child = getPrimitiveChild(prim, TPrimitiveClassAndNamePredicate("actions", "actions")); + { + TPrimitiveClassAndNamePredicate pred("actions", "actions"); + child = getPrimitiveChild(prim, pred); + } if (child) { for (uint i=0; igetNumChildren(); ++i) @@ -464,7 +477,10 @@ public: } } // look for an optional jump - child = getPrimitiveChild(prim, TPrimitiveClassPredicate("jump_to")); + { + TPrimitiveClassPredicate pred("jump_to"); + child = getPrimitiveChild(prim, pred); + } if (child) { // ok, we have a jump at end of fail step @@ -515,7 +531,10 @@ public: // parse the sub prim to create action & objectives; IPrimitive *child; // parse the pre-actions - child = getPrimitiveChild(prim, TPrimitiveClassAndNamePredicate("actions", "actions")); + { + TPrimitiveClassAndNamePredicate pred("actions", "actions"); + child = getPrimitiveChild(prim, pred); + } if (child) { for (uint i=0; igetNumChildren(); ++i) @@ -546,7 +565,10 @@ public: } // look for an optional jump - child = getPrimitiveChild(prim, TPrimitiveClassPredicate("jump_to")); + { + TPrimitiveClassPredicate pred("jump_to"); + child = getPrimitiveChild(prim, pred); + } if (child) { // ok, we have a jump at end of fail step @@ -607,14 +629,20 @@ CStepPlayerReconnect::CStepPlayerReconnect(CMissionData &md, IPrimitive *prim) : IPrimitive *child; TPrimitiveSet resp; - filterPrimitiveChilds(prim, TPrimitivePropertyPredicate("step_tag", "true"), resp); + { + TPrimitivePropertyPredicate pred("step_tag", "true"); + filterPrimitiveChilds(prim, pred, resp); + } for (uint i=0; i noSteps; // Get the 'yes branch' jump point - filterPrimitiveChilds(_SubBranchs[1], TPrimitivePropertyPredicate("step_tag", "true"), childs); + { + TPrimitivePropertyPredicate pred("step_tag", "true"); + filterPrimitiveChilds(_SubBranchs[1], pred, childs); + } if (!childs.empty()) { for (i = 0; i < _SubSteps.size(); ++i) @@ -1071,7 +1115,10 @@ string CStepIf::genCode(CMissionData &md) // Get the 'no branch' jump point childs.clear(); - filterPrimitiveChilds(_SubBranchs[0], TPrimitivePropertyPredicate("step_tag", "true"), childs); + { + TPrimitivePropertyPredicate pred("step_tag", "true"); + filterPrimitiveChilds(_SubBranchs[0], pred, childs); + } if (!childs.empty()) { for (i = 0; i < _SubSteps.size(); ++i) From 44c23327e09ea811850581e2d3d23cc4fc5abcc2 Mon Sep 17 00:00:00 2001 From: aquiles Date: Sun, 29 May 2011 22:30:06 +0200 Subject: [PATCH 082/118] Changed: #1306 added leveldesign path dock widget --- .../src/plugins/georges_editor/CMakeLists.txt | 6 +- .../georges_editor/georges_dirtree_dialog.cpp | 99 +++++++++++++++++++ .../georges_editor/georges_dirtree_dialog.h | 62 ++++++++++++ .../georges_editor/georges_dirtree_form.ui | 54 ++++++++++ .../georges_editor/georges_editor_form.cpp | 60 ++++++++--- .../georges_editor/georges_editor_form.h | 7 +- .../georges_editor/georges_editor_plugin.cpp | 7 +- .../georges_filesystem_model.cpp | 95 ++++++++++++++++++ .../georges_editor/georges_filesystem_model.h | 50 ++++++++++ .../src/plugins/log/log_plugin.cpp | 4 +- 10 files changed, 419 insertions(+), 25 deletions(-) create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_dirtree_dialog.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_dirtree_dialog.h create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_dirtree_form.ui create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_filesystem_model.cpp create mode 100644 code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_filesystem_model.h 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 fd180b931..d1dd346ba 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 @@ -9,9 +9,11 @@ SET(OVQT_EXT_SYS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_spec.h) SET(OVQT_PLUG_GEORGES_EDITOR_HDR georges_editor_plugin.h - georges_editor_form.h) + georges_editor_form.h + georges_dirtree_dialog.h) -SET(OVQT_PLUG_GEORGES_EDITOR_UIS georges_editor_form.ui ) +SET(OVQT_PLUG_GEORGES_EDITOR_UIS georges_editor_form.ui + georges_dirtree_form.ui) SET(OVQT_PLUGIN_GEORGES_EDITOR_RCS georges_editor.qrc) 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 new file mode 100644 index 000000000..f7e250cce --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_dirtree_dialog.cpp @@ -0,0 +1,99 @@ +// 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 "georges_dirtree_dialog.h" + +// Qt includes +#include +#include + +// NeL includes + +//using namespace NLMISC; + +namespace Plugin +{ + +CGeorgesDirTreeDialog::CGeorgesDirTreeDialog(QString ldPath, QWidget *parent) + :QDockWidget(parent), m_ldPath(ldPath) +{ + + m_ui.setupUi(this); + + m_dirModel = new CGeorgesFileSystemModel(m_ldPath); + m_ui.dirTree->setModel(m_dirModel); + + if (m_dirModel->isCorrectLDPath()) + { + m_dirModel->setRootPath(m_ldPath); + m_ui.dirTree->setRootIndex(m_dirModel->index(m_ldPath)); + } + else + { + m_dirModel->setRootPath(QDir::currentPath()); + } + + m_ui.dirTree->setAnimated(false); + m_ui.dirTree->setIndentation(20); + + connect(m_ui.dirTree, SIGNAL(activated(QModelIndex)), + this, SLOT(fileSelected(QModelIndex))); +} + +CGeorgesDirTreeDialog::~CGeorgesDirTreeDialog() +{ + delete m_dirModel; +} + +void CGeorgesDirTreeDialog::fileSelected(QModelIndex index) +{ + QString name; + if (index.isValid() && !m_dirModel->isDir(index)) + { + Q_EMIT selectedForm(m_dirModel->fileName(index)); + } +} + +void CGeorgesDirTreeDialog::changeFile(QString file) +{ + QModelIndex index = m_dirModel->index(file); + m_ui.dirTree->selectionModel()->select(index,QItemSelectionModel::ClearAndSelect); + m_ui.dirTree->scrollTo(index,QAbstractItemView::PositionAtCenter); + fileSelected(index); +} + +void CGeorgesDirTreeDialog::ldPathChanged(QString path) +{ + m_ldPath = path; + + delete m_dirModel; + + m_dirModel = new CGeorgesFileSystemModel(m_ldPath); + m_ui.dirTree->setModel(m_dirModel); + + if (m_dirModel->isCorrectLDPath()) + { + m_dirModel->setRootPath(m_ldPath); + m_ui.dirTree->setRootIndex(m_dirModel->index(m_ldPath)); + } + else + { + m_dirModel->setRootPath(QDir::currentPath()); + } +} + +} /* namespace NLQT */ \ No newline at end of file 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 new file mode 100644 index 000000000..3079f76c2 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_dirtree_dialog.h @@ -0,0 +1,62 @@ +// 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_DIRTREE_DIALOG_H +#define GEORGES_DIRTREE_DIALOG_H + +// Qt includes +#include + +// STL includes + +// NeL includes + +// Project includes +#include "ui_georges_dirtree_form.h" +#include "georges_filesystem_model.h" + +namespace Plugin +{ + +class CGeorgesDirTreeDialog: public QDockWidget +{ + Q_OBJECT + +public: + CGeorgesDirTreeDialog(QString ldPath, QWidget *parent = 0); + ~CGeorgesDirTreeDialog(); + + void ldPathChanged(QString); + +private: + Ui::CGeorgesDirTreeDialog m_ui; + + CGeorgesFileSystemModel *m_dirModel; + QString m_ldPath; + +Q_SIGNALS: + void selectedForm(const QString); + +private Q_SLOTS: + void fileSelected(QModelIndex index); + void changeFile(QString file); + + friend class CMainWindow; +}; /* CGEorgesDirTreeDialog */ + +} /* namespace NLQT */ + +#endif // GEORGES_DIRTREE_DIALOG_H 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 new file mode 100644 index 000000000..8731d1ca8 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_dirtree_form.ui @@ -0,0 +1,54 @@ + + + CGeorgesDirTreeDialog + + + + 0 + 0 + 400 + 300 + + + + + 0 + 0 + + + + + 200 + 111 + + + + QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable + + + Leveldesign Path + + + + + 50 + 0 + + + + + + + + 0 + 0 + + + + + + + + + + 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 2e3b9efb3..aa614a161 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 @@ -17,6 +17,7 @@ // Project includes #include "georges_editor_form.h" #include "georges_editor_constants.h" +#include "georges_dirtree_dialog.h" #include "../core/icore.h" #include "../core/imenu_manager.h" @@ -34,36 +35,44 @@ namespace Plugin { GeorgesEditorForm::GeorgesEditorForm(QWidget *parent) - : QMainWindow(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")); + _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")); + _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")); + _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 = 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() @@ -98,6 +107,10 @@ 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() @@ -108,4 +121,19 @@ void GeorgesEditorForm::writeSettings() 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); + } +} + } /* 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 65c37cb8d..96fceb4ed 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 @@ -26,6 +26,7 @@ namespace Plugin { +class CGeorgesDirTreeDialog; class GeorgesEditorForm: public QMainWindow { Q_OBJECT @@ -36,13 +37,12 @@ public: QUndoStack *undoStack() const; -Q_SIGNALS: public Q_SLOTS: void open(); void newFile(); void save(); + void settingsChanged(); -private Q_SLOTS: private: void readSettings(); void writeSettings(); @@ -50,10 +50,13 @@ private: QUndoStack *m_undoStack; Ui::GeorgesEditorForm m_ui; + CGeorgesDirTreeDialog *m_georgesDirTreeDialog; QToolBar *_fileToolBar; QAction *_openAction; QAction *_newAction; QAction *_saveAction; + + QString m_leveldesignPath; }; /* class GeorgesEditorForm */ } /* namespace Plugin */ 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 941722994..a97188751 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 @@ -69,12 +69,12 @@ void GeorgesEditorPlugin::setNelContext(NLMISC::INelContext *nelContext) QString GeorgesEditorPlugin::name() const { - return tr("GeorgesEditor"); + return tr("Georges Editor"); } QString GeorgesEditorPlugin::version() const { - return "0.1"; + return "0.2"; } QString GeorgesEditorPlugin::vendor() const @@ -84,13 +84,14 @@ QString GeorgesEditorPlugin::vendor() const QString GeorgesEditorPlugin::description() const { - return "Tool to create & edit sheets or forms."; + 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; } 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 new file mode 100644 index 000000000..20cb30b33 --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_filesystem_model.cpp @@ -0,0 +1,95 @@ +// 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_filesystem_model.h" + +#include +#include + +namespace Plugin +{ + +CGeorgesFileSystemModel::CGeorgesFileSystemModel(QString ldPath, QObject *parent) + : QFileSystemModel(parent), + m_ldPath(ldPath), + m_correct(false) +{ + checkLDPath(); +} + +CGeorgesFileSystemModel::~CGeorgesFileSystemModel() +{ + +} + +QVariant CGeorgesFileSystemModel::data(const QModelIndex& index, int role) const +{ + + if (role == Qt::DecorationRole) + { + if (!m_correct) + return QVariant(); + if (isDir(index)) + return QApplication::style()->standardIcon(QStyle::SP_DirIcon); + } + if (!m_correct && role == Qt::DisplayRole) + { + if (index.parent().isValid()) + return QVariant(); + return tr("Set a correct leveldesign path ..."); + } + return QFileSystemModel::data(index, role); +} + +int CGeorgesFileSystemModel::columnCount(const QModelIndex &/*parent*/) const +{ + return 1; +} + +int CGeorgesFileSystemModel::rowCount(const QModelIndex &parent) const +{ + + if (!m_correct) + { + if(parent.isValid()) + { + return 0; + } + else + { + return qMin(QFileSystemModel::rowCount(parent),1); + } + } + return QFileSystemModel::rowCount(parent); +} + +void CGeorgesFileSystemModel::checkLDPath() +{ + QFileInfo check1(QString("%1/game_element").arg(m_ldPath)); + QFileInfo check2(QString("%1/DFN").arg(m_ldPath)); + + if (check1.exists() && check2.exists()) + { + m_correct = true; + } + else + { + m_correct = false; + } +} +} /* 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 new file mode 100644 index 000000000..775dcb18d --- /dev/null +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/georges_editor/georges_filesystem_model.h @@ -0,0 +1,50 @@ +// 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_FILESYSTEM_MODEL_H +#define GEORGES_FILESYSTEM_MODEL_H + +#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() + { + return m_correct; + } + void checkLDPath(); + +private: + bool m_correct; +};/* class CGeorgesFileSystemModel */ + +} /* namespace NLQT */ + +#endif // GEORGES_FILESYSTEM_MODEL_H \ No newline at end of file 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 8344b5217..2f88200ec 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 @@ -103,7 +103,7 @@ namespace Plugin QString CLogPlugin::name() const { - return "LogPlugin"; + return "NeL Log"; } QString CLogPlugin::version() const @@ -118,7 +118,7 @@ namespace Plugin QString CLogPlugin::description() const { - return "DockWidget to display all log messages from NeL."; + return tr("DockWidget to display all log messages from NeL."); } QStringList CLogPlugin::dependencies() const From cce05665dd5cc5a34ef759c9c88818ea11d1de78 Mon Sep 17 00:00:00 2001 From: kervala Date: Mon, 30 May 2011 13:31:18 +0200 Subject: [PATCH 083/118] Changed: #878 Added new actions comments for translation_tools --- code/ryzom/tools/translation_tools/main.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/ryzom/tools/translation_tools/main.cpp b/code/ryzom/tools/translation_tools/main.cpp index 0a664a137..7f9edf891 100644 --- a/code/ryzom/tools/translation_tools/main.cpp +++ b/code/ryzom/tools/translation_tools/main.cpp @@ -61,9 +61,11 @@ * trans_tool update_phrase_work * trans_tool inject_clause * trans_tool sort_trans_phrase - - - +* trans_tool make_worksheet_diff +* trans_tool merge_worksheet_diff +* trans_tool crop_lines +* trans_tool extract_bot_names +* trans_tool extract_new_sheet_names */ From 37dc120e697bba55f2249174aafbf048627097b7 Mon Sep 17 00:00:00 2001 From: sfb Date: Tue, 31 May 2011 07:34:42 -0500 Subject: [PATCH 084/118] Changed: Merged in latest API changes to OVQT plugin system. --- .../zone_painter/zone_painter_main_window.cpp | 2 +- .../zone_painter/zone_painter_main_window.h | 5 +- .../zone_painter/zone_painter_plugin.h | 54 +++++++++++-------- .../zone_painter_settings_page.cpp | 7 ++- .../zone_painter/zone_painter_settings_page.h | 1 + 5 files changed, 43 insertions(+), 26 deletions(-) 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 1bd91f667..01086f231 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 @@ -77,7 +77,7 @@ ZonePainterMainWindow::ZonePainterMainWindow(QWidget *parent) : Core::ICore::instance()->mainWindow()->statusBar()->addPermanentWidget(m_statusInfo); - + m_undoStack = new QUndoStack(this); } void ZonePainterMainWindow::showEvent(QShowEvent *showEvent) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.h index d55eb39e5..0dbfd9948 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_main_window.h @@ -5,6 +5,7 @@ #include #include #include +#include namespace NLQT { class QNLWidget; @@ -26,7 +27,7 @@ public: void loadConfig(); void saveConfig(); - + QUndoStack *getUndoStack() { return m_undoStack; } public Q_SLOTS: void setToolMode(int value); void setToolMode(); @@ -49,7 +50,7 @@ private: QAction *_toolSelectModeAction; QAction *_toolPickModeAction; QMenu *_toolModeMenu; - + QUndoStack *m_undoStack; //QAction *m_setBackColorAction; }; 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 aeae39ba6..0d5b9296a 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 @@ -79,28 +79,38 @@ class CZonePainterContext: public Core::IContext { Q_OBJECT public: - CZonePainterContext(QObject *parent = 0): IContext(parent) - { - m_zonePainterMainWindow = new ZonePainterMainWindow(); - } - virtual ~CZonePainterContext() {} - - virtual QString id() const - { - return QLatin1String("ZonePainterContext"); - } - virtual QString trName() const - { - return tr("Zone Painter"); - } - virtual QIcon icon() const - { - return QIcon(); - } - virtual QWidget *widget() - { - return m_zonePainterMainWindow; - } + CZonePainterContext(QObject *parent = 0): IContext(parent) + { + m_zonePainterMainWindow = new ZonePainterMainWindow(); + } + virtual ~CZonePainterContext() {} + + virtual QString id() const + { + return QLatin1String("ZonePainterContext"); + } + virtual QString trName() const + { + return tr("Zone Painter"); + } + virtual QIcon icon() const + { + return QIcon(); + } + virtual QWidget *widget() + { + return m_zonePainterMainWindow; + } + + virtual QUndoStack *undoStack() + { + return m_zonePainterMainWindow->getUndoStack(); + } + virtual void open() + { + } + + ZonePainterMainWindow *m_zonePainterMainWindow; }; diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.cpp index 69c4e7525..e59f76da1 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.cpp @@ -53,6 +53,11 @@ QString CZonePainterSettingsPage::trCategory() const return tr("General"); } +QIcon CZonePainterSettingsPage::categoryIcon() const +{ + return QIcon(); +} + QWidget *CZonePainterSettingsPage::createPage(QWidget *parent) { _currentPage = new QWidget(parent); @@ -64,4 +69,4 @@ void CZonePainterSettingsPage::apply() { } -} /* namespace Plugin */ \ No newline at end of file +} /* namespace Plugin */ diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.h index 8e4b3f3d6..d84b117eb 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/zone_painter/zone_painter_settings_page.h @@ -43,6 +43,7 @@ public: virtual QString trName() const; virtual QString category() const; virtual QString trCategory() const; + QIcon categoryIcon() const; virtual QWidget *createPage(QWidget *parent); virtual void apply(); From a436467612454c8c836d6a120cfe9fd3d4d53769 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Tue, 31 May 2011 18:37:04 +0300 Subject: [PATCH 085/118] Changed: #1193 Added new actions. Added fullscreen mode. --- .../src/plugins/core/core_constants.h | 22 ++- .../src/plugins/core/main_window.cpp | 168 +++++++++++++++++- .../src/plugins/core/main_window.h | 24 +++ 3 files changed, 204 insertions(+), 10 deletions(-) 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 7f0b5cd15..2acf4f731 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,10 +23,10 @@ namespace Core namespace Constants { -const char * const OVQT_VERSION_LONG = "0.0.1"; +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_CORE_PLUGIN = "Core"; //mainwindow const char * const MAIN_WINDOW = "ObjectViewerQt.MainWindow"; @@ -43,12 +43,26 @@ 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"; //actions const char * const NEW = "ObjectViewerQt.New"; -const char * const OPEN = "ObjectViewerQt.Open"; -const char * const EXIT = "ObjectViewerQt.Exit"; +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 SETTINGS = "ObjectViewerQt.Settings"; const char * const TOGGLE_FULLSCREEN = "ObjectViewerQt.ToggleFullScreen"; 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 79316424a..86237cb51 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 @@ -98,11 +98,11 @@ bool MainWindow::initialize(QString *errorString) void MainWindow::extensionsInitialized() { - readSettings(); - connect(m_contextManager, SIGNAL(currentContextChanged(Core::IContext*)), - this, SLOT(updateContext(Core::IContext*))); - if (m_contextManager->currentContext() != NULL) - updateContext(m_contextManager->currentContext()); + readSettings(); + connect(m_contextManager, SIGNAL(currentContextChanged(Core::IContext*)), + this, SLOT(updateContext(Core::IContext*))); + if (m_contextManager->currentContext() != NULL) + updateContext(m_contextManager->currentContext()); show(); } @@ -141,6 +141,56 @@ void MainWindow::open() m_contextManager->currentContext()->open(); } +void MainWindow::newFile() +{ +} + +void MainWindow::save() +{ +} + +void MainWindow::saveAs() +{ +} + +void MainWindow::saveAll() +{ +} + +void MainWindow::cut() +{ +} + +void MainWindow::copy() +{ +} + +void MainWindow::paste() +{ +} + +void MainWindow::del() +{ +} + +void MainWindow::find() +{ +} + +void MainWindow::gotoPos() +{ +} + +void MainWindow::setFullScreen(bool enabled) +{ + if (bool(windowState() & Qt::WindowFullScreen) == enabled) + return; + if (enabled) + setWindowState(windowState() | Qt::WindowFullScreen); + else + setWindowState(windowState() & ~Qt::WindowFullScreen); +} + bool MainWindow::showOptionsDialog(const QString &group, const QString &page, QWidget *parent) @@ -186,6 +236,13 @@ void MainWindow::closeEvent(QCloseEvent *event) void MainWindow::createActions() { + m_newAction = new QAction(tr("&New"), this); + m_newAction->setIcon(QIcon(Constants::ICON_NEW)); + m_newAction->setShortcut(QKeySequence::New); + menuManager()->registerAction(m_newAction, Constants::NEW); + connect(m_newAction, SIGNAL(triggered()), this, SLOT(newFile())); + m_newAction->setEnabled(false); + m_openAction = new QAction(tr("&Open..."), this); m_openAction->setIcon(QIcon(Constants::ICON_OPEN)); m_openAction->setShortcut(QKeySequence::Open); @@ -193,15 +250,92 @@ void MainWindow::createActions() menuManager()->registerAction(m_openAction, Constants::OPEN); connect(m_openAction, SIGNAL(triggered()), this, SLOT(open())); + m_saveAction = new QAction(tr("&Save"), this); + m_saveAction->setIcon(QIcon(Constants::ICON_SAVE)); + m_saveAction->setShortcut(QKeySequence::Save); + menuManager()->registerAction(m_saveAction, Constants::SAVE); + connect(m_saveAction, SIGNAL(triggered()), this, SLOT(save())); + m_saveAction->setEnabled(false); + + m_saveAsAction = new QAction(tr("Save &As..."), this); + m_saveAsAction->setIcon(QIcon(Constants::ICON_SAVE_AS)); + m_saveAsAction->setShortcut(QKeySequence::SaveAs); + menuManager()->registerAction(m_saveAsAction, Constants::SAVE_AS); + connect(m_saveAsAction, SIGNAL(triggered()), this, SLOT(saveAs())); + m_saveAsAction->setEnabled(false); + + m_saveAllAction = new QAction(tr("&Save A&ll"), this); + m_saveAllAction->setShortcut(QKeySequence::SelectAll); +#ifdef Q_WS_MAC + m_saveAllAction->setShortcut(QKeySequence(tr("Ctrl+Shift+S"))); +#endif + menuManager()->registerAction(m_saveAllAction, Constants::SAVE_ALL); + connect(m_saveAllAction, SIGNAL(triggered()), this, SLOT(saveAll())); + m_saveAllAction->setEnabled(false); + m_exitAction = new QAction(tr("E&xit"), this); m_exitAction->setShortcut(QKeySequence(tr("Ctrl+Q"))); m_exitAction->setStatusTip(tr("Exit the application")); menuManager()->registerAction(m_exitAction, Constants::EXIT); connect(m_exitAction, SIGNAL(triggered()), this, SLOT(close())); + m_cutAction = new QAction(tr("Cu&t"), this); + m_cutAction->setShortcut(QKeySequence::Cut); + menuManager()->registerAction(m_cutAction, Constants::CUT); + connect(m_cutAction, SIGNAL(triggered()), this, SLOT(cut())); + m_cutAction->setEnabled(false); + + m_copyAction = new QAction(tr("&Copy"), this); + m_copyAction->setShortcut(QKeySequence::Copy); + menuManager()->registerAction(m_copyAction, Constants::COPY); + connect(m_copyAction, SIGNAL(triggered()), this, SLOT(copy())); + m_copyAction->setEnabled(false); + + m_pasteAction = new QAction(tr("&Paste"), this); + m_pasteAction->setShortcut(QKeySequence::Paste); + menuManager()->registerAction(m_pasteAction, Constants::PASTE); + connect(m_pasteAction, SIGNAL(triggered()), this, SLOT(paste())); + m_pasteAction->setEnabled(false); + + m_delAction = new QAction(tr("&Delete"), this); + m_delAction->setShortcut(QKeySequence::Delete); + menuManager()->registerAction(m_delAction, Constants::DEL); + connect(m_delAction, SIGNAL(triggered()), this, SLOT(del())); + m_delAction->setEnabled(false); + + m_selectAllAction = new QAction(tr("Select &All"), this); + m_selectAllAction->setShortcut(QKeySequence::SelectAll); + menuManager()->registerAction(m_selectAllAction, Constants::SELECT_ALL); + connect(m_selectAllAction, SIGNAL(triggered()), this, SLOT(selectAll())); + m_selectAllAction->setEnabled(false); + + m_findAction = new QAction(tr("&Find"), this); + m_findAction->setShortcut(QKeySequence::Find); + menuManager()->registerAction(m_findAction, Constants::FIND); + connect(m_findAction, SIGNAL(triggered()), this, SLOT(find())); + m_findAction->setEnabled(false); + + m_gotoAction = new QAction(tr("&Go To.."), this); + m_gotoAction->setShortcut(QKeySequence(tr("Ctrl+G"))); + menuManager()->registerAction(m_gotoAction, Constants::GOTO_POS); + connect(m_gotoAction, SIGNAL(triggered()), this, SLOT(gotoPos())); + m_gotoAction->setEnabled(false); + +#ifndef Q_WS_MAC + m_fullscreenAction = new QAction(tr("Fullscreen"), this); + m_fullscreenAction->setCheckable(true); + m_fullscreenAction->setShortcut(QKeySequence(tr("Ctrl+Shift+F11"))); + menuManager()->registerAction(m_fullscreenAction, Constants::SETTINGS); + connect(m_fullscreenAction, SIGNAL(triggered(bool)), this, SLOT(setFullScreen(bool))); +#endif + m_settingsAction = new QAction(tr("&Settings"), this); m_settingsAction->setIcon(QIcon(":/images/preferences.png")); m_settingsAction->setShortcut(QKeySequence::Preferences); +#ifdef Q_WS_MAC + m_settingsAction->setShortcut(QKeySequence("Ctrl+,")); + m_settingsAction->setMenuRole(QAction::PreferencesRole); +#endif m_settingsAction->setStatusTip(tr("Open the settings dialog")); menuManager()->registerAction(m_settingsAction, Constants::SETTINGS); connect(m_settingsAction, SIGNAL(triggered()), this, SLOT(showOptionsDialog())); @@ -223,7 +357,6 @@ void MainWindow::createActions() #ifdef Q_WS_MAC m_exitAction->setMenuRole(QAction::QuitRole); - m_settingsAction->setMenuRole(QAction::PreferencesRole); m_aboutAction->setMenuRole(QAction::AboutRole); m_aboutQtAction->setMenuRole(QAction::AboutQtRole); m_pluginViewAction->setMenuRole(QAction::ApplicationSpecificRole); @@ -234,7 +367,18 @@ void MainWindow::createMenus() { m_fileMenu = menuBar()->addMenu(tr("&File")); menuManager()->registerMenu(m_fileMenu, Constants::M_FILE); + m_fileMenu->addAction(m_newAction); m_fileMenu->addAction(m_openAction); + m_fileMenu->addSeparator(); + m_fileMenu->addAction(m_saveAction); + m_fileMenu->addAction(m_saveAsAction); + m_fileMenu->addAction(m_saveAllAction); + m_fileMenu->addSeparator(); + + m_recentFilesMenu = m_fileMenu->addMenu(tr("Recent &Files")); + m_recentFilesMenu->setEnabled(false); + menuManager()->registerMenu(m_recentFilesMenu, Constants::M_FILE_RECENTFILES); + m_fileMenu->addSeparator(); m_fileMenu->addAction(m_exitAction); @@ -242,9 +386,21 @@ void MainWindow::createMenus() m_editMenu->addAction(m_undoGroup->createUndoAction(this)); m_editMenu->addAction(m_undoGroup->createRedoAction(this)); m_editMenu->addSeparator(); + m_editMenu->addAction(m_cutAction); + m_editMenu->addAction(m_copyAction); + m_editMenu->addAction(m_pasteAction); + m_editMenu->addAction(m_delAction); + m_editMenu->addSeparator(); + m_editMenu->addAction(m_selectAllAction); + m_editMenu->addSeparator(); + m_editMenu->addAction(m_findAction); + m_editMenu->addAction(m_gotoAction); menuManager()->registerMenu(m_editMenu, Constants::M_EDIT); m_viewMenu = menuBar()->addMenu(tr("&View")); +#ifndef Q_WS_MAC + m_viewMenu->addAction(m_fullscreenAction); +#endif menuManager()->registerMenu(m_viewMenu, Constants::M_VIEW); m_toolsMenu = menuBar()->addMenu(tr("&Tools")); 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 74ec08957..85ebad22e 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 @@ -66,6 +66,17 @@ public Q_SLOTS: private Q_SLOTS: void open(); + void newFile(); + void save(); + void saveAs(); + void saveAll(); + void cut(); + void copy(); + void paste(); + void del(); + void find(); + void gotoPos(); + void setFullScreen(bool enabled); void about(); void updateContext(Core::IContext *context); @@ -99,6 +110,7 @@ private: QTabWidget *m_tabWidget; QMenu *m_fileMenu; + QMenu *m_recentFilesMenu; QMenu *m_editMenu; QMenu *m_viewMenu; QMenu *m_toolsMenu; @@ -106,8 +118,20 @@ private: QMenu *m_sheetMenu; + QAction *m_newAction; QAction *m_openAction; + QAction *m_saveAction; + QAction *m_saveAsAction; + QAction *m_saveAllAction; QAction *m_exitAction; + QAction *m_cutAction; + QAction *m_copyAction; + QAction *m_pasteAction; + QAction *m_delAction; + QAction *m_selectAllAction; + QAction *m_findAction; + QAction *m_gotoAction; + QAction *m_fullscreenAction; QAction *m_settingsAction; QAction *m_pluginViewAction; QAction *m_aboutAction; From b55e9e210ee626dcb8c2cb7995e5984446c03c89 Mon Sep 17 00:00:00 2001 From: rti Date: Tue, 31 May 2011 18:10:32 +0200 Subject: [PATCH 086/118] Fixed: #1006 On Mac OS X, do glFinish() after vertex program upload to ensure program is ready to use. --- .../src/3d/driver/opengl/driver_opengl_vertex_program.cpp | 8 ++++++++ code/ryzom/client/src/main_loop.cpp | 4 ---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/code/nel/src/3d/driver/opengl/driver_opengl_vertex_program.cpp b/code/nel/src/3d/driver/opengl/driver_opengl_vertex_program.cpp index 4c255e1d9..befcb7b9b 100644 --- a/code/nel/src/3d/driver/opengl/driver_opengl_vertex_program.cpp +++ b/code/nel/src/3d/driver/opengl/driver_opengl_vertex_program.cpp @@ -1440,6 +1440,14 @@ bool CDriverGL::setupARBVertexProgram (const CVPParser::TProgram &inParsedProgra nlassert(0); return false; } + +#ifdef NL_OS_MAC + // Wait for GPU to finish program upload, else draw comands might crash. + // Happened to CVegetableBlendLayerModel (glDrawElements()). + // For more information, see http://dev.ryzom.com/issues/1006 + glFinish(); +#endif + return true; } diff --git a/code/ryzom/client/src/main_loop.cpp b/code/ryzom/client/src/main_loop.cpp index f8ff5ae89..2a513244a 100644 --- a/code/ryzom/client/src/main_loop.cpp +++ b/code/ryzom/client/src/main_loop.cpp @@ -700,9 +700,6 @@ void updateFromClientCfg() //--------------------------------------------------- if (Landscape) { -#ifdef NL_OS_MAC - Landscape->enableVegetable(false); -#else if (ClientCfg.MicroVeget != LastClientCfg.MicroVeget) { if(ClientCfg.MicroVeget) @@ -722,7 +719,6 @@ void updateFromClientCfg() Landscape->enableVegetable(false); } } -#endif } //--------------------------------------------------- From eea726550a76d150ecdbef33123660224dadcd01 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Tue, 31 May 2011 19:50:16 +0300 Subject: [PATCH 087/118] Fixed: #1193 Updated mac menu stuff. --- .../src/plugins/core/main_window.cpp | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) 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 86237cb51..f4f5b9419 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 @@ -266,9 +266,6 @@ void MainWindow::createActions() m_saveAllAction = new QAction(tr("&Save A&ll"), this); m_saveAllAction->setShortcut(QKeySequence::SelectAll); -#ifdef Q_WS_MAC - m_saveAllAction->setShortcut(QKeySequence(tr("Ctrl+Shift+S"))); -#endif menuManager()->registerAction(m_saveAllAction, Constants::SAVE_ALL); connect(m_saveAllAction, SIGNAL(triggered()), this, SLOT(saveAll())); m_saveAllAction->setEnabled(false); @@ -321,21 +318,17 @@ void MainWindow::createActions() connect(m_gotoAction, SIGNAL(triggered()), this, SLOT(gotoPos())); m_gotoAction->setEnabled(false); -#ifndef Q_WS_MAC +//#ifndef Q_WS_MAC m_fullscreenAction = new QAction(tr("Fullscreen"), this); m_fullscreenAction->setCheckable(true); m_fullscreenAction->setShortcut(QKeySequence(tr("Ctrl+Shift+F11"))); menuManager()->registerAction(m_fullscreenAction, Constants::SETTINGS); connect(m_fullscreenAction, SIGNAL(triggered(bool)), this, SLOT(setFullScreen(bool))); -#endif +//#endif m_settingsAction = new QAction(tr("&Settings"), this); m_settingsAction->setIcon(QIcon(":/images/preferences.png")); m_settingsAction->setShortcut(QKeySequence::Preferences); -#ifdef Q_WS_MAC - m_settingsAction->setShortcut(QKeySequence("Ctrl+,")); - m_settingsAction->setMenuRole(QAction::PreferencesRole); -#endif m_settingsAction->setStatusTip(tr("Open the settings dialog")); menuManager()->registerAction(m_settingsAction, Constants::SETTINGS); connect(m_settingsAction, SIGNAL(triggered()), this, SLOT(showOptionsDialog())); @@ -359,6 +352,7 @@ void MainWindow::createActions() m_exitAction->setMenuRole(QAction::QuitRole); m_aboutAction->setMenuRole(QAction::AboutRole); m_aboutQtAction->setMenuRole(QAction::AboutQtRole); + m_settingsAction->setMenuRole(QAction::PreferencesRole); m_pluginViewAction->setMenuRole(QAction::ApplicationSpecificRole); #endif } @@ -398,9 +392,9 @@ void MainWindow::createMenus() menuManager()->registerMenu(m_editMenu, Constants::M_EDIT); m_viewMenu = menuBar()->addMenu(tr("&View")); -#ifndef Q_WS_MAC +//#ifndef Q_WS_MAC m_viewMenu->addAction(m_fullscreenAction); -#endif +//#endif menuManager()->registerMenu(m_viewMenu, Constants::M_VIEW); m_toolsMenu = menuBar()->addMenu(tr("&Tools")); From cd5b33a6dd0e798f503dbe7efdb8e7903953a7cc Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Tue, 31 May 2011 21:46:19 +0300 Subject: [PATCH 088/118] Changed: #1193 Updated mac menu stuff. --- .../src/plugins/core/main_window.cpp | 27 ++++++++++--------- .../src/plugins/core/main_window.h | 2 +- 2 files changed, 16 insertions(+), 13 deletions(-) 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 f4f5b9419..ccad041de 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 @@ -57,8 +57,15 @@ MainWindow::MainWindow(ExtensionSystem::IPluginManager *pluginManager, QWidget * m_settings = m_pluginManager->settings(); m_coreImpl = new CoreImpl(this); +#ifdef Q_WS_MAC + m_menuBar = new QMenuBar(0); +#else + m_menuBar = new QMenuBar(this); + setMenuBar(m_menuBar); +#endif + m_menuManager = new MenuManager(this); - m_menuManager->setMenuBar(menuBar()); + m_menuManager->setMenuBar(m_menuBar); m_tabWidget = new QTabWidget(this); m_tabWidget->setTabPosition(QTabWidget::South); @@ -318,13 +325,11 @@ void MainWindow::createActions() connect(m_gotoAction, SIGNAL(triggered()), this, SLOT(gotoPos())); m_gotoAction->setEnabled(false); -//#ifndef Q_WS_MAC m_fullscreenAction = new QAction(tr("Fullscreen"), this); m_fullscreenAction->setCheckable(true); m_fullscreenAction->setShortcut(QKeySequence(tr("Ctrl+Shift+F11"))); menuManager()->registerAction(m_fullscreenAction, Constants::SETTINGS); connect(m_fullscreenAction, SIGNAL(triggered(bool)), this, SLOT(setFullScreen(bool))); -//#endif m_settingsAction = new QAction(tr("&Settings"), this); m_settingsAction->setIcon(QIcon(":/images/preferences.png")); @@ -350,16 +355,16 @@ void MainWindow::createActions() #ifdef Q_WS_MAC m_exitAction->setMenuRole(QAction::QuitRole); + m_settingsAction->setMenuRole(QAction::PreferencesRole); m_aboutAction->setMenuRole(QAction::AboutRole); m_aboutQtAction->setMenuRole(QAction::AboutQtRole); - m_settingsAction->setMenuRole(QAction::PreferencesRole); m_pluginViewAction->setMenuRole(QAction::ApplicationSpecificRole); #endif } void MainWindow::createMenus() { - m_fileMenu = menuBar()->addMenu(tr("&File")); + m_fileMenu = m_menuBar->addMenu(tr("&File")); menuManager()->registerMenu(m_fileMenu, Constants::M_FILE); m_fileMenu->addAction(m_newAction); m_fileMenu->addAction(m_openAction); @@ -376,7 +381,7 @@ void MainWindow::createMenus() m_fileMenu->addSeparator(); m_fileMenu->addAction(m_exitAction); - m_editMenu = menuBar()->addMenu(tr("&Edit")); + m_editMenu = m_menuBar->addMenu(tr("&Edit")); m_editMenu->addAction(m_undoGroup->createUndoAction(this)); m_editMenu->addAction(m_undoGroup->createRedoAction(this)); m_editMenu->addSeparator(); @@ -391,13 +396,11 @@ void MainWindow::createMenus() m_editMenu->addAction(m_gotoAction); menuManager()->registerMenu(m_editMenu, Constants::M_EDIT); - m_viewMenu = menuBar()->addMenu(tr("&View")); -//#ifndef Q_WS_MAC + m_viewMenu = m_menuBar->addMenu(tr("&View")); m_viewMenu->addAction(m_fullscreenAction); -//#endif menuManager()->registerMenu(m_viewMenu, Constants::M_VIEW); - m_toolsMenu = menuBar()->addMenu(tr("&Tools")); + m_toolsMenu = m_menuBar->addMenu(tr("&Tools")); menuManager()->registerMenu(m_toolsMenu, Constants::M_TOOLS); m_sheetMenu = m_toolsMenu->addMenu(tr("&Sheet")); @@ -407,9 +410,9 @@ void MainWindow::createMenus() m_toolsMenu->addAction(m_settingsAction); - menuBar()->addSeparator(); + m_menuBar->addSeparator(); - m_helpMenu = menuBar()->addMenu(tr("&Help")); + m_helpMenu = m_menuBar->addMenu(tr("&Help")); menuManager()->registerMenu(m_helpMenu, Constants::M_HELP); m_helpMenu->addAction(m_aboutAction); m_helpMenu->addAction(m_aboutQtAction); 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 85ebad22e..ce439b885 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 @@ -115,7 +115,7 @@ private: QMenu *m_viewMenu; QMenu *m_toolsMenu; QMenu *m_helpMenu; - + QMenuBar *m_menuBar; QMenu *m_sheetMenu; QAction *m_newAction; From 42f302c0aa80b16c3da95d3bfb7b07423443da39 Mon Sep 17 00:00:00 2001 From: dnk-88 Date: Tue, 31 May 2011 22:06:58 +0300 Subject: [PATCH 089/118] Changed: #1193 Updated menu stuff. --- .../src/plugins/core/main_window.cpp | 2 +- .../src/plugins/example/plugin1.cpp | 1 - .../src/plugins/object_viewer/main_window.cpp | 17 ++--------------- 3 files changed, 3 insertions(+), 17 deletions(-) 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 ccad041de..21334f7ea 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 @@ -328,7 +328,7 @@ void MainWindow::createActions() m_fullscreenAction = new QAction(tr("Fullscreen"), this); m_fullscreenAction->setCheckable(true); m_fullscreenAction->setShortcut(QKeySequence(tr("Ctrl+Shift+F11"))); - menuManager()->registerAction(m_fullscreenAction, Constants::SETTINGS); + menuManager()->registerAction(m_fullscreenAction, Constants::TOGGLE_FULLSCREEN); connect(m_fullscreenAction, SIGNAL(triggered(bool)), this, SLOT(setFullScreen(bool))); m_settingsAction = new QAction(tr("&Settings"), this); 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 index cde1ca199..f218c3230 100644 --- 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 @@ -90,7 +90,6 @@ QStringList MyPlugin::dependencies() const { QStringList list; list.append(Core::Constants::OVQT_CORE_PLUGIN); - list.append("ObjectViewer"); return list; } diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp index dd8a4bb1e..e1962cf5b 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/object_viewer/main_window.cpp @@ -239,12 +239,6 @@ void CMainWindow::updateStatusBar() void CMainWindow::createActions() { - _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())); - _setBackColorAction = _GraphicsViewport->createSetBackgroundColor(this); _setBackColorAction->setText(tr("Set &background color")); _setBackColorAction->setIcon(QIcon(Constants::ICON_BGCOLOR)); @@ -259,7 +253,7 @@ void CMainWindow::createActions() connect(_reloadTexturesAction, SIGNAL(triggered()), this, SLOT(reloadTextures())); _saveScreenshotAction = _GraphicsViewport->createSaveScreenshotAction(this); - _saveScreenshotAction->setText(tr("Save &Screenshot")); + _saveScreenshotAction->setText(tr("Save Screenshot")); _saveScreenshotAction->setStatusTip(tr("Make a screenshot of the current viewport and save")); } @@ -267,14 +261,7 @@ void CMainWindow::createMenus() { Core::IMenuManager *menuManager = Core::ICore::instance()->menuManager(); - // register actions for file menu - menuManager->registerAction(_openAction, "ObjectViewer.File.Open"); - - // add actions in file menu - QMenu *fileMenu = menuManager->menu(Core::Constants::M_FILE); - QAction *exitAction = menuManager->action(Core::Constants::EXIT); - //fileMenu->insertAction(exitAction, _openAction); - //fileMenu->insertSeparator(exitAction); + _openAction = menuManager->action(Core::Constants::OPEN); // register actions for view menu menuManager->registerAction(_setBackColorAction, "ObjectViewer.View.SetBackgroundColor"); From 37cfa5a9f271853b604043f4f1ff68288bbe3cd9 Mon Sep 17 00:00:00 2001 From: kervala Date: Tue, 31 May 2011 21:51:26 +0200 Subject: [PATCH 090/118] Changed: Merge changes from next patch --- code/ryzom/client/src/character_cl.cpp | 8 + .../src/interface_v3/action_handler_game.cpp | 4 +- .../src/interface_v3/action_handler_help.cpp | 3 +- .../client/src/interface_v3/dbctrl_sheet.cpp | 6 +- .../client/src/interface_v3/group_html.cpp | 23 +- .../src/interface_v3/group_html_webig.cpp | 2 +- .../interface_v3/item_consumable_effect.cpp | 14 +- .../src/interface_v3/sphrase_manager.cpp | 8 +- .../data_shard/client_commands_privileges.txt | 33 +- .../server/src/ai_service/ai_instance.cpp | 65 +- code/ryzom/server/src/ai_service/nf_grp.cpp | 37 +- .../server/src/ai_service/nf_grp_npc.cpp | 207 +++- .../src/entities_game_service/admin.cpp | 966 +++++++++++++++++- .../building_manager/room_instance.cpp | 4 +- .../entities_game_service/client_messages.cpp | 6 +- .../creature_manager/creature.cpp | 6 +- .../creature_manager/creature.h | 2 + .../egs_sheets/egs_static_brick.cpp | 30 + .../egs_sheets/egs_static_brick.cpp.h | 148 ++- .../mission_manager/mission_event.cpp | 23 +- .../mission_manager/mission_event.h | 13 + .../mission_manager/mission_step_kill.cpp | 206 +++- .../modules/character_control.cpp | 2 +- .../phrase_manager/aura_effect.cpp | 22 +- .../phrase_manager/aura_effect.h | 4 + .../phrase_manager/combat_phrase.cpp | 5 + .../phrase_manager/faber_action.cpp | 15 +- .../phrase_manager/magic_phrase.cpp | 20 +- .../phrase_manager/s_effect.h | 19 +- .../phrase_manager/special_power.cpp | 7 +- .../phrase_manager/special_power.h | 14 +- .../special_power_basic_aura.cpp | 9 +- .../phrase_manager/special_power_phrase.cpp | 70 +- .../phrase_manager/timed_actions.cpp | 11 + .../player_manager/character.cpp | 168 ++- .../player_manager/character.h | 18 +- .../character_inventory_manipulation.cpp | 102 +- .../player_manager/player_manager.cpp | 2 +- .../progression/progression_pve.cpp | 35 +- .../progression/progression_pve.h | 5 +- .../progression/progression_pvp.cpp | 3 + .../pvp_manager/pvp_manager_2.cpp | 104 +- .../pvp_manager/pvp_manager_2.h | 8 + 43 files changed, 2325 insertions(+), 132 deletions(-) diff --git a/code/ryzom/client/src/character_cl.cpp b/code/ryzom/client/src/character_cl.cpp index 87332f42d..37c1d0a24 100644 --- a/code/ryzom/client/src/character_cl.cpp +++ b/code/ryzom/client/src/character_cl.cpp @@ -9006,6 +9006,14 @@ void CCharacterCL::setAuraFX(uint index, const CAnimationFX *sheet) if (sheet == NULL) { + std::list::iterator itAttachedFxToStart = _AttachedFXListToStart.begin(); + while(itAttachedFxToStart != _AttachedFXListToStart.end()) + { + if ((*itAttachedFxToStart).MaxNumAnimCount == index) + itAttachedFxToStart = _AttachedFXListToStart.erase(itAttachedFxToStart); + else + ++itAttachedFxToStart; + } // if there's already an aura attached, and if it is not already shutting down if (_AuraFX[index] && _AuraFX[index]->TimeOutDate == 0.f) { diff --git a/code/ryzom/client/src/interface_v3/action_handler_game.cpp b/code/ryzom/client/src/interface_v3/action_handler_game.cpp index 16e4c427c..f358fa3fd 100644 --- a/code/ryzom/client/src/interface_v3/action_handler_game.cpp +++ b/code/ryzom/client/src/interface_v3/action_handler_game.cpp @@ -2497,7 +2497,9 @@ class CAHAddShape : public IActionHandler { shape = sShape.substr(0, index); sShape = sShape.substr(index+1); - } else { + } + else + { shape = sShape; have_shapes = false; } diff --git a/code/ryzom/client/src/interface_v3/action_handler_help.cpp b/code/ryzom/client/src/interface_v3/action_handler_help.cpp index f6271f355..4c92fe6e0 100644 --- a/code/ryzom/client/src/interface_v3/action_handler_help.cpp +++ b/code/ryzom/client/src/interface_v3/action_handler_help.cpp @@ -2052,7 +2052,8 @@ void getItemText (CDBCtrlSheet *item, ucstring &itemText, const CItemSheet*pIS) case ITEMFAMILY::CONSUMABLE : { strFindReplace(itemText, "%consumption_time", toString(pIS->Consumable.ConsumptionTime)); - strFindReplace(itemText, "%overdose_timer", toString(pIS->Consumable.OverdoseTimer/60)); + strFindReplace(itemText, "%overdose_timer_min", toString(pIS->Consumable.OverdoseTimer/60)); + strFindReplace(itemText, "%overdose_timer_sec", toString(pIS->Consumable.OverdoseTimer % 60)); // Get Item Consumable infos CItemConsumableEffectHelper::getInstance()->getItemConsumableEffectText(pIS, itemText, item->getQuality()); } diff --git a/code/ryzom/client/src/interface_v3/dbctrl_sheet.cpp b/code/ryzom/client/src/interface_v3/dbctrl_sheet.cpp index e328816a9..42f438202 100644 --- a/code/ryzom/client/src/interface_v3/dbctrl_sheet.cpp +++ b/code/ryzom/client/src/interface_v3/dbctrl_sheet.cpp @@ -2095,13 +2095,13 @@ void CDBCtrlSheet::drawSheet (sint32 x, sint32 y, bool draging, bool showSelecti rVR.draw11RotFlipBitmap (_RenderLayer, x, y, 0, false, _DispOverBmpId, armourCol); // decal layer because must drawn after Items/Brick in DXTC // NB: use OverColor, not Over2Color here. Because of hack in updateArmourColor() - rVR.draw11RotFlipBitmap (_RenderLayer+2, x, y, 0, false, _DispOver2BmpId, fastMulRGB(curSheetColor, _IconOverColor)); + rVR.draw11RotFlipBitmap (_RenderLayer+1, x, y, 0, false, _DispOver2BmpId, fastMulRGB(curSheetColor, _IconOverColor)); } else { // decal layer because must drawn after Items/Brick in DXTC - rVR.draw11RotFlipBitmap (_RenderLayer+2, x, y, 0, false, _DispOverBmpId, fastMulRGB(curSheetColor, _IconOverColor)); - rVR.draw11RotFlipBitmap (_RenderLayer+2, x, y, 0, false, _DispOver2BmpId, fastMulRGB(curSheetColor, _IconOver2Color)); + rVR.draw11RotFlipBitmap (_RenderLayer+1, x, y, 0, false, _DispOverBmpId, fastMulRGB(curSheetColor, _IconOverColor)); + rVR.draw11RotFlipBitmap (_RenderLayer+1, x, y, 0, false, _DispOver2BmpId, fastMulRGB(curSheetColor, _IconOver2Color)); } // Draw Quality. -1 for lookandfeel. Draw it with global color diff --git a/code/ryzom/client/src/interface_v3/group_html.cpp b/code/ryzom/client/src/interface_v3/group_html.cpp index dda2250a8..b0e94ca6c 100644 --- a/code/ryzom/client/src/interface_v3/group_html.cpp +++ b/code/ryzom/client/src/interface_v3/group_html.cpp @@ -871,6 +871,13 @@ void CGroupHTML::beginElement (uint element_number, const BOOL *present, const c { _TextColor.push_back(_TextColor.empty() ? CRGBA::White : _TextColor.back()); } + + if (present[HTML_FONT_SIZE] && value[HTML_FONT_SIZE]) + { + uint fontsize; + fromString(value[HTML_FONT_SIZE], fontsize); + _FontSize.push_back(fontsize); + } } break; case HTML_BR: @@ -1407,6 +1414,7 @@ void CGroupHTML::endElement (uint element_number) { case HTML_FONT: popIfNotEmpty (_TextColor); + popIfNotEmpty (_FontSize); break; case HTML_A: popIfNotEmpty (_TextColor); @@ -2251,8 +2259,9 @@ void CGroupHTML::addImage(const char *img, bool globalColor) else*/ getParagraph()->addChild(newImage); paragraphChange (); - } else { - + } + else + { // // 2/ if it doesn't work, try to load the image in cache // @@ -3394,7 +3403,8 @@ int CGroupHTML::luaInsertText(CLuaState &ls) ucstring text; text.fromUtf8(ls.toString(2)); - if (!_Forms.empty()) { + if (!_Forms.empty()) + { for (uint i=0; i<_Forms.back().Entries.size(); i++) { if (_Forms.back().Entries[i].TextArea && _Forms.back().Entries[i].Name == name) @@ -3438,11 +3448,14 @@ int CGroupHTML::luaAddImage(CLuaState &ls) paragraphChange(); } string url = getLink(); - if (!url.empty()) { + if (!url.empty()) + { string params = "name=" + getId() + "|url=" + getLink (); addButton(CCtrlButton::PushButton, ls.toString(1), ls.toString(1), ls.toString(1), "", ls.toBoolean(2), "browse", params.c_str(), ""); - } else { + } + else + { addImage(ls.toString(1), ls.toBoolean(2)); } diff --git a/code/ryzom/client/src/interface_v3/group_html_webig.cpp b/code/ryzom/client/src/interface_v3/group_html_webig.cpp index ac866830b..7e1781289 100644 --- a/code/ryzom/client/src/interface_v3/group_html_webig.cpp +++ b/code/ryzom/client/src/interface_v3/group_html_webig.cpp @@ -277,7 +277,7 @@ string CGroupHTMLWebIG::home () void CGroupHTMLWebIG::handle () { - Home = "http://atys.ryzom.com/start/index.php"; +// Home = "http://atys.ryzom.com/start/index.php"; CGroupHTML::handle (); } diff --git a/code/ryzom/client/src/interface_v3/item_consumable_effect.cpp b/code/ryzom/client/src/interface_v3/item_consumable_effect.cpp index 35afeb618..3c1e958f8 100644 --- a/code/ryzom/client/src/interface_v3/item_consumable_effect.cpp +++ b/code/ryzom/client/src/interface_v3/item_consumable_effect.cpp @@ -133,8 +133,8 @@ void CItemConsumableEffectHelper::getItemConsumableEffectText(const CItemSheet * strFindReplace(result, "%minutes", toString(duration/60)); strFindReplace(result, "%secondes", toString(duration%60)); strFindReplace(result, "%radius", toString(radius)); - strFindReplace(result, "%targetDisableTime", toString(targetDisableTime)); - strFindReplace(result, "%userDisableTime", toString(userDisableTime)); + strFindReplace(result, "%targetDisableTime", "0"); + strFindReplace(result, "%userDisableTime", "0"); effects += result; effects += "\n"; @@ -183,12 +183,12 @@ void CItemConsumableEffectHelper::getItemConsumableEffectText(const CItemSheet * fromString(params[4].c_str(), userDisableTime); ucstring result = CI18N::get("uiItemConsumableEffectStaminaAura"); - strFindReplace(result, "%modifier", toString(regenMod)); + strFindReplace(result, "%modifier", toString(bonus)); strFindReplace(result, "%minutes", toString(duration/60)); strFindReplace(result, "%secondes", toString(duration%60)); strFindReplace(result, "%radius", toString(radius)); - strFindReplace(result, "%targetDisableTime", toString(targetDisableTime)); - strFindReplace(result, "%userDisableTime", toString(userDisableTime)); + strFindReplace(result, "%targetDisableTime", "0"); + strFindReplace(result, "%userDisableTime", "0"); effects += result; effects += "\n"; @@ -240,8 +240,8 @@ void CItemConsumableEffectHelper::getItemConsumableEffectText(const CItemSheet * strFindReplace(result, "%minutes", toString(duration/60)); strFindReplace(result, "%secondes", toString(duration%60)); strFindReplace(result, "%radius", toString(radius)); - strFindReplace(result, "%targetDisableTime", toString(targetDisableTime)); - strFindReplace(result, "%userDisableTime", toString(userDisableTime)); + strFindReplace(result, "%targetDisableTime", "0"); + strFindReplace(result, "%userDisableTime", "0"); effects += result; effects += "\n"; diff --git a/code/ryzom/client/src/interface_v3/sphrase_manager.cpp b/code/ryzom/client/src/interface_v3/sphrase_manager.cpp index 6820a10e8..dc12a391f 100644 --- a/code/ryzom/client/src/interface_v3/sphrase_manager.cpp +++ b/code/ryzom/client/src/interface_v3/sphrase_manager.cpp @@ -503,7 +503,6 @@ void CSPhraseManager::updateMemoryDBAll() for(uint i=0;isetValue32(0); - _MemoryAltDbLeaves[i]->setValue32(0); } } else @@ -515,7 +514,14 @@ void CSPhraseManager::updateMemoryDBAll() _MemoryDbLeaves[i]->setValue32(0); else _MemoryDbLeaves[i]->setValue32(slot.Id); + } + } + if(_SelectedMemoryDB != -1 && (sint32)_Memories.size() > 0) + { + // Always update alt gestionsets + for(uint i=0;isetValue32(0); diff --git a/code/ryzom/server/data_shard/client_commands_privileges.txt b/code/ryzom/server/data_shard/client_commands_privileges.txt index 0ab0e8e9f..c61537dfa 100644 --- a/code/ryzom/server/data_shard/client_commands_privileges.txt +++ b/code/ryzom/server/data_shard/client_commands_privileges.txt @@ -15,10 +15,10 @@ addSkillPoints :DEV:SGM:GM:EM: // Add skill points of given type (Fight=0, M addXPToSkill :DEV:SGM:GM:EM: // Gain experience in the given skill: [] broadcast :DEV:SGM:GM:EM:VG: // Broadcast a message: [repeat= or during=