You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

147 lines
4.8 KiB

// License: Apache 2.0. See LICENSE file in root directory.
// Copyright(c) 2023 Intel Corporation. All Rights Reserved.
#pragma once
#define GLFW_INCLUDE_GLU
#include <GLFW/glfw3.h>
#include "imgui.h"
#include <string>
#include <functional>
#include <thread>
#include "rendering.h"
#include <atomic>
#include <memory>
namespace rs2
{
class visualizer_2d;
class context;
class viewer_ui_traits
{
public:
const static int control_panel_width = 280;
const static int control_panel_height = 40;
const static int metrics_panel_width = 250;
const static int default_log_h = 80;
// Flags for pop-up window - no window resize, move or collaps
const static auto imgui_flags = ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove |
ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar |
ImGuiWindowFlags_NoSavedSettings;
};
class ux_window
{
public:
std::function<void(std::string)> on_file_drop = [](std::string) {};
std::function<bool()> on_load = []() { return false; };
std::function<void()> on_reload_complete = []() { };
ux_window(const char* title, context &ctx);
float width() const { return float(_width); }
float height() const { return float(_height); }
float framebuf_width() const { return float(_fb_width); }
float framebuf_height() const { return float(_fb_height); }
// Check that the graphic subsystem is valid and start a new frame
operator bool();
~ux_window();
operator GLFWwindow*() const { return _win; }
void begin_frame();
void begin_viewport();
void end_frame();
void reset();
ImFont* get_large_font() const { return _font_18; }
ImFont* get_monofont() const { return _monofont; }
ImFont* get_font() const { return _font_dynamic; }
int get_font_size() const { return font_size; }
rs2::mouse_info& get_mouse() { return _mouse; }
float get_scale_factor() const { return _scale_factor; }
void add_on_load_message(const std::string& msg);
bool is_ui_aligned() { return _is_ui_aligned; }
bool is_fullscreen() { return _fullscreen; }
texture_buffer& get_splash() { return _splash_tex; }
void reload();
void refresh();
void link_hovered();
void cross_hovered();
void set_hovered_over_input() { _hovers_any_input_window = true; }
bool get_hovered_over_input() const { return _hovers_any_input_window; }
double time() const { return glfwGetTime(); }
private:
void open_window();
void setup_icon();
void imgui_config_push();
void imgui_config_pop();
GLFWwindow *_win;
int _width, _height, _output_height;
int _fb_width = 0;
int _fb_height = 0;
rs2::rect _viewer_rect;
ImFont *_font_dynamic, *_font_18, *_monofont;
int font_size;
rs2::mouse_info _mouse{};
std::string _error_message;
float _scale_factor;
std::thread _first_load;
bool _first_frame;
std::atomic<bool> _app_ready;
std::atomic<bool> _keep_alive;
texture_buffer _splash_tex;
rsutils::time::stopwatch _splash_timer;
std::string _title_str;
std::vector<std::string> _on_load_message;
std::mutex _on_load_message_mtx;
bool _hovers_any_input_window = false;
bool _query_devices = true;
bool _missing_device = false;
int _hourglass_index = 0;
std::string _dev_stat_message;
bool _fullscreen_pressed = false;
bool _fullscreen = false;
bool _reload = false;
bool _show_fps = false;
bool _vsync = true;
bool _use_glsl_proc = false;
bool _use_glsl_render = false;
bool _enable_msaa = false;
int _msaa_samples = 0;
bool _link_hovered = false;
GLFWcursor* _hand_cursor = nullptr;
bool _cross_hovered = false;
GLFWcursor* _cross_cursor = nullptr;
std::string _title;
std::shared_ptr<visualizer_2d> _2d_vis;
context &_ctx;
bool _is_ui_aligned = false;
};
}