Covellite++  Version: 2.3.0 Revision: ??? Platform: x64 Build: 23:13 04.01.2025
Кроссплатформенный фреймворк для разработки приложений на С++
Загрузка...
Поиск...
Не найдено
Layer.cpp
1
2#include "stdafx.h"
3#include <Covellite/Gui/Layer.hpp>
4#include <boost/format.hpp>
5#include <alicorn/std/string.hpp>
6#include <alicorn/std/string/encoding.hpp>
7#include <alicorn/std/string-cast.hpp>
8#include <alicorn/boost/lexical-cast.hpp>
9
10using namespace covellite::gui;
11
12Layer::Element::Element(Element_t * _pElement) :
13 m_pElement(_pElement)
14{
15 if (m_pElement == nullptr) throw STD_EXCEPTION << "Element null pointer.";
16}
17
22void Layer::Element::SetFocus(void)
23{
24 m_pElement->Focus();
25}
26
37void Layer::Element::SetMeaning(const float _Meaning)
38{
39 const auto Tag =
40 m_pElement->GetTagName();
41
42 if (Tag == "progress" || Tag == "circular")
43 {
44 CovelliteGuiSetProgressBarValue(m_pElement, _Meaning);
45 }
46}
47
66void Layer::Element::SetMeaning(const String_t & _Meaning)
67{
68 const auto Tag =
69 m_pElement->GetTagName();
70 const auto Type =
71 m_pElement->GetAttribute("type", CovelliteGui::String{ "unknown" });
72
73 using namespace ::alicorn::extension::std;
74
75 // 06 Февраль 2019 13:27 (unicornum.verum@gmail.com)
76 TODO("Проверить работу функции для textarea");
77
78 if (Tag == "textarea" ||
79 (Tag == "input" && (Type == "range" || Type == "text")))
80 {
81 auto & Control =
82 dynamic_cast<CovelliteGui::ElementFormControl &>(*m_pElement);
83
84 // Для select это не работает (как и ElementFormControlSelect::SetSelection(),
85 // выглядит так, как будто список строк просто удаляется), как устанавливать
86 // значение по умолчанию, см. в примере работы с элементами управления.
87
88 Control.SetValue(string_cast<::std::string, Encoding::UTF8>(_Meaning).c_str());
89 return;
90 }
91
92 m_pElement->SetInnerRML(
93 string_cast<::std::string, Encoding::UTF8>(_Meaning).c_str());
94}
95
109auto Layer::Element::GetMeaning(void) const -> String_t
110{
111 const CovelliteGui::String Unknown = "unknown";
112
113 const auto Tag = m_pElement->GetTagName();
114 const auto Type = m_pElement->GetAttribute("type", Unknown);
115
116 using namespace ::alicorn::extension::std;
117
118 // 06 Февраль 2019 13:27 (unicornum.verum@gmail.com)
119 TODO("Проверить работу функции для textarea");
120
121 if (Tag == "textarea" || Tag == "select" ||
122 (Tag == "input" && (Type == "text" || Type == "range")))
123 {
124 const auto & Control =
125 dynamic_cast<CovelliteGui::ElementFormControl &>(*m_pElement);
126
127 return string_cast<String, Encoding::UTF8>(
128 CovelliteGuiStringToUtf8(Control.GetValue()));
129 }
130
131 return string_cast<String, Encoding::UTF8>(
132 CovelliteGuiStringToUtf8(m_pElement->GetInnerRML()));
133}
134
147void Layer::Element::SetClassStyle(const String_t & _Class)
148{
149 using namespace ::alicorn::extension::std;
150
151 m_pElement->SetAttribute("class",
152 string_cast<::std::string, Encoding::UTF8>(_Class).c_str());
153}
154
155// ************************************************************************** //
156
158
179Layer::Layer(::covellite::gui::IWindow & _Window, const Path_t & _PathToFile) :
180 m_Events(_Window),
181 m_pDocument(_Window.LoadDocument(_PathToFile))
182{
183 if (m_pDocument == nullptr)
184 {
185 throw STD_EXCEPTION << "Document null pointer: " << _PathToFile;
186 }
187}
188
217Layer::Layer(::covellite::gui::IWindow & _Window, const Path_t & _PathToFile,
218 const ::std::string & _TitleId) :
219 Layer(_Window, _PathToFile)
220{
221 auto * pTitle = m_pDocument->GetElementById(_TitleId.c_str());
222 if (pTitle == nullptr)
223 {
224 throw STD_EXCEPTION << "Unexpected title id: " << _TitleId;
225 }
226
227 pTitle->SetInnerRML(m_pDocument->GetTitle());
228}
229
231
236void Layer::Show(void) /*override*/
237{
238 m_pDocument->Show();
239}
240
245void Layer::Hide(void) /*override*/
246{
247 m_pDocument->Hide();
248}
249
260auto Layer::GetId(void) const -> DocumentId_t
261{
262 return CovelliteGuiStringToUtf8(m_pDocument->GetId());
263}
264
275Layer::Element Layer::GetElement(const ElementId_t & _Id) const
276{
277 return m_pDocument->GetElementById(_Id.c_str());
278}
279
280int Layer::GetWidth(void) const
281{
282 const auto * const pContext = m_pDocument->GetContext();
283 if (pContext == nullptr) throw STD_EXCEPTION << "Null pointer.";
284
285 return pContext->GetDimensions().x;
286}
287
288int Layer::GetHeight(void) const
289{
290 const auto * const pContext = m_pDocument->GetContext();
291 if (pContext == nullptr) throw STD_EXCEPTION << "Null pointer.";
292
293 return pContext->GetDimensions().y;
294}
295
317float Layer::EmployFontSize(float _PercentFromMaxScreenSize)
318{
319 if (m_pDocument->GetTagName() != u8"body")
320 {
321 throw STD_EXCEPTION << "Unexpected document tag name: "
322 << CovelliteGuiStringToUtf8(m_pDocument->GetTagName());
323 }
324
325 const auto FontSize = ::std::max(GetWidth(), GetHeight()) *
326 _PercentFromMaxScreenSize / 100.0f;
327
328 m_pDocument->SetAttribute("style",
329 (::boost::format("font-size: %1%px;") % FontSize).str().c_str());
330 return FontSize;
331}
Класс входит в проект Covellite.Gui Интерфесный класс окна, отображающего элементы GUI.
Definition IWindow.hpp:31
Класс входит в проект Covellite.Gui Класс одного слоя (пользовательского экрана) программы.
Definition Layer.hpp:39
float EmployFontSize(float)
Функция установки базового размера шрифта всего документа.
Definition Layer.cpp:317
Element GetElement(const ElementId_t &) const
Функция получения объекта дочернего элемента.
Definition Layer.cpp:275
DocumentId_t GetId(void) const
Функция получения идентификатора документа.
Definition Layer.cpp:260
void Hide(void) final
Функция скрытия слоя.
Definition Layer.cpp:245
Класс входит в проект Covellite.Gui Класс одного элемента .rml файла.
Definition Layer.hpp:60