summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-06-21 22:42:14 -0400
committerisanae <14251494+isanae@users.noreply.github.com>2019-07-02 10:10:17 -0400
commita72573b385a941adf7d662b8df5c8e35309fdd45 (patch)
tree072fd97f0e7c9b5c34157b17753708f9c852c74a /src
parenta2e5f7d38214c9872a5c3a360065b5790bb29e2f (diff)
split categories tab
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt3
-rw-r--r--src/modinfodialog.cpp88
-rw-r--r--src/modinfodialog.h7
-rw-r--r--src/modinfodialogcategories.cpp129
-rw-r--r--src/modinfodialogcategories.h29
-rw-r--r--src/modinfodialogconflicts.cpp5
-rw-r--r--src/modinfodialogconflicts.h1
-rw-r--r--src/modinfodialogesps.cpp1
-rw-r--r--src/modinfodialogtab.cpp6
-rw-r--r--src/modinfodialogtab.h2
10 files changed, 173 insertions, 98 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index adaddb77..6ebfaddd 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -54,6 +54,7 @@ SET(organizer_SRCS
modlist.cpp
modidlineedit.cpp
modinfodialog.cpp
+ modinfodialogcategories.cpp
modinfodialogconflicts.cpp
modinfodialogesps.cpp
modinfodialogimages.cpp
@@ -159,6 +160,7 @@ SET(organizer_HDRS
modlist.h
modidlineedit.h
modinfodialog.h
+ modinfodialogcategories.h
modinfodialogconflicts.h
modinfodialogesps.h
modinfodialogimages.h
@@ -362,6 +364,7 @@ set(modinfo
modinfo
modinfobackup
modinfodialog
+ modinfodialogcategories
modinfodialogconflicts
modinfodialogesps
modinfodialogimages
diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp
index 8231d366..3263a511 100644
--- a/src/modinfodialog.cpp
+++ b/src/modinfodialog.cpp
@@ -42,6 +42,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "modinfodialogimages.h"
#include "modinfodialogesps.h"
#include "modinfodialogconflicts.h"
+#include "modinfodialogcategories.h"
#include <QDir>
#include <QDirIterator>
@@ -223,9 +224,7 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo
ui->tabWidget->setTabEnabled(TAB_IMAGES, false);
ui->tabWidget->setTabEnabled(TAB_ESPS, false);
ui->tabWidget->setTabEnabled(TAB_CONFLICTS, false);
- //ui->tabWidget->setTabEnabled(TAB_CATEGORIES, false);
- addCategories(CategoryFactory::instance(), modInfo->getCategories(), ui->categoriesTree->invisibleRootItem(), 0);
- refreshPrimaryCategoriesBox();
+ ui->tabWidget->setTabEnabled(TAB_CATEGORIES, true);
ui->tabWidget->setTabEnabled(TAB_NEXUS, false);
//ui->tabWidget->setTabEnabled(TAB_NOTES, false);
ui->tabWidget->setTabEnabled(TAB_FILETREE, false);
@@ -249,12 +248,8 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo
ui->tabWidget->setTabEnabled(TAB_CONFLICTS, true);
initFiletree(modInfo);
- addCategories(CategoryFactory::instance(), modInfo->getCategories(), ui->categoriesTree->invisibleRootItem(), 0);
- refreshPrimaryCategoriesBox();
}
-
-
ui->endorseBtn->setVisible(Settings::instance().endorsementIntegration());
ui->endorseBtn->setEnabled((m_ModInfo->endorsedState() == ModInfo::ENDORSED_FALSE) ||
(m_ModInfo->endorsedState() == ModInfo::ENDORSED_NEVER));
@@ -279,12 +274,13 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo
ModInfoDialog::~ModInfoDialog()
{
m_ModInfo->setComments(ui->commentsEdit->text());
+
//Avoid saving html stump if notes field is empty.
if (ui->notesEdit->toPlainText().isEmpty())
m_ModInfo->setNotes(ui->notesEdit->toPlainText());
else
m_ModInfo->setNotes(ui->notesEdit->toHtml());
- saveCategories(ui->categoriesTree->invisibleRootItem());
+
delete ui->descriptionView->page();
delete ui->descriptionView;
delete ui;
@@ -301,6 +297,7 @@ std::vector<std::unique_ptr<ModInfoDialogTab>> ModInfoDialog::createTabs()
v.push_back(std::make_unique<ESPsTab>(this, ui));
v.push_back(std::make_unique<ConflictsTab>(
this, ui, *m_OrganizerCore, *m_PluginContainer));
+ v.push_back(std::make_unique<CategoriesTab>(this, ui));
return v;
}
@@ -437,38 +434,6 @@ void ModInfoDialog::refreshFiles()
}
}
-void ModInfoDialog::addCategories(const CategoryFactory &factory, const std::set<int> &enabledCategories, QTreeWidgetItem *root, int rootLevel)
-{
- for (int i = 0; i < static_cast<int>(factory.numCategories()); ++i) {
- if (factory.getParentID(i) != rootLevel) {
- continue;
- }
- int categoryID = factory.getCategoryID(i);
- QTreeWidgetItem *newItem
- = new QTreeWidgetItem(QStringList(factory.getCategoryName(i)));
- newItem->setFlags(newItem->flags() | Qt::ItemIsUserCheckable);
- newItem->setCheckState(0, enabledCategories.find(categoryID)
- != enabledCategories.end()
- ? Qt::Checked
- : Qt::Unchecked);
- newItem->setData(0, Qt::UserRole, categoryID);
- if (factory.hasChildren(i)) {
- addCategories(factory, enabledCategories, newItem, categoryID);
- }
- root->addChild(newItem);
- }
-}
-
-
-void ModInfoDialog::saveCategories(QTreeWidgetItem *currentNode)
-{
- for (int i = 0; i < currentNode->childCount(); ++i) {
- QTreeWidgetItem *childNode = currentNode->child(i);
- m_ModInfo->setCategory(childNode->data(0, Qt::UserRole).toInt(), childNode->checkState(0));
- saveCategories(childNode);
- }
-}
-
void ModInfoDialog::on_closeButton_clicked()
{
@@ -1011,49 +976,6 @@ void ModInfoDialog::on_fileTree_customContextMenuRequested(const QPoint &pos)
}
-void ModInfoDialog::on_categoriesTree_itemChanged(QTreeWidgetItem *item, int)
-{
- QTreeWidgetItem *parent = item->parent();
- while ((parent != nullptr) && ((parent->flags() & Qt::ItemIsUserCheckable) != 0) && (parent->checkState(0) == Qt::Unchecked)) {
- parent->setCheckState(0, Qt::Checked);
- parent = parent->parent();
- }
- refreshPrimaryCategoriesBox();
-}
-
-
-void ModInfoDialog::addCheckedCategories(QTreeWidgetItem *tree)
-{
- for (int i = 0; i < tree->childCount(); ++i) {
- QTreeWidgetItem *child = tree->child(i);
- if (child->checkState(0) == Qt::Checked) {
- ui->primaryCategoryBox->addItem(child->text(0), child->data(0, Qt::UserRole));
- addCheckedCategories(child);
- }
- }
-}
-
-
-void ModInfoDialog::refreshPrimaryCategoriesBox()
-{
- ui->primaryCategoryBox->clear();
- int primaryCategory = m_ModInfo->getPrimaryCategory();
- addCheckedCategories(ui->categoriesTree->invisibleRootItem());
- for (int i = 0; i < ui->primaryCategoryBox->count(); ++i) {
- if (ui->primaryCategoryBox->itemData(i).toInt() == primaryCategory) {
- ui->primaryCategoryBox->setCurrentIndex(i);
- break;
- }
- }
-}
-
-void ModInfoDialog::on_primaryCategoryBox_currentIndexChanged(int index)
-{
- if (index != -1) {
- m_ModInfo->setPrimaryCategory(ui->primaryCategoryBox->itemData(index).toInt());
- }
-}
-
void ModInfoDialog::on_refreshButton_clicked()
{
if (m_ModInfo->getNexusID() > 0) {
diff --git a/src/modinfodialog.h b/src/modinfodialog.h
index 8e7fed17..384aafce 100644
--- a/src/modinfodialog.h
+++ b/src/modinfodialog.h
@@ -157,8 +157,6 @@ private:
void refreshLists();
- void addCategories(const CategoryFactory &factory, const std::set<int> &enabledCategories, QTreeWidgetItem *root, int rootLevel);
-
void updateVersionColor();
void refreshNexusData(int modID);
@@ -166,9 +164,6 @@ private:
QString getFileCategory(int categoryID);
bool recursiveDelete(const QModelIndex &index);
void deleteFile(const QModelIndex &index);
- void saveCategories(QTreeWidgetItem *currentNode);
- void addCheckedCategories(QTreeWidgetItem *tree);
- void refreshPrimaryCategoriesBox();
int tabIndex(const QString &tabId);
@@ -194,8 +189,6 @@ private slots:
void on_versionEdit_editingFinished();
void on_customUrlLineEdit_editingFinished();
void on_tabWidget_currentChanged(int index);
- void on_primaryCategoryBox_currentIndexChanged(int index);
- void on_categoriesTree_itemChanged(QTreeWidgetItem *item, int column);
void on_fileTree_customContextMenuRequested(const QPoint &pos);
void on_refreshButton_clicked();
diff --git a/src/modinfodialogcategories.cpp b/src/modinfodialogcategories.cpp
new file mode 100644
index 00000000..7df13aea
--- /dev/null
+++ b/src/modinfodialogcategories.cpp
@@ -0,0 +1,129 @@
+#include "modinfodialogcategories.h"
+#include "ui_modinfodialog.h"
+#include "categories.h"
+#include "modinfo.h"
+
+CategoriesTab::CategoriesTab(QWidget*, Ui::ModInfoDialog* ui)
+ : ui(ui)
+{
+ connect(
+ ui->categoriesTree, &QTreeWidget::itemChanged,
+ [&](auto* item, int col){ onCategoryChanged(item, col); });
+
+ connect(
+ ui->primaryCategoryBox,
+ static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
+ [&](int index){ onPrimaryChanged(index); });
+}
+
+void CategoriesTab::setMod(ModInfo::Ptr mod, MOShared::FilesOrigin* origin)
+{
+ m_mod = mod;
+}
+
+void CategoriesTab::clear()
+{
+ ui->categoriesTree->clear();
+ ui->primaryCategoryBox->clear();
+}
+
+void CategoriesTab::update()
+{
+ clear();
+
+ add(
+ CategoryFactory::instance(), m_mod->getCategories(),
+ ui->categoriesTree->invisibleRootItem(), 0);
+
+ updatePrimary();
+}
+
+void CategoriesTab::add(
+ const CategoryFactory &factory, const std::set<int>& enabledCategories,
+ QTreeWidgetItem* root, int rootLevel)
+{
+ for (int i=0; i<static_cast<int>(factory.numCategories()); ++i) {
+ if (factory.getParentID(i) != rootLevel) {
+ continue;
+ }
+
+ int categoryID = factory.getCategoryID(i);
+
+ QTreeWidgetItem *newItem
+ = new QTreeWidgetItem(QStringList(factory.getCategoryName(i)));
+
+ newItem->setFlags(newItem->flags() | Qt::ItemIsUserCheckable);
+
+ newItem->setCheckState(0, enabledCategories.find(categoryID)
+ != enabledCategories.end()
+ ? Qt::Checked
+ : Qt::Unchecked);
+
+ newItem->setData(0, Qt::UserRole, categoryID);
+
+ if (factory.hasChildren(i)) {
+ add(factory, enabledCategories, newItem, categoryID);
+ }
+
+ root->addChild(newItem);
+ }
+}
+
+void CategoriesTab::updatePrimary()
+{
+ ui->primaryCategoryBox->clear();
+
+ int primaryCategory = m_mod->getPrimaryCategory();
+
+ addChecked(ui->categoriesTree->invisibleRootItem());
+
+ for (int i = 0; i < ui->primaryCategoryBox->count(); ++i) {
+ if (ui->primaryCategoryBox->itemData(i).toInt() == primaryCategory) {
+ ui->primaryCategoryBox->setCurrentIndex(i);
+ break;
+ }
+ }
+}
+
+void CategoriesTab::addChecked(QTreeWidgetItem* tree)
+{
+ for (int i = 0; i < tree->childCount(); ++i) {
+ QTreeWidgetItem *child = tree->child(i);
+ if (child->checkState(0) == Qt::Checked) {
+ ui->primaryCategoryBox->addItem(child->text(0), child->data(0, Qt::UserRole));
+ addChecked(child);
+ }
+ }
+}
+
+void CategoriesTab::save(QTreeWidgetItem* currentNode)
+{
+ for (int i = 0; i < currentNode->childCount(); ++i) {
+ QTreeWidgetItem *childNode = currentNode->child(i);
+
+ m_mod->setCategory(
+ childNode->data(0, Qt::UserRole).toInt(), childNode->checkState(0));
+
+ save(childNode);
+ }
+}
+
+void CategoriesTab::onCategoryChanged(QTreeWidgetItem* item, int)
+{
+ QTreeWidgetItem *parent = item->parent();
+
+ while ((parent != nullptr) && ((parent->flags() & Qt::ItemIsUserCheckable) != 0) && (parent->checkState(0) == Qt::Unchecked)) {
+ parent->setCheckState(0, Qt::Checked);
+ parent = parent->parent();
+ }
+
+ updatePrimary();
+ save(ui->categoriesTree->invisibleRootItem());
+}
+
+void CategoriesTab::onPrimaryChanged(int index)
+{
+ if (index != -1) {
+ m_mod->setPrimaryCategory(ui->primaryCategoryBox->itemData(index).toInt());
+ }
+}
diff --git a/src/modinfodialogcategories.h b/src/modinfodialogcategories.h
new file mode 100644
index 00000000..c0644c7f
--- /dev/null
+++ b/src/modinfodialogcategories.h
@@ -0,0 +1,29 @@
+#include "modinfodialogtab.h"
+
+class CategoryFactory;
+
+class CategoriesTab : public ModInfoDialogTab
+{
+public:
+ CategoriesTab(QWidget* parent, Ui::ModInfoDialog* ui);
+
+ void clear() override;
+ void setMod(ModInfo::Ptr mod, MOShared::FilesOrigin* origin) override;
+ void update() override;
+
+private:
+ Ui::ModInfoDialog* ui;
+ ModInfo::Ptr m_mod;
+
+ void add(
+ const CategoryFactory& factory, const std::set<int>& enabledCategories,
+ QTreeWidgetItem* root, int rootLevel);
+
+ void updatePrimary();
+ void addChecked(QTreeWidgetItem* tree);
+
+ void save(QTreeWidgetItem* currentNode);
+
+ void onCategoryChanged(QTreeWidgetItem* item, int col);
+ void onPrimaryChanged(int index);
+};
diff --git a/src/modinfodialogconflicts.cpp b/src/modinfodialogconflicts.cpp
index 1734f4f9..d2dca492 100644
--- a/src/modinfodialogconflicts.cpp
+++ b/src/modinfodialogconflicts.cpp
@@ -151,11 +151,6 @@ void ConflictsTab::clear()
m_advanced.clear();
}
-bool ConflictsTab::feedFile(const QString&, const QString&)
-{
- return false;
-}
-
void ConflictsTab::saveState(Settings& s)
{
s.directInterface().setValue(
diff --git a/src/modinfodialogconflicts.h b/src/modinfodialogconflicts.h
index 4d4f279c..212a196d 100644
--- a/src/modinfodialogconflicts.h
+++ b/src/modinfodialogconflicts.h
@@ -108,7 +108,6 @@ public:
void update() override;
void clear() override;
- bool feedFile(const QString& rootPath, const QString& filename) override;
void saveState(Settings& s) override;
void restoreState(const Settings& s) override;
diff --git a/src/modinfodialogesps.cpp b/src/modinfodialogesps.cpp
index 6c87b10d..cb3dcc84 100644
--- a/src/modinfodialogesps.cpp
+++ b/src/modinfodialogesps.cpp
@@ -4,7 +4,6 @@
using MOBase::reportError;
-
class ESP
{
public:
diff --git a/src/modinfodialogtab.cpp b/src/modinfodialogtab.cpp
index b4734526..6dcff0ac 100644
--- a/src/modinfodialogtab.cpp
+++ b/src/modinfodialogtab.cpp
@@ -1,5 +1,11 @@
#include "modinfodialogtab.h"
+bool ModInfoDialogTab::feedFile(const QString&, const QString&)
+{
+ // no-op
+ return false;
+}
+
bool ModInfoDialogTab::canClose()
{
return true;
diff --git a/src/modinfodialogtab.h b/src/modinfodialogtab.h
index 93a495f4..ead29d10 100644
--- a/src/modinfodialogtab.h
+++ b/src/modinfodialogtab.h
@@ -22,7 +22,7 @@ public:
virtual ~ModInfoDialogTab() = default;
virtual void clear() = 0;
- virtual bool feedFile(const QString& rootPath, const QString& filename) = 0;
+ virtual bool feedFile(const QString& rootPath, const QString& filename);
virtual bool canClose();
virtual void saveState(Settings& s);
virtual void restoreState(const Settings& s);