merge from default

This commit is contained in:
sfb 2012-03-12 08:12:23 -05:00
commit f100d7a339
218 changed files with 10707 additions and 3909 deletions

View file

@ -144,6 +144,8 @@ external
external_stlport external_stlport
3rdParty 3rdParty
.svn .svn
thumbs.db
Thumbs.db
# build # build
code/nel/build/* code/nel/build/*

View file

@ -14,17 +14,22 @@ FIND_PATH(DXSDK_DIR
"Include/dxsdkver.h" "Include/dxsdkver.h"
PATHS PATHS
"$ENV{DXSDK_DIR}" "$ENV{DXSDK_DIR}"
"C:/Program Files (x86)/Microsoft DirectX SDK (June 2010)"
"C:/Program Files/Microsoft DirectX SDK (June 2010)"
"C:/Program Files (x86)/Microsoft DirectX SDK (February 2010)"
"C:/Program Files/Microsoft DirectX SDK (February 2010)"
"C:/Program Files (x86)/Microsoft DirectX SDK (November 2007)"
"C:/Program Files/Microsoft DirectX SDK (November 2007)"
"C:/Program Files (x86)/Microsoft DirectX SDK"
"C:/Program Files/Microsoft DirectX SDK"
) )
MACRO(FIND_DXSDK_LIBRARY MYLIBRARY MYLIBRARYNAME) MACRO(FIND_DXSDK_LIBRARY MYLIBRARY MYLIBRARYNAME)
FIND_LIBRARY(${MYLIBRARY} FIND_LIBRARY(${MYLIBRARY}
NAMES ${MYLIBRARYNAME} NAMES ${MYLIBRARYNAME}
PATHS PATHS
"${DXSDK_LIBRARY_DIR}" "${DXSDK_LIBRARY_DIR}"
"$ENV{DXSDK_DIR}" )
"$ENV{DXSDK_DIR}/Lib"
"$ENV{DXSDK_DIR}/Lib/x86"
)
ENDMACRO(FIND_DXSDK_LIBRARY MYLIBRARY MYLIBRARYNAME) ENDMACRO(FIND_DXSDK_LIBRARY MYLIBRARY MYLIBRARYNAME)
IF(DXSDK_DIR) IF(DXSDK_DIR)

View file

@ -37,7 +37,9 @@ ENDMACRO(NL_TARGET_DRIVER)
# Argument: # Argument:
### ###
MACRO(NL_DEFAULT_PROPS name label) MACRO(NL_DEFAULT_PROPS name label)
SET_TARGET_PROPERTIES(${name} PROPERTIES PROJECT_LABEL ${label}) IF(NOT MSVC10)
SET_TARGET_PROPERTIES(${name} PROPERTIES PROJECT_LABEL ${label})
ENDIF(NOT MSVC10)
GET_TARGET_PROPERTY(type ${name} TYPE) GET_TARGET_PROPERTY(type ${name} TYPE)
IF(${type} STREQUAL SHARED_LIBRARY) IF(${type} STREQUAL SHARED_LIBRARY)
# Set versions only if target is a shared library # Set versions only if target is a shared library
@ -302,27 +304,66 @@ MACRO(NL_SETUP_BUILD)
ENDIF(CMAKE_BUILD_TYPE MATCHES "Release") ENDIF(CMAKE_BUILD_TYPE MATCHES "Release")
ENDIF(CMAKE_BUILD_TYPE MATCHES "Debug") ENDIF(CMAKE_BUILD_TYPE MATCHES "Debug")
SET(HOST_CPU ${CMAKE_SYSTEM_PROCESSOR})
# Determine target CPU # Determine target CPU
# IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86") IF(NOT TARGET_CPU)
IF(NOT CMAKE_SIZEOF_VOID_P) SET(TARGET_CPU $ENV{DEB_HOST_GNU_CPU})
INCLUDE (CheckTypeSize) ENDIF(NOT TARGET_CPU)
CHECK_TYPE_SIZE("void*" CMAKE_SIZEOF_VOID_P)
ENDIF(NOT CMAKE_SIZEOF_VOID_P)
# Using 32 or 64 bits libraries # If not specified, use the same CPU as host
IF(NOT TARGET_CPU)
SET(TARGET_CPU ${CMAKE_SYSTEM_PROCESSOR})
ENDIF(NOT TARGET_CPU)
IF(TARGET_CPU MATCHES "amd64")
SET(TARGET_CPU "x86_64")
ELSEIF(TARGET_CPU MATCHES "i.86")
SET(TARGET_CPU "x86")
ENDIF(TARGET_CPU MATCHES "amd64")
# DEB_HOST_ARCH_ENDIAN is 'little' or 'big'
# DEB_HOST_ARCH_BITS is '32' or '64'
# If target and host CPU are the same
IF("${HOST_CPU}" STREQUAL "${TARGET_CPU}")
# x86-compatible CPU
IF(HOST_CPU MATCHES "x86")
IF(NOT CMAKE_SIZEOF_VOID_P)
INCLUDE (CheckTypeSize)
CHECK_TYPE_SIZE("void*" CMAKE_SIZEOF_VOID_P)
ENDIF(NOT CMAKE_SIZEOF_VOID_P)
# Using 32 or 64 bits libraries
IF(CMAKE_SIZEOF_VOID_P EQUAL 8)
SET(TARGET_CPU "x86_64")
ELSE(CMAKE_SIZEOF_VOID_P EQUAL 8)
SET(TARGET_CPU "x86")
ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 8)
ENDIF(HOST_CPU MATCHES "x86")
# TODO: add checks for ARM and PPC
ELSE("${HOST_CPU}" STREQUAL "${TARGET_CPU}")
MESSAGE(STATUS "Compiling on ${HOST_CPU} for ${TARGET_CPU}")
ENDIF("${HOST_CPU}" STREQUAL "${TARGET_CPU}")
IF(TARGET_CPU STREQUAL "x86_64")
SET(TARGET_X64 1)
SET(PLATFORM_CFLAGS "-DHAVE_X86_64")
ELSEIF(TARGET_CPU STREQUAL "x86")
SET(TARGET_X86 1) SET(TARGET_X86 1)
IF(CMAKE_SIZEOF_VOID_P EQUAL 8) SET(PLATFORM_CFLAGS "-DHAVE_X86")
SET(ARCH "x86_64") ENDIF(TARGET_CPU STREQUAL "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) # Fix library paths suffixes for Debian MultiArch
IF(NOT CMAKE_LIBRARY_ARCHITECTURE)
SET(CMAKE_LIBRARY_ARCHITECTURE $ENV{DEB_HOST_MULTIARCH})
ENDIF(NOT CMAKE_LIBRARY_ARCHITECTURE)
IF(CMAKE_LIBRARY_ARCHITECTURE)
SET(CMAKE_LIBRARY_PATH "/lib/${CMAKE_LIBRARY_ARCHITECTURE};/usr/lib/${CMAKE_LIBRARY_ARCHITECTURE};${CMAKE_LIBRARY_PATH}")
ENDIF(CMAKE_LIBRARY_ARCHITECTURE)
IF(MSVC)
IF(MSVC10) IF(MSVC10)
# /Ox is working with VC++ 2010, but custom optimizations don't exist # /Ox is working with VC++ 2010, but custom optimizations don't exist
SET(SPEED_OPTIMIZATIONS "/Ox /GF /GS-") SET(SPEED_OPTIMIZATIONS "/Ox /GF /GS-")
@ -364,8 +405,17 @@ MACRO(NL_SETUP_BUILD)
SET(NL_RELEASE_CFLAGS "/MD /D NDEBUG ${SPEED_OPTIMIZATIONS}") SET(NL_RELEASE_CFLAGS "/MD /D NDEBUG ${SPEED_OPTIMIZATIONS}")
SET(NL_DEBUG_LINKFLAGS "/NODEFAULTLIB:msvcrt /INCREMENTAL:YES") SET(NL_DEBUG_LINKFLAGS "/NODEFAULTLIB:msvcrt /INCREMENTAL:YES")
SET(NL_RELEASE_LINKFLAGS "/OPT:REF /OPT:ICF /INCREMENTAL:NO") SET(NL_RELEASE_LINKFLAGS "/OPT:REF /OPT:ICF /INCREMENTAL:NO")
ELSE(WIN32) ELSE(MSVC)
SET(PLATFORM_CFLAGS "-g -pipe -ftemplate-depth-48 -D_REENTRANT -Wall -ansi -W -Wpointer-arith -Wsign-compare -Wno-deprecated-declarations -Wno-multichar -Wno-unused -fno-strict-aliasing") IF(HOST_CPU STREQUAL "x86_64" AND TARGET_CPU STREQUAL "x86")
SET(PLATFORM_CFLAGS "${PLATFORM_CFLAGS} -m32 -march=i686")
ENDIF(HOST_CPU STREQUAL "x86_64" AND TARGET_CPU STREQUAL "x86")
IF(HOST_CPU STREQUAL "x86" AND TARGET_CPU STREQUAL "x86_64")
SET(PLATFORM_CFLAGS "${PLATFORM_CFLAGS} -m64")
ENDIF(HOST_CPU STREQUAL "x86" AND TARGET_CPU STREQUAL "x86_64")
SET(PLATFORM_CFLAGS "${PLATFORM_CFLAGS} -g -D_REENTRANT -pipe -ftemplate-depth-48 -Wall -ansi -W -Wpointer-arith -Wsign-compare -Wno-deprecated-declarations -Wno-multichar -Wno-unused -fno-strict-aliasing")
IF(WITH_COVERAGE) IF(WITH_COVERAGE)
SET(PLATFORM_CFLAGS "-fprofile-arcs -ftest-coverage ${PLATFORM_CFLAGS}") SET(PLATFORM_CFLAGS "-fprofile-arcs -ftest-coverage ${PLATFORM_CFLAGS}")
ENDIF(WITH_COVERAGE) ENDIF(WITH_COVERAGE)
@ -382,12 +432,12 @@ MACRO(NL_SETUP_BUILD)
SET(PLATFORM_CXXFLAGS ${PLATFORM_CFLAGS}) SET(PLATFORM_CXXFLAGS ${PLATFORM_CFLAGS})
IF(NOT APPLE) IF(NOT APPLE)
SET(PLATFORM_LINKFLAGS "-Wl,--no-undefined -Wl,--as-needed") SET(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -Wl,--no-undefined -Wl,--as-needed")
ENDIF(NOT APPLE) ENDIF(NOT APPLE)
SET(NL_DEBUG_CFLAGS "-DNL_DEBUG -D_DEBUG") SET(NL_DEBUG_CFLAGS "-DNL_DEBUG -D_DEBUG")
SET(NL_RELEASE_CFLAGS "-DNL_RELEASE -DNDEBUG -O6") SET(NL_RELEASE_CFLAGS "-DNL_RELEASE -DNDEBUG -O6")
ENDIF(WIN32) ENDIF(MSVC)
ENDMACRO(NL_SETUP_BUILD) ENDMACRO(NL_SETUP_BUILD)
MACRO(NL_SETUP_BUILD_FLAGS) MACRO(NL_SETUP_BUILD_FLAGS)
@ -451,7 +501,11 @@ MACRO(NL_SETUP_PREFIX_PATHS)
IF(WIN32) IF(WIN32)
SET(NL_LIB_PREFIX "../lib" CACHE PATH "Installation path for libraries.") SET(NL_LIB_PREFIX "../lib" CACHE PATH "Installation path for libraries.")
ELSE(WIN32) ELSE(WIN32)
SET(NL_LIB_PREFIX "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation path for libraries.") IF(CMAKE_LIBRARY_ARCHITECTURE)
SET(NL_LIB_PREFIX "${CMAKE_INSTALL_PREFIX}/lib/${CMAKE_LIBRARY_ARCHITECTURE}" CACHE PATH "Installation path for libraries.")
ELSE(CMAKE_LIBRARY_ARCHITECTURE)
SET(NL_LIB_PREFIX "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation path for libraries.")
ENDIF(CMAKE_LIBRARY_ARCHITECTURE)
ENDIF(WIN32) ENDIF(WIN32)
ENDIF(NOT NL_LIB_PREFIX) ENDIF(NOT NL_LIB_PREFIX)
@ -460,7 +514,11 @@ MACRO(NL_SETUP_PREFIX_PATHS)
IF(WIN32) IF(WIN32)
SET(NL_DRIVER_PREFIX "../lib" CACHE PATH "Installation path for drivers.") SET(NL_DRIVER_PREFIX "../lib" CACHE PATH "Installation path for drivers.")
ELSE(WIN32) ELSE(WIN32)
SET(NL_DRIVER_PREFIX "${CMAKE_INSTALL_PREFIX}/lib/nel" CACHE PATH "Installation path for drivers.") IF(CMAKE_LIBRARY_ARCHITECTURE)
SET(NL_DRIVER_PREFIX "${CMAKE_INSTALL_PREFIX}/lib/${CMAKE_LIBRARY_ARCHITECTURE}/nel" CACHE PATH "Installation path for drivers.")
ELSE(CMAKE_LIBRARY_ARCHITECTURE)
SET(NL_DRIVER_PREFIX "${CMAKE_INSTALL_PREFIX}/lib/nel" CACHE PATH "Installation path for drivers.")
ENDIF(CMAKE_LIBRARY_ARCHITECTURE)
ENDIF(WIN32) ENDIF(WIN32)
ENDIF(NOT NL_DRIVER_PREFIX) ENDIF(NOT NL_DRIVER_PREFIX)

View file

@ -342,6 +342,8 @@ std::string secondsToHumanReadable (uint32 time);
/// Get a bytes or time in string format and convert it in seconds or bytes /// Get a bytes or time in string format and convert it in seconds or bytes
uint32 fromHumanReadable (const std::string &str); uint32 fromHumanReadable (const std::string &str);
/// Add digit grouping seperator to if value >= 10 000. Assumes input is numerical string.
std::string formatThousands(const std::string& s);
/// This function executes a program in the background and returns instantly (used for example to launch services in AES). /// This function executes a program in the background and returns instantly (used for example to launch services in AES).
/// The program will be launched in the current directory /// The program will be launched in the current directory

View file

@ -146,6 +146,8 @@ public:
TAdditionalInfoCb EntityInfoCallback; TAdditionalInfoCb EntityInfoCallback;
static void removeShardFromName(ucstring& name);
private: private:
// get all eid for a user using the user name or the user id // get all eid for a user using the user name or the user id
void getByUser (uint32 uid, std::vector<NLMISC::CEntityId> &res); void getByUser (uint32 uid, std::vector<NLMISC::CEntityId> &res);

View file

@ -49,7 +49,7 @@ public:
* \param server * \param server
*/ */
virtual void submitEvents(CEventServer & server, bool allWindows) = 0; virtual void submitEvents(CEventServer & server, bool allWindows) = 0;
/** /**
* Instruct the event emitter to send CGDMouseMove instead of CEventMouseMove. * Instruct the event emitter to send CGDMouseMove instead of CEventMouseMove.
* *

View file

@ -75,7 +75,7 @@ public:
enum TProp { enum TProp {
PropUInt8, PropUInt16, PropUInt32, PropUInt64, PropUInt8, PropUInt16, PropUInt32, PropUInt64,
PropSInt8, PropSInt16, PropSInt32, PropSInt64, PropSInt8, PropSInt16, PropSInt32, PropSInt64,
PropBool, PropFloat, PropDouble, PropString, PropDataSetRow, PropSheetId, PropUKN }; PropBool, PropFloat, PropDouble, PropString, PropDataSetRow, PropSheetId, PropUCString, PropUKN };
// PropBool, PropFloat, PropDouble, PropString, PropDataSetRow, PropEntityId, PropSheetId, PropUKN }; // PropBool, PropFloat, PropDouble, PropString, PropDataSetRow, PropEntityId, PropSheetId, PropUKN };
@ -160,6 +160,7 @@ public:
case PropString: nlassert(sizeof(T) == sizeof (std::string)); break; case PropString: nlassert(sizeof(T) == sizeof (std::string)); break;
// case PropEntityId: nlassert(sizeof(T) == sizeof (NLMISC::CEntityId)); break; // case PropEntityId: nlassert(sizeof(T) == sizeof (NLMISC::CEntityId)); break;
case PropSheetId: nlassert(sizeof(T) == sizeof (NLMISC::CSheetId)); break; case PropSheetId: nlassert(sizeof(T) == sizeof (NLMISC::CSheetId)); break;
case PropUCString: nlassert(sizeof(T) == sizeof (ucstring)); break;
default: nlerror ("property %s have unknown type %d", name.c_str(), type); default: nlerror ("property %s have unknown type %d", name.c_str(), type);
} }

View file

@ -1228,7 +1228,7 @@ bool CDriverD3D::init (uint windowIcon, emptyProc exitFunc)
ExitFunc = exitFunc; ExitFunc = exitFunc;
createCursors(); createCursors();
// Register a window class // Register a window class
WNDCLASSW wc; WNDCLASSW wc;

View file

@ -138,7 +138,7 @@ void CDriverGL::setLightInternal(uint8 num, const CLight& light)
} }
else else
{ {
// Deactivate spot properties // Disable spot properties
#ifdef USE_OPENGLES #ifdef USE_OPENGLES
glLightf (lightNum, GL_SPOT_CUTOFF, 180.f); glLightf (lightNum, GL_SPOT_CUTOFF, 180.f);
glLightf (lightNum, GL_SPOT_EXPONENT, 0.f); glLightf (lightNum, GL_SPOT_EXPONENT, 0.f);

View file

@ -978,7 +978,7 @@ void CDriverGL::setupGlArraysStd(CVertexBufferInfo &vb)
// Check type // Check type
nlassert (vb.Type[CVertexBuffer::Normal]==CVertexBuffer::Float3); nlassert (vb.Type[CVertexBuffer::Normal]==CVertexBuffer::Float3);
_DriverGLStates.enableNormalArray(true); _DriverGLStates.enableNormalArray(true);
nglArrayObjectATI(GL_NORMAL_ARRAY, 3, GL_FLOAT, vb.VertexSize, vb.VertexObjectId, (ptrdiff_t) vb.ValuePtr[CVertexBuffer::Normal]); nglArrayObjectATI(GL_NORMAL_ARRAY, 3, GL_FLOAT, vb.VertexSize, vb.VertexObjectId, (ptrdiff_t) vb.ValuePtr[CVertexBuffer::Normal]);
} }
else else
{ {

View file

@ -149,14 +149,28 @@ static NLMISC::TKey virtualKeycodeToNelKey(unsigned short keycode)
bool CCocoaEventEmitter::pasteTextFromClipboard(ucstring &text) bool CCocoaEventEmitter::pasteTextFromClipboard(ucstring &text)
{ {
#warning "OpenGL Driver: Missing Mac Implementation for pasteTextFromClipboard" NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
NSArray *classArray = [NSArray arrayWithObject:[NSString class]];
NSDictionary *options = [NSDictionary dictionary];
BOOL ok = [pasteboard canReadObjectForClasses:classArray options:options];
if (ok)
{
NSArray *objectsToPaste = [pasteboard readObjectsForClasses:classArray options:options];
NSString *nstext = [objectsToPaste objectAtIndex:0];
text.fromUtf8([nstext UTF8String]);
return true;
}
return false; return false;
} }
bool CCocoaEventEmitter::copyTextToClipboard(const ucstring &text) bool CCocoaEventEmitter::copyTextToClipboard(const ucstring &text)
{ {
#warning "OpenGL Driver: Missing Mac Implementation for copyTextToClipboard" NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
return false; [pasteboard clearContents];
NSArray *copiedObjects = [NSArray arrayWithObject:[NSString stringWithUTF8String:text.toUtf8().c_str()]];
[pasteboard writeObjects:copiedObjects];
return true;
} }
/// convert modifier key state to nel internal modifier key state /// convert modifier key state to nel internal modifier key state

View file

@ -4851,8 +4851,10 @@ typedef ptrdiff_t GLsizeiptrARB;
#ifndef GL_ARB_shader_objects #ifndef GL_ARB_shader_objects
/* GL types for program/shader text and shader object handles */ /* GL types for program/shader text and shader object handles */
typedef char GLcharARB; typedef char GLcharARB;
#if !defined(MAC_OS_X_VERSION_10_7)
typedef unsigned int GLhandleARB; typedef unsigned int GLhandleARB;
#endif #endif
#endif
/* GL type for "half" precision (s10e5) float data in host memory */ /* GL type for "half" precision (s10e5) float data in host memory */
#ifndef GL_ARB_half_float_pixel #ifndef GL_ARB_half_float_pixel

View file

