summaryrefslogtreecommitdiff
path: root/src/filetreeitem.cpp
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2020-01-22 05:45:08 -0500
committerisanae <14251494+isanae@users.noreply.github.com>2020-02-04 03:33:22 -0500
commitc6c01f86c64a3a9fa666dddec860e52d388e5e97 (patch)
tree7089d033f95630111e373d2ee173d03492fc8b5c /src/filetreeitem.cpp
parent7c98635edc33d74ab24352e971bb6a127e7272e8 (diff)
sort
Diffstat (limited to 'src/filetreeitem.cpp')
-rw-r--r--src/filetreeitem.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/filetreeitem.cpp b/src/filetreeitem.cpp
index e7510279..a506f0f0 100644
--- a/src/filetreeitem.cpp
+++ b/src/filetreeitem.cpp
@@ -1,6 +1,8 @@
#include "filetreeitem.h"
+#include "filetreemodel.h"
#include "modinfo.h"
#include "util.h"
+#include "modinfodialogfwd.h"
#include <log.h>
using namespace MOBase;
@@ -63,6 +65,71 @@ void FileTreeItem::remove(std::size_t from, std::size_t n)
m_children.erase(begin, end);
}
+
+template <class T>
+int threeWayCompare(T&& a, T&& b)
+{
+ if (a < b) {
+ return -1;
+ }
+
+ if (a > b) {
+ return 1;
+ }
+
+ return 0;
+}
+
+class FileTreeItem::Sorter
+{
+public:
+ static int compare(int column, const FileTreeItem* a, const FileTreeItem* b)
+ {
+ switch (column)
+ {
+ case FileTreeModel::FileName:
+ return naturalCompare(a->m_file, b->m_file);
+
+ case FileTreeModel::ModName:
+ return naturalCompare(a->m_mod, b->m_mod);
+
+ case FileTreeModel::FileType:
+ return naturalCompare(a->meta().type, b->meta().type);
+
+ case FileTreeModel::FileSize:
+ return threeWayCompare(a->meta().size, b->meta().size);
+
+ case FileTreeModel::LastModified:
+ return threeWayCompare(a->meta().lastModified, b->meta().lastModified);
+
+ default:
+ return 0;
+ }
+ }
+};
+
+
+void FileTreeItem::sort(int column, Qt::SortOrder order)
+{
+ std::sort(m_children.begin(), m_children.end(), [&](auto&& a, auto&& b) {
+ int r = 0;
+
+ if (a->isDirectory() && !b->isDirectory()) {
+ r = -1;
+ } else if (!a->isDirectory() && b->isDirectory()) {
+ r = 1;
+ } else {
+ r = FileTreeItem::Sorter::compare(column, a.get(), b.get());
+ }
+
+ if (order == Qt::AscendingOrder) {
+ return (r < 0);
+ } else {
+ return (r > 0);
+ }
+ });
+}
+
QString FileTreeItem::virtualPath() const
{
QString s = "Data\\";