Covellite++  Version: 2.3.0 Revision: ??? Platform: x64 Build: 23:13 04.01.2025
Кроссплатформенный фреймворк для разработки приложений на С++
Загрузка...
Поиск...
Не найдено
Window.cpp
1
2#include "stdafx.h"
3#include <Covellite/Gui/Window.hpp>
4#include <alicorn/platform/app-info.hpp>
5#include <alicorn/std/class-info.hpp>
6#include <alicorn/std/string.hpp>
7#include <alicorn/boost/string-cast.hpp>
8#include <Covellite/Events.hpp>
9#include <Covellite/App/Events.hpp>
10#include <Covellite/App/Settings.hpp>
11#include <Covellite/App/Vfs.hpp>
12#include <Covellite/Os/Events.hpp>
13#include <Covellite/Api/IWindow.hpp>
14#include <Covellite/Api/Events.hpp>
15#include <Covellite/Gui/Renderer.hpp>
16#include <Covellite/Gui/Initializer.hpp>
17#include <Covellite/Gui/StringTranslator.hpp>
18#include <Covellite/Gui/EventListener.hpp>
19#include <Covellite/Gui/Events.hpp>
20#include "SystemToGuiKeyCode.hpp"
21
22#ifndef __USING_GTEST
23# include <alicorn\logger.hpp>
24#endif
25
26using namespace covellite::gui;
27
28Window::Window(const WindowApi_t & _Window) :
29 m_WindowApi(_Window),
30 m_Events(_Window),
31 m_pRenderer(::std::make_shared<covellite::gui::Renderer>(_Window.GetRenders())),
32 m_pEventListener(EventListener::Make(_Window)),
33 m_pStringTranslator(::std::make_unique<covellite::gui::StringTranslator>()),
34 m_pInitializer(::std::make_unique<Initializer_t>(Initializer_t::Data
35 {
36 m_pRenderer,
37 m_pStringTranslator
38 })),
39 m_pContext(CovelliteGui::CreateContext("main", GetContextSize()),
40 [](CovelliteGui::Context * _pContext) { CovelliteGuiRemove(_pContext); })
41{
42 if (m_pContext == nullptr)
43 {
44 throw STD_EXCEPTION << "Create context failed.";
45 }
46
47 if (::alicorn::extension::cpp::IS_DEBUG_CONFIGURATION)
48 {
49 // Инициализация через установку контекста сделана из-за того, что
50 // CovelliteGui::Debugger::Initialise() можно вызывать только один раз в рамках
51 // работы одного .so модуля (повторный вызов приводит к ошибке в логе
52 // и Debugger работать не будет), Android программа грузит .so модуль
53 // только один раз при первом старте, а при повторной активации программы
54 // просто вызывает функции ранее загруженного модуля.
55 if (!CovelliteGui::Debugger::SetContext(m_pContext.get()))
56 {
57 CovelliteGui::Debugger::Initialise(m_pContext.get());
58 }
59 }
60
61 m_pContext->AddEventListener(::covellite::events::Click.m_EventType.c_str(),
62 m_pEventListener.get(), false);
63 m_pContext->AddEventListener(::covellite::events::Press.m_EventType.c_str(),
64 m_pEventListener.get(), false);
65 m_pContext->AddEventListener(::covellite::events::Change.m_EventType.c_str(),
66 m_pEventListener.get(), false);
67
68 LoadFonts();
69
70 m_Events[events::Window.Resize]
71 .Connect([&]() { m_pContext->SetDimensions(GetContextSize()); });
72
73 m_Events[events::Cursor.Motion]
74 .Connect([&](const events::Cursor_t::Position & _Position)
75 {
76 m_pContext->ProcessMouseMove(_Position.X,
77 _Position.Y - m_WindowApi.GetClientRect().Top, 0);
78 });
79 m_Events[events::Cursor.Touch]
80 .Connect([&]() { m_pContext->ProcessMouseButtonDown(0, 0); });
81 m_Events[events::Cursor.Release]
82 .Connect([&]() { m_pContext->ProcessMouseButtonUp(0, 0); });
83
84 m_Events[events::Key.Back]
85 .Connect([&]() { Back(); });
86 m_Events[events::Key.Down]
87 .Connect([&](const events::Key_t::Code & _Code)
88 {
89 m_pContext->ProcessKeyDown(SystemToGuiKeyCode(_Code), 0);
90 });
91 m_Events[events::Key.Pressed]
92 .Connect([&](const events::Key_t::Code & _Code)
93 {
94 // На Android'e при нажатии управляющих кнопок генерируется событие
95 // Key.Pressed с нулем в качестве кода нажатой кнопки.
96 if (_Code < 0x20) return;
97
98 m_pContext->ProcessTextInput(static_cast<CovelliteGuiUnicode_t>(_Code));
99 });
100
101 m_Events[events::Drawing.Do]
102 .Connect([&]() { DoDrawWindow(); });
103}
104
105Window::~Window(void) noexcept
106{
107 m_pContext->RemoveEventListener(::covellite::events::Click.m_EventType.c_str(),
108 m_pEventListener.get(), false);
109 m_pContext->RemoveEventListener(::covellite::events::Press.m_EventType.c_str(),
110 m_pEventListener.get(), false);
111 m_pContext->RemoveEventListener(::covellite::events::Change.m_EventType.c_str(),
112 m_pEventListener.get(), false);
113}
114
119Window::operator Events_t (void) const /*override*/
120{
121 return m_Events;
122}
123
128Window::DocumentPtr_t Window::LoadDocument(const PathToFile_t & _Path) /*override*/
129{
130 const auto Start = ::std::chrono::system_clock::now();
131
132 auto pResult = DocumentPtr_t(m_pContext->LoadDocument(Layer::Convert(_Path).c_str()),
133 [](Document_t * _pDocument) { CovelliteGuiRemove(_pDocument); });
134
135 ::std::chrono::duration<double> TimeCall =
136 ::std::chrono::system_clock::now() - Start;
137
138 LOGGER(Info) << _Path.string() << ": " << TimeCall.count();
139
140 return pResult;
141}
142
149void Window::Set(const StringBank_t & _Bank)
150{
151 m_pStringTranslator->Set(_Bank);
152}
153
162void Window::Back(void)
163{
164 LOGGER(Info) << "Pop layer";
165
166 const auto IsExistsLayer = m_Layers.Pop();
167 if (!IsExistsLayer)
168 {
169 m_Events[::covellite::events::Application.Exit]();
170 }
171}
172
177void Window::PushLayer(const LayerPtr_t & _pLayer)
178{
179 m_Layers.Push(_pLayer);
180
181 LOGGER(Info) << "Push layer [" <<
182 ::alicorn::extension::std::ClassInfo::GetPureName(*_pLayer) << "]";
183}
184
191Window::Vector_t Window::GetContextSize(void) const
192{
193 const auto Rect = m_WindowApi.GetClientRect();
194 return Vector_t(Rect.Width, Rect.Height - Rect.Top);
195}
196
201void Window::DoDrawWindow(void)
202{
203 m_pContext->Update();
204 m_pContext->Render();
205 m_pRenderer->RenderScene();
206}
207
217void Window::LoadFonts(void)
218{
219 const auto & CovelliteppSection =
220 ::covellite::app::Settings_t::GetInstance();
221 const auto PathToFontsDirectory =
222 CovelliteppSection.Get<Path_t>(uT("PathToFontsDirectory"));
223 const auto & Vfs =
224 ::covellite::app::Vfs_t::GetInstance();
225
226 Vfs.BrowsingFiles(PathToFontsDirectory, [&](const Path_t & _FontFile)
227 {
228 // RmlUi не сохраняет копию переданных данных, поэтому прочитанные
229 // файлы следует хранить до конца использования.
230 m_RawDataFonts[_FontFile] = ::std::move(Vfs.GetData(_FontFile));
231
232 CovelliteGuiLoadFontFace(m_RawDataFonts[_FontFile]);
233 });
234}
int32_t Code
Класс входит в проект Covellite.Os Класс параметра для передачи сигналу координат курсора.
Definition Events.hpp:159
Класс входит в проект Covellite.Gui Класс обобщенной логики рендеринга GUI.
Definition Renderer.hpp:44
Класс входит в проект Covellite.Gui Класс преобразователя строк.
Definition StringTranslator.hpp:34
Класс входит в проект Covellite.Os Класс параметра для передачи сигналу координат курсора.
Definition Events.hpp:99