@ -58,7 +58,7 @@ bool CNELU::initDriver (uint w, uint h, uint bpp, bool windowed, nlWindow syst
CNELU::Driver = NULL; CNELU::Driver = NULL;
// Init driver. // Init driver.
#if defined(NL_OS_WINDOWS) #ifdef NL_OS_WINDOWS
if (direct3d) if (direct3d)
{ {
CNELU::Driver= CDRU::createD3DDriver(); CNELU::Driver= CDRU::createD3DDriver();
@ -75,6 +75,7 @@ bool CNELU::initDriver (uint w, uint h, uint bpp, bool windowed, nlWindow syst
nlwarning ("CNELU::initDriver: no driver found"); nlwarning ("CNELU::initDriver: no driver found");
return false; return false;
} }
if (!CNELU::Driver->init()) if (!CNELU::Driver->init())
{ {
nlwarning ("CNELU::initDriver: init() failed"); nlwarning ("CNELU::initDriver: init() failed");

View file

@ -1018,8 +1018,8 @@ void CPatchDLMContext::computeTextureFar()
// compute src pixel // compute src pixel
const CRGBA *srcPixel= pTile->getPixels(CTileFarBank::diffuse, CTileFarBank::order1); const CRGBA *srcPixel= pTile->getPixels(CTileFarBank::diffuse, CTileFarBank::order1);
// compute src info, for this tile rot and 256x256 context. // compute src info, for this tile rot and 256x256 context.
sint srcDeltaX; sint srcDeltaX = 0;
sint srcDeltaY; sint srcDeltaY = 0;
srcPixel= computeTileFarSrcDeltas(nRot, is256x256, uvOff, srcPixel, srcDeltaX, srcDeltaY); srcPixel= computeTileFarSrcDeltas(nRot, is256x256, uvOff, srcPixel, srcDeltaX, srcDeltaY);
// compute dst coordinate. start writing at pixel (1,1) // compute dst coordinate. start writing at pixel (1,1)

View file

@ -2118,7 +2118,7 @@ bool CPrimAlias::read (xmlNodePtr xmlNode, const char *filename, uint version, C
xmlNodePtr ptNode = CIXml::getFirstChildNode (xmlNode, "ALIAS"); xmlNodePtr ptNode = CIXml::getFirstChildNode (xmlNode, "ALIAS");
if (ptNode) if (ptNode)
{ {
int val; sint val = 0;
if (ReadInt ("VALUE", val, filename, ptNode)) if (ReadInt ("VALUE", val, filename, ptNode))
{ {
_Alias = uint32(val); _Alias = uint32(val);

View file

@ -30,6 +30,7 @@
#include "nel/misc/command.h" #include "nel/misc/command.h"
#include "nel/misc/path.h" #include "nel/misc/path.h"
#include "nel/misc/i18n.h"
using namespace std; using namespace std;
@ -526,6 +527,31 @@ void toUpper(char *str)
} }
} }
std::string formatThousands(const std::string& s)
{
int i, k;
int remaining = s.length() - 1;
static std::string separator = NLMISC::CI18N::get("uiThousandsSeparator").toUtf8();
// Don't add separator if the number is < 10k
if (remaining < 4) return s;
std::string ns;
do
{
for (i = remaining, k = 0; i >= 0 && k < 3; --i, ++k )
{
ns = s[i] + ns; // New char is added to front of ns
if ( i > 0 && k == 2) ns = separator + ns; // j > 0 means still more digits
}
remaining -= 3;
}
while (remaining >= 0);
return ns;
}
// //
// Exceptions // Exceptions

View file

@ -417,6 +417,17 @@ void CEntityIdTranslator::checkEntity (const CEntityId &eid, const ucstring &ent
} }
} }
void CEntityIdTranslator::removeShardFromName(ucstring& name)
{
// The string must contain a '(' and a ')'
ucstring::size_type p0= name.find('(');
ucstring::size_type p1= name.find(')');
if (p0 == ucstring::npos || p1 == ucstring::npos || p1 <= p0)
return;
name = name.substr(0, p0) + name.substr(p1 + 1);
}
// this callback is call when the file is changed // this callback is call when the file is changed
void cbInvalidEntityNamesFilename(const std::string &invalidEntityNamesFilename) void cbInvalidEntityNamesFilename(const std::string &invalidEntityNamesFilename)
{ {

View file

@ -178,7 +178,7 @@ static const CStringConversion<TKey>::CPair stringTable [] =
{ "KeyZOOM", KeyZOOM }, { "KeyZOOM", KeyZOOM },
{ "KeyNONAME", KeyNONAME }, { "KeyNONAME", KeyNONAME },
{ "KeyPA1", KeyPA1 }, { "KeyPA1", KeyPA1 },
{ "KeyOEM_CLEAR", KeyOEM_CLEAR }, { "KeyOEM_CLEAR", KeyOEM_CLEAR }
}; };

View file

@ -18,7 +18,7 @@
#include "nel/misc/noise_value.h" #include "nel/misc/noise_value.h"
#include "nel/misc/fast_floor.h" #include "nel/misc/fast_floor.h"
#include "nel/misc/random.h"
namespace NLMISC namespace NLMISC
@ -45,7 +45,8 @@ public:
CRandomGrid3D() CRandomGrid3D()
{ {
//seed //seed
srand(0); CRandom Random;
Random.srand(0);
// init the grid // init the grid
for(uint z=0; z<NL3D_NOISE_GRID_SIZE; z++) for(uint z=0; z<NL3D_NOISE_GRID_SIZE; z++)
@ -56,7 +57,7 @@ public:
{ {
uint id= x + (y<<NL3D_NOISE_GRID_SIZE_SHIFT) + (z<<(NL3D_NOISE_GRID_SIZE_SHIFT*2)); uint id= x + (y<<NL3D_NOISE_GRID_SIZE_SHIFT) + (z<<(NL3D_NOISE_GRID_SIZE_SHIFT*2));
// take higher bits of rand gives better result. // take higher bits of rand gives better result.
uint v= rand() >> 5; uint v= Random.rand() >> 5;
_Texture3d[id]= v&255; _Texture3d[id]= v&255;
} }
} }
@ -80,9 +81,9 @@ public:
// init LevelPhases. // init LevelPhases.
for(i=0; i<NL3D_NOISE_LEVEL; i++) for(i=0; i<NL3D_NOISE_LEVEL; i++)
{ {
_LevelPhase[i].x= frand(NL3D_NOISE_GRID_SIZE); _LevelPhase[i].x= Random.frand(NL3D_NOISE_GRID_SIZE);
_LevelPhase[i].y= frand(NL3D_NOISE_GRID_SIZE); _LevelPhase[i].y= Random.frand(NL3D_NOISE_GRID_SIZE);
_LevelPhase[i].z= frand(NL3D_NOISE_GRID_SIZE); _LevelPhase[i].z= Random.frand(NL3D_NOISE_GRID_SIZE);
} }
// not for level 0. // not for level 0.
_LevelPhase[0]= CVector::Null; _LevelPhase[0]= CVector::Null;

View file

@ -643,6 +643,8 @@ bool CRGBA::convertToHLS(float &h, float &l, float &s) const
{ {
h = 2.f + (b - r) / diff; h = 2.f + (b - r) / diff;
} }
#if defined(GCC_VERSION) && (GCC_VERSION == 40204)
// use the fix only if using the specific GCC version
else if (maxV == b) else if (maxV == b)
{ {
h = 4.f + (r - g) / diff; h = 4.f + (r - g) / diff;
@ -652,6 +654,12 @@ bool CRGBA::convertToHLS(float &h, float &l, float &s) const
// this case is to fix a compiler bug // this case is to fix a compiler bug
h = (g - b) / diff; h = (g - b) / diff;
} }
#else
else
{
h = 4.f + (r - g) / diff;
}
#endif
h *= 60.f; // scale to [0..360] h *= 60.f; // scale to [0..360]

View file

@ -153,6 +153,13 @@ bool CWinEventEmitter::processMessage (HWND hWnd, uint32 msg, WPARAM wParam, LPA
if ((int)wParam==VK_SHIFT) if ((int)wParam==VK_SHIFT)
_ShiftButton=false; _ShiftButton=false;
// As Print Screen button does not trigger a WM_KEYDOWN msg, simulate it here
if ((int)wParam==VK_SNAPSHOT)
{
if (wParam < KeyCount)
server->postEvent (new CEventKeyDown ((NLMISC::TKey)wParam, getKeyButton(_AltButton, _ShiftButton, _CtrlButton), true, this));
}
// Post the message // Post the message
if (wParam < KeyCount) if (wParam < KeyCount)
server->postEvent (new CEventKeyUp ((NLMISC::TKey)wParam, getKeyButton(_AltButton, _ShiftButton, _CtrlButton), this)); server->postEvent (new CEventKeyUp ((NLMISC::TKey)wParam, getKeyButton(_AltButton, _ShiftButton, _CtrlButton), this));

View file

@ -77,7 +77,7 @@ string typeToString (CTransportClass::TProp type)
string conv[] = { string conv[] = {
"PropUInt8", "PropUInt16", "PropUInt32", "PropUInt64", "PropUInt8", "PropUInt16", "PropUInt32", "PropUInt64",
"PropSInt8", "PropSInt16", "PropSInt32", "PropSInt64", "PropSInt8", "PropSInt16", "PropSInt32", "PropSInt64",
"PropBool", "PropFloat", "PropDouble", "PropString", "PropDataSetRow", "PropSheetId", "PropUKN" }; "PropBool", "PropFloat", "PropDouble", "PropString", "PropDataSetRow", "PropSheetId", "PropUCString", "PropUKN" };
// "PropBool", "PropFloat", "PropDouble", "PropString", "PropDataSetRow", "PropEntityId", "PropSheetId", "PropUKN" }; // "PropBool", "PropFloat", "PropDouble", "PropString", "PropDataSetRow", "PropEntityId", "PropSheetId", "PropUKN" };
if (type > CTransportClass::PropUKN) if (type > CTransportClass::PropUKN)
@ -352,6 +352,7 @@ void CTransportClass::init ()
// nlassert (PropDataSetRow < PropUKN); DummyProp[PropDataSetRow] = new CTransportClass::CRegisteredProp<TDataSetRow>; // nlassert (PropDataSetRow < PropUKN); DummyProp[PropDataSetRow] = new CTransportClass::CRegisteredProp<TDataSetRow>;
// nlassert (PropEntityId < PropUKN); DummyProp[PropEntityId] = new CTransportClass::CRegisteredProp<CEntityId>; // nlassert (PropEntityId < PropUKN); DummyProp[PropEntityId] = new CTransportClass::CRegisteredProp<CEntityId>;
nlassert (PropSheetId < PropUKN); DummyProp[PropSheetId] = new CTransportClass::CRegisteredProp<CSheetId>; nlassert (PropSheetId < PropUKN); DummyProp[PropSheetId] = new CTransportClass::CRegisteredProp<CSheetId>;
nlassert (PropUCString < PropUKN); DummyProp[PropUCString] = new CTransportClass::CRegisteredProp<ucstring>;
// we have to know when a service comes, so add callback (put the callback before all other one because we have to send this message first) // we have to know when a service comes, so add callback (put the callback before all other one because we have to send this message first)
CUnifiedNetwork::getInstance()->setServiceUpCallback("*", cbTCUpService, NULL, false); CUnifiedNetwork::getInstance()->setServiceUpCallback("*", cbTCUpService, NULL, false);

View file

@ -8,6 +8,7 @@ ADD_SUBDIRECTORY(object_viewer)
ADD_SUBDIRECTORY(georges_editor) ADD_SUBDIRECTORY(georges_editor)
ADD_SUBDIRECTORY(translation_manager) ADD_SUBDIRECTORY(translation_manager)
ADD_SUBDIRECTORY(tile_editor) ADD_SUBDIRECTORY(tile_editor)
ADD_SUBDIRECTORY(bnp_manager)
# Note: Temporarily disabled until development continues. # Note: Temporarily disabled until development continues.
#ADD_SUBDIRECTORY(zone_painter) #ADD_SUBDIRECTORY(zone_painter)
# Ryzom Specific Plugins # Ryzom Specific Plugins

View file

@ -0,0 +1,47 @@
INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${LIBXML2_INCLUDE_DIR}
${QT_INCLUDES})
FILE(GLOB SRC *.cpp *.h)
SET(OVQT_EXT_SYS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin.h
${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_manager.h
${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_spec.h)
SET(OVQT_PLUG_BNP_MANAGER_HDR bnp_manager_plugin.h
bnp_manager_window.h
bnp_dirtree_dialog.h
bnp_filesystem_model.h
bnp_file.h
bnp_filelist_dialog.h
bnp_proxy_model.h
)
SET(OVQT_PLUG_BNP_MANAGER_UIS bnp_dirtree_form.ui
bnp_filelist_dialog.ui
)
SET(OVQT_PLUGIN_BNP_MANAGER_RCS bnp_manager.qrc)
SET(QT_USE_QTGUI TRUE)
QT4_ADD_RESOURCES(OVQT_PLUGIN_BNP_MANAGER_RC_SRCS ${OVQT_PLUGIN_BNP_MANAGER_RCS})
QT4_WRAP_CPP(OVQT_PLUG_BNP_MANAGER_MOC_SRC ${OVQT_PLUG_BNP_MANAGER_HDR})
QT4_WRAP_UI(OVQT_PLUG_BNP_MANAGER_UI_HDRS ${OVQT_PLUG_BNP_MANAGER_UIS})
SOURCE_GROUP(QtResources FILES ${OVQT_PLUG_BNP_MANAGER_UIS} ${OVQT_PLUGIN_BNP_MANAGER_RCS})
SOURCE_GROUP(QtGeneratedUiHdr FILES ${OVQT_PLUG_BNP_MANAGER_UI_HDRS})
SOURCE_GROUP(QtGeneratedMocSrc FILES ${OVQT_PLUG_BNP_MANAGER_MOC_SRC})
SOURCE_GROUP("BNP Manager Plugin" FILES ${SRC})
SOURCE_GROUP("OVQT Extension System" FILES ${OVQT_EXT_SYS_SRC})
ADD_LIBRARY(ovqt_plugin_bnp_manager MODULE ${SRC} ${OVQT_PLUG_BNP_MANAGER_MOC_SRC} ${OVQT_EXT_SYS_SRC} ${OVQT_PLUGIN_BNP_MANAGER_RC_SRCS} ${OVQT_PLUG_BNP_MANAGER_UI_HDRS})
TARGET_LINK_LIBRARIES(ovqt_plugin_bnp_manager ovqt_plugin_core nelmisc nelgeorges ${QT_LIBRARIES})
NL_DEFAULT_PROPS(ovqt_plugin_bnp_manager "NeL, Tools, 3D: Object Viewer Qt Plugin: BNP Manager")
NL_ADD_RUNTIME_FLAGS(ovqt_plugin_bnp_manager)
NL_ADD_LIB_SUFFIX(ovqt_plugin_bnp_manager)
ADD_DEFINITIONS(${LIBXML2_DEFINITIONS} -DQT_PLUGIN -DQT_SHARED ${QT_DEFINITIONS})
INSTALL(TARGETS ovqt_plugin_bnp_manager LIBRARY DESTINATION lib RUNTIME DESTINATION bin ARCHIVE DESTINATION lib COMPONENT tools3d)

View file

@ -0,0 +1,93 @@
// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2011 Roland Winklmeier <roland.m.winklmeier@googlemail.com>
//
// 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 <http://www.gnu.org/licenses/>.
// Project includes
#include "bnp_dirtree_dialog.h"
#include "bnp_filesystem_model.h"
#include "bnp_proxy_model.h"
// Qt includes
#include <QtGui/QWidget>
// NeL includes
#include <nel/misc/debug.h>
namespace BNPManager
{
CBnpDirTreeDialog::CBnpDirTreeDialog(QString bnpPath, QWidget *parent)
: QDockWidget(parent),
m_DataPath(bnpPath)
{
// Setup the dialog
m_ui.setupUi(this);
// Filter settings to only display files with bnp extension.
// Could be changed to display all files and react according to the extension:
// Bnp file: opened and displayed
// all other files: added to the currently opened bnp file
QStringList filter;
//filter << tr("*.bnp");
// Setup the directory tree model
m_dirModel= new BNPFileSystemModel();
m_proxyModel = new BNPSortProxyModel();
m_dirModel->setRootPath(m_DataPath);
m_dirModel->setFilter(QDir::AllDirs | QDir::NoDotAndDotDot | QDir::AllEntries);
m_dirModel->setNameFilters(filter);
m_dirModel->setNameFilterDisables(0);
m_proxyModel->setSourceModel(m_dirModel);
m_ui.dirTree->setModel(m_proxyModel);
m_ui.dirTree->setRootIndex( m_proxyModel->mapFromSource (m_dirModel->index(m_DataPath) ) );
m_ui.dirTree->setSortingEnabled(true);
// Trigger if one filename is activated
// In future drag&drop should be also possible
connect(m_ui.dirTree, SIGNAL(activated(QModelIndex)),
this, SLOT(fileSelected(QModelIndex)));
}
// ***************************************************************************
CBnpDirTreeDialog::~CBnpDirTreeDialog()
{
}
// ***************************************************************************
void CBnpDirTreeDialog::fileSelected(QModelIndex index)
{
QModelIndex source = m_proxyModel->mapToSource(index);
if (source.isValid() && !m_dirModel->isDir(source))
{
// emit the according signal to BNPManagerWindow class
Q_EMIT selectedFile(m_dirModel->fileInfo(source).filePath());
}
}
// ***************************************************************************
void CBnpDirTreeDialog::changeFile(QString file)
{
}
// ***************************************************************************
void CBnpDirTreeDialog::BnpPathChanged(QString path)
{
}
// ***************************************************************************
}

View file

@ -0,0 +1,83 @@
// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2011 Roland Winklmeier <roland.m.winklmeier@googlemail.com>
//
// 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 <http://www.gnu.org/licenses/>.
#ifndef BNP_DIRTREE_DIALOG_H
#define BNP_DIRTREE_DIALOG_H
// Qt includes
#include <QtGui/QWidget>
// STL includes
// NeL includes
// Project includes
#include "ui_bnp_dirtree_form.h"
namespace BNPManager
{
class BNPFileSystemModel;
class BNPSortProxyModel;
class CBnpDirTreeDialog : public QDockWidget
{
Q_OBJECT
public:
/**
* Constructor
* \param path to root directory, which should be displayed
*/
CBnpDirTreeDialog(QString bnpPath, QWidget *parent = 0);
/**
* Destructor
*/
~CBnpDirTreeDialog();
/**
* Change the root path for the dir tree view
* \param data path to the new directory
*/
void BnpPathChanged(QString);
private:
Ui::CBnpDirTreeDialog m_ui;
// path ro data root directory
QString m_DataPath;
BNPFileSystemModel *m_dirModel;
BNPSortProxyModel *m_proxyModel;
Q_SIGNALS:
void selectedFile(const QString);
private Q_SLOTS:
/**
* Triggered if the user activates (double klick on windows)
* a file name in the dir tree view
* \param selected ModelIndex (filename)
*/
void fileSelected(QModelIndex index);
void changeFile(QString file);
};
}
#endif

View file

@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>CBnpDirTreeDialog</class>
<widget class="QDockWidget" name="CBnpDirTreeDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>200</width>
<height>141</height>
</size>
</property>
<property name="features">
<set>QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable</set>
</property>
<property name="windowTitle">
<string>BNP Datapath</string>
</property>
<widget class="QWidget" name="dockWidgetContents">
<property name="minimumSize">
<size>
<width>50</width>
<height>0</height>
</size>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2">
<widget class="QTreeView" name="dirTree">
<property name="minimumSize">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
<resources>
<include location="../../object_viewer_qt.qrc"/>
<include location="../core/core.qrc"/>
<include location="bnp_manager.qrc"/>
</resources>
<connections/>
</ui>

View file

@ -0,0 +1,313 @@
// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2011 Roland Winklmeier <roland.m.winklmeier@googlemail.com>
//
// 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 <http://www.gnu.org/licenses/>.
// Project includes
#include "bnp_file.h"
// Nel includes
#include <nel/misc/debug.h>
#include <nel/misc/file.h>
#include <nel/misc/path.h>
#include <nel/misc/algo.h>
#include <nel/misc/common.h>
// Qt includes
using namespace NLMISC;
using namespace std;
namespace BNPManager
{
PackedFile::PackedFile()
{
m_size = 0;
m_pos = 0;
}
NLMISC_SAFE_SINGLETON_IMPL(BNPFileHandle);
BNPFileHandle::BNPFileHandle()
{
m_offsetFromBeginning = 0;
}
// ***************************************************************************
BNPFileHandle::~BNPFileHandle()
{
// Erase the list
m_packedFiles.clear();
}
// ***************************************************************************
void BNPFileHandle::releaseInstance()
{
if (_Instance)
{
NLMISC::INelContext::getInstance().releaseSingletonPointer("BNPFileHandle", _Instance);
delete _Instance;
_Instance = NULL;
}
}
// ***************************************************************************
bool BNPFileHandle::unpack(const string &dirName, const vector<string>& fileList)
{
CIFile bnp;
bnp.open(m_openedBNPFile);
TPackedFilesList::iterator it_files = m_packedFiles.begin();
for (it_files; it_files != m_packedFiles.end(); it_files++)
{
// Check if the file should be unpacked or not
if (find(fileList.begin(), fileList.end(), it_files->m_name) != fileList.end())
{
string filename = dirName + "/" + it_files->m_name;
COFile out;
if ( out.open(filename) )
{
bnp.seek(it_files->m_pos, IStream::begin);
uint8 *ptr = new uint8[it_files->m_size];
bnp.serialBuffer(ptr,it_files->m_size);
out.serialBuffer(ptr,it_files->m_size);
delete [] ptr;
}
out.close();
}
}
bnp.close();
return true;
}
// ***************************************************************************
// Read the header from a big file
bool BNPFileHandle::readHeader(const std::string &filePath)
{
m_packedFiles.clear();
m_openedBNPFile = filePath;
CIFile bnp;
bnp.open (filePath);
bnp.seek(0, IStream::end);
uint32 nFileSize = bnp.getFileSize();
bnp.seek(nFileSize-sizeof(uint32), IStream::begin);
uint32 nOffsetFromBegining;
bnp.serial(nOffsetFromBegining);
if ( !bnp.seek (nOffsetFromBegining, IStream::begin) )
{
nlwarning("Could not read offset from begining");
bnp.close();
return false;
}
uint32 nNbFile;
bnp.serial(nNbFile);
for (uint32 i = 0; i < nNbFile; ++i)
{
uint8 nStringSize;
char sName[256];
bnp.serial(nStringSize);
bnp.serialBuffer( (uint8*)sName, nStringSize);
sName[nStringSize] = 0;
PackedFile tmpPackedFile;
tmpPackedFile.m_name = sName;
tmpPackedFile.m_path = m_openedBNPFile;
bnp.serial(tmpPackedFile.m_size);
bnp.serial(tmpPackedFile.m_pos);
m_packedFiles.push_back (tmpPackedFile);
}
bnp.close();
return true;
}
// ***************************************************************************
void BNPFileHandle::list(TPackedFilesList& FileList)
{
PackedFile tmpFile;
TPackedFilesList::iterator it = m_packedFiles.begin();
while (it != m_packedFiles.end() )
{
tmpFile.m_name = it->m_name;
tmpFile.m_pos = it->m_pos;
tmpFile.m_size = it->m_size;
tmpFile.m_path = it->m_path;
FileList.push_back(tmpFile);
it++;
}
}
// ***************************************************************************
bool BNPFileHandle::writeHeader( const std::string &filePath, uint32 offset )
{
COFile bnp;
bnp.open(filePath, true);
if ( !bnp.isOpen() )
return false;
uint32 nNbFile = (uint32)m_packedFiles.size();
bnp.serial(nNbFile);
for (uint32 i = 0; i < nNbFile; ++i)
{
uint8 nStringSize = (uint8)m_packedFiles[i].m_name.size();
bnp.serial( nStringSize );
bnp.serialBuffer( (uint8*)m_packedFiles[i].m_name.c_str(), nStringSize );
bnp.serial(m_packedFiles[i].m_size);
bnp.serial(m_packedFiles[i].m_pos);
}
bnp.serial(offset);
bnp.close();
return true;
}
// ***************************************************************************
void BNPFileHandle::fileNames(std::vector<std::string> &fileNames)
{
TPackedFilesList::iterator it = m_packedFiles.begin();
while (it != m_packedFiles.end() )
{
fileNames.push_back(it->m_name);
it++;
}
}
// ***************************************************************************
void BNPFileHandle::addFiles( const vector<string> &filePathes)
{
uint32 OffsetFromBegining = 0;
// create packed files and add them to the private vector
vector<string>::const_iterator it_vec = filePathes.begin();
while (it_vec != filePathes.end() )
{
PackedFile tmpFile;
tmpFile.m_name = CFile::getFilename (*it_vec);
// Leave position to 0 and set the value during the new bnp file is creating
// We need the position only for the header at the end
tmpFile.m_pos = 0;
tmpFile.m_size = CFile::getFileSize(*it_vec);
tmpFile.m_path = *it_vec;
m_packedFiles.push_back( tmpFile );
it_vec++;
}
// sort packed files alphabetic
std::sort ( m_packedFiles.begin(), m_packedFiles.end(), compare );
// create a new temporary bnp file with extension *.tmp
TPackedFilesList::iterator it_packed = m_packedFiles.begin();
while (it_packed != m_packedFiles.end() )
{
append(m_openedBNPFile + ".tmp", *it_packed);
// Set now the new offset for the new header
it_packed->m_pos = OffsetFromBegining;
OffsetFromBegining += it_packed->m_size;
it_packed++;
}
writeHeader(m_openedBNPFile + ".tmp", OffsetFromBegining);
CFile::deleteFile( m_openedBNPFile );
string src = m_openedBNPFile + ".tmp";
CFile::moveFile( m_openedBNPFile.c_str(), src.c_str() );
}
// ***************************************************************************
void BNPFileHandle::deleteFiles( const vector<string>& fileNames)
{
vector<string>::const_iterator it_vec;
TPackedFilesList::iterator it_packed;
uint32 OffsetFromBegining = 0;
string tmpFile = m_openedBNPFile + ".tmp";
// create a new temporary bnp file with extension *.tmp
it_packed = m_packedFiles.begin();
while (it_packed != m_packedFiles.end() )
{
// check each packed file if it should be deleted
it_vec = find (fileNames.begin(), fileNames.end(), it_packed->m_name );
if ( it_vec != fileNames.end() )
{
nlinfo("Deleting file %s.", it_packed->m_name.c_str() );
it_packed = m_packedFiles.erase(it_packed);
}
else
{
append(tmpFile, *it_packed);
// Set now the new offset for the new header
it_packed->m_pos = OffsetFromBegining;
OffsetFromBegining += it_packed->m_size;
it_packed++;
}
}
writeHeader(tmpFile, OffsetFromBegining);
CFile::deleteFile( m_openedBNPFile );
string src = m_openedBNPFile + ".tmp";
CFile::moveFile( m_openedBNPFile.c_str(), src.c_str() );
}
// ***************************************************************************
void BNPFileHandle::append(const string &destination, const PackedFile &source)
{
// check if the file exists and create one if not
if ( !CFile::fileExists(destination) )
CFile::createEmptyFile( destination );
COFile bnpfile;
CIFile packedfile;
bnpfile.open(destination, true);
packedfile.open(source.m_path);
if ( !bnpfile.isOpen() ) return;
uint8 *ptr = new uint8[source.m_size];
// check if the source is a bnp file.
if ( nlstricmp( CFile::getExtension(source.m_path), "bnp" ) == 0 )
{
// Jump to the file position inside the bnp
packedfile.seek(source.m_pos, IStream::begin);
}
// Read the source
packedfile.serialBuffer(ptr, source.m_size);
// Append the data to the destination
bnpfile.serialBuffer(ptr, source.m_size);
delete [] ptr;
packedfile.close();
bnpfile.close();
}
// ***************************************************************************
bool BNPFileHandle::compare(const PackedFile &left, const PackedFile &right)
{
return nlstricmp (left.m_name.c_str(), right.m_name.c_str()) < 0;
}
} // namespace BNPManager

View file

@ -0,0 +1,139 @@
// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2011 Roland Winklmeier <roland.m.winklmeier@googlemail.com>
//
// 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 <http://www.gnu.org/licenses/>.
#ifndef BNP_FILE_H
#define BNP_FILE_H
// Project includes
// Nel includes
#include "nel/misc/types_nl.h"
#include <nel/misc/singleton.h>
// Qt includes
#include <QString>
namespace BNPManager
{
struct PackedFile
{
PackedFile();
std::string m_name;
uint32 m_size;
uint32 m_pos;
std::string m_path;
};
typedef std::vector<PackedFile> TPackedFilesList;
class BNPFileHandle
{
NLMISC_SAFE_SINGLETON_DECL(BNPFileHandle)
/**
* Private constructor
*/
BNPFileHandle();
/**
* Private destructor
*/
~BNPFileHandle();
public:
// release memory
static void releaseInstance();
/*void append (const QString destFilename, const QString origFilename, uint32 sizeToRead);
void packRecurse();*/
/**
* Read the header from the bnp file and create a filelist
* \param filename (consisting the whole path)
*/
bool readHeader (const std::string &filePath);
bool writeHeader (const std::string &filePath, uint32 offset);
/**
* Append the header to a created bnp file
* \param filename (consisting the whole path)
*/
void appendHeader (const std::string &filename) {};
/**
* Create a vector of all packed files inside the bnp file
* \param reference to the vector, which has to be filled
*/
void list (TPackedFilesList& FileList);
/**
* Create a vector of all file names inside the bnp file
* \param reference to the vector, which has to be filled
*/
void fileNames( std::vector<std::string>& fileNames );
/**
* Add files to the current aktive bnp file
* \param vector of file pathes to add
*/
void addFiles( const std::vector<std::string>& filePathes );
/**
* Delete files from the current aktive bnp file
* \param vector of files names
*/
void deleteFiles (const std::vector<std::string>& fileNames);
/**
* Unpack the selected packed files into user defined dir
* \param directory path, where the files should be unpacked
* \param list of files, which has to be unpacked
*/
bool unpack (const std::string &dirName, const std::vector<std::string>& fileList);
/**
* Compares two filenames
* \param left: left packed file
* \param right: right packed file
* \return: TODO
*/
static bool compare(const PackedFile &left, const PackedFile &right);
private:
/**
* Append one file to an existing bnp file
* \param destination: the active bnp file to append the file
* \param source: the source file to pack
*/
void append( const std::string& destination, const PackedFile& source );
TPackedFilesList m_packedFiles;
// currently opened and displayed bnp file
std::string m_openedBNPFile;
// offset where the header of the bnp file begins
uint32 m_offsetFromBeginning;
};
}
#endif

View file

@ -0,0 +1,145 @@
// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2011 Roland Winklmeier <roland.m.winklmeier@googlemail.com>
//
// 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 <http://www.gnu.org/licenses/>.
// Project includes
#include "bnp_filelist_dialog.h"
#include "bnp_file.h"
// Qt includes
#include <QtGui/QWidget>
#include <QDragEnterEvent>
#include <QMimeData>
#include <QUrl>
#include <QEvent>
// NeL includes
#include <nel/misc/debug.h>
using namespace std;
namespace BNPManager
{
BnpFileListDialog::BnpFileListDialog(QString bnpPath, QWidget *parent)
: QDockWidget(parent),
m_DataPath(bnpPath)
{
m_ui.setupUi(this);
setAcceptDrops(true);
}
// ***************************************************************************
BnpFileListDialog::~BnpFileListDialog()
{
}
// ***************************************************************************
void BnpFileListDialog::setupTable(int nbrows)
{
// delete all old entries
m_ui.tableWidget->clear();
// set 2 colums: filename and size
m_ui.tableWidget->setColumnCount(2);
// set number of rows according to the number of files in the bnp file
m_ui.tableWidget->setRowCount(nbrows);
// only entire rows can be selected
m_ui.tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
// set the horizontal headers
QStringList labels;
labels << tr("Filename") << tr("Size");
m_ui.tableWidget->setHorizontalHeaderLabels(labels);
m_ui.tableWidget->horizontalHeader()->setResizeMode(0, QHeaderView::Interactive);
m_ui.tableWidget->horizontalHeader()->setResizeMode(1, QHeaderView::Stretch );
m_ui.tableWidget->verticalHeader()->hide();
// set vertical size a little bit smaller
m_ui.tableWidget->verticalHeader()->setDefaultSectionSize(15);
m_ui.tableWidget->setShowGrid(false);
m_ui.tableWidget->setObjectName("tablewidget");
}
// ***************************************************************************
bool BnpFileListDialog::loadTable(const QString filePath)
{
// reference to the BNPFileHandle singletone instance
BNPFileHandle& myBNPFileHandle = BNPFileHandle::getInstance();
// string vector of all packed files inside a bnp
TPackedFilesList filelist;
int row = 0;
// read the header from the bnp file
if (!myBNPFileHandle.readHeader( filePath.toStdString()) )
{
return false;
}
myBNPFileHandle.list( filelist );
// create table with number of rows
setupTable(filelist.size());
// fill the table items
TPackedFilesList::iterator it = filelist.begin();
while (it != filelist.end() )
{
QTableWidgetItem *nameItem = new QTableWidgetItem (it->m_name.c_str() );
QTableWidgetItem *sizeItem = new QTableWidgetItem (tr("%1 KB").arg(it->m_size));
m_ui.tableWidget->setItem(row, 0, nameItem);
m_ui.tableWidget->setItem(row, 1, sizeItem);
it++;
row++;
}
// Set the file path as the widgets title
setWindowTitle(filePath);
return true;
}
// ***************************************************************************
void BnpFileListDialog::getSelections(TSelectionList& SelectionList)
{
QModelIndex index;
QAbstractItemModel *model = m_ui.tableWidget->model();
QItemSelectionModel *selection = m_ui.tableWidget->selectionModel();
QModelIndexList indexes = selection->selectedRows();
Q_FOREACH(index, indexes)
{
QVariant data = model->data(index);
QString filename = data.toString();
SelectionList.push_back( filename.toStdString() );
}
}
// ***************************************************************************
void BnpFileListDialog::dragEnterEvent(QDragEnterEvent *event)
{
// Accept only one file
// In the future a tabbed FileListDialog would accept more
if ( event->mimeData()->hasUrls() && event->mimeData()->urls().count() == 1)
event->acceptProposedAction();
}
// ***************************************************************************
void BnpFileListDialog::dropEvent(QDropEvent *event)
{
// Excraft the local file url from the drop object and fill the table
const QMimeData *mimeData = event->mimeData();
QList<QUrl> urlList = mimeData->urls();
loadTable( urlList.first().toLocalFile() );
}
} // namespace BNPManager

View file

@ -0,0 +1,83 @@
// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2011 Roland Winklmeier <roland.m.winklmeier@googlemail.com>
//
// 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 <http://www.gnu.org/licenses/>.
#ifndef BNP_FILELIST_DIALOG_H
#define BNP_FILELIST_DIALOG_H
// Qt includes
#include <QtGui/QWidget>
// STL includes
#include <vector>
#include <string>
// NeL includes
// Project includes
#include "ui_bnp_filelist_dialog.h"
namespace BNPManager
{
typedef std::vector<std::string> TSelectionList;
class BnpFileListDialog : public QDockWidget
{
Q_OBJECT
public:
// Constructor
BnpFileListDialog(QString bnpPath, QWidget *parent = 0);
// Destructor
~BnpFileListDialog();
/**
* Load the bnp file and setup the table view
* \param Filename
* \return true if everything went well
*/
bool loadTable(const QString filePath);
/**
* Set the dimension of the table
* \param number of rows
*/
void setupTable(int nbrows);
/**
* Fill the files selected in the table view to
* unpack them.
* \param reference to a vector of filenames.
* \return true if everything went well
*/
void getSelections(TSelectionList& SelectionList);
protected:
void dragEnterEvent (QDragEnterEvent *event);
void dropEvent(QDropEvent *event);
private:
Ui::BnpFileListDialog m_ui;
// common data path as root folder for the dirtree view
QString m_DataPath;
};
}
#endif

View file

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>BnpFileListDialog</class>
<widget class="QDockWidget" name="BnpFileListDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>200</width>
<height>141</height>
</size>
</property>
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="features">
<set>QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable</set>
</property>
<property name="windowTitle">
<string>BNP File List</string>
</property>
<widget class="QWidget" name="dockWidgetContents">
<property name="minimumSize">
<size>
<width>50</width>
<height>0</height>
</size>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QTableWidget" name="tableWidget">
<property name="enabled">
<bool>true</bool>
</property>
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="showGrid">
<bool>false</bool>
</property>
<attribute name="horizontalHeaderMinimumSectionSize">
<number>15</number>
</attribute>
</widget>
</item>
</layout>
</widget>
</widget>
<resources>
<include location="../../object_viewer_qt.qrc"/>
<include location="../core/core.qrc"/>
<include location="bnp_manager.qrc"/>
</resources>
<connections/>
</ui>

View file

@ -0,0 +1,51 @@
// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2011 Roland Winklmeier <roland.m.winklmeier@googlemail.com>
//
// 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 <http://www.gnu.org/licenses/>
#include "bnp_filesystem_model.h"
#include <QApplication>
#include <QStyle>
namespace BNPManager
{
BNPFileSystemModel::BNPFileSystemModel(QObject *parent)
: QFileSystemModel(parent)
{
}
// ***************************************************************************
BNPFileSystemModel::~BNPFileSystemModel()
{
}
// ***************************************************************************
int BNPFileSystemModel::columnCount(const QModelIndex &) const
{
return 1;
}
// ***************************************************************************
QVariant BNPFileSystemModel::data(const QModelIndex& index, int role) const
{
if (role == Qt::DecorationRole)
{
if (isDir(index))
return QApplication::style()->standardIcon(QStyle::SP_DirIcon);
}
return QFileSystemModel::data(index, role);
}
// ***************************************************************************
} // namespace BNPManager

View file

@ -0,0 +1,49 @@
// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2011 Roland Winklmeier <roland.m.winklmeier@googlemail.com>
//
// 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 <http://www.gnu.org/licenses/>
#ifndef BNP_FILESYSTEM_MODEL_H
#define BNP_FILESYSTEM_MODEL_H
#include <QtGui/QFileSystemModel>
namespace BNPManager
{
class BNPFileSystemModel : public QFileSystemModel
{
Q_OBJECT
public:
/**
* Constructor
*/
BNPFileSystemModel(QObject *parent = 0);
/**
* Destructor
*/
~BNPFileSystemModel();
int columnCount(const QModelIndex &) const;
QVariant data(const QModelIndex& index, int role) const ;
};
}
#endif

View file

@ -0,0 +1,9 @@
<RCC>
<qresource>
<file>images/ic_nel_bnp_make.png</file>
<file>images/ic_nel_delete_item.png</file>
<file>images/ic_nel_add_item.png</file>
<file>images/ic_nel_export.png</file>
<file>images/ic_nel_reset_all.png</file>
</qresource>
</RCC>

View file

@ -0,0 +1,37 @@
// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2011 Roland Winklmeier <roland.m.winklmeier@googlemail.com>
//
// 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 <http://www.gnu.org/licenses/>.
#ifndef BNP_MANAGER_CONSTANTS_H
#define BNP_MANAGER_CONSTANTS_H
namespace BNPManager
{
namespace Constants
{
//settings
const char * const BNP_MANAGER_SECTION = "BNPManager";
//resources
const char *const ICON_ADD = ":/images/ic_nel_add_item.png";
const char *const ICON_DELETE = ":/images/ic_nel_delete_item.png";
const char *const ICON_UNPACK = ":/images/ic_nel_export.png";
const char *const ICON_CLOSE = ":/images/ic_nel_reset_all.png";
} // namespace Constants
} // namespace Plugin
#endif

View file

@ -0,0 +1,89 @@
// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2011 Roland Winklmeier <roland.m.winklmeier@googlemail.com>
//
// 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 <http://www.gnu.org/licenses/>.
// Project includes
#include "bnp_manager_plugin.h"
#include "bnp_manager_window.h"
#include "../core/icore.h"
#include "../core/core_constants.h"
#include "../core/menu_manager.h"
// NeL includes
#include "nel/misc/debug.h"
// Qt includes
#include <QtCore/QObject>
#include <QtGui/QMainWindow>
namespace BNPManager
{
BNPManagerPlugin::BNPManagerPlugin()
{
}
BNPManagerPlugin::~BNPManagerPlugin()
{
Q_FOREACH(QObject *obj, m_autoReleaseObjects)
{
m_plugMan->removeObject(obj);
}
qDeleteAll(m_autoReleaseObjects);
m_autoReleaseObjects.clear();
}
bool BNPManagerPlugin::initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString)
{
Q_UNUSED(errorString);
m_plugMan = pluginManager;
addAutoReleasedObject(new BNPManagerContext(this));
return true;
}
void BNPManagerPlugin::extensionsInitialized()
{
}
void BNPManagerPlugin::shutdown()
{
}
void BNPManagerPlugin::setNelContext(NLMISC::INelContext *nelContext)
{
#ifdef NL_OS_WINDOWS
// Ensure that a context doesn't exist yet.
// This only applies to platforms without PIC, e.g. Windows.
nlassert(!NLMISC::INelContext::isContextInitialised());
#endif // NL_OS_WINDOWS
m_libContext = new NLMISC::CLibraryContext(*nelContext);
}
void BNPManagerPlugin::addAutoReleasedObject(QObject *obj)
{
m_plugMan->addObject(obj);
m_autoReleaseObjects.prepend(obj);
}
/*void BNPManagerContext::open()
{
m_BnpManagerWindow->open();
}*/
}
Q_EXPORT_PLUGIN(BNPManager::BNPManagerPlugin)

View file

@ -0,0 +1,130 @@
// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2011 Roland Winklmeier <roland.m.winklmeier@googlemail.com>
//
// 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 <http://www.gnu.org/licenses/>.
#ifndef BNP_MANAGER_PLUGIN_H
#define BNP_MANAGER_PLUGIN_H
// Project includes
#include "../../extension_system/iplugin.h"
#include "../core/icontext.h"
#include "bnp_manager_window.h"
// NeL includes
#include "nel/misc/app_context.h"
#include <nel/misc/debug.h>
// Qt includes
#include <QtCore/QObject>
#include <QtGui/QIcon>
namespace NLMISC
{
class CLibraryContext;
}
namespace ExtensionSystem
{
class IPluginSpec;
}
namespace BNPManager
{
class m_BnpManagerWindow;
class BNPManagerPlugin : public QObject, public ExtensionSystem::IPlugin
{
Q_OBJECT
Q_INTERFACES(ExtensionSystem::IPlugin)
public:
BNPManagerPlugin();
virtual ~BNPManagerPlugin();
virtual bool initialize(ExtensionSystem::IPluginManager *pluginManager, QString *errorString);
virtual void extensionsInitialized();
virtual void shutdown();
virtual void setNelContext(NLMISC::INelContext *nelContext);
void addAutoReleasedObject(QObject *obj);
protected:
NLMISC::CLibraryContext *m_libContext;
private:
ExtensionSystem::IPluginManager *m_plugMan;
QList<QObject *> m_autoReleaseObjects;
};
/**
* Implementation of the IContext interface
*
* \date 2011
*/
class BNPManagerContext : public Core::IContext
{
Q_OBJECT
public:
// Constructor
BNPManagerContext(QObject *parent = 0) : IContext(parent)
{
// run new manager window app
m_BnpManagerWindow = new BNPManagerWindow();
}
// Destructor
virtual ~BNPManagerContext() {}
virtual QString id() const
{
return QLatin1String("BNPManagerContext");
}
virtual QString trName() const
{
return tr("BNP Manager");
}
virtual QIcon icon() const
{
return QIcon(":/images/ic_nel_bnp_make.png");
}
virtual void open()
{
m_BnpManagerWindow->open();
}
virtual QUndoStack *undoStack()
{
return m_BnpManagerWindow->m_undoStack;
}
virtual QWidget *widget()
{
return m_BnpManagerWindow;
}
BNPManagerWindow *m_BnpManagerWindow;
};
} // namespace Plugin
#endif // BNP_MANAGER_PLUGIN_H

View file

@ -0,0 +1,291 @@
// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2011 Roland Winklmeier <roland.m.winklmeier@googlemail.com>
//
// 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 <http://www.gnu.org/licenses/>.
// Project includes
#include "bnp_manager_window.h"
#include "bnp_manager_constants.h"
#include "bnp_dirtree_dialog.h"
#include "bnp_filelist_dialog.h"
#include "bnp_file.h"
#include "../core/icore.h"
#include "../core/menu_manager.h"
#include "../core/core_constants.h"
#include "../../extension_system/iplugin_spec.h"
// NeL includes
#include <nel/misc/debug.h>
#include <nel/misc/path.h>
// Qt includes
#include <QDebug>
#include <QFileDialog>
#include <QToolBar>
#include <QTableWidget>
#include <QMessageBox>
#include <QSettings>
using namespace std;
using namespace NLMISC;
namespace BNPManager
{
BNPManagerWindow::BNPManagerWindow(QWidget *parent)
: QMainWindow(parent)
{
// add new mainwindow for sheet dockwidgets
QTableWidget* hideWidget = new QTableWidget(0,0,this);
setCentralWidget(hideWidget);
hideWidget->hide();
// Read the settings
readSettings();
// create main dialogs and display them
createDialogs();
// create actions like open, close, add etc.
createActions();
// create a toolbar with icons
createToolBars();
// this SLOT is triggered if the user activates a bnp files in the
// dirtree view
connect(m_BnpDirTreeDialog, SIGNAL(selectedFile(const QString)),
this, SLOT(loadFile(const QString)));
// not used
m_undoStack = new QUndoStack(this);
}
// ***************************************************************************
BNPManagerWindow::~BNPManagerWindow()
{
writeSettings();
}
// ***************************************************************************
void BNPManagerWindow::createDialogs()
{
// create dialog to list the contents of the specified
// bnp data file directory
m_BnpDirTreeDialog = new CBnpDirTreeDialog(tr(m_DataPath.toStdString().c_str()),this);
addDockWidget(Qt::LeftDockWidgetArea, m_BnpDirTreeDialog);
m_BnpDirTreeDialog->setVisible(true);
restoreDockWidget(m_BnpDirTreeDialog);
// create dialog to list the packed file contents of bnp files on
// the right hand side
m_BnpFileListDialog = new BnpFileListDialog(m_DataPath,this);
addDockWidget(Qt::RightDockWidgetArea, m_BnpFileListDialog);
m_BnpFileListDialog->setVisible(true);
restoreDockWidget(m_BnpFileListDialog);
}
// ***************************************************************************
void BNPManagerWindow::createActions()
{
// open action
m_openAction = new QAction(tr("&Open..."), this);
m_openAction->setIcon(QIcon(Core::Constants::ICON_OPEN));
m_openAction->setStatusTip(tr("Open file"));
connect(m_openAction, SIGNAL(triggered()), this, SLOT( open() ));
// close action
m_closeAction = new QAction(tr("&Close..."), this);
m_closeAction->setIcon(QIcon(Constants::ICON_CLOSE));
m_closeAction->setStatusTip(tr("Close the BNP File"));
connect(m_closeAction, SIGNAL(triggered()), this, SLOT( close() ));
// add files into the bnp file
m_addFilesAction = new QAction(tr("&Add..."), this);
m_addFilesAction->setIcon(QIcon(Constants::ICON_ADD));
m_addFilesAction->setStatusTip(tr("Add Files to BNP"));
connect(m_addFilesAction, SIGNAL(triggered()), this, SLOT( addFiles() ));
// delete files from the bnp file
m_deleteFilesAction = new QAction(tr("&Delete..."), this);
m_deleteFilesAction->setIcon(QIcon(Constants::ICON_DELETE));
m_deleteFilesAction->setStatusTip(tr("Delete Files"));
connect(m_deleteFilesAction, SIGNAL(triggered()), this, SLOT( deleteFiles() ));
// unpack selected files into user defined dir
m_unpackFilesAction = new QAction(tr("&Unpack..."), this);
m_unpackFilesAction->setIcon(QIcon(Constants::ICON_UNPACK));
m_unpackFilesAction->setStatusTip(tr("Unpack Files"));
connect(m_unpackFilesAction, SIGNAL(triggered()), this, SLOT( unpackFiles() ));
}
// ***************************************************************************
void BNPManagerWindow::createToolBars()
{
m_fileToolBar = addToolBar(tr("&File"));
m_fileToolBar->addAction(m_openAction);
m_fileToolBar->addAction(m_closeAction);
m_toolsBar = addToolBar(tr("&Tools"));
m_toolsBar->addAction(m_addFilesAction);
m_toolsBar->addAction(m_deleteFilesAction);
m_toolsBar->addAction(m_unpackFilesAction);
}
// ***************************************************************************
bool BNPManagerWindow::loadFile(const QString fileName)
{
m_BnpFileListDialog->loadTable(fileName);
return true;
}
// ***************************************************************************
void BNPManagerWindow::open()
{
QString fileName;
// file dialog to select with file should be opened
fileName = QFileDialog::getOpenFileName(this,
tr("Open BNP file"), tr(m_DataPath.toStdString().c_str()), tr("BNP Files (*.bnp)"));
// Check if filename is empty
if (fileName.isNull())
return;
m_openedBNPFile = fileName;
loadFile(fileName);
}
// ***************************************************************************
void BNPManagerWindow::close()
{
//TODO
}
// ***************************************************************************
void BNPManagerWindow::addFiles()
{
// reference to the BNPFileHandle singletone instance
BNPFileHandle& myBNPFileHandle = BNPFileHandle::getInstance();
// vector of all current packed filenames
vector<string> currentFiles;
// vector of files to add
vector<string> addFiles;
// open a file dialog and to add files
QStringList FileList;
FileList = QFileDialog::getOpenFileNames(this,tr("Add Files..."),
QDir::currentPath(), tr("All Files (*.*)") );
// get all current filenames from the opened bnp file
myBNPFileHandle.fileNames(currentFiles);
QStringList::iterator it_list = FileList.begin();
while (it_list != FileList.end() )
{
string fileName = CFile::getFilename (it_list->toStdString() );
if ( std::find(currentFiles.begin(), currentFiles.end(), fileName ) != currentFiles.end() )
{
// Ask the user if he wants to override the existing file
// atm only warn the user and do not override
QMessageBox::warning(this, tr("BNP Manager"),
tr("File is already in the list!"),
QMessageBox::Ok,
QMessageBox::Ok);
}
else
{
addFiles.push_back( it_list->toStdString() );
// log it
nlinfo("Add file %s", fileName.c_str() );
}
it_list++;
}
if ( !addFiles.empty() )
{
myBNPFileHandle.addFiles( addFiles );
}
loadFile(m_openedBNPFile);
}
// ***************************************************************************
void BNPManagerWindow::deleteFiles()
{
QFileDialog filedialog(this);
BNPFileHandle& myBNPFileHandle = BNPFileHandle::getInstance();
vector<string> selectedRows;
m_BnpFileListDialog->getSelections(selectedRows);
// Check if files were selected. If not, inform the user.
if (selectedRows.empty())
{
QMessageBox::information(this, tr("BNP Manager"),
tr("No files selected!"),
QMessageBox::Ok,
QMessageBox::Ok);
return;
}
myBNPFileHandle.deleteFiles(selectedRows);
loadFile(m_openedBNPFile);
}
// ***************************************************************************
void BNPManagerWindow::unpackFiles()
{
QFileDialog filedialog(this);
BNPFileHandle& myBNPFileHandle = BNPFileHandle::getInstance();
vector<string> selectedrows;
m_BnpFileListDialog->getSelections(selectedrows);
// Check if files were selected. If not, inform the user.
// TODO: Ask the user if nothing was selected, if he wants to unpack all
// files. This is more like Winzip.
if (selectedrows.empty())
{
QMessageBox::information(this, tr("BNP Manager"),
tr("No files selected!"),
QMessageBox::Ok,
QMessageBox::Ok);
return;
}
QString dir = QFileDialog::getExistingDirectory(this, tr("Open Directory"),
tr(m_DataPath.toStdString().c_str()),
QFileDialog::ShowDirsOnly
| QFileDialog::DontResolveSymlinks);
// If anything went wrong or the user pressed "cancel"
if ( dir.isEmpty() )
return;
if (myBNPFileHandle.unpack(dir.toStdString(),selectedrows))
{
QMessageBox::information(this, tr("BNP Manager"),
tr("All files has been exported successfully."),
QMessageBox::Ok,
QMessageBox::Ok);
}
}
// ***************************************************************************
void BNPManagerWindow::readSettings()
{
QSettings *settings = Core::ICore::instance()->settings();
settings->beginGroup(Core::Constants::DATA_PATH_SECTION);
m_DataPath = settings->value(Core::Constants::ASSETS_PATH, "w:/database").toString();
settings->endGroup();
}
// ***************************************************************************
void BNPManagerWindow::writeSettings()
{
}
} // namespace BNPManager

View file

@ -0,0 +1,145 @@
// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2011 Roland Winklmeier <roland.m.winklmeier@googlemail.com>
//
// 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 <http://www.gnu.org/licenses/>.
#ifndef BNP_MANAGER_WINDOW_H
#define BNP_MANAGER_WINDOW_H
// Project includes
//#include "ui_bnp_manager_window.h"
// Qt includes
#include <QtGui/QMainWindow>
#include <QtGui/QLabel>
#include <QtGui/QUndoStack>
#include <QtGui/QTableWidget>
namespace BNPManager
{
class CBnpDirTreeDialog;
class BnpFileListDialog;
class BNPFileHandle;
/**
* Main window class. Derived from QMainWindow and implements
* the basic layout like menue, toolbars and dialogs.
*
* \date 2011
*/
class BNPManagerWindow : public QMainWindow
{
Q_OBJECT
public:
// Constructor
BNPManagerWindow(QWidget *parent = 0);
//Destructor
~BNPManagerWindow();
QUndoStack *m_undoStack;
public Q_SLOTS:
/**
* Open a file dialog to choose which file should be opened.
* \return Filename string
*/
void open();
/**
* Load a certain bnp file into the manager
* \param Filename
* \return true if everything went well
*/
bool loadFile(const QString fileName);
/**
* close an opened bnp file and reset all views
*/
void close();
/**
* Add files into an opened bnp file.
* \param Filelist
*/
void addFiles();
/**
* Unpack the files marked in the filelist dialog into user defined
* directory.
* \param TBD
* \return true if everything went well
*/
void unpackFiles();
/**
* Delete marked files from the bnp file
* \param TBD
*/
void deleteFiles();
private:
/**
* Read plugin settings and set the window accordingly
*/
void readSettings();
/**
* Write plugin settings
*/
void writeSettings();
/**
* Create all plugin dialogs
*/
void createDialogs();
/**
* Create all plugin actions
*/
void createActions();
/**
* Create the plugin toolbar
*/
void createToolBars();
QToolBar *m_fileToolBar;
QToolBar *m_toolsBar;
QAction *m_openAction;
QAction *m_closeAction;
QAction *m_addFilesAction;
QAction *m_unpackFilesAction;
QAction *m_deleteFilesAction;
CBnpDirTreeDialog *m_BnpDirTreeDialog;
BnpFileListDialog *m_BnpFileListDialog;
QString m_DataPath;
QString m_openedBNPFile;
}; /* class BNPManagerWindow */
} /* namespace Plugin */
#endif

View file

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>BNPManagerWindow</class>
<widget class="QMainWindow" name="BNPManagerWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>BNP Manager</string>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<widget class="QWidget" name="centralwidget">
<property name="styleSheet">
<string notr="true">QWidget#centralwidget {
image: url(:/images/ic_nel_georges_editor.png);
}</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="1">
<widget class="QTableWidget" name="tableWidget"/>
</item>
<item row="0" column="0">
<widget class="QTreeView" name="treeView"/>
</item>
</layout>
</widget>
<widget class="QToolBar" name="toolBar">
<property name="windowTitle">
<string>toolBar</string>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
</widget>
</widget>
<resources>
<include location="bnp_manager.qrc"/>
</resources>
<connections/>
</ui>

View file

@ -0,0 +1,56 @@
// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2011 Roland Winklmeier <roland.m.winklmeier@googlemail.com>
//
// 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 <http://www.gnu.org/licenses/>
// NeL includes
#include <nel/misc/debug.h>
// project includes
#include "bnp_proxy_model.h"
namespace BNPManager
{
bool BNPSortProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
if ( sourceModel()->hasChildren(left) )
{
if ( !sourceModel()->hasChildren(right) )
{
return true;
}
else
{
QString leftString = sourceModel()->data( left ).toString();
QString rightString = sourceModel()->data( right ).toString();
return QString::localeAwareCompare(leftString, rightString) < 0;
}
}
else
{
if ( sourceModel()->hasChildren(right) )
return false;
else
{
QString leftString = sourceModel()->data( left ).toString();
QString rightString = sourceModel()->data( right ).toString();
return QString::localeAwareCompare(leftString, rightString) < 0;
}
}
}
} /* namespace Plugin */
/* end of file */

View file

@ -0,0 +1,44 @@
// Object Viewer Qt - BNP Manager Plugin - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// Copyright (C) 2011 Roland Winklmeier <roland.m.winklmeier@googlemail.com>
//
// 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 <http://www.gnu.org/licenses/>
#ifndef BNP_PROXY_MODEL_H
#define BNP_PROXY_MODEL_H
// Qt includes
#include <QSortFilterProxyModel>
namespace BNPManager
{
class BNPSortProxyModel : public QSortFilterProxyModel
{
public:
BNPSortProxyModel(QObject *parent = 0): QSortFilterProxyModel(parent)
{
}
~BNPSortProxyModel()
{
}
protected:
virtual bool lessThan ( const QModelIndex & left, const QModelIndex & right ) const;
};/* class BNPSortProxyModel */
} // BNPManager
#endif // BNP_PROXY_MODEL_H

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View file

@ -0,0 +1,10 @@
<plugin-spec>
<library-name>ovqt_plugin_bnp_manager</library-name>
<name>BNPManager</name>
<version>0.1</version>
<vendor>Krolock</vendor>
<description>Edit BNP Files</description>
<dependencies>
<dependency plugin-name="Core" version="0.8"/>
</dependencies>
</plugin-spec>

View file

@ -91,7 +91,7 @@
<item> <item>
<widget class="QPushButton" name="bankButton"> <widget class="QPushButton" name="bankButton">
<property name="enabled"> <property name="enabled">
<bool>false</bool> <bool>true</bool>
</property> </property>
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">

View file

@ -186,12 +186,11 @@ void CAttribWidget::changeUseScheme(int index)
void CAttribWidget::openSchemeBankDialog() void CAttribWidget::openSchemeBankDialog()
{ {
CSchemeBankDialog *dialog = new CSchemeBankDialog(this); CSchemeBankDialog dialog(this);
dialog->setModal(true); dialog.setModal(true);
dialog->show(); dialog.show();
dialog->exec(); dialog.exec();
delete dialog; updateUi();
//updateUi();
} }
void CAttribWidget::inputValueUpdate(void) void CAttribWidget::inputValueUpdate(void)

View file

@ -58,7 +58,7 @@ public:
/// Force to update dialog content /// Force to update dialog content
void updateUi(); void updateUi();
/// Сonnects all the slots with signals /// Connects all the slots with signals
void init(); void init();
/// Sets the pointer CWorkspaceNode* in the wrappers. /// Sets the pointer CWorkspaceNode* in the wrappers.
@ -192,6 +192,7 @@ protected:
QDialog *_SchemeWidget; QDialog *_SchemeWidget;
Ui::CAttribWidget _ui; Ui::CAttribWidget _ui;
friend class CSchemeBankDialog;
}; /* class CAttribWidget */ }; /* class CAttribWidget */
/** /**

View file

@ -73,11 +73,14 @@ void CParticleEditor::release()
{ {
stop(); stop();
closeWorkspace(); closeWorkspace();
delete _SchemeManager;
} }
void CParticleEditor::setActiveNode(CWorkspaceNode *node) void CParticleEditor::setActiveNode(CWorkspaceNode *node)
{ {
if (node == _ActiveNode) return; if (node == _ActiveNode) return;
if (node == 0)
_ActiveNode->getPSModel()->hide();
_ActiveNode = node; _ActiveNode = node;
bool wasRunning = _State == State::RunningSingle; bool wasRunning = _State == State::RunningSingle;

View file

@ -378,6 +378,7 @@ void CParticleWorkspace::removeNode(uint index)
{ {
nlassert(index < _Nodes.size()); nlassert(index < _Nodes.size());
_Nodes[index] = NULL; // delete the smart-ptr target _Nodes[index] = NULL; // delete the smart-ptr target
delete _Nodes[index];
_Nodes.erase(_Nodes.begin() + index); _Nodes.erase(_Nodes.begin() + index);
touch(); touch();
} }

View file

@ -305,6 +305,8 @@ void CParticleWorkspaceDialog::customContextMenu()
_instanciateAction->setEnabled(stopped); _instanciateAction->setEnabled(stopped);
_savePSAction->setEnabled(stopped); _savePSAction->setEnabled(stopped);
_saveAsPSAction->setEnabled(stopped); _saveAsPSAction->setEnabled(stopped);
_removeFromWSAction->setEnabled(stopped);
_clearContentAction->setEnabled(stopped);
popurMenu->exec(QCursor::pos()); popurMenu->exec(QCursor::pos());
delete popurMenu; delete popurMenu;
@ -369,13 +371,14 @@ void CParticleWorkspaceDialog::clearContent()
void CParticleWorkspaceDialog::removePS() void CParticleWorkspaceDialog::removePS()
{ {
if (_treeModel->getOwnerNode(_currentItem) == Modules::psEdit().getActiveNode()) CWorkspaceNode *node = _currentItem->getNode();
if (node == Modules::psEdit().getActiveNode())
Modules::psEdit().setActiveNode(NULL); Modules::psEdit().setActiveNode(NULL);
QModelIndex index = _ui.treeView->currentIndex(); QModelIndex index = _ui.treeView->currentIndex();
_ui.treeView->setCurrentIndex(index.parent()); _ui.treeView->setCurrentIndex(index.parent());
clickedItem(index.parent()); clickedItem(index.parent());
Modules::psEdit().getParticleWorkspace()->removeNode(static_cast<CParticleTreeItem *>(index.internalPointer())->getNode()); Modules::psEdit().getParticleWorkspace()->removeNode(node);
_treeModel->removeRows(index.row(), index.parent()); _treeModel->removeRows(index.row(), index.parent());
} }

View file

@ -1,24 +1,33 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version. // License, or (at your option) any later version.
// //
// This program is distributed in the hope that it will be useful, // This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of // but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details. // GNU Affero General Public License for more details.
// //
// You should have received a copy of the GNU Affero General Public License // You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
// Project includes // Project includes
#include "stdpch.h" #include "stdpch.h"
#include "scheme_bank_dialog.h" #include "scheme_bank_dialog.h"
#include "scheme_manager.h"
#include "modules.h" #include "modules.h"
// NeL includes
#include <nel/misc/file.h>
// Qt includes
#include <QFileDialog>
#include <QInputDialog>
#include <QMessageBox>
namespace NLQT namespace NLQT
{ {
@ -27,6 +36,16 @@ CSchemeBankDialog::CSchemeBankDialog(CAttribWidget *attribWidget, QWidget *paren
{ {
_ui.setupUi(this); _ui.setupUi(this);
_attribWidget = attribWidget; _attribWidget = attribWidget;
connect(_ui.createButton, SIGNAL(clicked()), this, SLOT(createScheme()));
connect(_ui.currentButton, SIGNAL(clicked()), this, SLOT(setCurrentScheme()));
connect(_ui.removeButton, SIGNAL(clicked()), this, SLOT(removeScheme()));
connect(_ui.loadButton, SIGNAL(clicked()), this, SLOT(loadBank()));
connect(_ui.saveButton, SIGNAL(clicked()), this, SLOT(saveBank()));
connect(_ui.listWidget, SIGNAL(itemSelectionChanged()), this, SLOT(enableButtons()));
connect(_ui.listWidget, SIGNAL(itemChanged(QListWidgetItem *)), this, SLOT(changeNameScheme(QListWidgetItem *)));
buildList();
} }
CSchemeBankDialog::~CSchemeBankDialog() CSchemeBankDialog::~CSchemeBankDialog()
@ -35,27 +54,125 @@ CSchemeBankDialog::~CSchemeBankDialog()
void CSchemeBankDialog::createScheme() void CSchemeBankDialog::createScheme()
{ {
bool ok;
QString text = QInputDialog::getText(this, tr("Insert new scheme"),
tr("Set name:"), QLineEdit::Normal,
"new scheme", &ok);
if (ok && !text.isEmpty())
{
NL3D::CPSAttribMakerBase *attribMakerBase = _attribWidget->getCurrentSchemePtr()->clone();
Modules::psEdit().getSchemeManager()->insertScheme(text.toStdString(), attribMakerBase);
CSchemeItem *item = new CSchemeItem(text, _ui.listWidget);
item->setUserData(attribMakerBase);
item->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
}
} }
void CSchemeBankDialog::setCurrentScheme() void CSchemeBankDialog::setCurrentScheme()
{ {
//SchemeManager.insertScheme(cn.getName(), getCurrentSchemePtr()->clone()); CSchemeItem *item = dynamic_cast<CSchemeItem *>(_ui.listWidget->currentItem());
NL3D::CPSAttribMakerBase *attrib = item->getUserData();
nlassert(attrib);
_attribWidget->setCurrentSchemePtr(attrib->clone());
_attribWidget->updateUi();
} }
void CSchemeBankDialog::removeScheme() void CSchemeBankDialog::removeScheme()
{ {
CSchemeItem *item = dynamic_cast<CSchemeItem *>(_ui.listWidget->currentItem());
NL3D::CPSAttribMakerBase *attrib = item->getUserData();
nlassert(attrib);
Modules::psEdit().getSchemeManager()->remove(attrib);
_ui.listWidget->removeItemWidget(item);
delete item;
if (_ui.listWidget->count() == 0)
{
_ui.currentButton->setEnabled(false);
_ui.removeButton->setEnabled(false);
}
} }
void CSchemeBankDialog::saveBank() void CSchemeBankDialog::saveBank()
{ {
QString fileName = QFileDialog::getSaveFileName(this,
tr("Save scheme bank file"), ".",
tr("Scheme bank files (*.scb)"));
if (!fileName.isEmpty())
{
try
{
NLMISC::COFile iF;
iF.open(fileName.toStdString());
NLQT::CSchemeManager *schemeManager = Modules::psEdit().getSchemeManager();
iF.serial(*schemeManager);
}
catch (std::exception &e)
{
QMessageBox::critical(this, "Scheme manager", tr("Error saving scheme bank : %1").arg(e.what()));
return;
}
}
} }
void CSchemeBankDialog::loadBank() void CSchemeBankDialog::loadBank()
{ {
QString fileName = QFileDialog::getOpenFileName(this,
tr("Open scheme bank file"), ".",
tr("Scheme bank files (*.scb)"));
if (!fileName.isEmpty())
{
NLQT::CSchemeManager sm;
try
{
NLMISC::CIFile iF;
iF.open(fileName.toStdString());
iF.serial(sm);
Modules::psEdit().getSchemeManager()->swap(sm);
}
catch (std::exception &e)
{
QMessageBox::critical(this, "Scheme manager", tr("Error loading scheme bank : %1").arg(e.what()));
return;
}
buildList();
}
} }
void CSchemeBankDialog::buildList() void CSchemeBankDialog::changeNameScheme(QListWidgetItem *item)
{ {
CSchemeItem *schemeItem = dynamic_cast<CSchemeItem *>(item);
NL3D::CPSAttribMakerBase *attrib = schemeItem->getUserData();
nlassert(attrib);
Modules::psEdit().getSchemeManager()->rename(attrib, item->text().toStdString());
}
void CSchemeBankDialog::enableButtons()
{
_ui.currentButton->setEnabled(true);
_ui.removeButton->setEnabled(true);
}
void CSchemeBankDialog::buildList()
{
_ui.listWidget->clear();
typedef std::vector<NLQT::CSchemeManager::TSchemeInfo> TSchemeVect;
static TSchemeVect schemes;
Modules::psEdit().getSchemeManager()->getSchemes(_attribWidget->getCurrentSchemePtr()->getType(), schemes);
for (TSchemeVect::const_iterator it = schemes.begin(); it != schemes.end(); ++it)
{
CSchemeItem *item = new CSchemeItem(it->first.c_str(), _ui.listWidget);
item->setUserData(it->second);
item->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled);
}
} }
} /* namespace NLQT */ } /* namespace NLQT */

