diff options
| author | isanae <14251494+isanae@users.noreply.github.com> | 2019-06-25 17:44:41 -0400 |
|---|---|---|
| committer | isanae <14251494+isanae@users.noreply.github.com> | 2019-07-02 10:10:19 -0400 |
| commit | fa20f81b46c3f8c89fcbbdff6e5da0225c707358 (patch) | |
| tree | d02df7f08ba1fdac3fb9d6b699621cfc69638944 /src | |
| parent | 65b3eb24fc5e3e1033d583a24cb51a19b0cfac2c (diff) | |
replaced reportError() calls by qCritical() because they can come from a thread, which hangs the ui
categories and notes will update the tab color when changing
fixed rare crash when reordering tabs while loading a mod
Diffstat (limited to 'src')
| -rw-r--r-- | src/modinfodialog.cpp | 18 | ||||
| -rw-r--r-- | src/modinfodialog.h | 1 | ||||
| -rw-r--r-- | src/modinfodialog.ui | 7 | ||||
| -rw-r--r-- | src/modinfodialogcategories.cpp | 3 | ||||
| -rw-r--r-- | src/modinfodialogesps.cpp | 3 | ||||
| -rw-r--r-- | src/modinfodialogtab.cpp | 36 | ||||
| -rw-r--r-- | src/modinfodialogtab.h | 2 | ||||
| -rw-r--r-- | src/modinfodialogtextfiles.cpp | 2 | ||||
| -rw-r--r-- | src/modinforegular.cpp | 8 |
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()); } } } |
