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"