View file

@ -1,17 +1,17 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/> // NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited // Copyright (C) 2010 Winch Gate Property Limited
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as // it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the // published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version. // License, or (at your option) any later version.
// //
// This program is distributed in the hope that it will be useful, // This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of // but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details. // GNU Affero General Public License for more details.
// //
// You should have received a copy of the GNU Affero General Public License // You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef SCHEME_BANK_DIALOG_H #ifndef SCHEME_BANK_DIALOG_H
@ -27,12 +27,37 @@
#include "nel/3d/particle_system.h" #include "nel/3d/particle_system.h"
// Project includes // Project includes
#include "attrib_widget.h"
#include "ps_wrapper.h" #include "ps_wrapper.h"
namespace NLQT namespace NLQT
{ {
class CAttribWidget; class CAttribWidget;
/**
@class CSchemeItem
@brief Contain pointer to NL3D::CPSAttribMakerBase.
*/
class CSchemeItem: public QListWidgetItem
{
public:
CSchemeItem(const QString &text, QListWidget *parent = 0, int type = UserType ):
QListWidgetItem(text, parent, type), _attrib(NULL) {}
void setUserData(NL3D::CPSAttribMakerBase *attrib)
{
_attrib = attrib;
}
NL3D::CPSAttribMakerBase *getUserData() const
{
return _attrib;
}
private:
NL3D::CPSAttribMakerBase *_attrib;
}; /* class CSchemeItem */
class CSchemeBankDialog: public QDialog class CSchemeBankDialog: public QDialog
{ {
Q_OBJECT Q_OBJECT
@ -47,9 +72,11 @@ private Q_SLOTS:
void removeScheme(); void removeScheme();
void saveBank(); void saveBank();
void loadBank(); void loadBank();
void enableButtons();
void changeNameScheme(QListWidgetItem *item);
private: private:
void buildList(); void buildList();
CAttribWidget *_attribWidget; CAttribWidget *_attribWidget;
Ui::CSchemeBankDialog _ui; Ui::CSchemeBankDialog _ui;

View file

@ -14,31 +14,27 @@
<string>Sceme bank</string> <string>Sceme bank</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" rowspan="8"> <item row="0" column="0" rowspan="7">
<widget class="QListWidget" name="listWidget"/> <widget class="QListWidget" name="listWidget"/>
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QPushButton" name="createButton"> <widget class="QPushButton" name="createButton">
<property name="text"> <property name="text">
<string>Create</string> <string>Put current</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="1"> <item row="3" column="1">
<widget class="QPushButton" name="renameButton">
<property name="text">
<string>Rename</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QPushButton" name="removeButton"> <widget class="QPushButton" name="removeButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text"> <property name="text">
<string>Remove</string> <string>Remove</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="1"> <item row="4" column="1">
<spacer name="verticalSpacer"> <spacer name="verticalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
@ -51,24 +47,33 @@
</property> </property>
</spacer> </spacer>
</item> </item>
<item row="6" column="1"> <item row="5" column="1">
<widget class="QPushButton" name="loadButton"> <widget class="QPushButton" name="loadButton">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text"> <property name="text">
<string>Load bank</string> <string>Load bank</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="7" column="1"> <item row="6" column="1">
<widget class="QPushButton" name="saveButton"> <widget class="QPushButton" name="saveButton">
<property name="enabled">
<bool>true</bool>
</property>
<property name="text"> <property name="text">
<string>Save bank</string> <string>Save bank</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="8" column="0" colspan="2"> <item row="7" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<widget class="QLabel" name="label"> <widget class="QLabel" name="label">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
@ -105,7 +110,10 @@
</layout> </layout>
</item> </item>
<item row="2" column="1"> <item row="2" column="1">
<widget class="QPushButton" name="setCurrentButton"> <widget class="QPushButton" name="currentButton">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text"> <property name="text">
<string>Set current</string> <string>Set current</string>
</property> </property>

View file

@ -18,7 +18,7 @@
#include "scheme_manager.h" #include "scheme_manager.h"
#include "nel/3d/ps_attrib_maker.h" #include "nel/3d/ps_attrib_maker.h"
namespace NLQT namespace NLQT
{ {
CSchemeManager::~CSchemeManager() CSchemeManager::~CSchemeManager()
@ -34,7 +34,7 @@ void CSchemeManager::insertScheme(const std::string &name, NL3D::CPSAttribMakerB
{ {
nlassert(scheme); nlassert(scheme);
TSchemeInfo si(std::string(name), scheme); TSchemeInfo si(std::string(name), scheme);
_SchemeMap.insert(TSchemeMap::value_type(std::string(scheme->getType()), si)); _SchemeMap.insert(TSchemeMap::value_type(std::string(scheme->getType()), si));
} }
void CSchemeManager::getSchemes(const std::string &type, std::vector<TSchemeInfo> &dest) void CSchemeManager::getSchemes(const std::string &type, std::vector<TSchemeInfo> &dest)
@ -49,30 +49,30 @@ void CSchemeManager::getSchemes(const std::string &type, std::vector<TSchemeInfo
void CSchemeManager::serial(NLMISC::IStream &f) throw(NLMISC::EStream) void CSchemeManager::serial(NLMISC::IStream &f) throw(NLMISC::EStream)
{ {
f.serialCheck((uint32) '_GNM'); f.serialCheck((uint32) '_GNM');
f.serialCheck((uint32) 'MHCS'); f.serialCheck((uint32) 'MHCS');
f.serialVersion(1); f.serialVersion(1);
if (!f.isReading()) if (!f.isReading())
{ {
sint32 size = (sint32)_SchemeMap.size(); sint32 size = (sint32)_SchemeMap.size();
f.serial(size); f.serial(size);
for (TSchemeMap::iterator smIt = _SchemeMap.begin(); smIt != _SchemeMap.end(); ++smIt) for (TSchemeMap::iterator smIt = _SchemeMap.begin(); smIt != _SchemeMap.end(); ++smIt)
{ {
f.serial(smIt->second.first); // name f.serial(smIt->second.first); // name
f.serialPolyPtr(smIt->second.second); // scheme f.serialPolyPtr(smIt->second.second); // scheme
} }
} }
else else
{ {
_SchemeMap.clear(); _SchemeMap.clear();
std::string name; std::string name;
NL3D::CPSAttribMakerBase *scheme = NULL; NL3D::CPSAttribMakerBase *scheme = NULL;
sint32 size; sint32 size;
f.serial(size); f.serial(size);
for (sint32 k = 0; k < size; ++k) for (sint32 k = 0; k < size; ++k)
{ {
f.serial(name); f.serial(name);
f.serialPolyPtr(scheme); f.serialPolyPtr(scheme);
insertScheme(name, scheme); insertScheme(name, scheme);
@ -80,12 +80,12 @@ void CSchemeManager::serial(NLMISC::IStream &f) throw(NLMISC::EStream)
} }
} }
void CSchemeManager::swap(CSchemeManager &other) void CSchemeManager::swap(CSchemeManager &other)
{ {
this->_SchemeMap.swap(other._SchemeMap); this->_SchemeMap.swap(other._SchemeMap);
} }
void CSchemeManager::remove(NL3D::CPSAttribMakerBase *am) void CSchemeManager::remove(NL3D::CPSAttribMakerBase *am)
{ {
TSchemeMap::iterator smIt; TSchemeMap::iterator smIt;
for (smIt = _SchemeMap.begin(); smIt != _SchemeMap.end(); ++smIt) for (smIt = _SchemeMap.begin(); smIt != _SchemeMap.end(); ++smIt)
@ -101,7 +101,7 @@ void CSchemeManager::remove(NL3D::CPSAttribMakerBase *am)
} }
// rename a scheme, given a pointer on it // rename a scheme, given a pointer on it
void CSchemeManager::rename(NL3D::CPSAttribMakerBase *am, const std::string &newName) void CSchemeManager::rename(NL3D::CPSAttribMakerBase *am, const std::string &newName)
{ {
TSchemeMap::iterator smIt; TSchemeMap::iterator smIt;
for (smIt = _SchemeMap.begin(); smIt != _SchemeMap.end(); ++smIt) for (smIt = _SchemeMap.begin(); smIt != _SchemeMap.end(); ++smIt)
@ -110,7 +110,7 @@ void CSchemeManager::rename(NL3D::CPSAttribMakerBase *am, const std::string &ne
} }
if (smIt != _SchemeMap.end()) if (smIt != _SchemeMap.end())
{ {
smIt->second.first = newName; smIt->second.first = newName;
} }
} }

View file

@ -10,25 +10,23 @@ SET(OVQT_EXT_SYS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin.
${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_spec.h) ${CMAKE_CURRENT_SOURCE_DIR}/../../extension_system/iplugin_spec.h)
SET(OVQT_PLUG_TRANSLATION_MANAGER_HDR translation_manager_plugin.h SET(OVQT_PLUG_TRANSLATION_MANAGER_HDR translation_manager_plugin.h
translation_manager_main_window.h translation_manager_main_window.h
translation_manager_settings_page.h translation_manager_settings_page.h
translation_manager_editor.h translation_manager_editor.h
source_selection.h source_selection.h
ftp_selection.h ftp_selection.h
editor_worksheet.h editor_worksheet.h
editor_phrase.h editor_phrase.h
extract_new_sheet_names.h )
extract_bot_names.h)
SET(OVQT_PLUG_TRANSLATION_MANAGER_UIS translation_manager_settings_page.ui SET(OVQT_PLUG_TRANSLATION_MANAGER_UIS translation_manager_settings_page.ui
translation_manager_main_window.ui translation_manager_main_window.ui
source_selection.ui source_selection.ui
ftp_selection.ui) ftp_selection.ui)
SET(OVQT_PLUG_TRANSLATION_MANAGER_RCS ftp_selection.qrc) SET(OVQT_PLUG_TRANSLATION_MANAGER_RCS ftp_selection.qrc)
SET(QT_USE_QTGUI TRUE) SET(QT_USE_QTGUI TRUE)
SET(QT_USE_QTOPENGL TRUE)
SET(QT_USE_QTNETWORK TRUE) SET(QT_USE_QTNETWORK TRUE)
QT4_WRAP_CPP(OVQT_PLUG_TRANSLATION_MANAGER_MOC_SRC ${OVQT_PLUG_TRANSLATION_MANAGER_HDR}) QT4_WRAP_CPP(OVQT_PLUG_TRANSLATION_MANAGER_MOC_SRC ${OVQT_PLUG_TRANSLATION_MANAGER_HDR})
@ -42,7 +40,7 @@ SOURCE_GROUP("OVQT Extension System" FILES ${OVQT_EXT_SYS_SRC})
ADD_LIBRARY(ovqt_plugin_translation_manager MODULE ${SRC} ${OVQT_PLUG_TRANSLATION_MANAGER_MOC_SRC} ${OVQT_EXT_SYS_SRC} ${OVQT_PLUG_TRANSLATION_MANAGER_UI_HDRS}) ADD_LIBRARY(ovqt_plugin_translation_manager MODULE ${SRC} ${OVQT_PLUG_TRANSLATION_MANAGER_MOC_SRC} ${OVQT_EXT_SYS_SRC} ${OVQT_PLUG_TRANSLATION_MANAGER_UI_HDRS})
TARGET_LINK_LIBRARIES(ovqt_plugin_translation_manager ovqt_plugin_core nelmisc nel3d nelligo nelgeorges ${QT_LIBRARIES} ${QT_QTOPENGL_LIBRARY} ${QT_QTNETWORK_LIBRARY} ) TARGET_LINK_LIBRARIES(ovqt_plugin_translation_manager ovqt_plugin_core nelmisc nelligo nelgeorges ${QT_LIBRARIES} ${QT_QTOPENGL_LIBRARY} ${QT_QTNETWORK_LIBRARY} )
NL_DEFAULT_PROPS(ovqt_plugin_translation_manager "NeL, Tools, 3D: Object Viewer Qt Plugin: Translation Manager") NL_DEFAULT_PROPS(ovqt_plugin_translation_manager "NeL, Tools, 3D: Object Viewer Qt Plugin: Translation Manager")
NL_ADD_RUNTIME_FLAGS(ovqt_plugin_translation_manager) NL_ADD_RUNTIME_FLAGS(ovqt_plugin_translation_manager)

View file

@ -1,5 +1,4 @@
// Translation Manager Plugin - OVQT Plugin <http://dev.ryzom.com/projects/nel/> // Translation Manager Plugin - OVQT Plugin <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
// Copyright (C) 2011 Emanuel Costea <cemycc@gmail.com> // Copyright (C) 2011 Emanuel Costea <cemycc@gmail.com>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
@ -15,32 +14,32 @@
// You should have received a copy of the GNU Affero General Public License // You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
// Project includes
#include "editor_phrase.h"
#include "translation_manager_constants.h"
// Nel includes // Nel includes
#include "nel/misc/path.h" #include "nel/misc/path.h"
#include "nel/misc/diff_tool.h" #include "nel/misc/diff_tool.h"
// Qt includes // Qt includes
#include <QtCore/QFileInfo>
#include <QtCore/QByteArray>
#include <QtCore/QTextCodec>
#include <QtCore/QTextStream>
#include <QtGui/QTextCursor>
#include <QtGui/QErrorMessage> #include <QtGui/QErrorMessage>
#include <QtCore/qfileinfo.h>
#include <QtGui/QMessageBox> #include <QtGui/QMessageBox>
#include <QtGui/QCloseEvent> #include <QtGui/QCloseEvent>
#include <QtCore/QByteArray>
#include <QtCore/qtextcodec.h>
#include <QtGui/QTextCursor>
#include <QtCore/qtextstream.h>
#include <QtCore/qtextcodec.h>
// Project includes
#include "editor_phrase.h"
#include "translation_manager_constants.h"
using namespace std; using namespace std;
namespace TranslationManager { namespace TranslationManager
{
void CEditorPhrase::open(QString filename) void CEditorPhrase::open(QString filename)
{ {
vector<STRING_MANAGER::TPhrase> phrases; std::vector<STRING_MANAGER::TPhrase> phrases;
if(readPhraseFile(filename.toStdString(), phrases, false)) if(readPhraseFile(filename.toStdString(), phrases, false))
{ {
text_edit = new CTextEdit(this); text_edit = new CTextEdit(this);
@ -53,26 +52,28 @@ void CEditorPhrase::open(QString filename)
QFile file(filename); QFile file(filename);
file.open(QIODevice::ReadOnly | QIODevice::Text); file.open(QIODevice::ReadOnly | QIODevice::Text);
QTextStream in(&file); QTextStream in(&file);
// set the file content to the text edit // set the file content to the text edit
QString data = in.readAll(); QString data = in.readAll();
text_edit->append(data); text_edit->append(data);
// window settings // window settings
setCurrentFile(filename); setCurrentFile(filename);
setAttribute(Qt::WA_DeleteOnClose); setAttribute(Qt::WA_DeleteOnClose);
editor_type = Constants::ED_PHRASE; editor_type = Constants::ED_PHRASE;
current_file = filename; current_file = filename;
connect(text_edit->document(), SIGNAL(contentsChanged()), this, SLOT(docContentsChanged())); connect(text_edit->document(), SIGNAL(contentsChanged()), this, SLOT(docContentsChanged()));
connect(text_edit->document(), SIGNAL(undoCommandAdded()), this, SLOT(newUndoCommandAdded())); connect(text_edit->document(), SIGNAL(undoCommandAdded()), this, SLOT(newUndoCommandAdded()));
} else { }
QErrorMessage error; else
error.showMessage("This file is not a phrase file."); {
error.exec(); QErrorMessage error;
} error.showMessage("This file is not a phrase file.");
error.exec();
}
} }
void CEditorPhrase::newUndoCommandAdded() void CEditorPhrase::newUndoCommandAdded()
{ {
current_stack->push(new CUndoPhraseNewCommand(text_edit)); current_stack->push(new CUndoPhraseNewCommand(text_edit));
} }
void CEditorPhrase::docContentsChanged() void CEditorPhrase::docContentsChanged()
@ -97,44 +98,37 @@ void CEditorPhrase::saveAs(QString filename)
QTextStream out(&file); QTextStream out(&file);
out.setCodec("UTF-8"); out.setCodec("UTF-8");
out.setGenerateByteOrderMark(true); out.setGenerateByteOrderMark(true);
out<<text_edit->toPlainText(); out << text_edit->toPlainText();
current_file = filename; current_file = filename;
setCurrentFile(current_file); setCurrentFile(current_file);
} }
void CEditorPhrase::closeEvent(QCloseEvent *event) void CEditorPhrase::closeEvent(QCloseEvent *event)
{ {
if(isWindowModified()) if(isWindowModified())
{ {
QMessageBox msgBox; QMessageBox msgBox;
msgBox.setText("The document has been modified."); msgBox.setIcon(QMessageBox::Question);
msgBox.setInformativeText("Do you want to save your changes?"); msgBox.setText(tr("The document has been modified."));
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); msgBox.setInformativeText(tr("Do you want to save your changes?"));
msgBox.setDefaultButton(QMessageBox::Save); msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
int ret = msgBox.exec(); msgBox.setDefaultButton(QMessageBox::Save);
switch (ret)
{ int ret = msgBox.exec();
case QMessageBox::Save: switch (ret)
save(); {
event->accept(); case QMessageBox::Save:
close(); save();
break; break;
case QMessageBox::Discard: case QMessageBox::Discard:
event->accept(); break;
close(); case QMessageBox::Cancel:
break; event->ignore();
case QMessageBox::Cancel: return;
event->ignore(); }
break; }
default: event->accept();
break; close();
}
} else {
event->accept();
close();
}
} }
} }

View file

@ -18,6 +18,9 @@
#ifndef EDITOR_PHRASE_H #ifndef EDITOR_PHRASE_H
#define EDITOR_PHRASE_H #define EDITOR_PHRASE_H
// Project includes
#include "translation_manager_editor.h"
// Qt includes // Qt includes
#include <QtCore/QObject> #include <QtCore/QObject>
#include <QtCore/QFile> #include <QtCore/QFile>
@ -32,23 +35,23 @@
#include <QtGui/QErrorMessage> #include <QtGui/QErrorMessage>
#include <QKeyEvent> #include <QKeyEvent>
// Project includes namespace TranslationManager
#include "translation_manager_editor.h" {
namespace TranslationManager {
class CTextEdit : public QTextEdit class CTextEdit : public QTextEdit
{ {
Q_OBJECT Q_OBJECT
private: private:
QUndoStack* m_undoStack; QUndoStack *m_undoStack;
public: public:
CTextEdit(QWidget* parent = 0) : QTextEdit(parent) CTextEdit(QWidget *parent = 0) : QTextEdit(parent)
{ {
setUndoRedoEnabled(true); setUndoRedoEnabled(true);
} }
//void keyPressEvent(QKeyEvent *event); //void keyPressEvent(QKeyEvent *event);
void setUndoStack(QUndoStack* undoStack) void setUndoStack(QUndoStack *undoStack)
{ {
m_undoStack = undoStack; m_undoStack = undoStack;
} }
@ -57,20 +60,22 @@ public:
class CEditorPhrase : public CEditor class CEditorPhrase : public CEditor
{ {
Q_OBJECT Q_OBJECT
public: public:
CTextEdit *text_edit; CEditorPhrase(QMdiArea *parent) : CEditor(parent) {}
public: CEditorPhrase() : CEditor() {}
CEditorPhrase(QMdiArea* parent) : CEditor(parent) {} void open(QString filename);
CEditorPhrase() : CEditor() {} void save();
void open(QString filename); void saveAs(QString filename);
void save(); void activateWindow();
void saveAs(QString filename);
void activateWindow();
void closeEvent(QCloseEvent *event); void closeEvent(QCloseEvent *event);
public Q_SLOTS: public Q_SLOTS:
void docContentsChanged(); void docContentsChanged();
void newUndoCommandAdded(); void newUndoCommandAdded();
private:
CTextEdit *text_edit;
}; };
class CUndoPhraseNewCommand : public QUndoCommand class CUndoPhraseNewCommand : public QUndoCommand
@ -79,7 +84,7 @@ public:
CUndoPhraseNewCommand(CTextEdit *textEdit, QUndoCommand *parent = 0) CUndoPhraseNewCommand(CTextEdit *textEdit, QUndoCommand *parent = 0)
: QUndoCommand("Inserting/Removing characters", parent), : QUndoCommand("Inserting/Removing characters", parent),
m_textEdit(textEdit) m_textEdit(textEdit)
{ } {}
~CUndoPhraseNewCommand() {} ~CUndoPhraseNewCommand() {}
@ -92,96 +97,102 @@ public:
{ {
m_textEdit->redo(); m_textEdit->redo();
} }
private: private:
CTextEdit* m_textEdit; CTextEdit *m_textEdit;
}; };
class SyntaxHighlighter : public QSyntaxHighlighter class SyntaxHighlighter : public QSyntaxHighlighter
{ {
public: public:
SyntaxHighlighter(QTextEdit *parent) : QSyntaxHighlighter(parent) SyntaxHighlighter(QTextEdit *parent) : QSyntaxHighlighter(parent)
{ {
HighlightingRule rule; HighlightingRule rule;
translateStringFormat.setFontWeight(QFont::Bold); translateStringFormat.setFontWeight(QFont::Bold);
translateStringFormat.setForeground(Qt::darkMagenta); translateStringFormat.setForeground(Qt::darkMagenta);
rule.pattern = QRegExp("\\[.+\\]"); rule.pattern = QRegExp("\\[.+\\]");
rule.format = translateStringFormat; rule.format = translateStringFormat;
highlightingRules.append(rule); highlightingRules.append(rule);
singleLineCommentFormat.setForeground(Qt::red);
rule.pattern = QRegExp("//[^\n]*");
rule.format = singleLineCommentFormat;
highlightingRules.append(rule);
singleLineCommentFormat.setForeground(Qt::red); multiLineCommentFormat.setForeground(Qt::red);
rule.pattern = QRegExp("//[^\n]*");
rule.format = singleLineCommentFormat;
highlightingRules.append(rule);
multiLineCommentFormat.setForeground(Qt::red); quotationFormat.setForeground(Qt::darkGreen);
rule.pattern = QRegExp("\".*\"");
rule.format = quotationFormat;
highlightingRules.append(rule);
quotationFormat.setForeground(Qt::darkGreen); functionFormat.setFontItalic(true);
rule.pattern = QRegExp("\".*\""); functionFormat.setForeground(Qt::blue);
rule.format = quotationFormat; rule.pattern = QRegExp("\\(.+\\)");
highlightingRules.append(rule); rule.format = functionFormat;
highlightingRules.append(rule);
functionFormat.setFontItalic(true); commentStartExpression = QRegExp("/\\*");
functionFormat.setForeground(Qt::blue); commentEndExpression = QRegExp("\\*/");
rule.pattern = QRegExp("\\(.+\\)");
rule.format = functionFormat;
highlightingRules.append(rule);
commentStartExpression = QRegExp("/\\*");
commentEndExpression = QRegExp("\\*/");
} }
void highlightBlock(const QString &text) void highlightBlock(const QString &text)
{ {
Q_FOREACH(const HighlightingRule &rule, highlightingRules) { Q_FOREACH(const HighlightingRule &rule, highlightingRules)
QRegExp expression(rule.pattern); {
int index = expression.indexIn(text); QRegExp expression(rule.pattern);
while (index >= 0) { int index = expression.indexIn(text);
int length = expression.matchedLength(); while (index >= 0)
setFormat(index, length, rule.format); {
index = expression.indexIn(text, index + length); int length = expression.matchedLength();
} setFormat(index, length, rule.format);
} index = expression.indexIn(text, index + length);
setCurrentBlockState(0); }
}
setCurrentBlockState(0);
int startIndex = 0; int startIndex = 0;
if (previousBlockState() != 1) if (previousBlockState() != 1)
startIndex = commentStartExpression.indexIn(text); startIndex = commentStartExpression.indexIn(text);
while (startIndex >= 0) { while (startIndex >= 0)
int endIndex = commentEndExpression.indexIn(text, startIndex); {
int commentLength; int endIndex = commentEndExpression.indexIn(text, startIndex);
if (endIndex == -1) { int commentLength;
setCurrentBlockState(1); if (endIndex == -1)
commentLength = text.length() - startIndex; {
} else { setCurrentBlockState(1);
commentLength = endIndex - startIndex commentLength = text.length() - startIndex;
+ commentEndExpression.matchedLength(); }
} else
setFormat(startIndex, commentLength, multiLineCommentFormat); {
startIndex = commentStartExpression.indexIn(text, startIndex + commentLength); commentLength = endIndex - startIndex
} + commentEndExpression.matchedLength();
} }
setFormat(startIndex, commentLength, multiLineCommentFormat);
startIndex = commentStartExpression.indexIn(text, startIndex + commentLength);
}
}
private: private:
struct HighlightingRule struct HighlightingRule
{ {
QRegExp pattern; QRegExp pattern;
QTextCharFormat format; QTextCharFormat format;
}; };
QVector<HighlightingRule> highlightingRules; QVector<HighlightingRule> highlightingRules;
QRegExp commentStartExpression; QRegExp commentStartExpression;
QRegExp commentEndExpression; QRegExp commentEndExpression;
QTextCharFormat keywordFormat; QTextCharFormat keywordFormat;
QTextCharFormat classFormat; QTextCharFormat classFormat;
QTextCharFormat singleLineCommentFormat; QTextCharFormat singleLineCommentFormat;
QTextCharFormat multiLineCommentFormat; QTextCharFormat multiLineCommentFormat;
QTextCharFormat quotationFormat; QTextCharFormat quotationFormat;
QTextCharFormat functionFormat; QTextCharFormat functionFormat;
QTextCharFormat translateStringFormat; QTextCharFormat translateStringFormat;
}; };
} }

View file

@ -15,6 +15,11 @@
// You should have received a copy of the GNU Affero General Public License // You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
// Project includes
#include "editor_worksheet.h"
#include "extract_bot_names.h"
#include "translation_manager_constants.h"
// Qt includes // Qt includes
#include <QtGui/QErrorMessage> #include <QtGui/QErrorMessage>
#include <QtGui/QTableWidgetItem> #include <QtGui/QTableWidgetItem>
@ -24,97 +29,103 @@
#include <QtGui/QAction> #include <QtGui/QAction>
#include <QtGui/QMenu> #include <QtGui/QMenu>
// Project includes
#include "editor_worksheet.h"
#include "extract_bot_names.h"
#include "translation_manager_constants.h"
#include <set>
using namespace std; using namespace std;
namespace TranslationManager { namespace TranslationManager
{
void CEditorWorksheet::open(QString filename) void CEditorWorksheet::open(QString filename)
{ {
STRING_MANAGER::TWorksheet wk_file; STRING_MANAGER::TWorksheet wk_file;
if(loadExcelSheet(filename.toStdString(), wk_file, true) == true) if(loadExcelSheet(filename.toStdString(), wk_file, true) == true)
{ {
bool hasHashValue = false; bool hasHashValue = false;
table_editor = new QTableWidget(); table_editor = new QTableWidget();
if(wk_file.getData(0, 0) == ucstring("*HASH_VALUE")) if(wk_file.getData(0, 0) == ucstring("*HASH_VALUE"))
{ {
table_editor->setColumnCount(wk_file.ColCount - 1); table_editor->setColumnCount(wk_file.ColCount - 1);
hasHashValue = true; hasHashValue = true;
} else { }
table_editor->setColumnCount(wk_file.ColCount); else
} {
table_editor->setRowCount(wk_file.size() - 1); table_editor->setColumnCount(wk_file.ColCount);
}
// read columns name table_editor->setRowCount(wk_file.size() - 1);
for(unsigned int i = 0; i < wk_file.ColCount; i++)
{ // read columns name
if(hasHashValue && i == 0) for(uint i = 0; i < wk_file.ColCount; i++)
{ {
// we don't show the column with hash value if(hasHashValue && i == 0)
} else { {
QTableWidgetItem *col = new QTableWidgetItem(); // we don't show the column with hash value
ucstring col_name = wk_file.getData(0, i); }
col->setText(QString(col_name.toString().c_str())); else
if(hasHashValue) {
{ QTableWidgetItem *col = new QTableWidgetItem();
table_editor->setHorizontalHeaderItem(i - 1, col); ucstring col_name = wk_file.getData(0, i);
} else { col->setText(QString(col_name.toString().c_str()));
table_editor->setHorizontalHeaderItem(i, col); if(hasHashValue)
} {
} table_editor->setHorizontalHeaderItem(i - 1, col);
} }
else
// read rows {
for(unsigned int i = 1; i < wk_file.size(); i++) table_editor->setHorizontalHeaderItem(i, col);
{ }
for(unsigned int j = 0; j < wk_file.ColCount; j++) }
{ }
if(hasHashValue && j == 0)
{ // read rows
// we don't show the column with hash value for(unsigned int i = 1; i < wk_file.size(); i++)
} else { {
QTableWidgetItem *row = new QTableWidgetItem(); for(unsigned int j = 0; j < wk_file.ColCount; j++)
ucstring row_value = wk_file.getData(i, j); {
row->setText(QString::fromUtf8(row_value.toUtf8().c_str())); if(hasHashValue && j == 0)
if(hasHashValue) {
{ // we don't show the column with hash value
table_editor->setItem(i - 1, j - 1, row); }
} else { else
table_editor->setItem(i - 1, j, row); {
} QTableWidgetItem *row = new QTableWidgetItem();
} ucstring row_value = wk_file.getData(i, j);
} row->setText(QString::fromUtf8(row_value.toUtf8().c_str()));
} if(hasHashValue)
setCurrentFile(filename); {
setAttribute(Qt::WA_DeleteOnClose); table_editor->setItem(i - 1, j - 1, row);
setWidget(table_editor); }
editor_type = Constants::ED_SHEET; else
table_editor->resizeColumnsToContents(); {
table_editor->resizeRowsToContents(); table_editor->setItem(i - 1, j, row);
// set editor signals }
connect(table_editor, SIGNAL(itemChanged(QTableWidgetItem*) ), this, SLOT(worksheetEditorChanged(QTableWidgetItem*))); }
connect(table_editor, SIGNAL(itemDoubleClicked(QTableWidgetItem*) ), this, SLOT(worksheetEditorCellEntered(QTableWidgetItem*))); }
connect (table_editor,SIGNAL(customContextMenuRequested(const QPoint &)), this,SLOT(contextMenuEvent(QContextMenuEvent*))); }
} else { setCurrentFile(filename);
QErrorMessage error; setAttribute(Qt::WA_DeleteOnClose);
error.showMessage("This file is not a worksheet file."); setWidget(table_editor);
error.exec(); editor_type = Constants::ED_SHEET;
} table_editor->resizeColumnsToContents();
table_editor->resizeRowsToContents();
// set editor signals
connect(table_editor, SIGNAL(itemChanged(QTableWidgetItem *) ), this, SLOT(worksheetEditorChanged(QTableWidgetItem *)));
connect(table_editor, SIGNAL(itemDoubleClicked(QTableWidgetItem *) ), this, SLOT(worksheetEditorCellEntered(QTableWidgetItem *)));
connect(table_editor,SIGNAL(customContextMenuRequested(const QPoint &)), this,SLOT(contextMenuEvent(QContextMenuEvent *)));
}
else
{
QErrorMessage error;
error.showMessage(tr("This file is not a worksheet file."));
error.exec();
}
} }
void CEditorWorksheet::contextMenuEvent(QContextMenuEvent *e) void CEditorWorksheet::contextMenuEvent(QContextMenuEvent *e)
{ {
QAction *insertRowAct = new QAction("Insert new row", this); QAction *insertRowAct = new QAction(tr("Insert new row"), this);
connect(insertRowAct, SIGNAL(triggered()), this, SLOT(insertRow())); connect(insertRowAct, SIGNAL(triggered()), this, SLOT(insertRow()));
QAction *deleteRowAct = new QAction("Delete row", this); QAction *deleteRowAct = new QAction(tr("Delete row"), this);
connect(deleteRowAct, SIGNAL(triggered()), this, SLOT(deleteRow())); connect(deleteRowAct, SIGNAL(triggered()), this, SLOT(deleteRow()));
QMenu *contextMenu = new QMenu(this); QMenu *contextMenu = new QMenu(this);
contextMenu->addAction(insertRowAct); contextMenu->addAction(insertRowAct);
@ -127,7 +138,7 @@ void CEditorWorksheet::contextMenuEvent(QContextMenuEvent *e)
void CEditorWorksheet::activateWindow() void CEditorWorksheet::activateWindow()
{ {
showMaximized(); showMaximized();
} }
void CEditorWorksheet::save() void CEditorWorksheet::save()
@ -137,372 +148,377 @@ void CEditorWorksheet::save()
void CEditorWorksheet::saveAs(QString filename) void CEditorWorksheet::saveAs(QString filename)
{ {
STRING_MANAGER::TWorksheet new_file, wk_file; STRING_MANAGER::TWorksheet new_file, wk_file;
loadExcelSheet(current_file.toStdString(), wk_file, true); loadExcelSheet(current_file.toStdString(), wk_file, true);
// set columns // set columns
new_file.resize(new_file.size() + 1); new_file.resize(new_file.size() + 1);
for(unsigned int i = 0; i < wk_file.ColCount; i++) for(unsigned int i = 0; i < wk_file.ColCount; i++)
{ {
ucstring col_name = wk_file.getData(0, i); ucstring col_name = wk_file.getData(0, i);
new_file.insertColumn(new_file.ColCount); new_file.insertColumn(new_file.ColCount);
new_file.setData(0, new_file.ColCount - 1, col_name); new_file.setData(0, new_file.ColCount - 1, col_name);
} }
// read all the rows from table // read all the rows from table
uint rowIdx; uint rowIdx;
uint colIdx = 0; uint colIdx = 0;
bool hasHashValue = false; bool hasHashValue = false;
if(wk_file.getData(0, 0) == ucstring("*HASH_VALUE")) if(wk_file.getData(0, 0) == ucstring("*HASH_VALUE"))
{ {
hasHashValue = true; hasHashValue = true;
colIdx = 1; colIdx = 1;
} }
for(int i = 0; i < table_editor->rowCount(); i++) for(int i = 0; i < table_editor->rowCount(); i++)
{ {
rowIdx = new_file.size(); rowIdx = new_file.size();
new_file.resize(new_file.size() + 1); new_file.resize(new_file.size() + 1);
ucstring tvalue; ucstring tvalue;
for(int j = 0; j < table_editor->columnCount(); j++) for(int j = 0; j < table_editor->columnCount(); j++)
{ {
QTableWidgetItem* item = table_editor->item(i, j); QTableWidgetItem *item = table_editor->item(i, j);
tvalue.fromUtf8(std::string(item->text().toUtf8())); tvalue.fromUtf8(std::string(item->text().toUtf8()));
new_file.setData(rowIdx, j + colIdx, tvalue); new_file.setData(rowIdx, j + colIdx, tvalue);
} }
} }
if(hasHashValue) if(hasHashValue)
{ {
// rewrite the hash codes // rewrite the hash codes
makeHashCode(wk_file, true); makeHashCode(wk_file, true);
} }
ucstring s = prepareExcelSheet(new_file); ucstring s = prepareExcelSheet(new_file);
NLMISC::CI18N::writeTextFile(filename.toStdString(), s, false); NLMISC::CI18N::writeTextFile(filename.toStdString(), s, false);
current_file = filename; current_file = filename;
setCurrentFile(filename); setCurrentFile(filename);
} }
void CEditorWorksheet::insertRow() void CEditorWorksheet::insertRow()
{ {
int last_row = table_editor->rowCount(); int last_row = table_editor->rowCount();
current_stack->push(new CUndoWorksheetNewCommand(table_editor, last_row)); current_stack->push(new CUndoWorksheetNewCommand(table_editor, last_row));
} }
void CEditorWorksheet::deleteRow() void CEditorWorksheet::deleteRow()
{ {
int selected_row = table_editor->currentRow(); int selected_row = table_editor->currentRow();
QMessageBox msgBox; QMessageBox msgBox;
msgBox.setText(tr("The row will be deleted.")); msgBox.setIcon(QMessageBox::Question);
msgBox.setInformativeText(tr("Do you want to delete the selected row ?")); msgBox.setText(tr("The row will be deleted."));
msgBox.setStandardButtons(QMessageBox::No | QMessageBox::Yes); msgBox.setInformativeText(tr("Do you want to delete the selected row ?"));
msgBox.setDefaultButton(QMessageBox::No); msgBox.setStandardButtons(QMessageBox::No | QMessageBox::Yes);
int ret = msgBox.exec(); msgBox.setDefaultButton(QMessageBox::No);
if(ret == QMessageBox::Yes)
{
current_stack->push(new CUndoWorksheetDeleteCommand(table_editor, selected_row));
}
table_editor->clearFocus(); int ret = msgBox.exec();
table_editor->clearSelection(); if(ret == QMessageBox::Yes)
return; {
current_stack->push(new CUndoWorksheetDeleteCommand(table_editor, selected_row));
}
table_editor->clearFocus();
table_editor->clearSelection();
return;
} }
void CEditorWorksheet::worksheetEditorCellEntered(QTableWidgetItem * item) void CEditorWorksheet::worksheetEditorCellEntered(QTableWidgetItem *item)
{ {
temp_content = item->text(); temp_content = item->text();
current_stack->push(new CUndoWorksheetCommand(table_editor, item, temp_content)); current_stack->push(new CUndoWorksheetCommand(table_editor, item, temp_content));
} }
void CEditorWorksheet::worksheetEditorChanged(QTableWidgetItem * item) void CEditorWorksheet::worksheetEditorChanged(QTableWidgetItem *item)
{ {
if(temp_content != item->text()) if(temp_content != item->text())
{ {
//current_stack->push(new CUndoWorksheetCommand(table_editor, item, temp_content)); //current_stack->push(new CUndoWorksheetCommand(table_editor, item, temp_content));
} }
if(!isWindowModified()) if(!isWindowModified())
setWindowModified(true); setWindowModified(true);
} }
void CEditorWorksheet::extractBotNames(list<string> filters, string level_design_path, NLLIGO::CLigoConfig ligoConfig) void CEditorWorksheet::extractBotNames(list<string> filters, string level_design_path, NLLIGO::CLigoConfig ligoConfig)
{ {
bool modified = false; bool modified = false;
QList<CTableWidgetItemStore> new_items; QList<CTableWidgetItemStore> new_items;
ExtractBotNames ebn; ExtractBotNames ebn;
ebn.setRequiredSettings(filters, level_design_path); ebn.setRequiredSettings(filters, level_design_path);
ebn.extractBotNamesFromPrimitives(ligoConfig); ebn.extractBotNamesFromPrimitives(ligoConfig);
// get SimpleNames // get SimpleNames
{ {
map<string, TEntryInfo> SimpleNames = ebn.getSimpleNames(); map<string, TEntryInfo> SimpleNames = ebn.getSimpleNames();
map<string, TEntryInfo>::iterator it(SimpleNames.begin()), last(SimpleNames.end()); map<string, TEntryInfo>::iterator it(SimpleNames.begin()), last(SimpleNames.end());
for (; it != last; ++it)
{
QList<QTableWidgetItem *> search_results = table_editor->findItems(QString(it->first.c_str()), Qt::MatchExactly);
if(search_results.size() == 0)
{
QList<QString> records;
records.push_back(QString(it->first.c_str()));
records.push_back(QString(it->first.c_str()));
records.push_back(QString(it->second.SheetName.c_str()));
insertTableRecords(records, new_items);
if(!modified) modified = true;
}
}
ebn.cleanSimpleNames();
}
// get GenericNames
{
set<string> GenericNames = ebn.getGenericNames();
set<string>::iterator it(GenericNames.begin()), last(GenericNames.end());
for (; it != last; ++it)
{
string gnName = "gn_" + ebn.cleanupName(*it);
QList<QTableWidgetItem *> search_results = table_editor->findItems(QString((*it).c_str()), Qt::MatchExactly);
if(search_results.size() == 0)
{
QList<QString> records;
records.push_back(QString((*it).c_str()));
records.push_back(QString(gnName.c_str()));
records.push_back(" ");
insertTableRecords(records, new_items);
if(!modified) modified = true;
}
}
ebn.cleanGenericNames();
}
current_stack->push(new CUndoWorksheetExtraction(new_items, table_editor));
if(modified)
{
setWindowModified(true);
table_editor->scrollToBottom();
}
for (; it != last; ++it)
{
QList<QTableWidgetItem*> search_results = table_editor->findItems(QString(it->first.c_str()), Qt::MatchExactly);
if(search_results.size() == 0)
{
QList<QString> records;
records.push_back(QString(it->first.c_str()));
records.push_back(QString(it->first.c_str()));
records.push_back(QString(it->second.SheetName.c_str()));
insertTableRecords(records, new_items);
if(!modified) modified = true;
}
}
ebn.cleanSimpleNames();
}
// get GenericNames
{
set<string> GenericNames = ebn.getGenericNames();
set<string>::iterator it(GenericNames.begin()), last(GenericNames.end());
for (; it != last; ++it)
{
string gnName = "gn_" + ebn.cleanupName(*it);
QList<QTableWidgetItem*> search_results = table_editor->findItems(QString((*it).c_str()), Qt::MatchExactly);
if(search_results.size() == 0)
{
QList<QString> records;
records.push_back(QString((*it).c_str()));
records.push_back(QString(gnName.c_str()));
records.push_back(" ");
insertTableRecords(records, new_items);
if(!modified) modified = true;
}
}
ebn.cleanGenericNames();
}
current_stack->push(new CUndoWorksheetExtraction(new_items, table_editor));
if(modified)
{
setWindowModified(true);
table_editor->scrollToBottom();
}
} }
void CEditorWorksheet::extractWords(QString filename, QString columnId, IWordListBuilder& wordListBuilder) void CEditorWorksheet::extractWords(QString filename, QString columnId, IWordListBuilder &wordListBuilder)
{ {
uint i; uint i;
// **** Load the excel sheet // **** Load the excel sheet
// load // load
TWorksheet workSheet; STRING_MANAGER::TWorksheet workSheet;
if(!loadExcelSheet(filename.toStdString(), workSheet, true)) if(!loadExcelSheet(filename.toStdString(), workSheet, true))
{ {
nlwarning("Error reading '%s'. Aborted", filename.toStdString().c_str()); nlwarning("Error reading '%s'. Aborted", filename.toStdString().c_str());
return; return;
} }
// get the key column index // get the key column index
uint keyColIndex = 0; uint keyColIndex = 0;
if(!workSheet.findCol(columnId.toStdString(), keyColIndex)) if(!workSheet.findCol(columnId.toStdString(), keyColIndex))
{ {
nlwarning("Error: Don't find the column '%s'. '%s' Aborted", columnId.toStdString().c_str(), filename.toStdString().c_str()); nlwarning("Error: Don't find the column '%s'. '%s' Aborted", columnId.toStdString().c_str(), filename.toStdString().c_str());
return; return;
} }
// get the name column index // get the name column index
uint nameColIndex; uint nameColIndex;
if(!workSheet.findCol(ucstring("name"), nameColIndex)) if(!workSheet.findCol(ucstring("name"), nameColIndex))
{ {
nlwarning("Error: Don't find the column 'name'. '%s' Aborted", filename.toStdString().c_str()); nlwarning("Error: Don't find the column 'name'. '%s' Aborted", filename.toStdString().c_str());
return; return;
} }
// **** List all words with the builder given
std::vector<string> allWords;
if(!wordListBuilder.buildWordList(allWords, filename.toStdString()))
{
return;
}
bool modified = false;
QList<CTableWidgetItemStore> new_items;
for(i = 0; i < allWords.size(); i++)
{
string keyName = allWords[i];
QList<QTableWidgetItem*> search_results = table_editor->findItems(QString(keyName.c_str()), Qt::MatchExactly);
if(search_results.size() == 0)
{
int knPos = 0, nPos = 0;
if(workSheet.getData(0, 0) == ucstring("*HASH_VALUE"))
{
knPos = keyColIndex - 1;
nPos = nameColIndex - 1;
} else {
knPos = keyColIndex;
nPos = nameColIndex;
}
QList<QString> records; // **** List all words with the builder given
records.push_back(QString(keyName.c_str())); std::vector<std::string> allWords;
records.push_back(QString("<GEN>") + QString(keyName.c_str())); if(!wordListBuilder.buildWordList(allWords, filename.toStdString()))
insertTableRecords(records, new_items); {
if(!modified) modified = true; return;
} }
} bool modified = false;
current_stack->push(new CUndoWorksheetExtraction(new_items, table_editor)); QList<CTableWidgetItemStore> new_items;
if(modified) for(i = 0; i < allWords.size(); i++)
{ {
setWindowModified(true); string keyName = allWords[i];
table_editor->scrollToBottom(); QList<QTableWidgetItem *> search_results = table_editor->findItems(QString(keyName.c_str()), Qt::MatchExactly);
} if(search_results.size() == 0)
{
int knPos = 0, nPos = 0;
if(workSheet.getData(0, 0) == ucstring("*HASH_VALUE"))
{
knPos = keyColIndex - 1;
nPos = nameColIndex - 1;
}
else
{
knPos = keyColIndex;
nPos = nameColIndex;
}
QList<QString> records;
records.push_back(QString(keyName.c_str()));
records.push_back(QString("<GEN>") + QString(keyName.c_str()));
insertTableRecords(records, new_items);
if(!modified) modified = true;
}
}
current_stack->push(new CUndoWorksheetExtraction(new_items, table_editor));
if(modified)
{
setWindowModified(true);
table_editor->scrollToBottom();
}
} }
void CEditorWorksheet::insertTableRecords(QList<QString> records, QList<CTableWidgetItemStore> new_items) void CEditorWorksheet::insertTableRecords(QList<QString> records, QList<CTableWidgetItemStore> new_items)
{ {
const int currentRow = table_editor->rowCount(); const int currentRow = table_editor->rowCount();
table_editor->setRowCount(currentRow + 1); table_editor->setRowCount(currentRow + 1);
int n = 0; int n = 0;
Q_FOREACH(QString record, records) Q_FOREACH(QString record, records)
{ {
QTableWidgetItem *rec = new QTableWidgetItem(); QTableWidgetItem *rec = new QTableWidgetItem();
rec->setBackgroundColor(QColor("#F75D59")); rec->setBackgroundColor(QColor("#F75D59"));
table_editor ->setItem(currentRow, n, rec); table_editor ->setItem(currentRow, n, rec);
CTableWidgetItemStore rec_s(rec, currentRow, n); CTableWidgetItemStore rec_s(rec, currentRow, n);
new_items.push_back(rec_s); new_items.push_back(rec_s);
n++; n++;
} }
} }
bool CEditorWorksheet::compareWorksheetFile(QString filename) bool CEditorWorksheet::compareWorksheetFile(QString filename)
{ {
STRING_MANAGER::TWorksheet wk_file; STRING_MANAGER::TWorksheet wk_file;
int colIndex = 0; int colIndex = 0;
if(loadExcelSheet(filename.toStdString(), wk_file, true) == true) if(loadExcelSheet(filename.toStdString(), wk_file, true) == true)
{ {
if(wk_file.getData(0, 0) == ucstring("*HASH_VALUE")) if(wk_file.getData(0, 0) == ucstring("*HASH_VALUE"))
{ {
colIndex = 1; colIndex = 1;
} }
if(wk_file.ColCount - colIndex != table_editor->columnCount()) if(wk_file.ColCount - colIndex != table_editor->columnCount())
{ {
return false; return false;
} }
for(int i = 0; i < table_editor->columnCount(); i++) for(int i = 0; i < table_editor->columnCount(); i++)
{ {
QString item = table_editor->horizontalHeaderItem(i)->text(); QString item = table_editor->horizontalHeaderItem(i)->text();
ucstring itemC = wk_file.getData(0, i+ colIndex); ucstring itemC = wk_file.getData(0, i+ colIndex);
if(item.toStdString() != itemC.toString()) if(item.toStdString() != itemC.toString())
{ {
nlwarning(item.toStdString().c_str()); nlwarning(item.toStdString().c_str());
nlwarning(itemC.toString().c_str()); nlwarning(itemC.toString().c_str());
return false; return false;
} }
} }
} else { }
return false; else
} {
return false;
return true; }
return true;
} }
void CEditorWorksheet::mergeWorksheetFile(QString filename) void CEditorWorksheet::mergeWorksheetFile(QString filename)
{ {
STRING_MANAGER::TWorksheet wk_file; STRING_MANAGER::TWorksheet wk_file;
if(loadExcelSheet(filename.toStdString(), wk_file, true) == true) if(loadExcelSheet(filename.toStdString(), wk_file, true) == true)
{ {
bool hasHashValue = false; bool hasHashValue = false;
int colIndex = 0; int colIndex = 0;
if(wk_file.getData(0, 0) == ucstring("*HASH_VALUE")) if(wk_file.getData(0, 0) == ucstring("*HASH_VALUE"))
{ {
hasHashValue = true; hasHashValue = true;
colIndex = 1; colIndex = 1;
} }
// read rows // read rows
for(unsigned int i = 1; i < wk_file.size(); i++) for(unsigned int i = 1; i < wk_file.size(); i++)
{ {
// search with the first column // search with the first column
ucstring rowId = wk_file.getData(i,colIndex); ucstring rowId = wk_file.getData(i,colIndex);
QList<QTableWidgetItem*> search_results = table_editor->findItems(QString(rowId.toString().c_str()), Qt::MatchExactly); QList<QTableWidgetItem *> search_results = table_editor->findItems(QString(rowId.toString().c_str()), Qt::MatchExactly);
if(search_results.size() == 0) if(search_results.size() == 0)
{ {
const int lastRow = table_editor->rowCount(); const int lastRow = table_editor->rowCount();
table_editor->setRowCount(lastRow + 1); table_editor->setRowCount(lastRow + 1);
for(unsigned int j = 0; j < table_editor->columnCount(); j++) for(int j = 0; j < table_editor->columnCount(); j++)
{ {
ucstring rowValue = wk_file.getData(i, j + colIndex); // get the value ucstring rowValue = wk_file.getData(i, j + colIndex); // get the value
QTableWidgetItem *row = new QTableWidgetItem(); QTableWidgetItem *row = new QTableWidgetItem();
row->setText(QString(rowValue.toString().c_str())); // set the value in table item row->setText(QString(rowValue.toString().c_str())); // set the value in table item
table_editor->setItem(lastRow, j, row); table_editor->setItem(lastRow, j, row);
} }
} }
} }
} else { }
QErrorMessage error; else
error.showMessage(tr("This file is not a worksheet file.")); {
error.exec(); QErrorMessage error;
} error.showMessage(tr("This file is not a worksheet file."));
error.exec();
}
} }
void CEditorWorksheet::closeEvent(QCloseEvent *event) void CEditorWorksheet::closeEvent(QCloseEvent *event)
{ {
if(isWindowModified()) if(isWindowModified())
{ {
QMessageBox msgBox; QMessageBox msgBox;
msgBox.setText(tr("The document has been modified.")); msgBox.setIcon(QMessageBox::Question);
msgBox.setInformativeText(tr("Do you want to save your changes?")); msgBox.setText(tr("The document has been modified."));
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel); msgBox.setInformativeText(tr("Do you want to save your changes?"));
msgBox.setDefaultButton(QMessageBox::Save); msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
int ret = msgBox.exec(); msgBox.setDefaultButton(QMessageBox::Save);
switch (ret) int ret = msgBox.exec();
{ switch (ret)
case QMessageBox::Save: {
save(); case QMessageBox::Save:
event->accept(); save();
close(); break;
break; case QMessageBox::Discard:
case QMessageBox::Discard: break;
event->accept(); case QMessageBox::Cancel:
close(); event->ignore();
break; return;
case QMessageBox::Cancel: }
event->ignore(); }
break; event->accept();
default: close();
break;
}
} else {
event->accept();
close();
}
} }
bool CEditorWorksheet::isBotNamesTable() bool CEditorWorksheet::isBotNamesTable()
{ {
bool status = true; bool status = true;
if(table_editor->horizontalHeaderItem(0)->text() != "bot name" if(table_editor->horizontalHeaderItem(0)->text() != "bot name"
|| table_editor->horizontalHeaderItem(1)->text() != "translated name" || table_editor->horizontalHeaderItem(1)->text() != "translated name"
|| table_editor->horizontalHeaderItem(2)->text() != "sheet_name") || table_editor->horizontalHeaderItem(2)->text() != "sheet_name")
{ {
status = false; status = false;
} }
return status;
return status;
} }
bool CEditorWorksheet::isSheetTable(QString type) bool CEditorWorksheet::isSheetTable(QString type)
{ {
QString column_name; QString column_name;
if(type.toAscii() == Constants::WK_ITEM) if(type.toAscii() == Constants::WK_ITEM)
{ {
column_name = "item ID"; column_name = "item ID";
} else if(type.toAscii() == Constants::WK_CREATURE) { }
column_name = "creature ID"; else if(type.toAscii() == Constants::WK_CREATURE)
} else if(type.toAscii() == Constants::WK_SBRICK) { {
column_name = "sbrick ID"; column_name = "creature ID";
} else if(type.toAscii() == Constants::WK_SPHRASE) { }
column_name = "sphrase ID"; else if(type.toAscii() == Constants::WK_SBRICK)
} else if(type.toAscii() == Constants::WK_PLACE) { {
column_name = "placeId"; column_name = "sbrick ID";
} }
bool status = true; else if(type.toAscii() == Constants::WK_SPHRASE)
if(table_editor->horizontalHeaderItem(0)->text() != column_name {
|| table_editor->horizontalHeaderItem(1)->text() != "name") column_name = "sphrase ID";
{ }
status = false; else if(type.toAscii() == Constants::WK_PLACE)
} {
column_name = "placeId";
return status; }
bool status = true;
if(table_editor->horizontalHeaderItem(0)->text() != column_name
|| table_editor->horizontalHeaderItem(1)->text() != "name")
{
status = false;
}
return status;
} }
} }

View file

@ -18,6 +18,10 @@
#ifndef EDITOR_WORKSHEET_H #ifndef EDITOR_WORKSHEET_H
#define EDITOR_WORKSHEET_H #define EDITOR_WORKSHEET_H
// Project includes
#include "translation_manager_editor.h"
#include "extract_new_sheet_names.h"
// Nel includes // Nel includes
#include "nel/misc/types_nl.h" #include "nel/misc/types_nl.h"
#include "nel/misc/sheet_id.h" #include "nel/misc/sheet_id.h"
@ -34,11 +38,9 @@
#include <QtGui/QUndoCommand> #include <QtGui/QUndoCommand>
#include <QtGui/QUndoStack> #include <QtGui/QUndoStack>
// Project includes
#include "translation_manager_editor.h"
#include "extract_new_sheet_names.h"
namespace TranslationManager { namespace TranslationManager
{
struct CTableWidgetItemStore struct CTableWidgetItemStore
{ {
@ -47,6 +49,7 @@ public:
m_item(item), m_item(item),
m_row(row), m_row(row),
m_column(column) { } m_column(column) { }
QTableWidgetItem *m_item; QTableWidgetItem *m_item;
int m_row; int m_row;
int m_column; int m_column;
@ -54,39 +57,41 @@ public:
class CEditorWorksheet : public CEditor class CEditorWorksheet : public CEditor
{ {
Q_OBJECT Q_OBJECT
private:
QString temp_content;
public: public:
CEditorWorksheet(QMdiArea* parent) : CEditor(parent) {} CEditorWorksheet(QMdiArea *parent) : CEditor(parent) {}
CEditorWorksheet() : CEditor() {} CEditorWorksheet() : CEditor() {}
QTableWidget* table_editor; QTableWidget *table_editor;
void open(QString filename); void open(QString filename);
void save(); void save();
void saveAs(QString filename); void saveAs(QString filename);
void activateWindow(); void activateWindow();
void mergeWorksheetFile(QString filename); void mergeWorksheetFile(QString filename);
bool compareWorksheetFile(QString filename); bool compareWorksheetFile(QString filename);
void extractBotNames(list<string> filters, string level_design_path, NLLIGO::CLigoConfig ligoConfig); void extractBotNames(std::list<std::string> filters, std::string level_design_path, NLLIGO::CLigoConfig ligoConfig);
void extractWords(QString filename, QString columnId, IWordListBuilder &wordListBuilder); void extractWords(QString filename, QString columnId, IWordListBuilder &wordListBuilder);
void insertTableRecords(QList<QString> records, QList<CTableWidgetItemStore> new_items); void insertTableRecords(QList<QString> records, QList<CTableWidgetItemStore> new_items);
bool isBotNamesTable(); bool isBotNamesTable();
bool isSheetTable(QString type); bool isSheetTable(QString type);
void closeEvent(QCloseEvent *event); void closeEvent(QCloseEvent *event);
private Q_SLOTS: private Q_SLOTS:
void worksheetEditorCellEntered(QTableWidgetItem * item); void worksheetEditorCellEntered(QTableWidgetItem *item);
void worksheetEditorChanged(QTableWidgetItem * item); void worksheetEditorChanged(QTableWidgetItem *item);
void insertRow(); void insertRow();
void deleteRow(); void deleteRow();
void contextMenuEvent(QContextMenuEvent *e); void contextMenuEvent(QContextMenuEvent *e);
private:
QString temp_content;
}; };
class CUndoWorksheetCommand : public QUndoCommand class CUndoWorksheetCommand : public QUndoCommand
{ {
public: public:
CUndoWorksheetCommand(QTableWidget *table, QTableWidgetItem* item, const QString &ocontent, QUndoCommand *parent = 0) : QUndoCommand("Insert characters in cells", parent), m_table(table), m_item(item), m_ocontent(ocontent) CUndoWorksheetCommand(QTableWidget *table, QTableWidgetItem *item, const QString &ocontent, QUndoCommand *parent = 0) : QUndoCommand("Insert characters in cells", parent), m_table(table), m_item(item), m_ocontent(ocontent)
{ {
m_ccontent = m_ocontent; m_ccontent = m_ocontent;
} }
@ -98,16 +103,16 @@ public:
} }
} }
void undo() void undo()
{ {
if(m_item->text() != m_ocontent) if(m_item->text() != m_ocontent)
{ {
m_ccontent = m_item->text(); m_ccontent = m_item->text();
} }
m_item->setText(m_ocontent); m_item->setText(m_ocontent);
} }
private: private:
QTableWidget* m_table; QTableWidget *m_table;
QTableWidgetItem* m_item; QTableWidgetItem *m_item;
QString m_ocontent; QString m_ocontent;
QString m_ccontent; QString m_ccontent;
}; };
@ -123,7 +128,7 @@ public:
m_table->setRowCount(m_rowID + 1); m_table->setRowCount(m_rowID + 1);
for(int j = 0; j < m_table->columnCount(); j++) for(int j = 0; j < m_table->columnCount(); j++)
{ {
QTableWidgetItem* item = new QTableWidgetItem(); QTableWidgetItem *item = new QTableWidgetItem();
m_table->setItem(m_rowID, j, item); m_table->setItem(m_rowID, j, item);
m_table->scrollToBottom(); m_table->scrollToBottom();
} }
@ -133,16 +138,16 @@ public:
{ {
m_table->removeRow(m_rowID); m_table->removeRow(m_rowID);
} }
private:
QTableWidget* m_table;
int m_rowID;
private:
QTableWidget *m_table;
int m_rowID;
}; };
class CUndoWorksheetExtraction : public QUndoCommand class CUndoWorksheetExtraction : public QUndoCommand
{ {
public: public:
CUndoWorksheetExtraction(QList<CTableWidgetItemStore> items, QTableWidget *table, QUndoCommand *parent = 0) : QUndoCommand("Word extraction", parent), CUndoWorksheetExtraction(QList<CTableWidgetItemStore> items, QTableWidget *table, QUndoCommand *parent = 0) : QUndoCommand("Word extraction", parent),
m_items(items), m_items(items),
m_table(table) m_table(table)
{ } { }
@ -153,7 +158,6 @@ public:
{ {
m_table->setItem(is.m_row, is.m_column, is.m_item); m_table->setItem(is.m_row, is.m_column, is.m_item);
} }
} }
void undo() void undo()
@ -161,14 +165,13 @@ public:
Q_FOREACH(CTableWidgetItemStore is, m_items) Q_FOREACH(CTableWidgetItemStore is, m_items)
{ {
m_table->setItem(is.m_row, is.m_column, is.m_item); m_table->setItem(is.m_row, is.m_column, is.m_item);
m_table->takeItem(is.m_row, is.m_column); m_table->takeItem(is.m_row, is.m_column);
} }
} }
private: private:
QList<CTableWidgetItemStore> m_items; QList<CTableWidgetItemStore> m_items;
QTableWidget* m_table; QTableWidget *m_table;
}; };
class CUndoWorksheetDeleteCommand : public QUndoCommand class CUndoWorksheetDeleteCommand : public QUndoCommand
@ -181,8 +184,8 @@ public:
{ {
for(int i = 0; i < m_table->columnCount(); i++) for(int i = 0; i < m_table->columnCount(); i++)
{ {
QTableWidgetItem* item = new QTableWidgetItem(); QTableWidgetItem *item = new QTableWidgetItem();
QTableWidgetItem* table_item = m_table->item(m_rowID, i); QTableWidgetItem *table_item = m_table->item(m_rowID, i);
item->setText(table_item->text()); item->setText(table_item->text());
m_deletedItems.push_back(item); m_deletedItems.push_back(item);
} }
@ -203,8 +206,8 @@ public:
} }
private: private:
QList<QTableWidgetItem*> m_deletedItems; QList<QTableWidgetItem *> m_deletedItems;
QTableWidget* m_table; QTableWidget *m_table;
int m_rowID; int m_rowID;
}; };

