summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-06-17 04:54:41 -0400
committerisanae <14251494+isanae@users.noreply.github.com>2019-07-02 10:10:17 -0400
commit81815d202b4364847062ba248321474ef5a2d686 (patch)
treec576425a1f8d301e604f44310e6fa3d503bb52c7 /src
parentb96f154625a0a139e722731b055f022bc90c2058 (diff)
split ini tab stuff to IniFilesTab
refactored TextFilesTab into GenericFiles so it can be used by IniFilesTab
Diffstat (limited to 'src')
-rw-r--r--src/modinfodialog.cpp90
-rw-r--r--src/modinfodialog.h8
-rw-r--r--src/modinfodialog.ui38
-rw-r--r--src/modinfodialogtextfiles.cpp117
-rw-r--r--src/modinfodialogtextfiles.h41
5 files changed, 124 insertions, 170 deletions
diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp
index 23b8f4d8..8f989d02 100644
--- a/src/modinfodialog.cpp
+++ b/src/modinfodialog.cpp
@@ -67,6 +67,7 @@ std::vector<std::unique_ptr<ModInfoDialogTab>> ModInfoDialogTab::createTabs(
std::vector<std::unique_ptr<ModInfoDialogTab>> v;
v.push_back(std::make_unique<TextFilesTab>(ui));
+ v.push_back(std::make_unique<IniFilesTab>(ui));
return v;
}
@@ -840,7 +841,6 @@ void ModInfoDialog::refreshFiles()
tab->clear();
}
- ui->iniFileList->clear();
ui->inactiveESPList->clear();
ui->activeESPList->clear();
ui->imageLabel->setPixmap({});
@@ -863,11 +863,7 @@ void ModInfoDialog::refreshFiles()
}
}
- if ((fileName.endsWith(".ini", Qt::CaseInsensitive) || fileName.endsWith(".cfg", Qt::CaseInsensitive)) &&
- !fileName.endsWith("meta.ini")) {
- QString namePart = fileName.mid(m_RootPath.length() + 1);
- ui->iniFileList->addItem(namePart);
- } else if (fileName.endsWith(".esp", Qt::CaseInsensitive) ||
+ if (fileName.endsWith(".esp", Qt::CaseInsensitive) ||
fileName.endsWith(".esm", Qt::CaseInsensitive) ||
fileName.endsWith(".esl", Qt::CaseInsensitive)) {
QString relativePath = fileName.mid(m_RootPath.length() + 1);
@@ -944,10 +940,6 @@ void ModInfoDialog::on_closeButton_clicked()
}
}
- if (!allowNavigateFromINI()) {
- return;
- }
-
close();
}
@@ -984,84 +976,6 @@ void ModInfoDialog::thumbnailClicked(const QString &fileName)
ui->imageLabel->setPixmap(QPixmap::fromImage(image));
}
-bool ModInfoDialog::allowNavigateFromINI()
-{
- if (ui->saveButton->isEnabled()) {
- int res = QMessageBox::question(this, tr("Save changes?"), tr("Save changes to \"%1\"?").arg(ui->iniFileView->property("currentFile").toString()),
- QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
- if (res == QMessageBox::Cancel) {
- return false;
- } else if (res == QMessageBox::Yes) {
- saveCurrentIniFile();
- }
- }
- return true;
-}
-
-void ModInfoDialog::openIniFile(const QString &fileName)
-{
- QFile iniFile(fileName);
- iniFile.open(QIODevice::ReadOnly);
- QByteArray buffer = iniFile.readAll();
-
- QTextCodec *codec = QTextCodec::codecForUtfText(buffer, QTextCodec::codecForName("utf-8"));
- QTextEdit *iniFileView = findChild<QTextEdit*>("iniFileView");
- iniFileView->setText(codec->toUnicode(buffer));
- iniFileView->setProperty("currentFile", fileName);
- iniFileView->setProperty("encoding", codec->name());
- iniFile.close();
-
- ui->saveButton->setEnabled(false);
-}
-
-void ModInfoDialog::on_iniFileList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous)
-{
- QString fullPath = m_RootPath + "/" + current->text();
-
- QVariant currentFile = ui->iniFileView->property("currentFile");
- if (currentFile.isValid() && (currentFile.toString() == fullPath)) {
- // the new file is the same as the currently displayed file. May be the result of a cancelation
- return;
- }
-
- if (allowNavigateFromINI()) {
- openIniFile(fullPath);
- } else {
- ui->iniFileList->setCurrentItem(previous, QItemSelectionModel::Current);
- }
-}
-
-void ModInfoDialog::on_saveButton_clicked()
-{
- saveCurrentIniFile();
-}
-
-
-void ModInfoDialog::saveCurrentIniFile()
-{
- QVariant fileNameVar = ui->iniFileView->property("currentFile");
- QVariant encodingVar = ui->iniFileView->property("encoding");
- if (fileNameVar.isValid() && !fileNameVar.toString().isEmpty()) {
- QString fileName = fileNameVar.toString();
- QDir().mkpath(QFileInfo(fileName).absolutePath());
- QFile txtFile(fileName);
- txtFile.open(QIODevice::WriteOnly);
- txtFile.resize(0);
- QTextCodec *codec = QTextCodec::codecForName(encodingVar.toString().toUtf8());
- QString data = ui->iniFileView->toPlainText().replace("\n", "\r\n");
- txtFile.write(codec->fromUnicode(data));
- } else {
- reportError("no file selected");
- }
- ui->saveButton->setEnabled(false);
-}
-
-void ModInfoDialog::on_iniFileView_textChanged()
-{
- QPushButton* saveButton = findChild<QPushButton*>("saveButton");
- saveButton->setEnabled(true);
-}
-
void ModInfoDialog::on_activateESP_clicked()
{
QListWidget *activeESPList = findChild<QListWidget*>("activeESPList");
diff --git a/src/modinfodialog.h b/src/modinfodialog.h
index 0d54177a..70fd157c 100644
--- a/src/modinfodialog.h
+++ b/src/modinfodialog.h
@@ -53,8 +53,6 @@ class QTreeView;
class CategoryFactory;
class TextEditor;
-class TextFilesTab;
-
class ModInfoDialogTab
{
@@ -166,9 +164,6 @@ private:
bool recursiveDelete(const QModelIndex &index);
void deleteFile(const QModelIndex &index);
void saveCategories(QTreeWidgetItem *currentNode);
- void saveCurrentIniFile();
- void openIniFile(const QString &fileName);
- bool allowNavigateFromINI();
FileRenamer::RenameResults hideFile(FileRenamer& renamer, const QString &oldName);
FileRenamer::RenameResults unhideFile(FileRenamer& renamer, const QString &oldName);
void addCheckedCategories(QTreeWidgetItem *tree);
@@ -193,7 +188,6 @@ private slots:
void on_openInExplorerButton_clicked();
void on_closeButton_clicked();
- void on_saveButton_clicked();
void on_activateESP_clicked();
void on_deactivateESP_clicked();
void on_visitNexusLabel_linkActivated(const QString &link);
@@ -201,11 +195,9 @@ private slots:
void on_sourceGameEdit_currentIndexChanged(int);
void on_versionEdit_editingFinished();
void on_customUrlLineEdit_editingFinished();
- void on_iniFileView_textChanged();
void on_tabWidget_currentChanged(int index);
void on_primaryCategoryBox_currentIndexChanged(int index);
void on_categoriesTree_itemChanged(QTreeWidgetItem *item, int column);
- void on_iniFileList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous);
void on_overwriteTree_itemDoubleClicked(QTreeWidgetItem *item, int column);
void on_overwrittenTree_itemDoubleClicked(QTreeWidgetItem *item, int column);
void on_overwriteTree_customContextMenuRequested(const QPoint &pos);
diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui
index 10ebbb33..c6ab111f 100644
--- a/src/modinfodialog.ui
+++ b/src/modinfodialog.ui
@@ -86,7 +86,7 @@
<number>0</number>
</property>
<item>
- <widget class="TextEditor" name="textFileView"/>
+ <widget class="TextEditor" name="textFileEditor"/>
</item>
</layout>
</widget>
@@ -96,11 +96,11 @@
</widget>
<widget class="QWidget" name="tabIni">
<attribute name="title">
- <string>INI-Files</string>
+ <string>INI Files</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_9">
<item>
- <widget class="QSplitter" name="splitter">
+ <widget class="QSplitter" name="tabIniSplitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
@@ -129,43 +129,15 @@
</layout>
</widget>
<widget class="QWidget" name="">
- <layout class="QVBoxLayout" name="verticalLayout_4" stretch="0,0">
+ <layout class="QVBoxLayout" name="verticalLayout_4" stretch="0">
<item>
- <widget class="QTextBrowser" name="iniFileView">
+ <widget class="TextEditor" name="iniFileEditor">
<property name="toolTip">
<string/>
</property>
<property name="whatsThis">
<string/>
</property>
- <property name="undoRedoEnabled">
- <bool>true</bool>
- </property>
- <property name="readOnly">
- <bool>false</bool>
- </property>
- <property name="acceptRichText">
- <bool>false</bool>
- </property>
- <property name="openLinks">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="saveButton">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="toolTip">
- <string>Save changes to the file.</string>
- </property>
- <property name="whatsThis">
- <string>Save changes to the file. This overwrites the original. There is no automatic backup!</string>
- </property>
- <property name="text">
- <string>Save</string>
- </property>
</widget>
</item>
</layout>
diff --git a/src/modinfodialogtextfiles.cpp b/src/modinfodialogtextfiles.cpp
index 50174ec5..cf800aa6 100644
--- a/src/modinfodialogtextfiles.cpp
+++ b/src/modinfodialogtextfiles.cpp
@@ -2,10 +2,10 @@
#include "ui_modinfodialog.h"
#include <QMessageBox>
-class TextFileItem : public QListWidgetItem
+class FileListItem : public QListWidgetItem
{
public:
- TextFileItem(const QString& rootPath, QString fullPath)
+ FileListItem(const QString& rootPath, QString fullPath)
: m_fullPath(std::move(fullPath))
{
setText(m_fullPath.mid(rootPath.length() + 1));
@@ -21,46 +21,36 @@ private:
};
-TextFilesTab::TextFilesTab(Ui::ModInfoDialog* ui)
- : ui(ui)
+GenericFilesTab::GenericFilesTab(QListWidget* list, QSplitter* sp, TextEditor* e)
+ : m_list(list), m_editor(e)
{
- ui->textFileView->setupToolbar();
+ m_editor->setupToolbar();
- ui->tabTextSplitter->setSizes({200, 1});
- ui->tabTextSplitter->setStretchFactor(0, 0);
- ui->tabTextSplitter->setStretchFactor(1, 1);
+ sp->setSizes({200, 1});
+ sp->setStretchFactor(0, 0);
+ sp->setStretchFactor(1, 1);
QObject::connect(
- ui->textFileList, &QListWidget::currentItemChanged,
+ m_list, &QListWidget::currentItemChanged,
[&](auto* current, auto* previous){ onSelection(current, previous); });
}
-void TextFilesTab::clear()
+void GenericFilesTab::clear()
{
- ui->textFileList->clear();
+ m_list->clear();
select(nullptr);
}
-bool TextFilesTab::feedFile(const QString& rootPath, const QString& fullPath)
-{
- if (fullPath.endsWith(".txt", Qt::CaseInsensitive)) {
- ui->textFileList->addItem(new TextFileItem(rootPath, fullPath));
- return true;
- }
-
- return false;
-}
-
-bool TextFilesTab::canClose()
+bool GenericFilesTab::canClose()
{
- if (!ui->textFileView->dirty()) {
+ if (!m_editor->dirty()) {
return true;
}
const int res = QMessageBox::question(
- ui->tabText,
+ m_list,
QObject::tr("Save changes?"),
- QObject::tr("Save changes to \"%1\"?").arg(ui->textFileView->filename()),
+ QObject::tr("Save changes to \"%1\"?").arg(m_editor->filename()),
QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
if (res == QMessageBox::Cancel) {
@@ -68,35 +58,94 @@ bool TextFilesTab::canClose()
}
if (res == QMessageBox::Yes) {
- ui->textFileView->save();
+ m_editor->save();
}
return true;
}
-void TextFilesTab::onSelection(
+bool GenericFilesTab::feedFile(const QString& rootPath, const QString& fullPath)
+{
+ static constexpr const char* extensions[] = {
+ ".txt"
+ };
+
+ for (const auto* e : extensions) {
+ if (wantsFile(rootPath, fullPath)) {
+ m_list->addItem(new FileListItem(rootPath, fullPath));
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void GenericFilesTab::onSelection(
QListWidgetItem* current, QListWidgetItem* previous)
{
- auto* item = dynamic_cast<TextFileItem*>(current);
+ auto* item = dynamic_cast<FileListItem*>(current);
if (!item) {
- qCritical("TextFilesTab: item is not a TextFileItem");
+ qCritical("TextFilesTab: item is not a FileListItem");
return;
}
if (!canClose()) {
- ui->textFileList->setCurrentItem(previous, QItemSelectionModel::Current);
+ m_list->setCurrentItem(previous, QItemSelectionModel::Current);
return;
}
select(item);
}
-void TextFilesTab::select(TextFileItem* item)
+void GenericFilesTab::select(FileListItem* item)
{
if (item) {
- ui->textFileView->setEnabled(true);
- ui->textFileView->load(item->fullPath());
+ m_editor->setEnabled(true);
+ m_editor->load(item->fullPath());
} else {
- ui->textFileView->setEnabled(false);
+ m_editor->setEnabled(false);
}
}
+
+
+TextFilesTab::TextFilesTab(Ui::ModInfoDialog* ui)
+ : GenericFilesTab(ui->textFileList, ui->tabTextSplitter, ui->textFileEditor)
+{
+}
+
+bool TextFilesTab::wantsFile(const QString& rootPath, const QString& fullPath) const
+{
+ static constexpr const char* extensions[] = {
+ ".txt"
+ };
+
+ for (const auto* e : extensions) {
+ if (fullPath.endsWith(e, Qt::CaseInsensitive)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+IniFilesTab::IniFilesTab(Ui::ModInfoDialog* ui)
+ : GenericFilesTab(ui->iniFileList, ui->tabIniSplitter, ui->iniFileEditor)
+{
+}
+
+bool IniFilesTab::wantsFile(const QString& rootPath, const QString& fullPath) const
+{
+ static constexpr const char* extensions[] = {
+ ".ini", ".cfg"
+ };
+
+ for (const auto* e : extensions) {
+ if (fullPath.endsWith(e, Qt::CaseInsensitive)) {
+ if (!fullPath.endsWith("meta.ini")) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
diff --git a/src/modinfodialogtextfiles.h b/src/modinfodialogtextfiles.h
index 80eb9dc0..8725ea09 100644
--- a/src/modinfodialogtextfiles.h
+++ b/src/modinfodialogtextfiles.h
@@ -2,23 +2,50 @@
#define MODINFODIALOGTEXTFILES_H
#include "modinfodialog.h"
+#include <QSplitter>
+#include <QListWidget>
-class TextFileItem;
+class FileListItem;
+class TextEditor;
-class TextFilesTab : public ModInfoDialogTab
+class GenericFilesTab : public ModInfoDialogTab
{
public:
- TextFilesTab(Ui::ModInfoDialog* ui);
+ GenericFilesTab(QListWidget* list, QSplitter* splitter, TextEditor* editor);
void clear() override;
- bool feedFile(const QString& rootPath, const QString& fullPath) override;
bool canClose() override;
+ bool feedFile(const QString& rootPath, const QString& fullPath) override;
-private:
- Ui::ModInfoDialog* ui;
+protected:
+ QListWidget* m_list;
+ TextEditor* m_editor;
+
+ virtual bool wantsFile(const QString& rootPath, const QString& fullPath) const = 0;
+private:
void onSelection(QListWidgetItem* current, QListWidgetItem* previous);
- void select(TextFileItem* item);
+ void select(FileListItem* item);
+};
+
+
+class TextFilesTab : public GenericFilesTab
+{
+public:
+ TextFilesTab(Ui::ModInfoDialog* ui);
+
+protected:
+ bool wantsFile(const QString& rootPath, const QString& fullPath) const override;
+};
+
+
+class IniFilesTab : public GenericFilesTab
+{
+public:
+ IniFilesTab(Ui::ModInfoDialog* ui);
+
+protected:
+ bool wantsFile(const QString& rootPath, const QString& fullPath) const override;
};
#endif // MODINFODIALOGTEXTFILES_H