summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-05-20 17:38:17 -0400
committerisanae <14251494+isanae@users.noreply.github.com>2019-05-20 17:38:17 -0400
commit00f8cbff05c3f548baba59b0cb525205cc1d80e3 (patch)
tree706ead7a454c40f5e5981db58f0ae853426488e1
parenta2b1f6a3604d8a2e4bc47c2b91fb58e6d5b45af6 (diff)
expandable sections in the conflict tab
-rw-r--r--src/modinfodialog.cpp65
-rw-r--r--src/modinfodialog.h21
-rw-r--r--src/modinfodialog.ui218
3 files changed, 237 insertions, 67 deletions
diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp
index 3c68f4e8..3f8b58a9 100644
--- a/src/modinfodialog.cpp
+++ b/src/modinfodialog.cpp
@@ -265,6 +265,61 @@ bool FileRenamer::renameFailed(const QString& oldName, const QString& newName)
}
+ExpanderWidget::ExpanderWidget()
+ : m_button(nullptr), m_content(nullptr)
+{
+}
+
+ExpanderWidget::ExpanderWidget(QToolButton* button, QWidget* content)
+ : ExpanderWidget()
+{
+ set(button, content);
+}
+
+void ExpanderWidget::set(QToolButton* button, QWidget* content, bool o)
+{
+ m_button = button;
+ m_content = content;
+
+ m_button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+ m_button->setCheckable(true);
+
+ if (o)
+ open();
+ else
+ close();
+
+ QObject::connect(m_button, &QToolButton::clicked, [&]{ toggle(); });
+}
+
+void ExpanderWidget::open()
+{
+ m_button->setArrowType(Qt::DownArrow);
+ m_button->setChecked(false);
+ m_content->show();
+}
+
+void ExpanderWidget::close()
+{
+ m_button->setArrowType(Qt::RightArrow);
+ m_button->setChecked(false);
+ m_content->hide();
+}
+
+void ExpanderWidget::toggle()
+{
+ if (opened())
+ close();
+ else
+ open();
+}
+
+bool ExpanderWidget::opened() const
+{
+ return m_content->isVisible();
+}
+
+
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),
@@ -378,6 +433,10 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo
if (ui->tabWidget->currentIndex() == TAB_NEXUS) {
activateNexusTab();
}
+
+ m_overwriteExpander.set(ui->overwriteExpander, ui->overwriteTree, true);
+ m_overwrittenExpander.set(ui->overwrittenExpander, ui->overwrittenTree, true);
+ m_nonconflictExpander.set(ui->noConflictExpander, ui->noConflictTree);
}
@@ -501,7 +560,7 @@ void ModInfoDialog::refreshLists()
ui->overwriteTree->clear();
ui->overwrittenTree->clear();
- ui->noconflictTree->clear();
+ ui->noConflictTree->clear();
if (m_Origin != nullptr) {
std::vector<FileEntry::Ptr> files = m_Origin->getFiles();
@@ -520,7 +579,7 @@ void ModInfoDialog::refreshLists()
}
altString << m_Directory->getOriginByID(altIter->first).getName();
}
- QStringList fields(relativeName.prepend("..."));
+ QStringList fields(relativeName);
fields.append(ToQString(altString.str()));
QTreeWidgetItem *item = new QTreeWidgetItem(fields);
@@ -544,7 +603,7 @@ void ModInfoDialog::refreshLists()
font.setItalic(true);
item->setFont(0, font);
}
- ui->noconflictTree->addTopLevelItem(item);
+ ui->noConflictTree->addTopLevelItem(item);
++numNonConflicting;
}
} else {
diff --git a/src/modinfodialog.h b/src/modinfodialog.h
index 66c50be5..731611d2 100644
--- a/src/modinfodialog.h
+++ b/src/modinfodialog.h
@@ -183,6 +183,25 @@ private:
};
+class ExpanderWidget
+{
+public:
+ ExpanderWidget();
+ ExpanderWidget(QToolButton* button, QWidget* content);
+
+ void set(QToolButton* button, QWidget* content, bool opened=false);
+
+ void open();
+ void close();
+ void toggle();
+ bool opened() const;
+
+private:
+ QToolButton* m_button;
+ QWidget* m_content;
+};
+
+
/**
* this is a larger dialog used to visualise information abount the mod.
* @todo this would probably a good place for a plugin-system
@@ -383,6 +402,8 @@ private:
std::map<int, int> m_RealTabPos;
+ ExpanderWidget m_overwriteExpander, m_overwrittenExpander, m_nonconflictExpander;
+
bool canHideConflictItem(const QTreeWidgetItem* item) const;
bool canUnhideConflictItem(const QTreeWidgetItem* item) const;
bool canPreviewConflictItem(const QTreeWidgetItem* item) const;
diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui
index 25fce40c..0d96f621 100644
--- a/src/modinfodialog.ui
+++ b/src/modinfodialog.ui
@@ -400,28 +400,57 @@ Most mods do not have optional esps, so chances are good you are looking at an e
<attribute name="title">
<string>Conflicts</string>
</attribute>
- <layout class="QVBoxLayout" name="verticalLayout_8">
+ <layout class="QVBoxLayout" name="verticalLayout_8" stretch="0,1,0,1,0,1,0">
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
<item>
- <layout class="QHBoxLayout" name="horizontalLayout_10" stretch="1,0">
+ <layout class="QVBoxLayout" name="overwriteRoot">
<item>
- <widget class="QLabel" name="label_7">
- <property name="text">
- <string>The following conflicted files are provided by this mod</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLCDNumber" name="overwriteCount">
- <property name="frameShadow">
- <enum>QFrame::Sunken</enum>
- </property>
- <property name="lineWidth">
- <number>1</number>
- </property>
- <property name="segmentStyle">
- <enum>QLCDNumber::Flat</enum>
- </property>
- </widget>
+ <layout class="QHBoxLayout" name="overwriteHeader" stretch="0,0,0">
+ <item>
+ <widget class="QToolButton" name="overwriteExpander">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">border: none</string>
+ </property>
+ <property name="text">
+ <string>The following conflicted files are provided by this mod</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="overwriteSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLCDNumber" name="overwriteCount">
+ <property name="frameShadow">
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="lineWidth">
+ <number>1</number>
+ </property>
+ <property name="segmentStyle">
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
</layout>
</item>
@@ -470,23 +499,49 @@ Most mods do not have optional esps, so chances are good you are looking at an e
</widget>
</item>
<item>
- <layout class="QHBoxLayout" name="horizontalLayout_9" stretch="1,0">
- <item>
- <widget class="QLabel" name="label_8">
- <property name="text">
- <string>The following conflicted files are provided by other mods</string>
- </property>
- </widget>
- </item>
+ <layout class="QVBoxLayout" name="overwrittenRoot">
<item>
- <widget class="QLCDNumber" name="overwrittenCount">
- <property name="frameShadow">
- <enum>QFrame::Sunken</enum>
- </property>
- <property name="segmentStyle">
- <enum>QLCDNumber::Flat</enum>
- </property>
- </widget>
+ <layout class="QHBoxLayout" name="overwrittenHeader" stretch="0,0,0">
+ <item>
+ <widget class="QToolButton" name="overwrittenExpander">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">border: none</string>
+ </property>
+ <property name="text">
+ <string>The following conflicted files are provided by other mods</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="overwrittenSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLCDNumber" name="overwrittenCount">
+ <property name="frameShadow">
+ <enum>QFrame::Sunken</enum>
+ </property>
+ <property name="segmentStyle">
+ <enum>QLCDNumber::Flat</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
</layout>
</item>
@@ -526,17 +581,39 @@ Most mods do not have optional esps, so chances are good you are looking at an e
</widget>
</item>
<item>
- <layout class="QVBoxLayout" name="verticalLayout_11">
+ <layout class="QVBoxLayout" name="noConflictRoot">
<item>
- <layout class="QHBoxLayout" name="horizontalLayout_15" stretch="1,0">
+ <layout class="QHBoxLayout" name="noConflictHeader" stretch="0,0,0">
<item>
- <widget class="QLabel" name="label_13">
+ <widget class="QToolButton" name="noConflictExpander">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">border: none;</string>
+ </property>
<property name="text">
- <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;The following files have no conflicts&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ <string>The following files have no conflicts</string>
</property>
</widget>
</item>
<item>
+ <spacer name="noConflictSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
<widget class="QLCDNumber" name="noConflictCount">
<property name="frameShadow">
<enum>QFrame::Sunken</enum>
@@ -548,32 +625,45 @@ Most mods do not have optional esps, so chances are good you are looking at an e
</item>
</layout>
</item>
- <item>
- <widget class="QTreeWidget" name="noconflictTree">
- <property name="contextMenuPolicy">
- <enum>Qt::CustomContextMenu</enum>
- </property>
- <property name="textElideMode">
- <enum>Qt::ElideLeft</enum>
- </property>
- <property name="sortingEnabled">
- <bool>true</bool>
- </property>
- <property name="animated">
- <bool>true</bool>
- </property>
- <property name="columnCount">
- <number>1</number>
- </property>
- <column>
- <property name="text">
- <string>File</string>
- </property>
- </column>
- </widget>
- </item>
</layout>
</item>
+ <item>
+ <widget class="QTreeWidget" name="noConflictTree">
+ <property name="contextMenuPolicy">
+ <enum>Qt::CustomContextMenu</enum>
+ </property>
+ <property name="textElideMode">
+ <enum>Qt::ElideLeft</enum>
+ </property>
+ <property name="sortingEnabled">
+ <bool>true</bool>
+ </property>
+ <property name="animated">
+ <bool>true</bool>
+ </property>
+ <property name="columnCount">
+ <number>1</number>
+ </property>
+ <column>
+ <property name="text">
+ <string>File</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
</layout>
</widget>
<widget class="QWidget" name="tabCategories">