summaryrefslogtreecommitdiff
path: root/src/modelutils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/modelutils.cpp')
-rw-r--r--src/modelutils.cpp58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/modelutils.cpp b/src/modelutils.cpp
index d464bb91..7b54d258 100644
--- a/src/modelutils.cpp
+++ b/src/modelutils.cpp
@@ -2,6 +2,8 @@
#include <QAbstractProxyModel>
+namespace MOShared {
+
QModelIndexList flatIndex(
const QAbstractItemModel* model, int column, const QModelIndex& parent)
{
@@ -13,6 +15,26 @@ QModelIndexList flatIndex(
return index;
}
+static QModelIndexList visibleIndexImpl(QTreeView* view, int column, const QModelIndex& parent)
+{
+ if (parent.isValid() && !view->isExpanded(parent)) {
+ return {};
+ }
+
+ auto* model = view->model();
+ QModelIndexList index;
+ for (std::size_t i = 0; i < model->rowCount(parent); ++i) {
+ index.append(model->index(i, column, parent));
+ index.append(visibleIndexImpl(view, column, index.back()));
+ }
+ return index;
+}
+
+QModelIndexList visibleIndex(QTreeView* view, int column)
+{
+ return visibleIndexImpl(view, column, QModelIndex());
+}
+
QModelIndex indexModelToView(const QModelIndex& index, const QAbstractItemView* view)
{
// we need to stack the proxy
@@ -67,3 +89,39 @@ QModelIndexList indexViewToModel(const QModelIndexList& index, const QAbstractIt
}
return result;
}
+
+QColor childrenColor(const QModelIndex& index, QTreeView* view, int role)
+{
+ auto* model = view->model();
+ auto rowIndex = index.sibling(index.row(), 0);
+
+ if (model->hasChildren(rowIndex) && !view->isExpanded(rowIndex)) {
+
+ // this is a non-expanded item
+ std::vector<QColor> colors;
+ for (int i = 0; i < model->rowCount(rowIndex); ++i) {
+ auto childData = model->data(model->index(i, index.column(), rowIndex), role);
+ if (childData.isValid() && childData.canConvert<QColor>()) {
+ colors.push_back(childData.value<QColor>());
+ }
+ }
+
+ if (colors.empty()) {
+ return QColor();
+ }
+
+ int r = 0, g = 0, b = 0, a = 0;
+ for (auto& color : colors) {
+ r += color.red();
+ g += color.green();
+ b += color.blue();
+ a += color.alpha();
+ }
+
+ return QColor(r / colors.size(), g / colors.size(), b / colors.size(), a / colors.size());
+ }
+
+ return QColor();
+}
+
+}