diff --git a/apps/opencs/CMakeLists.txt b/apps/opencs/CMakeLists.txt index 9787719af..d30c92350 100644 --- a/apps/opencs/CMakeLists.txt +++ b/apps/opencs/CMakeLists.txt @@ -61,7 +61,7 @@ opencs_units (view/world ) opencs_units_noqt (view/world - dialoguesubview util subviews enumdelegate vartypedelegate scripthighlighter + dialoguesubview util subviews enumdelegate vartypedelegate scripthighlighter recordstatusdelegate ) diff --git a/apps/opencs/model/world/columnbase.hpp b/apps/opencs/model/world/columnbase.hpp index 8cc435f3a..e71e633a4 100644 --- a/apps/opencs/model/world/columnbase.hpp +++ b/apps/opencs/model/world/columnbase.hpp @@ -41,7 +41,8 @@ namespace CSMWorld Display_ArmorType, Display_ClothingType, Display_CreatureType, - Display_WeaponType + Display_WeaponType, + Display_RecordState }; std::string mTitle; diff --git a/apps/opencs/model/world/columns.hpp b/apps/opencs/model/world/columns.hpp index f1d8d4ae6..649ae192f 100644 --- a/apps/opencs/model/world/columns.hpp +++ b/apps/opencs/model/world/columns.hpp @@ -53,7 +53,7 @@ namespace CSMWorld template struct RecordStateColumn : public Column { - RecordStateColumn() : Column ("*", ColumnBase::Display_Integer) {} + RecordStateColumn() : Column ("*", ColumnBase::Display_RecordState) {} virtual QVariant get (const Record& record) const { @@ -775,4 +775,4 @@ namespace CSMWorld }; } -#endif \ No newline at end of file +#endif diff --git a/apps/opencs/view/doc/viewmanager.cpp b/apps/opencs/view/doc/viewmanager.cpp index d044098fe..97dd8b997 100644 --- a/apps/opencs/view/doc/viewmanager.cpp +++ b/apps/opencs/view/doc/viewmanager.cpp @@ -12,6 +12,7 @@ #include "../world/util.hpp" #include "../world/enumdelegate.hpp" #include "../world/vartypedelegate.hpp" +#include "../world/recordstatusdelegate.hpp" #include "view.hpp" @@ -117,6 +118,9 @@ CSVDoc::ViewManager::ViewManager (CSMDoc::DocumentManager& documentManager) mDelegateFactories->add (CSMWorld::ColumnBase::Display_WeaponType, new CSVWorld::EnumDelegateFactory (sWeaponTypes)); + + mDelegateFactories->add (CSMWorld::ColumnBase::Display_RecordState, + new CSVWorld::RecordStatusDelegateFactory() ); } CSVDoc::ViewManager::~ViewManager() diff --git a/apps/opencs/view/world/recordstatusdelegate.cpp b/apps/opencs/view/world/recordstatusdelegate.cpp new file mode 100644 index 000000000..c9dbff4f5 --- /dev/null +++ b/apps/opencs/view/world/recordstatusdelegate.cpp @@ -0,0 +1,111 @@ +#include "recordstatusdelegate.hpp" +#include +#include +#include +#include + +#include + +CSVWorld::RecordStatusDelegate::RecordStatusDelegate(QUndoStack &undoStack, QObject *parent) + : CommandDelegate (undoStack, parent) +{ + mModifiedIcon = new QIcon (":./modified.png"); + mAddedIcon = new QIcon (":./added.png"); + mDeletedIcon = new QIcon (":./removed.png"); + mIconSize = 16; + + //Offset values are most likely device-dependent. + //Need to replace with device-independent references. + mTextTopOffset = -1; + mTextLeftOffset = 3; + mIconTopOffset = -3; + mIconLeftOffset = 0; + + mStatusDisplay = 0; //icons and text by default +} + +void CSVWorld::RecordStatusDelegate::paint (QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + painter->save(); + + QFont font = QApplication::font(); + font.setPointSize(10); + + QFontMetrics fm(font); + + QString text = ""; + QIcon *icon = 0; + + switch (index.data().toInt()) + { + case 0: // State_BaseOnly + text = "base"; + break; + + case 1: // State_Modified + text = "modified"; + icon = mModifiedIcon; + break; + + case 2: // State_Modified_Only + text = "added"; + icon = mAddedIcon; + break; + + case 3: // State_Deleted + + case 4: // State_Erased + text = "deleted"; + icon = mDeletedIcon; + break; + + default: + break; + } + + QRect textRect = option.rect; + QRect iconRect = option.rect; + + //for icon-only (1), default option.rect centers icon left-to-right + //otherwise, size option.rect to fit the icon, forcing left-alignment with text + iconRect.setTop (iconRect.top() + mIconTopOffset); + iconRect.setBottom (iconRect.top() + mIconSize); + + if (mStatusDisplay == 0 && (icon) ) + { + iconRect.setRight (iconRect.left() + mIconSize); + textRect.setLeft (iconRect.right() + (mIconSize/4) * 3); + textRect.setRight (textRect.left() + fm.width(text)); + } + else + textRect.setLeft (textRect.left() + mTextLeftOffset ); + + textRect.setTop (textRect.top() + ((option.rect.height() - fm.height()) / 2) + mTextTopOffset); + + if (mStatusDisplay == 0 || mStatusDisplay == 1) + { + if (icon) + painter->drawPixmap(iconRect.center(),icon->pixmap(mIconSize, mIconSize)); + } + + // icon + text or text only, or force text if no icon exists for status + if (mStatusDisplay == 0 || mStatusDisplay == 2 || !(icon) ) + { + painter->setFont(font); + painter->drawText(textRect,text); + } + + painter->restore(); + +} + +QSize CSVWorld::RecordStatusDelegate::sizeHint (const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + return QSize(); +} + +CSVWorld::CommandDelegate *CSVWorld::RecordStatusDelegateFactory::makeDelegate (QUndoStack& undoStack, + QObject *parent) const +{ + return new RecordStatusDelegate (undoStack, parent); +} diff --git a/apps/opencs/view/world/recordstatusdelegate.hpp b/apps/opencs/view/world/recordstatusdelegate.hpp new file mode 100644 index 000000000..a2ec34822 --- /dev/null +++ b/apps/opencs/view/world/recordstatusdelegate.hpp @@ -0,0 +1,45 @@ +#ifndef RECORDSTATUSDELEGATE_H +#define RECORDSTATUSDELEGATE_H + +#include "util.hpp" + +class QIcon; + +namespace CSVWorld +{ + class RecordStatusDelegate : public CommandDelegate + { + + QIcon *mModifiedIcon; + QIcon *mAddedIcon; + QIcon *mDeletedIcon; + int mStatusDisplay; + + int mIconSize; + int mIconTopOffset; + int mIconLeftOffset; + int mTextTopOffset; + int mTextLeftOffset; + + public: + explicit RecordStatusDelegate(QUndoStack& undoStack, QObject *parent = 0); + + void paint (QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; + + QSize sizeHint (const QStyleOptionViewItem &option, const QModelIndex &index) const; + + }; + + class RecordStatusDelegateFactory : public CommandDelegateFactory + { + //std::vector > mValues; + + public: + + virtual CommandDelegate *makeDelegate (QUndoStack& undoStack, QObject *parent) const; + ///< The ownership of the returned CommandDelegate is transferred to the caller. + + }; +} +#endif // RECORDSTATUSDELEGATE_H + diff --git a/files/opencs/resources.qrc b/files/opencs/resources.qrc index ecfab44a2..e2ad0ffd6 100644 --- a/files/opencs/resources.qrc +++ b/files/opencs/resources.qrc @@ -1,5 +1,8 @@ opencs.png + added.png + modified.png + removed.png