* ./vlsisapd:
- New: Generic XML configuration parser "Configuration", comes with a little editor "vlsisapd-conf-editor" (temporary name).
This commit is contained in:
parent
c006a8d96b
commit
8d46e014ab
|
@ -7,7 +7,7 @@ LIST(INSERT CMAKE_MODULE_PATH 0 "${VLSISAPD_SOURCE_DIR}/cmake_modules")
|
||||||
FIND_PACKAGE(LibXml2 REQUIRED)
|
FIND_PACKAGE(LibXml2 REQUIRED)
|
||||||
FIND_PACKAGE(PythonSitePackages REQUIRED)
|
FIND_PACKAGE(PythonSitePackages REQUIRED)
|
||||||
|
|
||||||
FIND_PACKAGE(Boost 1.32.0 COMPONENTS python)
|
FIND_PACKAGE(Boost 1.32.0 COMPONENTS program_options filesystem python REQUIRED)
|
||||||
IF (Boost_FOUND)
|
IF (Boost_FOUND)
|
||||||
MESSAGE(STATUS "Found Boost.Python libraries in ${Boost_INCLUDE_DIR} as ${Boost_LIBRARIES}")
|
MESSAGE(STATUS "Found Boost.Python libraries in ${Boost_INCLUDE_DIR} as ${Boost_LIBRARIES}")
|
||||||
FIND_PACKAGE(PythonLibs REQUIRED)
|
FIND_PACKAGE(PythonLibs REQUIRED)
|
||||||
|
|
|
@ -39,7 +39,7 @@ IF(VLSISAPD_DIR_SEARCH)
|
||||||
SET_FOUND (AGDS)
|
SET_FOUND (AGDS)
|
||||||
|
|
||||||
# CIF
|
# CIF
|
||||||
FIND_PATH (CIF_INCLUDE_DIR NAMES vlsisapd/cif/CifCircuit.h PATHS ${VLSISAPD_DIR_SEARCH} PATH_SUFFIXES include)
|
FIND_PATH (CIF_INCLUDE_DIR NAMES vlsisapd/cif/Circuit.h PATHS ${VLSISAPD_DIR_SEARCH} PATH_SUFFIXES include)
|
||||||
FIND_LIBRARY(CIF_LIBRARY NAMES cif PATHS ${VLSISAPD_DIR_SEARCH} PATH_SUFFIXES lib${LIB_SUFFIX})
|
FIND_LIBRARY(CIF_LIBRARY NAMES cif PATHS ${VLSISAPD_DIR_SEARCH} PATH_SUFFIXES lib${LIB_SUFFIX})
|
||||||
SET_FOUND (CIF)
|
SET_FOUND (CIF)
|
||||||
|
|
||||||
|
@ -53,6 +53,11 @@ IF(VLSISAPD_DIR_SEARCH)
|
||||||
FIND_LIBRARY(DTR_LIBRARY NAMES dtr PATHS ${VLSISAPD_DIR_SEARCH} PATH_SUFFIXES lib${LIB_SUFFIX})
|
FIND_LIBRARY(DTR_LIBRARY NAMES dtr PATHS ${VLSISAPD_DIR_SEARCH} PATH_SUFFIXES lib${LIB_SUFFIX})
|
||||||
SET_FOUND (DTR)
|
SET_FOUND (DTR)
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
FIND_PATH (CONFIGURATION_INCLUDE_DIR NAMES vlsisapd/configuration/ConfigurationWidget.h PATHS ${VLSISAPD_DIR_SEARCH} PATH_SUFFIXES include)
|
||||||
|
FIND_LIBRARY(CONFIGURATION_LIBRARY NAMES configuration PATHS ${VLSISAPD_DIR_SEARCH} PATH_SUFFIXES lib${LIB_SUFFIX})
|
||||||
|
SET_FOUND (CONFIGURATION)
|
||||||
|
|
||||||
IF(AGDS_FOUND OR CIF_FOUND OR OPENCHAMS_FOUND OR DTR_FOUND)
|
IF(AGDS_FOUND OR CIF_FOUND OR OPENCHAMS_FOUND OR DTR_FOUND)
|
||||||
SET(VLSISAPD_FOUND TRUE)
|
SET(VLSISAPD_FOUND TRUE)
|
||||||
ELSE(AGDS_FOUND OR CIF_FOUND OR OPENCHAMS_FOUND OR DTR_FOUND)
|
ELSE(AGDS_FOUND OR CIF_FOUND OR OPENCHAMS_FOUND OR DTR_FOUND)
|
||||||
|
|
|
@ -6,3 +6,4 @@ ENDIF(IS_DIRECTORY ${VLSISAPD_SOURCE_DIR}/src/openChams)
|
||||||
IF(IS_DIRECTORY ${VLSISAPD_SOURCE_DIR}/src/dtr)
|
IF(IS_DIRECTORY ${VLSISAPD_SOURCE_DIR}/src/dtr)
|
||||||
ADD_SUBDIRECTORY(dtr)
|
ADD_SUBDIRECTORY(dtr)
|
||||||
ENDIF(IS_DIRECTORY ${VLSISAPD_SOURCE_DIR}/src/dtr)
|
ENDIF(IS_DIRECTORY ${VLSISAPD_SOURCE_DIR}/src/dtr)
|
||||||
|
ADD_SUBDIRECTORY(configuration)
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
FIND_PACKAGE(Qt4 REQUIRED)
|
||||||
|
|
||||||
|
ADD_SUBDIRECTORY(src)
|
|
@ -0,0 +1,46 @@
|
||||||
|
|
||||||
|
include ( ${QT_USE_FILE} )
|
||||||
|
include_directories ( ${VLSISAPD_SOURCE_DIR}/src/configuration/src
|
||||||
|
${Boost_INCLUDE_DIRS}
|
||||||
|
${LIBXML2_INCLUDE_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
|
set ( mocIncludes vlsisapd/configuration/ConfigurationWidget.h
|
||||||
|
vlsisapd/configuration/ParameterWidget.h
|
||||||
|
vlsisapd/configuration/ConfTabWidget.h
|
||||||
|
vlsisapd/configuration/ConfEditorWidget.h
|
||||||
|
)
|
||||||
|
set ( includes vlsisapd/configuration/Parameter.h
|
||||||
|
vlsisapd/configuration/LayoutDescription.h
|
||||||
|
vlsisapd/configuration/Configuration.h
|
||||||
|
)
|
||||||
|
set ( cpps Parameter.cpp
|
||||||
|
LayoutDescription.cpp
|
||||||
|
Configuration.cpp
|
||||||
|
ParameterWidget.cpp
|
||||||
|
ConfTabWidget.cpp
|
||||||
|
ConfigurationWidget.cpp
|
||||||
|
ConfEditorWidget.cpp
|
||||||
|
)
|
||||||
|
set ( editorcpp ConfEditorMain.cpp )
|
||||||
|
|
||||||
|
qt4_wrap_cpp ( mocCpps ${mocIncludes} )
|
||||||
|
|
||||||
|
add_library ( configuration ${cpps} ${mocCpps} )
|
||||||
|
target_link_libraries ( configuration ${QT_LIBRARIES}
|
||||||
|
${Boost_LIBRARIES}
|
||||||
|
${PYTHON_LIBRARIES}
|
||||||
|
${LIBXML2_LIBRARIES}
|
||||||
|
)
|
||||||
|
add_executable ( vlsisapd-conf-editor ${editorcpp} )
|
||||||
|
target_link_libraries ( vlsisapd-conf-editor configuration ${QT_LIBRARIES}
|
||||||
|
${Boost_LIBRARIES}
|
||||||
|
${PYTHON_LIBRARIES}
|
||||||
|
${LIBXML2_LIBRARIES}
|
||||||
|
)
|
||||||
|
|
||||||
|
install ( TARGETS configuration DESTINATION lib${LIB_SUFFIX} )
|
||||||
|
install ( TARGETS vlsisapd-conf-editor DESTINATION bin )
|
||||||
|
install ( FILES ${includes} ${mocIncludes}
|
||||||
|
DESTINATION include/vlsisapd/configuration )
|
||||||
|
|
|
@ -0,0 +1,102 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the VSLSI Stand-Alone Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | C o n f i g u r a t i o n D a t a - B a s e |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul CHAPUT |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Module : "./ConfEditorMain.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#include <boost/program_options.hpp>
|
||||||
|
namespace boptions = boost::program_options;
|
||||||
|
|
||||||
|
#include <boost/filesystem/operations.hpp>
|
||||||
|
namespace bfs = boost::filesystem;
|
||||||
|
|
||||||
|
#include <libxml/xmlreader.h>
|
||||||
|
#include <QtGui>
|
||||||
|
#if (QT_VERSION >= QT_VERSION_CHECK(4,5,0)) and not defined (__APPLE__)
|
||||||
|
# include <QGtkStyle>
|
||||||
|
#endif
|
||||||
|
#include "vlsisapd/configuration/Configuration.h"
|
||||||
|
#include "vlsisapd/configuration/ConfigurationWidget.h"
|
||||||
|
#include "vlsisapd/configuration/ConfEditorWidget.h"
|
||||||
|
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace Cfg;
|
||||||
|
|
||||||
|
|
||||||
|
int main ( int argc, char* argv[] )
|
||||||
|
{
|
||||||
|
int returnCode = 0;
|
||||||
|
|
||||||
|
try {
|
||||||
|
boptions::options_description options ("Command line arguments & options");
|
||||||
|
options.add_options()
|
||||||
|
( "help,h", "Print this help." )
|
||||||
|
( "conf,c", boptions::value<string>()
|
||||||
|
, "The path of the configuration file." );
|
||||||
|
|
||||||
|
boptions::variables_map arguments;
|
||||||
|
boptions::store ( boptions::parse_command_line(argc,argv,options), arguments );
|
||||||
|
boptions::notify ( arguments );
|
||||||
|
|
||||||
|
if ( arguments.count("help") ) {
|
||||||
|
cout << options << endl;
|
||||||
|
exit ( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
auto_ptr<QApplication> qa ( new QApplication(argc,argv) );
|
||||||
|
#if (QT_VERSION >= QT_VERSION_CHECK(4,5,0)) and not defined (__APPLE__)
|
||||||
|
qa->setStyle ( new QGtkStyle() );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bfs::path::default_name_check ( bfs::portable_posix_name );
|
||||||
|
|
||||||
|
Configuration* conf = Configuration::get ();
|
||||||
|
bfs::path dotConfPath ( "./.coriolis2.configuration.xml" );
|
||||||
|
|
||||||
|
if ( bfs::exists(dotConfPath) ) {
|
||||||
|
cout << "Reading dot configuration: <" << dotConfPath.string() << ">." << endl;
|
||||||
|
conf->readFromFile ( dotConfPath.string() );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( arguments.count("conf") ) {
|
||||||
|
bfs::path confPath = ( arguments["conf"].as<string>() );
|
||||||
|
if ( bfs::exists(confPath) ) {
|
||||||
|
cout << "Reading configuration: <" << confPath.string() << ">." << endl;
|
||||||
|
conf->readFromFile ( confPath.string() );
|
||||||
|
} else {
|
||||||
|
cout << "Configuration file: <" << confPath.string() << "> doesn't exists." << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfEditorWidget* editor = new ConfEditorWidget ();
|
||||||
|
editor->show ();
|
||||||
|
|
||||||
|
returnCode = qa->exec ();
|
||||||
|
}
|
||||||
|
catch ( exception& e ) {
|
||||||
|
cerr << "[ERROR] Catched exception:\n " << e.what() << endl;
|
||||||
|
returnCode = 127;
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnCode;
|
||||||
|
}
|
|
@ -0,0 +1,98 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the VSLSI Stand-Alone Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2010-2010, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | C o n f i g u r a t i o n D a t a - B a s e |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul Chaput |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Module : "./ConfEditorWidget.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#include <QAction>
|
||||||
|
#include <QMenu>
|
||||||
|
#include <QMenuBar>
|
||||||
|
#include <QApplication>
|
||||||
|
#include "vlsisapd/configuration/Configuration.h"
|
||||||
|
#include "vlsisapd/configuration/ConfigurationWidget.h"
|
||||||
|
#include "vlsisapd/configuration/ConfEditorWidget.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace Cfg {
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
ConfEditorWidget::ConfEditorWidget ( QWidget* parent )
|
||||||
|
: QMainWindow (parent)
|
||||||
|
, _configurationWidget (Configuration::get()->buildWidget())
|
||||||
|
, _fileMenu (NULL)
|
||||||
|
, _saveAction (NULL)
|
||||||
|
, _quitAction (NULL)
|
||||||
|
{
|
||||||
|
setObjectName("confEditor");
|
||||||
|
|
||||||
|
createMenus ();
|
||||||
|
|
||||||
|
setCentralWidget ( _configurationWidget );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ConfEditorWidget::createActions ()
|
||||||
|
{
|
||||||
|
if ( _quitAction != NULL ) return;
|
||||||
|
|
||||||
|
_quitAction = new QAction ( tr("&Quit"), this );
|
||||||
|
_quitAction->setObjectName ( "confEditor.menuBar.file.quit" );
|
||||||
|
_quitAction->setStatusTip ( tr("Quit the VLSISAPD Configuration Editor") );
|
||||||
|
_quitAction->setShortcut ( QKeySequence(tr("CTRL+Q")) );
|
||||||
|
connect ( _quitAction, SIGNAL(triggered()), this, SLOT(close()) );
|
||||||
|
|
||||||
|
_saveAction = new QAction ( tr("&Save"), this );
|
||||||
|
_saveAction->setObjectName ( "confEditor.menuBar.file.save" );
|
||||||
|
_saveAction->setStatusTip ( tr("Save Settings in ./coriolis2.configuration.xml") );
|
||||||
|
_saveAction->setShortcut ( QKeySequence(tr("CTRL+S")) );
|
||||||
|
connect ( _saveAction, SIGNAL(triggered()), this, SLOT(save()) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ConfEditorWidget::createMenus ()
|
||||||
|
{
|
||||||
|
if ( _fileMenu != NULL ) return;
|
||||||
|
if ( _quitAction == NULL ) createActions ();
|
||||||
|
|
||||||
|
menuBar()->setObjectName ( tr("confEditor.menuBar") );
|
||||||
|
|
||||||
|
_fileMenu = menuBar()->addMenu ( tr("File") );
|
||||||
|
_fileMenu->addAction ( _saveAction );
|
||||||
|
_fileMenu->addAction ( _quitAction );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ConfEditorWidget::save ()
|
||||||
|
{
|
||||||
|
string dotConfigFile = "./.coriolis2.configuration.xml";
|
||||||
|
ofstream file ( dotConfigFile.c_str() );
|
||||||
|
|
||||||
|
cout << "Saving configuration file: <" << dotConfigFile << ">."<< endl;
|
||||||
|
|
||||||
|
Configuration::get()->writeToStream ( file );
|
||||||
|
file.close ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Cfg namespace.
|
|
@ -0,0 +1,189 @@
|
||||||
|
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the VSLSI Stand-Alone Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2010-2010, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | C o n f i g u r a t i o n D a t a - B a s e |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul Chaput |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Module : "./ConfTabWidget.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QFrame>
|
||||||
|
#include <QHBoxLayout>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <QGridLayout>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QApplication>
|
||||||
|
|
||||||
|
#include "vlsisapd/configuration/Configuration.h"
|
||||||
|
#include "vlsisapd/configuration/ParameterWidget.h"
|
||||||
|
#include "vlsisapd/configuration/ConfTabWidget.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace Cfg {
|
||||||
|
|
||||||
|
using std::max;
|
||||||
|
using std::cerr;
|
||||||
|
using std::endl;
|
||||||
|
using std::string;
|
||||||
|
using std::vector;
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Cfg::ConfTabWidget".
|
||||||
|
|
||||||
|
|
||||||
|
ConfTabWidget::ConfTabWidget ( const string& name, QWidget* parent )
|
||||||
|
: QWidget (parent)
|
||||||
|
, _gridLayout(new QGridLayout())
|
||||||
|
, _columns (2)
|
||||||
|
, _rowsCount (new int[_columns])
|
||||||
|
, _parameters()
|
||||||
|
{
|
||||||
|
for ( int i=0 ; i<_columns ; ++i ) _rowsCount[i] = 0;
|
||||||
|
|
||||||
|
setObjectName ( name.c_str() );
|
||||||
|
|
||||||
|
QVBoxLayout* vLayout = new QVBoxLayout ();
|
||||||
|
vLayout->addLayout ( _gridLayout );
|
||||||
|
|
||||||
|
QHBoxLayout* hLayout = new QHBoxLayout ();
|
||||||
|
hLayout->addStretch ();
|
||||||
|
|
||||||
|
QPushButton* apply = new QPushButton ();
|
||||||
|
apply->setText ( tr("Apply") );
|
||||||
|
hLayout->addWidget ( apply );
|
||||||
|
hLayout->addStretch ();
|
||||||
|
|
||||||
|
vLayout->addLayout ( hLayout );
|
||||||
|
vLayout->addStretch ();
|
||||||
|
|
||||||
|
setLayout ( vLayout );
|
||||||
|
|
||||||
|
connect ( apply, SIGNAL(clicked()), this, SIGNAL(updateParameters()) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ConfTabWidget::~ConfTabWidget ()
|
||||||
|
{
|
||||||
|
delete [] _rowsCount;
|
||||||
|
|
||||||
|
for ( size_t i=0 ; i<_parameters.size() ; ++i )
|
||||||
|
_parameters[i]->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int ConfTabWidget::_getMaxRowCount ()
|
||||||
|
{
|
||||||
|
int maxrow = _rowsCount[0];
|
||||||
|
for ( int column=1 ; column<_columns ; ++column )
|
||||||
|
maxrow = max ( maxrow, _rowsCount[column] );
|
||||||
|
|
||||||
|
return maxrow;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int ConfTabWidget::_alignMaxRowCount ()
|
||||||
|
{
|
||||||
|
int maxrow = _gridLayout->rowCount() + 1;
|
||||||
|
for ( int column=0 ; column<_columns ; ++column )
|
||||||
|
_rowsCount[column] = maxrow;
|
||||||
|
|
||||||
|
return maxrow;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ConfTabWidget::addRuler ()
|
||||||
|
{
|
||||||
|
QFrame* separator = new QFrame ();
|
||||||
|
separator->setFrameShape ( QFrame::HLine );
|
||||||
|
separator->setFrameShadow ( QFrame::Sunken );
|
||||||
|
|
||||||
|
_gridLayout->addWidget ( separator, _getMaxRowCount(), 0, 1, 4 );
|
||||||
|
_alignMaxRowCount ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QFont& ConfTabWidget::getParentBoldFont ()
|
||||||
|
{
|
||||||
|
ConfigurationWidget* cw = rparent<ConfigurationWidget*> ( this );
|
||||||
|
return cw->getBoldFont();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ConfTabWidget::addTitle ( const string& title )
|
||||||
|
{
|
||||||
|
QLabel* label = new QLabel();
|
||||||
|
label->setText ( title.c_str() );
|
||||||
|
label->setFont ( getParentBoldFont() );
|
||||||
|
|
||||||
|
_gridLayout->addWidget ( label, _getMaxRowCount(), 0, 1, 4, Qt::AlignLeft );
|
||||||
|
_alignMaxRowCount ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ConfTabWidget::addSection ( const string& section, int column )
|
||||||
|
{
|
||||||
|
QLabel* label = new QLabel();
|
||||||
|
label->setText ( section.c_str() );
|
||||||
|
label->setFont ( getParentBoldFont() );
|
||||||
|
|
||||||
|
int row = _rowsCount[column];
|
||||||
|
if ( (column >= _columns) or ( column < 0) ) {
|
||||||
|
cerr << "[WARNING] Column " << column << " is out of bound (" << _columns << ")." << endl;
|
||||||
|
if ( column < 0 ) column = 0;
|
||||||
|
else column = _columns-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
_gridLayout->addWidget ( label, row, column*2, 1, 2, Qt::AlignLeft );
|
||||||
|
_rowsCount[column]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ParameterWidget* ConfTabWidget::addParameter ( Parameter* parameter, const std::string& label, int column, int flags )
|
||||||
|
{
|
||||||
|
ConfigurationWidget* cw = rparent<ConfigurationWidget*> ( this );
|
||||||
|
ParameterWidget* pw = cw->find(parameter);
|
||||||
|
|
||||||
|
if ( pw != NULL ) {
|
||||||
|
cerr << "[ERROR] Parameter <" << parameter->getId() << "> already added." << endl;
|
||||||
|
return pw;
|
||||||
|
}
|
||||||
|
|
||||||
|
int row = _rowsCount[column];
|
||||||
|
if ( (column >= _columns) or ( column < 0) ) {
|
||||||
|
cerr << "[WARNING] Column " << column << " is out of bound (" << _columns << ")." << endl;
|
||||||
|
if ( column < 0 ) column = 0;
|
||||||
|
else column = _columns-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pw = new ParameterWidget ( this, parameter, label, flags );
|
||||||
|
_gridLayout->addWidget ( pw->getLabelWidget(), row, column*2, Qt::AlignRight );
|
||||||
|
_gridLayout->addWidget ( pw->getValueWidget(), row, 1+column*2, Qt::AlignLeft );
|
||||||
|
|
||||||
|
connect ( this, SIGNAL(updateParameters()), pw, SLOT(updateValue()) );
|
||||||
|
|
||||||
|
_rowsCount[column]++;
|
||||||
|
|
||||||
|
return pw;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Cfg namespace.
|
|
@ -0,0 +1,436 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the VSLSI Stand-Alone Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | C o n f i g u r a t i o n D a t a - B a s e |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul CHAPUT |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Module : "./Configuration.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <libxml/xmlreader.h>
|
||||||
|
#include "vlsisapd/configuration/Configuration.h"
|
||||||
|
#include "vlsisapd/configuration/ConfigurationWidget.h"
|
||||||
|
#include "vlsisapd/configuration/ParameterWidget.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
using namespace Cfg;
|
||||||
|
|
||||||
|
|
||||||
|
class XmlParser {
|
||||||
|
public:
|
||||||
|
XmlParser ( Configuration*, const string& fileName );
|
||||||
|
bool parse ();
|
||||||
|
private:
|
||||||
|
void _configurationNode ();
|
||||||
|
void _parameterNode ();
|
||||||
|
void _itemNode ();
|
||||||
|
void _groupNode ();
|
||||||
|
void _masterNode ();
|
||||||
|
void _slaveNode ();
|
||||||
|
void _layoutNode ();
|
||||||
|
void _tabNode ();
|
||||||
|
void _widgetNode ();
|
||||||
|
string _getAttributeValue ( const char* attributeName );
|
||||||
|
private:
|
||||||
|
Configuration* _configuration;
|
||||||
|
string _fileName;
|
||||||
|
xmlTextReaderPtr _reader;
|
||||||
|
int _status;
|
||||||
|
string _tool;
|
||||||
|
Parameter* _parameter;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
XmlParser::XmlParser ( Configuration* conf
|
||||||
|
, const string& fileName )
|
||||||
|
: _configuration (conf)
|
||||||
|
, _fileName (fileName)
|
||||||
|
, _reader (NULL)
|
||||||
|
, _status (1)
|
||||||
|
, _tool ("<none>")
|
||||||
|
, _parameter (NULL)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
bool XmlParser::parse ()
|
||||||
|
{
|
||||||
|
LIBXML_TEST_VERSION;
|
||||||
|
|
||||||
|
_reader = xmlReaderForFile ( _fileName.c_str(), NULL, 0 );
|
||||||
|
if ( _reader != NULL ) {
|
||||||
|
_status = xmlTextReaderRead ( _reader );
|
||||||
|
while ( _status == 1 ) {
|
||||||
|
string tag ( (const char*)xmlTextReaderConstName(_reader) );
|
||||||
|
if ( tag == "configuration" ) _configurationNode();
|
||||||
|
|
||||||
|
_status = xmlTextReaderRead ( _reader );
|
||||||
|
}
|
||||||
|
xmlFreeTextReader ( _reader );
|
||||||
|
|
||||||
|
if ( _status != 0 ) {
|
||||||
|
cerr << "[ERROR] Syntax error in \"" << _fileName << "\" configuration file." << endl;
|
||||||
|
}
|
||||||
|
xmlCleanupParser ();
|
||||||
|
}
|
||||||
|
|
||||||
|
return (_status != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void XmlParser::_configurationNode ()
|
||||||
|
{
|
||||||
|
if ( xmlTextReaderNodeType(_reader) == XML_READER_TYPE_END_ELEMENT ) return;
|
||||||
|
|
||||||
|
_status = xmlTextReaderRead ( _reader );
|
||||||
|
while ( _status == 1 ) {
|
||||||
|
string tag ( (const char*)xmlTextReaderConstName(_reader) );
|
||||||
|
|
||||||
|
if ( tag == "parameter" ) _parameterNode();
|
||||||
|
else if ( tag == "group" ) _groupNode();
|
||||||
|
else if ( tag == "layout" ) _layoutNode();
|
||||||
|
else if ( tag == "configuration" ) return;
|
||||||
|
|
||||||
|
_status = xmlTextReaderRead ( _reader );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void XmlParser::_parameterNode ()
|
||||||
|
{
|
||||||
|
if ( xmlTextReaderNodeType(_reader) == XML_READER_TYPE_END_ELEMENT ) return;
|
||||||
|
|
||||||
|
string attrId = _getAttributeValue("id");
|
||||||
|
string attrType = _getAttributeValue("type");
|
||||||
|
|
||||||
|
Parameter::Type type = Parameter::String;
|
||||||
|
if ( attrType == "string" ) type = Parameter::String;
|
||||||
|
else if ( attrType == "bool" ) type = Parameter::Bool;
|
||||||
|
else if ( attrType == "int" ) type = Parameter::Int;
|
||||||
|
else if ( attrType == "double" ) type = Parameter::Double;
|
||||||
|
else if ( attrType == "percentage" ) type = Parameter::Percentage;
|
||||||
|
else if ( attrType == "enumerate" ) type = Parameter::Enumerate;
|
||||||
|
|
||||||
|
_parameter = _configuration->getParameter ( attrId );
|
||||||
|
|
||||||
|
if ( _parameter == NULL ) {
|
||||||
|
_parameter = _configuration->addParameter ( attrId
|
||||||
|
, type
|
||||||
|
, _getAttributeValue("value")
|
||||||
|
);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
_parameter->setString ( _getAttributeValue("value") );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (type == Parameter::Enumerate)
|
||||||
|
and (xmlTextReaderIsEmptyElement(_reader) == 0) ) {
|
||||||
|
_status = xmlTextReaderRead ( _reader );
|
||||||
|
while ( _status == 1 ) {
|
||||||
|
string tag ( (const char*)xmlTextReaderConstName(_reader) );
|
||||||
|
if ( tag == "item" ) _itemNode();
|
||||||
|
else if ( tag == "parameter" ) break;
|
||||||
|
|
||||||
|
_status = xmlTextReaderRead ( _reader );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (type == Parameter::Int)
|
||||||
|
or (type == Parameter::Enumerate) ) {
|
||||||
|
string attrMin = _getAttributeValue("min");
|
||||||
|
string attrMax = _getAttributeValue("max");
|
||||||
|
|
||||||
|
int i;
|
||||||
|
if ( not attrMin.empty() ) {
|
||||||
|
istringstream s ( attrMin ); s >> i; _parameter->setMin ( i );
|
||||||
|
}
|
||||||
|
if ( not attrMax.empty() ) {
|
||||||
|
istringstream s ( attrMax ); s >> i; _parameter->setMax ( i );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( (type == Parameter::Double)
|
||||||
|
or (type == Parameter::Percentage) ) {
|
||||||
|
string attrMin = _getAttributeValue("min");
|
||||||
|
string attrMax = _getAttributeValue("max");
|
||||||
|
|
||||||
|
double d;
|
||||||
|
if ( not attrMin.empty() ) {
|
||||||
|
istringstream s ( attrMin ); s >> d; _parameter->setMin ( d );
|
||||||
|
}
|
||||||
|
if ( not attrMax.empty() ) {
|
||||||
|
istringstream s ( attrMax ); s >> d; _parameter->setMax ( d );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_parameter = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void XmlParser::_itemNode ()
|
||||||
|
{
|
||||||
|
string attrLabel = _getAttributeValue("label");
|
||||||
|
string attrValue = _getAttributeValue("value");
|
||||||
|
int value;
|
||||||
|
|
||||||
|
istringstream s ( attrValue );
|
||||||
|
s >> value;
|
||||||
|
|
||||||
|
_parameter->addValue ( attrLabel, value );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void XmlParser::_groupNode ()
|
||||||
|
{
|
||||||
|
if ( xmlTextReaderNodeType(_reader) == XML_READER_TYPE_END_ELEMENT ) return;
|
||||||
|
|
||||||
|
_status = xmlTextReaderRead ( _reader );
|
||||||
|
while ( _status == 1 ) {
|
||||||
|
string tag ( (const char*)xmlTextReaderConstName(_reader) );
|
||||||
|
|
||||||
|
if ( tag == "master" ) _masterNode();
|
||||||
|
else if ( tag == "slave" ) _slaveNode();
|
||||||
|
else if ( tag == "group" ) {
|
||||||
|
_parameter = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_status = xmlTextReaderRead ( _reader );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void XmlParser::_masterNode ()
|
||||||
|
{ _parameter = _configuration->getParameter ( _getAttributeValue("id") ); }
|
||||||
|
|
||||||
|
|
||||||
|
void XmlParser::_slaveNode ()
|
||||||
|
{
|
||||||
|
string attrId = _getAttributeValue("id");
|
||||||
|
if ( _parameter != NULL ) _parameter->addSlave ( attrId );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void XmlParser::_layoutNode ()
|
||||||
|
{
|
||||||
|
_status = xmlTextReaderRead ( _reader );
|
||||||
|
while ( _status == 1 ) {
|
||||||
|
string tag ( (const char*)xmlTextReaderConstName(_reader) );
|
||||||
|
if ( tag == "tab" ) _tabNode();
|
||||||
|
else if ( tag == "layout" ) return;
|
||||||
|
|
||||||
|
_status = xmlTextReaderRead ( _reader );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void XmlParser::_tabNode ()
|
||||||
|
{
|
||||||
|
string attrName = _getAttributeValue("name");
|
||||||
|
|
||||||
|
_configuration->getLayout().addTab ( new TabDescription(attrName) );
|
||||||
|
|
||||||
|
_status = xmlTextReaderRead ( _reader );
|
||||||
|
while ( _status == 1 ) {
|
||||||
|
string tag ( (const char*)xmlTextReaderConstName(_reader) );
|
||||||
|
if ( tag == "widget" ) _widgetNode();
|
||||||
|
else if ( tag == "tab" ) return;
|
||||||
|
|
||||||
|
_status = xmlTextReaderRead ( _reader );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void XmlParser::_widgetNode ()
|
||||||
|
{
|
||||||
|
if ( xmlTextReaderNodeType(_reader) == XML_READER_TYPE_END_ELEMENT ) return;
|
||||||
|
|
||||||
|
string attrId = _getAttributeValue("id");
|
||||||
|
string attrType = _getAttributeValue("type");
|
||||||
|
string attrLabel = _getAttributeValue("label");
|
||||||
|
string attrColumn = _getAttributeValue("column");
|
||||||
|
string attrSpinBox = _getAttributeValue("spinbox");
|
||||||
|
|
||||||
|
if ( attrId.empty() and attrType.empty() ) {
|
||||||
|
cerr << "[ERROR] In <widget> tag, neither \"id\" nor \"type\" attribute." << endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int column = 0;
|
||||||
|
if ( not attrColumn.empty() ) {
|
||||||
|
istringstream s ( attrColumn ); s >> column;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( not attrType.empty() ) {
|
||||||
|
if ( attrType == "title" ) _configuration->getLayout().getBackTab()->addWidget ( WidgetDescription::title (attrLabel) );
|
||||||
|
if ( attrType == "section" ) _configuration->getLayout().getBackTab()->addWidget ( WidgetDescription::section(attrLabel,column) );
|
||||||
|
else if ( attrType == "rule" ) _configuration->getLayout().getBackTab()->addWidget ( WidgetDescription::rule () );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Parameter* parameter = _configuration->getParameter ( attrId );
|
||||||
|
if ( parameter == NULL ) {
|
||||||
|
cerr << "[ERROR] In <widget> tag, no parameter of id:" << attrId << "." << endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int flags = 0;
|
||||||
|
if ( attrSpinBox == "true" ) flags |= ParameterWidget::UseSpinBox;
|
||||||
|
|
||||||
|
_configuration->getLayout().getBackTab()->addWidget ( WidgetDescription::parameter(attrId,attrLabel,column,flags) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string XmlParser::_getAttributeValue ( const char* attributeName )
|
||||||
|
{
|
||||||
|
char* attributeValue = (char*)xmlTextReaderGetAttribute(_reader,(const xmlChar*)attributeName);
|
||||||
|
if ( attributeValue == NULL )
|
||||||
|
return string();
|
||||||
|
|
||||||
|
string value ( attributeValue );
|
||||||
|
free ( attributeValue );
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of anonymous namespace.
|
||||||
|
|
||||||
|
|
||||||
|
namespace Cfg {
|
||||||
|
|
||||||
|
using std::string;
|
||||||
|
using std::map;
|
||||||
|
using std::ostream;
|
||||||
|
using std::setw;
|
||||||
|
|
||||||
|
|
||||||
|
Configuration* Configuration::_singleton = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
Configuration* Configuration::get ()
|
||||||
|
{
|
||||||
|
if ( _singleton == NULL ) _singleton = new Configuration ();
|
||||||
|
return _singleton;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Configuration::Configuration ()
|
||||||
|
: _parameters()
|
||||||
|
, _layout (this)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
ConfigurationWidget* Configuration::buildWidget ()
|
||||||
|
{ return _layout.buildWidget(); }
|
||||||
|
|
||||||
|
|
||||||
|
Parameter* Configuration::getParameter ( const string& name ) const
|
||||||
|
{
|
||||||
|
map<const string,Parameter*>::const_iterator iparameter = _parameters.find(name);
|
||||||
|
if ( iparameter != _parameters.end() ) return iparameter->second;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Parameter* Configuration::addParameter ( const string& id
|
||||||
|
, Parameter::Type type
|
||||||
|
, const string& value )
|
||||||
|
{
|
||||||
|
Parameter* p = getParameter ( id );
|
||||||
|
if ( p != NULL ) {
|
||||||
|
// Update values here.
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = new Parameter ( id, type, value );
|
||||||
|
_parameters.insert ( make_pair(id,p) );
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Configuration::print ( ostream& out ) const
|
||||||
|
{
|
||||||
|
map<const string,Parameter*>::const_iterator iparameter = _parameters.begin();
|
||||||
|
for ( ; iparameter != _parameters.end(); ++iparameter ) {
|
||||||
|
Parameter* p = iparameter->second;
|
||||||
|
out << "id:" << iparameter->first
|
||||||
|
<< " id:" << p->getId()
|
||||||
|
<< " type:" << p->getType()
|
||||||
|
<< " asString:" << p->asString();
|
||||||
|
|
||||||
|
out << " asType:";
|
||||||
|
switch ( p->getType() ) {
|
||||||
|
case Parameter::String: out << "<string>"; break;
|
||||||
|
case Parameter::Bool: out << boolalpha << p->asBool(); break;
|
||||||
|
case Parameter::Int: out << p->asInt(); break;
|
||||||
|
case Parameter::Double: out << p->asDouble(); break;
|
||||||
|
case Parameter::Percentage: out << p->asPercentage(); break;
|
||||||
|
case Parameter::Enumerate:
|
||||||
|
out << endl;
|
||||||
|
|
||||||
|
const vector<Parameter::EnumValue>& values = p->getValues();
|
||||||
|
for ( size_t i=0; i != values.size() ; ++i ) {
|
||||||
|
out << " label:" << values[i]._label << " value:" << values[i]._value << endl;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
out << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Configuration::writeToStream ( ostream& out ) const
|
||||||
|
{
|
||||||
|
out << "<configuration>" << endl;
|
||||||
|
|
||||||
|
map<const string,Parameter*>::const_iterator iparameter = _parameters.begin();
|
||||||
|
for ( ; iparameter != _parameters.end(); ++iparameter ) {
|
||||||
|
Parameter* p = iparameter->second;
|
||||||
|
|
||||||
|
string id = "\"" + p->getId() + "\"";
|
||||||
|
string type = "\"" + Parameter::typeToString(p->getType()) + "\"";
|
||||||
|
|
||||||
|
out << " <parameter"
|
||||||
|
<< " id=" << setw(40) << left << id
|
||||||
|
<< " type=" << setw(12) << left << type
|
||||||
|
<< " value=\"" << p->asString() << "\"/>"
|
||||||
|
<< endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
out << "</configuration>" << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Configuration::readFromFile ( const std::string& fileName )
|
||||||
|
{
|
||||||
|
XmlParser parser ( this, fileName );
|
||||||
|
parser.parse ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Cfg namespace.
|
|
@ -0,0 +1,139 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the VSLSI Stand-Alone Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2010-2010, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | C o n f i g u r a t i o n D a t a - B a s e |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul Chaput |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Module : "./ConfigurationWidget.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <QApplication>
|
||||||
|
|
||||||
|
#include "vlsisapd/configuration/Configuration.h"
|
||||||
|
#include "vlsisapd/configuration/ParameterWidget.h"
|
||||||
|
#include "vlsisapd/configuration/ConfTabWidget.h"
|
||||||
|
#include "vlsisapd/configuration/ConfigurationWidget.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace Cfg {
|
||||||
|
|
||||||
|
using std::max;
|
||||||
|
using std::cerr;
|
||||||
|
using std::endl;
|
||||||
|
using std::string;
|
||||||
|
using std::map;
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Cfg::ConfigurationWidget".
|
||||||
|
|
||||||
|
|
||||||
|
ConfigurationWidget::ConfigurationWidget ( QWidget* parent )
|
||||||
|
: QTabWidget(parent)
|
||||||
|
, _boldFont (QApplication::font())
|
||||||
|
{
|
||||||
|
_boldFont.setBold ( true );
|
||||||
|
|
||||||
|
setAttribute ( Qt::WA_QuitOnClose, false );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QFont& ConfigurationWidget::getBoldFont ()
|
||||||
|
{ return _boldFont; }
|
||||||
|
|
||||||
|
|
||||||
|
void ConfigurationWidget::addRuler ( const string& tabName )
|
||||||
|
{
|
||||||
|
ConfTabWidget* tab = findOrCreate ( tabName );
|
||||||
|
tab->addRuler ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ConfigurationWidget::addTitle ( const string& tabName, const string& title )
|
||||||
|
{
|
||||||
|
ConfTabWidget* tab = findOrCreate ( tabName );
|
||||||
|
tab->addTitle ( title );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ConfigurationWidget::addSection ( const string& tabName, const string& section, int column )
|
||||||
|
{
|
||||||
|
ConfTabWidget* tab = findOrCreate ( tabName );
|
||||||
|
tab->addSection ( section, column );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ParameterWidget* ConfigurationWidget::addParameter ( const string& tabName
|
||||||
|
, Parameter* parameter
|
||||||
|
, const std::string& label
|
||||||
|
, int column
|
||||||
|
, int flags )
|
||||||
|
{
|
||||||
|
ParameterWidget* pw = find(parameter);
|
||||||
|
if ( pw != NULL ) {
|
||||||
|
cerr << "[ERROR] Parameter <" << parameter->getId() << "> already added." << endl;
|
||||||
|
return pw;
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfTabWidget* tab = findOrCreate ( tabName );
|
||||||
|
return tab->addParameter ( parameter, label, column, flags );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ParameterWidget* ConfigurationWidget::find ( Parameter* parameter ) const
|
||||||
|
{
|
||||||
|
if ( parameter == NULL ) return NULL;
|
||||||
|
return find ( parameter->getId() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ParameterWidget* ConfigurationWidget::find ( const string& id ) const
|
||||||
|
{ return findChild<ParameterWidget*>(id.c_str()); }
|
||||||
|
|
||||||
|
|
||||||
|
ConfTabWidget* ConfigurationWidget::findOrCreate ( const string& tabName )
|
||||||
|
{
|
||||||
|
ConfTabWidget* tab = findChild<ConfTabWidget*>(tabName.c_str());
|
||||||
|
if ( tab != NULL ) return tab;
|
||||||
|
|
||||||
|
tab = new ConfTabWidget ( tabName );
|
||||||
|
addTab ( tab, tabName.c_str() );
|
||||||
|
|
||||||
|
return tab;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ConfigurationWidget::syncSlaves ()
|
||||||
|
{
|
||||||
|
const map<const string,Parameter*>& parameters = Configuration::get()->getParameters ();
|
||||||
|
map<const string,Parameter*>::const_iterator iparam = parameters.begin();
|
||||||
|
|
||||||
|
for ( ; iparam != parameters.end() ; ++iparam ) {
|
||||||
|
if ( (*iparam).second->getSlaves().empty() ) continue;
|
||||||
|
|
||||||
|
ParameterWidget* pw = find ( (*iparam).first );
|
||||||
|
if ( pw == NULL ) continue;
|
||||||
|
|
||||||
|
pw->enableSlaves ( pw->getParameter()->asBool() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Cfg namespace.
|
|
@ -0,0 +1,78 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the VSLSI Stand-Alone Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2010-2010, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | C o n f i g u r a t i o n D a t a - B a s e |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul Chaput |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Module : "./LayoutDescription.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#include "vlsisapd/configuration/LayoutDescription.h"
|
||||||
|
#include "vlsisapd/configuration/Configuration.h"
|
||||||
|
#include "vlsisapd/configuration/ConfigurationWidget.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace Cfg {
|
||||||
|
|
||||||
|
using std::cerr;
|
||||||
|
using std::endl;
|
||||||
|
using std::string;
|
||||||
|
using std::vector;
|
||||||
|
|
||||||
|
|
||||||
|
ConfigurationWidget* LayoutDescription::buildWidget ()
|
||||||
|
{
|
||||||
|
ConfigurationWidget* cw = new ConfigurationWidget ();
|
||||||
|
|
||||||
|
for ( size_t itab=0 ; itab<_tabs.size() ; ++itab ) {
|
||||||
|
const vector<WidgetDescription*> widgets = _tabs[itab]->getWidgets();
|
||||||
|
|
||||||
|
for ( size_t iwidget=0 ; iwidget<widgets.size() ; ++iwidget ) {
|
||||||
|
switch ( widgets[iwidget]->getType() ) {
|
||||||
|
case WidgetDescription::Rule:
|
||||||
|
cw->addRuler ( _tabs[itab]->getName() );
|
||||||
|
break;
|
||||||
|
case WidgetDescription::Title:
|
||||||
|
cw->addTitle ( _tabs[itab]->getName()
|
||||||
|
, widgets[iwidget]->getTitle() );
|
||||||
|
break;
|
||||||
|
case WidgetDescription::Section:
|
||||||
|
cw->addSection ( _tabs[itab]->getName()
|
||||||
|
, widgets[iwidget]->getTitle()
|
||||||
|
, widgets[iwidget]->getColumn() );
|
||||||
|
break;
|
||||||
|
case WidgetDescription::Parameter:
|
||||||
|
Parameter* parameter = _configuration->getParameter ( widgets[iwidget]->getId() );
|
||||||
|
cw->addParameter ( _tabs[itab]->getName()
|
||||||
|
, parameter
|
||||||
|
, widgets[iwidget]->getLabel()
|
||||||
|
, widgets[iwidget]->getColumn()
|
||||||
|
, widgets[iwidget]->getFlags() );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cw->syncSlaves ();
|
||||||
|
|
||||||
|
return cw;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Cfg namespace.
|
|
@ -0,0 +1,69 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the VSLSI Stand-Alone Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | C o n f i g u r a t i o n D a t a - B a s e |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul CHAPUT |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./Parameter.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include "vlsisapd/configuration/Parameter.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace Cfg {
|
||||||
|
|
||||||
|
using std::cerr;
|
||||||
|
using std::endl;
|
||||||
|
using std::string;
|
||||||
|
|
||||||
|
|
||||||
|
string Parameter::typeToString ( Parameter::Type type )
|
||||||
|
{
|
||||||
|
switch ( type ) {
|
||||||
|
case String: return "string";
|
||||||
|
case Int: return "int";
|
||||||
|
case Double: return "double";
|
||||||
|
case Bool: return "bool";
|
||||||
|
case Percentage: return "percentage";
|
||||||
|
case Enumerate: return "enumerate";
|
||||||
|
}
|
||||||
|
return "unsupported";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Parameter::Parameter ( const std::string& id
|
||||||
|
, Type type
|
||||||
|
, const std::string& value )
|
||||||
|
: _id (id)
|
||||||
|
, _type (type)
|
||||||
|
, _value (value)
|
||||||
|
, _flags (0)
|
||||||
|
, _minInt (0)
|
||||||
|
, _maxInt (0)
|
||||||
|
, _minDouble(0.0)
|
||||||
|
, _maxDouble(0.0)
|
||||||
|
{
|
||||||
|
if ( type == Percentage ) {
|
||||||
|
setPercentage ( asDouble() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Cfg namespace.
|
|
@ -0,0 +1,248 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the VSLSI Stand-Alone Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2010-2010, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | C o n f i g u r a t i o n D a t a - B a s e |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul Chaput |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Module : "./ParameterWidget.cpp" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QSpinBox>
|
||||||
|
#include <QCheckBox>
|
||||||
|
#include <QComboBox>
|
||||||
|
#include <QLineEdit>
|
||||||
|
#include <QIntValidator>
|
||||||
|
#include <QDoubleValidator>
|
||||||
|
#include "vlsisapd/configuration/Parameter.h"
|
||||||
|
#include "vlsisapd/configuration/ParameterWidget.h"
|
||||||
|
#include "vlsisapd/configuration/ConfigurationWidget.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace Cfg {
|
||||||
|
|
||||||
|
using std::cerr;
|
||||||
|
using std::endl;
|
||||||
|
using std::boolalpha;
|
||||||
|
using std::string;
|
||||||
|
using std::vector;
|
||||||
|
using std::ostringstream;
|
||||||
|
|
||||||
|
|
||||||
|
ParameterWidget::ParameterWidget ( QObject* parent, Parameter* parameter, const std::string& label, int flags )
|
||||||
|
: QObject (parent)
|
||||||
|
, _parameter (parameter)
|
||||||
|
, _labelWidget(new QLabel())
|
||||||
|
, _valueWidget(NULL)
|
||||||
|
, _flags (flags)
|
||||||
|
{
|
||||||
|
setObjectName ( _parameter->getId().c_str() );
|
||||||
|
|
||||||
|
_labelWidget->setText ( label.c_str() );
|
||||||
|
|
||||||
|
switch ( _parameter->getType() ) {
|
||||||
|
case Parameter::String:
|
||||||
|
{
|
||||||
|
QLineEdit* lineEdit = new QLineEdit();
|
||||||
|
lineEdit->setText ( QString("%1").arg(_parameter->asString().c_str()) );
|
||||||
|
_valueWidget = lineEdit;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Parameter::Bool:
|
||||||
|
{
|
||||||
|
QCheckBox* checkBox = new QCheckBox();
|
||||||
|
checkBox->setChecked ( _parameter->asBool() );
|
||||||
|
_valueWidget = checkBox;
|
||||||
|
|
||||||
|
connect ( checkBox, SIGNAL(stateChanged(int)), this, SLOT(enableSlaves(int)) );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Parameter::Int:
|
||||||
|
{
|
||||||
|
if ( hasFlags(UseSpinBox) ) {
|
||||||
|
QSpinBox* spinBox = new QSpinBox();
|
||||||
|
spinBox->setValue ( _parameter->asInt() );
|
||||||
|
_valueWidget = spinBox;
|
||||||
|
} else {
|
||||||
|
QLineEdit* lineEdit = new QLineEdit();
|
||||||
|
lineEdit->setValidator ( new QIntValidator(this) );
|
||||||
|
lineEdit->setText ( QString("%1").arg(_parameter->asString().c_str()) );
|
||||||
|
_valueWidget = lineEdit;
|
||||||
|
}
|
||||||
|
|
||||||
|
int bounds = (int)(_parameter->hasFlags(Parameter::HasMin))
|
||||||
|
+ 2*(int)(_parameter->hasFlags(Parameter::HasMax));
|
||||||
|
|
||||||
|
if ( bounds ) {
|
||||||
|
ostringstream toolTip;
|
||||||
|
toolTip << "A value in interval ";
|
||||||
|
switch ( bounds ) {
|
||||||
|
case 1:
|
||||||
|
toolTip << "[" << _parameter->getMinInt() << ":<no bound>]";
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
toolTip << "[<no bound>:" << _parameter->getMaxInt() << "]";
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
toolTip << "[" << _parameter->getMinInt()
|
||||||
|
<< ":" << _parameter->getMaxInt() << "]";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_valueWidget->setToolTip ( toolTip.str().c_str() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Parameter::Double:
|
||||||
|
case Parameter::Percentage:
|
||||||
|
{
|
||||||
|
double mult = (_parameter->getType() == Parameter::Double) ? 1.0 : 100.0;
|
||||||
|
|
||||||
|
QLineEdit* lineEdit = new QLineEdit();
|
||||||
|
lineEdit->setValidator ( new QDoubleValidator(this) );
|
||||||
|
lineEdit->setText ( QString("%1").arg(_parameter->asDouble()*mult) );
|
||||||
|
//lineEdit->setValue ( _parameter->asPercentage() );
|
||||||
|
|
||||||
|
int bounds = (int)(_parameter->hasFlags(Parameter::HasMin))
|
||||||
|
+ 2*(int)(_parameter->hasFlags(Parameter::HasMax));
|
||||||
|
|
||||||
|
if ( bounds ) {
|
||||||
|
ostringstream toolTip;
|
||||||
|
toolTip << "A value in interval ";
|
||||||
|
|
||||||
|
|
||||||
|
switch ( bounds ) {
|
||||||
|
case 1:
|
||||||
|
toolTip << "[" << (_parameter->getMinDouble()*mult) << ":<no bound>]";
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
toolTip << "[<no bound>:" << (_parameter->getMaxDouble()*mult) << "]";
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
toolTip << "[" << (_parameter->getMinDouble()*mult)
|
||||||
|
<< ":" << (_parameter->getMaxDouble()*mult) << "]";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
lineEdit->setToolTip ( toolTip.str().c_str() );
|
||||||
|
}
|
||||||
|
_valueWidget = lineEdit;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Parameter::Enumerate:
|
||||||
|
{
|
||||||
|
int currentValue = _parameter->asInt();
|
||||||
|
int currentIndex = 0;
|
||||||
|
QComboBox* comboBox = new QComboBox();
|
||||||
|
const vector<Parameter::EnumValue>& values = _parameter->getValues();
|
||||||
|
for ( size_t i=0 ; i != values.size() ; ++i ) {
|
||||||
|
comboBox->addItem ( values[i]._label.c_str(), values[i]._value );
|
||||||
|
if ( values[i]._value == currentValue ) currentIndex = i;
|
||||||
|
}
|
||||||
|
comboBox->setCurrentIndex ( currentIndex );
|
||||||
|
_valueWidget = comboBox;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
string valueId = _parameter->getId() + ".edit";
|
||||||
|
_valueWidget->setObjectName ( valueId.c_str() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ParameterWidget::updateValue ()
|
||||||
|
{
|
||||||
|
if ( _parameter->getType() == Parameter::String )
|
||||||
|
{
|
||||||
|
QLineEdit* lineEdit = qobject_cast<QLineEdit*>(_valueWidget);
|
||||||
|
_parameter->setString ( lineEdit->displayText().toStdString() );
|
||||||
|
}
|
||||||
|
else if ( _parameter->getType() == Parameter::Bool )
|
||||||
|
{
|
||||||
|
QCheckBox* checkBox = qobject_cast<QCheckBox*>(_valueWidget);
|
||||||
|
_parameter->setBool ( checkBox->isChecked() );
|
||||||
|
}
|
||||||
|
else if ( _parameter->getType() == Parameter::Int )
|
||||||
|
{
|
||||||
|
if ( hasFlags(UseSpinBox) ) {
|
||||||
|
QSpinBox* spinBox = qobject_cast<QSpinBox*>(_valueWidget);
|
||||||
|
int value = spinBox->value();
|
||||||
|
|
||||||
|
if ( _parameter->checkValue(value) ) _parameter->setInt ( value );
|
||||||
|
else spinBox->setValue ( _parameter->asInt() );
|
||||||
|
} else {
|
||||||
|
bool success;
|
||||||
|
QLineEdit* lineEdit = qobject_cast<QLineEdit*>(_valueWidget);
|
||||||
|
int value = lineEdit->displayText().toInt ( &success );
|
||||||
|
|
||||||
|
if ( success ) success = _parameter->checkValue ( value );
|
||||||
|
if ( success ) _parameter->setInt ( value );
|
||||||
|
else lineEdit->setText ( _parameter->asString().c_str() );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( _parameter->getType() == Parameter::Double )
|
||||||
|
{
|
||||||
|
bool success;
|
||||||
|
QLineEdit* lineEdit = qobject_cast<QLineEdit*>(_valueWidget);
|
||||||
|
double value = lineEdit->displayText().toFloat ( &success );
|
||||||
|
|
||||||
|
if ( success ) success = _parameter->checkValue ( value );
|
||||||
|
if ( success ) _parameter->setDouble ( value );
|
||||||
|
else lineEdit->setText ( _parameter->asString().c_str() );
|
||||||
|
}
|
||||||
|
else if ( _parameter->getType() == Parameter::Percentage )
|
||||||
|
{
|
||||||
|
bool success;
|
||||||
|
QLineEdit* lineEdit = qobject_cast<QLineEdit*>(_valueWidget);
|
||||||
|
double value = lineEdit->displayText().toFloat ( &success );
|
||||||
|
|
||||||
|
if ( success ) success = _parameter->checkValue ( value/100.0 );
|
||||||
|
if ( success ) _parameter->setPercentage ( value );
|
||||||
|
else lineEdit->setText ( _parameter->asString().c_str() );
|
||||||
|
}
|
||||||
|
else if ( _parameter->getType() == Parameter::Enumerate )
|
||||||
|
{
|
||||||
|
QComboBox* comboBox = qobject_cast<QComboBox*>(_valueWidget);
|
||||||
|
|
||||||
|
const vector<Parameter::EnumValue>& values = _parameter->getValues();
|
||||||
|
_parameter->setInt ( values[comboBox->currentIndex()]._value );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ParameterWidget::enableSlaves ( int state )
|
||||||
|
{
|
||||||
|
ConfigurationWidget* cw = rparent<ConfigurationWidget*> ( this );
|
||||||
|
if ( cw == NULL ) {
|
||||||
|
cerr << "[ERROR] ParameterWidget::enableSlaves(): Cannot find parent ConfigurationWidget." << endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool enabled = ( state != Qt::Unchecked );
|
||||||
|
|
||||||
|
const vector<string>& slaveIds = _parameter->getSlaves();
|
||||||
|
for ( int islave=0 ; islave<slaveIds.size() ; ++islave ) {
|
||||||
|
ParameterWidget* slave = cw->find(slaveIds[islave]);
|
||||||
|
if ( slave == NULL ) continue;
|
||||||
|
|
||||||
|
slave->getLabelWidget()->setEnabled ( enabled );
|
||||||
|
slave->getValueWidget()->setEnabled ( enabled );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Cfg namespace.
|
|
@ -0,0 +1,57 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the VSLSI Stand-Alone Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2010-2010, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | C o n f i g u r a t i o n D a t a - B a s e |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul Chaput |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./ConfEditorWidget.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __VLSISAPD_CONF_EDITOR_WIDGET__
|
||||||
|
#define __VLSISAPD_CONF_EDITOR_WIDGET__
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
#include <QMainWindow>
|
||||||
|
class QMenu;
|
||||||
|
class QAction;
|
||||||
|
|
||||||
|
namespace Cfg {
|
||||||
|
|
||||||
|
class ConfigurationWidget;
|
||||||
|
|
||||||
|
class ConfEditorWidget : public QMainWindow {
|
||||||
|
Q_OBJECT;
|
||||||
|
public:
|
||||||
|
ConfEditorWidget ( QWidget* parent=NULL );
|
||||||
|
void createActions ();
|
||||||
|
void createMenus ();
|
||||||
|
public slots:
|
||||||
|
void save ();
|
||||||
|
private:
|
||||||
|
ConfigurationWidget* _configurationWidget;
|
||||||
|
QMenu* _fileMenu;
|
||||||
|
QAction* _saveAction;
|
||||||
|
QAction* _quitAction;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Cfg namespace.
|
||||||
|
|
||||||
|
#endif // __VLSISAPD_CONF_EDITOR_WIDGET__
|
|
@ -0,0 +1,72 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the VSLSI Stand-Alone Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2010-2010, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | C o n f i g u r a t i o n D a t a - B a s e |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul Chaput |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./ConfTabWidget.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __CFG_CONF_TAB_WIDGET__
|
||||||
|
#define __CFG_CONF_TAB_WIDGET__
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
class QFont;
|
||||||
|
class QGridLayout;
|
||||||
|
|
||||||
|
#include "vlsisapd/configuration/ConfigurationWidget.h"
|
||||||
|
|
||||||
|
namespace Cfg {
|
||||||
|
|
||||||
|
class ParameterWidget;
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Cfg::ConfTabWidget".
|
||||||
|
|
||||||
|
|
||||||
|
class ConfTabWidget : public QWidget {
|
||||||
|
Q_OBJECT;
|
||||||
|
public:
|
||||||
|
ConfTabWidget ( const std::string& name="<noname>", QWidget* parent=NULL );
|
||||||
|
virtual ~ConfTabWidget ();
|
||||||
|
public:
|
||||||
|
QFont& getParentBoldFont ();
|
||||||
|
void addRuler ();
|
||||||
|
void addTitle ( const std::string& title );
|
||||||
|
void addSection ( const std::string& section, int column=0 );
|
||||||
|
ParameterWidget* addParameter ( Parameter*, const std::string& label, int column=0, int flags=0 );
|
||||||
|
signals:
|
||||||
|
void updateParameters ();
|
||||||
|
private:
|
||||||
|
int _getMaxRowCount ();
|
||||||
|
int _alignMaxRowCount ();
|
||||||
|
private:
|
||||||
|
QGridLayout* _gridLayout;
|
||||||
|
int _columns;
|
||||||
|
int* _rowsCount;
|
||||||
|
std::vector<ParameterWidget*> _parameters;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Cfg namespace.
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __CFG_CONF_TAB_WIDGET__
|
|
@ -0,0 +1,150 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the VSLSI Stand-Alone Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | C o n f i g u r a t i o n D a t a - B a s e |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul CHAPUT |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./Configuration.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __CFG_CONFIGURATION__
|
||||||
|
#define __CFG_CONFIGURATION__
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <map>
|
||||||
|
#include <iostream>
|
||||||
|
#include "vlsisapd/configuration/Parameter.h"
|
||||||
|
#include "vlsisapd/configuration/LayoutDescription.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace Cfg {
|
||||||
|
|
||||||
|
class ConfigurationWidget;
|
||||||
|
|
||||||
|
|
||||||
|
class Configuration {
|
||||||
|
public:
|
||||||
|
static Configuration* get ();
|
||||||
|
public:
|
||||||
|
// Methods.
|
||||||
|
ConfigurationWidget* buildWidget ();
|
||||||
|
inline const std::map<const std::string,Parameter*>&
|
||||||
|
getParameters () const;
|
||||||
|
inline const LayoutDescription& getLayout () const;
|
||||||
|
inline LayoutDescription& getLayout ();
|
||||||
|
Parameter* getParameter ( const std::string& id ) const;
|
||||||
|
Parameter* addParameter ( const std::string& id
|
||||||
|
, Parameter::Type type
|
||||||
|
, const std::string& value );
|
||||||
|
void print ( std::ostream& ) const;
|
||||||
|
void readFromFile ( const std::string& );
|
||||||
|
void writeToStream ( std::ostream& ) const;
|
||||||
|
private:
|
||||||
|
// Attributes.
|
||||||
|
static Configuration* _singleton;
|
||||||
|
std::map<const std::string,Parameter*> _parameters;
|
||||||
|
LayoutDescription _layout;
|
||||||
|
private:
|
||||||
|
Configuration ();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Inline Methods.
|
||||||
|
inline const std::map<const std::string,Parameter*>& Configuration::getParameters () const
|
||||||
|
{ return _parameters; }
|
||||||
|
|
||||||
|
inline const LayoutDescription& Configuration::getLayout () const { return _layout; }
|
||||||
|
inline LayoutDescription& Configuration::getLayout () { return _layout; }
|
||||||
|
|
||||||
|
|
||||||
|
inline Parameter* getParamString ( const std::string& id, const std::string& value="<undefined>" )
|
||||||
|
{
|
||||||
|
Parameter* parameter = Configuration::get()->getParameter(id);
|
||||||
|
if ( parameter == NULL ) {
|
||||||
|
parameter = Configuration::get()->addParameter ( id, Parameter::String, value );
|
||||||
|
}
|
||||||
|
|
||||||
|
return parameter;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Parameter* getParamBool ( const std::string& id, bool value=false )
|
||||||
|
{
|
||||||
|
Parameter* parameter = Configuration::get()->getParameter(id);
|
||||||
|
if ( parameter == NULL ) {
|
||||||
|
parameter = Configuration::get()->addParameter ( id, Parameter::Bool, "false" );
|
||||||
|
parameter->setBool ( value );
|
||||||
|
}
|
||||||
|
|
||||||
|
return parameter;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Parameter* getParamInt ( const std::string& id, int value=0 )
|
||||||
|
{
|
||||||
|
Parameter* parameter = Configuration::get()->getParameter(id);
|
||||||
|
if ( parameter == NULL ) {
|
||||||
|
parameter = Configuration::get()->addParameter ( id, Parameter::Int, "0" );
|
||||||
|
parameter->setInt ( value );
|
||||||
|
}
|
||||||
|
|
||||||
|
return parameter;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Parameter* getParamEnumerate ( const std::string& id, int value=0 )
|
||||||
|
{
|
||||||
|
Parameter* parameter = Configuration::get()->getParameter(id);
|
||||||
|
if ( parameter == NULL ) {
|
||||||
|
parameter = Configuration::get()->addParameter ( id, Parameter::Enumerate, "0" );
|
||||||
|
parameter->setInt ( value );
|
||||||
|
}
|
||||||
|
|
||||||
|
return parameter;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Parameter* getParamDouble ( const std::string& id, double value=0.0 )
|
||||||
|
{
|
||||||
|
Parameter* parameter = Configuration::get()->getParameter(id);
|
||||||
|
if ( parameter == NULL ) {
|
||||||
|
parameter = Configuration::get()->addParameter ( id, Parameter::Double, "0.0" );
|
||||||
|
parameter->setDouble ( value );
|
||||||
|
}
|
||||||
|
|
||||||
|
return parameter;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Parameter* getParamPercentage ( const std::string& id, double value=91.0 )
|
||||||
|
{
|
||||||
|
Parameter* parameter = Configuration::get()->getParameter(id);
|
||||||
|
if ( parameter == NULL ) {
|
||||||
|
parameter = Configuration::get()->addParameter ( id, Parameter::Percentage, "0.91" );
|
||||||
|
parameter->setPercentage ( value );
|
||||||
|
}
|
||||||
|
|
||||||
|
return parameter;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Cfg namespace.
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __CFG_CONFIGURATION__
|
|
@ -0,0 +1,85 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the VSLSI Stand-Alone Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2010-2010, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | C o n f i g u r a t i o n D a t a - B a s e |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul Chaput |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./ConfigurationWidget.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __CFG_CONFIGURATION_WIDGET__
|
||||||
|
#define __CFG_CONFIGURATION_WIDGET__
|
||||||
|
|
||||||
|
//#include <map>
|
||||||
|
#include <QFont>
|
||||||
|
#include <QTabWidget>
|
||||||
|
|
||||||
|
|
||||||
|
namespace Cfg {
|
||||||
|
|
||||||
|
class Configuration;
|
||||||
|
class Parameter;
|
||||||
|
class ParameterWidget;
|
||||||
|
class ConfTabWidget;
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Cfg::ConfigurationWidget".
|
||||||
|
|
||||||
|
|
||||||
|
class ConfigurationWidget : public QTabWidget {
|
||||||
|
Q_OBJECT;
|
||||||
|
public:
|
||||||
|
ConfigurationWidget ( QWidget* parent=NULL );
|
||||||
|
public:
|
||||||
|
QFont& getBoldFont ();
|
||||||
|
ParameterWidget* find ( Parameter* ) const;
|
||||||
|
ParameterWidget* find ( const std::string& id ) const;
|
||||||
|
ConfTabWidget* findOrCreate ( const std::string& name );
|
||||||
|
void addRuler ( const std::string& tabName );
|
||||||
|
void addTitle ( const std::string& tabName, const std::string& title );
|
||||||
|
void addSection ( const std::string& tabName, const std::string& section, int column=0 );
|
||||||
|
ParameterWidget* addParameter ( const std::string& tabName, Parameter*, const std::string& label, int column=0, int flags=0 );
|
||||||
|
void syncSlaves ();
|
||||||
|
private:
|
||||||
|
QFont _boldFont;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Functions Templates.
|
||||||
|
template<typename QTypeWidget>
|
||||||
|
QTypeWidget rparent ( QObject* object )
|
||||||
|
{
|
||||||
|
QTypeWidget root = NULL;
|
||||||
|
|
||||||
|
while ( object != NULL ) {
|
||||||
|
object = object->parent();
|
||||||
|
root = qobject_cast<QTypeWidget>(object);
|
||||||
|
if ( root != NULL )
|
||||||
|
return root;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Cfg namespace.
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __CFG_CONFIGURATION_WIDGET__
|
|
@ -0,0 +1,178 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the VSLSI Stand-Alone Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2010-2010, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | C o n f i g u r a t i o n D a t a - B a s e |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul Chaput |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./LayoutDescription.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __CFG_LAYOUT_DESCRIPTION__
|
||||||
|
#define __CFG_LAYOUT_DESCRIPTION__
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
namespace Cfg {
|
||||||
|
|
||||||
|
class Configuration;
|
||||||
|
class ConfigurationWidget;
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Cfg::WidgetDescription".
|
||||||
|
|
||||||
|
|
||||||
|
class WidgetDescription {
|
||||||
|
public:
|
||||||
|
enum Type { Title=1, Section=2, Rule=3, Parameter=4 };
|
||||||
|
public:
|
||||||
|
inline static WidgetDescription* rule ();
|
||||||
|
inline static WidgetDescription* title ( const std::string& title );
|
||||||
|
inline static WidgetDescription* section ( const std::string& title, int column );
|
||||||
|
inline static WidgetDescription* parameter ( const std::string& id
|
||||||
|
, const std::string& label
|
||||||
|
, int column
|
||||||
|
, int flags
|
||||||
|
);
|
||||||
|
inline Type getType () const;
|
||||||
|
inline const std::string& getId () const;
|
||||||
|
inline const std::string& getLabel () const;
|
||||||
|
inline const std::string& getTitle () const;
|
||||||
|
inline int getColumn () const;
|
||||||
|
inline int getFlags () const;
|
||||||
|
private:
|
||||||
|
Type _type;
|
||||||
|
std::string _id; // Alternate id, title or section.
|
||||||
|
std::string _label;
|
||||||
|
int _column;
|
||||||
|
int _flags;
|
||||||
|
private:
|
||||||
|
inline WidgetDescription ( Type type
|
||||||
|
, const std::string& id ="<none>"
|
||||||
|
, const std::string& label ="<none>"
|
||||||
|
, int column=0
|
||||||
|
, int flags=0
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Inline Functions.
|
||||||
|
inline WidgetDescription::WidgetDescription ( Type type
|
||||||
|
, const std::string& id
|
||||||
|
, const std::string& label
|
||||||
|
, int column
|
||||||
|
, int flags )
|
||||||
|
: _type(type), _id(id), _label(label), _column(column), _flags(flags)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
inline WidgetDescription* WidgetDescription::rule ()
|
||||||
|
{ return new WidgetDescription(Rule); }
|
||||||
|
|
||||||
|
inline WidgetDescription* WidgetDescription::title ( const std::string& title )
|
||||||
|
{ return new WidgetDescription(Title,title); }
|
||||||
|
|
||||||
|
inline WidgetDescription* WidgetDescription::section ( const std::string& title, int column )
|
||||||
|
{ return new WidgetDescription(Section,title,"<none>",column); }
|
||||||
|
|
||||||
|
inline WidgetDescription* WidgetDescription::parameter ( const std::string& id
|
||||||
|
, const std::string& label
|
||||||
|
, int column
|
||||||
|
, int flags
|
||||||
|
)
|
||||||
|
{ return new WidgetDescription(Parameter,id,label,column,flags); }
|
||||||
|
|
||||||
|
inline WidgetDescription::Type WidgetDescription::getType () const { return _type; }
|
||||||
|
inline const std::string& WidgetDescription::getId () const { return _id; }
|
||||||
|
inline const std::string& WidgetDescription::getLabel () const { return _label; }
|
||||||
|
inline const std::string& WidgetDescription::getTitle () const { return _id; }
|
||||||
|
inline int WidgetDescription::getColumn () const { return _column; }
|
||||||
|
inline int WidgetDescription::getFlags () const { return _flags; }
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Cfg::TabDescription".
|
||||||
|
|
||||||
|
|
||||||
|
class TabDescription {
|
||||||
|
public:
|
||||||
|
inline TabDescription ( const std::string& name );
|
||||||
|
inline void addWidget ( WidgetDescription* );
|
||||||
|
inline const std::string& getName () const;
|
||||||
|
inline const std::vector<WidgetDescription*>& getWidgets () const;
|
||||||
|
private:
|
||||||
|
std::string _name;
|
||||||
|
std::vector<WidgetDescription*> _widgets;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Inline Methods.
|
||||||
|
inline TabDescription::TabDescription ( const std::string& name )
|
||||||
|
: _name(name), _widgets()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
inline void TabDescription::addWidget ( WidgetDescription* widget )
|
||||||
|
{ _widgets.push_back(widget); }
|
||||||
|
|
||||||
|
inline const std::string& TabDescription::getName () const
|
||||||
|
{ return _name; }
|
||||||
|
|
||||||
|
inline const std::vector<WidgetDescription*>& TabDescription::getWidgets () const
|
||||||
|
{ return _widgets; }
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Cfg::LayoutDescription".
|
||||||
|
|
||||||
|
|
||||||
|
class LayoutDescription {
|
||||||
|
public:
|
||||||
|
inline LayoutDescription ( Configuration* );
|
||||||
|
inline void addTab ( TabDescription* );
|
||||||
|
inline TabDescription* getBackTab ();
|
||||||
|
inline const std::vector<TabDescription*>& getTabs () const;
|
||||||
|
ConfigurationWidget* buildWidget ();
|
||||||
|
private:
|
||||||
|
Configuration* _configuration;
|
||||||
|
std::vector<TabDescription*> _tabs;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Inline Methods.
|
||||||
|
inline LayoutDescription::LayoutDescription ( Configuration* cfg )
|
||||||
|
: _configuration(cfg), _tabs()
|
||||||
|
{ }
|
||||||
|
|
||||||
|
inline void LayoutDescription::addTab ( TabDescription* tab )
|
||||||
|
{ _tabs.push_back(tab); }
|
||||||
|
|
||||||
|
inline TabDescription* LayoutDescription::getBackTab ()
|
||||||
|
{ return _tabs.back(); }
|
||||||
|
|
||||||
|
inline const std::vector<TabDescription*>& LayoutDescription::getTabs () const
|
||||||
|
{ return _tabs; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Cfg namespace.
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __CFG_LAYOUT_DESCRIPTION__
|
|
@ -0,0 +1,186 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the VSLSI Stand-Alone Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | C o n f i g u r a t i o n D a t a - B a s e |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul CHAPUT |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./Parameter.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __CFG_CONFIGURATION_PARAMETER__
|
||||||
|
#define __CFG_CONFIGURATION_PARAMETER__
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
|
#include <sstream>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
|
namespace Cfg {
|
||||||
|
|
||||||
|
|
||||||
|
class Parameter {
|
||||||
|
public:
|
||||||
|
enum Type { String = 1
|
||||||
|
, Int = 2
|
||||||
|
, Double = 3
|
||||||
|
, Bool = 4
|
||||||
|
, Percentage = 5
|
||||||
|
, Enumerate = 6
|
||||||
|
};
|
||||||
|
enum Flags { HasMin = 0x1
|
||||||
|
, HasMax = 0x2
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
class EnumValue {
|
||||||
|
public:
|
||||||
|
inline EnumValue ( const std::string&, int );
|
||||||
|
public:
|
||||||
|
std::string _label;
|
||||||
|
int _value;
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
static std::string typeToString ( Type );
|
||||||
|
public:
|
||||||
|
Parameter ( const std::string& id
|
||||||
|
, Type type
|
||||||
|
, const std::string& value );
|
||||||
|
inline const std::string& getId () const;
|
||||||
|
inline const Type getType () const;
|
||||||
|
inline const std::vector<EnumValue>&
|
||||||
|
getValues () const;
|
||||||
|
inline const std::vector<std::string>&
|
||||||
|
getSlaves () const;
|
||||||
|
inline int getFlags () const;
|
||||||
|
inline bool hasFlags ( int mask ) const;
|
||||||
|
inline int getMinInt () const;
|
||||||
|
inline int getMaxInt () const;
|
||||||
|
inline double getMinDouble () const;
|
||||||
|
inline double getMaxDouble () const;
|
||||||
|
inline bool checkValue ( int ) const;
|
||||||
|
inline bool checkValue ( double ) const;
|
||||||
|
inline const std::string& asString () const;
|
||||||
|
inline bool asBool () const;
|
||||||
|
inline int asInt () const;
|
||||||
|
inline double asDouble () const;
|
||||||
|
inline double asPercentage () const;
|
||||||
|
inline void addValue ( const std::string&, int );
|
||||||
|
inline void addSlave ( const std::string& );
|
||||||
|
inline void setString ( const std::string& );
|
||||||
|
inline void setFlags ( int mask );
|
||||||
|
inline void unsetFlags ( int mask );
|
||||||
|
inline void setInt ( int );
|
||||||
|
inline void setDouble ( double );
|
||||||
|
inline void setBool ( bool );
|
||||||
|
inline void setPercentage ( double );
|
||||||
|
inline void setMin ( int );
|
||||||
|
inline void setMax ( int );
|
||||||
|
inline void setMin ( double );
|
||||||
|
inline void setMax ( double );
|
||||||
|
private:
|
||||||
|
// Attributes.
|
||||||
|
std::string _id;
|
||||||
|
Type _type;
|
||||||
|
std::string _value;
|
||||||
|
std::vector<EnumValue> _values;
|
||||||
|
int _flags;
|
||||||
|
int _minInt;
|
||||||
|
int _maxInt;
|
||||||
|
double _minDouble;
|
||||||
|
double _maxDouble;
|
||||||
|
std::vector<std::string> _slaves;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Inline Methods.
|
||||||
|
inline const std::string& Parameter::getId () const { return _id; }
|
||||||
|
inline const Parameter::Type Parameter::getType () const { return _type; }
|
||||||
|
inline int Parameter::getFlags () const { return _flags; }
|
||||||
|
inline bool Parameter::hasFlags ( int mask ) const { return (_flags & mask); }
|
||||||
|
inline int Parameter::getMinInt () const { return _minInt; }
|
||||||
|
inline int Parameter::getMaxInt () const { return _maxInt; }
|
||||||
|
inline double Parameter::getMinDouble () const { return _minDouble; }
|
||||||
|
inline double Parameter::getMaxDouble () const { return _maxDouble; }
|
||||||
|
inline const std::string& Parameter::asString () const { return _value; }
|
||||||
|
inline void Parameter::setString ( const std::string& s ) { _value = s; }
|
||||||
|
|
||||||
|
inline bool Parameter::checkValue ( int value ) const {
|
||||||
|
bool ok = not ( ( (_flags&HasMin) and (value < _minInt) )
|
||||||
|
or ( (_flags&HasMax) and (value > _maxInt) ) );
|
||||||
|
// std::cerr << "flags:" << _flags << " "
|
||||||
|
// << _minInt << " < " << value << " < " << _maxInt
|
||||||
|
// << " : " << std::boolalpha << ok << std::endl;
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool Parameter::checkValue ( double value ) const {
|
||||||
|
bool ok = not ( ( (_flags&HasMin) and (value < _minDouble) )
|
||||||
|
or ( (_flags&HasMax) and (value > _maxDouble) ) );
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline const std::vector<Parameter::EnumValue>& Parameter::getValues () const { return _values; }
|
||||||
|
inline const std::vector<std::string>& Parameter::getSlaves () const { return _slaves; }
|
||||||
|
inline void Parameter::addSlave ( const std::string& id ) { _slaves.push_back ( id ); }
|
||||||
|
|
||||||
|
inline void Parameter::addValue ( const std::string& label, int value ) {
|
||||||
|
if ( _type != Enumerate ) {
|
||||||
|
std::cerr << "[ERROR] Cannot add item on parameter <" << _id
|
||||||
|
<< ">, not enumerated." << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_values.push_back ( EnumValue(label,value) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool Parameter::asBool () const
|
||||||
|
{ std::istringstream s ( _value ); bool b; s >> std::boolalpha >> b; return b; }
|
||||||
|
|
||||||
|
inline int Parameter::asInt () const
|
||||||
|
{ std::istringstream s ( _value ); int i; s >> i; return i; }
|
||||||
|
|
||||||
|
inline double Parameter::asDouble () const
|
||||||
|
{ std::istringstream s ( _value ); double d; s >> d; return d; }
|
||||||
|
|
||||||
|
inline double Parameter::asPercentage () const
|
||||||
|
{ std::istringstream s ( _value ); double r; s >> r; return r*100.0; }
|
||||||
|
|
||||||
|
inline void Parameter::setInt ( int i ) { std::ostringstream s; s << i; _value = s.str(); }
|
||||||
|
inline void Parameter::setDouble ( double d ) { std::ostringstream s; s << d; _value = s.str(); }
|
||||||
|
inline void Parameter::setBool ( bool b ) { std::ostringstream s; s << std::boolalpha << b; _value = s.str(); }
|
||||||
|
inline void Parameter::setPercentage ( double d ) { std::ostringstream s; s << (d/100.0); _value = s.str(); }
|
||||||
|
inline void Parameter::setFlags ( int mask ) { _flags |= mask; }
|
||||||
|
inline void Parameter::unsetFlags ( int mask ) { _flags &= ~mask; }
|
||||||
|
inline void Parameter::setMin ( int min ) { _minInt = min; setFlags(HasMin); }
|
||||||
|
inline void Parameter::setMax ( int max ) { _maxInt = max; setFlags(HasMax); }
|
||||||
|
|
||||||
|
inline void Parameter::setMin ( double min )
|
||||||
|
{ _minDouble = min; setFlags(HasMin); if (_type==Percentage) _minDouble/=100.0; }
|
||||||
|
|
||||||
|
inline void Parameter::setMax ( double max )
|
||||||
|
{ _maxDouble = max; setFlags(HasMax); if (_type==Percentage) _maxDouble/=100.0; }
|
||||||
|
|
||||||
|
inline Parameter::EnumValue::EnumValue ( const std::string& label, int value )
|
||||||
|
: _label(label), _value(value) { }
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Cfg namespace.
|
||||||
|
|
||||||
|
|
||||||
|
#endif // __CFG_CONFIGURATION_PARAMETER__
|
|
@ -0,0 +1,80 @@
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the VSLSI Stand-Alone Software.
|
||||||
|
// Copyright (c) UPMC/LIP6 2010-2010, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
//
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | |
|
||||||
|
// | C O R I O L I S |
|
||||||
|
// | C o n f i g u r a t i o n D a t a - B a s e |
|
||||||
|
// | |
|
||||||
|
// | Author : Jean-Paul Chaput |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./ParameterWidget.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __CFG_PARAMETER_WIDGET__
|
||||||
|
#define __CFG_PARAMETER_WIDGET__
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <QObject>
|
||||||
|
class QLabel;
|
||||||
|
|
||||||
|
|
||||||
|
namespace Cfg {
|
||||||
|
|
||||||
|
class Parameter;
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Cfg::ParameterWidget".
|
||||||
|
|
||||||
|
|
||||||
|
class ParameterWidget : public QObject {
|
||||||
|
Q_OBJECT;
|
||||||
|
public:
|
||||||
|
enum Flags { UseSpinBox=0x1 };
|
||||||
|
public:
|
||||||
|
ParameterWidget ( QObject* parent, Parameter*, const std::string& label, int flags );
|
||||||
|
inline Parameter* getParameter ();
|
||||||
|
inline QLabel* getLabelWidget ();
|
||||||
|
inline QWidget* getValueWidget ();
|
||||||
|
inline int getFlags () const;
|
||||||
|
inline bool hasFlags ( int mask ) const;
|
||||||
|
inline void setFlags ( int mask );
|
||||||
|
inline void unsetFlags ( int mask );
|
||||||
|
public slots:
|
||||||
|
void updateValue ();
|
||||||
|
void enableSlaves ( int );
|
||||||
|
public:
|
||||||
|
Parameter* _parameter;
|
||||||
|
QLabel* _labelWidget;
|
||||||
|
QWidget* _valueWidget;
|
||||||
|
int _flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Inline Methods.
|
||||||
|
inline Parameter* ParameterWidget::getParameter () { return _parameter; }
|
||||||
|
inline QLabel* ParameterWidget::getLabelWidget () { return _labelWidget; }
|
||||||
|
inline QWidget* ParameterWidget::getValueWidget () { return _valueWidget; }
|
||||||
|
inline int ParameterWidget::getFlags () const { return _flags; }
|
||||||
|
inline bool ParameterWidget::hasFlags ( int mask ) const { return (_flags & mask); }
|
||||||
|
inline void ParameterWidget::setFlags ( int mask ) { _flags |= mask; }
|
||||||
|
inline void ParameterWidget::unsetFlags ( int mask ) { _flags &= ~mask; }
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Cfg namespace.
|
||||||
|
|
||||||
|
#endif // __CFG_PARAMETER_WIDGET__
|
Loading…
Reference in New Issue