File indexing completed on 2024-06-23 05:14:16

0001 /* -*- mode: c++; c-basic-offset:4 -*-
0002     utils/headerview.cpp
0003 
0004     This file is part of Kleopatra, the KDE keymanager
0005     SPDX-FileCopyrightText: 2008 Klarälvdalens Datakonsult AB
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #include <config-kleopatra.h>
0011 
0012 #include "headerview.h"
0013 
0014 #include <algorithm>
0015 #include <numeric>
0016 
0017 #include "kleopatra_debug.h"
0018 
0019 // #define ENABLE_HEADERVIEW_DEBUG
0020 
0021 #ifdef ENABLE_HEADERVIEW_DEBUG
0022 #define hvDebug qDebug
0023 #else
0024 #define hvDebug                                                                                                                                                \
0025     if (true) {                                                                                                                                                \
0026     } else                                                                                                                                                     \
0027         qDebug
0028 #endif
0029 
0030 using namespace Kleo;
0031 
0032 static std::vector<int> section_sizes(const QHeaderView *view)
0033 {
0034     Q_ASSERT(view);
0035     std::vector<int> result;
0036     result.reserve(view->count());
0037     for (int i = 0, end = view->count(); i != end; ++i) {
0038         result.push_back(view->sectionSize(i));
0039     }
0040     return result;
0041 }
0042 
0043 static void apply_section_sizes(QHeaderView *view, const std::vector<int> &newSizes)
0044 {
0045     Q_ASSERT(view);
0046     for (unsigned int i = 0, end = newSizes.size(); i != end; ++i) {
0047         view->resizeSection(i, newSizes[i]);
0048     }
0049 }
0050 
0051 namespace
0052 {
0053 
0054 template<typename T_container>
0055 inline typename T_container::value_type lookup(const T_container &c, unsigned int i, const typename T_container::value_type &defaultValue)
0056 {
0057     return i < c.size() ? c[i] : defaultValue;
0058 }
0059 
0060 }
0061 
0062 class HeaderView::Private
0063 {
0064     friend class ::Kleo::HeaderView;
0065     HeaderView *const q;
0066 
0067 public:
0068     Private(HeaderView *qq)
0069         : q(qq)
0070         , mousePressed(false)
0071         , sizes()
0072     {
0073         connect(q, &QHeaderView::sectionCountChanged, q, [this](int oldCount, int newCount) {
0074             _klhv_slotSectionCountChanged(oldCount, newCount);
0075         });
0076         connect(q, &QHeaderView::sectionResized, q, [this](int idx, int oldSize, int newSize) {
0077             _klhv_slotSectionResized(idx, oldSize, newSize);
0078         });
0079     }
0080 
0081     void _klhv_slotSectionCountChanged(int oldCount, int newCount)
0082     {
0083         if (newCount == oldCount) {
0084             return;
0085         }
0086         hvDebug() << oldCount << "->" << newCount;
0087         if (newCount < oldCount) {
0088             return;
0089         }
0090         ensureNumSections(newCount);
0091         apply_section_sizes(q, sizes);
0092     }
0093 
0094     void _klhv_slotSectionResized(int idx, int oldSize, int newSize)
0095     {
0096         hvDebug() << idx << ':' << oldSize << "->" << newSize;
0097         ensureNumSections(idx + 1);
0098         sizes[idx] = newSize;
0099     }
0100 
0101     void ensureNumSections(unsigned int num)
0102     {
0103         if (num > sizes.size()) {
0104             sizes.resize(num, q->defaultSectionSize());
0105         }
0106     }
0107 
0108     bool mousePressed : 1;
0109     std::vector<int> sizes;
0110 };
0111 
0112 HeaderView::HeaderView(Qt::Orientation o, QWidget *p)
0113     : QHeaderView(o, p)
0114     , d(new Private(this))
0115 {
0116 }
0117 
0118 HeaderView::~HeaderView()
0119 {
0120 }
0121 
0122 void HeaderView::setSectionSizes(const std::vector<int> &sizes)
0123 {
0124     hvDebug() << sizes;
0125     d->ensureNumSections(sizes.size());
0126     d->sizes = sizes;
0127     apply_section_sizes(this, sizes);
0128     hvDebug() << "->" << sectionSizes();
0129 }
0130 
0131 std::vector<int> HeaderView::sectionSizes() const
0132 {
0133     return section_sizes(this);
0134 }
0135 
0136 #include "moc_headerview.cpp"