summaryrefslogtreecommitdiff
path: root/FL
diff options
context:
space:
mode:
authorMatthias Melcher <github@matthiasm.com>2025-07-05 17:35:41 +0200
committerMatthias Melcher <github@matthiasm.com>2025-07-05 17:35:41 +0200
commit5fb38897b716391e10b7ea904ece05073f8e53a8 (patch)
tree34634e9ee10d474cd1bb8392ceee8bc070c91140 /FL
parentfa22585bbb0c0674c9f154120d274be9d7d10084 (diff)
Fl_Help_View: Refactor to use PIMPL
- using a Pointer to Implementation instead of having a huge Fl_Help_View class. This improves build speed (smaller header fiel) and allows us to fix the implementation while keeping the ABI unchanged.
Diffstat (limited to 'FL')
-rw-r--r--FL/Fl_Help_View.H175
1 files changed, 13 insertions, 162 deletions
diff --git a/FL/Fl_Help_View.H b/FL/Fl_Help_View.H
index 5d5ed8f3f..a4aacb21f 100644
--- a/FL/Fl_Help_View.H
+++ b/FL/Fl_Help_View.H
@@ -122,150 +122,12 @@ typedef const char *(Fl_Help_Func)(Fl_Widget *, const char *);
*/
class FL_EXPORT Fl_Help_View : public Fl_Group
{
-private: // classes, structs, and types
-
- /** Private struct to describe blocks of text. */
- struct Text_Block {
- const char *start; // Start of text
- const char *end; // End of text
- uchar border; // Draw border?
- Fl_Color bgcolor; // Background color
- int x; // Indentation/starting X coordinate
- int y; // Starting Y coordinate
- int w; // Width
- int h; // Height
- int line[32]; // Left starting position for each line
- int ol; // is ordered list <OL> element
- int ol_num; // item number in ordered list
- };
-
- /** Private class to hold a link with target and its position on screen. */
- struct Link {
- std::string filename_; // Filename part of a link
- std::string target; // Target part of a link
- Fl_Rect box; // Clickable rectangle that defines the link area
- };
-
- /** Private font stack element definition. */
- struct Font_Style {
- Fl_Font f; ///< Font
- Fl_Fontsize s; ///< Font Size
- Fl_Color c; ///< Font Color
- Font_Style(Fl_Font afont, Fl_Fontsize asize, Fl_Color acolor);
- Font_Style() = default; ///< Default constructor
- void get(Fl_Font &afont, Fl_Fontsize &asize, Fl_Color &acolor);
- void set(Fl_Font afont, Fl_Fontsize asize, Fl_Color acolor);
- };
-
- /** Private class to hold font information on a stack. */
- struct Font_Stack {
- void init(Fl_Font f, Fl_Fontsize s, Fl_Color c);
- void top(Fl_Font &f, Fl_Fontsize &s, Fl_Color &c);
- void push(Fl_Font f, Fl_Fontsize s, Fl_Color c);
- void pop(Fl_Font &f, Fl_Fontsize &s, Fl_Color &c);
- size_t count() const;
- private:
- std::vector<Font_Style> elts_; ///< font elements
- };
-
- enum class Align { RIGHT = -1, CENTER, LEFT }; ///< Alignments
- enum class Mode { DRAW, PUSH, DRAG }; ///< Draw modes
-
-private: // data members
-
- // HTML source and raw data
-
- const char *value_; ///< Copy of raw HTML text, as set by `value()` or `load()`
- std::string directory_; ///< Directory for current document
- std::string filename_; ///< Original file name from `load()`
-
- // HTML document data
-
- std::string title_; ///< Title string from <title> tag
- Font_Stack fstack_; ///< Font and style stack
- std::vector<Text_Block> blocks_; ///< List of all text blocks on screen
- std::vector<std::shared_ptr<Link> > link_list_; ///< List of all clickable links and their position on screen
- std::map<std::string, int> target_line_map_; ///< List of vertical position of all HTML Targets in a document
-
- int topline_; ///< Vertical offset of document, measure in pixels
- int leftline_; ///< Horizontal offset of document, measure in pixels
- int size_; ///< Total document height in pixels
- int hsize_; ///< Maximum document width in pixels
-
- // Default visual attributes
-
- Fl_Color defcolor_; ///< Default text color, defaults to FL_FOREGROUND_COLOR
- Fl_Color bgcolor_; ///< Background color, defaults to FL_BACKGROUND_COLOR
- Fl_Color textcolor_; ///< Text color, defaults to FL_FOREGROUND_COLOR
- Fl_Color linkcolor_; ///< Link color, FL_SELECTION_COLOR
- Fl_Font textfont_; ///< Default font for text, FL_TIMES
- Fl_Fontsize textsize_; ///< Default font size, defaults to 12, should be FL_NORMAL_SIZE
-
- // Text selection and mouse handling
-
- Mode selection_mode_; ///< Remember election mode between FL_PUSH, FL_DRAG, and FL_RELEASE
- bool selected_; ///< True if there is text selected
- int selection_first_; ///< First character of selection, offset in value_
- int selection_last_; ///< Last character of selection, offset in value_
- Fl_Color tmp_selection_color_; ///< Selection color during draw operation
- Fl_Color selection_text_color_; ///< Selection text color during draw operation
- // The following members are static because we need them only once during mouse events
- static int selection_push_first_; ///< First character of selection during mouse down
- static int selection_push_last_; ///< Last character of selection during mouse down
- static int selection_drag_first_; ///< First character of selection during mouse drag
- static int selection_drag_last_; ///< Last character of selection during mouse drag
- static Mode draw_mode_; ///< Temporarily modify `draw()` method to measure selection start or end during `handle()`
- static int current_pos_; ///< Temporarily store text offset while measuring during `handle()`
-
- // Callback
-
- Fl_Help_Func *link_; ///< Link transform function
-
- // Scrollbars
+private:
+ class Impl;
+ std::unique_ptr<Impl> impl_; ///< Pointer to the implementation details
Fl_Scrollbar scrollbar_; ///< Vertical scrollbar for document
Fl_Scrollbar hscrollbar_; ///< Horizontal scrollbar
- int scrollbar_size_; ///< Size for both scrollbars
-
-private: // methods
-
- // HTML source and raw data, getter
-
- void free_data();
- std::shared_ptr<Link> find_link(int, int);
- void follow_link(std::shared_ptr<Link>);
-
- // HTML interpretation and formatting
-
- Text_Block *add_block(const char *s, int xx, int yy, int ww, int hh, uchar border = 0);
- void add_link(const std::string &link, int xx, int yy, int ww, int hh);
- void add_target(const std::string &n, int yy);
- int do_align(Text_Block *block, int line, int xx, Align a, int &l);
- void format();
- void format_table(int *table_width, int *columns, const char *table);
- Align get_align(const char *p, Align a);
- const char *get_attr(const char *p, const char *n, char *buf, int bufsize);
- Fl_Color get_color(const char *n, Fl_Color c);
- Fl_Shared_Image *get_image(const char *name, int W, int H);
- int get_length(const char *l);
-
- // Font and font stack
-
- /// Initialize the font stack with default values.
- void initfont(Fl_Font &f, Fl_Fontsize &s, Fl_Color &c) { f = textfont_; s = textsize_; c = textcolor_; fstack_.init(f, s, c); }
- /// Push the current font and size onto the stack.
- void pushfont(Fl_Font f, Fl_Fontsize s) {fstack_.push(f, s, textcolor_);}
- /// Push the current font, size, and color onto the stack.
- void pushfont(Fl_Font f, Fl_Fontsize s, Fl_Color c) {fstack_.push(f, s, c);}
- /// Get the current font, size, and color from the stack.
- void popfont(Fl_Font &f, Fl_Fontsize &s, Fl_Color &c) {fstack_.pop(f, s, c);}
-
- // Text selection
-
- void hv_draw(const char *t, int x, int y, int entity_extra_length = 0);
- char begin_selection();
- char extend_selection();
- void end_selection();
protected:
@@ -284,14 +146,12 @@ public:
int handle(int) override;
void resize(int,int,int,int) override;
- /** Changes the size of the widget. \see Fl_Widget::size(int, int) */
void size(int W, int H) { Fl_Widget::size(W, H); }
// HTML source and raw data
void value(const char *val);
- /** Return a pointer to the internal text buffer. */
- const char *value() const { return (value_); }
+ const char *value() const;
int load(const char *f);
int find(const char *s, int p = 0);
void link(Fl_Help_Func *fn);
@@ -302,27 +162,18 @@ public:
// Rendering attributes
- /** Return the document height in pixels. */
- int size() const { return (size_); }
- /** Set the default text color. */
- void textcolor(Fl_Color c) { if (textcolor_ == defcolor_) textcolor_ = c; defcolor_ = c; }
- /** Return the current default text color. */
- Fl_Color textcolor() const { return (defcolor_); }
- /** Set the default text font. */
- void textfont(Fl_Font f) { textfont_ = f; format(); }
- /** Return the default text font. */
- Fl_Font textfont() const { return (textfont_); }
- /** Set the default text size. */
- void textsize(Fl_Fontsize s) { textsize_ = s; format(); }
- /** Get the default text size. */
- Fl_Fontsize textsize() const { return (textsize_); }
+ int size() const;
+ void textcolor(Fl_Color c);
+ Fl_Color textcolor() const;
+ void textfont(Fl_Font f);
+ Fl_Font textfont() const;
+ void textsize(Fl_Fontsize s);
+ Fl_Fontsize textsize() const;
void topline(const char *n);
void topline(int);
- /** Get the current top line in pixels. */
- int topline() const { return (topline_); }
+ int topline() const;
void leftline(int);
- /** Get the left position in pixels. */
- int leftline() const { return (leftline_); }
+ int leftline() const;
// Text selection