summaryrefslogtreecommitdiff
path: root/src/modinfodialogcategories.cpp
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/modinfodialogcategories.cpp
parenta2e5f7d38214c9872a5c3a360065b5790bb29e2f (diff)
split categories tab
Diffstat (limited to 'src/modinfodialogcategories.cpp')
-rw-r--r--src/modinfodialogcategories.cpp129
1 files changed, 129 insertions, 0 deletions
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());
+ }
+}