aboutsummaryrefslogtreecommitdiff
path: root/gcc/text-art/ruler.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/text-art/ruler.h')
-rw-r--r--gcc/text-art/ruler.h125
1 files changed, 125 insertions, 0 deletions
diff --git a/gcc/text-art/ruler.h b/gcc/text-art/ruler.h
new file mode 100644
index 0000000..31f5354
--- /dev/null
+++ b/gcc/text-art/ruler.h
@@ -0,0 +1,125 @@
+/* Classes for printing labelled rulers.
+ Copyright (C) 2023 Free Software Foundation, Inc.
+ Contributed by David Malcolm <dmalcolm@redhat.com>.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
+
+#ifndef GCC_TEXT_ART_RULER_H
+#define GCC_TEXT_ART_RULER_H
+
+#include "text-art/canvas.h"
+
+namespace text_art {
+
+/* A way to annotate a series of ranges of canvas coordinates
+ with text labels either above or, in this example, below:
+ ├───────┬───────┼───────┬───────┼───────┬───────┤
+ │ │ │
+ label A label B label C
+ with logic to ensure that the text labels don't overlap
+ when printed. */
+
+class x_ruler
+{
+ public:
+ enum class label_dir { ABOVE, BELOW };
+ enum class label_kind
+ {
+ TEXT,
+ TEXT_WITH_BORDER
+ };
+
+ x_ruler (label_dir dir)
+ : m_label_dir (dir),
+ m_size (canvas::size_t (0, 0)),
+ m_has_layout (false)
+ {}
+
+ void add_label (const canvas::range_t &r,
+ styled_string text,
+ style::id_t style_id,
+ label_kind kind = label_kind::TEXT);
+
+ canvas::size_t get_size ()
+ {
+ ensure_layout ();
+ return m_size;
+ }
+
+ void paint_to_canvas (canvas &canvas,
+ canvas::coord_t offset,
+ const theme &theme);
+
+ void debug (const style_manager &sm);
+
+ private:
+ /* A particular label within an x_ruler.
+ Consider e.g.:
+
+ # x: 01234567890123456789012345678901234567890123456789
+ # y: 0: ├───────┬───────┼───────┬───────┼───────┬───────┤
+ # 1: │ │ │
+ # 2: label A label B label C
+ #
+
+ Then "label A" is:
+
+ # m_connector_x == 8
+ # V
+ # x: 0123456789012
+ # y: 0: ┬
+ # 1: │
+ # 2: label A
+ # x: 0123456789012
+ # ^
+ # m_text_coord.x == 6
+
+ and m_text_coord is (2, 6).
+ The y cooordinates are stored with respect to label_dir::BELOW;
+ for label_dir::ABOVE we flip them when painting the ruler. */
+ class label
+ {
+ friend class x_ruler;
+ public:
+ label (const canvas::range_t &range, styled_string text, style::id_t style_id,
+ label_kind kind);
+
+ bool operator< (const label &other) const;
+
+ private:
+ canvas::range_t m_range;
+ styled_string m_text;
+ style::id_t m_style_id;
+ label_kind m_kind;
+ canvas::rect_t m_text_rect; // includes any border
+ int m_connector_x;
+ };
+
+ void ensure_layout ();
+ void update_layout ();
+ int get_canvas_y (int rel_y) const;
+
+ label_dir m_label_dir;
+ std::vector<label> m_labels;
+ canvas::size_t m_size;
+ bool m_has_layout = false;
+
+};
+
+} // namespace text_art
+
+#endif /* GCC_TEXT_ART_RULER_H */