diff options
| author | Ben Boeckel <MathStuf@gmail.com> | 2008-05-26 01:32:07 +0000 |
|---|---|---|
| committer | Ben Boeckel <MathStuf@gmail.com> | 2008-05-26 01:32:07 +0000 |
| commit | ff8c440c3a2aeb0e1abc6f93e9dd7775533382ff (patch) | |
| tree | 302ac68425cecc61d429c64cf8676ad37d1d4f12 | |
| parent | 7e3bf1853184f96eb5be47dd78ebe21fdc170a01 (diff) | |
| download | sigen-ff8c440c3a2aeb0e1abc6f93e9dd7775533382ff.tar.gz sigen-ff8c440c3a2aeb0e1abc6f93e9dd7775533382ff.tar.xz sigen-ff8c440c3a2aeb0e1abc6f93e9dd7775533382ff.zip | |
[FIX] Context menus added
[FIX] No more copy/cut/paste for objects; only available from context menus
[FIX] Can now add objects during runtime
git-svn-id: https://pokegen.svn.sourceforge.net/svnroot/pokegen/trunk@174 6ecfd1a5-f3ed-3746-8530-beee90d26b22
127 files changed, 1788 insertions, 259 deletions
@@ -1,4 +1,13 @@ ----------------- +Rev: 174 +Date: 25 May 2008 +User: MathStuf +----------------- +[FIX] Context menus added +[FIX] No more copy/cut/paste for objects; only available from context menus +[FIX] Can now add objects during runtime + +----------------- Rev: 173 Date: 25 May 2008 User: MathStuf diff --git a/pokemod/pokemod.pro b/pokemod/pokemod.pro index f366afe7..56e54ce7 100644 --- a/pokemod/pokemod.pro +++ b/pokemod/pokemod.pro @@ -8,6 +8,7 @@ CONFIG += qt \ warn_on \ dll QT += xml + !win32 { CONFIG += debug } diff --git a/pokemodr/PokeModrUI.cpp b/pokemodr/PokeModrUI.cpp index 7ea15841..7dff096d 100644 --- a/pokemodr/PokeModrUI.cpp +++ b/pokemodr/PokeModrUI.cpp @@ -64,26 +64,13 @@ PokeModrUI::PokeModrUI(KConfigGroup config, KConfigGroup history, QWidget* paren menuFile->addAction(KStandardAction::save(this, SLOT(savePokemod()), menuFile)); menuFile->addAction(KStandardAction::saveAs(this, SLOT(saveAsPokemod()), menuFile)); menuFile->addSeparator(); - menuFile->addAction(KStandardAction::quit(this, SLOT(quit()), menuFile)); + menuFile->addAction(KStandardAction::quit(this, SLOT(closeAllPokemods()), menuFile)); menubar->addMenu(menuFile); KMenu* menuEdit = new KMenu("&Edit", menubar); menuEdit->addAction(KStandardAction::cut(menuEdit)); menuEdit->addAction(KStandardAction::copy(menuEdit)); menuEdit->addAction(KStandardAction::paste(menuEdit)); menuEdit->addSeparator(); - KAction* menuCut = new KAction(KIcon("edit-cut"), "Cu&t Object", menuEdit); - menuCut->setShortcut(KShortcut("Alt+X")); - menuEdit->addAction(menuCut); - connect(menuCut, SIGNAL(triggered()), this, SLOT(cutObject())); - KAction* menuCopy = new KAction(KIcon("edit-copy"), "Cop&y Object", menuEdit); - menuCopy->setShortcut(KShortcut("Alt+C")); - menuEdit->addAction(menuCopy); - connect(menuCopy, SIGNAL(triggered()), this, SLOT(copyObject())); - KAction* menuPaste = new KAction(KIcon("edit-paste"), "Past&e Object", menuEdit); - menuPaste->setShortcut(KShortcut("Alt+V")); - menuEdit->addAction(menuPaste); - connect(menuPaste, SIGNAL(triggered()), this, SLOT(pasteObject())); - menuEdit->addSeparator(); menuEdit->addAction(KStandardAction::preferences(this, SLOT(preferences()), menuEdit)); menubar->addMenu(menuEdit); menubar->addMenu(customHelpMenu(false)); @@ -101,19 +88,9 @@ PokeModrUI::PokeModrUI(KConfigGroup config, KConfigGroup history, QWidget* paren toolbar->addAction(KStandardAction::copy(toolbar)); toolbar->addAction(KStandardAction::paste(toolbar)); toolbar->addSeparator(); - KAction* toolbarCut = new KAction(KIcon("edit-cut"), "Cu&t Object", toolbar); - toolbar->addAction(toolbarCut); - connect(toolbarCut, SIGNAL(triggered()), this, SLOT(cutObject())); - KAction* toolbarCopy = new KAction(KIcon("edit-copy"), "Cop&y Object", toolbar); - toolbar->addAction(toolbarCopy); - connect(toolbarCopy, SIGNAL(triggered()), this, SLOT(copyObject())); - KAction* toolbarPaste = new KAction(KIcon("edit-paste"), "Past&e Object", toolbar); - toolbar->addAction(toolbarPaste); - connect(toolbarPaste, SIGNAL(triggered()), this, SLOT(pasteObject())); - toolbar->addSeparator(); toolbar->addAction(KStandardAction::preferences(this, SLOT(preferences()), toolbar)); toolbar->addSeparator(); - toolbar->addAction(KStandardAction::quit(this, SLOT(quit()), toolbar)); + toolbar->addAction(KStandardAction::quit(this, SLOT(closeAllPokemods()), toolbar)); addToolBar(toolbar); splitter->setSizes(QList<int>() << config.readEntry("treeWidth", 100) << config.readEntry("panelWidth", 100)); connect(buttonApply, SIGNAL(clicked()), this, SLOT(update())); @@ -333,14 +310,11 @@ bool PokeModrUI::closeAllPokemods(const bool force) else ++i; } + if (!pokemods.size() || force) + close(); return !pokemods.size(); } -void PokeModrUI::cutObject() -{ - m_clipboard = treePokemod->cut(treePokemod->currentIndex()); -} - void PokeModrUI::copyObject() { m_clipboard = treePokemod->copy(treePokemod->currentIndex()); @@ -364,6 +338,8 @@ void PokeModrUI::on_splitter_splitterMoved() void PokeModrUI::on_treePokemod_clicked(const QModelIndex& index) { + if (!(treePokemod->model()->flags(index) & Qt::ItemIsSelectable)) + return; ObjectUI* widget = treePokemod->editorWidget(index); if (widget) { @@ -396,5 +372,5 @@ void PokeModrUI::on_treePokemod_customContextMenuRequested(const QPoint& positio { KMenu* menu = treePokemod->contextMenu(treePokemod->indexAt(position)); if (menu) - menu->popup(mapToGlobal(position)); + menu->popup(treePokemod->mapToGlobal(position)); } diff --git a/pokemodr/PokeModrUI.h b/pokemodr/PokeModrUI.h index 72100974..2b35a612 100644 --- a/pokemodr/PokeModrUI.h +++ b/pokemodr/PokeModrUI.h @@ -62,7 +62,6 @@ class PokeModrUI : public KMainWindow, private Ui::formPokeModr void closePokemod(); bool closePokemod(const Pokemod* pokemod, const bool force = false); bool closeAllPokemods(const bool force = false); - void cutObject(); void copyObject(); void pasteObject(); void preferences(); diff --git a/pokemodr/PokemodTree.cpp b/pokemodr/PokemodTree.cpp index 35b41017..661b5c85 100644 --- a/pokemodr/PokemodTree.cpp +++ b/pokemodr/PokemodTree.cpp @@ -69,12 +69,6 @@ const Pokemod* PokemodTree::currentPokemod() const return NULL; } -QDomDocument PokemodTree::cut(const QModelIndex& index) -{ - // TODO: actually cut out the item - return copy(index); -} - QDomDocument PokemodTree::copy(const QModelIndex& index) { QDomDocument xml; diff --git a/pokemodr/PokemodTree.h b/pokemodr/PokemodTree.h index 41b8b283..07a312b1 100644 --- a/pokemodr/PokemodTree.h +++ b/pokemodr/PokemodTree.h @@ -44,7 +44,6 @@ class PokemodTree : public QTreeView const Pokemod* currentPokemod() const; - QDomDocument cut(const QModelIndex& index); QDomDocument copy(const QModelIndex& index); void paste(const QModelIndex& index, const QDomDocument& data); diff --git a/pokemodr/TODO b/pokemodr/TODO index bc1ccbe4..7ed3a9c2 100644 --- a/pokemodr/TODO +++ b/pokemodr/TODO @@ -1,12 +1,7 @@ -MoveEffect - -Dialog command widgets - -Safeguard against closing with unsaved changes - Set sub class stuff by passing it on to subclasses via setData TilemapModel is (probably) wrong Models: - ContextMenuRole + ContextMenu - Copy/Paste entries + Fix up deleting diff --git a/pokemodr/gui/pokemodr.ui b/pokemodr/gui/pokemodr.ui index fe77d64c..ae794664 100644 --- a/pokemodr/gui/pokemodr.ui +++ b/pokemodr/gui/pokemodr.ui @@ -12,6 +12,9 @@ <bool>false</bool> </property> <widget class="PokemodTree" name="treePokemod" > + <property name="contextMenuPolicy" > + <enum>Qt::CustomContextMenu</enum> + </property> <property name="acceptDrops" > <bool>true</bool> </property> @@ -62,7 +65,7 @@ <item> <widget class="QScrollArea" name="formPanel" > <property name="alignment" > - <enum>Qt::AlignHCenter</enum> + <set>Qt::AlignHCenter</set> </property> </widget> </item> diff --git a/pokemodr/models/AbilityGroupModel.cpp b/pokemodr/models/AbilityGroupModel.cpp index 76c06764..482576cf 100644 --- a/pokemodr/models/AbilityGroupModel.cpp +++ b/pokemodr/models/AbilityGroupModel.cpp @@ -22,21 +22,49 @@ #include "AbilityModel.h" // Pokemod includes +#include "../../pokemod/Ability.h" #include "../../pokemod/Pokemod.h" +// KDE includes +#include <KMenu> + AbilityGroupModel::AbilityGroupModel(BaseModel* parent, Pokemod* pokemod) : GroupModel(parent, pokemod, "Abilities") { - setupData(); + for (int i = 0; i < pokemod->abilityCount(); ++i) + addObject(pokemod->ability(i)); } AbilityGroupModel::~AbilityGroupModel() { } -void AbilityGroupModel::setupData() +QVariant AbilityGroupModel::data(const int role) const { - Pokemod* pokemod = static_cast<Pokemod*>(m_object); - for (int i = 0; i < pokemod->abilityCount(); ++i) - m_objects.append(new AbilityModel(this, pokemod->ability(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Ability", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void AbilityGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Pokemod*>(m_object)->newAbility(); + if (object->className() == "Ability") + m_objects.append(new AbilityModel(this, static_cast<Ability*>(object))); +} + +void AbilityGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Pokemod*>(m_object)->deleteAbility(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/AbilityGroupModel.h b/pokemodr/models/AbilityGroupModel.h index 29eba507..e7fb8160 100644 --- a/pokemodr/models/AbilityGroupModel.h +++ b/pokemodr/models/AbilityGroupModel.h @@ -26,11 +26,16 @@ class Pokemod; class AbilityGroupModel : public GroupModel { + Q_OBJECT + public: AbilityGroupModel(BaseModel* parent, Pokemod* pokemod); ~AbilityGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/AbilityModel.cpp b/pokemodr/models/AbilityModel.cpp index a76a6c87..687fdd2d 100644 --- a/pokemodr/models/AbilityModel.cpp +++ b/pokemodr/models/AbilityModel.cpp @@ -18,6 +18,9 @@ // Header include #include "AbilityModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../AbilityUI.h" @@ -27,6 +30,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + AbilityModel::AbilityModel(BaseModel* parent, Ability* ability) : ObjectModel(parent, ability) { @@ -51,6 +57,12 @@ QVariant AbilityModel::data(int role) const QWidget* widget = new AbilityUI(static_cast<Ability*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Ability", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -75,3 +87,8 @@ bool AbilityModel::setData(const QVariant& value, int role) } return false; } + +void AbilityModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/AbilityModel.h b/pokemodr/models/AbilityModel.h index 005b1066..b2a8f14d 100644 --- a/pokemodr/models/AbilityModel.h +++ b/pokemodr/models/AbilityModel.h @@ -26,6 +26,8 @@ class Ability; class AbilityModel : public ObjectModel { + Q_OBJECT + public: AbilityModel(BaseModel* parent, Ability* ability); ~AbilityModel(); @@ -33,6 +35,8 @@ class AbilityModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/AuthorGroupModel.cpp b/pokemodr/models/AuthorGroupModel.cpp index 270a0c0d..88ae74f7 100644 --- a/pokemodr/models/AuthorGroupModel.cpp +++ b/pokemodr/models/AuthorGroupModel.cpp @@ -22,21 +22,49 @@ #include "AuthorModel.h" // Pokemod includes +#include "../../pokemod/Author.h" #include "../../pokemod/Pokemod.h" +// KDE includes +#include <KMenu> + AuthorGroupModel::AuthorGroupModel(BaseModel* parent, Pokemod* pokemod) : GroupModel(parent, pokemod, "Authors") { - setupData(); + for (int i = 0; i < pokemod->authorCount(); ++i) + addObject(pokemod->author(i)); } AuthorGroupModel::~AuthorGroupModel() { } -void AuthorGroupModel::setupData() +QVariant AuthorGroupModel::data(const int role) const { - Pokemod* pokemod = static_cast<Pokemod*>(m_object); - for (int i = 0; i < pokemod->authorCount(); ++i) - m_objects.append(new AuthorModel(this, pokemod->author(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Author", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void AuthorGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Pokemod*>(m_object)->newAuthor(); + if (object->className() == "Author") + m_objects.append(new AuthorModel(this, static_cast<Author*>(object))); +} + +void AuthorGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Pokemod*>(m_object)->deleteAuthor(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/AuthorGroupModel.h b/pokemodr/models/AuthorGroupModel.h index 7381ca8b..d5c0f858 100644 --- a/pokemodr/models/AuthorGroupModel.h +++ b/pokemodr/models/AuthorGroupModel.h @@ -26,11 +26,16 @@ class Pokemod; class AuthorGroupModel : public GroupModel { + Q_OBJECT + public: AuthorGroupModel(BaseModel* parent, Pokemod* pokemod); ~AuthorGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/AuthorModel.cpp b/pokemodr/models/AuthorModel.cpp index c2597098..ef71d814 100644 --- a/pokemodr/models/AuthorModel.cpp +++ b/pokemodr/models/AuthorModel.cpp @@ -18,6 +18,9 @@ // Header include #include "AuthorModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../AuthorUI.h" @@ -27,6 +30,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + AuthorModel::AuthorModel(BaseModel* parent, Author* author) : ObjectModel(parent, author) { @@ -51,6 +57,12 @@ QVariant AuthorModel::data(int role) const QWidget* widget = new AuthorUI(static_cast<Author*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Author", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -75,3 +87,8 @@ bool AuthorModel::setData(const QVariant& value, int role) } return false; } + +void AuthorModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/AuthorModel.h b/pokemodr/models/AuthorModel.h index b924d12d..e6bbceda 100644 --- a/pokemodr/models/AuthorModel.h +++ b/pokemodr/models/AuthorModel.h @@ -26,6 +26,8 @@ class Author; class AuthorModel : public ObjectModel { + Q_OBJECT + public: AuthorModel(BaseModel* parent, Author* author); ~AuthorModel(); @@ -33,6 +35,8 @@ class AuthorModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/BadgeGroupModel.cpp b/pokemodr/models/BadgeGroupModel.cpp index 733abe11..22b55626 100644 --- a/pokemodr/models/BadgeGroupModel.cpp +++ b/pokemodr/models/BadgeGroupModel.cpp @@ -22,21 +22,49 @@ #include "BadgeModel.h" // Pokemod includes +#include "../../pokemod/Badge.h" #include "../../pokemod/Pokemod.h" +// KDE includes +#include <KMenu> + BadgeGroupModel::BadgeGroupModel(BaseModel* parent, Pokemod* pokemod) : GroupModel(parent, pokemod, "Badges") { - setupData(); + for (int i = 0; i < pokemod->badgeCount(); ++i) + addObject(pokemod->badge(i)); } BadgeGroupModel::~BadgeGroupModel() { } -void BadgeGroupModel::setupData() +QVariant BadgeGroupModel::data(const int role) const { - Pokemod* pokemod = static_cast<Pokemod*>(m_object); - for (int i = 0; i < pokemod->badgeCount(); ++i) - m_objects.append(new BadgeModel(this, pokemod->badge(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Badge", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void BadgeGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Pokemod*>(m_object)->newBadge(); + if (object->className() == "Badge") + m_objects.append(new BadgeModel(this, static_cast<Badge*>(object))); +} + +void BadgeGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Pokemod*>(m_object)->deleteBadge(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/BadgeGroupModel.h b/pokemodr/models/BadgeGroupModel.h index e7f6aa1a..dcd7e8e9 100644 --- a/pokemodr/models/BadgeGroupModel.h +++ b/pokemodr/models/BadgeGroupModel.h @@ -26,11 +26,16 @@ class Pokemod; class BadgeGroupModel : public GroupModel { + Q_OBJECT + public: BadgeGroupModel(BaseModel* parent, Pokemod* pokemod); ~BadgeGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/BadgeModel.cpp b/pokemodr/models/BadgeModel.cpp index f750255e..a373efef 100644 --- a/pokemodr/models/BadgeModel.cpp +++ b/pokemodr/models/BadgeModel.cpp @@ -18,6 +18,9 @@ // Header include #include "BadgeModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../BadgeUI.h" @@ -27,6 +30,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + BadgeModel::BadgeModel(BaseModel* parent, Badge* badge) : ObjectModel(parent, badge) { @@ -51,6 +57,12 @@ QVariant BadgeModel::data(int role) const QWidget* widget = new BadgeUI(static_cast<Badge*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Badge", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -75,3 +87,8 @@ bool BadgeModel::setData(const QVariant& value, int role) } return false; } + +void BadgeModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/BadgeModel.h b/pokemodr/models/BadgeModel.h index 0a06821f..4c67796c 100644 --- a/pokemodr/models/BadgeModel.h +++ b/pokemodr/models/BadgeModel.h @@ -26,6 +26,8 @@ class Badge; class BadgeModel : public ObjectModel { + Q_OBJECT + public: BadgeModel(BaseModel* parent, Badge* badge); ~BadgeModel(); @@ -33,6 +35,8 @@ class BadgeModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/BaseModel.h b/pokemodr/models/BaseModel.h index d2a5b5e6..2c0eb648 100644 --- a/pokemodr/models/BaseModel.h +++ b/pokemodr/models/BaseModel.h @@ -25,8 +25,10 @@ // Forward declarations class Object; -class BaseModel +class BaseModel : public QObject { + Q_OBJECT + public: BaseModel(BaseModel* parent, Object* object, const QString& name = ""); virtual ~BaseModel(); diff --git a/pokemodr/models/BaseObjectModel.h b/pokemodr/models/BaseObjectModel.h index f18ce8a4..309ff8d9 100644 --- a/pokemodr/models/BaseObjectModel.h +++ b/pokemodr/models/BaseObjectModel.h @@ -23,6 +23,8 @@ class BaseObjectModel : public BaseModel { + Q_OBJECT + public: BaseObjectModel(BaseModel* parent, Object* object); virtual ~BaseObjectModel(); diff --git a/pokemodr/models/CoinListGroupModel.cpp b/pokemodr/models/CoinListGroupModel.cpp index 56eeaae3..74f6d3c0 100644 --- a/pokemodr/models/CoinListGroupModel.cpp +++ b/pokemodr/models/CoinListGroupModel.cpp @@ -22,21 +22,49 @@ #include "CoinListModel.h" // Pokemod includes +#include "../../pokemod/CoinList.h" #include "../../pokemod/Pokemod.h" +// KDE includes +#include <KMenu> + CoinListGroupModel::CoinListGroupModel(BaseModel* parent, Pokemod* pokemod) : GroupModel(parent, pokemod, "Coin Lists") { - setupData(); + for (int i = 0; i < pokemod->coinListCount(); ++i) + addObject(pokemod->coinList(i)); } CoinListGroupModel::~CoinListGroupModel() { } -void CoinListGroupModel::setupData() +QVariant CoinListGroupModel::data(const int role) const { - Pokemod* pokemod = static_cast<Pokemod*>(m_object); - for (int i = 0; i < pokemod->coinListCount(); ++i) - m_objects.append(new CoinListModel(this, pokemod->coinList(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Coin List", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void CoinListGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Pokemod*>(m_object)->newCoinList(); + if (object->className() == "CoinList") + m_objects.append(new CoinListModel(this, static_cast<CoinList*>(object))); +} + +void CoinListGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Pokemod*>(m_object)->deleteCoinList(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/CoinListGroupModel.h b/pokemodr/models/CoinListGroupModel.h index 6cde6483..f0a37623 100644 --- a/pokemodr/models/CoinListGroupModel.h +++ b/pokemodr/models/CoinListGroupModel.h @@ -26,11 +26,16 @@ class Pokemod; class CoinListGroupModel : public GroupModel { + Q_OBJECT + public: CoinListGroupModel(BaseModel* parent, Pokemod* pokemod); ~CoinListGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/CoinListModel.cpp b/pokemodr/models/CoinListModel.cpp index e12a3908..ab05058e 100644 --- a/pokemodr/models/CoinListModel.cpp +++ b/pokemodr/models/CoinListModel.cpp @@ -26,10 +26,14 @@ // Pokemod includes #include "../../pokemod/CoinList.h" +#include "../../pokemod/CoinListObject.h" // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + CoinListModel::CoinListModel(BaseModel* parent, CoinList* coinList) : GroupObjectModel(parent, coinList) { @@ -56,6 +60,14 @@ QVariant CoinListModel::data(int role) const QWidget* widget = new CoinListUI(static_cast<CoinList*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Object", this, SLOT(addObject())); + menu->addSeparator(); + menu->addAction("Delete Coin List", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return GroupObjectModel::data(role); } @@ -83,6 +95,30 @@ bool CoinListModel::setData(const QVariant& value, int role) return false; } +void CoinListModel::addObject(Object* object) +{ + if (!object) + object = static_cast<CoinList*>(m_object)->newObject(); + if (object->className() == "CoinListObject") + m_objects.append(new CoinListObjectModel(this, static_cast<CoinListObject*>(object))); +} + +void CoinListModel::deleteObject(BaseModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<CoinList*>(m_object)->deleteObject(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } +} + +void CoinListModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} + void CoinListModel::setupData() { CoinList* coinList = static_cast<CoinList*>(m_object); diff --git a/pokemodr/models/CoinListModel.h b/pokemodr/models/CoinListModel.h index 72039a66..a0615a82 100644 --- a/pokemodr/models/CoinListModel.h +++ b/pokemodr/models/CoinListModel.h @@ -26,6 +26,8 @@ class CoinList; class CoinListModel : public GroupObjectModel { + Q_OBJECT + public: CoinListModel(BaseModel* parent, CoinList* coinList); ~CoinListModel(); @@ -33,6 +35,11 @@ class CoinListModel : public GroupObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseModel* model); + + void deleteSelf(); protected: void setupData(); }; diff --git a/pokemodr/models/CoinListObjectModel.cpp b/pokemodr/models/CoinListObjectModel.cpp index 0bf7152f..996378a5 100644 --- a/pokemodr/models/CoinListObjectModel.cpp +++ b/pokemodr/models/CoinListObjectModel.cpp @@ -18,6 +18,9 @@ // Header include #include "CoinListObjectModel.h" +// Model includes +#include "GroupObjectModel.h" + // PokeModr includes #include "../CoinListObjectUI.h" @@ -30,6 +33,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + CoinListObjectModel::CoinListObjectModel(BaseModel* parent, CoinListObject* object) : ObjectModel(parent, object) { @@ -69,6 +75,12 @@ QVariant CoinListObjectModel::data(int role) const QWidget* widget = new CoinListObjectUI(static_cast<CoinListObject*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Object", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -93,3 +105,8 @@ bool CoinListObjectModel::setData(const QVariant& value, int role) } return false; } + +void CoinListObjectModel::deleteSelf() +{ +// static_cast<GroupObjectModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/CoinListObjectModel.h b/pokemodr/models/CoinListObjectModel.h index 585ae4fd..2bfc170c 100644 --- a/pokemodr/models/CoinListObjectModel.h +++ b/pokemodr/models/CoinListObjectModel.h @@ -26,6 +26,8 @@ class CoinListObject; class CoinListObjectModel : public ObjectModel { + Q_OBJECT + public: CoinListObjectModel(BaseModel* parent, CoinListObject* object); ~CoinListObjectModel(); @@ -33,6 +35,8 @@ class CoinListObjectModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/EggGroupGroupModel.cpp b/pokemodr/models/EggGroupGroupModel.cpp index 669b512e..e293c826 100644 --- a/pokemodr/models/EggGroupGroupModel.cpp +++ b/pokemodr/models/EggGroupGroupModel.cpp @@ -22,21 +22,49 @@ #include "EggGroupModel.h" // Pokemod includes +#include "../../pokemod/EggGroup.h" #include "../../pokemod/Pokemod.h" +// KDE includes +#include <KMenu> + EggGroupGroupModel::EggGroupGroupModel(BaseModel* parent, Pokemod* pokemod) : GroupModel(parent, pokemod, "Egg Groups") { - setupData(); + for (int i = 0; i < pokemod->eggGroupCount(); ++i) + addObject(pokemod->eggGroup(i)); } EggGroupGroupModel::~EggGroupGroupModel() { } -void EggGroupGroupModel::setupData() +QVariant EggGroupGroupModel::data(const int role) const { - Pokemod* pokemod = static_cast<Pokemod*>(m_object); - for (int i = 0; i < pokemod->eggGroupCount(); ++i) - m_objects.append(new EggGroupModel(this, pokemod->eggGroup(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add EggGroup", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void EggGroupGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Pokemod*>(m_object)->newEggGroup(); + if (object->className() == "EggGroup") + m_objects.append(new EggGroupModel(this, static_cast<EggGroup*>(object))); +} + +void EggGroupGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Pokemod*>(m_object)->deleteEggGroup(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/EggGroupGroupModel.h b/pokemodr/models/EggGroupGroupModel.h index 81a9f78f..af05675a 100644 --- a/pokemodr/models/EggGroupGroupModel.h +++ b/pokemodr/models/EggGroupGroupModel.h @@ -26,11 +26,16 @@ class Pokemod; class EggGroupGroupModel : public GroupModel { + Q_OBJECT + public: EggGroupGroupModel(BaseModel* parent, Pokemod* pokemod); ~EggGroupGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/EggGroupModel.cpp b/pokemodr/models/EggGroupModel.cpp index 78adf60b..27e39e02 100644 --- a/pokemodr/models/EggGroupModel.cpp +++ b/pokemodr/models/EggGroupModel.cpp @@ -18,6 +18,9 @@ // Header include #include "EggGroupModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../EggGroupUI.h" @@ -27,6 +30,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + EggGroupModel::EggGroupModel(BaseModel* parent, EggGroup* eggGroup) : ObjectModel(parent, eggGroup) { @@ -51,6 +57,12 @@ QVariant EggGroupModel::data(int role) const QWidget* widget = new EggGroupUI(static_cast<EggGroup*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Egg Group", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -75,3 +87,8 @@ bool EggGroupModel::setData(const QVariant& value, int role) } return false; } + +void EggGroupModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/EggGroupModel.h b/pokemodr/models/EggGroupModel.h index 87a9b637..97835c93 100644 --- a/pokemodr/models/EggGroupModel.h +++ b/pokemodr/models/EggGroupModel.h @@ -26,6 +26,8 @@ class EggGroup; class EggGroupModel : public ObjectModel { + Q_OBJECT + public: EggGroupModel(BaseModel* parent, EggGroup* eggGroup); ~EggGroupModel(); @@ -33,6 +35,8 @@ class EggGroupModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/GlobalScriptGroupModel.cpp b/pokemodr/models/GlobalScriptGroupModel.cpp index e951327a..c2ad6258 100644 --- a/pokemodr/models/GlobalScriptGroupModel.cpp +++ b/pokemodr/models/GlobalScriptGroupModel.cpp @@ -22,21 +22,49 @@ #include "GlobalScriptModel.h" // Pokemod includes +#include "../../pokemod/GlobalScript.h" #include "../../pokemod/Pokemod.h" +// KDE includes +#include <KMenu> + GlobalScriptGroupModel::GlobalScriptGroupModel(BaseModel* parent, Pokemod* pokemod) : GroupModel(parent, pokemod, "Global Scripts") { - setupData(); + for (int i = 0; i < pokemod->globalScriptCount(); ++i) + addObject(pokemod->globalScript(i)); } GlobalScriptGroupModel::~GlobalScriptGroupModel() { } -void GlobalScriptGroupModel::setupData() +QVariant GlobalScriptGroupModel::data(const int role) const { - Pokemod* pokemod = static_cast<Pokemod*>(m_object); - for (int i = 0; i < pokemod->globalScriptCount(); ++i) - m_objects.append(new GlobalScriptModel(this, pokemod->globalScript(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add GlobalScript", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void GlobalScriptGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Pokemod*>(m_object)->newGlobalScript(); + if (object->className() == "GlobalScript") + m_objects.append(new GlobalScriptModel(this, static_cast<GlobalScript*>(object))); +} + +void GlobalScriptGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Pokemod*>(m_object)->deleteGlobalScript(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/GlobalScriptGroupModel.h b/pokemodr/models/GlobalScriptGroupModel.h index 89546115..bd191449 100644 --- a/pokemodr/models/GlobalScriptGroupModel.h +++ b/pokemodr/models/GlobalScriptGroupModel.h @@ -26,11 +26,16 @@ class Pokemod; class GlobalScriptGroupModel : public GroupModel { + Q_OBJECT + public: GlobalScriptGroupModel(BaseModel* parent, Pokemod* pokemod); ~GlobalScriptGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/GlobalScriptModel.cpp b/pokemodr/models/GlobalScriptModel.cpp index 25db22b6..ae3f4e47 100644 --- a/pokemodr/models/GlobalScriptModel.cpp +++ b/pokemodr/models/GlobalScriptModel.cpp @@ -18,6 +18,9 @@ // Header include #include "GlobalScriptModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../GlobalScriptUI.h" @@ -27,6 +30,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + GlobalScriptModel::GlobalScriptModel(BaseModel* parent, GlobalScript* globalScript) : ObjectModel(parent, globalScript) { @@ -51,6 +57,12 @@ QVariant GlobalScriptModel::data(int role) const QWidget* widget = new GlobalScriptUI(static_cast<GlobalScript*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Global Script", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -75,3 +87,8 @@ bool GlobalScriptModel::setData(const QVariant& value, int role) } return false; } + +void GlobalScriptModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/GlobalScriptModel.h b/pokemodr/models/GlobalScriptModel.h index 29a0028d..83d59194 100644 --- a/pokemodr/models/GlobalScriptModel.h +++ b/pokemodr/models/GlobalScriptModel.h @@ -26,6 +26,8 @@ class GlobalScript; class GlobalScriptModel : public ObjectModel { + Q_OBJECT + public: GlobalScriptModel(BaseModel* parent, GlobalScript* globalScript); ~GlobalScriptModel(); @@ -33,6 +35,8 @@ class GlobalScriptModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/GroupModel.h b/pokemodr/models/GroupModel.h index 0f27a3f0..0a45dde0 100644 --- a/pokemodr/models/GroupModel.h +++ b/pokemodr/models/GroupModel.h @@ -25,10 +25,13 @@ #include <QList> // Forward declarations +class Object; class BaseObjectModel; class GroupModel : public BaseModel { + Q_OBJECT + public: GroupModel(BaseModel* parent, Object* object, const QString& name = ""); virtual ~GroupModel(); @@ -43,11 +46,12 @@ class GroupModel : public BaseModel Qt::DropActions supportedDragActions(); Qt::DropActions supportedDropActions(); + public slots: + virtual void addObject(Object* object = NULL) = 0; + virtual void deleteObject(BaseObjectModel* model) = 0; protected: int findChild(const BaseModel* model) const; - virtual void setupData() = 0; - QList<BaseObjectModel*> m_objects; private: void clearData(); diff --git a/pokemodr/models/GroupObjectModel.h b/pokemodr/models/GroupObjectModel.h index 1a062516..26029a49 100644 --- a/pokemodr/models/GroupObjectModel.h +++ b/pokemodr/models/GroupObjectModel.h @@ -24,6 +24,8 @@ class GroupObjectModel : public BaseObjectModel { + Q_OBJECT + public: GroupObjectModel(BaseModel* parent, Object* object); virtual ~GroupObjectModel(); @@ -34,11 +36,16 @@ class GroupObjectModel : public BaseObjectModel virtual bool setData(const QVariant& value, int role = Qt::EditRole) = 0; BaseModel* childItem(const int row); + public slots: + virtual void addObject(Object* object = NULL) = 0; + virtual void deleteObject(BaseModel* model) = 0; + + virtual void deleteSelf() = 0; protected: int findChild(const BaseModel* model) const; - virtual void setupData() = 0; void clearData(); + virtual void setupData() = 0; QList<BaseModel*> m_objects; }; diff --git a/pokemodr/models/ItemGroupModel.cpp b/pokemodr/models/ItemGroupModel.cpp index 62478e10..ab62db56 100644 --- a/pokemodr/models/ItemGroupModel.cpp +++ b/pokemodr/models/ItemGroupModel.cpp @@ -22,21 +22,49 @@ #include "ItemModel.h" // Pokemod includes +#include "../../pokemod/Item.h" #include "../../pokemod/Pokemod.h" +// KDE includes +#include <KMenu> + ItemGroupModel::ItemGroupModel(BaseModel* parent, Pokemod* pokemod) : GroupModel(parent, pokemod, "Items") { - setupData(); + for (int i = 0; i < pokemod->itemCount(); ++i) + addObject(pokemod->item(i)); } ItemGroupModel::~ItemGroupModel() { } -void ItemGroupModel::setupData() +QVariant ItemGroupModel::data(const int role) const { - Pokemod* pokemod = static_cast<Pokemod*>(m_object); - for (int i = 0; i < pokemod->itemCount(); ++i) - m_objects.append(new ItemModel(this, pokemod->item(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Item", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void ItemGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Pokemod*>(m_object)->newItem(); + if (object->className() == "Item") + m_objects.append(new ItemModel(this, static_cast<Item*>(object))); +} + +void ItemGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Pokemod*>(m_object)->deleteItem(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/ItemGroupModel.h b/pokemodr/models/ItemGroupModel.h index 98027f60..40f5ec06 100644 --- a/pokemodr/models/ItemGroupModel.h +++ b/pokemodr/models/ItemGroupModel.h @@ -26,11 +26,16 @@ class Pokemod; class ItemGroupModel : public GroupModel { + Q_OBJECT + public: ItemGroupModel(BaseModel* parent, Pokemod* pokemod); ~ItemGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/ItemModel.cpp b/pokemodr/models/ItemModel.cpp index 66968cf7..7d30bfbc 100644 --- a/pokemodr/models/ItemModel.cpp +++ b/pokemodr/models/ItemModel.cpp @@ -18,6 +18,9 @@ // Header include #include "ItemModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../ItemUI.h" @@ -27,6 +30,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + ItemModel::ItemModel(BaseModel* parent, Item* item) : ObjectModel(parent, item) { @@ -51,6 +57,12 @@ QVariant ItemModel::data(int role) const QWidget* widget = new ItemUI(static_cast<Item*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Item", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -75,3 +87,8 @@ bool ItemModel::setData(const QVariant& value, int role) } return false; } + +void ItemModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/ItemModel.h b/pokemodr/models/ItemModel.h index ad126f20..63f7047e 100644 --- a/pokemodr/models/ItemModel.h +++ b/pokemodr/models/ItemModel.h @@ -26,6 +26,8 @@ class Item; class ItemModel : public ObjectModel { + Q_OBJECT + public: ItemModel(BaseModel* parent, Item* item); ~ItemModel(); @@ -33,6 +35,8 @@ class ItemModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/ItemTypeGroupModel.cpp b/pokemodr/models/ItemTypeGroupModel.cpp index 0e7214c5..083ccafd 100644 --- a/pokemodr/models/ItemTypeGroupModel.cpp +++ b/pokemodr/models/ItemTypeGroupModel.cpp @@ -22,21 +22,49 @@ #include "ItemTypeModel.h" // Pokemod includes +#include "../../pokemod/ItemType.h" #include "../../pokemod/Pokemod.h" +// KDE includes +#include <KMenu> + ItemTypeGroupModel::ItemTypeGroupModel(BaseModel* parent, Pokemod* pokemod) : GroupModel(parent, pokemod, "Item Types") { - setupData(); + for (int i = 0; i < pokemod->itemTypeCount(); ++i) + addObject(pokemod->itemType(i)); } ItemTypeGroupModel::~ItemTypeGroupModel() { } -void ItemTypeGroupModel::setupData() +QVariant ItemTypeGroupModel::data(const int role) const { - Pokemod* pokemod = static_cast<Pokemod*>(m_object); - for (int i = 0; i < pokemod->itemTypeCount(); ++i) - m_objects.append(new ItemTypeModel(this, pokemod->itemType(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Item Type", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void ItemTypeGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Pokemod*>(m_object)->newItemType(); + if (object->className() == "ItemType") + m_objects.append(new ItemTypeModel(this, static_cast<ItemType*>(object))); +} + +void ItemTypeGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Pokemod*>(m_object)->deleteItemType(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/ItemTypeGroupModel.h b/pokemodr/models/ItemTypeGroupModel.h index 995ec70e..0748eef7 100644 --- a/pokemodr/models/ItemTypeGroupModel.h +++ b/pokemodr/models/ItemTypeGroupModel.h @@ -26,11 +26,16 @@ class Pokemod; class ItemTypeGroupModel : public GroupModel { + Q_OBJECT + public: ItemTypeGroupModel(BaseModel* parent, Pokemod* pokemod); ~ItemTypeGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/ItemTypeModel.cpp b/pokemodr/models/ItemTypeModel.cpp index 5ed25951..8b92bd99 100644 --- a/pokemodr/models/ItemTypeModel.cpp +++ b/pokemodr/models/ItemTypeModel.cpp @@ -18,6 +18,9 @@ // Header include #include "ItemTypeModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../ItemTypeUI.h" @@ -27,6 +30,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + ItemTypeModel::ItemTypeModel(BaseModel* parent, ItemType* itemType) : ObjectModel(parent, itemType) { @@ -51,6 +57,12 @@ QVariant ItemTypeModel::data(int role) const QWidget* widget = new ItemTypeUI(static_cast<ItemType*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Item Type", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -75,3 +87,8 @@ bool ItemTypeModel::setData(const QVariant& value, int role) } return false; } + +void ItemTypeModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/ItemTypeModel.h b/pokemodr/models/ItemTypeModel.h index b52a3b4b..53dde9fe 100644 --- a/pokemodr/models/ItemTypeModel.h +++ b/pokemodr/models/ItemTypeModel.h @@ -26,6 +26,8 @@ class ItemType; class ItemTypeModel : public ObjectModel { + Q_OBJECT + public: ItemTypeModel(BaseModel* parent, ItemType* itemType); ~ItemTypeModel(); @@ -33,6 +35,8 @@ class ItemTypeModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/MapEffectGroupModel.cpp b/pokemodr/models/MapEffectGroupModel.cpp index e4a02be4..c3299eb9 100644 --- a/pokemodr/models/MapEffectGroupModel.cpp +++ b/pokemodr/models/MapEffectGroupModel.cpp @@ -23,20 +23,48 @@ // Map includes #include "../../pokemod/Map.h" +#include "../../pokemod/MapEffect.h" + +// KDE includes +#include <KMenu> MapEffectGroupModel::MapEffectGroupModel(BaseModel* parent, Map* map) : GroupModel(parent, map, "Effects") { - setupData(); + for (int i = 0; i < map->effectCount(); ++i) + addObject(map->effect(i)); } MapEffectGroupModel::~MapEffectGroupModel() { } -void MapEffectGroupModel::setupData() +QVariant MapEffectGroupModel::data(const int role) const { - Map* map = static_cast<Map*>(m_object); - for (int i = 0; i < map->effectCount(); ++i) - m_objects.append(new MapEffectModel(this, map->effect(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Effect", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void MapEffectGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Map*>(m_object)->newEffect(); + if (object->className() == "MapEffect") + m_objects.append(new MapEffectModel(this, static_cast<MapEffect*>(object))); +} + +void MapEffectGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Map*>(m_object)->deleteEffect(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/MapEffectGroupModel.h b/pokemodr/models/MapEffectGroupModel.h index bed4d2e8..41435c93 100644 --- a/pokemodr/models/MapEffectGroupModel.h +++ b/pokemodr/models/MapEffectGroupModel.h @@ -26,11 +26,16 @@ class Map; class MapEffectGroupModel : public GroupModel { + Q_OBJECT + public: MapEffectGroupModel(BaseModel* parent, Map* map); ~MapEffectGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/MapEffectModel.cpp b/pokemodr/models/MapEffectModel.cpp index 208a5c62..a43d2e53 100644 --- a/pokemodr/models/MapEffectModel.cpp +++ b/pokemodr/models/MapEffectModel.cpp @@ -18,6 +18,9 @@ // Header include #include "MapEffectModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../MapEffectUI.h" @@ -28,6 +31,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + MapEffectModel::MapEffectModel(BaseModel* parent, MapEffect* effect) : ObjectModel(parent, effect) { @@ -52,6 +58,12 @@ QVariant MapEffectModel::data(int role) const QWidget* widget = new MapEffectUI(static_cast<MapEffect*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Effect", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -76,3 +88,8 @@ bool MapEffectModel::setData(const QVariant& value, int role) } return false; } + +void MapEffectModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/MapEffectModel.h b/pokemodr/models/MapEffectModel.h index 00b9deaf..848a92db 100644 --- a/pokemodr/models/MapEffectModel.h +++ b/pokemodr/models/MapEffectModel.h @@ -26,6 +26,8 @@ class MapEffect; class MapEffectModel : public ObjectModel { + Q_OBJECT + public: MapEffectModel(BaseModel* parent, MapEffect* effect); ~MapEffectModel(); @@ -33,6 +35,8 @@ class MapEffectModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/MapGroupModel.cpp b/pokemodr/models/MapGroupModel.cpp index ad122579..cd65b202 100644 --- a/pokemodr/models/MapGroupModel.cpp +++ b/pokemodr/models/MapGroupModel.cpp @@ -22,21 +22,49 @@ #include "MapModel.h" // Pokemod includes +#include "../../pokemod/Map.h" #include "../../pokemod/Pokemod.h" +// KDE includes +#include <KMenu> + MapGroupModel::MapGroupModel(BaseModel* parent, Pokemod* pokemod) : GroupModel(parent, pokemod, "Maps") { - setupData(); + for (int i = 0; i < pokemod->mapCount(); ++i) + addObject(pokemod->map(i)); } MapGroupModel::~MapGroupModel() { } -void MapGroupModel::setupData() +QVariant MapGroupModel::data(const int role) const { - Pokemod* pokemod = static_cast<Pokemod*>(m_object); - for (int i = 0; i < pokemod->mapCount(); ++i) - m_objects.append(new MapModel(this, pokemod->map(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Map", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void MapGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Pokemod*>(m_object)->newMap(); + if (object->className() == "Map") + m_objects.append(new MapModel(this, static_cast<Map*>(object))); +} + +void MapGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Pokemod*>(m_object)->deleteMap(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/MapGroupModel.h b/pokemodr/models/MapGroupModel.h index cb1e6c6a..3e216783 100644 --- a/pokemodr/models/MapGroupModel.h +++ b/pokemodr/models/MapGroupModel.h @@ -26,11 +26,16 @@ class Pokemod; class MapGroupModel : public GroupModel { + Q_OBJECT + public: MapGroupModel(BaseModel* parent, Pokemod* pokemod); ~MapGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/MapModel.cpp b/pokemodr/models/MapModel.cpp index 5a0e76a0..609c9a90 100644 --- a/pokemodr/models/MapModel.cpp +++ b/pokemodr/models/MapModel.cpp @@ -33,10 +33,12 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + MapModel::MapModel(BaseModel* parent, Map* map) : GroupObjectModel(parent, map) { - setupData(); } MapModel::~MapModel() @@ -58,6 +60,12 @@ QVariant MapModel::data(int role) const QWidget* widget = new MapUI(static_cast<Map*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Map", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return GroupObjectModel::data(role); } @@ -85,10 +93,24 @@ bool MapModel::setData(const QVariant& value, int role) return false; } +void MapModel::addObject(Object* /*object*/) +{ +} + +void MapModel::deleteObject(BaseModel* /*model*/) +{ +} + +void MapModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} + void MapModel::setupData() { - m_objects.append(new MapEffectGroupModel(this, static_cast<Map*>(m_object))); - m_objects.append(new MapTrainerGroupModel(this, static_cast<Map*>(m_object))); - m_objects.append(new MapWarpGroupModel(this, static_cast<Map*>(m_object))); - m_objects.append(new MapWildListGroupModel(this, static_cast<Map*>(m_object))); + Map* map = static_cast<Map*>(m_object); + m_objects.append(new MapEffectGroupModel(this, map)); + m_objects.append(new MapTrainerGroupModel(this, map)); + m_objects.append(new MapWarpGroupModel(this, map)); + m_objects.append(new MapWildListGroupModel(this, map)); } diff --git a/pokemodr/models/MapModel.h b/pokemodr/models/MapModel.h index 4d4e97d0..332e6a35 100644 --- a/pokemodr/models/MapModel.h +++ b/pokemodr/models/MapModel.h @@ -26,6 +26,8 @@ class Map; class MapModel : public GroupObjectModel { + Q_OBJECT + public: MapModel(BaseModel* parent, Map* map); ~MapModel(); @@ -33,6 +35,11 @@ class MapModel : public GroupObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void addObject(Object* /*object = NULL*/); + void deleteObject(BaseModel* /*model*/); + + void deleteSelf(); protected: void setupData(); }; diff --git a/pokemodr/models/MapTrainerGroupModel.cpp b/pokemodr/models/MapTrainerGroupModel.cpp index 71d0ab1c..14be5b15 100644 --- a/pokemodr/models/MapTrainerGroupModel.cpp +++ b/pokemodr/models/MapTrainerGroupModel.cpp @@ -23,20 +23,48 @@ // Map includes #include "../../pokemod/Map.h" +#include "../../pokemod/MapTrainer.h" + +// KDE includes +#include <KMenu> MapTrainerGroupModel::MapTrainerGroupModel(BaseModel* parent, Map* map) : GroupModel(parent, map, "Trainers") { - setupData(); + for (int i = 0; i < map->trainerCount(); ++i) + addObject(map->trainer(i)); } MapTrainerGroupModel::~MapTrainerGroupModel() { } -void MapTrainerGroupModel::setupData() +QVariant MapTrainerGroupModel::data(const int role) const { - Map* map = static_cast<Map*>(m_object); - for (int i = 0; i < map->trainerCount(); ++i) - m_objects.append(new MapTrainerModel(this, map->trainer(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Trainer", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void MapTrainerGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Map*>(m_object)->newTrainer(); + if (object->className() == "MapTrainer") + m_objects.append(new MapTrainerModel(this, static_cast<MapTrainer*>(object))); +} + +void MapTrainerGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Map*>(m_object)->deleteTrainer(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/MapTrainerGroupModel.h b/pokemodr/models/MapTrainerGroupModel.h index 99c769d5..a383e607 100644 --- a/pokemodr/models/MapTrainerGroupModel.h +++ b/pokemodr/models/MapTrainerGroupModel.h @@ -26,11 +26,16 @@ class Map; class MapTrainerGroupModel : public GroupModel { + Q_OBJECT + public: MapTrainerGroupModel(BaseModel* parent, Map* map); ~MapTrainerGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/MapTrainerModel.cpp b/pokemodr/models/MapTrainerModel.cpp index f5db2f24..8698bfe4 100644 --- a/pokemodr/models/MapTrainerModel.cpp +++ b/pokemodr/models/MapTrainerModel.cpp @@ -27,10 +27,14 @@ // Pokemod includes #include "../../pokemod/Map.h" #include "../../pokemod/MapTrainer.h" +#include "../../pokemod/MapTrainerTeamMember.h" // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + MapTrainerModel::MapTrainerModel(BaseModel* parent, MapTrainer* trainer) : GroupObjectModel(parent, trainer) { @@ -57,9 +61,41 @@ QVariant MapTrainerModel::data(int role) const QWidget* widget = new MapTrainerUI(static_cast<MapTrainer*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Team Member", this, SLOT(addObject())); + menu->addSeparator(); + menu->addAction("Delete Trainer", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return GroupObjectModel::data(role); } +void MapTrainerModel::addObject(Object* object) +{ + if (!object) + object = static_cast<MapTrainer*>(m_object)->newTeamMember(); + if (object->className() == "MapTrainerTeamMember") + m_objects.append(new MapTrainerTeamMemberModel(this, static_cast<MapTrainerTeamMember*>(object))); +} + +void MapTrainerModel::deleteObject(BaseModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<MapTrainer*>(m_object)->deleteTeamMember(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } +} + +void MapTrainerModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} + bool MapTrainerModel::setData(const QVariant& value, int role) { if (role == BaseModel::XmlRole) diff --git a/pokemodr/models/MapTrainerModel.h b/pokemodr/models/MapTrainerModel.h index 19f6b670..81426311 100644 --- a/pokemodr/models/MapTrainerModel.h +++ b/pokemodr/models/MapTrainerModel.h @@ -26,6 +26,8 @@ class MapTrainer; class MapTrainerModel : public GroupObjectModel { + Q_OBJECT + public: MapTrainerModel(BaseModel* parent, MapTrainer* trainer); ~MapTrainerModel(); @@ -33,6 +35,11 @@ class MapTrainerModel : public GroupObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseModel* model); + + void deleteSelf(); protected: void setupData(); }; diff --git a/pokemodr/models/MapTrainerTeamMemberModel.cpp b/pokemodr/models/MapTrainerTeamMemberModel.cpp index 045fde58..fa6844d9 100644 --- a/pokemodr/models/MapTrainerTeamMemberModel.cpp +++ b/pokemodr/models/MapTrainerTeamMemberModel.cpp @@ -18,6 +18,9 @@ // Header include #include "MapTrainerTeamMemberModel.h" +// Model includes +#include "GroupObjectModel.h" + // PokeModr includes #include "../MapTrainerTeamMemberUI.h" @@ -29,6 +32,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + MapTrainerTeamMemberModel::MapTrainerTeamMemberModel(BaseModel* parent, MapTrainerTeamMember* teamMember) : ObjectModel(parent, teamMember) { @@ -58,6 +64,12 @@ QVariant MapTrainerTeamMemberModel::data(int role) const QWidget* widget = new MapTrainerTeamMemberUI(static_cast<MapTrainerTeamMember*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Team Member", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -82,3 +94,8 @@ bool MapTrainerTeamMemberModel::setData(const QVariant& value, int role) } return false; } + +void MapTrainerTeamMemberModel::deleteSelf() +{ +// static_cast<GroupObjectModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/MapTrainerTeamMemberModel.h b/pokemodr/models/MapTrainerTeamMemberModel.h index e1bbfd77..7ca6fc5e 100644 --- a/pokemodr/models/MapTrainerTeamMemberModel.h +++ b/pokemodr/models/MapTrainerTeamMemberModel.h @@ -26,6 +26,8 @@ class MapTrainerTeamMember; class MapTrainerTeamMemberModel : public ObjectModel { + Q_OBJECT + public: MapTrainerTeamMemberModel(BaseModel* parent, MapTrainerTeamMember* teamMember); ~MapTrainerTeamMemberModel(); @@ -33,6 +35,8 @@ class MapTrainerTeamMemberModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/MapWarpGroupModel.cpp b/pokemodr/models/MapWarpGroupModel.cpp index fd8bb785..a042cdc5 100644 --- a/pokemodr/models/MapWarpGroupModel.cpp +++ b/pokemodr/models/MapWarpGroupModel.cpp @@ -23,20 +23,48 @@ // Map includes #include "../../pokemod/Map.h" +#include "../../pokemod/MapWarp.h" + +// KDE includes +#include <KMenu> MapWarpGroupModel::MapWarpGroupModel(BaseModel* parent, Map* map) : GroupModel(parent, map, "Warps") { - setupData(); + for (int i = 0; i < map->warpCount(); ++i) + addObject(map->warp(i)); } MapWarpGroupModel::~MapWarpGroupModel() { } -void MapWarpGroupModel::setupData() +QVariant MapWarpGroupModel::data(const int role) const { - Map* map = static_cast<Map*>(m_object); - for (int i = 0; i < map->warpCount(); ++i) - m_objects.append(new MapWarpModel(this, map->warp(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Warp", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void MapWarpGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Map*>(m_object)->newWarp(); + if (object->className() == "MapWarp") + m_objects.append(new MapWarpModel(this, static_cast<MapWarp*>(object))); +} + +void MapWarpGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Map*>(m_object)->deleteWarp(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/MapWarpGroupModel.h b/pokemodr/models/MapWarpGroupModel.h index 97681e5b..90fa7fba 100644 --- a/pokemodr/models/MapWarpGroupModel.h +++ b/pokemodr/models/MapWarpGroupModel.h @@ -26,11 +26,16 @@ class Map; class MapWarpGroupModel : public GroupModel { + Q_OBJECT + public: MapWarpGroupModel(BaseModel* parent, Map* map); ~MapWarpGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/MapWarpModel.cpp b/pokemodr/models/MapWarpModel.cpp index ba3a55a0..2a3c7825 100644 --- a/pokemodr/models/MapWarpModel.cpp +++ b/pokemodr/models/MapWarpModel.cpp @@ -18,6 +18,9 @@ // Header include #include "MapWarpModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../MapWarpUI.h" @@ -28,6 +31,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + MapWarpModel::MapWarpModel(BaseModel* parent, MapWarp* warp) : ObjectModel(parent, warp) { @@ -52,6 +58,12 @@ QVariant MapWarpModel::data(int role) const QWidget* widget = new MapWarpUI(static_cast<MapWarp*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Warp", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -76,3 +88,8 @@ bool MapWarpModel::setData(const QVariant& value, int role) } return false; } + +void MapWarpModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/MapWarpModel.h b/pokemodr/models/MapWarpModel.h index 602d0565..da4808ba 100644 --- a/pokemodr/models/MapWarpModel.h +++ b/pokemodr/models/MapWarpModel.h @@ -26,6 +26,8 @@ class MapWarp; class MapWarpModel : public ObjectModel { + Q_OBJECT + public: MapWarpModel(BaseModel* parent, MapWarp* warp); ~MapWarpModel(); @@ -33,6 +35,8 @@ class MapWarpModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/MapWildListEncounterModel.cpp b/pokemodr/models/MapWildListEncounterModel.cpp index 94f38818..ea21fe90 100644 --- a/pokemodr/models/MapWildListEncounterModel.cpp +++ b/pokemodr/models/MapWildListEncounterModel.cpp @@ -18,6 +18,9 @@ // Header include #include "MapWildListEncounterModel.h" +// Model includes +#include "GroupObjectModel.h" + // PokeModr includes #include "../MapWildListEncounterUI.h" @@ -29,6 +32,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + MapWildListEncounterModel::MapWildListEncounterModel(BaseModel* parent, MapWildListEncounter* encounter) : ObjectModel(parent, encounter) { @@ -58,6 +64,12 @@ QVariant MapWildListEncounterModel::data(int role) const QWidget* widget = new MapWildListEncounterUI(static_cast<MapWildListEncounter*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Encounter", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -82,3 +94,8 @@ bool MapWildListEncounterModel::setData(const QVariant& value, int role) } return false; } + +void MapWildListEncounterModel::deleteSelf() +{ +// static_cast<GroupObjectModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/MapWildListEncounterModel.h b/pokemodr/models/MapWildListEncounterModel.h index bf0d2d9a..b09cc177 100644 --- a/pokemodr/models/MapWildListEncounterModel.h +++ b/pokemodr/models/MapWildListEncounterModel.h @@ -26,6 +26,8 @@ class MapWildListEncounter; class MapWildListEncounterModel : public ObjectModel { + Q_OBJECT + public: MapWildListEncounterModel(BaseModel* parent, MapWildListEncounter* encounter); ~MapWildListEncounterModel(); @@ -33,6 +35,8 @@ class MapWildListEncounterModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/MapWildListGroupModel.cpp b/pokemodr/models/MapWildListGroupModel.cpp index da865777..d4789481 100644 --- a/pokemodr/models/MapWildListGroupModel.cpp +++ b/pokemodr/models/MapWildListGroupModel.cpp @@ -23,20 +23,48 @@ // Map includes #include "../../pokemod/Map.h" +#include "../../pokemod/MapWildList.h" + +// KDE includes +#include <KMenu> MapWildListGroupModel::MapWildListGroupModel(BaseModel* parent, Map* map) : GroupModel(parent, map, "Wild Lists") { - setupData(); + for (int i = 0; i < map->wildListCount(); ++i) + addObject(map->wildList(i)); } MapWildListGroupModel::~MapWildListGroupModel() { } -void MapWildListGroupModel::setupData() +QVariant MapWildListGroupModel::data(const int role) const { - Map* map = static_cast<Map*>(m_object); - for (int i = 0; i < map->wildListCount(); ++i) - m_objects.append(new MapWildListModel(this, map->wildList(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Wild List", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void MapWildListGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Map*>(m_object)->newWildList(); + if (object->className() == "MapWildList") + m_objects.append(new MapWildListModel(this, static_cast<MapWildList*>(object))); +} + +void MapWildListGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Map*>(m_object)->deleteWildList(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/MapWildListGroupModel.h b/pokemodr/models/MapWildListGroupModel.h index fb1d7c74..18df65c0 100644 --- a/pokemodr/models/MapWildListGroupModel.h +++ b/pokemodr/models/MapWildListGroupModel.h @@ -26,11 +26,16 @@ class Map; class MapWildListGroupModel : public GroupModel { + Q_OBJECT + public: MapWildListGroupModel(BaseModel* parent, Map* map); ~MapWildListGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/MapWildListModel.cpp b/pokemodr/models/MapWildListModel.cpp index 181d0ccd..a2154def 100644 --- a/pokemodr/models/MapWildListModel.cpp +++ b/pokemodr/models/MapWildListModel.cpp @@ -27,10 +27,14 @@ // Pokemod includes #include "../../pokemod/Map.h" #include "../../pokemod/MapWildList.h" +#include "../../pokemod/MapWildListEncounter.h" // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + MapWildListModel::MapWildListModel(BaseModel* parent, MapWildList* wildList) : GroupObjectModel(parent, wildList) { @@ -61,9 +65,41 @@ QVariant MapWildListModel::data(int role) const QWidget* widget = new MapWildListUI(static_cast<MapWildList*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Encounter", this, SLOT(addObject())); + menu->addSeparator(); + menu->addAction("Delete Wild List", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return GroupObjectModel::data(role); } +void MapWildListModel::addObject(Object* object) +{ + if (!object) + object = static_cast<MapWildList*>(m_object)->newEncounter(); + if (object->className() == "MapWildListEncounter") + m_objects.append(new MapWildListEncounterModel(this, static_cast<MapWildListEncounter*>(object))); +} + +void MapWildListModel::deleteObject(BaseModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<MapWildList*>(m_object)->deleteEncounter(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } +} + +void MapWildListModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} + bool MapWildListModel::setData(const QVariant& value, int role) { if (role == BaseModel::XmlRole) diff --git a/pokemodr/models/MapWildListModel.h b/pokemodr/models/MapWildListModel.h index f6f059f3..e9bf2174 100644 --- a/pokemodr/models/MapWildListModel.h +++ b/pokemodr/models/MapWildListModel.h @@ -26,6 +26,8 @@ class MapWildList; class MapWildListModel : public GroupObjectModel { + Q_OBJECT + public: MapWildListModel(BaseModel* parent, MapWildList* wildList); ~MapWildListModel(); @@ -33,6 +35,11 @@ class MapWildListModel : public GroupObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseModel* model); + + void deleteSelf(); protected: void setupData(); }; diff --git a/pokemodr/models/MoveGroupModel.cpp b/pokemodr/models/MoveGroupModel.cpp index ff51cbf8..4ab86867 100644 --- a/pokemodr/models/MoveGroupModel.cpp +++ b/pokemodr/models/MoveGroupModel.cpp @@ -22,21 +22,49 @@ #include "MoveModel.h" // Pokemod includes +#include "../../pokemod/Move.h" #include "../../pokemod/Pokemod.h" +// KDE includes +#include <KMenu> + MoveGroupModel::MoveGroupModel(BaseModel* parent, Pokemod* pokemod) : GroupModel(parent, pokemod, "Moves") { - setupData(); + for (int i = 0; i < pokemod->moveCount(); ++i) + addObject(pokemod->move(i)); } MoveGroupModel::~MoveGroupModel() { } -void MoveGroupModel::setupData() +QVariant MoveGroupModel::data(const int role) const { - Pokemod* pokemod = static_cast<Pokemod*>(m_object); - for (int i = 0; i < pokemod->moveCount(); ++i) - m_objects.append(new MoveModel(this, pokemod->move(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Move", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void MoveGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Pokemod*>(m_object)->newMove(); + if (object->className() == "Move") + m_objects.append(new MoveModel(this, static_cast<Move*>(object))); +} + +void MoveGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Pokemod*>(m_object)->deleteMove(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/MoveGroupModel.h b/pokemodr/models/MoveGroupModel.h index 72ca104b..4859ef67 100644 --- a/pokemodr/models/MoveGroupModel.h +++ b/pokemodr/models/MoveGroupModel.h @@ -26,11 +26,16 @@ class Pokemod; class MoveGroupModel : public GroupModel { + Q_OBJECT + public: MoveGroupModel(BaseModel* parent, Pokemod* pokemod); ~MoveGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/MoveModel.cpp b/pokemodr/models/MoveModel.cpp index 5799e374..b5052232 100644 --- a/pokemodr/models/MoveModel.cpp +++ b/pokemodr/models/MoveModel.cpp @@ -18,6 +18,9 @@ // Header include #include "MoveModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../MoveUI.h" @@ -27,6 +30,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + MoveModel::MoveModel(BaseModel* parent, Move* move) : ObjectModel(parent, move) { @@ -51,6 +57,12 @@ QVariant MoveModel::data(int role) const QWidget* widget = new MoveUI(static_cast<Move*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Move", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -75,3 +87,8 @@ bool MoveModel::setData(const QVariant& value, int role) } return false; } + +void MoveModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/MoveModel.h b/pokemodr/models/MoveModel.h index cc8df8ac..2acebb5a 100644 --- a/pokemodr/models/MoveModel.h +++ b/pokemodr/models/MoveModel.h @@ -26,6 +26,8 @@ class Move; class MoveModel : public ObjectModel { + Q_OBJECT + public: MoveModel(BaseModel* parent, Move* move); ~MoveModel(); @@ -33,6 +35,8 @@ class MoveModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/NatureGroupModel.cpp b/pokemodr/models/NatureGroupModel.cpp index d2160e0b..b303bac3 100644 --- a/pokemodr/models/NatureGroupModel.cpp +++ b/pokemodr/models/NatureGroupModel.cpp @@ -22,21 +22,49 @@ #include "NatureModel.h" // Pokemod includes +#include "../../pokemod/Nature.h" #include "../../pokemod/Pokemod.h" +// KDE includes +#include <KMenu> + NatureGroupModel::NatureGroupModel(BaseModel* parent, Pokemod* pokemod) : GroupModel(parent, pokemod, "Natures") { - setupData(); + for (int i = 0; i < pokemod->natureCount(); ++i) + addObject(pokemod->nature(i)); } NatureGroupModel::~NatureGroupModel() { } -void NatureGroupModel::setupData() +QVariant NatureGroupModel::data(const int role) const { - Pokemod* pokemod = static_cast<Pokemod*>(m_object); - for (int i = 0; i < pokemod->natureCount(); ++i) - m_objects.append(new NatureModel(this, pokemod->nature(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Nature", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void NatureGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Pokemod*>(m_object)->newNature(); + if (object->className() == "Nature") + m_objects.append(new NatureModel(this, static_cast<Nature*>(object))); +} + +void NatureGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Pokemod*>(m_object)->deleteNature(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/NatureGroupModel.h b/pokemodr/models/NatureGroupModel.h index 4601bc56..35ad5458 100644 --- a/pokemodr/models/NatureGroupModel.h +++ b/pokemodr/models/NatureGroupModel.h @@ -26,11 +26,16 @@ class Pokemod; class NatureGroupModel : public GroupModel { + Q_OBJECT + public: NatureGroupModel(BaseModel* parent, Pokemod* pokemod); ~NatureGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/NatureModel.cpp b/pokemodr/models/NatureModel.cpp index 801ca8ae..1fe0227b 100644 --- a/pokemodr/models/NatureModel.cpp +++ b/pokemodr/models/NatureModel.cpp @@ -18,6 +18,9 @@ // Header include #include "NatureModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../NatureUI.h" @@ -28,6 +31,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + NatureModel::NatureModel(BaseModel* parent, Nature* nature) : ObjectModel(parent, nature) { @@ -52,6 +58,12 @@ QVariant NatureModel::data(int role) const QWidget* widget = new NatureUI(static_cast<Nature*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Nature", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -76,3 +88,8 @@ bool NatureModel::setData(const QVariant& value, int role) } return false; } + +void NatureModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/NatureModel.h b/pokemodr/models/NatureModel.h index c954917d..5083a87f 100644 --- a/pokemodr/models/NatureModel.h +++ b/pokemodr/models/NatureModel.h @@ -26,6 +26,8 @@ class Nature; class NatureModel : public ObjectModel { + Q_OBJECT + public: NatureModel(BaseModel* parent, Nature* nature); ~NatureModel(); @@ -33,6 +35,8 @@ class NatureModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/ObjectModel.h b/pokemodr/models/ObjectModel.h index e8477c4f..bfb01252 100644 --- a/pokemodr/models/ObjectModel.h +++ b/pokemodr/models/ObjectModel.h @@ -23,6 +23,8 @@ class ObjectModel : public BaseObjectModel { + Q_OBJECT + public: ObjectModel(BaseModel* parent, Object* object); virtual ~ObjectModel(); @@ -33,6 +35,8 @@ class ObjectModel : public BaseObjectModel virtual bool setData(const QVariant& value, int role = Qt::EditRole) = 0; BaseModel* childItem(const int /*row*/); + public slots: + virtual void deleteSelf() = 0; }; #endif diff --git a/pokemodr/models/PokemodModel.cpp b/pokemodr/models/PokemodModel.cpp index 6daa6c6b..1280bc7a 100644 --- a/pokemodr/models/PokemodModel.cpp +++ b/pokemodr/models/PokemodModel.cpp @@ -101,25 +101,38 @@ bool PokemodModel::setData(const QVariant& value, int role) return false; } +void PokemodModel::addObject(Object* /*object*/) +{ +} + +void PokemodModel::deleteObject(BaseModel* /*model*/) +{ +} + +void PokemodModel::deleteSelf() +{ +} + void PokemodModel::setupData() { - m_objects.append(new RulesModel(this, static_cast<Pokemod*>(m_object)->rules())); - m_objects.append(new AbilityGroupModel(this, static_cast<Pokemod*>(m_object))); - m_objects.append(new AuthorGroupModel(this, static_cast<Pokemod*>(m_object))); - m_objects.append(new BadgeGroupModel(this, static_cast<Pokemod*>(m_object))); - m_objects.append(new CoinListGroupModel(this, static_cast<Pokemod*>(m_object))); - m_objects.append(new EggGroupGroupModel(this, static_cast<Pokemod*>(m_object))); - m_objects.append(new GlobalScriptGroupModel(this, static_cast<Pokemod*>(m_object))); - m_objects.append(new ItemGroupModel(this, static_cast<Pokemod*>(m_object))); - m_objects.append(new ItemTypeGroupModel(this, static_cast<Pokemod*>(m_object))); - m_objects.append(new MapGroupModel(this, static_cast<Pokemod*>(m_object))); - m_objects.append(new MoveGroupModel(this, static_cast<Pokemod*>(m_object))); - m_objects.append(new NatureGroupModel(this, static_cast<Pokemod*>(m_object))); - m_objects.append(new SoundGroupModel(this, static_cast<Pokemod*>(m_object))); - m_objects.append(new SpeciesGroupModel(this, static_cast<Pokemod*>(m_object))); - m_objects.append(new StoreGroupModel(this, static_cast<Pokemod*>(m_object))); - m_objects.append(new TileGroupModel(this, static_cast<Pokemod*>(m_object))); - m_objects.append(new TimeGroupModel(this, static_cast<Pokemod*>(m_object))); - m_objects.append(new TrainerGroupModel(this, static_cast<Pokemod*>(m_object))); - m_objects.append(new TypeGroupModel(this, static_cast<Pokemod*>(m_object))); + Pokemod* pokemod = static_cast<Pokemod*>(m_object); + m_objects.append(new RulesModel(this, pokemod->rules())); + m_objects.append(new AbilityGroupModel(this, pokemod)); + m_objects.append(new AuthorGroupModel(this, pokemod)); + m_objects.append(new BadgeGroupModel(this, pokemod)); + m_objects.append(new CoinListGroupModel(this, pokemod)); + m_objects.append(new EggGroupGroupModel(this, pokemod)); + m_objects.append(new GlobalScriptGroupModel(this, pokemod)); + m_objects.append(new ItemGroupModel(this, pokemod)); + m_objects.append(new ItemTypeGroupModel(this, pokemod)); + m_objects.append(new MapGroupModel(this, pokemod)); + m_objects.append(new MoveGroupModel(this, pokemod)); + m_objects.append(new NatureGroupModel(this, pokemod)); + m_objects.append(new SoundGroupModel(this, pokemod)); + m_objects.append(new SpeciesGroupModel(this, pokemod)); + m_objects.append(new StoreGroupModel(this, pokemod)); + m_objects.append(new TileGroupModel(this, pokemod)); + m_objects.append(new TimeGroupModel(this, pokemod)); + m_objects.append(new TrainerGroupModel(this, pokemod)); + m_objects.append(new TypeGroupModel(this, pokemod)); } diff --git a/pokemodr/models/PokemodModel.h b/pokemodr/models/PokemodModel.h index 8592e556..cd4a2653 100644 --- a/pokemodr/models/PokemodModel.h +++ b/pokemodr/models/PokemodModel.h @@ -26,6 +26,8 @@ class Pokemod; class PokemodModel : public GroupObjectModel { + Q_OBJECT + public: PokemodModel(BaseModel* parent, Pokemod* pokemod); ~PokemodModel(); @@ -33,6 +35,11 @@ class PokemodModel : public GroupObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void addObject(Object* /*object = NULL*/); + void deleteObject(BaseModel* /*model*/); + + void deleteSelf(); protected: void setupData(); }; diff --git a/pokemodr/models/RootModel.cpp b/pokemodr/models/RootModel.cpp index 1c0691f7..edfc8e69 100644 --- a/pokemodr/models/RootModel.cpp +++ b/pokemodr/models/RootModel.cpp @@ -54,6 +54,10 @@ void RootModel::deletePokemod(const Pokemod* pokemod) } } -void RootModel::setupData() +void RootModel::addObject(Object* /*object*/) +{ +} + +void RootModel::deleteObject(BaseObjectModel* /*model*/) { } diff --git a/pokemodr/models/RootModel.h b/pokemodr/models/RootModel.h index f0a7599f..530dac4d 100644 --- a/pokemodr/models/RootModel.h +++ b/pokemodr/models/RootModel.h @@ -26,14 +26,17 @@ class PokemodModel; class RootModel : public GroupModel { + Q_OBJECT + public: RootModel(); ~RootModel(); void addPokemod(Pokemod* pokemod); void deletePokemod(const Pokemod* pokemod); - protected: - void setupData(); + public slots: + void addObject(Object* /*object = NULL*/); + void deleteObject(BaseObjectModel* /*model*/); }; #endif diff --git a/pokemodr/models/RulesModel.cpp b/pokemodr/models/RulesModel.cpp index 777fa6e7..537af62c 100644 --- a/pokemodr/models/RulesModel.cpp +++ b/pokemodr/models/RulesModel.cpp @@ -75,3 +75,7 @@ bool RulesModel::setData(const QVariant& value, int role) } return false; } + +void RulesModel::deleteSelf() +{ +} diff --git a/pokemodr/models/RulesModel.h b/pokemodr/models/RulesModel.h index 8b94cb05..e223e83b 100644 --- a/pokemodr/models/RulesModel.h +++ b/pokemodr/models/RulesModel.h @@ -26,6 +26,8 @@ class Rules; class RulesModel : public ObjectModel { + Q_OBJECT + public: RulesModel(BaseModel* parent, Rules* rules); ~RulesModel(); @@ -33,6 +35,8 @@ class RulesModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/SoundGroupModel.cpp b/pokemodr/models/SoundGroupModel.cpp index 226e2a95..15b47379 100644 --- a/pokemodr/models/SoundGroupModel.cpp +++ b/pokemodr/models/SoundGroupModel.cpp @@ -23,20 +23,48 @@ // Pokemod includes #include "../../pokemod/Pokemod.h" +#include "../../pokemod/Sound.h" + +// KDE includes +#include <KMenu> SoundGroupModel::SoundGroupModel(BaseModel* parent, Pokemod* pokemod) : GroupModel(parent, pokemod, "Sounds") { - setupData(); + for (int i = 0; i < pokemod->soundCount(); ++i) + addObject(pokemod->sound(i)); } SoundGroupModel::~SoundGroupModel() { } -void SoundGroupModel::setupData() +QVariant SoundGroupModel::data(const int role) const { - Pokemod* pokemod = static_cast<Pokemod*>(m_object); - for (int i = 0; i < pokemod->soundCount(); ++i) - m_objects.append(new SoundModel(this, pokemod->sound(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Sound", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void SoundGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Pokemod*>(m_object)->newSound(); + if (object->className() == "Sound") + m_objects.append(new SoundModel(this, static_cast<Sound*>(object))); +} + +void SoundGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Pokemod*>(m_object)->deleteSound(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/SoundGroupModel.h b/pokemodr/models/SoundGroupModel.h index 000cb50d..cf5e1f5e 100644 --- a/pokemodr/models/SoundGroupModel.h +++ b/pokemodr/models/SoundGroupModel.h @@ -26,11 +26,16 @@ class Pokemod; class SoundGroupModel : public GroupModel { + Q_OBJECT + public: SoundGroupModel(BaseModel* parent, Pokemod* pokemod); ~SoundGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/SoundModel.cpp b/pokemodr/models/SoundModel.cpp index 739ac34c..e0647526 100644 --- a/pokemodr/models/SoundModel.cpp +++ b/pokemodr/models/SoundModel.cpp @@ -18,6 +18,9 @@ // Header include #include "SoundModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../SoundUI.h" @@ -28,6 +31,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + SoundModel::SoundModel(BaseModel* parent, Sound* sound) : ObjectModel(parent, sound) { @@ -52,6 +58,12 @@ QVariant SoundModel::data(int role) const QWidget* widget = new SoundUI(static_cast<Sound*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Sound", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -76,3 +88,8 @@ bool SoundModel::setData(const QVariant& value, int role) } return false; } + +void SoundModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/SoundModel.h b/pokemodr/models/SoundModel.h index 690cc1c1..f336bd33 100644 --- a/pokemodr/models/SoundModel.h +++ b/pokemodr/models/SoundModel.h @@ -26,6 +26,8 @@ class Sound; class SoundModel : public ObjectModel { + Q_OBJECT + public: SoundModel(BaseModel* parent, Sound* nature); ~SoundModel(); @@ -33,6 +35,8 @@ class SoundModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/SpeciesAbilityGroupModel.cpp b/pokemodr/models/SpeciesAbilityGroupModel.cpp index 043ca754..9a447f32 100644 --- a/pokemodr/models/SpeciesAbilityGroupModel.cpp +++ b/pokemodr/models/SpeciesAbilityGroupModel.cpp @@ -23,20 +23,48 @@ // Pokemod includes #include "../../pokemod/Species.h" +#include "../../pokemod/SpeciesAbility.h" + +// KDE includes +#include <KMenu> SpeciesAbilityGroupModel::SpeciesAbilityGroupModel(BaseModel* parent, Species* species) : GroupModel(parent, species, "Abilities") { - setupData(); + for (int i = 0; i < species->abilityCount(); ++i) + addObject(species->ability(i)); } SpeciesAbilityGroupModel::~SpeciesAbilityGroupModel() { } -void SpeciesAbilityGroupModel::setupData() +QVariant SpeciesAbilityGroupModel::data(const int role) const { - Species* species = static_cast<Species*>(m_object); - for (int i = 0; i < species->abilityCount(); ++i) - m_objects.append(new SpeciesAbilityModel(this, species->ability(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Ability", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void SpeciesAbilityGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Species*>(m_object)->newAbility(); + if (object->className() == "SpeciesAbility") + m_objects.append(new SpeciesAbilityModel(this, static_cast<SpeciesAbility*>(object))); +} + +void SpeciesAbilityGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Species*>(m_object)->deleteAbility(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/SpeciesAbilityGroupModel.h b/pokemodr/models/SpeciesAbilityGroupModel.h index 244e3e30..c0a0ea5c 100644 --- a/pokemodr/models/SpeciesAbilityGroupModel.h +++ b/pokemodr/models/SpeciesAbilityGroupModel.h @@ -26,11 +26,16 @@ class Species; class SpeciesAbilityGroupModel : public GroupModel { + Q_OBJECT + public: SpeciesAbilityGroupModel(BaseModel* parent, Species* species); ~SpeciesAbilityGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/SpeciesAbilityModel.cpp b/pokemodr/models/SpeciesAbilityModel.cpp index 5ecd2212..9c015f2f 100644 --- a/pokemodr/models/SpeciesAbilityModel.cpp +++ b/pokemodr/models/SpeciesAbilityModel.cpp @@ -18,6 +18,9 @@ // Header include #include "SpeciesAbilityModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../SpeciesAbilityUI.h" @@ -29,6 +32,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + SpeciesAbilityModel::SpeciesAbilityModel(BaseModel* parent, SpeciesAbility* ability) : ObjectModel(parent, ability) { @@ -58,6 +64,12 @@ QVariant SpeciesAbilityModel::data(int role) const QWidget* widget = new SpeciesAbilityUI(static_cast<SpeciesAbility*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Ability", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -82,3 +94,8 @@ bool SpeciesAbilityModel::setData(const QVariant& value, int role) } return false; } + +void SpeciesAbilityModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/SpeciesAbilityModel.h b/pokemodr/models/SpeciesAbilityModel.h index 8974e2f8..440c1202 100644 --- a/pokemodr/models/SpeciesAbilityModel.h +++ b/pokemodr/models/SpeciesAbilityModel.h @@ -26,6 +26,8 @@ class SpeciesAbility; class SpeciesAbilityModel : public ObjectModel { + Q_OBJECT + public: SpeciesAbilityModel(BaseModel* parent, SpeciesAbility* ability); ~SpeciesAbilityModel(); @@ -33,6 +35,8 @@ class SpeciesAbilityModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/SpeciesGroupModel.cpp b/pokemodr/models/SpeciesGroupModel.cpp index 5fd85bf7..c641c818 100644 --- a/pokemodr/models/SpeciesGroupModel.cpp +++ b/pokemodr/models/SpeciesGroupModel.cpp @@ -23,20 +23,48 @@ // Pokemod includes #include "../../pokemod/Pokemod.h" +#include "../../pokemod/Species.h" + +// KDE includes +#include <KMenu> SpeciesGroupModel::SpeciesGroupModel(BaseModel* parent, Pokemod* pokemod) : GroupModel(parent, pokemod, "Species") { - setupData(); + for (int i = 0; i < pokemod->speciesCount(); ++i) + addObject(pokemod->species(i)); } SpeciesGroupModel::~SpeciesGroupModel() { } -void SpeciesGroupModel::setupData() +QVariant SpeciesGroupModel::data(const int role) const { - Pokemod* pokemod = static_cast<Pokemod*>(m_object); - for (int i = 0; i < pokemod->speciesCount(); ++i) - m_objects.append(new SpeciesModel(this, pokemod->species(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Species", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void SpeciesGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Pokemod*>(m_object)->newSpecies(); + if (object->className() == "Species") + m_objects.append(new SpeciesModel(this, static_cast<Species*>(object))); +} + +void SpeciesGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Pokemod*>(m_object)->deleteSpecies(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/SpeciesGroupModel.h b/pokemodr/models/SpeciesGroupModel.h index ddd7ccdb..200a8a92 100644 --- a/pokemodr/models/SpeciesGroupModel.h +++ b/pokemodr/models/SpeciesGroupModel.h @@ -26,11 +26,16 @@ class Pokemod; class SpeciesGroupModel : public GroupModel { + Q_OBJECT + public: SpeciesGroupModel(BaseModel* parent, Pokemod* pokemod); ~SpeciesGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/SpeciesItemGroupModel.cpp b/pokemodr/models/SpeciesItemGroupModel.cpp index dc95f4d5..591e8757 100644 --- a/pokemodr/models/SpeciesItemGroupModel.cpp +++ b/pokemodr/models/SpeciesItemGroupModel.cpp @@ -23,20 +23,48 @@ // Pokemod includes #include "../../pokemod/Species.h" +#include "../../pokemod/SpeciesItem.h" + +// KDE includes +#include <KMenu> SpeciesItemGroupModel::SpeciesItemGroupModel(BaseModel* parent, Species* species) : GroupModel(parent, species, "Items") { - setupData(); + for (int i = 0; i < species->itemCount(); ++i) + addObject(species->item(i)); } SpeciesItemGroupModel::~SpeciesItemGroupModel() { } -void SpeciesItemGroupModel::setupData() +QVariant SpeciesItemGroupModel::data(const int role) const { - Species* species = static_cast<Species*>(m_object); - for (int i = 0; i < species->itemCount(); ++i) - m_objects.append(new SpeciesItemModel(this, species->item(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Item", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void SpeciesItemGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Species*>(m_object)->newItem(); + if (object->className() == "SpeciesItem") + m_objects.append(new SpeciesItemModel(this, static_cast<SpeciesItem*>(object))); +} + +void SpeciesItemGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Species*>(m_object)->deleteItem(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/SpeciesItemGroupModel.h b/pokemodr/models/SpeciesItemGroupModel.h index 0c3257b4..1db37cf2 100644 --- a/pokemodr/models/SpeciesItemGroupModel.h +++ b/pokemodr/models/SpeciesItemGroupModel.h @@ -26,11 +26,16 @@ class Species; class SpeciesItemGroupModel : public GroupModel { + Q_OBJECT + public: SpeciesItemGroupModel(BaseModel* parent, Species* species); ~SpeciesItemGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/SpeciesItemModel.cpp b/pokemodr/models/SpeciesItemModel.cpp index 2303d408..74f874f7 100644 --- a/pokemodr/models/SpeciesItemModel.cpp +++ b/pokemodr/models/SpeciesItemModel.cpp @@ -18,6 +18,9 @@ // Header include #include "SpeciesItemModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../SpeciesItemUI.h" @@ -29,6 +32,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + SpeciesItemModel::SpeciesItemModel(BaseModel* parent, SpeciesItem* item) : ObjectModel(parent, item) { @@ -58,6 +64,12 @@ QVariant SpeciesItemModel::data(int role) const QWidget* widget = new SpeciesItemUI(static_cast<SpeciesItem*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Item", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -82,3 +94,8 @@ bool SpeciesItemModel::setData(const QVariant& value, int role) } return false; } + +void SpeciesItemModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/SpeciesItemModel.h b/pokemodr/models/SpeciesItemModel.h index f7968f4b..626d0db9 100644 --- a/pokemodr/models/SpeciesItemModel.h +++ b/pokemodr/models/SpeciesItemModel.h @@ -26,6 +26,8 @@ class SpeciesItem; class SpeciesItemModel : public ObjectModel { + Q_OBJECT + public: SpeciesItemModel(BaseModel* parent, SpeciesItem* item); ~SpeciesItemModel(); @@ -33,6 +35,8 @@ class SpeciesItemModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/SpeciesModel.cpp b/pokemodr/models/SpeciesModel.cpp index c9093218..14f4f785 100644 --- a/pokemodr/models/SpeciesModel.cpp +++ b/pokemodr/models/SpeciesModel.cpp @@ -27,12 +27,18 @@ #include "../SpeciesUI.h" // Pokemod includes -#include "../../pokemod/Species.h" #include "../../pokemod/Pokemod.h" +#include "../../pokemod/Species.h" +#include "../../pokemod/SpeciesAbility.h" +#include "../../pokemod/SpeciesItem.h" +#include "../../pokemod/SpeciesMove.h" // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + SpeciesModel::SpeciesModel(BaseModel* parent, Species* species) : GroupObjectModel(parent, species) { @@ -59,6 +65,12 @@ QVariant SpeciesModel::data(int role) const QWidget* widget = new SpeciesUI(static_cast<Species*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Species", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return GroupObjectModel::data(role); } @@ -86,9 +98,23 @@ bool SpeciesModel::setData(const QVariant& value, int role) return false; } +void SpeciesModel::addObject(Object* /*object*/) +{ +} + +void SpeciesModel::deleteObject(BaseModel* /*model*/) +{ +} + +void SpeciesModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} + void SpeciesModel::setupData() { - m_objects.append(new SpeciesAbilityGroupModel(this, static_cast<Species*>(m_object))); - m_objects.append(new SpeciesItemGroupModel(this, static_cast<Species*>(m_object))); - m_objects.append(new SpeciesMoveGroupModel(this, static_cast<Species*>(m_object))); + Species* species = static_cast<Species*>(m_object); + m_objects.append(new SpeciesAbilityGroupModel(this, species)); + m_objects.append(new SpeciesItemGroupModel(this, species)); + m_objects.append(new SpeciesMoveGroupModel(this, species)); } diff --git a/pokemodr/models/SpeciesModel.h b/pokemodr/models/SpeciesModel.h index dc58e581..265a81e4 100644 --- a/pokemodr/models/SpeciesModel.h +++ b/pokemodr/models/SpeciesModel.h @@ -26,6 +26,8 @@ class Species; class SpeciesModel : public GroupObjectModel { + Q_OBJECT + public: SpeciesModel(BaseModel* parent, Species* species); ~SpeciesModel(); @@ -33,6 +35,11 @@ class SpeciesModel : public GroupObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void addObject(Object* /*object = NULL*/); + void deleteObject(BaseModel* /*model*/); + + void deleteSelf(); protected: void setupData(); }; diff --git a/pokemodr/models/SpeciesMoveGroupModel.cpp b/pokemodr/models/SpeciesMoveGroupModel.cpp index bfb6f040..0093b2aa 100644 --- a/pokemodr/models/SpeciesMoveGroupModel.cpp +++ b/pokemodr/models/SpeciesMoveGroupModel.cpp @@ -23,20 +23,48 @@ // Pokemod includes #include "../../pokemod/Species.h" +#include "../../pokemod/SpeciesMove.h" + +// KDE includes +#include <KMenu> SpeciesMoveGroupModel::SpeciesMoveGroupModel(BaseModel* parent, Species* species) : GroupModel(parent, species, "Moves") { - setupData(); + for (int i = 0; i < species->moveCount(); ++i) + addObject(species->move(i)); } SpeciesMoveGroupModel::~SpeciesMoveGroupModel() { } -void SpeciesMoveGroupModel::setupData() +QVariant SpeciesMoveGroupModel::data(const int role) const { - Species* species = static_cast<Species*>(m_object); - for (int i = 0; i < species->moveCount(); ++i) - m_objects.append(new SpeciesMoveModel(this, species->move(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Move", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void SpeciesMoveGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Species*>(m_object)->newMove(); + if (object->className() == "SpeciesMove") + m_objects.append(new SpeciesMoveModel(this, static_cast<SpeciesMove*>(object))); +} + +void SpeciesMoveGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Species*>(m_object)->deleteMove(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/SpeciesMoveGroupModel.h b/pokemodr/models/SpeciesMoveGroupModel.h index 30b80d81..5711f484 100644 --- a/pokemodr/models/SpeciesMoveGroupModel.h +++ b/pokemodr/models/SpeciesMoveGroupModel.h @@ -26,11 +26,16 @@ class Species; class SpeciesMoveGroupModel : public GroupModel { + Q_OBJECT + public: SpeciesMoveGroupModel(BaseModel* parent, Species* species); ~SpeciesMoveGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/SpeciesMoveModel.cpp b/pokemodr/models/SpeciesMoveModel.cpp index ac1e3bda..ab036ab5 100644 --- a/pokemodr/models/SpeciesMoveModel.cpp +++ b/pokemodr/models/SpeciesMoveModel.cpp @@ -18,6 +18,9 @@ // Header include #include "SpeciesMoveModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../SpeciesMoveUI.h" @@ -29,6 +32,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + SpeciesMoveModel::SpeciesMoveModel(BaseModel* parent, SpeciesMove* move) : ObjectModel(parent, move) { @@ -58,6 +64,12 @@ QVariant SpeciesMoveModel::data(int role) const QWidget* widget = new SpeciesMoveUI(static_cast<SpeciesMove*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Move", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -82,3 +94,8 @@ bool SpeciesMoveModel::setData(const QVariant& value, int role) } return false; } + +void SpeciesMoveModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/SpeciesMoveModel.h b/pokemodr/models/SpeciesMoveModel.h index 6eccca83..ccd73fb5 100644 --- a/pokemodr/models/SpeciesMoveModel.h +++ b/pokemodr/models/SpeciesMoveModel.h @@ -26,6 +26,8 @@ class SpeciesMove; class SpeciesMoveModel : public ObjectModel { + Q_OBJECT + public: SpeciesMoveModel(BaseModel* parent, SpeciesMove* move); ~SpeciesMoveModel(); @@ -33,6 +35,8 @@ class SpeciesMoveModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/StoreGroupModel.cpp b/pokemodr/models/StoreGroupModel.cpp index 4d94c726..ea5033f8 100644 --- a/pokemodr/models/StoreGroupModel.cpp +++ b/pokemodr/models/StoreGroupModel.cpp @@ -23,20 +23,48 @@ // Pokemod includes #include "../../pokemod/Pokemod.h" +#include "../../pokemod/Store.h" + +// KDE includes +#include <KMenu> StoreGroupModel::StoreGroupModel(BaseModel* parent, Pokemod* pokemod) : GroupModel(parent, pokemod, "Stores") { - setupData(); + for (int i = 0; i < pokemod->storeCount(); ++i) + addObject(pokemod->store(i)); } StoreGroupModel::~StoreGroupModel() { } -void StoreGroupModel::setupData() +QVariant StoreGroupModel::data(const int role) const { - Pokemod* pokemod = static_cast<Pokemod*>(m_object); - for (int i = 0; i < pokemod->storeCount(); ++i) - m_objects.append(new StoreModel(this, pokemod->store(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Store", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void StoreGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Pokemod*>(m_object)->newStore(); + if (object->className() == "Store") + m_objects.append(new StoreModel(this, static_cast<Store*>(object))); +} + +void StoreGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Pokemod*>(m_object)->deleteStore(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/StoreGroupModel.h b/pokemodr/models/StoreGroupModel.h index 7c3230cd..5ee3f0f1 100644 --- a/pokemodr/models/StoreGroupModel.h +++ b/pokemodr/models/StoreGroupModel.h @@ -26,11 +26,16 @@ class Pokemod; class StoreGroupModel : public GroupModel { + Q_OBJECT + public: StoreGroupModel(BaseModel* parent, Pokemod* pokemod); ~StoreGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/StoreModel.cpp b/pokemodr/models/StoreModel.cpp index 50d69b8c..0ce73054 100644 --- a/pokemodr/models/StoreModel.cpp +++ b/pokemodr/models/StoreModel.cpp @@ -18,6 +18,9 @@ // Header include #include "StoreModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../StoreUI.h" @@ -28,6 +31,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + StoreModel::StoreModel(BaseModel* parent, Store* store) : ObjectModel(parent, store) { @@ -52,6 +58,12 @@ QVariant StoreModel::data(int role) const QWidget* widget = new StoreUI(static_cast<Store*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Store", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -76,3 +88,8 @@ bool StoreModel::setData(const QVariant& value, int role) } return false; } + +void StoreModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/StoreModel.h b/pokemodr/models/StoreModel.h index a0c17beb..313db08e 100644 --- a/pokemodr/models/StoreModel.h +++ b/pokemodr/models/StoreModel.h @@ -26,6 +26,8 @@ class Store; class StoreModel : public ObjectModel { + Q_OBJECT + public: StoreModel(BaseModel* parent, Store* store); ~StoreModel(); @@ -33,6 +35,8 @@ class StoreModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/TileGroupModel.cpp b/pokemodr/models/TileGroupModel.cpp index f41ed080..7140b6da 100644 --- a/pokemodr/models/TileGroupModel.cpp +++ b/pokemodr/models/TileGroupModel.cpp @@ -23,20 +23,48 @@ // Pokemod includes #include "../../pokemod/Pokemod.h" +#include "../../pokemod/Tile.h" + +// KDE includes +#include <KMenu> TileGroupModel::TileGroupModel(BaseModel* parent, Pokemod* pokemod) : GroupModel(parent, pokemod, "Tiles") { - setupData(); + for (int i = 0; i < pokemod->tileCount(); ++i) + addObject(pokemod->tile(i)); } TileGroupModel::~TileGroupModel() { } -void TileGroupModel::setupData() +QVariant TileGroupModel::data(const int role) const { - Pokemod* pokemod = static_cast<Pokemod*>(m_object); - for (int i = 0; i < pokemod->tileCount(); ++i) - m_objects.append(new TileModel(this, pokemod->tile(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Tile", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void TileGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Pokemod*>(m_object)->newTile(); + if (object->className() == "Tile") + m_objects.append(new TileModel(this, static_cast<Tile*>(object))); +} + +void TileGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Pokemod*>(m_object)->deleteTile(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/TileGroupModel.h b/pokemodr/models/TileGroupModel.h index c19820c0..fef822ed 100644 --- a/pokemodr/models/TileGroupModel.h +++ b/pokemodr/models/TileGroupModel.h @@ -26,11 +26,16 @@ class Pokemod; class TileGroupModel : public GroupModel { + Q_OBJECT + public: TileGroupModel(BaseModel* parent, Pokemod* pokemod); ~TileGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/TileModel.cpp b/pokemodr/models/TileModel.cpp index e48d27ae..f6be8941 100644 --- a/pokemodr/models/TileModel.cpp +++ b/pokemodr/models/TileModel.cpp @@ -18,6 +18,9 @@ // Header include #include "TileModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../TileUI.h" @@ -28,6 +31,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + TileModel::TileModel(BaseModel* parent, Tile* tile) : ObjectModel(parent, tile) { @@ -52,6 +58,12 @@ QVariant TileModel::data(int role) const QWidget* widget = new TileUI(static_cast<Tile*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Tile", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -76,3 +88,8 @@ bool TileModel::setData(const QVariant& value, int role) } return false; } + +void TileModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/TileModel.h b/pokemodr/models/TileModel.h index 4f6ac412..1a635a40 100644 --- a/pokemodr/models/TileModel.h +++ b/pokemodr/models/TileModel.h @@ -26,6 +26,8 @@ class Tile; class TileModel : public ObjectModel { + Q_OBJECT + public: TileModel(BaseModel* parent, Tile* tile); ~TileModel(); @@ -33,6 +35,8 @@ class TileModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/TimeGroupModel.cpp b/pokemodr/models/TimeGroupModel.cpp index 1645b1c8..1ebac409 100644 --- a/pokemodr/models/TimeGroupModel.cpp +++ b/pokemodr/models/TimeGroupModel.cpp @@ -23,20 +23,48 @@ // Pokemod includes #include "../../pokemod/Pokemod.h" +#include "../../pokemod/Time.h" + +// KDE includes +#include <KMenu> TimeGroupModel::TimeGroupModel(BaseModel* parent, Pokemod* pokemod) : GroupModel(parent, pokemod, "Times") { - setupData(); + for (int i = 0; i < pokemod->timeCount(); ++i) + addObject(pokemod->time(i)); } TimeGroupModel::~TimeGroupModel() { } -void TimeGroupModel::setupData() +QVariant TimeGroupModel::data(const int role) const { - Pokemod* pokemod = static_cast<Pokemod*>(m_object); - for (int i = 0; i < pokemod->timeCount(); ++i) - m_objects.append(new TimeModel(this, pokemod->time(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Time", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void TimeGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Pokemod*>(m_object)->newTime(); + if (object->className() == "Time") + m_objects.append(new TimeModel(this, static_cast<Time*>(object))); +} + +void TimeGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Pokemod*>(m_object)->deleteTime(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/TimeGroupModel.h b/pokemodr/models/TimeGroupModel.h index 4323dfe5..56e88bd5 100644 --- a/pokemodr/models/TimeGroupModel.h +++ b/pokemodr/models/TimeGroupModel.h @@ -26,11 +26,16 @@ class Pokemod; class TimeGroupModel : public GroupModel { + Q_OBJECT + public: TimeGroupModel(BaseModel* parent, Pokemod* pokemod); ~TimeGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/TimeModel.cpp b/pokemodr/models/TimeModel.cpp index 372a90d3..05e45a15 100644 --- a/pokemodr/models/TimeModel.cpp +++ b/pokemodr/models/TimeModel.cpp @@ -18,6 +18,9 @@ // Header include #include "TimeModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../TimeUI.h" @@ -28,6 +31,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + TimeModel::TimeModel(BaseModel* parent, Time* time) : ObjectModel(parent, time) { @@ -52,6 +58,12 @@ QVariant TimeModel::data(int role) const QWidget* widget = new TimeUI(static_cast<Time*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Time", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -76,3 +88,8 @@ bool TimeModel::setData(const QVariant& value, int role) } return false; } + +void TimeModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/TimeModel.h b/pokemodr/models/TimeModel.h index 3f9ba657..5513a957 100644 --- a/pokemodr/models/TimeModel.h +++ b/pokemodr/models/TimeModel.h @@ -26,6 +26,8 @@ class Time; class TimeModel : public ObjectModel { + Q_OBJECT + public: TimeModel(BaseModel* parent, Time* time); ~TimeModel(); @@ -33,6 +35,8 @@ class TimeModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/TrainerGroupModel.cpp b/pokemodr/models/TrainerGroupModel.cpp index 60b4332a..bed923df 100644 --- a/pokemodr/models/TrainerGroupModel.cpp +++ b/pokemodr/models/TrainerGroupModel.cpp @@ -23,21 +23,48 @@ // Pokemod includes #include "../../pokemod/Pokemod.h" +#include "../../pokemod/Trainer.h" + +// KDE includes +#include <KMenu> TrainerGroupModel::TrainerGroupModel(BaseModel* parent, Pokemod* pokemod) : GroupModel(parent, pokemod, "Trainers") { - setupData(); + for (int i = 0; i < pokemod->trainerCount(); ++i) + addObject(pokemod->trainer(i)); } TrainerGroupModel::~TrainerGroupModel() { - setupData(); } -void TrainerGroupModel::setupData() +QVariant TrainerGroupModel::data(const int role) const { - Pokemod* pokemod = static_cast<Pokemod*>(m_object); - for (int i = 0; i < pokemod->trainerCount(); ++i) - m_objects.append(new TrainerModel(this, pokemod->trainer(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Trainer", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void TrainerGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Pokemod*>(m_object)->newTrainer(); + if (object->className() == "Trainer") + m_objects.append(new TrainerModel(this, static_cast<Trainer*>(object))); +} + +void TrainerGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Pokemod*>(m_object)->deleteTrainer(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/TrainerGroupModel.h b/pokemodr/models/TrainerGroupModel.h index 313d3152..aea6a1b0 100644 --- a/pokemodr/models/TrainerGroupModel.h +++ b/pokemodr/models/TrainerGroupModel.h @@ -26,11 +26,16 @@ class Pokemod; class TrainerGroupModel : public GroupModel { + Q_OBJECT + public: TrainerGroupModel(BaseModel* parent, Pokemod* pokemod); ~TrainerGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/TrainerModel.cpp b/pokemodr/models/TrainerModel.cpp index ccc9b54c..1849fe38 100644 --- a/pokemodr/models/TrainerModel.cpp +++ b/pokemodr/models/TrainerModel.cpp @@ -18,6 +18,9 @@ // Header include #include "TrainerModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../TrainerUI.h" @@ -28,6 +31,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + TrainerModel::TrainerModel(BaseModel* parent, Trainer* trainer) : ObjectModel(parent, trainer) { @@ -52,6 +58,12 @@ QVariant TrainerModel::data(int role) const QWidget* widget = new TrainerUI(static_cast<Trainer*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Trainer", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -76,3 +88,8 @@ bool TrainerModel::setData(const QVariant& value, int role) } return false; } + +void TrainerModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/TrainerModel.h b/pokemodr/models/TrainerModel.h index 052bb39c..84cf8d4d 100644 --- a/pokemodr/models/TrainerModel.h +++ b/pokemodr/models/TrainerModel.h @@ -26,6 +26,8 @@ class Trainer; class TrainerModel : public ObjectModel { + Q_OBJECT + public: TrainerModel(BaseModel* parent, Trainer* trainer); ~TrainerModel(); @@ -33,6 +35,8 @@ class TrainerModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/models/TypeGroupModel.cpp b/pokemodr/models/TypeGroupModel.cpp index 45deb3a0..944162d5 100644 --- a/pokemodr/models/TypeGroupModel.cpp +++ b/pokemodr/models/TypeGroupModel.cpp @@ -23,20 +23,48 @@ // Pokemod includes #include "../../pokemod/Pokemod.h" +#include "../../pokemod/Type.h" + +// KDE includes +#include <KMenu> TypeGroupModel::TypeGroupModel(BaseModel* parent, Pokemod* pokemod) : GroupModel(parent, pokemod, "Types") { - setupData(); + for (int i = 0; i < pokemod->typeCount(); ++i) + addObject(pokemod->type(i)); } TypeGroupModel::~TypeGroupModel() { } -void TypeGroupModel::setupData() +QVariant TypeGroupModel::data(const int role) const { - Pokemod* pokemod = static_cast<Pokemod*>(m_object); - for (int i = 0; i < pokemod->typeCount(); ++i) - m_objects.append(new TypeModel(this, pokemod->type(i))); + if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Add Type", this, SLOT(addObject())); + return QVariant::fromValue(static_cast<void*>(menu)); + } + return GroupModel::data(role); +} + +void TypeGroupModel::addObject(Object* object) +{ + if (!object) + object = static_cast<Pokemod*>(m_object)->newType(); + if (object->className() == "Type") + m_objects.append(new TypeModel(this, static_cast<Type*>(object))); +} + +void TypeGroupModel::deleteObject(BaseObjectModel* model) +{ + const int index = m_objects.indexOf(model); + if (0 <= index) + { + static_cast<Pokemod*>(m_object)->deleteType(index); + m_objects[index]->deleteLater(); + m_objects.removeAt(index); + } } diff --git a/pokemodr/models/TypeGroupModel.h b/pokemodr/models/TypeGroupModel.h index 257a5ba8..e544f8ab 100644 --- a/pokemodr/models/TypeGroupModel.h +++ b/pokemodr/models/TypeGroupModel.h @@ -26,11 +26,16 @@ class Pokemod; class TypeGroupModel : public GroupModel { + Q_OBJECT + public: TypeGroupModel(BaseModel* parent, Pokemod* pokemod); ~TypeGroupModel(); - protected: - void setupData(); + + QVariant data(const int role = Qt::DisplayRole) const; + public slots: + void addObject(Object* object = NULL); + void deleteObject(BaseObjectModel* model); }; #endif diff --git a/pokemodr/models/TypeModel.cpp b/pokemodr/models/TypeModel.cpp index 72c07ab6..7ecad48f 100644 --- a/pokemodr/models/TypeModel.cpp +++ b/pokemodr/models/TypeModel.cpp @@ -18,6 +18,9 @@ // Header include #include "TypeModel.h" +// Model includes +#include "GroupModel.h" + // PokeModr includes #include "../TypeUI.h" @@ -28,6 +31,9 @@ // Qt includes #include <QFile> +// KDE includes +#include <KMenu> + TypeModel::TypeModel(BaseModel* parent, Type* type) : ObjectModel(parent, type) { @@ -52,6 +58,12 @@ QVariant TypeModel::data(int role) const QWidget* widget = new TypeUI(static_cast<Type*>(m_object), NULL); return QVariant::fromValue(widget); } + else if (role == BaseModel::ContextMenuRole) + { + KMenu* menu = new KMenu; + menu->addAction("Delete Type", this, SLOT(deleteSelf())); + return QVariant::fromValue(static_cast<void*>(menu)); + } return ObjectModel::data(role); } @@ -76,3 +88,8 @@ bool TypeModel::setData(const QVariant& value, int role) } return false; } + +void TypeModel::deleteSelf() +{ +// static_cast<GroupModel*>(m_parent)->deleteObject(this); +} diff --git a/pokemodr/models/TypeModel.h b/pokemodr/models/TypeModel.h index b6ebeab2..5ae2fe42 100644 --- a/pokemodr/models/TypeModel.h +++ b/pokemodr/models/TypeModel.h @@ -26,6 +26,8 @@ class Type; class TypeModel : public ObjectModel { + Q_OBJECT + public: TypeModel(BaseModel* parent, Type* type); ~TypeModel(); @@ -33,6 +35,8 @@ class TypeModel : public ObjectModel QVariant data(int role = Qt::DisplayRole) const; bool setData(const QVariant& value, int role = Qt::EditRole); + public slots: + void deleteSelf(); }; #endif diff --git a/pokemodr/pokemodr.pro b/pokemodr/pokemodr.pro index 4517e89a..49e47332 100644 --- a/pokemodr/pokemodr.pro +++ b/pokemodr/pokemodr.pro @@ -16,6 +16,7 @@ CONFIG += qt \ warn_on \ gui QT += xml + !win32 { CONFIG += debug } diff --git a/version.inc b/version.inc index 10c8f5cc..71190b6d 100644 --- a/version.inc +++ b/version.inc @@ -1 +1 @@ -VERSION = 0.0.1 +VERSION = 0.0.2 |
