1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-02-19 17:09:40 +00:00

IdCompletionManager uses Display type instread of ColumnId for creating completers

This commit is contained in:
Stanislav Bas 2015-06-03 12:01:13 +03:00
parent 4e759370de
commit b25cc6bc55
4 changed files with 70 additions and 118 deletions

View file

@ -11,102 +11,77 @@
namespace
{
std::map<CSMWorld::Columns::ColumnId, CSMWorld::UniversalId::Type> generateModelTypes()
std::map<CSMWorld::ColumnBase::Display, CSMWorld::UniversalId::Type> generateModelTypes()
{
std::map<CSMWorld::Columns::ColumnId, CSMWorld::UniversalId::Type> types;
std::map<CSMWorld::ColumnBase::Display, CSMWorld::UniversalId::Type> types;
types[CSMWorld::Columns::ColumnId_Actor] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::Columns::ColumnId_AreaObject] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::Columns::ColumnId_AreaSound] = CSMWorld::UniversalId::Type_Sound;
types[CSMWorld::Columns::ColumnId_BoltObject] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::Columns::ColumnId_BoltSound] = CSMWorld::UniversalId::Type_Sound;
types[CSMWorld::Columns::ColumnId_CastingObject] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::Columns::ColumnId_CastingSound] = CSMWorld::UniversalId::Type_Sound;
types[CSMWorld::Columns::ColumnId_Cell] = CSMWorld::UniversalId::Type_Cell;
types[CSMWorld::Columns::ColumnId_Class] = CSMWorld::UniversalId::Type_Class;
types[CSMWorld::Columns::ColumnId_CloseSound] = CSMWorld::UniversalId::Type_Sound;
types[CSMWorld::Columns::ColumnId_Creature] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::Columns::ColumnId_DestinationCell] = CSMWorld::UniversalId::Type_Cell;
types[CSMWorld::Columns::ColumnId_Enchantment] = CSMWorld::UniversalId::Type_Enchantment;
types[CSMWorld::Columns::ColumnId_Faction] = CSMWorld::UniversalId::Type_Faction;
types[CSMWorld::Columns::Columnid_Hair] = CSMWorld::UniversalId::Type_BodyPart;
types[CSMWorld::Columns::ColumnId_Head] = CSMWorld::UniversalId::Type_BodyPart;
types[CSMWorld::Columns::ColumnId_HitObject] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::Columns::ColumnId_HitSound] = CSMWorld::UniversalId::Type_Sound;
types[CSMWorld::Columns::ColumnId_Icon] = CSMWorld::UniversalId::Type_Icon;
types[CSMWorld::Columns::ColumnId_InventoryItemId] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::Columns::ColumnId_Key] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::Columns::ColumnId_LevelledItemId] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::Columns::ColumnId_MajorSkill1] = CSMWorld::UniversalId::Type_Skill;
types[CSMWorld::Columns::ColumnId_MajorSkill2] = CSMWorld::UniversalId::Type_Skill;
types[CSMWorld::Columns::ColumnId_MajorSkill3] = CSMWorld::UniversalId::Type_Skill;
types[CSMWorld::Columns::ColumnId_MajorSkill4] = CSMWorld::UniversalId::Type_Skill;
types[CSMWorld::Columns::ColumnId_MajorSkill5] = CSMWorld::UniversalId::Type_Skill;
types[CSMWorld::Columns::ColumnId_MinorSkill1] = CSMWorld::UniversalId::Type_Skill;
types[CSMWorld::Columns::ColumnId_MinorSkill2] = CSMWorld::UniversalId::Type_Skill;
types[CSMWorld::Columns::ColumnId_MinorSkill3] = CSMWorld::UniversalId::Type_Skill;
types[CSMWorld::Columns::ColumnId_MinorSkill4] = CSMWorld::UniversalId::Type_Skill;
types[CSMWorld::Columns::ColumnId_MinorSkill5] = CSMWorld::UniversalId::Type_Skill;
types[CSMWorld::Columns::ColumnId_Model] = CSMWorld::UniversalId::Type_Mesh;
types[CSMWorld::Columns::ColumnId_OpenSound] = CSMWorld::UniversalId::Type_Sound;
types[CSMWorld::Columns::ColumnId_OriginalCreature] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::Columns::ColumnId_Owner] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::Columns::ColumnId_OwnerGlobal] = CSMWorld::UniversalId::Type_Global;
types[CSMWorld::Columns::ColumnId_Particle] = CSMWorld::UniversalId::Type_Texture;
types[CSMWorld::Columns::ColumnId_PartRefMale] = CSMWorld::UniversalId::Type_BodyPart;
types[CSMWorld::Columns::ColumnId_PartRefFemale] = CSMWorld::UniversalId::Type_BodyPart;
types[CSMWorld::Columns::ColumnId_PcFaction] = CSMWorld::UniversalId::Type_Faction;
types[CSMWorld::Columns::ColumnId_Race] = CSMWorld::UniversalId::Type_Race;
types[CSMWorld::Columns::ColumnId_ReferenceableId] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::Columns::ColumnId_Region] = CSMWorld::UniversalId::Type_Region;
types[CSMWorld::Columns::ColumnId_Skill1] = CSMWorld::UniversalId::Type_Skill;
types[CSMWorld::Columns::ColumnId_Skill2] = CSMWorld::UniversalId::Type_Skill;
types[CSMWorld::Columns::ColumnId_Skill3] = CSMWorld::UniversalId::Type_Skill;
types[CSMWorld::Columns::ColumnId_Skill4] = CSMWorld::UniversalId::Type_Skill;
types[CSMWorld::Columns::ColumnId_Skill5] = CSMWorld::UniversalId::Type_Skill;
types[CSMWorld::Columns::ColumnId_Skill6] = CSMWorld::UniversalId::Type_Skill;
types[CSMWorld::Columns::ColumnId_Skill7] = CSMWorld::UniversalId::Type_Skill;
types[CSMWorld::Columns::ColumnId_SleepEncounter] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::Columns::ColumnId_Soul] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::Columns::ColumnId_Sound] = CSMWorld::UniversalId::Type_Sound;
types[CSMWorld::Columns::ColumnId_SoundFile] = CSMWorld::UniversalId::Type_SoundRes;
types[CSMWorld::Columns::ColumnId_SoundName] = CSMWorld::UniversalId::Type_Sound;
types[CSMWorld::Columns::ColumnId_SpellId] = CSMWorld::UniversalId::Type_Spell;
types[CSMWorld::Columns::ColumnId_Script] = CSMWorld::UniversalId::Type_Script;
types[CSMWorld::Columns::ColumnId_TeleportCell] = CSMWorld::UniversalId::Type_Cell;
types[CSMWorld::Columns::ColumnId_Texture] = CSMWorld::UniversalId::Type_Texture;
types[CSMWorld::Columns::ColumnId_Trap] = CSMWorld::UniversalId::Type_Spell;
types[CSMWorld::ColumnBase::Display_BodyPart ] = CSMWorld::UniversalId::Type_BodyPart;
types[CSMWorld::ColumnBase::Display_Cell ] = CSMWorld::UniversalId::Type_Cell;
types[CSMWorld::ColumnBase::Display_Class ] = CSMWorld::UniversalId::Type_Class;
types[CSMWorld::ColumnBase::Display_CreatureLevelledList] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::ColumnBase::Display_Creature ] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::ColumnBase::Display_Enchantment ] = CSMWorld::UniversalId::Type_Enchantment;
types[CSMWorld::ColumnBase::Display_Faction ] = CSMWorld::UniversalId::Type_Faction;
types[CSMWorld::ColumnBase::Display_GlobalVariable ] = CSMWorld::UniversalId::Type_Global;
types[CSMWorld::ColumnBase::Display_Icon ] = CSMWorld::UniversalId::Type_Icon;
types[CSMWorld::ColumnBase::Display_Mesh ] = CSMWorld::UniversalId::Type_Mesh;
types[CSMWorld::ColumnBase::Display_Miscellaneous ] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::ColumnBase::Display_Npc ] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::ColumnBase::Display_Race ] = CSMWorld::UniversalId::Type_Race;
types[CSMWorld::ColumnBase::Display_Region ] = CSMWorld::UniversalId::Type_Region;
types[CSMWorld::ColumnBase::Display_Referenceable ] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::ColumnBase::Display_Script ] = CSMWorld::UniversalId::Type_Script;
types[CSMWorld::ColumnBase::Display_Skill ] = CSMWorld::UniversalId::Type_Skill;
types[CSMWorld::ColumnBase::Display_Sound ] = CSMWorld::UniversalId::Type_Sound;
types[CSMWorld::ColumnBase::Display_SoundRes ] = CSMWorld::UniversalId::Type_SoundRes;
types[CSMWorld::ColumnBase::Display_Spell ] = CSMWorld::UniversalId::Type_Spell;
types[CSMWorld::ColumnBase::Display_Static ] = CSMWorld::UniversalId::Type_Referenceable;
types[CSMWorld::ColumnBase::Display_Texture ] = CSMWorld::UniversalId::Type_Texture;
types[CSMWorld::ColumnBase::Display_Weapon ] = CSMWorld::UniversalId::Type_Referenceable;
return types;
}
typedef std::map<CSMWorld::ColumnBase::Display,
CSMWorld::UniversalId::Type>::const_iterator ModelTypeConstIterator;
}
const std::map<CSMWorld::Columns::ColumnId, CSMWorld::UniversalId::Type>
const std::map<CSMWorld::ColumnBase::Display, CSMWorld::UniversalId::Type>
CSMWorld::IdCompletionManager::sCompleterModelTypes = generateModelTypes();
std::vector<CSMWorld::ColumnBase::Display> CSMWorld::IdCompletionManager::getDisplayTypes()
{
std::vector<CSMWorld::ColumnBase::Display> types;
ModelTypeConstIterator current = sCompleterModelTypes.begin();
ModelTypeConstIterator end = sCompleterModelTypes.end();
for (; current != end; ++current)
{
types.push_back(current->first);
}
return types;
}
CSMWorld::IdCompletionManager::IdCompletionManager(CSMWorld::Data &data)
{
generateCompleters(data);
}
bool CSMWorld::IdCompletionManager::hasCompleterFor(CSMWorld::Columns::ColumnId id) const
bool CSMWorld::IdCompletionManager::hasCompleterFor(CSMWorld::ColumnBase::Display display) const
{
return mCompleters.find(id) != mCompleters.end();
return mCompleters.find(display) != mCompleters.end();
}
boost::shared_ptr<QCompleter> CSMWorld::IdCompletionManager::getCompleter(CSMWorld::Columns::ColumnId id)
boost::shared_ptr<QCompleter> CSMWorld::IdCompletionManager::getCompleter(CSMWorld::ColumnBase::Display display)
{
if (!hasCompleterFor(id))
if (!hasCompleterFor(display))
{
throw std::logic_error("This column doesn't have an ID completer");
}
return mCompleters[id];
return mCompleters[display];
}
void CSMWorld::IdCompletionManager::generateCompleters(CSMWorld::Data &data)
{
typedef std::map<CSMWorld::Columns::ColumnId, CSMWorld::UniversalId::Type>::const_iterator ModelTypeConstIterator;
ModelTypeConstIterator current = sCompleterModelTypes.begin();
ModelTypeConstIterator end = sCompleterModelTypes.end();
for (; current != end; ++current)

View file

@ -1,11 +1,12 @@
#ifndef CSM_WORLD_IDCOMPLETIONMANAGER_HPP
#define CSM_WORLD_IDCOMPLETIONMANAGER_HPP
#include <vector>
#include <map>
#include <boost/shared_ptr.hpp>
#include "columns.hpp"
#include "columnbase.hpp"
#include "universalid.hpp"
class QCompleter;
@ -17,21 +18,23 @@ namespace CSMWorld
/// \brief Creates and stores all ID completers
class IdCompletionManager
{
static const std::map<CSMWorld::Columns::ColumnId, CSMWorld::UniversalId::Type> sCompleterModelTypes;
static const std::map<ColumnBase::Display, UniversalId::Type> sCompleterModelTypes;
std::map<CSMWorld::Columns::ColumnId, boost::shared_ptr<QCompleter> > mCompleters;
std::map<ColumnBase::Display, boost::shared_ptr<QCompleter> > mCompleters;
// Don't allow copying
IdCompletionManager(const IdCompletionManager &);
IdCompletionManager &operator = (const IdCompletionManager &);
void generateCompleters(CSMWorld::Data &data);
void generateCompleters(Data &data);
public:
IdCompletionManager(CSMWorld::Data &data);
static std::vector<ColumnBase::Display> getDisplayTypes();
bool hasCompleterFor(CSMWorld::Columns::ColumnId id) const;
boost::shared_ptr<QCompleter> getCompleter(CSMWorld::Columns::ColumnId id);
IdCompletionManager(Data &data);
bool hasCompleterFor(ColumnBase::Display display) const;
boost::shared_ptr<QCompleter> getCompleter(ColumnBase::Display display);
};
}

