diff --git a/apps/opencs/view/settings/datadisplayformatpage.cpp b/apps/opencs/view/settings/datadisplayformatpage.cpp new file mode 100755 index 0000000000..29257f0c85 --- /dev/null +++ b/apps/opencs/view/settings/datadisplayformatpage.cpp @@ -0,0 +1,55 @@ +#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 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::DataDisplayFormatPage::setupUi() +{ + + mAbstractBlocks << buildBlock (setupDataDisplay ("Record Status Display")); + mAbstractBlocks << buildBlock (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); +} diff --git a/apps/opencs/view/settings/datadisplayformatpage.hpp b/apps/opencs/view/settings/datadisplayformatpage.hpp new file mode 100755 index 0000000000..b785bbd238 --- /dev/null +++ b/apps/opencs/view/settings/datadisplayformatpage.hpp @@ -0,0 +1,33 @@ +#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 diff --git a/apps/opencs/view/world/datadisplaydelegate.cpp b/apps/opencs/view/world/datadisplaydelegate.cpp new file mode 100755 index 0000000000..d838395f6e --- /dev/null +++ b/apps/opencs/view/world/datadisplaydelegate.cpp @@ -0,0 +1,110 @@ +#include "datadisplaydelegate.hpp" +#include +#include + +CSVWorld::DataDisplayDelegate::DataDisplayDelegate(const ValueList &values, + const IconList &icons, + QUndoStack &undoStack, QObject *parent) + : EnumDelegate (values, undoStack, parent), mDisplayMode (Mode_TextOnly), mIcons (icons) + , mIconSize (QSize(16, 16)), mIconLeftOffset(3), mTextLeftOffset(8) +{ + mTextAlignment.setAlignment (Qt::AlignLeft | Qt::AlignVCenter ); + + buildPixmaps(); +} + +void CSVWorld::DataDisplayDelegate::buildPixmaps () +{ + if (mPixmaps.size() > 0) + mPixmaps.clear(); + + IconList::iterator it = mIcons.begin(); + + while (it != mIcons.end()) + { + mPixmaps.push_back (std::make_pair (it->first, it->second.pixmap (mIconSize) ) ); + it++; + } +} + +void CSVWorld::DataDisplayDelegate::setIconSize(const QSize size) +{ + mIconSize = size; + buildPixmaps(); +} + +void CSVWorld::DataDisplayDelegate::setIconLeftOffset(int offset) +{ + mIconLeftOffset = offset; +} + +void CSVWorld::DataDisplayDelegate::setTextLeftOffset(int offset) +{ + mTextLeftOffset = offset; +} + +void CSVWorld::DataDisplayDelegate::paint (QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + painter->save(); + + //default to enum delegate's paint method for text-only conditions + if (mDisplayMode == Mode_TextOnly) + EnumDelegate::paint(painter, option, index); + else + { + unsigned int i = 0; + + for (; i < mValues.size(); ++i) + { + if (mValues.at(i).first == index.data().toInt()) + break; + } + + if (i < mValues.size() ) + paintIcon (painter, option, i); + } + + painter->restore(); +} + +void CSVWorld::DataDisplayDelegate::paintIcon (QPainter *painter, const QStyleOptionViewItem &option, int index) const +{ + //function-level statics + QRect iconRect = option.rect; + QRect textRect = iconRect; + + const QString &text = mValues.at(index).second; + + iconRect.setSize (mIconSize); + iconRect.translate(mIconLeftOffset, (option.rect.height() - iconRect.height())/2); + + if (mDisplayMode == Mode_IconAndText ) + { + textRect.translate (iconRect.width() + mTextLeftOffset, 0 ); + painter->drawText (textRect, text, mTextAlignment); + } + else + iconRect.translate( (option.rect.width() - iconRect.width()) / 2, 0); + + painter->drawPixmap (iconRect, mPixmaps.at(index).second); +} + +CSVWorld::DataDisplayDelegate::~DataDisplayDelegate() +{ + mIcons.clear(); + mPixmaps.clear(); +} + +void CSVWorld::DataDisplayDelegateFactory::add (int enumValue, QString enumName, QString iconFilename) +{ + mIcons.push_back (std::make_pair(enumValue, QIcon(iconFilename))); + EnumDelegateFactory::add(enumValue, enumName); + +} + +CSVWorld::CommandDelegate *CSVWorld::DataDisplayDelegateFactory::makeDelegate (QUndoStack& undoStack, + QObject *parent) const +{ + + return new DataDisplayDelegate (mValues, mIcons, undoStack, parent); +} diff --git a/apps/opencs/view/world/datadisplaydelegate.hpp b/apps/opencs/view/world/datadisplaydelegate.hpp new file mode 100755 index 0000000000..d23b86631c --- /dev/null +++ b/apps/opencs/view/world/datadisplaydelegate.hpp @@ -0,0 +1,85 @@ +#ifndef DATADISPLAYDELEGATE_HPP +#define DATADISPLAYDELEGATE_HPP + +#include +#include "enumdelegate.hpp" + +namespace CSVWorld +{ + + + class DataDisplayDelegate : public EnumDelegate + { + public: + + typedef std::vector < std::pair < int, QIcon > > IconList; + typedef std::vector > ValueList; + + protected: + + enum DisplayMode + { + Mode_TextOnly, + Mode_IconOnly, + Mode_IconAndText + }; + + DisplayMode mDisplayMode; + IconList mIcons; + + private: + + std::vector > mPixmaps; + QTextOption mTextAlignment; + QSize mIconSize; + int mIconLeftOffset; + int mTextLeftOffset; + + public: + explicit DataDisplayDelegate (const ValueList & values, + const IconList & icons, + QUndoStack& undoStack, QObject *parent); + + ~DataDisplayDelegate(); + + virtual void paint (QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; + + /// pass a QSize defining height / width of icon. Default is QSize (16,16). + void setIconSize (const QSize icon); + + /// offset the horizontal position of the icon from the left edge of the cell. Default is 3 pixels. + void setIconLeftOffset (int offset); + + /// offset the horizontal position of the text from the right edge of the icon. Default is 8 pixels. + void setTextLeftOffset (int offset); + + private: + + /// custom paint function for painting the icon. Mode_IconAndText and Mode_Icon only. + void paintIcon (QPainter *painter, const QStyleOptionViewItem &option, int i) const; + + /// rebuild the list of pixmaps from the provided icons (called when icon size is changed) + void buildPixmaps(); + + }; + + class DataDisplayDelegateFactory : public EnumDelegateFactory + { + protected: + + DataDisplayDelegate::IconList mIcons; + + public: + + virtual CommandDelegate *makeDelegate (QUndoStack& undoStack, QObject *parent) const; + ///< The ownership of the returned CommandDelegate is transferred to the caller. + + protected: + + void add (int enumValue,const QString enumName, const QString iconFilename); + + }; + +} + +#endif // DATADISPLAYDELEGATE_HPP diff --git a/apps/opencs/view/world/refidtypedelegate.cpp b/apps/opencs/view/world/refidtypedelegate.cpp new file mode 100755 index 0000000000..d89d2cd319 --- /dev/null +++ b/apps/opencs/view/world/refidtypedelegate.cpp @@ -0,0 +1,67 @@ +#include "refidtypedelegate.hpp" +#include "../../model/world/universalid.hpp" + +CSVWorld::RefIdTypeDelegate::RefIdTypeDelegate + (const ValueList &values, const IconList &icons, QUndoStack& undoStack, QObject *parent) + : DataDisplayDelegate (values, icons, undoStack, parent) +{} + +CSVWorld::RefIdTypeDelegateFactory::RefIdTypeDelegateFactory() +{ + UidTypeList uIdList = buildUidTypeList(); + + for (UidTypeList::const_iterator it = uIdList.begin(); it != uIdList.end(); it++) + { + int i = it->first; + DataDisplayDelegateFactory::add (i, QString::fromStdString(CSMWorld::UniversalId(it->first, "").getTypeName()), it->second); + } +} + +CSVWorld::CommandDelegate *CSVWorld::RefIdTypeDelegateFactory::makeDelegate (QUndoStack& undoStack, + QObject *parent) const +{ + return new RefIdTypeDelegate (mValues, mIcons, undoStack, parent); +} + +CSVWorld::RefIdTypeDelegateFactory::UidTypeList CSVWorld::RefIdTypeDelegateFactory::buildUidTypeList() const +{ + UidTypeList list; + + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_Activator, ":./activator.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_Potion, ":./potion.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_Apparatus, ":./apparatus.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_Armor, ":./armor.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_Book, ":./book.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_Clothing, ":./clothing.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_Container, ":./container.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_Creature, ":./creature.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_Door, ":./door.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_Ingredient, ":./ingredient.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_CreatureLevelledList, ":./creature.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_ItemLevelledList, ":./item.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_Light, ":./light.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_Lockpick, ":./lockpick.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_Miscellaneous, ":./misc.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_Npc, ":./npc.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_Probe, ":./probe.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_Repair, ":./repair.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_Static, ":./static.png")); + list.push_back (std::make_pair (CSMWorld::UniversalId::Type_Weapon, ":./weapon.png")); + + return list; +} + +void CSVWorld::RefIdTypeDelegate::updateEditorSetting (const QString &settingName, const QString &settingValue) +{ + if (settingName == "Referenceable ID Type Display") + { + if (settingValue == "Icon and Text") + mDisplayMode = Mode_IconAndText; + + else if (settingValue == "Icon Only") + mDisplayMode = Mode_IconOnly; + + else if (settingValue == "Text Only") + mDisplayMode = Mode_TextOnly; + } +} diff --git a/apps/opencs/view/world/refidtypedelegate.hpp b/apps/opencs/view/world/refidtypedelegate.hpp new file mode 100755 index 0000000000..0b6b8e079d --- /dev/null +++ b/apps/opencs/view/world/refidtypedelegate.hpp @@ -0,0 +1,37 @@ +#ifndef REFIDTYPEDELEGATE_HPP +#define REFIDTYPEDELEGATE_HPP + +#include "enumdelegate.hpp" +#include "util.hpp" +#include "../../model/world/universalid.hpp" +#include "datadisplaydelegate.hpp" + +namespace CSVWorld +{ + class RefIdTypeDelegate : public DataDisplayDelegate + { + public: + RefIdTypeDelegate (const ValueList &mValues, const IconList &icons, QUndoStack& undoStack, QObject *parent); + + void updateEditorSetting (const QString &settingName, const QString &settingValue); + + }; + + class RefIdTypeDelegateFactory : public DataDisplayDelegateFactory + { + + typedef std::vector < std::pair > UidTypeList; + + public: + RefIdTypeDelegateFactory(); + + virtual CommandDelegate *makeDelegate (QUndoStack& undoStack, QObject *parent) const; + ///< The ownership of the returned CommandDelegate is transferred to the caller. + + private: + UidTypeList buildUidTypeList () const; + + }; +} + +#endif // REFIDTYPEDELEGATE_HPP