summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-06-17 05:50:45 -0400
committerisanae <14251494+isanae@users.noreply.github.com>2019-07-02 10:10:17 -0400
commit9f1520c69e88113d9a1a06f91bbabe9cf5ddef9f (patch)
treeb2271eabae2529ebd4dc16b8728632978eeb67b3 /src
parent81815d202b4364847062ba248321474ef5a2d686 (diff)
split images tab stuff in ImagesTab
text editor: fixed modified flag not being set to false when loading an empty file
Diffstat (limited to 'src')
-rw-r--r--src/CMakeLists.txt3
-rw-r--r--src/modinfodialog.cpp51
-rw-r--r--src/modinfodialog.h5
-rw-r--r--src/modinfodialog.ui8
-rw-r--r--src/modinfodialogimages.cpp91
-rw-r--r--src/modinfodialogimages.h37
-rw-r--r--src/texteditor.cpp12
7 files changed, 158 insertions, 49 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 7e62f3e9..c5018baf 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -54,6 +54,7 @@ SET(organizer_SRCS
modlist.cpp
modidlineedit.cpp
modinfodialog.cpp
+ modinfodialogimages.cpp
modinfodialogtextfiles.cpp
modinfo.cpp
modinfobackup.cpp
@@ -155,6 +156,7 @@ SET(organizer_HDRS
modlist.h
modidlineedit.h
modinfodialog.h
+ modinfodialogimages.h
modinfodialogtextfiles.h
modinfo.h
modinfobackup.h
@@ -354,6 +356,7 @@ set(modinfo
modinfo
modinfobackup
modinfodialog
+ modinfodialogimages
modinfodialogtextfiles
modinfoforeign
modinfooverwrite
diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp
index 8f989d02..cc3140b6 100644
--- a/src/modinfodialog.cpp
+++ b/src/modinfodialog.cpp
@@ -39,6 +39,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "texteditor.h"
#include "modinfodialogtextfiles.h"
+#include "modinfodialogimages.h"
#include <QDir>
#include <QDirIterator>
@@ -68,10 +69,16 @@ std::vector<std::unique_ptr<ModInfoDialogTab>> ModInfoDialogTab::createTabs(
v.push_back(std::make_unique<TextFilesTab>(ui));
v.push_back(std::make_unique<IniFilesTab>(ui));
+ v.push_back(std::make_unique<ImagesTab>(ui));
return v;
}
+bool ModInfoDialogTab::canClose()
+{
+ return true;
+}
+
class ModFileListWidget : public QListWidgetItem {
@@ -262,7 +269,7 @@ public:
ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directory, bool unmanaged, OrganizerCore *organizerCore, PluginContainer *pluginContainer, QWidget *parent)
: TutorableDialog("ModInfoDialog", parent), ui(new Ui::ModInfoDialog), m_ModInfo(modInfo),
- m_ThumbnailMapper(this), m_RequestStarted(false),
+ m_RequestStarted(false),
m_NewFolderAction(nullptr), m_OpenAction(nullptr), m_PreviewAction(nullptr),
m_RenameAction(nullptr), m_DeleteAction(nullptr), m_HideAction(nullptr),
m_UnhideAction(nullptr), m_Directory(directory), m_Origin(nullptr),
@@ -307,8 +314,6 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo
ui->descriptionView->setPage(new DescriptionPage());
- connect(&m_ThumbnailMapper, SIGNAL(mapped(const QString&)), this, SIGNAL(thumbnailClickedSignal(const QString&)));
- connect(this, SIGNAL(thumbnailClickedSignal(const QString&)), this, SLOT(thumbnailClicked(const QString&)));
connect(m_ModInfo.data(), SIGNAL(modDetailsUpdated(bool)), this, SLOT(modDetailsUpdated(bool)));
connect(ui->descriptionView->page(), SIGNAL(linkClicked(QUrl)), this, SLOT(linkClicked(QUrl)));
//TODO: No easy way to delegate links
@@ -347,14 +352,16 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo
{
ui->tabWidget->setTabEnabled(TAB_TEXTFILES, false);
ui->tabWidget->setTabEnabled(TAB_INIFILES, false);
+ ui->tabWidget->setTabEnabled(TAB_IMAGES, false);
ui->tabWidget->setTabEnabled(TAB_CATEGORIES, false);
ui->tabWidget->setTabEnabled(TAB_NEXUS, false);
ui->tabWidget->setTabEnabled(TAB_FILETREE, false);
ui->tabWidget->setTabEnabled(TAB_NOTES, false);
ui->tabWidget->setTabEnabled(TAB_ESPS, false);
- ui->tabWidget->setTabEnabled(TAB_IMAGES, false);
} else {
ui->tabWidget->setTabEnabled(TAB_TEXTFILES, true);
+ ui->tabWidget->setTabEnabled(TAB_INIFILES, true);
+ ui->tabWidget->setTabEnabled(TAB_IMAGES, true);
initFiletree(modInfo);
addCategories(CategoryFactory::instance(), modInfo->getCategories(), ui->categoriesTree->invisibleRootItem(), 0);
@@ -843,13 +850,6 @@ void ModInfoDialog::refreshFiles()
ui->inactiveESPList->clear();
ui->activeESPList->clear();
- ui->imageLabel->setPixmap({});
-
- while (ui->thumbnailArea->count() > 0) {
- auto* item = ui->thumbnailArea->takeAt(0);
- delete item->widget();
- delete item;
- }
if (m_RootPath.length() > 0) {
@@ -875,27 +875,10 @@ void ModInfoDialog::refreshFiles()
} else {
ui->activeESPList->addItem(relativePath);
}
- } else if ((fileName.endsWith(".png", Qt::CaseInsensitive)) ||
- (fileName.endsWith(".jpg", Qt::CaseInsensitive))) {
- QImage image = QImage(fileName);
- if (!image.isNull()) {
- if (static_cast<float>(image.width()) / static_cast<float>(image.height()) > 1.34) {
- image = image.scaledToWidth(128);
- } else {
- image = image.scaledToHeight(96);
- }
-
- QPushButton *thumbnailButton = new QPushButton(QPixmap::fromImage(image), "");
- thumbnailButton->setIconSize(QSize(image.width(), image.height()));
- connect(thumbnailButton, SIGNAL(clicked()), &m_ThumbnailMapper, SLOT(map()));
- m_ThumbnailMapper.setMapping(thumbnailButton, fileName);
- ui->thumbnailArea->addWidget(thumbnailButton);
- }
}
}
}
- ui->tabWidget->setTabEnabled(TAB_IMAGES, ui->thumbnailArea->count() != 0);
ui->tabWidget->setTabEnabled(TAB_ESPS, (ui->inactiveESPList->count() != 0) || (ui->activeESPList->count() != 0));
}
@@ -964,18 +947,6 @@ void ModInfoDialog::openTab(int tab)
}
}
-void ModInfoDialog::thumbnailClicked(const QString &fileName)
-{
- ui->imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
- QImage image(fileName);
- if (static_cast<float>(image.width()) / static_cast<float>(image.height()) > 1.34) {
- image = image.scaledToWidth(ui->imageLabel->geometry().width());
- } else {
- image = image.scaledToHeight(ui->imageLabel->geometry().height());
- }
- ui->imageLabel->setPixmap(QPixmap::fromImage(image));
-}
-
void ModInfoDialog::on_activateESP_clicked()
{
QListWidget *activeESPList = findChild<QListWidget*>("activeESPList");
diff --git a/src/modinfodialog.h b/src/modinfodialog.h
index 70fd157c..f3ef6e76 100644
--- a/src/modinfodialog.h
+++ b/src/modinfodialog.h
@@ -69,7 +69,7 @@ public:
virtual void clear() = 0;
virtual bool feedFile(const QString& rootPath, const QString& filename) = 0;
- virtual bool canClose() = 0;
+ virtual bool canClose();
};
@@ -135,7 +135,6 @@ public:
signals:
- void thumbnailClickedSignal(const QString &filename);
void linkActivated(const QString &link);
void downloadRequest(const QString &link);
void modOpen(const QString &modName, int tab);
@@ -172,7 +171,6 @@ private:
int tabIndex(const QString &tabId);
private slots:
- void thumbnailClicked(const QString &fileName);
void linkClicked(const QUrl &url);
void linkClicked(QString url);
@@ -239,7 +237,6 @@ private:
std::vector<std::unique_ptr<ModInfoDialogTab>> m_tabs;
- QSignalMapper m_ThumbnailMapper;
QString m_RootPath;
OrganizerCore *m_OrganizerCore;
diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui
index c6ab111f..ba670ef3 100644
--- a/src/modinfodialog.ui
+++ b/src/modinfodialog.ui
@@ -154,7 +154,7 @@
<item>
<widget class="QLabel" name="imageLabel">
<property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <sizepolicy hsizetype="Ignored" vsizetype="Ignored">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -183,7 +183,7 @@
</widget>
</item>
<item>
- <widget class="QScrollArea" name="scrollArea">
+ <widget class="QScrollArea" name="imageScrollArea">
<property name="maximumSize">
<size>
<width>16777215</width>
@@ -193,7 +193,7 @@
<property name="widgetResizable">
<bool>true</bool>
</property>
- <widget class="QWidget" name="scrollAreaWidgetContents">
+ <widget class="QWidget" name="imageScrollAreaContent">
<property name="geometry">
<rect>
<x>0</x>
@@ -225,7 +225,7 @@
<number>0</number>
</property>
<item>
- <layout class="QHBoxLayout" name="thumbnailArea">
+ <layout class="QHBoxLayout" name="imageThumbnails">
<property name="spacing">
<number>0</number>
</property>
diff --git a/src/modinfodialogimages.cpp b/src/modinfodialogimages.cpp
new file mode 100644
index 00000000..4f2ee78c
--- /dev/null
+++ b/src/modinfodialogimages.cpp
@@ -0,0 +1,91 @@
+#include "modinfodialogimages.h"
+#include "ui_modinfodialog.h"
+
+ThumbnailButton::ThumbnailButton(const QString& fullPath, QImage original)
+ : m_original(std::move(original))
+{
+ const auto ratio = static_cast<double>(m_original.width()) / m_original.height();
+
+ QImage thumbnail;
+ if (ratio > 1.34) {
+ thumbnail = m_original.scaledToWidth(128);
+ } else {
+ thumbnail = m_original.scaledToHeight(96);
+ }
+
+ setIcon(QPixmap::fromImage(thumbnail));
+ setIconSize(QSize(thumbnail.width(), thumbnail.height()));
+
+ connect(this, &QPushButton::clicked, [&]{ emit open(m_original); });
+}
+
+const QImage& ThumbnailButton::image() const
+{
+ return m_original;
+}
+
+
+ImagesTab::ImagesTab(Ui::ModInfoDialog* ui)
+ : ui(ui)
+{
+}
+
+void ImagesTab::clear()
+{
+ ui->imageLabel->setPixmap({});
+
+ while (ui->imageThumbnails->count() > 0) {
+ auto* item = ui->imageThumbnails->takeAt(0);
+ delete item->widget();
+ delete item;
+ }
+}
+
+bool ImagesTab::feedFile(const QString& rootPath, const QString& fullPath)
+{
+ static constexpr const char* extensions[] = {
+ ".png", ".jpg"
+ };
+
+ for (const auto* e : extensions) {
+ if (fullPath.endsWith(e, Qt::CaseInsensitive)) {
+ add(fullPath);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void ImagesTab::add(const QString& fullPath)
+{
+ QImage image = QImage(fullPath);
+
+ if (image.isNull()) {
+ qWarning() << "ImagesTab: '" << fullPath << "' is not a valid image";
+ return;
+ }
+
+ auto* button = new ThumbnailButton(fullPath, std::move(image));
+
+ QObject::connect(
+ button, &ThumbnailButton::open,
+ [&](const QImage& image){ onOpen(image); });
+
+ ui->imageThumbnails->addWidget(button);
+}
+
+void ImagesTab::onOpen(const QImage& original)
+{
+ QImage image;
+
+ const auto ratio = static_cast<double>(original.width()) / original.height();
+
+ if (ratio > 1.34) {
+ image = original.scaledToWidth(ui->imageLabel->geometry().width());
+ } else {
+ image = original.scaledToHeight(ui->imageLabel->geometry().height());
+ }
+
+ ui->imageLabel->setPixmap(QPixmap::fromImage(image));
+}
diff --git a/src/modinfodialogimages.h b/src/modinfodialogimages.h
new file mode 100644
index 00000000..3c492e77
--- /dev/null
+++ b/src/modinfodialogimages.h
@@ -0,0 +1,37 @@
+#ifndef MODINFODIALOGIMAGES_H
+#define MODINFODIALOGIMAGES_H
+
+#include "modinfodialog.h"
+
+class ThumbnailButton : public QPushButton
+{
+ Q_OBJECT;
+
+public:
+ ThumbnailButton(const QString& fullPath, QImage image);
+ const QImage& image() const;
+
+signals:
+ void open(const QImage& image);
+
+private:
+ const QImage m_original;
+};
+
+
+class ImagesTab : public ModInfoDialogTab
+{
+public:
+ ImagesTab(Ui::ModInfoDialog* ui);
+
+ void clear() override;
+ bool feedFile(const QString& rootPath, const QString& fullPath) override;
+
+private:
+ Ui::ModInfoDialog* ui;
+
+ void add(const QString& fullPath);
+ void onOpen(const QImage& image);
+};
+
+#endif // MODINFODIALOGIMAGES_H
diff --git a/src/texteditor.cpp b/src/texteditor.cpp
index 78ce1610..99490b22 100644
--- a/src/texteditor.cpp
+++ b/src/texteditor.cpp
@@ -60,9 +60,19 @@ void TextEditor::setDefaultStyle()
bool TextEditor::load(const QString& filename)
{
m_filename = filename;
- setPlainText(MOBase::readFileText(filename, &m_encoding));
+ clear();
+
+ const QString s = MOBase::readFileText(filename, &m_encoding);
+
+ setPlainText(s);
document()->setModified(false);
+ if (s.isEmpty()) {
+ // the modificationChanged even is not fired by the setModified() call
+ // above when the text being set is empty
+ onModified(false);
+ }
+
return true;
}