View file

@ -17,18 +17,14 @@
#include "extract_bot_names.h" #include "extract_bot_names.h"
static bool RemoveOlds = false; static bool RemoveOlds = false;
namespace TranslationManager namespace TranslationManager
{ {
TCreatureInfo *ExtractBotNames::getCreature(const std::string &sheetName) TCreatureInfo *ExtractBotNames::getCreature(const std::string &sheetName)
{ {
CSheetId id(sheetName+".creature"); NLMISC::CSheetId id(sheetName+".creature");
if (Creatures.find(id) != Creatures.end()) if (Creatures.find(id) != Creatures.end())
return &(Creatures.find(id)->second); return &(Creatures.find(id)->second);
@ -36,18 +32,17 @@ TCreatureInfo *ExtractBotNames::getCreature(const std::string &sheetName)
return NULL; return NULL;
} }
string ExtractBotNames::cleanupName(const std::string &name) std::string ExtractBotNames::cleanupName(const std::string &name)
{ {
string ret; std::string ret;
for (uint i=0; i<name.size(); ++i) for (size_t i = 0; i < name.size(); ++i)
{ {
if (name[i] != ' ') if (name[i] != ' ')
ret += name[i]; ret += name[i];
else else
ret += '_'; ret += '_';
} }
return ret; return ret;
} }
@ -55,14 +50,13 @@ ucstring ExtractBotNames::cleanupUcName(const ucstring &name)
{ {
ucstring ret; ucstring ret;
for (uint i=0; i<name.size(); ++i) for (size_t i = 0; i < name.size(); ++i)
{ {
if (name[i] != ' ') if (name[i] != ' ')
ret += name[i]; ret += name[i];
else else
ret += '_'; ret += '_';
} }
return ret; return ret;
} }
@ -70,82 +64,78 @@ ucstring ExtractBotNames::cleanupUcName(const ucstring &name)
/* /*
Removes first and last '$' Removes first and last '$'
*/ */
ucstring ExtractBotNames::makeGroupName(const ucstring & translationName) ucstring ExtractBotNames::makeGroupName(const ucstring &translationName)
{ {
ucstring ret = translationName; ucstring ret = translationName;
if (ret.size() >= 2) if (ret.size() >= 2)
{ {
if ( *ret.begin() == ucchar('$')) if (*ret.begin() == ucchar('$'))
{ {
ret=ret.substr(1); ret=ret.substr(1);
} }
if ( *ret.rbegin() == ucchar('$')) if (*ret.rbegin() == ucchar('$'))
{ {
ret = ret.substr(0, ret.size()-1); ret = ret.substr(0, ret.size() - 1);
} }
} }
ret = cleanupUcName(ret); ret = cleanupUcName(ret);
return ret; return ret;
} }
std::set<std::string> ExtractBotNames::getGenericNames()
set<string> ExtractBotNames::getGenericNames()
{ {
return GenericNames; return GenericNames;
} }
map<string, TEntryInfo> ExtractBotNames::getSimpleNames() std::map<std::string, TEntryInfo> ExtractBotNames::getSimpleNames()
{ {
return SimpleNames; return SimpleNames;
} }
void ExtractBotNames::cleanSimpleNames() void ExtractBotNames::cleanSimpleNames()
{ {
SimpleNames.clear(); SimpleNames.clear();
} }
void ExtractBotNames::cleanGenericNames() void ExtractBotNames::cleanGenericNames()
{ {
GenericNames.clear(); GenericNames.clear();
} }
string ExtractBotNames::removeAndStoreFunction(const std::string &fullName) std::string ExtractBotNames::removeAndStoreFunction(const std::string &fullName)
{ {
string::size_type pos = fullName.find("$"); std::string::size_type pos = fullName.find("$");
if (pos == string::npos) if (pos == std::string::npos)
{
return fullName; return fullName;
}
else else
{ {
// extract and store the function name // extract and store the function name
string ret; std::string ret;
ret = fullName.substr(0, pos); ret = fullName.substr(0, pos);
string::size_type pos2 = fullName.find("$", pos+1); std::string::size_type pos2 = fullName.find("$", pos+1);
string fct = fullName.substr(pos+1, pos2-(pos+1)); std::string fct = fullName.substr(pos + 1, pos2 - (pos + 1));
ret += fullName.substr(pos2+1); ret += fullName.substr(pos2 + 1);
if (Functions.find(fct) == Functions.end()) if (Functions.find(fct) == Functions.end())
{ {
nldebug("Adding function '%s'", fct.c_str()); nldebug("Adding function '%s'", fct.c_str());
Functions.insert(fct); Functions.insert(fct);
} }
return ret; return ret;
} }
} }
void ExtractBotNames::addGenericName(const std::string &name, const std::string &sheetName) void ExtractBotNames::addGenericName(const std::string &name, const std::string &sheetName)
{ {
TCreatureInfo *c = getCreature(sheetName); TCreatureInfo *c = getCreature(sheetName);
if (!c || c->ForceSheetName || !c->DisplayName) if (!c || c->ForceSheetName || !c->DisplayName)
return; return;
if (SimpleNames.find(name) != SimpleNames.end()) if (SimpleNames.find(name) != SimpleNames.end())
{ {
nldebug("Name '%s' is now a generic name", name.c_str()); nldebug("Name '%s' is now a generic name", name.c_str());
@ -177,7 +167,7 @@ void ExtractBotNames::addSimpleName(const std::string &name, const std::string &
else else
{ {
nldebug("Adding simple name '%s'", name.c_str()); nldebug("Adding simple name '%s'", name.c_str());
TEntryInfo ei; TEntryInfo ei;
ei.SheetName = sheetName; ei.SheetName = sheetName;
@ -185,75 +175,72 @@ void ExtractBotNames::addSimpleName(const std::string &name, const std::string &
} }
} }
void ExtractBotNames::setRequiredSettings(list<string> filters, string level_design_path) void ExtractBotNames::setRequiredSettings(std::list<std::string> filters, std::string level_design_path)
{ {
for (std::list<string>::iterator it = filters.begin(); it != filters.end(); ++it) for (std::list<std::string>::iterator it = filters.begin(); it != filters.end(); ++it)
{ {
Filters.push_back(*it); Filters.push_back(*it);
} }
//------------------------------------------------------------------- //-------------------------------------------------------------------
// init the sheets // init the sheets
CSheetId::init(false); NLMISC::CSheetId::init(false);
const string PACKED_SHEETS_NAME = "bin/translation_tools_creature.packed_sheets"; const std::string PACKED_SHEETS_NAME = "bin/translation_tools_creature.packed_sheets";
loadForm("creature", PACKED_SHEETS_NAME, Creatures, false, false); loadForm("creature", PACKED_SHEETS_NAME, Creatures, false, false);
if (Creatures.empty()) if (Creatures.empty())
{ {
loadForm("creature", PACKED_SHEETS_NAME, Creatures, true); loadForm("creature", PACKED_SHEETS_NAME, Creatures, true);
} }
} }
void ExtractBotNames::extractBotNamesFromPrimitives(CLigoConfig ligoConfig) void ExtractBotNames::extractBotNamesFromPrimitives(NLLIGO::CLigoConfig ligoConfig)
{ {
//------------------------------------------------------------------- //-------------------------------------------------------------------
// ok, ready for the real work, // ok, ready for the real work,
// first, read the primitives files and parse the primitives // first, read the primitives files and parse the primitives
vector<string> files; std::vector<std::string> files;
CPath::getFileList("primitive", files); NLMISC::CPath::getFileList("primitive", files);
for (uint i=0; i<files.size(); ++i) for (uint i=0; i<files.size(); ++i)
{ {
string pathName = files[i]; std::string pathName = files[i];
pathName = CPath::lookup(pathName); pathName = NLMISC::CPath::lookup(pathName);
/*
// dnk-88: what is it?
// check filters // check filters
uint j=0; uint j = 0;
for (j=0; j<Filters.size(); ++j) for (size_t j = 0; j < Filters.size(); ++j)
{ {
if (pathName.find(Filters[j]) != string::npos) if (pathName.find(Filters[j]) != std::string::npos)
break; break;
} }
if (j != Filters.size()) if (j != Filters.size())
// skip this file // skip this file
continue; continue;
*/
nlinfo("Loading file '%s'...", NLMISC::CFile::getFilename(pathName).c_str());
nlinfo("Loading file '%s'...", CFile::getFilename(pathName).c_str()); NLLIGO::CPrimitives primDoc;
NLLIGO::CPrimitiveContext::instance().CurrentPrimitive = &primDoc;
CPrimitives primDoc;
CPrimitiveContext::instance().CurrentPrimitive = &primDoc;
loadXmlPrimitiveFile(primDoc, pathName, ligoConfig); loadXmlPrimitiveFile(primDoc, pathName, ligoConfig);
// now parse the file // now parse the file
// look for group template // look for group template
{ {
TPrimitiveClassPredicate pred("group_template_npc"); NLLIGO::TPrimitiveClassPredicate pred("group_template_npc");
TPrimitiveSet result; NLLIGO::TPrimitiveSet result;
CPrimitiveSet<TPrimitiveClassPredicate> ps; NLLIGO::CPrimitiveSet<NLLIGO::TPrimitiveClassPredicate> ps;
ps.buildSet(primDoc.RootNode, pred, result); ps.buildSet(primDoc.RootNode, pred, result);
for (uint i=0; i<result.size(); ++i) for (uint i = 0; i < result.size(); ++i)
{ {
string name; std::string name;
string countStr; std::string countStr;
string sheetStr; std::string sheetStr;
result[i]->getPropertyByName("name", name); result[i]->getPropertyByName("name", name);
result[i]->getPropertyByName("count", countStr); result[i]->getPropertyByName("count", countStr);
result[i]->getPropertyByName("bot_sheet_look", sheetStr); result[i]->getPropertyByName("bot_sheet_look", sheetStr);
@ -276,16 +263,16 @@ void ExtractBotNames::extractBotNamesFromPrimitives(CLigoConfig ligoConfig)
} }
// look for bot template // look for bot template
{ {
TPrimitiveClassPredicate pred("bot_template_npc"); NLLIGO::TPrimitiveClassPredicate pred("bot_template_npc");
TPrimitiveSet result; NLLIGO::TPrimitiveSet result;
CPrimitiveSet<TPrimitiveClassPredicate> ps; NLLIGO::CPrimitiveSet<NLLIGO::TPrimitiveClassPredicate> ps;
ps.buildSet(primDoc.RootNode, pred, result); ps.buildSet(primDoc.RootNode, pred, result);
for (uint i=0; i<result.size(); ++i) for (size_t i = 0; i < result.size(); ++i)
{ {
string name; std::string name;
string sheetStr; std::string sheetStr;
result[i]->getPropertyByName("name", name); result[i]->getPropertyByName("name", name);
result[i]->getPropertyByName("sheet_look", sheetStr); result[i]->getPropertyByName("sheet_look", sheetStr);
@ -305,19 +292,19 @@ void ExtractBotNames::extractBotNamesFromPrimitives(CLigoConfig ligoConfig)
} }
} }
} }
// look for npc_group // look for npc_group
{ {
TPrimitiveClassPredicate pred("npc_group"); NLLIGO::TPrimitiveClassPredicate pred("npc_group");
TPrimitiveSet result; NLLIGO::TPrimitiveSet result;
CPrimitiveSet<TPrimitiveClassPredicate> ps; NLLIGO::CPrimitiveSet<NLLIGO::TPrimitiveClassPredicate> ps;
ps.buildSet(primDoc.RootNode, pred, result); ps.buildSet(primDoc.RootNode, pred, result);
for (uint i=0; i<result.size(); ++i) for (size_t i = 0; i < result.size(); ++i)
{ {
string name; std::string name;
string countStr; std::string countStr;
string sheetStr; std::string sheetStr;
result[i]->getPropertyByName("name", name); result[i]->getPropertyByName("name", name);
result[i]->getPropertyByName("count", countStr); result[i]->getPropertyByName("count", countStr);
result[i]->getPropertyByName("bot_sheet_client", sheetStr); result[i]->getPropertyByName("bot_sheet_client", sheetStr);
@ -342,18 +329,18 @@ void ExtractBotNames::extractBotNamesFromPrimitives(CLigoConfig ligoConfig)
} }
} }
} }
// look for bot // look for bot
{ {
TPrimitiveClassPredicate pred("npc_bot"); NLLIGO::TPrimitiveClassPredicate pred("npc_bot");
TPrimitiveSet result; NLLIGO::TPrimitiveSet result;
CPrimitiveSet<TPrimitiveClassPredicate> ps; NLLIGO::CPrimitiveSet<NLLIGO::TPrimitiveClassPredicate> ps;
ps.buildSet(primDoc.RootNode, pred, result); ps.buildSet(primDoc.RootNode, pred, result);
for (uint i=0; i<result.size(); ++i) for (size_t i = 0; i < result.size(); ++i)
{ {
string name; std::string name;
string sheetStr; std::string sheetStr;
result[i]->getPropertyByName("name", name); result[i]->getPropertyByName("name", name);
result[i]->getPropertyByName("sheet_client", sheetStr); result[i]->getPropertyByName("sheet_client", sheetStr);
@ -373,7 +360,7 @@ void ExtractBotNames::extractBotNamesFromPrimitives(CLigoConfig ligoConfig)
} }
} }
} }
} }
} }
} }

