OpenXLSX 1.10.0
Loading...
Searching...
No Matches
XLSlicerCollection.hpp
Go to the documentation of this file.
1#ifndef OPENXLSX_XLSLICERCOLLECTION_HPP
2#define OPENXLSX_XLSLICERCOLLECTION_HPP
3
4#include "OpenXLSX-Exports.hpp"
5#include "XLSlicer.hpp"
6#include "XLTables.hpp" // XLTable, XLSlicerOptions (legacy)
7#include "XLPivotTable.hpp" // XLPivotTable
8#include <string>
9#include <string_view>
10#include <vector>
11
12namespace OpenXLSX
13{
14 class XLWorksheet;
15
16 // ─────────────────────────────────────────────────────────────────────────
17 // XLSlicerBuilder
18 //
19 // Returned by XLSlicerCollection::add(). Accumulates configuration using a
20 // fluent API, then writes the complete XML in one shot on destruction (RAII)
21 // or when build() is called explicitly.
22 // ─────────────────────────────────────────────────────────────────────────
23 class OPENXLSX_EXPORT XLSlicerBuilder
24 {
25 public:
26 // Internal: called only by XLSlicerCollection::add()
28 std::string cellRef,
29 const XLTable* table,
30 const XLPivotTable* pivot,
31 std::string columnName);
33
34 // Non-copyable, movable
38 XLSlicerBuilder& operator=(XLSlicerBuilder&&) = delete;
39
40 // ── Fluent configuration ─────────────────────────────────────────────
42 XLSlicerBuilder& name(std::string_view n);
44 XLSlicerBuilder& caption(std::string_view c);
48 XLSlicerBuilder& styleRaw(std::string_view rawName);
50 XLSlicerBuilder& size(uint32_t widthPx, uint32_t heightPx);
52 XLSlicerBuilder& showOnly(const std::vector<std::string>& items);
54 XLSlicerBuilder& columnCount(int cols);
56 XLSlicerBuilder& sortDescending(bool desc = true);
58 XLSlicerBuilder& lockedPosition(bool locked = true);
60 XLSlicerBuilder& offset(int32_t dx, int32_t dy);
61
64 XLSlicer build();
65
67 operator XLSlicer();
68
69 private:
70 void commit();
71
72 struct State {
73 std::string name;
74 std::string caption;
75 std::string styleRaw = ""; // Empty = no style attribute (Excel default)
76 uint32_t widthPx = 144;
77 uint32_t heightPx = 200;
78 int32_t offsetX = 0;
79 int32_t offsetY = 0;
80 int columnCount = 0; // 0 = unset
81 bool sortDesc = false;
82 bool locked = false;
83 std::vector<std::string> selectedItems;
84 };
85
86 XLWorksheet* m_worksheet;
87 const XLTable* m_table;
88 const XLPivotTable* m_pivot;
89 std::string m_cellRef;
90 std::string m_columnName;
91 State m_state;
92 bool m_committed{false};
93 XLSlicer m_result;
94 };
95
96 // ─────────────────────────────────────────────────────────────────────────
97 // XLSlicerCollection
98 //
99 // Manages all slicers on a single worksheet. Returned by
100 // XLWorksheet::slicers(). Provides STL-compatible iteration and named
101 // / indexed access. Replaces the old std::vector<XLSlicer>.
102 // ─────────────────────────────────────────────────────────────────────────
103 class OPENXLSX_EXPORT XLSlicerCollection
104 {
105 public:
106 // ── Iterator ────────────────────────────────────────────────────────
108 {
109 public:
110 using iterator_category = std::forward_iterator_tag;
112 using difference_type = std::ptrdiff_t;
115
116 explicit Iterator(std::vector<XLSlicer>* vec, size_t idx)
117 : m_vec(vec), m_idx(idx) {}
118
119 XLSlicer& operator*() { return (*m_vec)[m_idx]; }
120 XLSlicer* operator->() { return &(*m_vec)[m_idx]; }
121 Iterator& operator++() { ++m_idx; return *this; }
122 bool operator==(const Iterator& o) const { return m_idx == o.m_idx; }
123 bool operator!=(const Iterator& o) const { return m_idx != o.m_idx; }
124 private:
125 std::vector<XLSlicer>* m_vec;
126 size_t m_idx;
127 };
128
130 {
131 public:
132 using iterator_category = std::forward_iterator_tag;
134 using difference_type = std::ptrdiff_t;
135 using pointer = const XLSlicer*;
136 using reference = const XLSlicer&;
137
138 explicit ConstIterator(const std::vector<XLSlicer>* vec, size_t idx)
139 : m_vec(vec), m_idx(idx) {}
140
141 const XLSlicer& operator*() const { return (*m_vec)[m_idx]; }
142 const XLSlicer* operator->() const { return &(*m_vec)[m_idx]; }
143 ConstIterator& operator++() { ++m_idx; return *this; }
144 bool operator==(const ConstIterator& o) const { return m_idx == o.m_idx; }
145 bool operator!=(const ConstIterator& o) const { return m_idx != o.m_idx; }
146 private:
147 const std::vector<XLSlicer>* m_vec;
148 size_t m_idx;
149 };
150
151 // ── Constructors ────────────────────────────────────────────────────
153 explicit XLSlicerCollection(XLWorksheet* worksheet);
154
155 // ── Query ────────────────────────────────────────────────────────────
156 [[nodiscard]] size_t count() const;
157 [[nodiscard]] bool empty() const;
158 [[nodiscard]] bool contains(std::string_view name) const;
159
161 [[nodiscard]] XLSlicer find(std::string_view name) const;
162 [[nodiscard]] XLSlicer& operator[](size_t index);
163 [[nodiscard]] XLSlicer& operator[](std::string_view name);
164 [[nodiscard]] const XLSlicer& operator[](size_t index) const;
165
166 // ── Iteration ────────────────────────────────────────────────────────
167 Iterator begin();
168 Iterator end();
169 ConstIterator begin() const;
170 ConstIterator end() const;
171
172 // ── STL compatibility (replaces old std::vector<XLSlicer>) ───────────
173 [[nodiscard]] size_t size() const { return count(); }
174 bool valid() const { return m_worksheet != nullptr; }
175
176 // ── Add (new ergonomic API) ──────────────────────────────────────────
178 [[nodiscard]] XLSlicerBuilder add(std::string_view cellRef,
179 const XLTable& table,
180 std::string_view columnName);
182 [[nodiscard]] XLSlicerBuilder add(std::string_view cellRef,
183 const XLPivotTable& pivotTable,
184 std::string_view fieldName);
185
186 // ── Remove ────────────────────────────────────────────────────────────
187 void remove(std::string_view name);
188 void remove(size_t index);
189
190 // ── Internal: called by XLSlicerBuilder::commit() ───────────────────
191 void reload();
192
193 private:
194 XLWorksheet* m_worksheet{nullptr};
195 mutable std::vector<XLSlicer> m_slicers;
196 mutable bool m_loaded{false};
197
198 void load() const;
199 };
200
201} // namespace OpenXLSX
202
203#endif // OPENXLSX_XLSLICERCOLLECTION_HPP
Definition XLPivotTable.hpp:139
Definition XLSlicerCollection.hpp:24
XLSlicerBuilder(const XLSlicerBuilder &)=delete
XLSlicerBuilder & operator=(const XLSlicerBuilder &)=delete
Definition XLSlicerCollection.hpp:130
const XLSlicer & operator*() const
Definition XLSlicerCollection.hpp:141
const XLSlicer * operator->() const
Definition XLSlicerCollection.hpp:142
std::forward_iterator_tag iterator_category
Definition XLSlicerCollection.hpp:132
ConstIterator(const std::vector< XLSlicer > *vec, size_t idx)
Definition XLSlicerCollection.hpp:138
bool operator!=(const ConstIterator &o) const
Definition XLSlicerCollection.hpp:145
bool operator==(const ConstIterator &o) const
Definition XLSlicerCollection.hpp:144
std::ptrdiff_t difference_type
Definition XLSlicerCollection.hpp:134
ConstIterator & operator++()
Definition XLSlicerCollection.hpp:143
Definition XLSlicerCollection.hpp:108
XLSlicer & operator*()
Definition XLSlicerCollection.hpp:119
std::forward_iterator_tag iterator_category
Definition XLSlicerCollection.hpp:110
std::ptrdiff_t difference_type
Definition XLSlicerCollection.hpp:112
XLSlicer * operator->()
Definition XLSlicerCollection.hpp:120
bool operator==(const Iterator &o) const
Definition XLSlicerCollection.hpp:122
bool operator!=(const Iterator &o) const
Definition XLSlicerCollection.hpp:123
Iterator(std::vector< XLSlicer > *vec, size_t idx)
Definition XLSlicerCollection.hpp:116
Iterator & operator++()
Definition XLSlicerCollection.hpp:121
Definition XLSlicerCollection.hpp:104
bool valid() const
Definition XLSlicerCollection.hpp:174
size_t size() const
Definition XLSlicerCollection.hpp:173
Definition XLSlicer.hpp:48
The XLTable class represents a single Excel table (.xml file).
Definition XLTables.hpp:107
A class encapsulating an Excel worksheet. Access to XLWorksheet objects should be via the workbook ob...
Definition XLWorksheet.hpp:120
Definition IZipArchive.hpp:18
XLSlicerStyle
Definition XLSlicer.hpp:20
Definition XLCellIterator.hpp:121