// vi:ft=cpp #pragma once #include namespace Scout_gfx { class Window : public Basic_window { public: enum Mode { Normal, Maximized, Minimized, Fullscreen }; class Deco_policy { public: struct Insets { Area tl, br; }; virtual Widget *create_deco(Window *) const = 0; virtual void set_deco_mode(Mode mode, Widget *deco, Insets *insets) = 0; }; private: Rect _normal_pos; Parent_widget _content; Widget *_deco; Deco_policy::Insets *_insets; Deco_policy *_deco_policy; protected: // hide those functions, use content_pane()->... instead using Basic_window::set_child_layout; using Basic_window::child_layout; public: Window(Deco_policy *deco_policy, View *v, Area const &max_size); // Widget *handle_event(Event const &e); virtual void set_window_mode(Mode mode); Parent_widget *content_pane() { return &_content; } Deco_policy::Insets const &insets() const { return *_insets; } void set_geometry(Rect const &g) { Basic_window::set_geometry(g); _deco->set_geometry(Rect(geometry().area())); } void append(Widget *w) { _content.append(w); } void remove(Widget *w) { _content.remove(w); } void forget(Widget *w) { _content.forget(w); } Area preferred_size() const { return Basic_window::child_layout()->preferred_size(); } Area min_size() const { return _min_sz.max(Basic_window::child_layout()->min_size()); } Area max_size() const { return Basic_window::max_size().min(Basic_window::child_layout()->max_size()); } Orientations expanding() const { return Basic_window::child_layout()->expanding(); } bool empty() const { return false; } bool has_height_for_width() const { return Basic_window::child_layout()->has_height_for_width(); } int height_for_width(int w) const { return Basic_window::child_layout()->height_for_width(w); } int min_height_for_width(int w) const { return Basic_window::child_layout()->min_height_for_width(w); } }; }