diff --git a/apps/opencs/CMakeLists.txt b/apps/opencs/CMakeLists.txt index e7e19be94..8a3d3c1c8 100644 --- a/apps/opencs/CMakeLists.txt +++ b/apps/opencs/CMakeLists.txt @@ -70,6 +70,7 @@ opencs_units (view/world cellcreator pathgridcreator referenceablecreator startscriptcreator referencecreator scenesubview infocreator scriptedit dialoguesubview previewsubview regionmap dragrecordtable nestedtable dialoguespinbox recordbuttonbar tableeditidaction scripterrortable extendedcommandconfigurator + bodypartcreator ) opencs_units_noqt (view/world diff --git a/apps/opencs/view/world/bodypartcreator.cpp b/apps/opencs/view/world/bodypartcreator.cpp new file mode 100644 index 000000000..a9fc3e063 --- /dev/null +++ b/apps/opencs/view/world/bodypartcreator.cpp @@ -0,0 +1,54 @@ +#include "bodypartcreator.hpp" + +#include + +#include "../../model/world/data.hpp" +#include "../../model/world/universalid.hpp" + +std::string CSVWorld::BodyPartCreator::getId() const +{ + std::string id = CSVWorld::GenericCreator::getId(); + + if (mFirstPerson->isChecked()) + { + id += ".1st"; + } + + return id; +} + +CSVWorld::BodyPartCreator::BodyPartCreator( + CSMWorld::Data& data, + QUndoStack& undoStack, + const CSMWorld::UniversalId& id +) : GenericCreator(data, undoStack, id) +{ + mFirstPerson = new QCheckBox("First Person", this); + insertBeforeButtons(mFirstPerson, false); + + connect(mFirstPerson, SIGNAL(clicked(bool)), this, SLOT(checkboxClicked())); +} + +std::string CSVWorld::BodyPartCreator::getErrors() const +{ + std::string errors; + + std::string id = getId(); + if (getData().hasId(id)) + { + errors = "ID is already in use"; + } + + return errors; +} + +void CSVWorld::BodyPartCreator::reset() +{ + CSVWorld::GenericCreator::reset(); + mFirstPerson->setChecked(false); +} + +void CSVWorld::BodyPartCreator::checkboxClicked() +{ + update(); +} diff --git a/apps/opencs/view/world/bodypartcreator.hpp b/apps/opencs/view/world/bodypartcreator.hpp new file mode 100644 index 000000000..3c27136dd --- /dev/null +++ b/apps/opencs/view/world/bodypartcreator.hpp @@ -0,0 +1,47 @@ +#ifndef BODYPARTCREATOR_HPP +#define BODYPARTCREATOR_HPP + +class QCheckBox; + +#include "genericcreator.hpp" + +namespace CSMWorld +{ + class Data; + class UniversalId; +} + +namespace CSVWorld +{ + /// \brief Record creator for body parts. + class BodyPartCreator : public GenericCreator + { + Q_OBJECT + + QCheckBox *mFirstPerson; + + private: + + /// \return ID entered by user. + virtual std::string getId() const; + + public: + + BodyPartCreator( + CSMWorld::Data& data, + QUndoStack& undoStack, + const CSMWorld::UniversalId& id); + + /// \return Error description for current user input. + virtual std::string getErrors() const; + + /// \brief Clear ID and checkbox input widgets. + virtual void reset(); + + private slots: + + void checkboxClicked(); + }; +} + +#endif // BODYPARTCREATOR_HPP diff --git a/apps/opencs/view/world/infocreator.cpp b/apps/opencs/view/world/infocreator.cpp index 243b7d879..f68c69094 100644 --- a/apps/opencs/view/world/infocreator.cpp +++ b/apps/opencs/view/world/infocreator.cpp @@ -45,14 +45,20 @@ CSVWorld::InfoCreator::InfoCreator (CSMWorld::Data& data, QUndoStack& undoStack, const CSMWorld::UniversalId& id, CSMWorld::IdCompletionManager& completionManager) : GenericCreator (data, undoStack, id) { - QLabel *label = new QLabel ("Topic", this); - insertBeforeButtons (label, false); - + // Determine if we're dealing with topics or journals. CSMWorld::ColumnBase::Display displayType = CSMWorld::ColumnBase::Display_Topic; + QString labelText = "Topic"; if (getCollectionId().getType() == CSMWorld::UniversalId::Type_JournalInfos) { displayType = CSMWorld::ColumnBase::Display_Journal; + labelText = "Journal"; } + + QLabel *label = new QLabel (labelText, this); + insertBeforeButtons (label, false); + + // Add topic/journal ID input with auto-completion. + // Only existing topic/journal IDs are accepted so no ID validation is performed. mTopic = new CSVWidget::DropLineEdit(displayType, this); mTopic->setCompleter(completionManager.getCompleter(displayType).get()); insertBeforeButtons (mTopic, true); diff --git a/apps/opencs/view/world/pathgridcreator.cpp b/apps/opencs/view/world/pathgridcreator.cpp index 7d2f46b91..95628a5d9 100644 --- a/apps/opencs/view/world/pathgridcreator.cpp +++ b/apps/opencs/view/world/pathgridcreator.cpp @@ -10,7 +10,6 @@ #include "../../model/world/idtable.hpp" #include "../widget/droplineedit.hpp" -#include "idvalidator.hpp" std::string CSVWorld::PathgridCreator::getId() const { @@ -28,20 +27,19 @@ CSVWorld::PathgridCreator::PathgridCreator( CSMWorld::Data& data, QUndoStack& undoStack, const CSMWorld::UniversalId& id, - CSMWorld::IdCompletionManager& completionManager, - bool relaxedIdRules -) : GenericCreator(data, undoStack, id, relaxedIdRules) + CSMWorld::IdCompletionManager& completionManager +) : GenericCreator(data, undoStack, id) { setManualEditing(false); - QLabel *label = new QLabel("Cell ID", this); + QLabel *label = new QLabel("Cell", this); insertBeforeButtons(label, false); // Add cell ID input with auto-completion. + // Only existing cell IDs are accepted so no ID validation is performed. CSMWorld::ColumnBase::Display displayType = CSMWorld::ColumnBase::Display_Cell; mCell = new CSVWidget::DropLineEdit(displayType, this); mCell->setCompleter(completionManager.getCompleter(displayType).get()); - mCell->setValidator(new IdValidator(relaxedIdRules, this)); insertBeforeButtons(mCell, true); connect(mCell, SIGNAL (textChanged(const QString&)), this, SLOT (cellChanged())); @@ -65,8 +63,6 @@ std::string CSVWorld::PathgridCreator::getErrors() const std::string cellId = getId(); // Check user input for any errors. - // The last two checks, cell with existing pathgrid and non-existent cell, - // shouldn't be needed but we absolutely want to make sure they never happen. std::string errors; if (cellId.empty()) { diff --git a/apps/opencs/view/world/pathgridcreator.hpp b/apps/opencs/view/world/pathgridcreator.hpp index c2ae20fc0..7e82155f6 100644 --- a/apps/opencs/view/world/pathgridcreator.hpp +++ b/apps/opencs/view/world/pathgridcreator.hpp @@ -44,8 +44,7 @@ namespace CSVWorld CSMWorld::Data& data, QUndoStack& undoStack, const CSMWorld::UniversalId& id, - CSMWorld::IdCompletionManager& completionManager, - bool relaxedIdRules = false); + CSMWorld::IdCompletionManager& completionManager); /// \brief Set cell ID input widget to ID of record to be cloned. /// \param originId Cell ID to be cloned. diff --git a/apps/opencs/view/world/referencecreator.cpp b/apps/opencs/view/world/referencecreator.cpp index cc7ae545a..1363f489a 100644 --- a/apps/opencs/view/world/referencecreator.cpp +++ b/apps/opencs/view/world/referencecreator.cpp @@ -35,6 +35,8 @@ CSVWorld::ReferenceCreator::ReferenceCreator (CSMWorld::Data& data, QUndoStack& QLabel *label = new QLabel ("Cell", this); insertBeforeButtons (label, false); + // Add cell ID input with auto-completion. + // Only existing cell IDs are accepted so no ID validation is performed. mCell = new CSVWidget::DropLineEdit(CSMWorld::ColumnBase::Display_Cell, this); mCell->setCompleter(completionManager.getCompleter(CSMWorld::ColumnBase::Display_Cell).get()); insertBeforeButtons (mCell, true); diff --git a/apps/opencs/view/world/startscriptcreator.cpp b/apps/opencs/view/world/startscriptcreator.cpp index 891199027..0eb6bae40 100644 --- a/apps/opencs/view/world/startscriptcreator.cpp +++ b/apps/opencs/view/world/startscriptcreator.cpp @@ -29,15 +29,16 @@ CSVWorld::StartScriptCreator::StartScriptCreator( QUndoStack &undoStack, const CSMWorld::UniversalId &id, CSMWorld::IdCompletionManager& completionManager -) : GenericCreator(data, undoStack, id, true) +) : GenericCreator(data, undoStack, id) { setManualEditing(false); // Add script ID input label. - QLabel *label = new QLabel("Script ID", this); + QLabel *label = new QLabel("Script", this); insertBeforeButtons(label, false); // Add script ID input with auto-completion. + // Only existing script IDs are accepted so no ID validation is performed. CSMWorld::ColumnBase::Display displayType = CSMWorld::ColumnBase::Display_Script; mScript = new CSVWidget::DropLineEdit(displayType, this); mScript->setCompleter(completionManager.getCompleter(displayType).get()); diff --git a/apps/opencs/view/world/subviews.cpp b/apps/opencs/view/world/subviews.cpp index 93e105106..7c27bdf7a 100644 --- a/apps/opencs/view/world/subviews.cpp +++ b/apps/opencs/view/world/subviews.cpp @@ -17,6 +17,7 @@ #include "infocreator.hpp" #include "pathgridcreator.hpp" #include "previewsubview.hpp" +#include "bodypartcreator.hpp" void CSVWorld::addSubViewFactories (CSVDoc::SubViewFactoryManager& manager) { @@ -41,7 +42,6 @@ void CSVWorld::addSubViewFactories (CSVDoc::SubViewFactoryManager& manager) CSMWorld::UniversalId::Type_Birthsigns, CSMWorld::UniversalId::Type_Spells, CSMWorld::UniversalId::Type_Enchantments, - CSMWorld::UniversalId::Type_BodyParts, CSMWorld::UniversalId::Type_SoundGens, CSMWorld::UniversalId::Type_None // end marker @@ -51,6 +51,9 @@ void CSVWorld::addSubViewFactories (CSVDoc::SubViewFactoryManager& manager) manager.add (sTableTypes[i], new CSVDoc::SubViewFactoryWithCreator >); + manager.add (CSMWorld::UniversalId::Type_BodyParts, + new CSVDoc::SubViewFactoryWithCreator >); + manager.add (CSMWorld::UniversalId::Type_StartScripts, new CSVDoc::SubViewFactoryWithCreator); @@ -129,7 +132,6 @@ void CSVWorld::addSubViewFactories (CSVDoc::SubViewFactoryManager& manager) CSMWorld::UniversalId::Type_Sound, CSMWorld::UniversalId::Type_Faction, CSMWorld::UniversalId::Type_Enchantment, - CSMWorld::UniversalId::Type_BodyPart, CSMWorld::UniversalId::Type_SoundGen, CSMWorld::UniversalId::Type_None // end marker @@ -140,6 +142,9 @@ void CSVWorld::addSubViewFactories (CSVDoc::SubViewFactoryManager& manager) new CSVDoc::SubViewFactoryWithCreator > (false)); + manager.add (CSMWorld::UniversalId::Type_BodyPart, + new CSVDoc::SubViewFactoryWithCreator > (false)); + manager.add (CSMWorld::UniversalId::Type_StartScript, new CSVDoc::SubViewFactoryWithCreator(false));