View file

@ -1,6 +1,7 @@
#include "viewmanager.hpp"
#include <vector>
#include <map>
#include <QApplication>
@ -10,6 +11,7 @@
#include "../../model/doc/document.hpp"
#include "../../model/world/columns.hpp"
#include "../../model/world/universalid.hpp"
#include "../../model/world/idcompletionmanager.hpp"
#include "../world/util.hpp"
#include "../world/enumdelegate.hpp"
@ -61,38 +63,12 @@ CSVDoc::ViewManager::ViewManager (CSMDoc::DocumentManager& documentManager)
mDelegateFactories->add (CSMWorld::ColumnBase::Display_RefRecordType,
new CSVWorld::IdTypeDelegateFactory());
// Columns with QLineEdit editor
static const CSMWorld::ColumnBase::Display sIdCompletionColumns[] =
std::vector<CSMWorld::ColumnBase::Display> idCompletionColumns = CSMWorld::IdCompletionManager::getDisplayTypes();
for (std::vector<CSMWorld::ColumnBase::Display>::const_iterator current = idCompletionColumns.begin();
current != idCompletionColumns.end();
++current)
{
CSMWorld::ColumnBase::Display_Cell,
CSMWorld::ColumnBase::Display_Class,
CSMWorld::ColumnBase::Display_Creature,
CSMWorld::ColumnBase::Display_Faction,
CSMWorld::ColumnBase::Display_String,
CSMWorld::ColumnBase::Display_GlobalVariable,
CSMWorld::ColumnBase::Display_Icon,
CSMWorld::ColumnBase::Display_Mesh,
CSMWorld::ColumnBase::Display_Miscellaneous,
CSMWorld::ColumnBase::Display_Music,
CSMWorld::ColumnBase::Display_None, // Inplace editing (Table SubView) creates QLineEdit using Display_None
CSMWorld::ColumnBase::Display_Npc,
CSMWorld::ColumnBase::Display_Race,
CSMWorld::ColumnBase::Display_Referenceable,
CSMWorld::ColumnBase::Display_Region,
CSMWorld::ColumnBase::Display_Script,
CSMWorld::ColumnBase::Display_Skill,
CSMWorld::ColumnBase::Display_Sound,
CSMWorld::ColumnBase::Display_SoundRes,
CSMWorld::ColumnBase::Display_Static,
CSMWorld::ColumnBase::Display_String,
CSMWorld::ColumnBase::Display_Texture,
CSMWorld::ColumnBase::Display_Video,
CSMWorld::ColumnBase::Display_Weapon
};
for (std::size_t i = 0; i < sizeof(sIdCompletionColumns) / sizeof(CSMWorld::ColumnBase::Display); ++i)
{
mDelegateFactories->add(sIdCompletionColumns[i], new CSVWorld::IdCompletionDelegateFactory());
mDelegateFactories->add(*current, new CSVWorld::IdCompletionDelegateFactory());
}
struct Mapping