View file

@ -30,22 +30,16 @@
#include "nel/ligo/primitive.h" #include "nel/ligo/primitive.h"
#include "nel/ligo/primitive_utils.h" #include "nel/ligo/primitive_utils.h"
using namespace std;
using namespace NLMISC;
using namespace NLLIGO;
using namespace STRING_MANAGER;
namespace TranslationManager namespace TranslationManager
{ {
struct TCreatureInfo struct TCreatureInfo
{ {
CSheetId SheetId; NLMISC::CSheetId SheetId;
bool ForceSheetName; bool ForceSheetName;
bool DisplayName; bool DisplayName;
void readGeorges(const NLMISC::CSmartPtr<NLGEORGES::UForm> &form, const NLMISC::CSheetId &sheetId)
void readGeorges (const NLMISC::CSmartPtr<NLGEORGES::UForm> &form, const NLMISC::CSheetId &sheetId)
{ {
const NLGEORGES::UFormElm &item=form->getRootNode(); const NLGEORGES::UFormElm &item=form->getRootNode();
@ -61,51 +55,45 @@ struct TCreatureInfo
f.serial(DisplayName); f.serial(DisplayName);
} }
static uint getVersion ()
static uint getVersion () {
{
return 1; return 1;
} }
void removed() void removed()
{ {
} }
}; };
struct TEntryInfo struct TEntryInfo
{ {
string SheetName; std::string SheetName;
}; };
struct ExtractBotNames struct ExtractBotNames
{ {
private: private:
vector<string> Filters; std::vector<std::string> Filters;
std::map<CSheetId, TCreatureInfo> Creatures; std::map<NLMISC::CSheetId, TCreatureInfo> Creatures;
set<string> GenericNames; std::set<std::string> GenericNames;
map<string, TEntryInfo> SimpleNames; std::map<std::string, TEntryInfo> SimpleNames;
set<string> Functions; std::set<std::string> Functions;
private: private:
TCreatureInfo *getCreature(const std::string &sheetName); TCreatureInfo *getCreature(const std::string &sheetName);
ucstring makeGroupName(const ucstring & translationName); ucstring makeGroupName(const ucstring &translationName);
string removeAndStoreFunction(const std::string &fullName); std::string removeAndStoreFunction(const std::string &fullName);
void addGenericName(const std::string &name, const std::string &sheetName); void addGenericName(const std::string &name, const std::string &sheetName);
void addSimpleName(const std::string &name, const std::string &sheetName); void addSimpleName(const std::string &name, const std::string &sheetName);
public: public:
void extractBotNamesFromPrimitives(CLigoConfig ligoConfig); void extractBotNamesFromPrimitives(NLLIGO::CLigoConfig ligoConfig);
void setRequiredSettings(list<string> filters, string level_design_path); void setRequiredSettings(std::list<std::string> filters, std::string level_design_path);
set<string> getGenericNames(); std::set<std::string> getGenericNames();
map<string, TEntryInfo> getSimpleNames(); std::map<std::string, TEntryInfo> getSimpleNames();
string cleanupName(const std::string &name); std::string cleanupName(const std::string &name);
ucstring cleanupUcName(const ucstring &name); ucstring cleanupUcName(const ucstring &name);
void cleanSimpleNames(); void cleanSimpleNames();
void cleanGenericNames(); void cleanGenericNames();
}; };
} }
#endif /* EXTRACT_BOT_NAMES_H */
#endif /* EXTRACT_BOT_NAMES_H */

View file

@ -16,139 +16,135 @@
#include "extract_new_sheet_names.h" #include "extract_new_sheet_names.h"
using namespace std; namespace TranslationManager
using namespace NLMISC;
using namespace NLLIGO;
using namespace STRING_MANAGER;
namespace TranslationManager
{ {
// *************************************************************************** // ***************************************************************************
/* /*
* Specialisation of IWordListBuilder to list sheets in a directory * Specialisation of IWordListBuilder to list sheets in a directory
*/ */
bool CSheetWordListBuilder::buildWordList(std::vector<string> &allWords, string workSheetFileName) bool CSheetWordListBuilder::buildWordList(std::vector<std::string> &allWords, std::string workSheetFileName)
{
SheetExt = NLMISC::toLower(SheetExt);
// verify the directory is correct
if(!NLMISC::CFile::isDirectory(SheetPath))
{ {
SheetExt= toLower(SheetExt); nlwarning("Error: Directory '%s' not found. '%s' Aborted", SheetPath.c_str(), workSheetFileName.c_str());
// verify the directory is correct return false;
if(!CFile::isDirectory(SheetPath))
{
nlwarning("Error: Directory '%s' not found. '%s' Aborted", SheetPath.c_str(), workSheetFileName.c_str());
return false;
}
// list all files.
std::vector<string> allFiles;
allFiles.reserve(100000);
CPath::getPathContent(SheetPath, true, false, true, allFiles, NULL);
// Keep only the extension we want, and remove "_" (parent)
allWords.clear();
allWords.reserve(allFiles.size());
for(uint i=0;i<allFiles.size();i++)
{
string fileNameWithoutExt= CFile::getFilenameWithoutExtension(allFiles[i]);
string extension= toLower(CFile::getExtension(allFiles[i]));
// bad extension?
if(extension!=SheetExt)
continue;
// parent?
if(fileNameWithoutExt.empty()||fileNameWithoutExt[0]=='_')
continue;
// ok, add
allWords.push_back(toLower(fileNameWithoutExt));
}
return true;
} }
// list all files.
std::vector<std::string> allFiles;
allFiles.reserve(100000);
NLMISC::CPath::getPathContent(SheetPath, true, false, true, allFiles, NULL);
// Keep only the extension we want, and remove "_" (parent)
allWords.clear();
allWords.reserve(allFiles.size());
for(size_t i = 0; i < allFiles.size(); i++)
{
std::string fileNameWithoutExt = NLMISC::CFile::getFilenameWithoutExtension(allFiles[i]);
std::string extension = NLMISC::toLower(NLMISC::CFile::getExtension(allFiles[i]));
// bad extension?
if(extension!=SheetExt)
continue;
// parent?
if(fileNameWithoutExt.empty() || fileNameWithoutExt[0] == '_')
continue;
// ok, add
allWords.push_back(NLMISC::toLower(fileNameWithoutExt));
}
return true;
}
// *************************************************************************** // ***************************************************************************
/* /*
* Specialisation of IWordListBuilder to list new region/place name from .primitive * Specialisation of IWordListBuilder to list new region/place name from .primitive
*/ */
bool CRegionPrimWordListBuilder::buildWordList(std::vector<string> &allWords, string workSheetFileName) bool CRegionPrimWordListBuilder::buildWordList(std::vector<std::string> &allWords, std::string workSheetFileName)
{
// verify the directory is correct
if(!NLMISC::CFile::isDirectory(PrimPath))
{ {
// verify the directory is correct nlwarning("Error: Directory '%s' not found. '%s' Aborted", PrimPath.c_str(), workSheetFileName.c_str());
if(!CFile::isDirectory(PrimPath)) return false;
}
// list all files.
std::vector<std::string> allFiles;
allFiles.reserve(100000);
NLMISC::CPath::getPathContent(PrimPath, true, false, true, allFiles, NULL);
// parse all primitive that match the filter
allWords.clear();
allWords.reserve(100000);
// to avoid duplicate
std::set<std::string> allWordSet;
for(size_t i = 0; i < allFiles.size(); i++)
{
std::string fileName = NLMISC::CFile::getFilename(allFiles[i]);
// filter don't match?
bool oneMatch= false;
for(size_t filter = 0; filter < PrimFilter.size(); filter++)
{ {
nlwarning("Error: Directory '%s' not found. '%s' Aborted", PrimPath.c_str(), workSheetFileName.c_str()); if(NLMISC::testWildCard(fileName, PrimFilter[filter]))
oneMatch= true;
}
if(!oneMatch)
continue;
// ok, read the file
NLLIGO::CPrimitives PrimDoc;
NLLIGO::CPrimitiveContext::instance().CurrentPrimitive = &PrimDoc;
if (!NLLIGO::loadXmlPrimitiveFile(PrimDoc, allFiles[i], LigoConfig))
{
nlwarning("Error: cannot open file '%s'. '%s' Aborted", allFiles[i].c_str(), workSheetFileName.c_str());
NLLIGO::CPrimitiveContext::instance().CurrentPrimitive = NULL;
return false; return false;
} }
NLLIGO::CPrimitiveContext::instance().CurrentPrimitive = NULL;
// list all files.
std::vector<string> allFiles;
allFiles.reserve(100000);
CPath::getPathContent(PrimPath, true, false, true, allFiles, NULL);
// parse all primitive that match the filter
allWords.clear();
allWords.reserve(100000);
// to avoid duplicate
set<string> allWordSet;
for(uint i=0;i<allFiles.size();i++)
{
string fileName= CFile::getFilename(allFiles[i]);
// filter don't match?
bool oneMatch= false;
for(uint filter=0;filter<PrimFilter.size();filter++)
{
if(testWildCard(fileName, PrimFilter[filter]))
oneMatch= true;
}
if(!oneMatch)
continue;
// ok, read the file // For all primitives of interest
CPrimitives PrimDoc; const char *listClass[] = {"continent", "region", "place", "stable",
CPrimitiveContext::instance().CurrentPrimitive = &PrimDoc; "teleport_destination", "room_template"
if (!loadXmlPrimitiveFile(PrimDoc, allFiles[i], LigoConfig)) };
const char *listProp[] = {"name", "name", "name", "name",
"place_name", "place_name"
};
const uint numListClass= sizeof(listClass)/sizeof(listClass[0]);
const uint numListProp= sizeof(listProp)/sizeof(listProp[0]);
nlctassert(numListProp == numListClass);
for(uint cid = 0; cid < numListClass; cid++)
{
// parse the whole hierarchy
NLLIGO::TPrimitiveClassPredicate predCont(listClass[cid]);
NLLIGO::CPrimitiveSet<NLLIGO::TPrimitiveClassPredicate> setPlace;
NLLIGO::TPrimitiveSet placeRes;
setPlace.buildSet(PrimDoc.RootNode, predCont, placeRes);
// for all found
for (size_t placeId = 0; placeId < placeRes.size(); ++placeId)
{ {
nlwarning("Error: cannot open file '%s'. '%s' Aborted", allFiles[i].c_str(), workSheetFileName.c_str()); std::string primName;
CPrimitiveContext::instance().CurrentPrimitive = NULL; if(placeRes[placeId]->getPropertyByName(listProp[cid], primName) && !primName.empty())
return false;
}
CPrimitiveContext::instance().CurrentPrimitive = NULL;
// For all primitives of interest
const char *listClass[]= {"continent", "region", "place", "stable",
"teleport_destination", "room_template"};
const char *listProp[]= {"name", "name", "name", "name",
"place_name", "place_name"};
const uint numListClass= sizeof(listClass)/sizeof(listClass[0]);
const uint numListProp= sizeof(listProp)/sizeof(listProp[0]);
nlctassert(numListProp==numListClass);
for(uint cid=0;cid<numListClass;cid++)
{
// parse the whole hierarchy
TPrimitiveClassPredicate predCont(listClass[cid]);
CPrimitiveSet<TPrimitiveClassPredicate> setPlace;
TPrimitiveSet placeRes;
setPlace.buildSet(PrimDoc.RootNode, predCont, placeRes);
// for all found
for (uint placeId= 0; placeId < placeRes.size(); ++placeId)
{ {
string primName; primName = NLMISC::toLower(primName);
if(placeRes[placeId]->getPropertyByName(listProp[cid], primName) && !primName.empty()) // avoid duplicate
if(allWordSet.insert(primName).second)
{ {
primName= toLower(primName); allWords.push_back(primName);
// avoid duplicate
if(allWordSet.insert(primName).second)
{
allWords.push_back(primName);
}
} }
} }
} }
} }
return true;
} }
return true;
}
} }

