diff options
Diffstat (limited to 'gdb/tui/tui-layout.h')
-rw-r--r-- | gdb/tui/tui-layout.h | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/gdb/tui/tui-layout.h b/gdb/tui/tui-layout.h index 23f05f3..d7f0731 100644 --- a/gdb/tui/tui-layout.h +++ b/gdb/tui/tui-layout.h @@ -25,6 +25,152 @@ #include "tui/tui.h" #include "tui/tui-data.h" +/* The basic object in a TUI layout. This represents a single piece + of screen real estate. Subclasses determine the exact + behavior. */ +class tui_layout_base +{ +public: + + DISABLE_COPY_AND_ASSIGN (tui_layout_base); + + /* Clone this object. Ordinarily a layout is cloned before it is + used, so that any necessary modifications do not affect the + "skeleton" layout. */ + virtual std::unique_ptr<tui_layout_base> clone () const = 0; + + /* Change the size and location of this layout. */ + virtual void apply (int x, int y, int width, int height) = 0; + + /* Return the minimum and maximum height of this layout. */ + virtual void get_sizes (int *min_height, int *max_height) = 0; + + /* True if the topmost item in this layout is boxed. */ + virtual bool top_boxed_p () const = 0; + + /* True if the bottommost item in this layout is boxed. */ + virtual bool bottom_boxed_p () const = 0; + + /* Return the name of this layout's window, or nullptr if this + layout does not represent a single window. */ + virtual const char *get_name () const + { + return nullptr; + } + + /* Adjust the size of the window named NAME to NEW_HEIGHT, updating + the sizes of the other windows around it. */ + virtual bool adjust_size (const char *name, int new_height) = 0; + + /* The most recent space allocation. */ + int x = 0; + int y = 0; + int width = 0; + int height = 0; + +protected: + + tui_layout_base () = default; +}; + +/* A TUI layout object that displays a single window. The window is + given by name. */ +class tui_layout_window : public tui_layout_base +{ +public: + + explicit tui_layout_window (const char *name) + : m_contents (name) + { + } + + DISABLE_COPY_AND_ASSIGN (tui_layout_window); + + std::unique_ptr<tui_layout_base> clone () const override; + + void apply (int x, int y, int width, int height) override; + + const char *get_name () const override + { + return m_contents.c_str (); + } + + bool adjust_size (const char *name, int new_height) override + { + return false; + } + + bool top_boxed_p () const override; + + bool bottom_boxed_p () const override; + +protected: + + void get_sizes (int *min_height, int *max_height) override; + +private: + + /* Type of content to display. */ + std::string m_contents; + + /* When a layout is applied, this is updated to point to the window + object. */ + tui_gen_win_info *m_window = nullptr; +}; + +/* A TUI layout that holds other layouts. */ +class tui_layout_split : public tui_layout_base +{ +public: + + tui_layout_split () = default; + + DISABLE_COPY_AND_ASSIGN (tui_layout_split); + + /* Add a new split layout to this layout. WEIGHT is the desired + size, which is relative to the other weights given in this + layout. */ + tui_layout_split *add_split (int weight); + + /* Add a new window to this layout. NAME is the name of the window + to add. WEIGHT is the desired size, which is relative to the + other weights given in this layout. */ + void add_window (const char *name, int weight); + + std::unique_ptr<tui_layout_base> clone () const override; + + void apply (int x, int y, int width, int height) override; + + bool adjust_size (const char *name, int new_height) override; + + bool top_boxed_p () const override; + + bool bottom_boxed_p () const override; + +protected: + + void get_sizes (int *min_height, int *max_height) override; + +private: + + /* Set the weights from the current heights. */ + void set_weights_from_heights (); + + struct split + { + /* The requested weight. */ + int weight; + /* The layout. */ + std::unique_ptr<tui_layout_base> layout; + }; + + /* The splits. */ + std::vector<split> m_splits; + + /* True if this layout has already been applied at least once. */ + bool m_applied = false; +}; + extern void tui_add_win_to_layout (enum tui_win_type); extern void tui_set_layout (enum tui_layout_type); |