// Ryzom - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#ifndef NL_INTERFACE_DDX_H
#define NL_INTERFACE_DDX_H
#include "nel/misc/types_nl.h"
#include "nel/gui/interface_element.h"
#include "interface_pointer.h"
// Values for float (scrollbar float) must not exceed 200,00 this is due to storing on
// an integer value with a precision of 10,000
// For the moment realtime parameters are only valid on scrollbar
// ***************************************************************************
class CInterfaceDDX : public CInterfaceElement
{
public:
// The number of preset in cfg.
enum {NumPreset= 4, CustomPreset=NumPreset};
public:
virtual bool parse (xmlNodePtr cur, CInterfaceGroup *parentGroup);
CInterfaceDDX();
virtual ~CInterfaceDDX();
// DB -> Parameters
void init();
// Parameters -> DB
void update();
// Restore realtime values
void cancel();
// Update parameters that are realtime
void updateRealtime(CCtrlBase *pSB, bool updateOnScrollEnd);
// Update all parameters to obey their preset (no op if no preset or if preset is Custom)
void updateParamPreset(NLMISC::CCDBNodeLeaf *presetChanged);
// set apply button can be pushed
void validateApplyButton();
private:
class CParam
{
public:
// -----------------------
enum SParamType { DataBase, ConfigFile };
enum SParamWidget { ColorButton, BoolButton, ScrollBarInt, ScrollBarFloat };
enum TRealTimeMode { RTModeFalse=0, RTModeTrue, RTModeEndScroll};
// -----------------------
// The control
CInterfaceElementPtr Elt;
SParamType Type;
SParamWidget Widget;
std::string Link;
// The tex view, result of the scroll
CViewTextPtr ResultView;
// The unit to append to the result string
ucstring ResultUnit;
// For ScrollBarFloat widget only
uint8 ResultDecimal;
// For ScrollBarFloat widget only
bool RoundMode;
// If Widget is scrollbar int or float
sint32 Min, Max;
// When the effect of the param is applied
TRealTimeMode RealTimeMode;
sint32 RTBackupValue; // When canceling
// For ConfigFile widget only
NLMISC::CCDBNodeLeaf *PresetDB;
// -----------------------
CParam()
{
ResultDecimal= 0;
RoundMode= false;
PresetDB= NULL;
RealTimeMode= RTModeFalse;
}
void DBToWidget();
void CFGToWidget();
void WidgetToDB();
void WidgetToCFG();
void backupDB();
void backupCFG();
void restoreDB();
void restoreCFG();
// update ResultView according to widget. Don't modify DB or CFG
void WidgetToResultView();
// restore the preset value
void restoreCFGPreset(uint presetVal);
// From the current CFG value, compare to each preset value, and init the bitfield
uint32 getPresetPossibleBF();
private:
void updateScrollView(sint32 nVal);
void updateScrollView(double nVal);
void tryRound(double nVal);
};
// Array of parameters
std::vector _Parameters;
// For preset change
class CPresetObs : public NLMISC::ICDBNode::IPropertyObserver
{
public:
virtual void update(NLMISC::ICDBNode* node);
CInterfaceDDX *Owner;
CPresetObs() : Owner(NULL) {}
};
CPresetObs _PresetObs;
std::set _PresetNodes;
// reset the preset values according to parameters values
void resetPreSet();
// For apply button ungraying
class CCtrlBaseButton *_ApplyButton;
};
// ***************************************************************************
class CDDXManager
{
public:
static CDDXManager *getInstance()
{
if (_Instance == NULL)
_Instance = new CDDXManager;
return _Instance;
}
// release memory
static void releaseInstance();
void add(CInterfaceDDX *pDDX);
CInterfaceDDX *get(const std::string &ddxName);
// Get the ddx from its parent name
CInterfaceDDX *getFromParent(const std::string &ddxParentName);
// Release the manager
void release();
private:
CDDXManager();
private:
static CDDXManager *_Instance;
std::map _DDXes;
};
#endif // NL_INTERFACE_ELEMENT_H
/* End of interface_element.h */