67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#pragma once
 | 
						|
 | 
						|
#include <memory>
 | 
						|
#include <string>
 | 
						|
#include <vector>
 | 
						|
 | 
						|
#include "gfx/shape_renderer.h"
 | 
						|
#include "gfx/txt_renderer.h"
 | 
						|
#include "i_window_content.h"
 | 
						|
 | 
						|
enum class WindowState {
 | 
						|
  NORMAL,
 | 
						|
  MINIMIZED,
 | 
						|
  MAXIMIZED
 | 
						|
};
 | 
						|
 | 
						|
enum class WindowButtonAction {
 | 
						|
  CLOSE,
 | 
						|
  MAXIMIZE,
 | 
						|
  MINIMIZE
 | 
						|
};
 | 
						|
 | 
						|
struct TitleBarButton {
 | 
						|
  WindowButtonAction action;
 | 
						|
  Color color;
 | 
						|
};
 | 
						|
 | 
						|
class UIWindow {
 | 
						|
public:
 | 
						|
  UIWindow(const char* title, int x, int y, int width, int height);
 | 
						|
  ~UIWindow(void);
 | 
						|
 | 
						|
  void render(ShapeRenderer* shape_renderer, TextRenderer* txt_renderer, int screen_height,
 | 
						|
              bool show_cursor);
 | 
						|
  void handle_event(SDL_Event* event, int screen_width, int screen_height,
 | 
						|
                    int taskbar_height);
 | 
						|
  void minimize(void);
 | 
						|
  void restore(void);
 | 
						|
  bool is_minimized(void) const;
 | 
						|
  bool should_close(void) const;
 | 
						|
  void set_focused(bool focused);
 | 
						|
  bool is_point_inside(int x, int y);
 | 
						|
  void set_content(std::unique_ptr<IWindowContent> content);
 | 
						|
  IWindowContent* get_content(void);
 | 
						|
  bool is_mouse_over_resize_handle(int mouse_x, int mouse_y) const;
 | 
						|
  const std::string& get_title(void) const;
 | 
						|
 | 
						|
private:
 | 
						|
  friend class Taskbar; /* Allow taskbar to access private members. */
 | 
						|
  int _x, _y, _width, _height;
 | 
						|
  Rect _pre_maximize_rect;
 | 
						|
  std::string _title;
 | 
						|
  std::unique_ptr<IWindowContent> _content;
 | 
						|
  bool _is_focused; /* Managed by desktop. */
 | 
						|
  bool _is_hovered; /* Send scroll events even if not focused. */
 | 
						|
  bool _should_close;
 | 
						|
 | 
						|
  std::vector<TitleBarButton> _title_bar_buttons;
 | 
						|
  WindowState _state;
 | 
						|
 | 
						|
  bool _is_dragging;
 | 
						|
  int _drag_offset_x, _drag_offset_y;
 | 
						|
 | 
						|
  bool _is_resizing;
 | 
						|
  int _resize_margin;
 | 
						|
};
 |