summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/modinfodialog.cpp18
-rw-r--r--src/modinfodialog.h1
-rw-r--r--src/modinfodialog.ui7
-rw-r--r--src/modinfodialogcategories.cpp3
-rw-r--r--src/modinfodialogesps.cpp3
-rw-r--r--src/modinfodialogtab.cpp36
-rw-r--r--src/modinfodialogtab.h2
-rw-r--r--src/modinfodialogtextfiles.cpp2
-rw-r--r--src/modinforegular.cpp8
9 files changed, 56 insertions, 24 deletions
diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp
index f11fa6f3..7696023f 100644
--- a/src/modinfodialog.cpp
+++ b/src/modinfodialog.cpp
@@ -124,7 +124,8 @@ ModInfoDialog::ModInfoDialog(
MainWindow* mw, OrganizerCore* core, PluginContainer* plugin) :
TutorableDialog("ModInfoDialog", mw),
ui(new Ui::ModInfoDialog), m_mainWindow(mw),
- m_core(core), m_plugin(plugin), m_initialTab(ETabs(-1))
+ m_core(core), m_plugin(plugin), m_initialTab(ETabs(-1)),
+ m_arrangingTabs(false)
{
ui->setupUi(this);
@@ -156,6 +157,10 @@ ModInfoDialog::ModInfoDialog(
setMod(name);
update();
});
+
+ connect(
+ tabInfo.tab.get(), &ModInfoDialogTab::hasDataChanged,
+ [&]{ setTabsColors(); });
}
connect(ui->tabWidget, &QTabWidget::currentChanged, [&]{ onTabChanged(); });
@@ -269,6 +274,8 @@ void ModInfoDialog::update(bool firstTime)
void ModInfoDialog::setTabsVisibility(bool firstTime)
{
+ QScopedValueRollback arrangingTabs(m_arrangingTabs, true);
+
std::vector<bool> visibility(m_tabs.size());
bool changed = false;
@@ -374,7 +381,7 @@ void ModInfoDialog::setTabsColors()
for (const auto& tabInfo : m_tabs) {
const auto c = tabInfo.tab->hasData() ?
QColor::Invalid :
- ui->tabWidget->palette().color(QPalette::Disabled, QPalette::WindowText);
+ m_mainWindow->palette().color(QPalette::Disabled, QPalette::WindowText);
ui->tabWidget->tabBar()->setTabTextColor(tabInfo.realPos, c);
}
@@ -564,6 +571,13 @@ void ModInfoDialog::on_closeButton_clicked()
void ModInfoDialog::onTabChanged()
{
+ if (m_arrangingTabs) {
+ // this can be fired while re-arranging tabs, which happens before mods
+ // are given to tabs, and might trigger first activation, which breaks all
+ // sorts of things
+ return;
+ }
+
if (auto* tabInfo=currentTab()) {
tabInfo->tab->activated();
}
diff --git a/src/modinfodialog.h b/src/modinfodialog.h
index 36363c34..6dc66003 100644
--- a/src/modinfodialog.h
+++ b/src/modinfodialog.h
@@ -141,6 +141,7 @@ private:
PluginContainer* m_plugin;
std::vector<TabInfo> m_tabs;
ETabs m_initialTab;
+ bool m_arrangingTabs;
std::vector<TabInfo> createTabs();
TabInfo* currentTab();
diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui
index fd367e74..30ea9217 100644
--- a/src/modinfodialog.ui
+++ b/src/modinfodialog.ui
@@ -810,9 +810,6 @@ text-align: left;</string>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<widget class="QTreeWidget" name="categories">
- <property name="animated">
- <bool>true</bool>
- </property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
@@ -1038,7 +1035,7 @@ p, li { white-space: pre-wrap; }
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_10">
<item>
- <widget class="QLineEdit" name="commentsEdit">
+ <widget class="QLineEdit" name="comments">
<property name="toolTip">
<string>Enter comments about the mod here. These are displayed in the notes column of the mod list.</string>
</property>
@@ -1051,7 +1048,7 @@ p, li { white-space: pre-wrap; }
</widget>
</item>
<item>
- <widget class="HTMLEditor" name="notesEdit">
+ <widget class="HTMLEditor" name="notes">
<property name="toolTip">
<string>Enter notes about the mod here. These can be viewed in the mod list by hovering over the notes column or the flags column.</string>
</property>
diff --git a/src/modinfodialogcategories.cpp b/src/modinfodialogcategories.cpp
index 0d739d1f..8ffded59 100644
--- a/src/modinfodialogcategories.cpp
+++ b/src/modinfodialogcategories.cpp
@@ -34,7 +34,6 @@ void CategoriesTab::update()
ui->categories->invisibleRootItem(), 0);
updatePrimary();
- setHasData(ui->primaryCategories->count() > 0);
}
bool CategoriesTab::canHandleSeparators() const
@@ -92,6 +91,8 @@ void CategoriesTab::updatePrimary()
break;
}
}
+
+ setHasData(ui->primaryCategories->count() > 0);
}
void CategoriesTab::addChecked(QTreeWidgetItem* tree)
diff --git a/src/modinfodialogesps.cpp b/src/modinfodialogesps.cpp
index ecb341e8..7961096d 100644
--- a/src/modinfodialogesps.cpp
+++ b/src/modinfodialogesps.cpp
@@ -260,7 +260,6 @@ bool ESPsTab::feedFile(const QString& rootPath, const QString& fullPath)
m_inactiveModel->add(std::move(esp));
}
- setHasData(true);
return true;
}
}
@@ -272,6 +271,8 @@ void ESPsTab::update()
{
m_inactiveModel->finished();
m_activeModel->finished();
+
+ setHasData(m_inactiveModel->rowCount() > 0 || m_activeModel->rowCount() > 0);
}
void ESPsTab::onActivate()
diff --git a/src/modinfodialogtab.cpp b/src/modinfodialogtab.cpp
index d99e8727..f5eeeed1 100644
--- a/src/modinfodialogtab.cpp
+++ b/src/modinfodialogtab.cpp
@@ -131,7 +131,10 @@ void ModInfoDialogTab::emitModOpen(QString name)
void ModInfoDialogTab::setHasData(bool b)
{
- m_hasData = b;
+ if (m_hasData != b) {
+ m_hasData = b;
+ emit hasDataChanged();
+ }
}
@@ -140,14 +143,14 @@ NotesTab::NotesTab(
QWidget* parent, Ui::ModInfoDialog* ui, int index)
: ModInfoDialogTab(oc, plugin, parent, ui, index)
{
- connect(ui->commentsEdit, &QLineEdit::editingFinished, [&]{ onComments(); });
- connect(ui->notesEdit, &HTMLEditor::editingFinished, [&]{ onNotes(); });
+ connect(ui->comments, &QLineEdit::editingFinished, [&]{ onComments(); });
+ connect(ui->notes, &HTMLEditor::editingFinished, [&]{ onNotes(); });
}
void NotesTab::clear()
{
- ui->commentsEdit->clear();
- ui->notesEdit->clear();
+ ui->comments->clear();
+ ui->notes->clear();
setHasData(false);
}
@@ -156,10 +159,9 @@ void NotesTab::update()
const auto comments = mod()->comments();
const auto notes = mod()->notes();
- ui->commentsEdit->setText(comments);
- ui->notesEdit->setText(notes);
-
- setHasData(!comments.isEmpty() || !notes.isEmpty());
+ ui->comments->setText(comments);
+ ui->notes->setText(notes);
+ checkHasData();
}
bool NotesTab::canHandleSeparators() const
@@ -169,20 +171,30 @@ bool NotesTab::canHandleSeparators() const
void NotesTab::onComments()
{
- mod()->setComments(ui->commentsEdit->text());
+ mod()->setComments(ui->comments->text());
+ checkHasData();
}
void NotesTab::onNotes()
{
// Avoid saving html stub if notes field is empty.
- if (ui->notesEdit->toPlainText().isEmpty()) {
+ if (ui->notes->toPlainText().isEmpty()) {
mod()->setNotes({});
} else {
- mod()->setNotes(ui->notesEdit->toHtml());
+ mod()->setNotes(ui->notes->toHtml());
}
+
+ checkHasData();
}
bool NotesTab::usesOriginFiles() const
{
return false;
}
+
+void NotesTab::checkHasData()
+{
+ setHasData(
+ !ui->comments->text().isEmpty() ||
+ !ui->notes->toPlainText().isEmpty());
+}
diff --git a/src/modinfodialogtab.h b/src/modinfodialogtab.h
index 41d913f8..058035ab 100644
--- a/src/modinfodialogtab.h
+++ b/src/modinfodialogtab.h
@@ -49,6 +49,7 @@ public:
signals:
void originModified(int originID);
void modOpen(QString name);
+ void hasDataChanged();
protected:
Ui::ModInfoDialog* ui;
@@ -93,6 +94,7 @@ public:
private:
void onComments();
void onNotes();
+ void checkHasData();
};
#endif // MODINFODIALOGTAB_H
diff --git a/src/modinfodialogtextfiles.cpp b/src/modinfodialogtextfiles.cpp
index 2b5ab489..e3d00049 100644
--- a/src/modinfodialogtextfiles.cpp
+++ b/src/modinfodialogtextfiles.cpp
@@ -158,7 +158,6 @@ bool GenericFilesTab::feedFile(const QString& rootPath, const QString& fullPath)
for (const auto* e : extensions) {
if (wantsFile(rootPath, fullPath)) {
m_model->add(rootPath, fullPath);
- setHasData(true);
return true;
}
}
@@ -169,6 +168,7 @@ bool GenericFilesTab::feedFile(const QString& rootPath, const QString& fullPath)
void GenericFilesTab::update()
{
m_model->finished();
+ setHasData(m_model->rowCount() > 0);
}
void GenericFilesTab::onSelection(
diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp
index babbd665..4333e351 100644
--- a/src/modinforegular.cpp
+++ b/src/modinforegular.cpp
@@ -194,10 +194,14 @@ void ModInfoRegular::saveMeta()
if (metaFile.status() == QSettings::NoError) {
m_MetaInfoChanged = false;
} else {
- reportError(tr("failed to write %1/meta.ini: error %2").arg(absolutePath()).arg(metaFile.status()));
+ qCritical()
+ << QString("failed to write %1/meta.ini: error %2")
+ .arg(absolutePath()).arg(metaFile.status());
}
} else {
- reportError(tr("failed to write %1/meta.ini: error %2").arg(absolutePath()).arg(metaFile.status()));
+ qCritical()
+ << QString("failed to write %1/meta.ini: error %2")
+ .arg(absolutePath()).arg(metaFile.status());
}
}
}