]> cloud.milkyroute.net Git - dolphin.git/blob - src/kitemviews/kitemrange.h
Fix selection rect after porting from QFontMetrics::width()
[dolphin.git] / src / kitemviews / kitemrange.h
1 /***************************************************************************
2 * Copyright (C) 2011 by Peter Penz <peter.penz19@gmail.com> *
3 * Copyright (C) 2013 by Frank Reininghaus <frank78ac@googlemail.com> *
4 * *
5 * Based on the Itemviews NG project from Trolltech Labs *
6 * *
7 * This program is free software; you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation; either version 2 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * This program is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with this program; if not, write to the *
19 * Free Software Foundation, Inc., *
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
21 ***************************************************************************/
22
23 #ifndef KITEMRANGE_H
24 #define KITEMRANGE_H
25
26 #include <QList>
27
28 struct KItemRange
29 {
30 KItemRange(int index = 0, int count = 0);
31 int index;
32 int count;
33
34 bool operator == (const KItemRange& other) const;
35 };
36
37 inline KItemRange::KItemRange(int index, int count) :
38 index(index),
39 count(count)
40 {
41 }
42
43 inline bool KItemRange::operator == (const KItemRange& other) const
44 {
45 return index == other.index && count == other.count;
46 }
47
48
49 class KItemRangeList : public QList<KItemRange>
50 {
51 public:
52 KItemRangeList() : QList<KItemRange>() {}
53 explicit KItemRangeList(const QList<KItemRange>& list) : QList<KItemRange>(list) {}
54
55 template<class Container>
56 static KItemRangeList fromSortedContainer(const Container& container);
57
58 KItemRangeList& operator<<(const KItemRange& range)
59 {
60 append(range);
61 return *this;
62 }
63 };
64
65 template<class Container>
66 KItemRangeList KItemRangeList::fromSortedContainer(const Container& container)
67 {
68 typename Container::const_iterator it = container.constBegin();
69 const typename Container::const_iterator end = container.constEnd();
70
71 if (it == end) {
72 return KItemRangeList();
73 }
74
75 KItemRangeList result;
76
77 int index = *it;
78 int count = 1;
79
80 // Remove duplicates, see https://bugs.kde.org/show_bug.cgi?id=335672
81 while (it != end && *it == index) {
82 ++it;
83 }
84
85 while (it != end) {
86 if (*it == index + count) {
87 ++count;
88 } else {
89 result << KItemRange(index, count);
90 index = *it;
91 count = 1;
92 }
93 ++it;
94
95 // Remove duplicates, see https://bugs.kde.org/show_bug.cgi?id=335672
96 while (it != end && *it == *(it - 1)) {
97 ++it;
98 }
99 }
100
101 result << KItemRange(index, count);
102 return result;
103 }
104
105 #endif