View file

@ -30,43 +30,34 @@
#include "nel/ligo/primitive.h" #include "nel/ligo/primitive.h"
#include "nel/ligo/primitive_utils.h" #include "nel/ligo/primitive_utils.h"
using namespace std; namespace TranslationManager
using namespace NLMISC;
using namespace NLLIGO;
using namespace STRING_MANAGER;
namespace TranslationManager
{ {
// *************************************************************************** // ***************************************************************************
/* /*
* Interface to build the whole list of words (key id) for a specific worksheet * Interface to build the whole list of words (key id) for a specific worksheet
*/ */
struct IWordListBuilder struct IWordListBuilder
{ {
virtual bool buildWordList(std::vector<string> &allWords, string workSheetFileName) =0; virtual bool buildWordList(std::vector<std::string> &allWords, std::string workSheetFileName) =0;
}; };
struct CSheetWordListBuilder : public IWordListBuilder struct CSheetWordListBuilder : public IWordListBuilder
{ {
string SheetExt; std::string SheetExt;
string SheetPath; std::string SheetPath;
virtual bool buildWordList(std::vector<string> &allWords, string workSheetFileName); virtual bool buildWordList(std::vector<std::string> &allWords, std::string workSheetFileName);
}; };
struct CRegionPrimWordListBuilder : public IWordListBuilder struct CRegionPrimWordListBuilder : public IWordListBuilder
{ {
string PrimPath; std::string PrimPath;
vector<string> PrimFilter; std::vector<std::string> PrimFilter;
NLLIGO::CLigoConfig LigoConfig; NLLIGO::CLigoConfig LigoConfig;
virtual bool buildWordList(std::vector<string> &allWords, string workSheetFileName); virtual bool buildWordList(std::vector<std::string> &allWords, std::string workSheetFileName);
}; };
} }
#endif /* EXTRACT_NEW_SHEET_NAMES_H */
#endif /* EXTRACT_NEW_SHEET_NAMES_H */

View file

@ -1,191 +1,216 @@
// Translation Manager Plugin - OVQT Plugin <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2011 Emanuel Costea <cemycc@gmail.com>
//
// 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 <http://www.gnu.org/licenses/>.
#include "ftp_selection.h" #include "ftp_selection.h"
#include <QtGui/QMessageBox> #include <QtGui/QMessageBox>
#include <QtNetwork/QFtp> #include <QtNetwork/QFtp>
namespace TranslationManager namespace TranslationManager
{ {
CFtpSelection::CFtpSelection(QWidget *parent): QDialog(parent) CFtpSelection::CFtpSelection(QWidget *parent): QDialog(parent)
{ {
_ui.setupUi(this); _ui.setupUi(this);
connect(_ui.connectButton, SIGNAL(clicked()), this, SLOT(ConnectButtonClicked())); connect(_ui.connectButton, SIGNAL(clicked()), this, SLOT(ConnectButtonClicked()));
connect(_ui.doneButton, SIGNAL(clicked()), this, SLOT(DoneButtonClicked())); connect(_ui.doneButton, SIGNAL(clicked()), this, SLOT(DoneButtonClicked()));
connect(_ui.cdToParrent, SIGNAL(clicked()), this, SLOT(cdToParent())); connect(_ui.cdToParrent, SIGNAL(clicked()), this, SLOT(cdToParent()));
connect(_ui.cancelButton, SIGNAL(clicked()), this, SLOT(reject())); connect(_ui.cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
// file list
connect(_ui.fileList, SIGNAL(itemActivated(QTreeWidgetItem*,int)),this, SLOT(processItem(QTreeWidgetItem*,int)));
_ui.fileList->setEnabled(false);
_ui.fileList->setRootIsDecorated(false);
_ui.fileList->setHeaderLabels(QStringList() << tr("Name") << tr("Size") << tr("Owner") << tr("Group") << tr("Time"));
_ui.fileList->header()->setStretchLastSection(false);
// buttons // file list
_ui.cdToParrent->setEnabled(false); connect(_ui.fileList, SIGNAL(itemActivated(QTreeWidgetItem *,int)),this, SLOT(processItem(QTreeWidgetItem *,int)));
_ui.doneButton->setEnabled(false); _ui.fileList->setEnabled(false);
_ui.fileList->setRootIsDecorated(false);
_ui.fileList->setHeaderLabels(QStringList() << tr("Name") << tr("Size") << tr("Owner") << tr("Group") << tr("Time"));
_ui.fileList->header()->setStretchLastSection(false);
status = false; // buttons
} _ui.cdToParrent->setEnabled(false);
_ui.doneButton->setEnabled(false);
// Connection with the FTP Server. We retrieve the file list.
void CFtpSelection::ConnectButtonClicked()
{
conn = new QFtp(this);
connect(conn, SIGNAL(commandFinished(int,bool)), this, SLOT(FtpCommandFinished(int,bool)));
connect(conn, SIGNAL(listInfo(QUrlInfo)), this, SLOT(AddToList(QUrlInfo)));
#ifndef QT_NO_CURSOR
setCursor(Qt::WaitCursor);
#endif
QUrl url(_ui.url->text());
if (!url.isValid() || url.scheme().toLower() != QLatin1String("ftp")) {
conn->connectToHost(_ui.url->text(), 21);
conn->login();
} else {
conn->connectToHost(url.host(), url.port(21));
if (!url.userName().isEmpty()) status = false;
conn->login(QUrl::fromPercentEncoding(url.userName().toLatin1()), url.password()); }
else
conn->login();
if (!url.path().isEmpty())
conn->cd(url.path());
}
}
// Get the user action.
void CFtpSelection::FtpCommandFinished(int, bool error)
{
#ifndef QT_NO_CURSOR
setCursor(Qt::ArrowCursor);
#endif
if (conn->currentCommand() == QFtp::ConnectToHost)
{
if (error)
{
QMessageBox::information(this, tr("FTP"),
tr("Unable to connect to the FTP server "
"at %1. Please check that the host "
"name is correct.")
.arg(_ui.url->text()));
return;
}
return; // Connection with the FTP Server. We retrieve the file list.
} void CFtpSelection::ConnectButtonClicked()
{
if (conn->currentCommand() == QFtp::Login) conn = new QFtp(this);
{ connect(conn, SIGNAL(commandFinished(int,bool)), this, SLOT(FtpCommandFinished(int,bool)));
conn->list(); connect(conn, SIGNAL(listInfo(QUrlInfo)), this, SLOT(AddToList(QUrlInfo)));
}
if (conn->currentCommand() == QFtp::Get)
{
if(error)
{
status = false;
file->close();
file->remove();
} else {
file->close();
status = true;
}
_ui.cancelButton->setEnabled(true);
}
if (conn->currentCommand() == QFtp::List) setCursor(Qt::WaitCursor);
{
if (isDirectory.isEmpty()) {
_ui.fileList->addTopLevelItem(new QTreeWidgetItem(QStringList() << tr("<empty>")));
_ui.fileList->setEnabled(false);
}
}
}
// Make the file list with directories and files
void CFtpSelection::AddToList(const QUrlInfo &urlInfo)
{
QTreeWidgetItem *item = new QTreeWidgetItem;
item->setText(0, urlInfo.name());
item->setText(1, QString::number(urlInfo.size()));
item->setText(2, urlInfo.owner());
item->setText(3, urlInfo.group());
item->setText(4, urlInfo.lastModified().toString("MMM dd yyyy"));
QPixmap pixmap(urlInfo.isDir() ? ":/translationManager/images/dir.png" : ":/translationManager/images/file.png"); QUrl url(_ui.url->text());
item->setIcon(0, pixmap); if (!url.isValid() || url.scheme().toLower() != QLatin1String("ftp"))
isDirectory[urlInfo.name()] = urlInfo.isDir();
_ui.fileList->addTopLevelItem(item);
if (!_ui.fileList->currentItem()) {
_ui.fileList->setCurrentItem(_ui.fileList->topLevelItem(0));
_ui.fileList->setEnabled(true);
}
}
void CFtpSelection::processItem(QTreeWidgetItem* item, int)
{
QString name = item->text(0);
if (isDirectory.value(name))
{
_ui.fileList->clear();
isDirectory.clear();
currentPath += '/';
currentPath += name;
conn->cd(name);
conn->list();
#ifndef QT_NO_CURSOR
setCursor(Qt::WaitCursor);
#endif
return;
}
_ui.doneButton->setEnabled(true);
}
// Exit from a directory
void CFtpSelection::cdToParent()
{ {
#ifndef QT_NO_CURSOR conn->connectToHost(_ui.url->text(), 21);
setCursor(Qt::WaitCursor); conn->login();
#endif }
_ui.fileList->clear(); else
isDirectory.clear(); {
currentPath = currentPath.left(currentPath.lastIndexOf('/')); conn->connectToHost(url.host(), url.port(21));
if (currentPath.isEmpty()) {
_ui.cdToParrent->setEnabled(false); if (!url.userName().isEmpty())
conn->cd("/"); conn->login(QUrl::fromPercentEncoding(url.userName().toLatin1()), url.password());
} else { else
conn->cd(currentPath); conn->login();
} if (!url.path().isEmpty())
conn->list(); conn->cd(url.path());
}
}
// Get the user action.
void CFtpSelection::FtpCommandFinished(int, bool error)
{
setCursor(Qt::ArrowCursor);
if (conn->currentCommand() == QFtp::ConnectToHost)
{
if (error)
{
QMessageBox::information(this, tr("FTP"),
tr("Unable to connect to the FTP server "
"at %1. Please check that the host "
"name is correct.")
.arg(_ui.url->text()));
return;
}
return;
} }
// Done action if (conn->currentCommand() == QFtp::Login)
void CFtpSelection::DoneButtonClicked() {
{ conn->list();
QString fileName = _ui.fileList->currentItem()->text(0); }
if (QFile::exists(fileName)) { if (conn->currentCommand() == QFtp::Get)
QMessageBox::information(this, tr("FTP"), {
tr("There already exists a file called %1 in " if(error)
"the current directory.") {
.arg(fileName)); status = false;
return; file->close();
} file->remove();
}
file = new QFile(fileName); else
#ifndef QT_NO_CURSOR {
setCursor(Qt::WaitCursor); file->close();
#endif status = true;
if (!file->open(QIODevice::WriteOnly)) { }
QMessageBox::information(this, tr("FTP"), _ui.cancelButton->setEnabled(true);
tr("Unable to save the file %1: %2.") }
.arg(fileName).arg(file->errorString()));
delete file; if (conn->currentCommand() == QFtp::List)
return; {
} if (isDirectory.isEmpty())
_ui.cancelButton->setEnabled(false); {
conn->get(_ui.fileList->currentItem()->text(0), file); _ui.fileList->addTopLevelItem(new QTreeWidgetItem(QStringList() << tr("<empty>")));
_ui.fileList->setEnabled(false);
reject(); }
} }
}
// Make the file list with directories and files
void CFtpSelection::AddToList(const QUrlInfo &urlInfo)
{
QTreeWidgetItem *item = new QTreeWidgetItem;
item->setText(0, urlInfo.name());
item->setText(1, QString::number(urlInfo.size()));
item->setText(2, urlInfo.owner());
item->setText(3, urlInfo.group());
item->setText(4, urlInfo.lastModified().toString("MMM dd yyyy"));
QPixmap pixmap(urlInfo.isDir() ? ":/translationManager/images/dir.png" : ":/translationManager/images/file.png");
item->setIcon(0, pixmap);
isDirectory[urlInfo.name()] = urlInfo.isDir();
_ui.fileList->addTopLevelItem(item);
if (!_ui.fileList->currentItem())
{
_ui.fileList->setCurrentItem(_ui.fileList->topLevelItem(0));
_ui.fileList->setEnabled(true);
}
}
void CFtpSelection::processItem(QTreeWidgetItem *item, int)
{
QString name = item->text(0);
if (isDirectory.value(name))
{
_ui.fileList->clear();
isDirectory.clear();
currentPath += '/';
currentPath += name;
conn->cd(name);
conn->list();
setCursor(Qt::WaitCursor);
return;
}
_ui.doneButton->setEnabled(true);
}
// Exit from a directory
void CFtpSelection::cdToParent()
{
setCursor(Qt::WaitCursor);
_ui.fileList->clear();
isDirectory.clear();
currentPath = currentPath.left(currentPath.lastIndexOf('/'));
if (currentPath.isEmpty())
{
_ui.cdToParrent->setEnabled(false);
conn->cd("/");
}
else
{
conn->cd(currentPath);
}
conn->list();
}
// Done action
void CFtpSelection::DoneButtonClicked()
{
QString fileName = _ui.fileList->currentItem()->text(0);
if (QFile::exists(fileName))
{
QMessageBox::information(this, tr("FTP"),
tr("There already exists a file called %1 in "
"the current directory.")
.arg(fileName));
return;
}
file = new QFile(fileName);
setCursor(Qt::WaitCursor);
if (!file->open(QIODevice::WriteOnly))
{
QMessageBox::information(this, tr("FTP"),
tr("Unable to save the file %1: %2.")
.arg(fileName).arg(file->errorString()));
delete file;
return;
}
_ui.cancelButton->setEnabled(false);
conn->get(_ui.fileList->currentItem()->text(0), file);
reject();
}
} }

View file

@ -1,4 +1,4 @@
/* /*
* File: ftp_selection.h * File: ftp_selection.h
* Author: cemycc * Author: cemycc
* *
@ -8,6 +8,8 @@
#ifndef FTP_SELECTION_H #ifndef FTP_SELECTION_H
#define FTP_SELECTION_H #define FTP_SELECTION_H
#include "ui_ftp_selection.h"
#include <QtCore/QObject> #include <QtCore/QObject>
#include <QtCore/QUrl> #include <QtCore/QUrl>
#include <QtGui/QDialog> #include <QtGui/QDialog>
@ -16,34 +18,33 @@
#include <QtCore/QFile> #include <QtCore/QFile>
#include <QtNetwork> #include <QtNetwork>
#include "ui_ftp_selection.h" namespace TranslationManager
{
using namespace std; class CFtpSelection : public QDialog
{
Q_OBJECT
namespace TranslationManager { public:
CFtpSelection(QWidget *parent = 0);
class CFtpSelection : public QDialog ~CFtpSelection() {}
{ bool status;
Q_OBJECT QFile *file;
private:
Ui::FtpSelectionDialog _ui; private Q_SLOTS:
QFtp *conn; void cdToParent();
QHash<QString, bool> isDirectory; void processItem(QTreeWidgetItem *,int);
QString currentPath; void ConnectButtonClicked();
private Q_SLOTS: void DoneButtonClicked();
void cdToParent(); void FtpCommandFinished(int, bool error);
void processItem(QTreeWidgetItem*,int); void AddToList(const QUrlInfo &urlInfo);
void ConnectButtonClicked();
void DoneButtonClicked(); private:
void FtpCommandFinished(int, bool error); Ui::FtpSelectionDialog _ui;
void AddToList(const QUrlInfo &urlInfo); QFtp *conn;
public: QHash<QString, bool> isDirectory;
bool status; QString currentPath;
QFile *file; };
CFtpSelection(QWidget* parent = 0);
~CFtpSelection() {}
};
} }
#endif /* FTP_SELECTION_H */ #endif /* FTP_SELECTION_H */

View file

@ -1,39 +1,54 @@
// Translation Manager Plugin - OVQT Plugin <http://dev.ryzom.com/projects/nel/>
#include <QtGui/qlistwidget.h> // Copyright (C) 2010 Winch Gate Property Limited
// Copyright (C) 2011 Emanuel Costea <cemycc@gmail.com>
//
// 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 <http://www.gnu.org/licenses/>.
#include "source_selection.h" #include "source_selection.h"
#include <QtGui/QListWidget>
namespace TranslationManager namespace TranslationManager
{ {
CSourceDialog::CSourceDialog(QWidget *parent): QDialog(parent) CSourceDialog::CSourceDialog(QWidget *parent): QDialog(parent)
{ {
_ui.setupUi(this); _ui.setupUi(this);
// Set signal and slot for "OK Button"
connect(_ui.ok_button, SIGNAL(clicked()), this, SLOT(OkButtonClicked())); connect(_ui.ok_button, SIGNAL(clicked()), this, SLOT(OkButtonClicked()));
// Set signal and slot for "Cancel Button" connect(_ui.cancel_button, SIGNAL(clicked()), this, SLOT(reject()));
connect(_ui.cancel_button, SIGNAL(clicked()), this, SLOT(reject()));
_ui.sourceSelectionListWidget->setSortingEnabled(false); _ui.sourceSelectionListWidget->setSortingEnabled(false);
connect(_ui.sourceSelectionListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem *)), connect(_ui.sourceSelectionListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem *)),
this, SLOT(itemDoubleClicked(QListWidgetItem *))); this, SLOT(itemDoubleClicked(QListWidgetItem *)));
} }
// Insert options in the source dialog. Options like: from FTP Server, from Local directory etc. // Insert options in the source dialog. Options like: from FTP Server, from Local directory etc.
void CSourceDialog::setSourceOptions(map<QListWidgetItem*,int> options) void CSourceDialog::setSourceOptions(std::map<QListWidgetItem *, int> &options)
{ {
map<QListWidgetItem*,int>::iterator it; std::map<QListWidgetItem *,int>::iterator it;
for(it = options.begin(); it != options.end(); ++it) for(it = options.begin(); it != options.end(); ++it)
{ {
_ui.sourceSelectionListWidget->addItem((*it).first); _ui.sourceSelectionListWidget->addItem((*it).first);
} }
} }
void CSourceDialog::OkButtonClicked() void CSourceDialog::OkButtonClicked()
{ {
selected_item = _ui.sourceSelectionListWidget->currentItem(); selected_item = _ui.sourceSelectionListWidget->currentItem();
accept(); accept();
} }
void CSourceDialog::itemDoubleClicked(QListWidgetItem *item) void CSourceDialog::itemDoubleClicked(QListWidgetItem *item)
@ -42,4 +57,4 @@ void CSourceDialog::itemDoubleClicked(QListWidgetItem *item)
accept(); accept();
} }
} }

View file

@ -1,16 +1,30 @@
// Translation Manager Plugin - OVQT Plugin <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2011 Emanuel Costea <cemycc@gmail.com>
//
// 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 <http://www.gnu.org/licenses/>.
#ifndef SOURCE_SELECTION_H #ifndef SOURCE_SELECTION_H
#define SOURCE_SELECTION_H #define SOURCE_SELECTION_H
#include "ui_source_selection.h"
#include <QtCore/QObject> #include <QtCore/QObject>
#include <QtGui/QDialog> #include <QtGui/QDialog>
#include <QtCore/QString> #include <QtCore/QString>
#include <QtGui/QListWidgetItem> #include <QtGui/QListWidgetItem>
#include "ui_source_selection.h"
#include <map>
using namespace std; #include <map>
namespace TranslationManager namespace TranslationManager
{ {
@ -18,16 +32,19 @@ namespace TranslationManager
class CSourceDialog : public QDialog class CSourceDialog : public QDialog
{ {
Q_OBJECT Q_OBJECT
private:
Ui::SourceSelectionDialog _ui; public:
CSourceDialog(QWidget *parent = 0);
~CSourceDialog() {}
void setSourceOptions(std::map<QListWidgetItem *, int> &options);
QListWidgetItem *selected_item;
private Q_SLOTS: private Q_SLOTS:
void OkButtonClicked(); void OkButtonClicked();
void itemDoubleClicked(QListWidgetItem *item); void itemDoubleClicked(QListWidgetItem *item);
public:
CSourceDialog(QWidget *parent = 0); private:
~CSourceDialog(){} Ui::SourceSelectionDialog _ui;
void setSourceOptions(map<QListWidgetItem*, int> options);
QListWidgetItem *selected_item;
}; };
} }

View file

@ -1,29 +1,38 @@
/* // Translation Manager Plugin - OVQT Plugin <http://dev.ryzom.com/projects/nel/>
* File: translation_manager_constants.h // Copyright (C) 2011 Emanuel Costea <cemycc@gmail.com>
* Author: cemycc //
* // This program is free software: you can redistribute it and/or modify
* Created on July 5, 2011, 9:15 PM // 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 <http://www.gnu.org/licenses/>.
#ifndef TRANSLATION_MANAGER_CONSTANTS_H #ifndef TRANSLATION_MANAGER_CONSTANTS_H
#define TRANSLATION_MANAGER_CONSTANTS_H #define TRANSLATION_MANAGER_CONSTANTS_H
namespace TranslationManager namespace TranslationManager
{ {
namespace Constants namespace Constants
{ {
const int ED_SHEET = 1; const int ED_SHEET = 1;
const int ED_PHRASE = 2; const int ED_PHRASE = 2;
const char * const WK_BOTNAMES = "bot_names_wk.txt"; const char *const WK_BOTNAMES = "bot_names_wk.txt";
const char * const WK_ITEM = "item_words_wk.txt"; const char *const WK_ITEM = "item_words_wk.txt";
const char * const WK_CREATURE = "creature_words_wk.txt"; const char *const WK_CREATURE = "creature_words_wk.txt";
const char * const WK_SBRICK = "sbrick_words_wk.txt"; const char *const WK_SBRICK = "sbrick_words_wk.txt";
const char * const WK_SPHRASE = "sphrase_words_wk.txt"; const char *const WK_SPHRASE = "sphrase_words_wk.txt";
const char * const WK_PLACE = "place_words_wk.txt"; const char *const WK_PLACE = "place_words_wk.txt";
const char * const WK_CONTINENT = "place_words_wk.txt"; const char *const WK_CONTINENT = "place_words_wk.txt";
const char * const WK_STABLE = "place_words_wk.txt"; const char *const WK_STABLE = "place_words_wk.txt";
} }
} }
#endif /* TRANSLATION_MANAGER_CONSTANTS_H */ #endif /* TRANSLATION_MANAGER_CONSTANTS_H */

View file

@ -1,5 +1,4 @@
// Translation Manager Plugin - OVQT Plugin <http://dev.ryzom.com/projects/nel/> // Translation Manager Plugin - OVQT Plugin <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
// Copyright (C) 2011 Emanuel Costea <cemycc@gmail.com> // Copyright (C) 2011 Emanuel Costea <cemycc@gmail.com>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
@ -25,31 +24,30 @@
#include <QtGui/QUndoStack> #include <QtGui/QUndoStack>
#include <QtCore/QFileInfo> #include <QtCore/QFileInfo>
namespace TranslationManager { namespace TranslationManager
{
class CEditor : public QMdiSubWindow {
Q_OBJECT class CEditor : public QMdiSubWindow
protected: {
QUndoStack* current_stack; Q_OBJECT
QString current_file;
int editor_type;
public:
CEditor(QMdiArea* parent) : QMdiSubWindow(parent) {}
CEditor() : QMdiSubWindow() {}
virtual void open(QString filename) =0;
virtual void save() =0;
virtual void saveAs(QString filename) =0;
virtual void activateWindow() =0;
public: public:
CEditor(QMdiArea *parent) : QMdiSubWindow(parent) {}
CEditor() : QMdiSubWindow() {}
virtual void open(QString filename) =0;
virtual void save() =0;
virtual void saveAs(QString filename) =0;
virtual void activateWindow() =0;
int eType() int eType()
{ {
return editor_type; return editor_type;
} }
QString subWindowFilePath() QString subWindowFilePath()
{ {
return current_file; return current_file;
} }
void setUndoStack(QUndoStack* stack) void setUndoStack(QUndoStack *stack)
{ {
current_stack = stack; current_stack = stack;
} }
@ -58,14 +56,16 @@ public:
QFileInfo *file = new QFileInfo(filename); QFileInfo *file = new QFileInfo(filename);
current_file = file->canonicalFilePath(); current_file = file->canonicalFilePath();
setWindowModified(false); setWindowModified(false);
setWindowTitle(file->fileName() + "[*]"); setWindowTitle(file->fileName() + "[*]");
setWindowFilePath(current_file); setWindowFilePath(current_file);
} }
protected:
QUndoStack *current_stack;
QString current_file;
int editor_type;
}; };
} }
#endif /* TRANSLATION_MANAGER_EDITOR_H */
#endif /* TRANSLATION_MANAGER_EDITOR_H */

View file

@ -1,5 +1,4 @@
// Translation Manager Plugin - OVQT Plugin <http://dev.ryzom.com/projects/nel/> // Translation Manager Plugin - OVQT Plugin <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
// Copyright (C) 2011 Emanuel Costea <cemycc@gmail.com> // Copyright (C) 2011 Emanuel Costea <cemycc@gmail.com>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
@ -15,20 +14,19 @@
// You should have received a copy of the GNU Affero General Public License // You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>. // along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef MAIN_WINDOW_H #ifndef MAIN_WINDOW_H
#define MAIN_WINDOW_H #define MAIN_WINDOW_H
// Project includes
#include "ui_translation_manager_main_window.h"
#include "translation_manager_editor.h"
#include "source_selection.h"
#include "editor_worksheet.h"
#include "editor_phrase.h"
// Project system includes // Project system includes
#include "../core/icore_listener.h" #include "../core/icore_listener.h"
// Nel includes
#include "nel/misc/types_nl.h"
#include "nel/misc/sheet_id.h"
#include "nel/misc/path.h"
#include "nel/misc/diff_tool.h"
#include "nel/ligo/ligo_config.h"
// Qt includes // Qt includes
#include <QtCore/QObject> #include <QtCore/QObject>
#include <QtGui/QUndoStack> #include <QtGui/QUndoStack>
@ -39,80 +37,82 @@
#include <QtCore/QSignalMapper> #include <QtCore/QSignalMapper>
#include <QtGui/QDialog> #include <QtGui/QDialog>
// Plugin includes // STL includes
#include "translation_manager_editor.h"
#include "source_selection.h"
#include "ui_translation_manager_main_window.h"
#include <set> #include <set>
#include "editor_worksheet.h"
#include "editor_phrase.h"
class QWidget;
// Nel includes
#include "nel/misc/types_nl.h"
#include "nel/misc/sheet_id.h"
#include "nel/misc/path.h"
#include "nel/misc/diff_tool.h"
#include "nel/ligo/ligo_config.h"
using namespace std; using namespace std;
namespace TranslationManager namespace TranslationManager
{ {
class CMainWindow : public QMainWindow class CMainWindow : public QMainWindow
{ {
Q_OBJECT Q_OBJECT
public: public:
CMainWindow(QWidget *parent = 0); CMainWindow(QWidget *parent = 0);
virtual ~CMainWindow() {} virtual ~CMainWindow() {}
QUndoStack *m_undoStack; QUndoStack *m_undoStack;
public: public:
Ui::CMainWindow _ui; Ui::CMainWindow _ui;
private:
// actions
QAction *openAct;
QAction *saveAct;
QAction *saveAsAct;
QMenu *windowMenu;
QSignalMapper *windowMapper;
// config
QMap<string,bool> initialize_settings;
QList<QString> filters;
QList<QString> languages;
QString level_design_path;
QString primitives_path;
QString translation_path;
QString work_path;
NLLIGO::CLigoConfig ligoConfig;
private Q_SLOTS:
void extractBotNames();
void extractWords(QString typeq);
void open();
void save();
void saveAs();
void setActiveSubWindow(QWidget *window);
void updateWindowsList();
void mergeSingleFile();
private: private:
void openWorkFile(QString file); // actions
void updateToolbar(QMdiSubWindow *window); QAction *openAct;
bool verifySettings(); QAction *saveAct;
void readSettings(); QAction *saveAsAct;
void createMenus(); QMenu *windowMenu;
void createToolbar(); QSignalMapper *windowMapper;
void initializeSettings(bool georges); // config
list<string> convertQStringList(QStringList listq); QMap<string,bool> initialize_settings;
CEditor* getEditorByWindowFilePath(const QString &fileName); QList<QString> filters;
QList<QString> languages;
QString level_design_path;
QString primitives_path;
QString translation_path;
QString work_path;
NLLIGO::CLigoConfig ligoConfig;
private Q_SLOTS:
void extractBotNames();
void extractWords(QString typeq);
void open();
void save();
void saveAs();
void setActiveSubWindow(QWidget *window);
void updateWindowsList();
void mergeSingleFile();
private:
void openWorkFile(QString file);
void updateToolbar(QMdiSubWindow *window);
bool verifySettings();
void readSettings();
void createMenus();
void createToolbar();
void initializeSettings(bool georges);
std::list<std::string> convertQStringList(QStringList listq);
CEditor *getEditorByWindowFilePath(const QString &fileName);
// Worksheet specific functions // Worksheet specific functions
CEditorWorksheet* getEditorByWorksheetType(const QString &type); CEditorWorksheet *getEditorByWorksheetType(const QString &type);
bool isWorksheetEditor(QString filename); bool isWorksheetEditor(QString filename);
bool isPhraseEditor(QString filename); bool isPhraseEditor(QString filename);
}; };
class CCoreListener : public Core::ICoreListener class CCoreListener : public Core::ICoreListener
{ {
Q_OBJECT Q_OBJECT
public: public:
CCoreListener(CMainWindow* mainWindow, QObject *parent = 0): ICoreListener(parent) CCoreListener(CMainWindow *mainWindow, QObject *parent = 0): ICoreListener(parent)
{ {
m_MainWindow = mainWindow; m_MainWindow = mainWindow;
} }
@ -124,10 +124,6 @@ public:
CMainWindow *m_MainWindow; CMainWindow *m_MainWindow;
}; };
} // namespace TranslationManager } // namespace TranslationManager
#endif
#endif // SIMPLE_VIEWER_H

View file

@ -19,7 +19,8 @@
#include "translation_manager_plugin.h" #include "translation_manager_plugin.h"
#include "translation_manager_settings_page.h" #include "translation_manager_settings_page.h"
#include "translation_manager_main_window.h" #include "translation_manager_main_window.h"
// Project system includes
// Core includes
#include "../core/icore.h" #include "../core/icore.h"
#include "../core/core_constants.h" #include "../core/core_constants.h"
#include "../core/menu_manager.h" #include "../core/menu_manager.h"
@ -59,17 +60,14 @@ bool TranslationManagerPlugin::initialize(ExtensionSystem::IPluginManager *plugi
addAutoReleasedObject(new CTranslationManagerSettingsPage(this)); addAutoReleasedObject(new CTranslationManagerSettingsPage(this));
addAutoReleasedObject(new CTranslationManagerContext(mainWindow, this)); addAutoReleasedObject(new CTranslationManagerContext(mainWindow, this));
addAutoReleasedObject(new CCoreListener(mainWindow, this)); addAutoReleasedObject(new CCoreListener(mainWindow, this));
return true; return true;
} }
void TranslationManagerPlugin::extensionsInitialized() void TranslationManagerPlugin::extensionsInitialized()
{ {
} }
void TranslationManagerPlugin::setNelContext(NLMISC::INelContext *nelContext) void TranslationManagerPlugin::setNelContext(NLMISC::INelContext *nelContext)
{ {
#ifdef NL_OS_WINDOWS #ifdef NL_OS_WINDOWS
@ -86,23 +84,6 @@ void TranslationManagerPlugin::addAutoReleasedObject(QObject *obj)
_autoReleaseObjects.prepend(obj); _autoReleaseObjects.prepend(obj);
} }
QObject* TranslationManagerPlugin::objectByName(const QString &name) const
{
Q_FOREACH (QObject *qobj, _plugMan->allObjects())
if (qobj->objectName() == name)
return qobj;
return 0;
} }
ExtensionSystem::IPluginSpec *TranslationManagerPlugin::pluginByName(const QString &name) const Q_EXPORT_PLUGIN(TranslationManager::TranslationManagerPlugin)
{
Q_FOREACH (ExtensionSystem::IPluginSpec *spec, _plugMan->plugins())
if (spec->name() == name)
return spec;
return 0;
}
}
Q_EXPORT_PLUGIN(TranslationManager::TranslationManagerPlugin)

View file

