diff options
| author | Matthias Melcher <github@matthiasm.com> | 2025-07-05 17:35:41 +0200 |
|---|---|---|
| committer | Matthias Melcher <github@matthiasm.com> | 2025-07-05 17:35:41 +0200 |
| commit | 5fb38897b716391e10b7ea904ece05073f8e53a8 (patch) | |
| tree | 34634e9ee10d474cd1bb8392ceee8bc070c91140 /FL/Fl_Help_View.H | |
| parent | fa22585bbb0c0674c9f154120d274be9d7d10084 (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/Fl_Help_View.H')
| -rw-r--r-- | FL/Fl_Help_View.H | 175 |
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 |
