Delete old framework files
parent
6ecee55209
commit
d3148555fa
@ -1,82 +0,0 @@
|
||||
#include "settingcontainer.hpp"
|
||||
|
||||
#include <QStringList>
|
||||
|
||||
CSMSettings::SettingContainer::SettingContainer(QObject *parent) :
|
||||
QObject(parent), mValue (0), mValues (0)
|
||||
{
|
||||
}
|
||||
|
||||
CSMSettings::SettingContainer::SettingContainer(const QString &value, QObject *parent) :
|
||||
QObject(parent), mValue (new QString (value)), mValues (0)
|
||||
{
|
||||
}
|
||||
|
||||
void CSMSettings::SettingContainer::insert (const QString &value)
|
||||
{
|
||||
if (mValue)
|
||||
{
|
||||
mValues = new QStringList;
|
||||
mValues->push_back (*mValue);
|
||||
mValues->push_back (value);
|
||||
|
||||
delete mValue;
|
||||
mValue = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
delete mValue;
|
||||
mValue = new QString (value);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void CSMSettings::SettingContainer::update (const QString &value, int index)
|
||||
{
|
||||
if (isEmpty())
|
||||
mValue = new QString(value);
|
||||
|
||||
else if (mValue)
|
||||
*mValue = value;
|
||||
|
||||
else if (mValues)
|
||||
mValues->replace(index, value);
|
||||
}
|
||||
|
||||
QString CSMSettings::SettingContainer::getValue (int index) const
|
||||
{
|
||||
QString retVal("");
|
||||
|
||||
//if mValue is valid, it's a single-value property.
|
||||
//ignore the index and return the value
|
||||
if (mValue)
|
||||
retVal = *mValue;
|
||||
|
||||
//otherwise, if it's a multivalued property
|
||||
//return the appropriate value at the index
|
||||
else if (mValues)
|
||||
{
|
||||
if (index == -1)
|
||||
retVal = mValues->at(0);
|
||||
|
||||
else if (index < mValues->size())
|
||||
retVal = mValues->at(index);
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
int CSMSettings::SettingContainer::count () const
|
||||
{
|
||||
int retVal = 0;
|
||||
|
||||
if (!isEmpty())
|
||||
{
|
||||
if (mValues)
|
||||
retVal = mValues->size();
|
||||
else
|
||||
retVal = 1;
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
@ -1,47 +0,0 @@
|
||||
#ifndef SETTINGCONTAINER_HPP
|
||||
#define SETTINGCONTAINER_HPP
|
||||
|
||||
#include <QObject>
|
||||
|
||||
class QStringList;
|
||||
|
||||
namespace CSMSettings
|
||||
{
|
||||
class SettingContainer : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
QString *mValue;
|
||||
QStringList *mValues;
|
||||
|
||||
public:
|
||||
|
||||
explicit SettingContainer (QObject *parent = 0);
|
||||
explicit SettingContainer (const QString &value, QObject *parent = 0);
|
||||
|
||||
/// add a value to the container
|
||||
/// multiple values supported
|
||||
void insert (const QString &value);
|
||||
|
||||
/// update an existing value
|
||||
/// index specifies multiple values
|
||||
void update (const QString &value, int index = 0);
|
||||
|
||||
/// return value at specified index
|
||||
QString getValue (int index = -1) const;
|
||||
|
||||
/// retrieve list of all values
|
||||
inline QStringList *getValues() const { return mValues; }
|
||||
|
||||
/// return size of list
|
||||
int count() const;
|
||||
|
||||
/// test for empty container
|
||||
/// useful for default-constructed containers returned by QMap when invalid key is passed
|
||||
inline bool isEmpty() const { return (!mValue && !mValues); }
|
||||
|
||||
inline bool isMultiValue() const { return (mValues); }
|
||||
};
|
||||
}
|
||||
|
||||
#endif // SETTINGCONTAINER_HPP
|
@ -1,104 +0,0 @@
|
||||
#include "settingsitem.hpp"
|
||||
|
||||
#include <QStringList>
|
||||
|
||||
bool CSMSettings::SettingsItem::updateItem (const QStringList *values)
|
||||
{
|
||||
QStringList::ConstIterator it = values->begin();
|
||||
|
||||
//if the item is not multivalued,
|
||||
//save the last value passed in the container
|
||||
if (!mIsMultiValue)
|
||||
{
|
||||
it = values->end();
|
||||
it--;
|
||||
}
|
||||
|
||||
bool isValid = true;
|
||||
QString value ("");
|
||||
|
||||
for (; it != values->end(); ++it)
|
||||
{
|
||||
value = *it;
|
||||
isValid = validate(value);
|
||||
|
||||
//skip only the invalid values
|
||||
if (!isValid)
|
||||
continue;
|
||||
|
||||
insert(value);
|
||||
}
|
||||
|
||||
return isValid;
|
||||
}
|
||||
|
||||
bool CSMSettings::SettingsItem::updateItem (const QString &value)
|
||||
{
|
||||
//takes a value or a SettingsContainer and updates itself accordingly
|
||||
//after validating the data against it's own definition
|
||||
|
||||
QString newValue = value;
|
||||
|
||||
if (!validate (newValue))
|
||||
newValue = mDefaultValue;
|
||||
|
||||
bool success = (getValue() != newValue);
|
||||
|
||||
if (success)
|
||||
{
|
||||
if (mIsMultiValue)
|
||||
insert (newValue);
|
||||
else
|
||||
update (newValue);
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
bool CSMSettings::SettingsItem::updateItem(int valueListIndex)
|
||||
{
|
||||
bool success = false;
|
||||
|
||||
if (mValueList)
|
||||
{
|
||||
if (mValueList->size() > valueListIndex)
|
||||
success = updateItem (mValueList->at(valueListIndex));
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
bool CSMSettings::SettingsItem::validate (const QString &value)
|
||||
{
|
||||
//if there is no value list or value pair, there is no validation to do
|
||||
bool isValid = !(!mValueList->isEmpty() || mValuePair);
|
||||
|
||||
if (!isValid && !mValueList->isEmpty())
|
||||
{
|
||||
for (QStringList::Iterator it = mValueList->begin(); it != mValueList->end(); ++it)
|
||||
// foreach (QString listItem, *mValueList)
|
||||
{
|
||||
isValid = (value == *it);
|
||||
|
||||
if (isValid)
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (!isValid && mValuePair)
|
||||
{
|
||||
int numVal = value.toInt();
|
||||
|
||||
isValid = (numVal > mValuePair->left.toInt() && numVal < mValuePair->right.toInt());
|
||||
}
|
||||
|
||||
return isValid;
|
||||
}
|
||||
|
||||
void CSMSettings::SettingsItem::setDefaultValue (const QString &value)
|
||||
{
|
||||
mDefaultValue = value;
|
||||
update (value);
|
||||
}
|
||||
|
||||
QString CSMSettings::SettingsItem::getDefaultValue() const
|
||||
{
|
||||
return mDefaultValue;
|
||||
}
|
@ -1,67 +0,0 @@
|
||||
#ifndef SETTINGSITEM_HPP
|
||||
#define SETTINGSITEM_HPP
|
||||
|
||||
#include <QObject>
|
||||
#include "support.hpp"
|
||||
#include "settingcontainer.hpp"
|
||||
|
||||
namespace CSMSettings
|
||||
{
|
||||
/// Represents a setting including metadata
|
||||
/// (valid values, ranges, defaults, and multivalue status
|
||||
class SettingsItem : public SettingContainer
|
||||
{
|
||||
QStringPair *mValuePair;
|
||||
QStringList *mValueList;
|
||||
bool mIsMultiValue;
|
||||
QString mDefaultValue;
|
||||
|
||||
public:
|
||||
explicit SettingsItem(QString name, bool isMultiValue,
|
||||
const QString& defaultValue, QObject *parent = 0)
|
||||
: SettingContainer(defaultValue, parent),
|
||||
mIsMultiValue (isMultiValue), mValueList (0),
|
||||
mValuePair (0), mDefaultValue (defaultValue)
|
||||
{
|
||||
QObject::setObjectName(name);
|
||||
}
|
||||
|
||||
/// updateItem overloads for updating setting value
|
||||
/// provided a list of values (multi-valued),
|
||||
/// a specific value
|
||||
/// or an index value corresponding to the mValueList
|
||||
bool updateItem (const QStringList *values);
|
||||
bool updateItem (const QString &value);
|
||||
bool updateItem (int valueListIndex);
|
||||
|
||||
/// retrieve list of valid values for setting
|
||||
inline QStringList *getValueList() { return mValueList; }
|
||||
|
||||
/// write list of valid values for setting
|
||||
inline void setValueList (QStringList *valueList) { mValueList = valueList; }
|
||||
|
||||
/// valuePair used for spin boxes (max / min)
|
||||
inline QStringPair *getValuePair() { return mValuePair; }
|
||||
|
||||
/// set value range (spinbox / integer use)
|
||||
inline void setValuePair (QStringPair valuePair)
|
||||
{
|
||||
delete mValuePair;
|
||||
mValuePair = new QStringPair(valuePair);
|
||||
}
|
||||
|
||||
inline bool isMultivalue () { return mIsMultiValue; }
|
||||
|
||||
void setDefaultValue (const QString &value);
|
||||
QString getDefaultValue () const;
|
||||
|
||||
private:
|
||||
|
||||
/// Verifies that the supplied value is one of the following:
|
||||
/// 1. Within the limits of the value pair (min / max)
|
||||
/// 2. One of the values indicated in the value list
|
||||
bool validate (const QString &value);
|
||||
};
|
||||
}
|
||||
#endif // SETTINGSITEM_HPP
|
||||
|
@ -1,112 +0,0 @@
|
||||
#include "abstractblock.hpp"
|
||||
|
||||
CSVSettings::AbstractBlock::AbstractBlock(QWidget* parent)
|
||||
: QObject (parent), mBox ( new GroupBox (parent) ), mWidgetParent (parent)
|
||||
{}
|
||||
|
||||
CSVSettings::AbstractBlock::AbstractBlock(bool isVisible, QWidget* parent)
|
||||
: QObject (parent), mBox ( new GroupBox (isVisible, parent)), mWidgetParent (parent)
|
||||
{}
|
||||
|
||||
QLayout *CSVSettings::AbstractBlock::createLayout (Orientation direction,
|
||||
bool isZeroMargin, QWidget* parent)
|
||||
{
|
||||
QLayout *layout = 0;
|
||||
|
||||
if (direction == Orient_Vertical)
|
||||
layout = new QVBoxLayout (parent);
|
||||
else
|
||||
layout = new QHBoxLayout (parent);
|
||||
|
||||
if (isZeroMargin)
|
||||
layout->setContentsMargins(0, 0, 0, 0);
|
||||
|
||||
return layout;
|
||||
}
|
||||
|
||||
QGroupBox *CSVSettings::AbstractBlock::getGroupBox()
|
||||
{
|
||||
return mBox;
|
||||
}
|
||||
|
||||
CSVSettings::AbstractWidget *CSVSettings::AbstractBlock::buildWidget (const QString& widgetName, WidgetDef &def,
|
||||
QLayout *layout, bool isConnected) const
|
||||
{
|
||||
AbstractWidget *widg = 0;
|
||||
|
||||
switch (def.type)
|
||||
{
|
||||
|
||||
case Widget_RadioButton:
|
||||
widg = new SettingWidget<QRadioButton> (def, layout, mBox);
|
||||
break;
|
||||
|
||||
case Widget_SpinBox:
|
||||
widg = new SettingWidget<QSpinBox> (def, layout, mBox);
|
||||
break;
|
||||
|
||||
case Widget_CheckBox:
|
||||
widg = new SettingWidget<QCheckBox> (def, layout, mBox);
|
||||
break;
|
||||
|
||||
case Widget_LineEdit:
|
||||
widg = new SettingWidget<QLineEdit> (def, layout, mBox);
|
||||
break;
|
||||
|
||||
case Widget_ListBox:
|
||||
widg = new SettingWidget<QListWidget> (def, layout, mBox);
|
||||
break;
|
||||
|
||||
case Widget_ComboBox:
|
||||
widg = new SettingWidget<QComboBox> (def, layout, mBox);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
};
|
||||
|
||||
if (!mBox->layout())
|
||||
mBox->setLayout(widg->getLayout());
|
||||
|
||||
widg->widget()->setObjectName(widgetName);
|
||||
|
||||
if (isConnected)
|
||||
connect (widg, SIGNAL (signalUpdateItem (const QString &)), this, SLOT (slotUpdate (const QString &)));
|
||||
connect (this, SIGNAL (signalUpdateWidget (const QString &)), widg, SLOT (slotUpdateWidget (const QString &) ));
|
||||
|
||||
return widg;
|
||||
}
|
||||
|
||||
void CSVSettings::AbstractBlock::setVisible (bool isVisible)
|
||||
{
|
||||
mBox->setBorderVisibility (isVisible);
|
||||
}
|
||||
|
||||
bool CSVSettings::AbstractBlock::isVisible () const
|
||||
{
|
||||
return mBox->borderVisibile();
|
||||
}
|
||||
|
||||
QWidget *CSVSettings::AbstractBlock::getParent() const
|
||||
{
|
||||
return mWidgetParent;
|
||||
}
|
||||
|
||||
void CSVSettings::AbstractBlock::slotUpdate (const QString &value)
|
||||
{
|
||||
slotUpdateSetting (objectName(), value);
|
||||
}
|
||||
|
||||
void CSVSettings::AbstractBlock::slotSetEnabled(bool value)
|
||||
{
|
||||
mBox->setEnabled(value);
|
||||
}
|
||||
|
||||
void CSVSettings::AbstractBlock::slotUpdateSetting (const QString &settingName, const QString &settingValue)
|
||||
{
|
||||
bool doEmit = true;
|
||||
updateBySignal (settingName, settingValue, doEmit);
|
||||
|
||||
if (doEmit)
|
||||
emit signalUpdateSetting (settingName, settingValue);
|
||||
}
|
@ -1,82 +0,0 @@
|
||||
#ifndef ABSTRACTBLOCK_HPP
|
||||
#define ABSTRACTBLOCK_HPP
|
||||
|
||||
#include <QObject>
|
||||
#include <QList>
|
||||
|
||||
#include "settingwidget.hpp"
|
||||
#include "../../model/settings/settingsitem.hpp"
|
||||
#include "groupbox.hpp"
|
||||
|
||||
namespace CSVSettings
|
||||
{
|
||||
|
||||
/// Abstract base class for all blocks
|
||||
class AbstractBlock : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
protected:
|
||||
|
||||
typedef QMap<QString, CSMSettings::SettingsItem*> SettingsItemMap;
|
||||
GroupBox *mBox;
|
||||
QWidget *mWidgetParent;
|
||||
|
||||
public:
|
||||
|
||||
explicit AbstractBlock (QWidget *parent = 0);
|
||||
explicit AbstractBlock (bool isVisible, QWidget *parent = 0);
|
||||
|
||||
QGroupBox *getGroupBox();
|
||||
void setVisible (bool isVisible);
|
||||
bool isVisible() const;
|
||||
|
||||
virtual CSMSettings::SettingList *getSettings() = 0;
|
||||
|
||||
/// update settings found in the passed map and are encapsulated by the block
|
||||
virtual bool updateSettings (const CSMSettings::SettingMap &settings) = 0;
|
||||
|
||||
/// update callback function called from update slot
|
||||
/// used for updating application-level settings in the editor
|
||||
virtual bool updateBySignal (const QString &name, const QString &value, bool &doEmit)
|
||||
{ return false; }
|
||||
|
||||
protected:
|
||||
|
||||
/// Creates the layout for the block's QGroupBox
|
||||
QLayout *createLayout (Orientation direction, bool isZeroMargin, QWidget* parent = 0);
|
||||
|
||||
/// Creates widgets that exist as direct children of the block
|
||||
AbstractWidget *buildWidget (const QString &widgetName, WidgetDef &wDef,
|
||||
QLayout *layout = 0, bool isConnected = true) const;
|
||||
|
||||
QWidget *getParent() const;
|
||||
|
||||
public slots:
|
||||
|
||||
/// enables / disables block-level widgets based on signals from other widgets
|
||||
/// used in ToggleBlock
|
||||
void slotSetEnabled (bool value);
|
||||
|
||||
/// receives updates to applicaion-level settings in the Editor
|
||||
void slotUpdateSetting (const QString &settingName, const QString &settingValue);
|
||||
|
||||
private slots:
|
||||
|
||||
/// receives updates to a setting in the block pushed from the application level
|
||||
void slotUpdate (const QString &value);
|
||||
|
||||
signals:
|
||||
|
||||
/// signal to UserSettings instance
|
||||
void signalUpdateSetting (const QString &propertyName, const QString &propertyValue);
|
||||
|
||||
/// signal to widget for updating widget value
|
||||
void signalUpdateWidget (const QString & value);
|
||||
|
||||
/// ProxyBlock use only.
|
||||
/// Name and value correspond to settings for which the block is a proxy.
|
||||
void signalUpdateProxySetting (const QString &propertyName, const QString &propertyValue);
|
||||
};
|
||||
}
|
||||
#endif // ABSTRACTBLOCK_HPP
|
@ -1,44 +0,0 @@
|
||||
#include "abstractpage.hpp"
|
||||
|
||||
#include <QGroupBox>
|
||||
#include <QLabel>
|
||||
#include <QVBoxLayout>
|
||||
#include <QRadioButton>
|
||||
#include <QCheckBox>
|
||||
#include <QSpinBox>
|
||||
#include <QComboBox>
|
||||
#include <QLineEdit>
|
||||
#include <QMargins>
|
||||
|
||||
CSVSettings::AbstractPage::AbstractPage(QWidget *parent):
|
||||
QWidget(parent)
|
||||
{
|
||||
QGridLayout *pageLayout = new QGridLayout(this);
|
||||
setLayout (pageLayout);
|
||||
}
|
||||
|
||||
CSVSettings::AbstractPage::AbstractPage(const QString &pageName, QWidget *parent):
|
||||
QWidget(parent)
|
||||
{
|
||||
QWidget::setObjectName (pageName);
|
||||
|
||||
QGridLayout *pageLayout = new QGridLayout(this);
|
||||
setLayout (pageLayout);
|
||||
}
|
||||
|
||||
CSVSettings::AbstractPage::~AbstractPage()
|
||||
{
|
||||
}
|
||||
|
||||
CSMSettings::SettingList *CSVSettings::AbstractPage::getSettings()
|
||||
{
|
||||
CSMSettings::SettingList *settings = new CSMSettings::SettingList();
|
||||
|
||||
foreach (AbstractBlock *block, mAbstractBlocks)
|
||||
{
|
||||
CSMSettings::SettingList *groupSettings = block->getSettings();
|
||||
settings->append (*groupSettings);
|
||||
}
|
||||
|
||||
return settings;
|
||||
}
|
@ -1,70 +0,0 @@
|
||||
#ifndef ABSTRACTPAGE_HPP
|
||||
#define ABSTRACTPAGE_HPP
|
||||
|
||||
#include <QWidget>
|
||||
#include <QList>
|
||||
#include <QLayout>
|
||||
|
||||
#include "abstractblock.hpp"
|
||||
|
||||
class SettingMap;
|
||||
class SettingList;
|
||||
|
||||
namespace CSVSettings {
|
||||
|
||||
typedef QList<AbstractBlock *> AbstractBlockList;
|
||||
|
||||
/// Abstract base class for all setting pages in the dialog
|
||||
|
||||
/// \todo Scripted implementation of settings should eliminate the need
|
||||
/// \todo derive page classes.
|
||||
/// \todo AbstractPage should be replaced with a general page construction class.
|
||||
class AbstractPage: public QWidget
|
||||
{
|
||||
|
||||
protected:
|
||||
|
||||
AbstractBlockList mAbstractBlocks;
|
||||
|
||||
public:
|
||||
|
||||
AbstractPage(QWidget *parent = 0);
|
||||
AbstractPage (const QString &pageName, QWidget* parent = 0);
|
||||
|
||||
~AbstractPage();
|
||||
|
||||
virtual void setupUi() = 0;
|
||||
|
||||
/// triggers widgiet initialization at the page level. All widgets updated to
|
||||
/// current setting values
|
||||
virtual void initializeWidgets (const CSMSettings::SettingMap &settings) = 0;
|
||||
|
||||
/// retrieve the list of settings local to the page.
|
||||
CSMSettings::SettingList *getSettings();
|
||||
|
||||
void setObjectName();
|
||||
|
||||
protected:
|
||||
|
||||
/// Create a block for the page.
|
||||
/// Block is constructed using passed definition struct
|
||||
/// Page level-layout is created and assigned
|
||||
template <typename S, typename T>
|
||||
AbstractBlock *buildBlock (T *def)
|
||||
{
|
||||
S *block = new S (this);
|
||||
int ret = block->build (def);
|
||||
|
||||
if (ret < 0)
|
||||
return 0;
|
||||
|
||||
QGroupBox *box = block->getGroupBox();
|
||||
QWidget::layout()->addWidget (box);
|
||||
|
||||
return block;
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
#endif // ABSTRACTPAGE_HPP
|
@ -1,78 +0,0 @@
|
||||
#include "abstractwidget.hpp"
|
||||
|
||||
#include <QLayout>
|
||||
#include <QLabel>
|
||||
|
||||
void CSVSettings::AbstractWidget::build(QWidget *widget, WidgetDef &def, bool noLabel)
|
||||
{
|
||||
if (!mLayout)
|
||||
createLayout(def.orientation, true);
|
||||
|
||||
buildLabelAndWidget (widget, def, noLabel);
|
||||
|
||||
}
|
||||
|
||||
void CSVSettings::AbstractWidget::buildLabelAndWidget (QWidget *widget, WidgetDef &def, bool noLabel)
|
||||
{
|
||||
if (def.widgetWidth > -1)
|
||||
widget->setFixedWidth (def.widgetWidth);
|
||||
|
||||
if (!(def.caption.isEmpty() || noLabel) )
|
||||
{
|
||||
QLabel *label = new QLabel (def.caption, &dynamic_cast<QWidget &>( *parent()));
|
||||
label->setBuddy (widget);
|
||||
mLayout->addWidget (label);
|
||||
|
||||
if (def.labelWidth > -1)
|
||||
label->setFixedWidth(def.labelWidth);
|
||||
}
|
||||
|
||||
mLayout->addWidget (widget);
|
||||
mLayout->setAlignment (widget, getAlignment (def.widgetAlignment));
|
||||
}
|
||||
|
||||
void CSVSettings::AbstractWidget::createLayout
|
||||
(Orientation direction, bool isZeroMargin)
|
||||
{
|
||||
if (direction == Orient_Vertical)
|
||||
mLayout = new QVBoxLayout ();
|
||||
else
|
||||
mLayout = new QHBoxLayout ();
|
||||
|
||||
if (isZeroMargin)
|
||||
mLayout->setContentsMargins(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
QFlags<Qt::AlignmentFlag> CSVSettings::AbstractWidget::getAlignment (CSVSettings::Alignment flag)
|
||||
{
|
||||
return QFlags<Qt::AlignmentFlag>(static_cast<int>(flag));
|
||||
}
|
||||
|
||||
QLayout *CSVSettings::AbstractWidget::getLayout()
|
||||
{
|
||||
return mLayout;
|
||||
}
|
||||
|
||||
void CSVSettings::AbstractWidget::slotUpdateWidget (const QString &value)
|
||||
{
|
||||
updateWidget (value);
|
||||
}
|
||||
|
||||
void CSVSettings::AbstractWidget::slotUpdateItem(const QString &value)
|
||||
{
|
||||
emit signalUpdateItem (value);
|
||||
}
|
||||
|
||||
void CSVSettings::AbstractWidget::slotUpdateItem(bool value)
|
||||
{
|
||||
if (value)
|
||||
emit signalUpdateItem (widget()->objectName());
|
||||
}
|
||||
|
||||
void CSVSettings::AbstractWidget::slotUpdateItem(int value)
|
||||
{
|
||||
emit signalUpdateItem (QString::number(value));
|
||||
}
|
||||
|
||||
void CSVSettings::AbstractWidget::slotUpdateItem (QListWidgetItem* current, QListWidgetItem* previous)
|
||||
{}
|
@ -1,69 +0,0 @@
|
||||
#ifndef ABSTRACTWIDGET_HPP
|
||||
#define ABSTRACTWIDGET_HPP
|
||||
|
||||
#include <QWidget>
|
||||
#include "support.hpp"
|
||||
|
||||
class QLayout;
|
||||
|
||||
namespace CSVSettings
|
||||
{
|
||||
/// Abstract base class for widgets which are used in user preferences dialog
|
||||
class AbstractWidget : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
QLayout *mLayout;
|
||||
|
||||
public:
|
||||
|
||||
/// Passed layout is assigned the constructed widget.
|
||||
/// if no layout is passed, one is created.
|
||||
explicit AbstractWidget (QLayout *layout = 0, QWidget* parent = 0)
|
||||
: QObject (parent), mLayout (layout)
|
||||
{}
|
||||
|
||||
/// retrieve layout for insertion into itemblock
|
||||
QLayout *getLayout();
|
||||
|
||||
/// create the derived widget instance
|
||||
void build (QWidget* widget, WidgetDef &def, bool noLabel = false);
|
||||
|
||||
/// reference to the derived widget instance
|
||||
virtual QWidget *widget() = 0;
|
||||
|
||||
protected:
|
||||
|
||||
/// Callback called by receiving slot for widget udpates
|
||||
virtual void updateWidget (const QString &value) = 0;
|
||||
|
||||
/// Converts user-defined enum to Qt equivalents
|
||||
QFlags<Qt::AlignmentFlag> getAlignment (Alignment flag);
|
||||
|
||||
private:
|
||||
|
||||
/// Creates layout and assigns label and widget as appropriate
|
||||
void createLayout (Orientation direction, bool isZeroMargin);
|
||||
|
||||
/// Creates label and widget according to passed definition
|
||||
void buildLabelAndWidget (QWidget *widget, WidgetDef &def, bool noLabel);
|
||||
|
||||
|
||||
signals:
|
||||
|
||||
/// outbound update signal
|
||||
void signalUpdateItem (const QString &value);
|
||||
|
||||
public slots:
|
||||
|
||||
/// receives inbound updates
|
||||
void slotUpdateWidget (const QString &value);
|
||||
|
||||
/// Overloads for outbound updates from derived widget signal
|
||||
void slotUpdateItem (const QString &value);
|
||||
void slotUpdateItem (bool value);
|
||||
void slotUpdateItem (int value);
|
||||
void slotUpdateItem (QListWidgetItem* current, QListWidgetItem* previous);
|
||||
};
|
||||
}
|
||||
#endif // ABSTRACTWIDGET_HPP
|
@ -1,50 +0,0 @@
|
||||
#include "blankpage.hpp"
|
||||
|
||||
#include <QList>
|
||||
#include <QListView>
|
||||
#include <QGroupBox>
|
||||
#include <QRadioButton>
|
||||
#include <QDockWidget>
|
||||
#include <QVBoxLayout>
|
||||
#include <QGridLayout>
|
||||
#include <QStyle>
|
||||
|
||||
#ifdef Q_OS_MAC
|
||||
#include <QPlastiqueStyle>
|
||||
#endif
|
||||
|
||||
#include "../../model/settings/usersettings.hpp"
|
||||
#include "groupblock.hpp"
|
||||
#include "toggleblock.hpp"
|
||||
|
||||
CSVSettings::BlankPage::BlankPage(QWidget *parent):
|
||||
AbstractPage("Blank", parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
CSVSettings::BlankPage::BlankPage(const QString &title, QWidget *parent):
|
||||
AbstractPage(title, parent)
|
||||
{
|
||||
// Hacks to get the stylesheet look properly
|
||||
#ifdef Q_OS_MAC
|
||||
QPlastiqueStyle *style = new QPlastiqueStyle;
|
||||
//profilesComboBox->setStyle(style);
|
||||
#endif
|
||||
|
||||
setupUi();
|
||||
}
|
||||
|
||||
void CSVSettings::BlankPage::setupUi()
|
||||
{
|
||||
QGroupBox *pageBox = new QGroupBox(this);
|
||||
layout()->addWidget(pageBox);
|
||||
}
|
||||
|
||||
void CSVSettings::BlankPage::initializeWidgets (const CSMSettings::SettingMap &settings)
|
||||
{
|
||||
//iterate each item in each blocks in this section
|
||||
//validate the corresponding setting against the defined valuelist if any.
|
||||
foreach (AbstractBlock *block, mAbstractBlocks)
|
||||
block->updateSettings (settings);
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
#ifndef BLANKPAGE_HPP
|
||||
#define BLANKPAGE_HPP
|
||||
|
||||
#include "abstractpage.hpp"
|
||||
|
||||
class QGroupBox;
|
||||
|
||||
namespace CSVSettings {
|
||||
|
||||
class UserSettings;
|
||||
class AbstractBlock;
|
||||
|
||||
/// Derived page with no widgets
|
||||
/// Reference use only.
|
||||
class BlankPage : public AbstractPage
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
BlankPage (QWidget *parent = 0);
|
||||
BlankPage (const QString &title, QWidget *parent);
|
||||
|
||||
void setupUi();
|
||||
void initializeWidgets (const CSMSettings::SettingMap &settings);
|
||||
};
|
||||
}
|
||||
|
||||
#endif // BLANKPAGE_HPP
|
@ -1,121 +0,0 @@
|
||||
#include "customblock.hpp"
|
||||
#include "groupblock.hpp"
|
||||
#include "itemblock.hpp"
|
||||
#include "proxyblock.hpp"
|
||||
|
||||
CSVSettings::CustomBlock::CustomBlock (QWidget *parent) : AbstractBlock (parent)
|
||||
{
|
||||
}
|
||||
|
||||
int CSVSettings::CustomBlock::build(GroupBlockDefList &defList, GroupBlockDefList::iterator *it)
|
||||
{
|
||||
int retVal = 0;
|
||||
|
||||
GroupBlockDefList::iterator defaultIt;
|
||||
GroupBlockDefList::iterator listIt = defList.begin();
|
||||
GroupBlockDefList::iterator proxyIt = defaultIt;
|
||||
|
||||
if (it)
|
||||
listIt = *it;
|
||||
|
||||
ProxyBlock *proxyBlock = new ProxyBlock(getParent());
|
||||
|
||||
for (; listIt != defList.end(); ++listIt)
|
||||
{
|
||||
if (!(*listIt)->isProxy)
|
||||
retVal = buildGroupBlock (*listIt);
|
||||
else
|
||||
{
|
||||
mGroupList << proxyBlock;
|
||||
proxyIt = listIt;
|
||||
}
|
||||
}
|
||||
|
||||
if (proxyIt != defaultIt)
|
||||
retVal = buildProxyBlock (*proxyIt, proxyBlock);
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
CSVSettings::GroupBox *CSVSettings::CustomBlock::buildGroupBox (Orientation orientation)
|
||||
{
|
||||
GroupBox *box = new GroupBox (false, mBox);
|
||||
createLayout (orientation, true, box);
|
||||
|
||||
return box;
|
||||
}
|
||||
|
||||
int CSVSettings::CustomBlock::buildGroupBlock(GroupBlockDef *def)
|
||||
{
|
||||
GroupBlock *block = new GroupBlock (getParent());
|
||||
|
||||
mGroupList << block;
|
||||
|
||||
connect (block, SIGNAL (signalUpdateSetting(const QString &, const QString &)),
|
||||
this, SLOT (slotUpdateSetting (const QString &, const QString &)));
|
||||
|
||||
return block->build(def);
|
||||
}
|
||||
|
||||
int CSVSettings::CustomBlock::buildProxyBlock(GroupBlockDef *def, ProxyBlock *block)
|
||||
{
|
||||
if (def->settingItems.size() != 1)
|
||||
return -1;
|
||||
|
||||
int retVal = block->build(def);
|
||||
|
||||
if (retVal != 0)
|
||||
return retVal;
|
||||
|
||||
// The first settingItem is the proxy setting, containing the list of settings bound to it.
|
||||
foreach (QStringList *list, *(def->settingItems.at(0)->proxyList))
|
||||
{
|
||||
QString proxiedBlockName = list->at(0);
|
||||
|
||||
//iterate each group in the custom block, matching it to each proxied setting
|
||||
//and connecting it appropriately
|
||||
foreach (GroupBlock *groupBlock, mGroupList)
|
||||
{
|
||||
ItemBlock *proxiedBlock = groupBlock->getItemBlock (proxiedBlockName);
|
||||
|
||||
if (proxiedBlock)
|
||||
{
|
||||
block->addSetting(proxiedBlock, list);
|
||||
|
||||
//connect the proxy block's update signal to the custom block's slot
|
||||
connect (block, SIGNAL (signalUpdateSetting (const QString &, const QString &)),
|
||||
this, SLOT (slotUpdateSetting (const QString &, const QString &)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
CSMSettings::SettingList *CSVSettings::CustomBlock::getSettings()
|
||||
{
|
||||
CSMSettings::SettingList *settings = new CSMSettings::SettingList();
|
||||
|
||||
foreach (GroupBlock *block, mGroupList)
|
||||
{
|
||||
CSMSettings::SettingList *groupSettings = block->getSettings();
|
||||
|
||||
if (groupSettings)
|
||||
settings->append(*groupSettings);
|
||||
}
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
||||
bool CSVSettings::CustomBlock::updateSettings (const CSMSettings::SettingMap &settings)
|
||||
{
|
||||
bool success = true;
|
||||
|
||||
foreach (GroupBlock *block, mGroupList)
|
||||
{
|
||||
bool success2 = block->updateSettings (settings);
|
||||
success = success && success2;
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
@ -1,47 +0,0 @@
|
||||
#ifndef CUSTOMBLOCK_HPP
|
||||
#define CUSTOMBLOCK_HPP
|
||||
|
||||
#include "abstractblock.hpp"
|
||||
|
||||
namespace CSVSettings
|
||||
{
|
||||
|
||||
class ProxyBlock;
|
||||
|
||||
/// Base class for customized user preference setting blocks
|
||||
/// Special block classes should be derived from CustomBlock
|
||||
class CustomBlock : public AbstractBlock
|
||||
{
|
||||
|
||||
protected:
|
||||
|
||||
GroupBlockList mGroupList;
|
||||
|
||||
public:
|
||||
|
||||
explicit CustomBlock (QWidget *parent = 0);
|
||||
|
||||
/// Update settings local to the block
|
||||
bool updateSettings (const CSMSettings::SettingMap &settings);
|
||||
|
||||
/// Retrieve settings local to the block
|
||||
CSMSettings::SettingList *getSettings();
|
||||
|
||||
/// construct the block using the passed definition
|
||||
int build (GroupBlockDefList &defList, GroupBlockDefList::Iterator *it = 0);
|
||||
|
||||
protected:
|
||||
|
||||
/// construct the block groupbox
|
||||
GroupBox *buildGroupBox (Orientation orientation);
|
||||
|
||||
private:
|
||||
|
||||
/// Construction function for creating a standard GroupBlock child
|
||||
int buildGroupBlock(GroupBlockDef *def);
|
||||
|
||||
/// Construction function for creating a standard ProxyBlock child
|
||||
int buildProxyBlock(GroupBlockDef *def, ProxyBlock *block);
|
||||
};
|
||||
}
|
||||
#endif // CUSTOMBLOCK_HPP
|
@ -1,57 +0,0 @@
|
||||
#include "datadisplayformatpage.hpp"
|
||||
#include "groupblock.hpp"
|
||||
#include "../../model/settings/usersettings.hpp"
|
||||
|
||||
CSVSettings::DataDisplayFormatPage::DataDisplayFormatPage(QWidget* parent) :
|
||||
AbstractPage("Display Format", parent)
|
||||
{
|
||||
setupUi();
|
||||
}
|
||||
|
||||
CSVSettings::GroupBlockDef *CSVSettings::DataDisplayFormatPage::setupDataDisplay( const QString &title)
|
||||
{
|
||||
GroupBlockDef *statusBlock = new GroupBlockDef(QString(title));
|
||||
|
||||
SettingsItemDef *statusItem = new SettingsItemDef (statusBlock->title, "Icon Only");
|
||||
*(statusItem->valueList) << QString("Icon and Text") << QString("Icon Only") << QString("Text Only");
|
||||
|
||||
WidgetDef statusWidget (Widget_RadioButton);
|
||||
statusWidget.valueList = statusItem->valueList;
|
||||
|
||||
statusItem->widget = statusWidget;
|
||||
|
||||
statusBlock->settingItems << statusItem;
|
||||
|
||||
statusBlock->isZeroMargin = false;
|
||||
|
||||
return statusBlock;
|
||||
}
|
||||
|
||||
|
||||
void CSVSettings::DataDisplayFormatPage::setupUi()
|
||||
{
|
||||
|
||||
mAbstractBlocks << buildBlock<GroupBlock> (setupDataDisplay ("Record Status Display"));
|
||||
mAbstractBlocks << buildBlock<GroupBlock> (setupDataDisplay ("Referenceable ID Type Display"));
|
||||
|
||||
foreach (AbstractBlock *block, mAbstractBlocks)
|
||||
{
|
||||
connect (block, SIGNAL (signalUpdateSetting (const QString &, const QString &)),
|
||||
this, SIGNAL (signalUpdateEditorSetting (const QString &, const QString &)) );
|
||||
}
|
||||
|
||||
connect ( this,
|
||||
SIGNAL ( signalUpdateEditorSetting (const QString &, const QString &)),
|
||||
&(CSMSettings::UserSettings::instance()),
|
||||
SIGNAL ( signalUpdateEditorSetting (const QString &, const QString &)));
|
||||
|
||||
}
|
||||
|
||||
void CSVSettings::DataDisplayFormatPage::initializeWidgets (const CSMSettings::SettingMap &settings)
|
||||
{
|
||||
//iterate each item in each blocks in this section
|
||||
//validate the corresponding setting against the defined valuelist if any.
|
||||
for (AbstractBlockList::Iterator it_block = mAbstractBlocks.begin();
|
||||
it_block != mAbstractBlocks.end(); ++it_block)
|
||||
(*it_block)->updateSettings (settings);
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
#ifndef EDITORPAGE_HPP
|
||||
#define EDITORPAGE_HPP
|
||||
|
||||
#include "support.hpp"
|
||||
#include "abstractpage.hpp"
|
||||
|
||||
namespace CSVSettings
|
||||
{
|
||||
class DataDisplayFormatPage : public AbstractPage
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit DataDisplayFormatPage(QWidget *parent = 0);
|
||||
|
||||
void initializeWidgets (const CSMSettings::SettingMap &settings);
|
||||
void setupUi();
|
||||
|
||||
private:
|
||||
|
||||
/// User preference view of the record status delegate's icon / text setting
|
||||
GroupBlockDef *setupDataDisplay(const QString &);
|
||||
|
||||
signals:
|
||||
|
||||
/// Signals up for changes to editor application-level settings
|
||||
void signalUpdateEditorSetting (const QString &settingName, const QString &settingValue);
|
||||
|
||||
public slots:
|
||||
};
|
||||
}
|
||||
|
||||
#endif // EDITORPAGE_HPP
|
@ -1,53 +0,0 @@
|
||||
#include "editorpage.hpp"
|
||||
#include "groupblock.hpp"
|
||||
#include "../../model/settings/usersettings.hpp"
|
||||
|
||||
CSVSettings::EditorPage::EditorPage(QWidget* parent) :
|
||||
AbstractPage("Display Format", parent)
|
||||
{
|
||||
setupUi();
|
||||
}
|
||||
|
||||
CSVSettings::GroupBlockDef *CSVSettings::EditorPage::setupRecordStatusDisplay()
|
||||
{
|
||||
GroupBlockDef *statusBlock = new GroupBlockDef(QString("Record Status Display"));
|
||||
|
||||
SettingsItemDef *statusItem = new SettingsItemDef (statusBlock->title, "Icon and Text");
|
||||
*(statusItem->valueList) << QString("Icon and Text") << QString("Icon Only") << QString("Text Only");
|
||||
|
||||
WidgetDef statusWidget (Widget_RadioButton);
|
||||
statusWidget.valueList = statusItem->valueList;
|
||||
|
||||
statusItem->widget = statusWidget;
|
||||
|
||||
statusBlock->settingItems << statusItem;
|
||||
|
||||
return statusBlock;
|
||||
}
|
||||
|
||||
void CSVSettings::EditorPage::setupUi()
|
||||
{
|
||||
|
||||
mAbstractBlocks << buildBlock<GroupBlock>(setupRecordStatusDisplay());
|
||||
|
||||
foreach (AbstractBlock *block, mAbstractBlocks)
|
||||
{
|
||||
connect (block, SIGNAL (signalUpdateSetting (const QString &, const QString &)),
|
||||
this, SIGNAL (signalUpdateEditorSetting (const QString &, const QString &)) );
|
||||
}
|
||||
|
||||
connect ( this,
|
||||
SIGNAL ( signalUpdateEditorSetting (const QString &, const QString &)),
|
||||
&(CSMSettings::UserSettings::instance()),
|
||||
SIGNAL ( signalUpdateEditorSetting (const QString &, const QString &)));
|
||||
|
||||
}
|
||||
|
||||
void CSVSettings::EditorPage::initializeWidgets (const CSMSettings::SettingMap &settings)
|
||||
{
|
||||
//iterate each item in each blocks in this section
|
||||
//validate the corresponding setting against the defined valuelist if any.
|
||||
for (AbstractBlockList::Iterator it_block = mAbstractBlocks.begin();
|
||||
it_block != mAbstractBlocks.end(); ++it_block)
|
||||
(*it_block)->updateSettings (settings);
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
#ifndef EDITORPAGE_HPP
|
||||
#define EDITORPAGE_HPP
|
||||
|
||||
#include "support.hpp"
|
||||
#include "abstractpage.hpp"
|
||||
|
||||
namespace CSVSettings
|
||||
{
|
||||
class EditorPage : public AbstractPage
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit EditorPage(QWidget *parent = 0);
|
||||
|
||||
void initializeWidgets (const CSMSettings::SettingMap &settings);
|
||||
void setupUi();
|
||||
|
||||
private:
|
||||
|
||||
/// User preference view of the record status delegate's icon / text setting
|
||||
GroupBlockDef *setupRecordStatusDisplay();
|
||||
|
||||
signals:
|
||||
|
||||
/// Signals up for changes to editor application-level settings
|
||||
void signalUpdateEditorSetting (const QString &settingName, const QString &settingValue);
|
||||
|
||||
public slots:
|
||||
};
|
||||
}
|
||||
|
||||
#endif // EDITORPAGE_HPP
|
@ -1,108 +0,0 @@
|
||||
#include "groupblock.hpp"
|
||||
#include "itemblock.hpp"
|
||||
|
||||
CSVSettings::GroupBlock::GroupBlock (QWidget* parent)
|
||||
: AbstractBlock (parent)
|
||||
{}
|
||||
|
||||
CSVSettings::GroupBlock::GroupBlock (bool isVisible, QWidget *parent)
|
||||
: AbstractBlock (isVisible, parent)
|
||||
{}
|
||||
|
||||
int CSVSettings::GroupBlock::build (GroupBlockDef *def)
|
||||
{
|
||||
|
||||
if (def->settingItems.size() == 0)
|
||||
return -1;
|
||||
|
||||
int retVal = 0;
|
||||
|
||||
setVisible (def->isVisible);
|
||||
|
||||
mBox->setLayout(createLayout (def->widgetOrientation, def->isZeroMargin));
|
||||
|
||||
setObjectName (def->title);
|
||||
mBox->setTitle (def->title);
|
||||
|
||||
foreach (SettingsItemDef *itemDef, def->settingItems)
|
||||
{
|
||||
ItemBlock *block = new ItemBlock (mBox);
|
||||
|
||||
if (block->build (*itemDef) < 0)
|
||||
{
|
||||
retVal = -2;
|
||||
break;
|
||||
}
|
||||
|
||||
mItemBlockList << block;
|
||||
mBox->layout()->addWidget (block->getGroupBox());
|
||||
|
||||
connect (block, SIGNAL (signalUpdateSetting (const QString &, const QString &)),
|
||||
this, SLOT (slotUpdateSetting (const QString &, const QString &) ));
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
CSMSettings::SettingList *CSVSettings::GroupBlock::getSettings()
|
||||
{
|
||||
CSMSettings::SettingList *settings = 0;
|
||||
|
||||
foreach (ItemBlock *block, mItemBlockList)
|
||||
{
|
||||
if (!settings)
|
||||
settings = new CSMSettings::SettingList();
|
||||
|
||||
settings->append(*(block->getSettings ()));
|
||||
}
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
||||
CSVSettings::ItemBlock *CSVSettings::GroupBlock::getItemBlock (const QString &name, ItemBlockList *blockList)
|
||||
{
|
||||
ItemBlock *retBlock = 0;
|
||||
|
||||
if (!blockList)
|
||||
blockList = &mItemBlockList;
|
||||
|
||||
foreach (ItemBlock *block, *blockList)
|
||||
{
|
||||
if (block->objectName() == name)
|
||||
{
|
||||
retBlock = block;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return retBlock;
|
||||
}
|
||||
|
||||
CSVSettings::ItemBlock *CSVSettings::GroupBlock::getItemBlock (int index)
|
||||
{
|
||||
ItemBlock *retBlock = 0;
|
||||
|
||||
if (mItemBlockList.size() > index)
|
||||
retBlock = mItemBlockList.at(index);
|
||||
|
||||
return retBlock;
|
||||
}
|
||||
|
||||
bool CSVSettings::GroupBlock::updateSettings (const CSMSettings::SettingMap &settings)
|
||||
{
|
||||
bool success = true;
|
||||
|
||||
//update all non-proxy settings
|
||||
foreach (ItemBlock *block, mItemBlockList)
|
||||
{
|
||||
CSMSettings::SettingContainer *setting = settings[block->objectName()];
|
||||
|
||||
if (setting)
|
||||
{
|
||||
bool success2 = block->update (setting->getValue());
|
||||
success = success && success2;
|
||||
}
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
@ -1,43 +0,0 @@
|
||||
#ifndef GROUPBLOCK_HPP
|
||||
#define GROUPBLOCK_HPP
|
||||
|
||||
#include <QList>
|
||||
#include "abstractblock.hpp"
|
||||
|
||||
namespace CSVSettings
|
||||
{
|
||||
class ItemBlock;
|
||||
|
||||
/// Base class for group blocks.
|
||||
/// Derived block classes should use CustomBlock
|
||||
class GroupBlock : public AbstractBlock
|
||||
{
|
||||
ItemBlockList mItemBlockList;
|
||||
|
||||
public:
|
||||
GroupBlock (QWidget* parent = 0);
|
||||
GroupBlock (bool isVisible, QWidget *parent = 0);
|
||||
|
||||
/// build the gorup block based on passed definition
|
||||
int build (GroupBlockDef *def);
|
||||
|
||||
/// update settings local to the group block
|
||||
bool updateSettings (const CSMSettings::SettingMap &settings);
|
||||
|
||||
/// retrieve setting list local to the group block
|
||||
CSMSettings::SettingList *getSettings();
|
||||
|
||||
/// retrieve item block by name from the passed list or local list
|
||||
ItemBlock *getItemBlock (const QString &name, ItemBlockList *blockList = 0);
|
||||
|
||||
/// retrieve the item block by index from the local list
|
||||
ItemBlock *getItemBlock (int index);
|
||||
|
||||
protected:
|
||||
|
||||
/// create block layout based on passed definition
|
||||
int buildLayout (GroupBlockDef &def);
|
||||
|
||||
};
|
||||
}
|
||||
#endif // GROUPBLOCK_HPP
|
@ -1,56 +0,0 @@
|
||||
#include "groupbox.hpp"
|
||||
|
||||
const QString CSVSettings::GroupBox::INVISIBLE_BOX_STYLE =
|
||||
QString::fromUtf8("QGroupBox { border: 0px; padding 0px; margin: 0px;}");
|
||||
|
||||
CSVSettings::GroupBox::GroupBox(QWidget *parent) :
|
||||
QGroupBox (parent)
|
||||
{
|
||||
initBox();
|
||||
}
|
||||
|
||||
CSVSettings::GroupBox::GroupBox (bool isVisible, QWidget *parent) :
|
||||
QGroupBox (parent)
|
||||
{
|
||||
initBox(isVisible);
|
||||
}
|
||||
|
||||
void CSVSettings::GroupBox::initBox(bool isVisible)
|
||||
{
|
||||
setFlat (true);
|
||||
VISIBLE_BOX_STYLE = styleSheet();
|
||||
|
||||
if (!isVisible)
|
||||
setStyleSheet (INVISIBLE_BOX_STYLE);
|
||||
}
|
||||
|
||||
bool CSVSettings::GroupBox::borderVisibile() const
|
||||
{
|
||||
return (styleSheet() != INVISIBLE_BOX_STYLE);
|
||||
}
|
||||
|
||||
void CSVSettings::GroupBox::setTitle (const QString &title)
|
||||
{
|
||||
if (borderVisibile() )
|
||||
{
|
||||
QGroupBox::setTitle (title);
|
||||
setMinimumWidth();
|
||||
}
|
||||
}
|
||||
|
||||
void CSVSettings::GroupBox::setBorderVisibility (bool value)
|
||||
{
|
||||
if (value)
|
||||
setStyleSheet(VISIBLE_BOX_STYLE);
|
||||
else
|
||||
setStyleSheet(INVISIBLE_BOX_STYLE);
|
||||
}
|
||||
|
||||
void CSVSettings::GroupBox::setMinimumWidth()
|
||||
{
|
||||
//set minimum width to accommodate title, if needed
|
||||
//1.5 multiplier to account for bold title.
|
||||
QFontMetrics fm (font());
|
||||
int minWidth = fm.width(title());
|
||||
QGroupBox::setMinimumWidth (minWidth * 1.5);
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
#ifndef GROUPBOX_HPP
|
||||
#define GROUPBOX_HPP
|
||||
|
||||
#include <QGroupBox>
|
||||
|
||||
namespace CSVSettings
|
||||
{
|
||||
/// Custom implementation of QGroupBox to be used with block classes
|
||||
class GroupBox : public QGroupBox
|
||||
{
|
||||
static const QString INVISIBLE_BOX_STYLE;
|
||||
QString VISIBLE_BOX_STYLE; //not a const...
|
||||
|
||||
public:
|
||||
explicit GroupBox (QWidget *parent = 0);
|
||||
explicit GroupBox (bool isVisible, QWidget *parent = 0);
|
||||
|
||||
void setTitle (const QString &title);
|
||||
void setBorderVisibility (bool value);
|
||||
bool borderVisibile() const;
|
||||
|
||||
private:
|
||||
void setMinimumWidth();
|
||||
void initBox(bool isVisible = true);
|
||||
};
|
||||
}
|
||||
|
||||
#endif // GROUPBOX_HPP
|
@ -1,115 +0,0 @@
|
||||
#include "itemblock.hpp"
|
||||
|
||||
#include <QFontMetrics>
|
||||
|
||||
CSVSettings::ItemBlock::ItemBlock (QWidget* parent)
|
||||
: mSetting (0), AbstractBlock (false, parent)
|
||||
{
|
||||
}
|
||||
|
||||
int CSVSettings::ItemBlock::build(SettingsItemDef &iDef)
|
||||
{
|
||||
buildItemBlock (iDef);
|
||||
buildItemBlockWidgets (iDef);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void CSVSettings::ItemBlock::buildItemBlockWidgets (SettingsItemDef &iDef)
|
||||
{
|
||||
WidgetDef wDef = iDef.widget;
|
||||
QLayout *blockLayout = 0;
|
||||
QString defaultValue = iDef.defaultValue;
|
||||
|
||||
switch (wDef.type)
|
||||
{
|
||||
|
||||
case Widget_CheckBox:
|
||||
case Widget_RadioButton:
|
||||
|
||||
foreach (QString item, *(iDef.valueList))
|
||||
{
|
||||
wDef.caption = item;
|
||||
wDef.isDefault = (item == defaultValue);
|
||||
|
||||
blockLayout = buildWidget (item, wDef, blockLayout)->getLayout();
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case Widget_ComboBox:
|
||||
case Widget_ListBox:
|
||||
|
||||
//assign the item's value list to the widget's value list.
|
||||
//pass through to default to finish widget construction.
|
||||
if (!wDef.valueList)
|
||||
wDef.valueList = iDef.valueList;
|
||||
|
||||
default:
|
||||
//only one instance of this non-list widget type.
|
||||
//Set it's value to the default value for the item and build the widget.
|
||||
|
||||
if (wDef.value.isEmpty())
|
||||
wDef.value = iDef.defaultValue;
|
||||
|
||||
buildWidget (iDef.name, wDef);
|
||||
}
|
||||
}
|
||||
|
||||
void CSVSettings::ItemBlock::buildItemBlock (SettingsItemDef &iDef)
|
||||
{
|
||||
QString defaultValue = iDef.defaultValue;
|
||||
|
||||
setObjectName(iDef.name);
|
||||
|
||||
mSetting = new CSMSettings::SettingsItem (objectName(),
|
||||
iDef.hasMultipleValues, iDef.defaultValue,
|
||||
parent());
|
||||
|
||||
if (iDef.valueList)
|
||||
mSetting->setValueList(iDef.valueList);
|
||||
|
||||
if (!iDef.minMax.isEmpty())
|
||||
mSetting->setValuePair(iDef.minMax);
|
||||
}
|
||||
|
||||
|
||||
bool CSVSettings::ItemBlock::update (const QString &value)
|
||||
{
|
||||
bool success = updateItem (value);
|
||||
|
||||
if (success)
|
||||
signalUpdateWidget (value);
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
|
||||
bool CSVSettings::ItemBlock::updateItem (const QString &value)
|
||||
{
|
||||
return mSetting->updateItem(value);
|
||||
}
|
||||
|
||||
|
||||
bool CSVSettings::ItemBlock::updateBySignal(const QString &name, const QString &value, bool &doEmit)
|
||||
{
|
||||
bool success = (mSetting->getValue() != value);
|
||||
|
||||
if (success)
|
||||
success = updateItem(value);
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
CSMSettings::SettingList *CSVSettings::ItemBlock::getSettings ()
|
||||
{
|
||||
CSMSettings::SettingList *list = new CSMSettings::SettingList();
|
||||
list->push_back(mSetting);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
QString CSVSettings::ItemBlock::getValue() const
|
||||
{
|
||||
return mSetting->getValue();
|
||||
}
|
@ -1,48 +0,0 @@
|
||||
#ifndef ITEMBLOCK_HPP
|
||||
#define ITEMBLOCK_HPP
|
||||
|
||||
#include "abstractblock.hpp"
|
||||
|
||||
namespace CSVSettings
|
||||
{
|
||||
|
||||
class ItemBlock : public AbstractBlock
|
||||
{
|
||||
CSMSettings::SettingsItem *mSetting;
|
||||
WidgetList mWidgetList;
|
||||
|
||||
public:
|
||||
|
||||
ItemBlock (QWidget* parent = 0);
|
||||
|
||||
/// pure virtual function not implemented
|
||||
bool updateSettings (const CSMSettings::SettingMap &settings) { return false; }
|
||||
|
||||
CSMSettings::SettingList *getSettings ();
|
||||
|
||||
QString getValue () const;
|
||||
|
||||
/// item blocks encapsulate only one setting
|
||||
int getSettingCount();
|
||||
|
||||
/// update setting value and corresponding widget
|
||||
bool update (const QString &value);
|
||||
|
||||
/// virtual construction function
|
||||
int build(SettingsItemDef &iDef);
|
||||
|
||||
private:
|
||||
|
||||
/// custom construction function
|
||||
void buildItemBlock (SettingsItemDef& iDef);
|
||||
void buildItemBlockWidgets (SettingsItemDef& iDef);
|
||||
|
||||
/// update the setting value
|
||||
bool updateItem (const QString &);
|
||||
|
||||
/// callback function triggered when update to application level is signalled
|
||||
bool updateBySignal (const QString &name, const QString &value, bool &doEmit);
|
||||
};
|
||||
}
|
||||
|
||||
#endif // ITEMBLOCK_HPP
|
@ -1,152 +0,0 @@
|
||||
#include "proxyblock.hpp"
|
||||
#include "itemblock.hpp"
|
||||
|
||||
CSVSettings::ProxyBlock::ProxyBlock (QWidget *parent)
|
||||
: GroupBlock (parent)
|
||||
{
|
||||
}
|
||||
int CSVSettings::ProxyBlock::build (GroupBlockDef *proxyDef)
|
||||
{
|
||||
//get the list of pre-defined values for the proxy
|
||||
mValueList = proxyDef->settingItems.at(0)->valueList;
|
||||
|
||||
bool success = GroupBlock::build(proxyDef);
|
||||
|
||||
//connect the item block of the proxy setting to the proxy-update slot
|
||||
connect (getItemBlock(0), SIGNAL (signalUpdateSetting(const QString &, const QString &)),
|
||||
this, SLOT (slotUpdateProxySetting (const QString &, const QString &)));
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
void CSVSettings::ProxyBlock::addSetting (ItemBlock *settingBlock, QStringList *proxyList)
|
||||
{
|
||||
//connect the item block of the proxied seting to the generic update slot
|
||||
connect (settingBlock, SIGNAL (signalUpdateSetting(const QString &, const QString &)),
|
||||
this, SLOT (slotUpdateProxySetting(const QString &, const QString &)));
|
||||
|
||||
mProxiedItemBlockList << settingBlock;
|
||||
mProxyList << proxyList;
|
||||
}
|
||||
|
||||
bool CSVSettings::ProxyBlock::updateSettings (const CSMSettings::SettingMap &settings)
|
||||
{
|
||||
return updateByProxiedSettings(&settings);
|
||||
}
|
||||
|
||||
bool CSVSettings::ProxyBlock::updateBySignal(const QString &name, const QString &value, bool &doEmit)
|
||||
{
|
||||
doEmit = false;
|
||||
return updateProxiedSettings();
|
||||
}
|
||||
|
||||
void CSVSettings::ProxyBlock::slotUpdateProxySetting (const QString &name, const QString &value)
|
||||
{
|
||||
updateByProxiedSettings();
|
||||
}
|
||||
|
||||
bool CSVSettings::ProxyBlock::updateProxiedSettings()
|
||||
{
|
||||
foreach (ItemBlock *block, mProxiedItemBlockList)
|
||||
{
|
||||
QString value = getItemBlock(0)->getValue();
|
||||
|
||||
bool success = false;
|
||||
int i = 0;
|
||||
|
||||
//find the value index of the selected value in the proxy setting
|
||||
for (; i < mValueList->size(); ++i)
|
||||
{
|
||||
success = (value == mValueList->at(i));
|
||||
|
||||
if (success)
|
||||
break;
|
||||
}
|
||||
|
||||
if (!success)
|
||||
return false;
|
||||
|
||||
// update the containing the proxied item's name
|
||||
foreach (QStringList *list, mProxyList)
|
||||
{
|
||||
if ( list->at(0) == block->objectName())
|
||||
block->update (list->at(++i));
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CSVSettings::ProxyBlock::updateByProxiedSettings(const CSMSettings::SettingMap *settings)
|
||||
{
|
||||
bool success = false;
|
||||
int commonIndex = -1;
|
||||
|
||||
//update all proxy settings based on values from non-proxies
|
||||
foreach (QStringList *list, mProxyList)
|
||||
{
|
||||
//Iterate each proxy item's proxied setting list, getting the current values
|
||||
//Compare those value indices.
|
||||
//If indices match, they correlate to one of the proxy's values in it's value list
|
||||
|
||||
//first value is always the name of the setting the proxy setting manages
|
||||
QStringList::Iterator itProxyValue = list->begin();
|
||||
QString proxiedSettingName = (*itProxyValue);
|
||||
QString proxiedSettingValue = "";
|
||||
itProxyValue++;
|
||||
|
||||
if (!settings)
|
||||
{
|
||||
//get the actual setting value
|
||||
ItemBlock *block = getProxiedItemBlock (proxiedSettingName);
|
||||
|
||||
if (block)
|
||||
proxiedSettingValue = block->getValue();
|
||||
}
|
||||
else
|
||||
proxiedSettingValue = (*settings)[proxiedSettingName]->getValue();
|
||||
|
||||
int j = 0;
|
||||
|
||||
//iterate each value in the proxy string list
|
||||
for (; itProxyValue != (list)->end(); ++itProxyValue)
|
||||
{
|
||||
success = ((*itProxyValue) == proxiedSettingValue);
|
||||
|
||||
if (success)
|
||||
break;
|
||||
|
||||
j++;
|
||||
}
|
||||
|
||||
//break if no match was found
|
||||
if ( !success )
|
||||
break;
|
||||
|
||||
if (commonIndex != -1)
|
||||
success = (commonIndex == j);
|
||||
else
|
||||
commonIndex = j;
|
||||
|
||||
//break if indices were found, but mismatch
|
||||
if (!success)
|
||||
break;
|
||||
}
|
||||
|
||||
//if successful, the proxied setting values match a pre-defined value in the
|
||||
//proxy's value list. Set the proxy to that value index
|
||||
if (success)
|
||||
{
|
||||
ItemBlock *block = getItemBlock(0);
|
||||
|
||||
if (block)
|
||||
block->update (mValueList->at(commonIndex));
|
||||
}
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
CSVSettings::ItemBlock *CSVSettings::ProxyBlock::getProxiedItemBlock (const QString &name)
|
||||
{
|
||||
return getItemBlock (name, &mProxiedItemBlockList);
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
#ifndef PROXYBLOCK_HPP
|
||||
#define PROXYBLOCK_HPP
|
||||
|
||||
#include "groupblock.hpp"
|
||||
|
||||
namespace CSVSettings
|
||||
{
|
||||
class ProxyBlock : public GroupBlock
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
/// TODO: Combine mProxyItemBlockList and mProxyList.
|
||||
ItemBlockList mProxiedItemBlockList;
|
||||
ProxyList mProxyList;
|
||||
QStringList *mValueList;
|
||||
|
||||
public:
|
||||
|
||||
explicit ProxyBlock (QWidget *parent = 0);
|
||||
explicit ProxyBlock (ItemBlock *proxyItemBlock, QWidget *parent = 0);
|
||||
|
||||
/// Add a block that contains a proxied setting to the proxy block.
|
||||
void addSetting (ItemBlock* settingBlock, QStringList *proxyList);
|
||||
|
||||
int build (GroupBlockDef *def);
|
||||
|
||||
CSMSettings::SettingList *getSettings() { return 0; }
|
||||
|
||||
/// Update settings local to the proxy block pushed from application level
|
||||
bool updateSettings (const CSMSettings::SettingMap &settings);
|
||||
|
||||
/// callback function triggered when update to the application level is signaled.
|
||||
bool updateBySignal (const QString &name, const QString &value, bool &doEmit);
|
||||
|
||||
private:
|
||||
|
||||
/// return the item block of a proxied setting
|
||||
ItemBlock *getProxiedItemBlock (const QString &name);
|
||||
|
||||
/// update the proxy setting with data from the proxied settings
|
||||
bool updateByProxiedSettings(const CSMSettings::SettingMap *settings = 0);
|
||||
|
||||
/// update proxied settings with data from the proxy setting
|
||||
bool updateProxiedSettings();
|
||||
|
||||
private slots:
|
||||
|
||||
void slotUpdateProxySetting (const QString &name, const QString &value);
|
||||
|
||||
};
|
||||
}
|
||||
#endif // PROXYBLOCK_HPP
|
@ -1 +0,0 @@
|
||||
#include "settingwidget.hpp"
|
@ -1,214 +0,0 @@
|
||||
#ifndef SETTINGWIDGET_HPP
|
||||
#define SETTINGWIDGET_HPP
|
||||
|
||||
#include <QLabel>
|
||||
#include <QCheckBox>
|
||||
#include <QSpinBox>
|
||||
#include <QLineEdit>
|
||||
#include <QRadioButton>
|
||||
#include <QComboBox>
|
||||
#include <QListWidget>
|
||||
#include <QGroupBox>
|
||||
#include <QHBoxLayout>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
#include "abstractwidget.hpp"
|
||||
|
||||
namespace CSVSettings
|
||||
{
|
||||
|
||||
/// Generic template for radiobuttons / checkboxes
|
||||
template <typename T1>
|
||||
class SettingWidget : public AbstractWidget
|
||||
{
|
||||
|
||||
T1 *mWidget;
|
||||
|
||||
public:
|
||||
|
||||
explicit SettingWidget (WidgetDef &def, QLayout *layout, QWidget* parent = 0)
|
||||
: AbstractWidget (layout, parent), mWidget (new T1 (parent))
|
||||
{
|
||||
mWidget->setText(def.caption);
|
||||
build (mWidget, def, true);
|
||||
mWidget->setChecked(def.isDefault);
|
||||
|
||||
connect (mWidget, SIGNAL (toggled (bool)),
|
||||
this, SLOT (slotUpdateItem (bool)));
|
||||
}
|
||||
|
||||
QWidget *widget() { return mWidget; }
|
||||
|
||||
private:
|
||||
|
||||
void updateWidget (const QString &value)
|
||||
{
|
||||
if ( value == mWidget->objectName() && !mWidget->isChecked() )
|
||||
mWidget->setChecked (true);
|
||||
}
|
||||
};
|
||||
|
||||
/// spin box template
|
||||
template <>
|
||||
class SettingWidget <QSpinBox>: public AbstractWidget
|
||||
{
|
||||
|
||||
QSpinBox *mWidget;
|
||||
|
||||
public:
|
||||
|
||||
SettingWidget (WidgetDef &def, QLayout *layout, QWidget *parent = 0)
|
||||
: AbstractWidget (layout, parent), mWidget (new QSpinBox (parent))
|
||||
{
|
||||
def.caption += tr(" (%1 to %2)").arg(def.minMax->left).arg(def.minMax->right);
|
||||
|
||||
mWidget->setMaximum (def.minMax->right.toInt());
|
||||
mWidget->setMinimum (def.minMax->left.toInt());
|
||||
mWidget->setValue (def.value.toInt());
|
||||
|
||||
build (mWidget, def);
|
||||
|
||||
connect (mWidget, SIGNAL (valueChanged (int)),
|
||||
this, SLOT (slotUpdateItem (int)));
|
||||
|
||||
mWidget->setAlignment (getAlignment(def.valueAlignment));
|
||||
|
||||
|
||||
}
|
||||
|
||||
QWidget *widget() { return mWidget; }
|
||||
|
||||
private:
|
||||
|
||||
void updateWidget (const QString &value)
|
||||
{
|
||||
int intVal = value.toInt();
|
||||
|
||||
if (intVal >= mWidget->minimum() && intVal <= mWidget->maximum() && intVal != mWidget->value())
|
||||
mWidget->setValue (intVal);
|
||||
}
|
||||
|
||||
signals:
|
||||
|
||||
};
|
||||
|
||||
/// combo box template
|
||||
template <>
|
||||
class SettingWidget <QComboBox>: public CSVSettings::AbstractWidget
|
||||
{
|
||||
|
||||
QComboBox *mWidget;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
explicit SettingWidget(WidgetDef &def, QLayout *layout, QWidget *parent = 0)
|
||||
: AbstractWidget (layout, parent), mWidget (new QComboBox (parent))
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
foreach (QString item, *(def.valueList))
|
||||
{
|
||||
mWidget->addItem (item);
|
||||
|
||||
if (item == def.value)
|
||||
mWidget->setCurrentIndex(i);
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
build (mWidget, def);
|
||||
|
||||
connect (mWidget, SIGNAL (currentIndexChanged (const QString &)),
|
||||
this, SLOT (slotUpdateItem (const QString &)));
|
||||
|
||||
//center the combo box items
|
||||
mWidget->setEditable (true);
|
||||
mWidget->lineEdit()->setReadOnly (true);
|
||||
mWidget->lineEdit()->setAlignment (getAlignment(def.valueAlignment));
|
||||
|
||||
QFlags<Qt::AlignmentFlag> alignment = mWidget->lineEdit()->alignment();
|
||||
|
||||
for (int j = 0; j < mWidget->count(); j++)
|
||||
mWidget->setItemData (j, QVariant(alignment), Qt::TextAlignmentRole);
|
||||
}
|
||||
|
||||
QWidget *widget() { return mWidget; }
|
||||
|
||||
private:
|
||||
|
||||
void updateWidget (const QString &value)
|
||||
{
|
||||
if (mWidget->currentText() != value)
|
||||
mWidget->setCurrentIndex(mWidget->findText(value));
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
/// line edit template
|
||||
template <>
|
||||
class SettingWidget <QLineEdit>: public CSVSettings::AbstractWidget
|
||||
{
|
||||
|
||||
QLineEdit *mWidget;
|
||||
|
||||
public:
|
||||
|
||||
explicit SettingWidget(WidgetDef &def, QLayout *layout, QWidget *parent = 0)
|
||||
: AbstractWidget (layout, parent), mWidget (new QLineEdit (parent))
|
||||
{
|
||||
if (!def.inputMask.isEmpty())
|
||||
mWidget->setInputMask (def.inputMask);
|
||||
|
||||
mWidget->setText (def.value);
|
||||
|
||||
build (mWidget, def);
|
||||
|
||||
connect (mWidget, SIGNAL (textChanged (const QString &)),
|
||||
this, SLOT (slotUpdateItem (const QString &)));
|
||||
|
||||
mWidget->setAlignment (getAlignment(def.valueAlignment));
|
||||
}
|
||||
|
||||
QWidget *widget() { return mWidget; }
|
||||
|
||||
void updateWidget (const QString &value)
|
||||
{
|
||||
if (mWidget->text() != value)
|
||||
mWidget->setText(value);
|
||||
}
|
||||
};
|
||||
|
||||
/// list widget template
|
||||
/// \todo Not fully implemented. Only widget supporting multi-valued settings
|
||||
template <>
|
||||
class SettingWidget <QListWidget>: public CSVSettings::AbstractWidget
|
||||
{
|
||||
|
||||
QListWidget *mWidget;
|
||||
|
||||
public:
|
||||
|
||||
explicit SettingWidget(WidgetDef &def, QLayout *layout, QWidget *parent = 0 )
|
||||
: AbstractWidget (layout, parent), mWidget (new QListWidget (parent))
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
foreach (QString item, *(def.valueList))
|
||||
{
|
||||
mWidget->addItem (item);
|
||||
|
||||
if (item == def.value) {}
|
||||
i++;
|
||||
}
|
||||
build (mWidget, def);
|
||||
}
|
||||
|
||||
QWidget *widget() { return mWidget; }
|
||||
|
||||
private:
|
||||
void updateWidget (const QString &value) {}
|
||||
};
|
||||
|
||||
}
|
||||
#endif // SETTINGWIDGET_HPP
|
@ -1,80 +0,0 @@
|
||||
#include "toggleblock.hpp"
|
||||
#include "groupblock.hpp"
|
||||
#include "groupbox.hpp"
|
||||
#include "itemblock.hpp"
|
||||
|
||||
CSVSettings::ToggleBlock::ToggleBlock(QWidget *parent) :
|
||||
CustomBlock(parent)
|
||||
{}
|
||||
|
||||
int CSVSettings::ToggleBlock::build(CustomBlockDef *def)
|
||||
{
|
||||
if (def->blockDefList.size()==0)
|
||||
return -1;
|
||||
|
||||
QList<GroupBlockDef *>::Iterator it = def->blockDefList.begin();
|
||||
|
||||
//first def in the list is the def for the toggle block
|
||||
GroupBlockDef *toggleDef = *it++;
|
||||
|
||||
if (toggleDef->captions.size() != def->blockDefList.size()-1 )
|
||||
return -2;
|
||||
|
||||
if (toggleDef->widgets.size() == 0)
|
||||
return -3;
|
||||
|
||||
//create the toogle block UI structure
|
||||
QLayout *blockLayout = createLayout (def->blockOrientation, true);
|
||||
GroupBox *propertyBox = buildGroupBox (toggleDef->widgetOrientation);
|
||||
|
||||
mBox->setLayout(blockLayout);
|
||||
mBox->setTitle (toggleDef->title);
|
||||
|
||||
//build the blocks contained in the def list
|
||||
//this manages proxy block construction.
|
||||
//Any settings managed by the proxy setting
|
||||
//must be included in the blocks defined in the list.
|
||||
CustomBlock::build (def->blockDefList, &it);
|
||||
|
||||
for (GroupBlockList::iterator it = mGroupList.begin(); it != mGroupList.end(); ++it)
|
||||
propertyBox->layout()->addWidget ((*it)->getGroupBox());
|
||||
|
||||
//build togle widgets, linking them to the settings
|
||||
GroupBox *toggleBox = buildToggleWidgets (toggleDef, def->defaultValue);
|
||||
|
||||
blockLayout->addWidget(toggleBox);
|
||||
blockLayout->addWidget(propertyBox);
|
||||
blockLayout->setAlignment (propertyBox, Qt::AlignRight);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
CSVSettings::GroupBox *CSVSettings::ToggleBlock::buildToggleWidgets (GroupBlockDef *def, QString &defaultToggle)
|
||||
{
|
||||
GroupBox *box = new GroupBox (false, getParent());
|
||||
|
||||
QLayout *layout = createLayout (def->widgetOrientation, true, static_cast<QWidget *>(box));
|
||||
|
||||
for (int i = 0; i < def->widgets.size(); ++i)
|
||||
{
|
||||
QString caption = def->captions.at(i);
|
||||
WidgetDef *wDef = def->widgets.at(i);
|
||||
|
||||
wDef->caption = caption;
|
||||
wDef->widgetAlignment = Align_Left;
|
||||
|
||||
AbstractWidget *widg = buildWidget (caption, *wDef, layout, false);
|
||||
|
||||
GroupBlock *block = mGroupList.at(i);
|
||||
|
||||
//connect widget's update to the property block's enabled status
|
||||
connect (widg->widget(), SIGNAL (toggled (bool)), block, SLOT (slotSetEnabled(bool)));
|
||||
|
||||
//enable the default toggle option
|
||||
block->getGroupBox()->setEnabled( caption == defaultToggle );
|
||||
|
||||
layout = widg->getLayout();
|
||||
}
|
||||
|
||||
return box;
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
#ifndef TOGGLEBLOCK_HPP
|
||||
#define TOGGLEBLOCK_HPP
|
||||
|
||||
#include <QObject>
|
||||
|
||||
#include "customblock.hpp"
|
||||
|
||||
namespace CSVSettings
|
||||
{
|
||||
class GroupBlock;
|
||||
class GroupBox;
|
||||
class ToggleWidget;
|
||||
class ItemBlock;
|
||||
|
||||
class ToggleBlock : public CustomBlock
|
||||
{
|
||||
|
||||
public:
|
||||
explicit ToggleBlock(QWidget *parent = 0);
|
||||
|
||||
int build (CustomBlockDef *def);
|
||||
|
||||
private:
|
||||
/// Constructor for toggle widgets that are specific to toggle block
|
||||
/// Widgets are not a part of the user preference settings
|
||||
GroupBox *buildToggleWidgets (GroupBlockDef *def, QString &defaultToggle);
|
||||
};
|
||||
}
|
||||
#endif // TOGGLEBLOCK_HPP
|
@ -1,119 +0,0 @@
|
||||
#include "usersettingsdialog.hpp"
|
||||
|
||||
#include <boost/filesystem/path.hpp>
|
||||
|
||||
#include <QApplication>
|
||||
#include <QDesktopWidget>
|
||||
#include <QWidget>
|
||||
#include <QTabWidget>
|
||||
#include <QMessageBox>
|
||||
#include <QTextCodec>
|
||||
#include <QFile>
|
||||
#include <QPushButton>
|
||||
#include <QDockWidget>
|
||||
#include <QGridLayout>
|
||||
#include <QApplication>
|
||||
#include <QDesktopWidget>
|
||||
|
||||
#include "../../model/settings/support.hpp"
|
||||
|
||||
#include "datadisplayformatpage.hpp"
|
||||
#include "windowpage.hpp"
|
||||
#include "settingwidget.hpp"
|
||||
|
||||
CSVSettings::UserSettingsDialog::UserSettingsDialog(QMainWindow *parent) :
|
||||
QMainWindow (parent), mStackedWidget (0)
|
||||
{
|
||||
setWindowTitle(QString::fromUtf8 ("User Settings"));
|
||||
buildPages();
|
||||
setWidgetStates ();
|
||||
|
||||
connect (mListWidget,
|
||||
SIGNAL (currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
|
||||
this,
|
||||
SLOT (slotChangePage (QListWidgetItem*, QListWidgetItem*)));
|
||||
|
||||
QRect scr = QApplication::desktop()->screenGeometry();
|
||||
QRect rect = geometry();
|
||||
move (scr.center().x() - rect.center().x(), scr.center().y() - rect.center().y());
|
||||
}
|
||||
|
||||
CSVSettings::UserSettingsDialog::~UserSettingsDialog()
|
||||
{
|
||||
}
|
||||
|
||||
void CSVSettings::UserSettingsDialog::closeEvent (QCloseEvent *event)
|
||||
{
|
||||
writeSettings();
|
||||
}
|
||||
|
||||
void CSVSettings::UserSettingsDialog::setWidgetStates ()
|
||||
{
|
||||
CSMSettings::UserSettings::instance().loadSettings("opencs.cfg");
|
||||
|
||||
//iterate the tabWidget's pages (sections)
|
||||
for (int i = 0; i < mStackedWidget->count(); i++)
|
||||
{
|
||||
//get the settings defined for the entire section
|
||||
//and update widget
|
||||
QString pageName = mStackedWidget->widget(i)->objectName();
|
||||
|
||||
const CSMSettings::SettingMap *settings = CSMSettings::UserSettings::instance().getSettings(pageName);
|
||||
AbstractPage &page = getAbstractPage (i);
|
||||
page.initializeWidgets(*settings);
|
||||
}
|
||||
}
|
||||
|
||||
void CSVSettings::UserSettingsDialog::buildPages()
|
||||
{
|
||||
//craete central widget with it's layout and immediate children
|
||||
QWidget *centralWidget = new QWidget (this);
|
||||
|
||||
mListWidget = new QListWidget (centralWidget);
|
||||
mStackedWidget = new QStackedWidget (centralWidget);
|
||||
|
||||
QGridLayout* dialogLayout = new QGridLayout();
|
||||
|
||||
mListWidget->setMinimumWidth(0);
|
||||
mListWidget->setSizePolicy (QSizePolicy::Preferred, QSizePolicy::Expanding);
|
||||
|
||||
mStackedWidget->setSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed);
|
||||
|
||||
dialogLayout->addWidget (mListWidget,0,0);
|
||||
dialogLayout->addWidget (mStackedWidget,0,1, Qt::AlignTop);
|
||||
|
||||
centralWidget->setLayout (dialogLayout);
|
||||
|
||||
setCentralWidget (centralWidget);
|
||||
setDockOptions (QMainWindow::AllowNestedDocks);
|
||||
|
||||
createPage<WindowPage>();
|
||||
createPage<DataDisplayFormatPage>();
|
||||
|
||||
}
|
||||
|
||||
void CSVSettings::UserSettingsDialog::writeSettings()
|
||||
{
|
||||
QMap<QString, CSMSettings::SettingList *> settings;
|
||||
|
||||
for (int i = 0; i < mStackedWidget->count(); ++i)
|
||||
{
|
||||
AbstractPage &page = getAbstractPage (i);
|
||||
settings [page.objectName()] = page.getSettings();
|
||||
}
|
||||
CSMSettings::UserSettings::instance().writeSettings(settings);
|
||||
}
|
||||
|
||||
CSVSettings::AbstractPage &CSVSettings::UserSettingsDialog::getAbstractPage (int index)
|
||||
{
|
||||
return dynamic_cast<AbstractPage &> (*(mStackedWidget->widget (index)));
|
||||
}
|
||||
|
||||
void CSVSettings::UserSettingsDialog::slotChangePage(QListWidgetItem *current, QListWidgetItem *previous)
|
||||
{
|
||||
if (!current)
|
||||
current = previous;
|
||||
|
||||
if (!(current == previous))
|
||||
mStackedWidget->setCurrentIndex (mListWidget->row(current));
|
||||
}
|
@ -1,71 +0,0 @@
|
||||
#ifndef USERSETTINGSDIALOG_H
|
||||
#define USERSETTINGSDIALOG_H
|
||||
|
||||
#include <QMainWindow>
|
||||
#include <QStackedWidget>
|
||||
#include <QListWidgetItem>
|
||||
#include <QApplication>
|
||||
|
||||
#include "../../model/settings/usersettings.hpp"
|
||||
#include "../../model/settings/support.hpp"
|
||||
|
||||
class QHBoxLayout;
|
||||
class AbstractWidget;
|
||||
class QStackedWidget;
|
||||
class QListWidget;
|
||||
|
||||
namespace CSVSettings {
|
||||
|
||||
class AbstractPage;
|
||||
|
||||
class UserSettingsDialog : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
QListWidget *mListWidget;
|
||||
QStackedWidget *mStackedWidget;
|
||||
|
||||
public:
|
||||
UserSettingsDialog(QMainWindow *parent = 0);
|
||||
~UserSettingsDialog();
|
||||
|
||||
private:
|
||||
|
||||
/// Settings are written on close
|
||||
void closeEvent (QCloseEvent *event);
|
||||
|
||||
/// return the setting page by name
|
||||
/// performs dynamic cast to AbstractPage *
|
||||
AbstractPage &getAbstractPage (int index);
|
||||
void setWidgetStates ();
|
||||
void buildPages();
|
||||
void writeSettings();
|
||||
|
||||
/// Templated function to create a custom user preference page
|
||||
template <typename T>
|
||||
void createPage ()
|
||||
{
|
||||
T *page = new T(mStackedWidget);
|
||||
|
||||
mStackedWidget->addWidget (&dynamic_cast<QWidget &>(*page));
|
||||
|
||||
new QListWidgetItem (page->objectName(), mListWidget);
|
||||
|
||||
//finishing touches
|
||||
QFontMetrics fm (QApplication::font());
|
||||
int textWidth = fm.width(page->objectName());
|
||||
|
||||
if ((textWidth + 50) > mListWidget->minimumWidth())
|
||||
mListWidget->setMinimumWidth(textWidth + 50);
|
||||
|
||||
resize (mStackedWidget->sizeHint());
|
||||
}
|
||||
|
||||
public slots:
|
||||
|
||||
/// Called when a different page is selected in the left-hand list widget
|
||||
void slotChangePage (QListWidgetItem*, QListWidgetItem*);
|
||||
};
|
||||
|
||||
}
|
||||
#endif // USERSETTINGSDIALOG_H
|
@ -1,144 +0,0 @@
|
||||
#include "windowpage.hpp"
|
||||
|
||||
#include <QList>
|
||||
#include <QListView>
|
||||
#include <QGroupBox>
|
||||
#include <QRadioButton>
|
||||
#include <QDockWidget>
|
||||
#include <QVBoxLayout>
|
||||
#include <QGridLayout>
|
||||
#include <QStyle>
|
||||
|
||||
#ifdef Q_OS_MAC
|
||||
#include <QPlastiqueStyle>
|
||||
#endif
|
||||
|
||||
#include "../../model/settings/usersettings.hpp"
|
||||
#include "groupblock.hpp"
|
||||
#include "toggleblock.hpp"
|
||||
#include "../../view/settings/abstractblock.hpp"
|
||||
|
||||
CSVSettings::WindowPage::WindowPage(QWidget *parent):
|
||||
AbstractPage("Window Size", parent)
|
||||
{
|
||||
// Hacks to get the stylesheet look properly
|
||||
#ifdef Q_OS_MAC
|
||||
QPlastiqueStyle *style = new QPlastiqueStyle;
|
||||
//profilesComboBox->setStyle(style);
|
||||
#endif
|
||||
|
||||
setupUi();
|
||||
}
|
||||
|
||||
CSVSettings::GroupBlockDef * CSVSettings::WindowPage::buildDefinedWindowSize()
|
||||
{
|
||||
GroupBlockDef *block = new GroupBlockDef ( "Defined Size");
|
||||
|
||||
SettingsItemDef *widthByHeightItem = new SettingsItemDef ("Window Size", "640x480");
|
||||
WidgetDef widthByHeightWidget = WidgetDef (Widget_ComboBox);
|
||||
widthByHeightWidget.widgetWidth = 90;
|
||||
*(widthByHeightItem->valueList) << "640x480" << "800x600" << "1024x768" << "1440x900";
|
||||
|
||||
QStringList *widthProxy = new QStringList;
|
||||
QStringList *heightProxy = new QStringList;
|
||||
|
||||
(*widthProxy) << "Width" << "640" << "800" << "1024" << "1440";
|
||||
(*heightProxy) << "Height" << "480" << "600" << "768" << "900";
|
||||
|
||||
*(widthByHeightItem->proxyList) << widthProxy << heightProxy;
|
||||
|
||||
widthByHeightItem->widget = widthByHeightWidget;
|
||||
|
||||
block->settingItems << widthByHeightItem;
|
||||
block->isProxy = true;
|
||||
block->isVisible = false;
|
||||
|
||||
return block;
|
||||
}
|
||||
|
||||
CSVSettings::GroupBlockDef *CSVSettings::WindowPage::buildCustomWindowSize()
|
||||
{
|
||||
GroupBlockDef *block = new GroupBlockDef ("Custom Size");
|
||||
|
||||
//custom width
|
||||
SettingsItemDef *widthItem = new SettingsItemDef ("Width", "640");
|
||||
widthItem->widget = WidgetDef (Widget_LineEdit);
|
||||
widthItem->widget.widgetWidth = 45;
|
||||
widthItem->widget.inputMask = "9999";
|
||||
|
||||
//custom height
|
||||
SettingsItemDef *heightItem = new SettingsItemDef ("Height", "480");
|
||||
heightItem->widget = WidgetDef (Widget_LineEdit);
|
||||
heightItem->widget.widgetWidth = 45;
|
||||
heightItem->widget.caption = "x";
|
||||
heightItem->widget.inputMask = "9999";
|
||||
|
||||
block->settingItems << widthItem << heightItem;
|
||||
block->widgetOrientation = Orient_Horizontal;
|
||||
block->isVisible = false;
|
||||
|
||||
return block;
|
||||
}
|
||||
|
||||
CSVSettings::GroupBlockDef *CSVSettings::WindowPage::buildWindowSizeToggle()
|
||||
{
|
||||
GroupBlockDef *block = new GroupBlockDef (objectName());
|
||||
|
||||
// window size toggle
|
||||
block->captions << "Pre-Defined" << "Custom";
|
||||
block->widgetOrientation = Orient_Vertical;
|
||||
block->isVisible = false;
|
||||
|
||||
//define a widget for each group in the toggle
|
||||
for (int i = 0; i < 2; i++)
|
||||
block->widgets << new WidgetDef (Widget_RadioButton);
|
||||
|
||||
block->widgets.at(0)->isDefault = false;
|
||||
|
||||
return block;
|
||||
}
|
||||
|
||||
CSVSettings::CustomBlockDef *CSVSettings::WindowPage::buildWindowSize(GroupBlockDef *toggle_def,
|
||||
GroupBlockDef *defined_def,
|
||||
GroupBlockDef *custom_def)
|
||||
{
|
||||
CustomBlockDef *block = new CustomBlockDef(QString ("Window Size"));
|
||||
|
||||
block->blockDefList << toggle_def << defined_def << custom_def;
|
||||
block->defaultValue = "Custom";
|
||||
|
||||
return block;
|
||||
|
||||
}
|
||||
|
||||
void CSVSettings::WindowPage::setupUi()
|
||||
{
|
||||
CustomBlockDef *windowSize = buildWindowSize(buildWindowSizeToggle(),
|
||||
buildDefinedWindowSize(),
|
||||
buildCustomWindowSize()
|
||||
);
|
||||
|
||||
mAbstractBlocks << buildBlock<ToggleBlock> (windowSize);
|
||||
|
||||
foreach (AbstractBlock *block, mAbstractBlocks)
|
||||
{
|
||||
connect (block, SIGNAL (signalUpdateSetting (const QString &, const QString &)),
|
||||
this, SIGNAL (signalUpdateEditorSetting (const QString &, const QString &)) );
|
||||
}
|
||||
|
||||
connect ( this,
|
||||
SIGNAL ( signalUpdateEditorSetting (const QString &, const QString &)),
|
||||
&(CSMSettings::UserSettings::instance()),
|
||||
SIGNAL ( signalUpdateEditorSetting (const QString &, const QString &)));
|
||||
|
||||
}
|
||||
|
||||
|
||||
void CSVSettings::WindowPage::initializeWidgets (const CSMSettings::SettingMap &settings)
|
||||
{
|
||||
//iterate each item in each blocks in this section
|
||||
//validate the corresponding setting against the defined valuelist if any.
|
||||
for (AbstractBlockList::Iterator it_block = mAbstractBlocks.begin();
|
||||
it_block != mAbstractBlocks.end(); ++it_block)
|
||||
(*it_block)->updateSettings (settings);
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
#ifndef WINDOWPAGE_H
|
||||
#define WINDOWPAGE_H
|
||||
|
||||
#include "abstractpage.hpp"
|
||||
|
||||
class QGroupBox;
|
||||
|
||||
namespace CSVSettings {
|
||||
|
||||
class UserSettings;
|
||||
class AbstractBlock;
|
||||
|
||||
class WindowPage : public AbstractPage
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
WindowPage(QWidget *parent = 0);
|
||||
|
||||
void setupUi();
|
||||
void initializeWidgets (const CSMSettings::SettingMap &settings);
|
||||
|
||||
///
|
||||
GroupBlockDef *buildCustomWindowSize();
|
||||
GroupBlockDef *buildDefinedWindowSize();
|
||||
GroupBlockDef *buildWindowSizeToggle();
|
||||
CustomBlockDef *buildWindowSize (GroupBlockDef *, GroupBlockDef *, GroupBlockDef *);
|
||||
|
||||
signals:
|
||||
void signalUpdateEditorSetting (const QString &settingName, const QString &settingValue);
|
||||
};
|
||||
}
|
||||
#endif //WINDOWPAGE_H
|
Loading…
Reference in New Issue