View file

@ -12,7 +12,7 @@ QWidget *CSVWorld::IdCompletionDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
return createEditor(parent, option, index, CSMWorld::ColumnBase::Display_None);
return createEditor(parent, option, index, getDisplayTypeFromIndex(index));
}
QWidget *CSVWorld::IdCompletionDelegate::createEditor(QWidget *parent,
@ -20,16 +20,14 @@ QWidget *CSVWorld::IdCompletionDelegate::createEditor(QWidget *parent,
const QModelIndex &index,
CSMWorld::ColumnBase::Display display) const
{
int columnIdData = index.data(CSMWorld::ColumnBase::Role_ColumnId).toInt();
CSMWorld::Columns::ColumnId columnId = static_cast<CSMWorld::Columns::ColumnId>(columnIdData);
CSMWorld::IdCompletionManager &completionManager = getDocument().getIdCompletionManager();
QWidget *editor = CSVWorld::CommandDelegate::createEditor(parent, option, index, display);
QLineEdit *lineEditor = qobject_cast<QLineEdit *>(editor);
if (lineEditor != NULL && completionManager.hasCompleterFor(columnId))
if (!index.data(Qt::EditRole).isValid() && !index.data(Qt::DisplayRole).isValid())
{
lineEditor->setCompleter(completionManager.getCompleter(columnId).get());
return NULL;
}
CSMWorld::IdCompletionManager &completionManager = getDocument().getIdCompletionManager();
DropLineEdit *editor = new DropLineEdit(parent);
editor->setCompleter(completionManager.getCompleter(display).get());
return editor;
}