5 #include <spdlog/spdlog.h>
8 #include "imgui_internal.h"
16 #define DEBUG_SCREENS 5
17 #define REAL_SCREENS 6
23 #define PATIENT_SCREEN_CNT 4
24 #define EMPLOYEE_SCREEN_CNT 4
35 int desired_screen_number;
41 for (
int i = 0; i <= desired_screen_number; i++) {
42 this->available_screens.emplace(i, std::vector<std::unique_ptr<gui_element>>());
61 this->selected_screen = 1;
65 template<
typename Base,
typename T>
67 return dynamic_cast<const Base*
>(ptr) !=
nullptr;
70 void screen_manager::render_screen(std::vector<std::unique_ptr<gui_element>> &elements) {
73 ImGuiID last_focused = 0;
75 for (
size_t i = 0; i < elements.size(); i++) {
76 std::unique_ptr<gui_element> &element = elements.at(i);
78 element->render_element();
80 if (ImGui::IsItemFocused()) {
82 if (last_focused != ImGui::GetItemID()) {
84 last_focused = ImGui::GetItemID();
104 else if (ImGui::IsItemActivated() || ImGui::IsItemActive())
109 bool screen_manager::is_screen_available_to_user(
const uint8_t *screens,
const uint8_t count,
const uint8_t requested) {
110 for (
int i = 0; i < count; i++) {
111 if (screens[i] == requested)
141 std::vector<std::unique_ptr<gui_element>> &elements = available_screens.at(selected_screen);
142 render_screen(elements);
143 }
catch (std::out_of_range &ex) {
144 spdlog::error(
"screen_manager.cpp - Failed to find screen key in available_screens map."
145 " Cannot display selected screen");
156 return this->selected_screen;
187 spdlog::debug(
"Discarding screen select request.");
192 spdlog::debug(
"Discarding screen select request.");
197 spdlog::info(
"Setting screen to {0}", screen);
199 this->selected_screen = screen;
204 std::vector<std::unique_ptr<gui_element>> *elems;
207 elems = &(available_screens.at(screen));
209 }
catch (std::invalid_argument &ex) {
210 spdlog::error(
"screen_manager.cpp - Cannot refresh screen {0}. Screen doesn't exist");
230 spdlog::error(
"screen_manager.cpp - Cannot refresh screen {0}. Screen doesn't exist", screen);
251 spdlog::error(
"screen_manager.cpp - Cannot refresh screen {0}. Screen doesn't exist", screen);
260 for (
size_t i = 1; i < available_screens.size(); i++) {
271 if (selected_screen > 0)
272 prev_screen_stack.push_back(selected_screen);
276 if (prev_screen_stack.size() <= 0) {
277 spdlog::info(
"screen_manager.cpp - Cannot go to previous screen. No screens in stack.");
281 selected_screen = prev_screen_stack[prev_screen_stack.size() - 1];
282 prev_screen_stack.pop_back();
286 prev_screen_stack.clear();
296 ImU32 color = usr_logged ? IM_COL32(0, 255, 0, 255) : IM_COL32(255, 0, 0, 255);
298 ImDrawList *wdl = ImGui::GetWindowDrawList();
299 wdl->AddCircleFilled(center, radius, color);
305 ImVec2 win_pos = ImGui::GetWindowPos();
306 ImVec2 win_size = ImGui::GetContentRegionMax();
308 ImVec2 padding = ImGui::GetStyle().WindowPadding;
316 cur_pos = ImGui::GetCursorPos();
317 ImVec2 usr_center(win_pos.x + cur_pos.x + radius, win_pos.y + cur_pos.y + (radius / 2));
321 ImGui::SetCursorPosX(padding.x + (radius * 2) + padding.x);
322 ImGui::Text(usr_buff);
325 time_t now = time(0);
326 tm *ltm = localtime(&now);
328 sprintf(time,
"%.2d:%.2d:%.2d", ltm->tm_hour, ltm->tm_min, ltm->tm_sec);
329 ImVec2 tts = ImGui::CalcTextSize(time);
331 float time_x = win_size.x - padding.x - tts.x - 2;
332 ImGui::SetCursorPosX(time_x);
339 ImGui::SetCursorPosX(time_x - 100);
340 ImGui::TextColored(ImColor(IM_COL32(0, 180, 0, 255)),
"%d", scr_mgr->
get_selected_screen());
353 ImVec2 win_size = ImGui::GetContentRegionMax();
355 float th = ImGui::GetTextLineHeightWithSpacing();
384 sprintf(buff,
"%s: %s\t%s: %s\t%s: %s",
392 ImGui::SetCursorPosY(win_size.y - th);
399 return available_screens.size() - 1;
#define DEF_BUFF_SIZE_SMALL
#define DEF_BUFF_SIZE_V_SMALL
#define DEF_BUFF_SIZE_BIG
One of the most importat classes in the whole project. Holds variables that define the state of the a...
static std::unique_ptr< app_workspace > & get_instance()
Get the instance app_workspace which is a singleton.
std::unique_ptr< app_workspace_ns::kb_input_state > kb_in_state
Input state holder.
bool has_user()
Checks if user is logged in. This is determined by user_space being initialized and having the user_l...
screen_manager * get_scr_mgr()
Get the screen manager instance. This instance is kind of singleton. Is initalized only once on start...
bool user_logged
Flag to indicate if a user is logged in.
std::unique_ptr< user_workspace > userspace
User's workspace. Serves similar function as app_workspace but for user data.
void clear_previous_screen_stack()
void pop_screen_from_previous()
void set_selected_screen(uint8_t screen)
uint8_t get_screen_count()
void push_screen_to_previous()
void refresh_all_screns()
void render_active_screen()
void refresh_screen_elements(uint8_t screen)
uint8_t get_selected_screen()
const char * get_localized_text(const char *key)
Get the localized text object.
void define_screen_5_debug(std::vector< std::unique_ptr< gui_element >> &elems)
Definitions of gui elemnts of debug screen 5.
void define_screen_5(std::vector< std::unique_ptr< gui_element >> &elems)
Definitions of gui elemnts of debug screen 5.
void define_screen_6(std::vector< std::unique_ptr< gui_element >> &elems)
Definitions of gui elemnts of debug screen 6.
void define_screen_1(std::vector< std::unique_ptr< gui_element >> &elems)
Definitions of gui elemnts of debug screen 1.
void define_screen_0(std::vector< std::unique_ptr< gui_element >> &elems)
Definitions of gui elemnts of debug screen 0.
void define_screen_1_debug(std::vector< std::unique_ptr< gui_element >> &elems)
Definitions of gui elemnts of debug screen 1.
void define_screen_2_debug(std::vector< std::unique_ptr< gui_element >> &elems)
Definitions of gui elemnts of debug screen 2.
void define_screen_4(std::vector< std::unique_ptr< gui_element >> &elems)
Definitions of gui elemnts of debug screen 4.
void define_screen_3_debug(std::vector< std::unique_ptr< gui_element >> &elems)
Definitions of gui elemnts of debug screen 3.
void define_screen_3(std::vector< std::unique_ptr< gui_element >> &elems)
Definitions of gui elemnts of debug screen 3.
void define_screen_2(std::vector< std::unique_ptr< gui_element >> &elems)
Definitions of gui elemnts of debug screen 2.
void define_screen_4_debug(std::vector< std::unique_ptr< gui_element >> &elems)
Definitions of gui elemnts of debug screen 4.
const uint8_t employee_screens[]
bool instanceof(const T *ptr)
void render_nav_bar()
called nav bar, render current input mode at the bottom of the screen
void draw_status_circle(ImVec2 center, bool usr_logged, float radius)
const uint8_t patient_screens[]
#define ADMIN_SELECT_SCREEN
#define PREV_SCREEN_Q_MAX
#define ADMIN_CTRL_SCREEN