YCLIMP
Yandex Command Line Interface Music Player
Loading...
Searching...
No Matches
ElementSelector.tpp
1#pragma once
2
3#include "ElementSelector.hpp"
4#include "FileManager.hpp"
5#include "Utility.hpp"
6
7#include <cassert>
8
9template <typename ElementPtr>
11ElementSelector<ElementPtr>::ElementSelector(const Recti& bounds)
12 : mBounds{bounds}
13 , mSelectedIndx{0}
14 , mFirstVisibleIndx{0}
15 , mLastingSelectIndxs{}
16 , mShuffleRandomEngine()
17{
18}
19
25template <typename ElementPtr>
27template <typename Element>
30 std::vector<Element> elements)
31{
32 std::vector<ElementPtr> result;
33 for (auto& element : elements)
34 {
35 result.push_back(std::make_unique<Element>(element));
36 }
37 return result;
38}
39
48template <typename ElementPtr>
50void ElementSelector<ElementPtr>::Load(ElementPtr file, bool overwrite)
51{
52 if (overwrite)
53 {
54 mLastingSelectIndxs.clear();
55 mFiles.clear();
56 }
57 mFiles.push_back(std::move(file));
58}
59
68template <typename ElementPtr>
70void ElementSelector<ElementPtr>::Load(std::vector<ElementPtr> files, bool overwrite)
71{
72 if (overwrite)
73 {
74 mLastingSelectIndxs.clear();
75 mFiles.swap(files);
76 }
77 else
78 {
79 mFiles.reserve(mFiles.size() + files.size());
80 for (auto& file : files)
81 {
82 mFiles.push_back(std::move(file));
83 }
84 }
85}
86
87template <typename ElementPtr>
89void ElementSelector<ElementPtr>::Update()
90{
91}
92
93template <typename ElementPtr>
95void ElementSelector<ElementPtr>::HandleResize(const Recti& bounds)
96{
97 mBounds = bounds;
98}
99
100template <typename ElementPtr>
102void ElementSelector<ElementPtr>::SelectUp()
103{
104 if (mSelectedIndx == 0)
105 return;
106
107 mSelectedIndx--;
108 if (mSelectedIndx < mFirstVisibleIndx)
109 {
110 mFirstVisibleIndx--;
111 }
112}
113
114template <typename ElementPtr>
116void ElementSelector<ElementPtr>::SelectDown()
117{
118 if (mSelectedIndx + 1 >= mFiles.size())
119 return;
120
121 mSelectedIndx++;
122 if (mSelectedIndx > mFirstVisibleIndx + mBounds.height - 1)
123 {
124 mFirstVisibleIndx++;
125 }
126}
127
128template <typename ElementPtr>
130void ElementSelector<ElementPtr>::SelectByIndx(std::size_t indx)
131{
132 assert(indx < mFiles.size());
133
134 mSelectedIndx = indx;
135 mFirstVisibleIndx = indx;
136}
137
138template <typename ElementPtr>
140void ElementSelector<ElementPtr>::SelectByName(const std::string& filename)
141{
142 for (auto iter{begin(mFiles)}; iter != end(mFiles); ++iter)
143 {
144 if ((*iter)->name == filename)
145 {
146 SelectByIndx(std::distance(begin(mFiles), iter));
147 return;
148 }
149 }
150 assert(false);
151}
152
153template <typename ElementPtr>
155void ElementSelector<ElementPtr>::ClearAllLastingSelections()
156{
157 mLastingSelectIndxs.clear();
158}
159
160template <typename ElementPtr>
162void ElementSelector<ElementPtr>::LastingSelectOnCurrent()
163{
164 if (mLastingSelectIndxs.contains(mSelectedIndx))
165 {
166 mLastingSelectIndxs.erase(mSelectedIndx);
167 }
168 else
169 {
170 mLastingSelectIndxs.insert(mSelectedIndx);
171 }
172}
173
174template <typename ElementPtr>
176void ElementSelector<ElementPtr>::ShuffleElements()
177{
178 std::shuffle(mFiles.begin(), mFiles.end(), mShuffleRandomEngine);
179}
180
181template <typename ElementPtr>
183ElementSelectorState ElementSelector<ElementPtr>::GetState() const
184{
185 return ElementSelectorState{mFirstVisibleIndx, mSelectedIndx};
186}
187
188template <typename ElementPtr>
190void ElementSelector<ElementPtr>::RestoreState(const ElementSelectorState& state)
191{
192 mFirstVisibleIndx = state.firstVisibleElementIndx;
193 mSelectedIndx = state.selectedElementIndx;
194}
195
196template <typename ElementPtr>
198std::vector<std::size_t> ElementSelector<ElementPtr>::GetLastingSelectedElementsIndices()
199 const
200{
201 std::vector<std::size_t> lastingSelectedIndices;
202 for (auto& indx : mLastingSelectIndxs)
203 {
204 assert(("Bad indx!", indx >= 0 && indx < mFiles.size()));
205 lastingSelectedIndices.push_back(indx);
206 }
207 return lastingSelectedIndices;
208}
209
210template <typename ElementPtr>
212std::vector<ElementPtr> ElementSelector<ElementPtr>::GetLastingSelectedElements() const
213{
214 std::vector<ElementPtr> lastingSelected;
215 for (auto& indx : mLastingSelectIndxs)
216 {
217 assert(("Bad indx!", indx >= 0 && indx < mFiles.size()));
218 lastingSelected.push_back(mFiles[indx]);
219 }
220 return lastingSelected;
221}
222
223template <typename ElementPtr>
225std::vector<ElementPtr> ElementSelector<ElementPtr>::GetElements() const
226{
227 return mFiles;
228}
229
230template <typename ElementPtr>
232std::size_t ElementSelector<ElementPtr>::GetSelectedPosition() const
233{
234 return mSelectedIndx;
235}
236
237template <typename ElementPtr>
239std::size_t ElementSelector<ElementPtr>::GetElementsSize() const
240{
241 return mFiles.size();
242}
243
244template <typename ElementPtr>
246const std::optional<ElementPtr> ElementSelector<ElementPtr>::GetSelected() const
247{
248 if (mSelectedIndx < mFiles.size())
249 {
250 return mFiles[mSelectedIndx];
251 }
252
253 return std::nullopt;
254}
Utility function list.
void Load(std::vector< ElementPtr > element, bool overwrite)
Definition ElementSelector.tpp:70
static std::vector< ElementPtr > CrutchConverter(std::vector< Element > elements)
ElementSelector::CrutchConverter - convert vector of Element to vector of Element_Ptr;.
Definition ElementSelector.tpp:29
Definition ElementSelector.hpp:34
Definition ElementSelector.hpp:28
The ElementSelectorState - struct to store element selector state .
Definition ElementSelector.hpp:20