@ -45,8 +45,8 @@ class IPluginSpec;
namespace TranslationManager namespace TranslationManager
{ {
class CTranslationManagerContext; class CTranslationManagerContext;
class TranslationManagerPlugin : public QObject, public ExtensionSystem::IPlugin class TranslationManagerPlugin : public QObject, public ExtensionSystem::IPlugin
{ {
Q_OBJECT Q_OBJECT
@ -58,12 +58,8 @@ public:
void extensionsInitialized(); void extensionsInitialized();
void setNelContext(NLMISC::INelContext *nelContext); void setNelContext(NLMISC::INelContext *nelContext);
void addAutoReleasedObject(QObject *obj); void addAutoReleasedObject(QObject *obj);
QObject *objectByName(const QString &name) const;
ExtensionSystem::IPluginSpec *pluginByName(const QString &name) const;
protected: protected:
NLMISC::CLibraryContext *_LibContext; NLMISC::CLibraryContext *_LibContext;
@ -75,8 +71,9 @@ private:
class CTranslationManagerContext: public Core::IContext class CTranslationManagerContext: public Core::IContext
{ {
Q_OBJECT Q_OBJECT
public: public:
CTranslationManagerContext(CMainWindow* mainWindow, QObject *parent = 0): IContext(parent) CTranslationManagerContext(CMainWindow *mainWindow, QObject *parent = 0): IContext(parent)
{ {
m_MainWindow = mainWindow; m_MainWindow = mainWindow;
} }
@ -109,9 +106,8 @@ public:
} }
CMainWindow *m_MainWindow; CMainWindow *m_MainWindow;
}; };
} // namespace Plugin }
#endif // TRANSLATION_MANAGER_PLUGIN_H #endif // TRANSLATION_MANAGER_PLUGIN_H

View file

@ -1,5 +1,4 @@
// Translation Manager Plugin - OVQT Plugin <http://dev.ryzom.com/projects/nel/> // Translation Manager Plugin - OVQT Plugin <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
// Copyright (C) 2011 Emanuel Costea <cemycc@gmail.com> // Copyright (C) 2011 Emanuel Costea <cemycc@gmail.com>
// //
// This program is free software: you can redistribute it and/or modify // This program is free software: you can redistribute it and/or modify
@ -17,17 +16,15 @@
#include "translation_manager_settings_page.h" #include "translation_manager_settings_page.h"
// Core includes
#include "../core/icore.h"
// Qt includes // Qt includes
#include <QtCore/QSettings> #include <QtCore/QSettings>
#include <QtGui/QWidget> #include <QtGui/QWidget>
#include <QtGui/QFileDialog> #include <QtGui/QFileDialog>
#include <QtGui/QListWidgetItem> #include <QtGui/QListWidgetItem>
// NeL includes
// Project includes
#include "../core/icore.h"
namespace TranslationManager namespace TranslationManager
{ {
@ -68,20 +65,20 @@ QWidget *CTranslationManagerSettingsPage::createPage(QWidget *parent)
{ {
_currentPage = new QWidget(parent); _currentPage = new QWidget(parent);
_ui.setupUi(_currentPage); _ui.setupUi(_currentPage);
readSettings(); readSettings();
connect(_ui.filter_add, SIGNAL(clicked()), this, SLOT(filterAdd())); connect(_ui.filter_add, SIGNAL(clicked()), this, SLOT(filterAdd()));
connect(_ui.filter_del, SIGNAL(clicked()), this, SLOT(filterDel())); connect(_ui.filter_del, SIGNAL(clicked()), this, SLOT(filterDel()));
connect(_ui.lang_add, SIGNAL(clicked()), this, SLOT(languageAdd())); connect(_ui.lang_add, SIGNAL(clicked()), this, SLOT(languageAdd()));
connect(_ui.lang_del, SIGNAL(clicked()), this, SLOT(languageDel())); connect(_ui.lang_del, SIGNAL(clicked()), this, SLOT(languageDel()));
connect(_ui.translation_add, SIGNAL(clicked()), this, SLOT(translationAdd())); connect(_ui.translation_add, SIGNAL(clicked()), this, SLOT(translationAdd()));
connect(_ui.work_add, SIGNAL(clicked()), this, SLOT(workAdd())); connect(_ui.work_add, SIGNAL(clicked()), this, SLOT(workAdd()));
return _currentPage; return _currentPage;
} }
void CTranslationManagerSettingsPage::filterAdd() void CTranslationManagerSettingsPage::filterAdd()
{ {
QString newValue = _ui.filter_edit->text(); QString newValue = _ui.filter_edit->text();
if (!newValue.isEmpty()) if (!newValue.isEmpty())
{ {
QListWidgetItem *newItem = new QListWidgetItem; QListWidgetItem *newItem = new QListWidgetItem;
@ -95,113 +92,112 @@ void CTranslationManagerSettingsPage::filterDel()
{ {
QListWidgetItem *removeItem = _ui.filter_list->takeItem(_ui.filter_list->currentRow()); QListWidgetItem *removeItem = _ui.filter_list->takeItem(_ui.filter_list->currentRow());
if (!removeItem) if (!removeItem)
delete removeItem; delete removeItem;
} }
void CTranslationManagerSettingsPage::languageAdd() void CTranslationManagerSettingsPage::languageAdd()
{ {
QString newValue = _ui.lang_edit->text(); QString newValue = _ui.lang_edit->text();
if (!newValue.isEmpty()) if (!newValue.isEmpty())
{ {
QListWidgetItem *newItem = new QListWidgetItem; QListWidgetItem *newItem = new QListWidgetItem;
newItem->setText(newValue); newItem->setText(newValue);
newItem->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); newItem->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
_ui.lang_list->addItem(newItem); _ui.lang_list->addItem(newItem);
} }
} }
void CTranslationManagerSettingsPage::languageDel() void CTranslationManagerSettingsPage::languageDel()
{ {
QListWidgetItem *removeItem = _ui.lang_list->takeItem(_ui.lang_list->currentRow()); QListWidgetItem *removeItem = _ui.lang_list->takeItem(_ui.lang_list->currentRow());
if (!removeItem) if (!removeItem)
delete removeItem; delete removeItem;
} }
void CTranslationManagerSettingsPage::translationAdd() void CTranslationManagerSettingsPage::translationAdd()
{ {
QString newPath = QFileDialog::getExistingDirectory(_currentPage, ""); QString newPath = QFileDialog::getExistingDirectory(_currentPage, "");
if (!newPath.isEmpty()) if (!newPath.isEmpty())
{ {
_ui.translation_edit->setText(newPath); _ui.translation_edit->setText(newPath);
} }
} }
void CTranslationManagerSettingsPage::workAdd() void CTranslationManagerSettingsPage::workAdd()
{ {
QString newPath = QFileDialog::getExistingDirectory(_currentPage, ""); QString newPath = QFileDialog::getExistingDirectory(_currentPage, "");
if (!newPath.isEmpty()) if (!newPath.isEmpty())
{ {
_ui.work_edit->setText(newPath); _ui.work_edit->setText(newPath);
} }
} }
void CTranslationManagerSettingsPage::apply() void CTranslationManagerSettingsPage::apply()
{ {
writeSettings(); writeSettings();
} }
void CTranslationManagerSettingsPage::readSettings() void CTranslationManagerSettingsPage::readSettings()
{ {
QStringList filters, languages; QStringList filters, languages;
QString ligo, translation, work; QString ligo, translation, work;
QSettings *settings = Core::ICore::instance()->settings(); QSettings *settings = Core::ICore::instance()->settings();
settings->beginGroup("translationmanager"); settings->beginGroup("translationmanager");
filters = settings->value("filters").toStringList(); /* filters */ filters = settings->value("filters").toStringList(); /* filters */
languages = settings->value("trlanguages").toStringList(); /* languages */ languages = settings->value("trlanguages").toStringList(); /* languages */
ligo = settings->value("ligo").toString(); ligo = settings->value("ligo").toString();
translation = settings->value("translation").toString(); translation = settings->value("translation").toString();
work = settings->value("work").toString(); work = settings->value("work").toString();
settings->endGroup(); settings->endGroup();
// filter // filter
Q_FOREACH(QString filter, filters) Q_FOREACH(QString filter, filters)
{ {
QListWidgetItem *newItem = new QListWidgetItem; QListWidgetItem *newItem = new QListWidgetItem;
newItem->setText(filter); newItem->setText(filter);
newItem->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); newItem->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
_ui.filter_list->addItem(newItem); _ui.filter_list->addItem(newItem);
} }
// languages // languages
Q_FOREACH(QString lang, languages) Q_FOREACH(QString lang, languages)
{ {
QListWidgetItem *newItem = new QListWidgetItem; QListWidgetItem *newItem = new QListWidgetItem;
newItem->setText(lang); newItem->setText(lang);
newItem->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); newItem->setFlags(Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
_ui.lang_list->addItem(newItem); _ui.lang_list->addItem(newItem);
} }
// translation // translation
_ui.translation_edit->setText(translation); _ui.translation_edit->setText(translation);
// work // work
_ui.work_edit->setText(work); _ui.work_edit->setText(work);
} }
void CTranslationManagerSettingsPage::writeSettings() void CTranslationManagerSettingsPage::writeSettings()
{ {
QStringList filters, languages; QStringList filters, languages;
QString ligo, translation, work; QString ligo, translation, work;
// filters // filters
for (int i = 0; i < _ui.filter_list->count(); ++i) for (int i = 0; i < _ui.filter_list->count(); ++i)
filters << _ui.filter_list->item(i)->text(); filters << _ui.filter_list->item(i)->text();
// languages // languages
for (int i = 0; i < _ui.lang_list->count(); ++i) for (int i = 0; i < _ui.lang_list->count(); ++i)
languages << _ui.lang_list->item(i)->text(); languages << _ui.lang_list->item(i)->text();
// translations path // translations path
translation = _ui.translation_edit->text(); translation = _ui.translation_edit->text();
// work path // work path
work = _ui.work_edit->text(); work = _ui.work_edit->text();
QSettings *settings = Core::ICore::instance()->settings(); QSettings *settings = Core::ICore::instance()->settings();
settings->beginGroup("translationmanager"); settings->beginGroup("translationmanager");
settings->setValue("filters", filters); settings->setValue("filters", filters);
settings->setValue("trlanguages", languages); settings->setValue("trlanguages", languages);
settings->setValue("translation", translation); settings->setValue("translation", translation);
settings->setValue("work", work); settings->setValue("work", work);
settings->endGroup(); settings->endGroup();
settings->sync(); settings->sync();
} }
}
} /* namespace Plugin */

View file

@ -24,13 +24,9 @@
#include "ui_translation_manager_settings_page.h" #include "ui_translation_manager_settings_page.h"
class QWidget;
namespace TranslationManager namespace TranslationManager
{ {
/**
@class CTranslationManagerSettingsPage
*/
class CTranslationManagerSettingsPage : public Core::IOptionsPage class CTranslationManagerSettingsPage : public Core::IOptionsPage
{ {
Q_OBJECT Q_OBJECT
@ -44,23 +40,23 @@ public:
virtual QString trCategory() const; virtual QString trCategory() const;
virtual QIcon categoryIcon() const; virtual QIcon categoryIcon() const;
virtual QWidget *createPage(QWidget *parent); virtual QWidget *createPage(QWidget *parent);
virtual void apply(); virtual void apply();
virtual void finish() {} virtual void finish() {}
private Q_SLOTS: private Q_SLOTS:
void filterAdd(); void filterAdd();
void filterDel(); void filterDel();
void languageAdd(); void languageAdd();
void languageDel(); void languageDel();
void translationAdd(); void translationAdd();
void workAdd(); void workAdd();
private: private:
QWidget *_currentPage; QWidget *_currentPage;
Ui::CTranslationManagerSettingsPage _ui; Ui::CTranslationManagerSettingsPage _ui;
void writeSettings(); void writeSettings();
void readSettings(); void readSettings();
}; };
} // namespace Plugin }
#endif // TRANSLATION_MANAGER_SETTINGS_H #endif // TRANSLATION_MANAGER_SETTINGS_H

View file

@ -6,178 +6,152 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>533</width> <width>589</width>
<height>478</height> <height>490</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<widget class="QGroupBox" name="groupBox"> <layout class="QGridLayout" name="gridLayout_5">
<property name="geometry"> <item row="0" column="0">
<rect> <widget class="QGroupBox" name="groupBox">
<x>0</x> <property name="title">
<y>10</y> <string>Translation Manager Plugin</string>
<width>531</width> </property>
<height>421</height> <layout class="QGridLayout" name="gridLayout_4">
</rect> <item row="0" column="0">
</property> <layout class="QGridLayout" name="gridLayout">
<property name="title"> <item row="0" column="0">
<string>Translation Manager Plugin</string> <widget class="QLabel" name="label_5">
</property> <property name="text">
<widget class="QWidget" name=""> <string>Filters</string>
<property name="geometry"> </property>
<rect> </widget>
<x>0</x> </item>
<y>30</y> <item row="0" column="1">
<width>521</width> <widget class="QLineEdit" name="filter_edit"/>
<height>232</height> </item>
</rect> <item row="0" column="2">
</property> <widget class="QToolButton" name="filter_add">
<layout class="QGridLayout" name="gridLayout"> <property name="text">
<item row="0" column="0"> <string/>
<widget class="QLabel" name="label_5"> </property>
<property name="text"> <property name="icon">
<string>Filters</string> <iconset resource="../core/core.qrc">
</property> <normaloff>:/core/icons/ic_nel_add_item.png</normaloff>:/core/icons/ic_nel_add_item.png</iconset>
</widget> </property>
</item> <property name="autoRaise">
<item row="0" column="1"> <bool>true</bool>
<widget class="QLineEdit" name="filter_edit"/> </property>
</item> </widget>
<item row="0" column="2"> </item>
<widget class="QToolButton" name="filter_add"> <item row="0" column="3">
<property name="text"> <widget class="QToolButton" name="filter_del">
<string/> <property name="text">
</property> <string/>
<property name="icon"> </property>
<iconset resource="../core/core.qrc"> <property name="icon">
<normaloff>:/core/icons/ic_nel_add_item.png</normaloff>:/core/icons/ic_nel_add_item.png</iconset> <iconset resource="../core/core.qrc">
</property> <normaloff>:/core/icons/ic_nel_delete_item.png</normaloff>:/core/icons/ic_nel_delete_item.png</iconset>
<property name="autoRaise"> </property>
<bool>true</bool> <property name="autoRaise">
</property> <bool>true</bool>
</widget> </property>
</item> </widget>
<item row="0" column="3"> </item>
<widget class="QToolButton" name="filter_del"> <item row="0" column="4">
<property name="text"> <widget class="QLabel" name="label_7">
<string/> <property name="text">
</property> <string>Languages</string>
<property name="icon"> </property>
<iconset resource="../core/core.qrc"> </widget>
<normaloff>:/core/icons/ic_nel_delete_item.png</normaloff>:/core/icons/ic_nel_delete_item.png</iconset> </item>
</property> <item row="0" column="5">
<property name="autoRaise"> <widget class="QLineEdit" name="lang_edit"/>
<bool>true</bool> </item>
</property> <item row="0" column="6">
</widget> <widget class="QToolButton" name="lang_add">
</item> <property name="text">
<item row="0" column="4"> <string/>
<widget class="QLabel" name="label_7"> </property>
<property name="text"> <property name="icon">
<string>Languages</string> <iconset resource="../core/core.qrc">
</property> <normaloff>:/core/icons/ic_nel_add_item.png</normaloff>:/core/icons/ic_nel_add_item.png</iconset>
</widget> </property>
</item> <property name="autoRaise">
<item row="0" column="5"> <bool>true</bool>
<widget class="QLineEdit" name="lang_edit"/> </property>
</item> </widget>
<item row="0" column="6"> </item>
<widget class="QToolButton" name="lang_add"> <item row="0" column="7">
<property name="text"> <widget class="QToolButton" name="lang_del">
<string/> <property name="text">
</property> <string/>
<property name="icon"> </property>
<iconset resource="../core/core.qrc"> <property name="icon">
<normaloff>:/core/icons/ic_nel_add_item.png</normaloff>:/core/icons/ic_nel_add_item.png</iconset> <iconset resource="../core/core.qrc">
</property> <normaloff>:/core/icons/ic_nel_delete_item.png</normaloff>:/core/icons/ic_nel_delete_item.png</iconset>
<property name="autoRaise"> </property>
<bool>true</bool> <property name="autoRaise">
</property> <bool>true</bool>
</widget> </property>
</item> </widget>
<item row="0" column="7"> </item>
<widget class="QToolButton" name="lang_del"> <item row="1" column="0" colspan="4">
<property name="text"> <widget class="QListWidget" name="filter_list"/>
<string/> </item>
</property> <item row="1" column="4" colspan="4">
<property name="icon"> <widget class="QListWidget" name="lang_list"/>
<iconset resource="../core/core.qrc"> </item>
<normaloff>:/core/icons/ic_nel_delete_item.png</normaloff>:/core/icons/ic_nel_delete_item.png</iconset> </layout>
</property> </item>
<property name="autoRaise"> <item row="1" column="0">
<bool>true</bool> <layout class="QGridLayout" name="gridLayout_3">
</property> <item row="0" column="0">
</widget> <widget class="QLabel" name="label_8">
</item> <property name="text">
<item row="1" column="0" colspan="4"> <string>Work directory</string>
<widget class="QListWidget" name="filter_list"/> </property>
</item> </widget>
<item row="1" column="4" colspan="4"> </item>
<widget class="QListWidget" name="lang_list"/> <item row="1" column="0">
</item> <widget class="QLineEdit" name="work_edit"/>
</layout> </item>
</widget> <item row="1" column="1">
<widget class="QWidget" name=""> <widget class="QToolButton" name="work_add">
<property name="geometry"> <property name="text">
<rect> <string>...</string>
<x>0</x> </property>
<y>340</y> </widget>
<width>521</width> </item>
<height>60</height> </layout>
</rect> </item>
</property> <item row="2" column="0">
<layout class="QGridLayout" name="gridLayout_2"> <layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0"> <item row="0" column="0">
<widget class="QLabel" name="label_6"> <widget class="QLabel" name="label_6">
<property name="text"> <property name="text">
<string>Translation directory</string> <string>Translation directory</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLineEdit" name="translation_edit"/> <widget class="QLineEdit" name="translation_edit"/>
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QToolButton" name="translation_add"> <widget class="QToolButton" name="translation_add">
<property name="text"> <property name="text">
<string>...</string> <string>...</string>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </item>
<widget class="QWidget" name=""> </layout>
<property name="geometry"> </widget>
<rect> </item>
<x>0</x> </layout>
<y>270</y>
<width>521</width>
<height>60</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Work directory</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLineEdit" name="work_edit"/>
</item>
<item row="1" column="1">
<widget class="QToolButton" name="work_add">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</widget> </widget>
<resources> <resources>
<include location="../core/core.qrc"/> <include location="../core/core.qrc"/>

View file

@ -0,0 +1,40 @@
// Object Viewer Qt - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
// Copyright (C) 2011 Dzmitry Kamiahin <dnk-88@tut.by>
//
// 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 <http://www.gnu.org/licenses/>.
#include "zone_painter_model.h"
// STL includes
// Qt includes
// NeL includes
namespace Plugin
{
CZonePainterModel::CZonePainterModel()
{
}
CZonePainterModel::~CZonePainterModel()
{
}
} /* namespace Plugin */

View file

@ -0,0 +1,42 @@
// Object Viewer Qt - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010 Winch Gate Property Limited
// Copyright (C) 2011 Dzmitry Kamiahin <dnk-88@tut.by>
//
// 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 <http://www.gnu.org/licenses/>.
#ifndef ZONE_PAINTER_MODEL_H
#define ZONE_PAINTER_MODEL_H
// NeL includes
#include <nel/misc/types_nl.h>
#include <nel/misc/rgba.h>
#include <nel/misc/event_emitter.h>
// Qt includes
namespace Plugin
{
class CZonePainterModel
{
public:
CZonePainterModel();
virtual ~CZonePainterModel();
}; /* class CZonePainterModel */
} /* namespace Plugin */
#endif // ZONE_PAINTER_MODEL_H

View file

@ -16,6 +16,7 @@
#include <QtGui/QMenu> #include <QtGui/QMenu>
#include <QtGui/QAction> #include <QtGui/QAction>
#include <QtGui/QMenuBar> #include <QtGui/QMenuBar>
#include <QtGui/QFileDialog>
namespace Plugin namespace Plugin
{ {
@ -39,6 +40,7 @@ bool ZonePainterPlugin::initialize(ExtensionSystem::IPluginManager *pluginManage
addAutoReleasedObject(new CZonePainterSettingsPage(this)); addAutoReleasedObject(new CZonePainterSettingsPage(this));
addAutoReleasedObject(new CZonePainterContext(this)); addAutoReleasedObject(new CZonePainterContext(this));
//addAutoReleasedObject(new CCoreListener(this)); //addAutoReleasedObject(new CCoreListener(this));
return true; return true;
} }
@ -46,8 +48,26 @@ void ZonePainterPlugin::extensionsInitialized()
{ {
Core::ICore *core = Core::ICore::instance(); Core::ICore *core = Core::ICore::instance();
Core::MenuManager *menuManager = core->menuManager(); Core::MenuManager *menuManager = core->menuManager();
QAction *loadZoneAction = new QAction("Load Zone", this);
QAction *saveZoneAction = new QAction("Save Zone", this);
QMenu *toolsMenu = menuManager->menu(Core::Constants::M_TOOLS);
QMenu *zoneMenu = toolsMenu->addMenu("Zone Painter");
zoneMenu->addAction(loadZoneAction);
connect(loadZoneAction, SIGNAL(triggered()), this, SLOT(clickLoadZoneAction()));
zoneMenu->addAction(saveZoneAction);
} }
/****** SLOTS ******/
void ZonePainterPlugin::clickLoadZoneAction() {
QString zoneFile = QFileDialog::getOpenFileName(NULL, tr("Open Zone File"), ".", tr("Zone Files (*.zone);;"));
}
void ZonePainterPlugin::clickSaveZoneAction() {
}
/****** END SLOTS ******/
void ZonePainterPlugin::setNelContext(NLMISC::INelContext *nelContext) void ZonePainterPlugin::setNelContext(NLMISC::INelContext *nelContext)
{ {
#ifdef NL_OS_WINDOWS #ifdef NL_OS_WINDOWS

View file

@ -56,12 +56,17 @@ public:
void addAutoReleasedObject(QObject *obj); void addAutoReleasedObject(QObject *obj);
public Q_SLOTS:
void clickLoadZoneAction();
void clickSaveZoneAction();
protected: protected:
NLMISC::CLibraryContext *m_LibContext; NLMISC::CLibraryContext *m_LibContext;
private: private:
ExtensionSystem::IPluginManager *m_plugMan; ExtensionSystem::IPluginManager *m_plugMan;
QList<QObject *> m_autoReleaseObjects; QList<QObject *> m_autoReleaseObjects;
NL3D::CLandscapeModel *m_Landscape;
}; };
class CZonePainterContext: public Core::IContext class CZonePainterContext: public Core::IContext

View file

@ -57,7 +57,7 @@ printLog(log, "")
Psftp = findFileMultiDir(log, ToolDirectories + WindowsExeDllCfgDirectories, UploadPsftpTool) Psftp = findFileMultiDir(log, ToolDirectories + WindowsExeDllCfgDirectories, UploadPsftpTool)
printLog(log, "PSFTP " + Psftp) printLog(log, "PSFTP " + Psftp)
def downloadVersionTag(server, user, dir): def downloadVersionTag(server, user, sshkey, dir):
if os.path.isfile("upload.tag"): if os.path.isfile("upload.tag"):
os.remove("upload.tag") os.remove("upload.tag")
if os.path.isfile("upload.batch"): if os.path.isfile("upload.batch"):
@ -67,7 +67,7 @@ def downloadVersionTag(server, user, dir):
ub.write("get upload.tag upload.tag\n") ub.write("get upload.tag upload.tag\n")
ub.write("quit\n") ub.write("quit\n")
ub.close() ub.close()
subprocess.call([ Psftp, "-b", "upload.batch", user + "@" + server ]) subprocess.call([ Psftp, "-b", "upload.batch", "-i", sshkey, user + "@" + server ])
os.remove("upload.batch") os.remove("upload.batch")
if os.path.isfile("upload.tag"): if os.path.isfile("upload.tag"):
ft = open("upload.tag") ft = open("upload.tag")
@ -122,8 +122,8 @@ def listDirectoryUpload(ft, ub, udb, dir):
printLog(log, "listDirectoryUpload: file not dir or file?!" + fileFull) printLog(log, "listDirectoryUpload: file not dir or file?!" + fileFull)
return nft return nft
def uploadSftp(server, user, dir_to, dir_from, addcmd): def uploadSftp(server, user, sshkey, dir_to, dir_from, addcmd):
ft = downloadVersionTag(server, user, dir_to) ft = downloadVersionTag(server, user, sshkey, dir_to)
if isDirectoryNeeded(ft, dir_from): if isDirectoryNeeded(ft, dir_from):
if os.path.isfile("upload_dir.batch"): if os.path.isfile("upload_dir.batch"):
os.remove("upload_dir.batch") os.remove("upload_dir.batch")
@ -146,8 +146,8 @@ def uploadSftp(server, user, dir_to, dir_from, addcmd):
ub.close() ub.close()
udb.write("quit\n") udb.write("quit\n")
udb.close() udb.close()
subprocess.call([ Psftp, "-be", "-b", "upload_dir.batch", user + "@" + server ]) subprocess.call([ Psftp, "-be", "-b", "upload_dir.batch", "-i", sshkey, user + "@" + server ])
subprocess.call([ Psftp, "-b", "upload.batch", user + "@" + server ]) subprocess.call([ Psftp, "-b", "upload.batch", "-i", sshkey, user + "@" + server ])
os.remove("upload_dir.batch") os.remove("upload_dir.batch")
os.remove("upload.batch") os.remove("upload.batch")
os.remove("upload.tag") os.remove("upload.tag")
@ -156,19 +156,23 @@ def uploadSftp(server, user, dir_to, dir_from, addcmd):
printLog(log, ">>> Upload patch <<<") printLog(log, ">>> Upload patch <<<")
for target in UploadPatch: for target in UploadPatch:
uploadSftp(target[0], target[1], target[3], ClientPatchDirectory + "/patch", [ ]) uploadSftp(target[0], target[1], target[2], target[3], ClientPatchDirectory + "/patch", [ ])
printLog(log, ">>> Upload data_shard <<<") printLog(log, ">>> Upload data_shard <<<")
for target in UploadShard: for target in UploadShard:
uploadSftp(target[0], target[1], target[3], DataShardDirectory, [ "rm *.packed_sheets", "rm primitive_cache/*.binprim" ]) uploadSftp(target[0], target[1], target[2], target[3], DataShardDirectory, [ "rm *.packed_sheets", "rm primitive_cache/*.binprim" ])
printLog(log, ">>> Upload data_common <<<") printLog(log, ">>> Upload data_common <<<")
for target in UploadCommon: for target in UploadCommon:
uploadSftp(target[0], target[1], target[3], DataCommonDirectory, [ ]) uploadSftp(target[0], target[1], target[2], target[3], DataCommonDirectory, [ ])
printLog(log, ">>> Upload data_leveldesign <<<") printLog(log, ">>> Upload data_leveldesign/leveldesign <<<")
for target in UploadLeveldesign: for target in UploadLeveldesign:
uploadSftp(target[0], target[1], target[3], LeveldesignDirectory, [ ]) uploadSftp(target[0], target[1], target[2], target[3], LeveldesignDirectory, [ ])
printLog(log, ">>> Upload data_leveldesign/primitives <<<")
for target in UploadPrimitives:
uploadSftp(target[0], target[1], target[2], target[3], PrimitivesDirectory, [ ])
log.close() log.close()
if os.path.isfile("8_upload.log"): if os.path.isfile("8_upload.log"):

View file

@ -1 +1,6 @@
ADD_SUBDIRECTORY(build_samplebank)
ADD_SUBDIRECTORY(build_sound)
ADD_SUBDIRECTORY(build_soundbank)
# Deprecated tool - no longer useful, valid or buildable.
#ADD_SUBDIRECTORY(source_sounds_builder)

View file

@ -0,0 +1,13 @@
FILE(GLOB SRC *.cpp *.h)
ADD_EXECUTABLE(build_samplebank ${SRC})
ADD_DEFINITIONS( ${LIBXML2_DEFINITIONS})
INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(build_samplebank nelmisc nelsound)
NL_DEFAULT_PROPS(build_samplebank "NeL, Tools, Sound: build_samplebank")
NL_ADD_RUNTIME_FLAGS(build_samplebank)
INSTALL(TARGETS build_samplebank RUNTIME DESTINATION bin COMPONENT toolssound)

View file

@ -0,0 +1,13 @@
FILE(GLOB SRC *.cpp *.h)
ADD_EXECUTABLE(build_sound ${SRC})
ADD_DEFINITIONS( ${LIBXML2_DEFINITIONS})
INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(build_sound nelmisc nelsound)
NL_DEFAULT_PROPS(build_sound "NeL, Tools, Sound: build_sound")
NL_ADD_RUNTIME_FLAGS(build_sound)
INSTALL(TARGETS build_sound RUNTIME DESTINATION bin COMPONENT toolssound)

View file

@ -0,0 +1,13 @@
FILE(GLOB SRC *.cpp *.h)
ADD_EXECUTABLE(build_soundbank ${SRC})
ADD_DEFINITIONS( ${LIBXML2_DEFINITIONS})
INCLUDE_DIRECTORIES(${LIBXML2_INCLUDE_DIR})
TARGET_LINK_LIBRARIES(build_soundbank nelmisc nelsound)
NL_DEFAULT_PROPS(build_soundbank "NeL, Tools, Sound: build_soundbank")
NL_ADD_RUNTIME_FLAGS(build_soundbank)
INSTALL(TARGETS build_soundbank RUNTIME DESTINATION bin COMPONENT toolssound)

View file

@ -80,6 +80,9 @@ XMLOutGameInterfaceFiles = {
"out_v2_keys.xml", "out_v2_keys.xml",
}; };
TexturesInterface = "texture_interfaces_v3";
TexturesInterfaceDXTC = "texture_interfaces_dxtc";
// The ligo primitive class file // The ligo primitive class file
LigoPrimitiveClass = "world_editor_classes.xml"; LigoPrimitiveClass = "world_editor_classes.xml";
@ -351,8 +354,8 @@ SystemInfoColors =
// NEW System Info Categories // NEW System Info Categories
"SYS", "255 255 255 255 normal", // Default system messages "SYS", "255 255 255 255 normal", // Default system messages
"BC", "255 255 255 255 center", // Broadcast messages "BC", "255 255 255 255 centeraround", // Broadcast messages
"TAGBC", "255 255 255 255 center", // Taged broadcast messages : color should remain white as some word are tagged "TAGBC", "255 255 255 255 centeraround", // Taged broadcast messages : color should remain white as some word are tagged
"XP", "255 255 64 255 over", // XP Gain "XP", "255 255 64 255 over", // XP Gain
"SP", "255 255 64 255 over", // SP Gain "SP", "255 255 64 255 over", // SP Gain
"TTL", "255 255 64 255 over", // Title "TTL", "255 255 64 255 over", // Title
@ -440,23 +443,24 @@ R2EDReloadFiles = {
XMLInterfaceFiles = { XMLInterfaceFiles = {
"config.xml", "config.xml",
"widgets.xml", "widgets.xml",
"webig_widgets.xml",
"player.xml", "player.xml",
"inventory.xml", "inventory.xml",
"interaction.xml", "interaction.xml",
"phrase.xml", "phrase.xml",
"harvest.xml", "harvest.xml",
"macros.xml", "macros.xml",
"info_player.xml", "info_player.xml",
"outpost.xml", "outpost.xml",
"guild.xml", "guild.xml",
"taskbar.xml", "taskbar.xml",
"game_config.xml", "game_config.xml",
"game_context_menu.xml", "game_context_menu.xml",
"player_trade.xml", "player_trade.xml",
"bot_chat_v4.xml", "bot_chat_v4.xml",
"compass.xml", "compass.xml",
"map.xml", "map.xml",
"hierarchy.xml", "hierarchy.xml",
"reset.xml", "reset.xml",
"actions.xml", "actions.xml",
"help.xml", "help.xml",
@ -556,6 +560,15 @@ HelpPages =
"de=http://forums.ryzom.com/forum/showthread.php?t=29131" "de=http://forums.ryzom.com/forum/showthread.php?t=29131"
}; };
WebIgMainDomain = "atys.ryzom.com";
WebIgTrustedDomains =
{
"atys.ryzom.com"
};
PatchletUrl = "http://atys.ryzom.com/start/app_patchlet.php?patch=preload";
SelectedSlot = 0; SelectedSlot = 0;
BuildName = "RELEASE_HEAD"; BuildName = "RELEASE_HEAD";

View file

@ -80,6 +80,9 @@ XMLOutGameInterfaceFiles = {
"out_v2_keys.xml", "out_v2_keys.xml",
}; };
TexturesInterface = "texture_interfaces_v3";
TexturesInterfaceDXTC = "texture_interfaces_dxtc";
// The ligo primitive class file // The ligo primitive class file
LigoPrimitiveClass = "world_editor_classes.xml"; LigoPrimitiveClass = "world_editor_classes.xml";
@ -352,8 +355,8 @@ SystemInfoColors =
// NEW System Info Categories // NEW System Info Categories
"SYS", "255 255 255 255 normal", // Default system messages "SYS", "255 255 255 255 normal", // Default system messages
"BC", "255 255 255 255 center", // Broadcast messages "BC", "255 255 255 255 centeraround", // Broadcast messages
"TAGBC", "255 255 255 255 center", // Taged broadcast messages : color should remain white as some word are tagged "TAGBC", "255 255 255 255 centeraround", // Taged broadcast messages : color should remain white as some word are tagged
"XP", "255 255 64 255 over", // XP Gain "XP", "255 255 64 255 over", // XP Gain
"SP", "255 255 64 255 over", // SP Gain "SP", "255 255 64 255 over", // SP Gain
"TTL", "255 255 64 255 over", // Title "TTL", "255 255 64 255 over", // Title
@ -441,23 +444,24 @@ R2EDReloadFiles = {
XMLInterfaceFiles = { XMLInterfaceFiles = {
"config.xml", "config.xml",
"widgets.xml", "widgets.xml",
"webig_widgets.xml",
"player.xml", "player.xml",
"inventory.xml", "inventory.xml",
"interaction.xml", "interaction.xml",
"phrase.xml", "phrase.xml",
"harvest.xml", "harvest.xml",
"macros.xml", "macros.xml",
"info_player.xml", "info_player.xml",
"outpost.xml", "outpost.xml",
"guild.xml", "guild.xml",
"taskbar.xml", "taskbar.xml",
"game_config.xml", "game_config.xml",
"game_context_menu.xml", "game_context_menu.xml",
"player_trade.xml", "player_trade.xml",
"bot_chat_v4.xml", "bot_chat_v4.xml",
"compass.xml", "compass.xml",
"map.xml", "map.xml",
"hierarchy.xml", "hierarchy.xml",
"reset.xml", "reset.xml",
"actions.xml", "actions.xml",
"help.xml", "help.xml",
@ -557,6 +561,15 @@ HelpPages =
"de=http://forums.ryzom.com/forum/showthread.php?t=29131" "de=http://forums.ryzom.com/forum/showthread.php?t=29131"
}; };
WebIgMainDomain = "atys.ryzom.com";
WebIgTrustedDomains =
{
"atys.ryzom.com"
};
PatchletUrl = "http://atys.ryzom.com/start/app_patchlet.php?patch=preload";
SelectedSlot = 0; SelectedSlot = 0;
BuildName = "RELEASE_HEAD"; BuildName = "RELEASE_HEAD";

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 MiB

After

Width:  |  Height:  |  Size: 4 MiB

View file

@ -78,9 +78,18 @@
<command name="guildinvite" action="command" params="a guildInvite $" /> <command name="guildinvite" action="command" params="a guildInvite $" />
<command name="invite" action="command" params="a teamInvite $" /> <command name="invite" action="command" params="a teamInvite $" />
<command name="channel" action="command" params="a connectUserChannel +" /> <command name="channel" action="command" params='a connectUserChannel "$"' />
<command name="channel" action="command" params='a connectUserChannel "$" +' />
<command name="leaguekick" action="command" params="a leagueKick $" />
<command name="leaguequit" action="command" params="a setLeague" />
<command name="leagueinvite" action="command" params="a leagueInvite $" />
<command name="league" action="command" params='a setLeague "$"' />
<command name="resetname" action="command" params="a resetName"/>
<!-- WebIG --> <!-- WebIG -->
<command name="go" action="browse" params="name=ui:interface:webig:content:html|url=home"/> <command name="go" action="browse" params="name=ui:interface:webig:content:html|url=home"/>
<command name="webdev" action="browse" params="name=ui:interface:webig:content:html|url=http://localhost/index.html"/>
</interface_config> </interface_config>

View file

@ -258,6 +258,9 @@
<variable entry="UI:SAVE:INSCENE:USER:TITLE" <variable entry="UI:SAVE:INSCENE:USER:TITLE"
type="bool" type="bool"
value="false" /> value="false" />
<variable entry="UI:SAVE:INSCENE:USER:RPTAGS"
type="bool"
value="false" />
<variable entry="UI:SAVE:INSCENE:USER:GUILD_NAME" <variable entry="UI:SAVE:INSCENE:USER:GUILD_NAME"
type="bool" type="bool"
value="false" /> value="false" />
@ -291,6 +294,9 @@
<variable entry="UI:SAVE:INSCENE:FRIEND:TITLE" <variable entry="UI:SAVE:INSCENE:FRIEND:TITLE"
type="bool" type="bool"
value="true" /> value="true" />
<variable entry="UI:SAVE:INSCENE:FRIEND:RPTAGS"
type="bool"
value="true" />
<variable entry="UI:SAVE:INSCENE:FRIEND:GUILD_NAME" <variable entry="UI:SAVE:INSCENE:FRIEND:GUILD_NAME"
type="bool" type="bool"
value="true" /> value="true" />
@ -327,6 +333,9 @@
<variable entry="UI:SAVE:INSCENE:ENEMY:TITLE" <variable entry="UI:SAVE:INSCENE:ENEMY:TITLE"
type="bool" type="bool"
value="true" /> value="true" />
<variable entry="UI:SAVE:INSCENE:ENEMY:RPTAGS"
type="bool"
value="true" />
<variable entry="UI:SAVE:INSCENE:ENEMY:GUILD_NAME" <variable entry="UI:SAVE:INSCENE:ENEMY:GUILD_NAME"
type="bool" type="bool"
value="true" /> value="true" />
@ -2797,6 +2806,9 @@ This MUST follow the Enum MISSION_DESC::TIconId
<variable entry="UI:SAVE:GUILD_LIST:SORT_ORDER" <variable entry="UI:SAVE:GUILD_LIST:SORT_ORDER"
type="sint32" type="sint32"
value="0" /> value="0" />
<variable entry="UI:SAVE:CHATLOG_STATE"
type="sint32"
value="0" />
<!-- Auto Convert ACT_TSTART end TEND from server to smoothServerTick --> <!-- Auto Convert ACT_TSTART end TEND from server to smoothServerTick -->
<link expr="@SERVER:USER:ACT_TSTART" <link expr="@SERVER:USER:ACT_TSTART"
action="set" action="set"
@ -2963,7 +2975,28 @@ This MUST follow the Enum MISSION_DESC::TIconId
<variable entry="UI:SAVE:CHAT:COLORS:TELL" <variable entry="UI:SAVE:CHAT:COLORS:TELL"
type="rgba" type="rgba"
value="170 170 170 255" /> value="170 170 170 255" />
<variable entry="UI:SAVE:CHAT:COLORS:DYN" <variable entry="UI:SAVE:CHAT:COLORS:DYN:0"
type="rgba"
value="162 255 173 255" />
<variable entry="UI:SAVE:CHAT:COLORS:DYN:1"
type="rgba"
value="162 255 173 255" />
<variable entry="UI:SAVE:CHAT:COLORS:DYN:2"
type="rgba"
value="162 255 173 255" />
<variable entry="UI:SAVE:CHAT:COLORS:DYN:3"
type="rgba"
value="162 255 173 255" />
<variable entry="UI:SAVE:CHAT:COLORS:DYN:4"
type="rgba"
value="162 255 173 255" />
<variable entry="UI:SAVE:CHAT:COLORS:DYN:5"
type="rgba"
value="162 255 173 255" />
<variable entry="UI:SAVE:CHAT:COLORS:DYN:6"
type="rgba"
value="162 255 173 255" />
<variable entry="UI:SAVE:CHAT:COLORS:DYN:7"
type="rgba" type="rgba"
value="162 255 173 255" /> value="162 255 173 255" />
<variable entry="UI:SAVE:CHAT:ENTER_DONT_QUIT_CB" <variable entry="UI:SAVE:CHAT:ENTER_DONT_QUIT_CB"
@ -2975,6 +3008,9 @@ This MUST follow the Enum MISSION_DESC::TIconId
<variable entry="UI:SAVE:CHAT:SHOW_DYN_CHANNEL_NAME_IN_CHAT_CB" <variable entry="UI:SAVE:CHAT:SHOW_DYN_CHANNEL_NAME_IN_CHAT_CB"
type="bool" type="bool"
value="false" /> value="false" />
<variable entry="UI:SAVE:CHAT:SHOW_ONLINE_OFFLINE_NOTIFICATIONS_CB"
type="bool"
value="true" />
<!-- ***************************** --> <!-- ***************************** -->
<!-- * SYSTEM INFO COLORS * --> <!-- * SYSTEM INFO COLORS * -->
<!-- ***************************** --> <!-- ***************************** -->
@ -3045,6 +3081,9 @@ This MUST follow the Enum MISSION_DESC::TIconId
<variable entry="UI:SAVE:INV_BAG:FILTER_MISSMP" <variable entry="UI:SAVE:INV_BAG:FILTER_MISSMP"
type="sint32" type="sint32"
value="1" /> value="1" />
<variable entry="UI:SAVE:INV_BAG:FILTER_TP"
type="sint32"
value="1" />
<variable entry="UI:SAVE:INV_PA0:SORT_TYPE" <variable entry="UI:SAVE:INV_PA0:SORT_TYPE"
type="sint32" type="sint32"
value="0" /> value="0" />
@ -3066,6 +3105,9 @@ This MUST follow the Enum MISSION_DESC::TIconId
<variable entry="UI:SAVE:INV_PA0:FILTER_MISSMP" <variable entry="UI:SAVE:INV_PA0:FILTER_MISSMP"
type="sint32" type="sint32"
value="1" /> value="1" />
<variable entry="UI:SAVE:INV_PA0:FILTER_TP"
type="sint32"
value="1" />
<variable entry="UI:SAVE:INV_PA1:SORT_TYPE" <variable entry="UI:SAVE:INV_PA1:SORT_TYPE"
type="sint32" type="sint32"
value="0" /> value="0" />
@ -3087,6 +3129,9 @@ This MUST follow the Enum MISSION_DESC::TIconId
<variable entry="UI:SAVE:INV_PA1:FILTER_MISSMP" <variable entry="UI:SAVE:INV_PA1:FILTER_MISSMP"
type="sint32" type="sint32"
value="1" /> value="1" />
<variable entry="UI:SAVE:INV_PA1:FILTER_TP"
type="sint32"
value="1" />
<variable entry="UI:SAVE:INV_PA2:SORT_TYPE" <variable entry="UI:SAVE:INV_PA2:SORT_TYPE"
type="sint32" type="sint32"
value="0" /> value="0" />
@ -3108,6 +3153,9 @@ This MUST follow the Enum MISSION_DESC::TIconId
<variable entry="UI:SAVE:INV_PA2:FILTER_MISSMP" <variable entry="UI:SAVE:INV_PA2:FILTER_MISSMP"
type="sint32" type="sint32"
value="1" /> value="1" />
<variable entry="UI:SAVE:INV_PA2:FILTER_TP"
type="sint32"
value="1" />
<variable entry="UI:SAVE:INV_PA3:SORT_TYPE" <variable entry="UI:SAVE:INV_PA3:SORT_TYPE"
type="sint32" type="sint32"
value="0" /> value="0" />
@ -3129,6 +3177,9 @@ This MUST follow the Enum MISSION_DESC::TIconId
<variable entry="UI:SAVE:INV_PA3:FILTER_MISSMP" <variable entry="UI:SAVE:INV_PA3:FILTER_MISSMP"
type="sint32" type="sint32"
value="1" /> value="1" />
<variable entry="UI:SAVE:INV_PA3:FILTER_TP"
type="sint32"
value="1" />
<variable entry="UI:SAVE:INV_GUILD:SORT_TYPE" <variable entry="UI:SAVE:INV_GUILD:SORT_TYPE"
type="sint32" type="sint32"
value="1" /> value="1" />
@ -3151,6 +3202,9 @@ This MUST follow the Enum MISSION_DESC::TIconId
<variable entry="UI:SAVE:INV_GUILD:FILTER_MISSMP" <variable entry="UI:SAVE:INV_GUILD:FILTER_MISSMP"
type="sint32" type="sint32"
value="1" /> value="1" />
<variable entry="UI:SAVE:INV_GUILD:FILTER_TP"
type="sint32"
value="1" />
<variable entry="UI:SAVE:INV_ROOM:SORT_TYPE" <variable entry="UI:SAVE:INV_ROOM:SORT_TYPE"
type="sint32" type="sint32"
value="1" /> value="1" />
@ -3173,6 +3227,9 @@ This MUST follow the Enum MISSION_DESC::TIconId
<variable entry="UI:SAVE:INV_ROOM:FILTER_MISSMP" <variable entry="UI:SAVE:INV_ROOM:FILTER_MISSMP"
type="sint32" type="sint32"
value="1" /> value="1" />
<variable entry="UI:SAVE:INV_ROOM:FILTER_TP"
type="sint32"
value="1" />
<!-- List Menu 1 --> <!-- List Menu 1 -->
<variable entry="UI:VARIABLES:ISACTIVE:SETS" <variable entry="UI:VARIABLES:ISACTIVE:SETS"
type="sint32" type="sint32"
@ -3809,4 +3866,10 @@ This MUST follow the Enum MISSION_DESC::TIconId
<variable entry="UI:TEMP:R2_DRAW_ARRAY" <variable entry="UI:TEMP:R2_DRAW_ARRAY"
type="bool" type="bool"
value="0" /> value="0" />
<variable entry="UI:TEMP:DEFAULT_WEB_RETRY_TIMEOUT"
type="sint32"
value="2" />
<variable entry="UI:SAVE:WEBIG_RETRY_DELAY"
type="sint32"
value="2" />
</interface_config> </interface_config>

View file

@ -11,7 +11,7 @@
<variable entry="UI:VARIABLES:ENCY:REWARDBRICK:SHEET" type="sint32" value="0" /> <variable entry="UI:VARIABLES:ENCY:REWARDBRICK:SHEET" type="sint32" value="0" />
<variable entry="UI:VARIABLES:ENCY:ALBUMBRICK:SHEET" type="sint32" value="0" /> <variable entry="UI:VARIABLES:ENCY:ALBUMBRICK:SHEET" type="sint32" value="0" />
<style style="ency_title" type="text" color="255 255 255 255" fontsize="14" shadow="true" case_mode="%case_first_string_letter_up"/> <style style="ency_title" type="text" color="255 255 255 255" fontsize="14" shadow="true" case_mode="%case_normal"/>
<style style="ency_title2" type="text" color="255 255 255 192" fontsize="12" shadow="true" /> <style style="ency_title2" type="text" color="255 255 255 192" fontsize="12" shadow="true" />

View file

@ -1615,19 +1615,82 @@
x="0" x="0"
y="-4" /> y="-4" />
<instance template="tgcw_color" <instance template="tgcw_color"
id="cc_dyn" id="cc_dyn0"
text="uiDynColor" text="uiDynColor0"
title="uiCCDDyn" title="uiCCDDyn0"
tooltip="uittChooseDynColor" tooltip="uittChooseDynColor0"
posref="BL TL" posref="BL TL"
posparent="cc_shout" posparent="cc_shout"
x="0" x="0"
y="-4" /> y="-4" />
<instance template="tgcw_color"
id="cc_dyn1"
text="uiDynColor1"
title="uiCCDDyn1"
tooltip="uittChooseDynColor1"
posref="BL TL"
posparent="cc_dyn0"
x="0"
y="-4" />
<instance template="tgcw_color"
id="cc_dyn2"
text="uiDynColor2"
title="uiCCDDyn2"
tooltip="uittChooseDynColor2"
posref="BL TL"
posparent="cc_dyn1"
x="0"
y="-4" />
<instance template="tgcw_color"
id="cc_dyn3"
text="uiDynColor3"
title="uiCCDDyn3"
tooltip="uittChooseDynColor3"
posref="BL TL"
posparent="cc_dyn2"
x="0"
y="-4" />
<instance template="tgcw_color"
id="cc_dyn4"
text="uiDynColor4"
title="uiCCDDyn4"
tooltip="uittChooseDynColor4"
posref="BL TL"
posparent="cc_dyn3"
x="0"
y="-4" />
<instance template="tgcw_color"
id="cc_dyn5"
text="uiDynColor5"
title="uiCCDDyn5"
tooltip="uittChooseDynColor5"
posref="BL TL"
posparent="cc_dyn4"
x="0"
y="-4" />
<instance template="tgcw_color"
id="cc_dyn6"
text="uiDynColor6"
title="uiCCDDyn6"
tooltip="uittChooseDynColor6"
posref="BL TL"
posparent="cc_dyn5"
x="0"
y="-4" />
<instance template="tgcw_color"
id="cc_dyn7"
text="uiDynColor7"
title="uiCCDDyn7"
tooltip="uittChooseDynColor7"
posref="BL TL"
posparent="cc_dyn6"
x="0"
y="-4" />
<instance template="tgcw_checkbox" <instance template="tgcw_checkbox"
id="enter_dontquit_cb" id="enter_dontquit_cb"
text="uiEnterDontQuitCB" text="uiEnterDontQuitCB"
tooltip="uittChatEnter" tooltip="uittChatEnter"
posparent="cc_dyn" posparent="cc_dyn7"
posref="BL TL" posref="BL TL"
x="0" x="0"
y="-8" /> y="-8" />
@ -1647,11 +1710,19 @@
posref="BL TL" posref="BL TL"
x="0" x="0"
y="-8" /> y="-8" />
<instance template="tgcw_scrollbarint" <instance template="tgcw_checkbox"
id="show_online_offline_notifications_cb"
text="uiShowOnlineOfflineNotifications"
tooltip="uittShowOnlineOfflineNotifications"
posparent="show_dyn_channel_name_in_chat_cb"
posref="BL TL"
x="0"
y="-8" />
<instance template="tgcw_scrollbarint"
id="font_size" id="font_size"
text="uiFontSize" text="uiFontSize"
posref="BL TL" posref="BL TL"
posparent="show_dyn_channel_name_in_chat_cb" posparent="show_online_offline_notifications_cb"
x="0" x="0"
y="-8" /> y="-8" />
<link expr="@UI:SAVE:CHAT:ENTER_DONT_QUIT_CB" <link expr="@UI:SAVE:CHAT:ENTER_DONT_QUIT_CB"
@ -1660,7 +1731,9 @@
target="show_times_in_chat_cb:c:pushed" /> target="show_times_in_chat_cb:c:pushed" />
<link expr="@UI:SAVE:CHAT:SHOW_DYN_CHANNEL_NAME_IN_CHAT_CB" <link expr="@UI:SAVE:CHAT:SHOW_DYN_CHANNEL_NAME_IN_CHAT_CB"
target="show_dyn_channel_name_in_chat_cb:c:pushed" /> target="show_dyn_channel_name_in_chat_cb:c:pushed" />
</group> <link expr="@UI:SAVE:CHAT:SHOW_ONLINE_OFFLINE_NOTIFICATIONS_CB"
target="show_online_offline_notifications_cb:c:pushed" />
</group>
<ctrl style="skin_scroll" <ctrl style="skin_scroll"
id="sb_chat_colors" id="sb_chat_colors"
align="T" align="T"
@ -1886,12 +1959,20 @@
posparent="is_user_name" posparent="is_user_name"
x="0" x="0"
y="-4" /> y="-4" />
<instance template="tgcw_checkbox"
id="is_user_rptags"
text="uiRpTags"
tooltip="uittRpTags"
posref="BL TL"
posparent="is_user_title"
x="0"
y="-4" />
<instance template="tgcw_checkbox" <instance template="tgcw_checkbox"
id="is_user_guild_name" id="is_user_guild_name"
text="uigcGuildName" text="uigcGuildName"
tooltip="uittGuildName" tooltip="uittGuildName"
posref="BL TL" posref="BL TL"
posparent="is_user_title" posparent="is_user_rptags"
x="0" x="0"
y="-4" /> y="-4" />
<instance template="tgcw_checkbox" <instance template="tgcw_checkbox"
@ -1995,12 +2076,20 @@
posparent="is_friend_name" posparent="is_friend_name"
x="0" x="0"
y="-4" /> y="-4" />
<instance template="tgcw_checkbox"
id="is_friend_rptags"
text="uiRpTags"
tooltip="uittRpTags"
posref="BL TL"
posparent="is_friend_title"
x="0"
y="-4" />
<instance template="tgcw_checkbox" <instance template="tgcw_checkbox"
id="is_friend_guild_name" id="is_friend_guild_name"
text="uigcGuildName" text="uigcGuildName"
tooltip="uittGuildName" tooltip="uittGuildName"
posref="BL TL" posref="BL TL"
posparent="is_friend_title" posparent="is_friend_rptags"
x="0" x="0"
y="-4" /> y="-4" />
<instance template="tgcw_checkbox" <instance template="tgcw_checkbox"
@ -2112,12 +2201,20 @@
posparent="is_enemy_name" posparent="is_enemy_name"
x="0" x="0"
y="-4" /> y="-4" />
<instance template="tgcw_checkbox"
id="is_enemy_rptags"
text="uiRpTags"
tooltip="uittRpTags"
posref="BL TL"
posparent="is_enemy_title"
x="0"
y="-4" />
<instance template="tgcw_checkbox" <instance template="tgcw_checkbox"
id="is_enemy_guild_name" id="is_enemy_guild_name"
text="uigcGuildName" text="uigcGuildName"
tooltip="uittGuildName" tooltip="uittGuildName"
posref="BL TL" posref="BL TL"
posparent="is_enemy_title" posparent="is_enemy_rptags"
x="0" x="0"
y="-4" /> y="-4" />
<instance template="tgcw_checkbox" <instance template="tgcw_checkbox"
@ -3095,10 +3192,45 @@
widget="colbut" widget="colbut"
link="UI:SAVE:CHAT:COLORS:SHOUT" link="UI:SAVE:CHAT:COLORS:SHOUT"
realtime="true" /> realtime="true" />
<param ui="chat_colors:cc_dyn:c" <param ui="chat_colors:cc_dyn0:c"
type="db" type="db"
widget="colbut" widget="colbut"
link="UI:SAVE:CHAT:COLORS:DYN" link="UI:SAVE:CHAT:COLORS:DYN:0"
realtime="true" />
<param ui="chat_colors:cc_dyn1:c"
type="db"
widget="colbut"
link="UI:SAVE:CHAT:COLORS:DYN:1"
realtime="true" />
<param ui="chat_colors:cc_dyn2:c"
type="db"
widget="colbut"
link="UI:SAVE:CHAT:COLORS:DYN:2"
realtime="true" />
<param ui="chat_colors:cc_dyn3:c"
type="db"
widget="colbut"
link="UI:SAVE:CHAT:COLORS:DYN:3"
realtime="true" />
<param ui="chat_colors:cc_dyn4:c"
type="db"
widget="colbut"
link="UI:SAVE:CHAT:COLORS:DYN:4"
realtime="true" />
<param ui="chat_colors:cc_dyn5:c"
type="db"
widget="colbut"
link="UI:SAVE:CHAT:COLORS:DYN:5"
realtime="true" />
<param ui="chat_colors:cc_dyn6:c"
type="db"
widget="colbut"
link="UI:SAVE:CHAT:COLORS:DYN:6"
realtime="true" />
<param ui="chat_colors:cc_dyn7:c"
type="db"
widget="colbut"
link="UI:SAVE:CHAT:COLORS:DYN:7"
realtime="true" /> realtime="true" />
<!-- <!--
<param ui="chat_colors:cc_shout:c" type="db" widget="colbut" link="UI:SAVE:CHAT:COLORS:SHOUT" realtime="true" /> <param ui="chat_colors:cc_shout:c" type="db" widget="colbut" link="UI:SAVE:CHAT:COLORS:SHOUT" realtime="true" />
@ -3120,6 +3252,11 @@
widget="boolbut" widget="boolbut"
link="UI:SAVE:CHAT:SHOW_DYN_CHANNEL_NAME_IN_CHAT_CB" link="UI:SAVE:CHAT:SHOW_DYN_CHANNEL_NAME_IN_CHAT_CB"
realtime="true" /> realtime="true" />
<param ui="chat_colors:show_online_offline_notifications_cb:c"
type="db"
widget="boolbut"
link="UI:SAVE:CHAT:SHOW_ONLINE_OFFLINE_NOTIFICATIONS_CB"
realtime="true" />
<param ui="chat_colors:font_size:c" <param ui="chat_colors:font_size:c"
type="db" type="db"
widget="sbint" widget="sbint"
@ -3222,6 +3359,11 @@
widget="boolbut" widget="boolbut"
link="UI:SAVE:INSCENE:USER:TITLE" link="UI:SAVE:INSCENE:USER:TITLE"
realtime="true" /> realtime="true" />
<param ui="in_scene_user:is_user_rptags:c"
type="db"
widget="boolbut"
link="UI:SAVE:INSCENE:USER:RPTAGS"
realtime="true" />
<param ui="in_scene_user:is_user_guild_name:c" <param ui="in_scene_user:is_user_guild_name:c"
type="db" type="db"
widget="boolbut" widget="boolbut"
@ -3272,6 +3414,11 @@
widget="boolbut" widget="boolbut"
link="UI:SAVE:INSCENE:FRIEND:TITLE" link="UI:SAVE:INSCENE:FRIEND:TITLE"
realtime="true" /> realtime="true" />
<param ui="in_scene_friend:is_friend_rptags:c"
type="db"
widget="boolbut"
link="UI:SAVE:INSCENE:FRIEND:RPTAGS"
realtime="true" />
<param ui="in_scene_friend:is_friend_guild_name:c" <param ui="in_scene_friend:is_friend_guild_name:c"
type="db" type="db"
widget="boolbut" widget="boolbut"
@ -3327,6 +3474,11 @@
widget="boolbut" widget="boolbut"
link="UI:SAVE:INSCENE:ENEMY:TITLE" link="UI:SAVE:INSCENE:ENEMY:TITLE"
realtime="true" /> realtime="true" />
<param ui="in_scene_enemy:is_enemy_rptags:c"
type="db"
widget="boolbut"
link="UI:SAVE:INSCENE:ENEMY:RPTAGS"
realtime="true" />
<param ui="in_scene_enemy:is_enemy_guild_name:c" <param ui="in_scene_enemy:is_enemy_guild_name:c"
type="db" type="db"
widget="boolbut" widget="boolbut"

View file

@ -463,27 +463,7 @@
<!-- ***************** --> <!-- ***************** -->
<!-- * GUILD FORUM * --> <!-- * GUILD FORUM * -->
<!-- ***************** --> <!-- ***************** -->
<proc id="guild_forum_proc_active">
<action handler="set"
params="dblink=UI:VARIABLES:ISACTIVE:GUILD_FORUM|value=1" />
<action handler="set"
cond="not(%is_guild_present)"
params="target='ui:interface:guild_forum:active'|value=0" />
<action handler="browse"
params="name=ui:interface:guild_forum:content:html|url=home|show=0" />
</proc>
<proc id="guild_forum_proc_deactive">
<action handler="set"
params="dblink=UI:VARIABLES:ISACTIVE:GUILD_FORUM|value=0" />
</proc>
<group type="menu"
id="guild_forum_menu"
extends="base_menu_with_color">
<action id="home"
name="uiHOME"
handler="browse"
params="name=ui:interface:guild_forum:content:html|url=home" />
</group>
<group type="container" <group type="container"
id="guild_forum" id="guild_forum"
w="480" w="480"
@ -531,7 +511,7 @@
w="0" w="0"
h="0" h="0"
posref="TL TL"> posref="TL TL">
<group type="forum_html" <group type="html"
id="html" id="html"
posref="TL TL" posref="TL TL"
url="home" url="home"
@ -828,24 +808,7 @@
<!-- ************** --> <!-- ************** -->
<!-- * MAIL BOX * --> <!-- * MAIL BOX * -->
<!-- ************** --> <!-- ************** -->
<proc id="mailbox_proc_active">
<action handler="set"
params="dblink=UI:VARIABLES:ISACTIVE:MAILBOX|value=1" />
<action handler="browse"
params="name=ui:interface:mailbox:content:html|url=home|show=0" />
</proc>
<proc id="mailbox_proc_deactive">
<action handler="set"
params="dblink=UI:VARIABLES:ISACTIVE:MAILBOX|value=0" />
</proc>
<group type="menu"
id="mailbox_menu"
extends="base_menu_with_color">
<action id="home"
name="uiHOME"
handler="browse"
params="name=ui:interface:mailbox:content:html|url=home" />
</group>
<group type="container" <group type="container"
id="mailbox" id="mailbox"
w="480" w="480"
@ -892,7 +855,7 @@
w="0" w="0"
h="0" h="0"
posref="TL TL"> posref="TL TL">
<group type="mail_html" <group type="html"
id="html" id="html"
posref="TL TL" posref="TL TL"
url="home" url="home"
@ -976,8 +939,6 @@
<proc id="webig_proc_active"> <proc id="webig_proc_active">
<action handler="set" <action handler="set"
params="dblink=UI:VARIABLES:ISACTIVE:WEBIG|value=1" /> params="dblink=UI:VARIABLES:ISACTIVE:WEBIG|value=1" />
<action handler="browse"
params="name=ui:interface:webig:content:html|url=home" />
</proc> </proc>
<proc id="webig_proc_deactive"> <proc id="webig_proc_deactive">
<action handler="set" <action handler="set"
@ -1088,7 +1049,7 @@
<group type="webig_html" <group type="webig_html"
id="html" id="html"
posref="TL TL" posref="TL TL"
url="http://atys.ryzom.com/start/index.php" url=""
home="http://atys.ryzom.com/start/index.php" home="http://atys.ryzom.com/start/index.php"
sizeref="wh" sizeref="wh"
x="0" x="0"
@ -1254,8 +1215,8 @@
<group type="webig_html" <group type="webig_html"
id="html" id="html"
posref="TL TL" posref="TL TL"
url="http://atys.ryzom.com/start/app_ig_start.php" url=""
home="http://atys.ryzom.com/start/app_ig_start.php" home="http://atys.ryzom.com/start/init_ig.php"
sizeref="wh" sizeref="wh"
x="0" x="0"
y="0" y="0"

View file

@ -283,17 +283,14 @@ function game:onDrawNpcWebPage()
local utf8Url = ucUrl:toUtf8() local utf8Url = ucUrl:toUtf8()
local isRing = string.find(utf8Url, "ring_access_point=1") ~= nil local isRing = string.find(utf8Url, "ring_access_point=1") ~= nil
if isRing then if isRing then
-- when in ring mode, add the parameters ourselves. 60 sec timeout because of zope...
-- browseNpcWebPage(uiStr, utf8Url .. game.RingAccessPointFilter:getURLParameters(), false, 60)
-- Use new window after revamp
--RingAccessPoint:getWindow().active = 1
--RingAccessPoint:getWindow():center()
--RingAccessPoint:getWindow():blink(1)
--RingAccessPoint:show()
getUI("ui:interface:npc_web_browser").active = false getUI("ui:interface:npc_web_browser").active = false
runAH(nil, "context_ring_sessions", "") runAH(nil, "context_ring_sessions", "")
return return
else else
local hideWindow = string.find(utf8Url, "_hideWindow=1") ~= nil
if hideWindow then
getUI("ui:interface:npc_web_browser").active = false
end
self.NpcWebPage.BrowseDone= true; self.NpcWebPage.BrowseDone= true;
browseNpcWebPage(uiStr, utf8Url, true, 10); -- 'true' is for 'add parameters' here. 10 is standard timeout browseNpcWebPage(uiStr, utf8Url, true, 10); -- 'true' is for 'add parameters' here. 10 is standard timeout
end end
@ -302,9 +299,9 @@ function game:onDrawNpcWebPage()
-- if this is a ring window, then only the refresh button to access to filter will be available -- if this is a ring window, then only the refresh button to access to filter will be available
local isRing = string.find(utf8Url, "ring_access_point=1") ~= nil local isRing = string.find(utf8Url, "ring_access_point=1") ~= nil
local browser = getUI("ui:interface:npc_web_browser") local browser = getUI("ui:interface:npc_web_browser")
browser:find("browse_redo").active = not isRing browser:find("browse_redo").active = true
browser:find("browse_undo").active = not isRing browser:find("browse_undo").active = true
browser:find("browse_refresh").active = isRing browser:find("browse_refresh").active = true
end end
end end
end end
@ -978,6 +975,7 @@ function RingPlayerInfo:tooltipRRPs(dbBase, ttFormat)
setContextHelpText(fmt); setContextHelpText(fmt);
end end
-------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------
-- --
function RingPlayerInfo:tooltipRingRating(level, progress, ttFormat) function RingPlayerInfo:tooltipRingRating(level, progress, ttFormat)
@ -1012,6 +1010,27 @@ function RingPlayerInfo:getLevelRatingAndImprovementRate(val)
return level, progress return level, progress
end end
--------------------------------------------------------------------------------------------------------------
--
function game:updateOrganization(path, uiOrgText, uiStatusText, uiPointsText)
local org = getDbProp(path.."1:VALUE")
getUICaller()[uiOrgText].uc_hardtext = i18n.get('uiOrganization_' .. org)
local status = getDbProp(path.."2:VALUE")
getUICaller()[uiStatusText].uc_hardtext= status
local points = getDbProp(path.."3:VALUE")
getUICaller()[uiPointsText].uc_hardtext= points
end
------------------------------------------------------------------------------------------------------------
function game:organizationTooltip()
-- set the tooltip in InterfaceManager
setContextHelpText( i18n.get('uittOrganization') );
end
-------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------
function game:popMissionList() function game:popMissionList()
@ -1392,7 +1411,9 @@ end
-- handler called by C++ to tell that the main loop is about to begin -- handler called by C++ to tell that the main loop is about to begin
function game:onMainLoopBegin() function game:onMainLoopBegin()
game.InGameDbInitialized = false game.InGameDbInitialized = false
game.PrevSessionMission = getDbProp("UI:VARIABLES:MISSION_SELECTED_PREV_SESSION") game.PrevSessionMission = getDbProp("UI:VARIABLES:MISSION_SELECTED_PREV_SESSION")
debugInfo("onMainLoopBegin()")
end end
@ -1408,6 +1429,29 @@ function game:onInGameDbInitialized()
if game.PrevSessionMission ~= -1 then if game.PrevSessionMission ~= -1 then
self:setCurrentMission(game.PrevSessionMission) self:setCurrentMission(game.PrevSessionMission)
end end
game:setInfoPlayerCharacterRace()
end
function game:onWebIgReady()
-- Call init webig
getUI("ui:interface:web_transactions:content:html"):browse("home")
getUI("ui:interface:webig:content:html"):browse("home")
end
--------------------------------------------------------------------------------------------------------------
-- handler called by C++ at the start of a far TP (log to char selection or far tp)
function game:onFarTpStart()
debugInfo("game:onFarTpStart()")
--game:deinitWebIgApps()
end
--------------------------------------------------------------------------------------------------------------
-- handler called by C++ after characer reselection or the end of a far TP
function game:onFarTpEnd()
debugInfo("game:onFarTpEnd()")
--game:preInitWebIgApps()
end end
-------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------
@ -1415,8 +1459,8 @@ end
function game:onMainLoopEnd() function game:onMainLoopEnd()
game.InGameDbInitialized = false game.InGameDbInitialized = false
game:updateMissionJournalFixedEntry() game:updateMissionJournalFixedEntry()
end
end
-------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------
-- ring journal on / off -- ring journal on / off
@ -1471,6 +1515,11 @@ function game:onNewMissionStepAdded(stepIndex)
local missionWnd = getMissionWindow() local missionWnd = getMissionWindow()
local missionIndex = getDbProp("UI:SAVE:MISSION_SELECTED") local missionIndex = getDbProp("UI:SAVE:MISSION_SELECTED")
local dbPath local dbPath
if missionIndex < 0 then
return
end
-- debugInfo("New Step") -- debugInfo("New Step")
if missionIndex < 15 then if missionIndex < 15 then
dbPath = "SERVER:MISSIONS:" .. tostring(missionIndex) .. ":GOALS:" .. tostring(stepIndex) .. ":TEXT" dbPath = "SERVER:MISSIONS:" .. tostring(missionIndex) .. ":GOALS:" .. tostring(stepIndex) .. ":TEXT"
@ -1651,3 +1700,64 @@ function game:getRPJobs()
end end
--------------------------------------------------------------------------------------------------------------
function game:setInfoPlayerCharacterRace()
getUI("ui:interface:info_player_skills:content:basics_skills:character_race_name").uc_hardtext = i18n.get("io"..getUserRace())
end
-- --------------------------------------------------------------------------------------------------------------
-- game.preInitTimer = 0
-- function game:preInitWebIgAppsLoop()
-- if game.preInitTimer == nil then game.preInitTimer = 0 end
-- game.preInitTimer = game.preInitTimer - 1
-- if (not game.preWebIgAppsInitialized) and game.preInitTimer < 0 then
-- debugInfo("initWebIgAppsLoop(): calling app_ig_preinit.php")
-- getUI("ui:interface:web_transactions:content:html"):browse("http://atys.ryzom.com/start/app_ig_preinit.php")
-- game.preInitTimer = getDbProp("UI:SAVE:WEBIG_RETRY_DELAY")
-- end
-- if game.preWebIgAppsInitialized then
-- debugInfo("preInitWebIgAppsLoop(): Calling removeOnDbChange()")
-- removeOnDbChange(getUI("ui:interface"), "@UI:VARIABLES:CURRENT_SERVER_TICK")
-- end
-- end
-- --------------------------------------------------------------------------------------------------------------
-- function game:preInitWebIgApps()
-- debugInfo("game:preInitWebIgApps()")
-- addOnDbChange(getUI("ui:interface"), "@UI:VARIABLES:CURRENT_SERVER_TICK", "game:preInitWebIgAppsLoop()")
-- end
-- --------------------------------------------------------------------------------------------------------------
-- game.postInitTimer = 0
-- function game:postInitWebIgAppsLoop()
-- if game.postInitTimer == nil then game.postInitTimer = 0 end
-- game.postInitTimer = game.postInitTimer - 1
-- if game.postInitTimer < 0 then
-- debugInfo("initWebIgAppsLoop(): calling app_ig_postinit.php")
-- getUI("ui:interface:web_transactions:content:html"):browse("http://atys.ryzom.com/start/app_ig_postinit.php")
-- game.postInitTimer = getDbProp("UI:SAVE:WEBIG_RETRY_DELAY")
-- end
-- if game.postWebIgAppsInitialized then
-- debugInfo("postInitWebIgAppsLoop(): Calling removeOnDbChange()")
-- removeOnDbChange(getUI("ui:interface:milko_pad"), "@UI:VARIABLES:CURRENT_SERVER_TICK")
-- end
-- end
-- --------------------------------------------------------------------------------------------------------------
-- function game:postInitWebIgApps()
-- debugInfo("game:postInitWebIgApps()")
-- addOnDbChange(getUI("ui:interface:milko_pad"), "@UI:VARIABLES:CURRENT_SERVER_TICK", "game:postInitWebIgAppsLoop()")
-- end
-- --------------------------------------------------------------------------------------------------------------
-- function game:deinitWebIgApps()
-- debugInfo("game:deinitWebIgApps()")
-- game.preWebIgAppsInitialized = nil
-- game.postWebIgAppsInitialized = nil
-- titleSetted = nil
-- end

Some files were not shown because too many files have changed in this diff Show more