diff options
Diffstat (limited to 'ml/dlib/dlib/gui_widgets/style_abstract.h')
-rw-r--r-- | ml/dlib/dlib/gui_widgets/style_abstract.h | 777 |
1 files changed, 777 insertions, 0 deletions
diff --git a/ml/dlib/dlib/gui_widgets/style_abstract.h b/ml/dlib/dlib/gui_widgets/style_abstract.h new file mode 100644 index 000000000..e4d3245df --- /dev/null +++ b/ml/dlib/dlib/gui_widgets/style_abstract.h @@ -0,0 +1,777 @@ +// Copyright (C) 2008 Davis E. King (davis@dlib.net), and Nils Labugt +// License: Boost Software License See LICENSE.txt for the full license. +#undef DLIB_WIDGETs_STYLE_ABSTRACT_ +#ifdef DLIB_WIDGETs_STYLE_ABSTRACT_ + +#include "../algs.h" +#include "../gui_core.h" +#include "widgets_abstract.h" +#include "../unicode/unicode_abstract.h" + +namespace dlib +{ + +// ---------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------------------- + // button styles +// ---------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------------------- + + class button_style + { + /*! + WHAT THIS OBJECT REPRESENTS + This is an abstract class that defines the interface a + button style object must implement. + + Note that derived classes must be copyable via + their copy constructors. + !*/ + + public: + + virtual ~button_style() {} + + virtual bool redraw_on_mouse_over ( + ) const { return false; } + /*! + ensures + - if (this style draws buttons differently when a mouse is over them) then + - returns true + - else + - returns false + !*/ + + virtual rectangle get_invalidation_rect ( + const rectangle& rect + ) const { return rect; } + /*! + requires + - the mutex drawable::m is locked + - rect == the get_rect() that defines where the button is + ensures + - returns a rectangle that should be invalidated whenever a button + needs to redraw itself. (e.g. If you wanted your button style to + draw outside the button then you could return a larger rectangle) + !*/ + + virtual rectangle get_min_size ( + const ustring& name, + const font& mfont + ) const = 0; + /*! + requires + - the mutex drawable::m is locked + ensures + - returns a rectangle that represents the minimum size of the button + given the name and font. + !*/ + + virtual void draw_button ( + const canvas& c, + const rectangle& rect, + const bool enabled, + const font& mfont, + const long lastx, + const long lasty, + const ustring& name, + const bool is_depressed + ) const = 0; + /*! + requires + - the mutex drawable::m is locked + - c == the canvas to draw on + - rect, enabled, mfont, lastx, and lasty are the variables + defined in the protected section of the drawable class. + - name == the name of the button to be drawn + - is_depressed == true if the button is to be drawn in a depressed state + ensures + - draws the button on the canvas c at the location given by rect. + !*/ + }; + +// ---------------------------------------------------------------------------------------- + + class button_style_default : public button_style + { + /*! + This is the default style for button objects. It will cause + a button to appear as the simple MS Windows 2000 button style. + !*/ + }; + +// ---------------------------------------------------------------------------------------- + + class button_style_toolbar1 : public button_style + { + /*! + This draws a simple toolbar style button that displays its name in the + middle of itself. When the mouse moves over it it will light up. + !*/ + }; + +// ---------------------------------------------------------------------------------------- + + class button_style_toolbar_icon1 : public button_style + { + /*! + This draws a simple toolbar style button that displays an image in the + middle of itself. When the mouse moves over it it will light up. + !*/ + template <typename image_type> + button_style_toolbar_icon1 ( + const image_type& img, + unsigned long border_size = 6 + ); + /*! + requires + - image_type == an implementation of array2d/array2d_kernel_abstract.h + - pixel_traits<typename image_type::type> is defined + ensures + - displays image img in the middle of the button + - the distance between the edge of the button and the image + will be border_size pixels + !*/ + }; + +// ---------------------------------------------------------------------------------------- + + class button_style_arrow : public button_style + { + public: + /*! + This draws a simple button with an arrow in it + !*/ + + enum arrow_direction + { + UP, + DOWN, + LEFT, + RIGHT + }; + + button_style_arrow ( + arrow_direction dir + ); + /*! + ensures + - the arrow in the button will point in the given direction + !*/ + }; + +// ---------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------------------- + // toggle button styles +// ---------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------------------- + + class toggle_button_style + { + /*! + WHAT THIS OBJECT REPRESENTS + This is an abstract class that defines the interface a + toggle button style object must implement. + + Note that derived classes must be copyable via + their copy constructors. + !*/ + + public: + + virtual ~toggle_button_style() {} + + virtual bool redraw_on_mouse_over ( + ) const { return false; } + /*! + ensures + - if (this style draws buttons differently when a mouse is over them) then + - returns true + - else + - returns false + !*/ + + virtual rectangle get_min_size ( + const ustring& name, + const font& mfont + ) const = 0; + /*! + requires + - the mutex drawable::m is locked + ensures + - returns a rectangle that represents the minimum size of the button + given the name and font. + !*/ + + virtual void draw_toggle_button ( + const canvas& c, + const rectangle& rect, + const bool enabled, + const font& mfont, + const long lastx, + const long lasty, + const ustring& name, + const bool is_depressed, + const bool is_checked + ) const = 0; + /*! + requires + - the mutex drawable::m is locked + - c == the canvas to draw on + - rect, enabled, mfont, lastx, and lasty are the variables + defined in the protected section of the drawable class. + - name == the name of the button to be drawn + - is_depressed == true if the button is to be drawn in a depressed state + - is_checked == true if the toggle_button is in the checked state + ensures + - draws the button on the canvas c at the location given by rect. + !*/ + }; + +// ---------------------------------------------------------------------------------------- + + class toggle_button_style_default : public toggle_button_style + { + /*! + This is the default style for toggle_button objects. It will cause + a button to appear as the simple MS Windows 2000 button style. + !*/ + }; + +// ---------------------------------------------------------------------------------------- + + class toggle_button_style_check_box : public toggle_button_style + { + /*! + This draws a simple check box style toggle button that displays its + name to the right of a check box. + !*/ + }; + +// ---------------------------------------------------------------------------------------- + + class toggle_button_style_radio_button : public toggle_button_style + { + /*! + This draws a simple radio button style toggle button that displays its + name to the right of a circular radio button. + !*/ + }; + +// ---------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------------------- + // scroll_bar styles +// ---------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------------------- + + class scroll_bar_style + { + /*! + WHAT THIS OBJECT REPRESENTS + This is an abstract class that defines the interface a + scroll_bar style object must implement. + + Note that derived classes must be copyable via + their copy constructors. + + There are three parts of a scroll bar, the slider, the background, + and the two buttons on its ends. The "slider" is the thing that you + drag around on the scroll bar and the "background" is the part + in between the slider and the buttons on the ends. + !*/ + + public: + + virtual ~scroll_bar_style() {} + + virtual bool redraw_on_mouse_over_slider ( + ) const { return false; } + /*! + ensures + - if (this style draws a scroll_bar's slider differently when a mouse is over it + or it is being dragged) then + - returns true + - else + - returns false + !*/ + + virtual long get_width ( + ) const = 0; + /*! + requires + - the mutex drawable::m is locked + ensures + - returns the width in pixels of the scroll bar + !*/ + + virtual long get_slider_length ( + long total_length, + long max_pos + ) const = 0; + /*! + requires + - the mutex drawable::m is locked + - total_length == the total length in pixels of the scroll bar + - max_pos == the value of scroll_bar::max_slider_pos() for this + scroll bar + ensures + - returns the length in pixels of the scroll bar's slider + !*/ + + virtual long get_button_length ( + long total_length, + long max_pos + ) const = 0; + /*! + requires + - the mutex drawable::m is locked + - total_length == the total length in pixels of the scroll bar + - max_pos == the value of scroll_bar::max_slider_pos() for this + scroll bar + ensures + - returns the length in pixels of each of the scroll bar's + buttons + !*/ + + virtual void draw_scroll_bar_background ( + const canvas& c, + const rectangle& rect, + const bool enabled, + const long lastx, + const long lasty, + const bool is_depressed + ) const = 0; + /*! + requires + - the mutex drawable::m is locked + - c == the canvas to draw on + - rect, enabled, lastx, and lasty are the variables + defined in the protected section of the drawable class. + - is_depressed == true if the background area of the scroll_bar is to + be drawn in a depressed state (because the user is clicking on it) + ensures + - draws the background part of the scroll_bar on the canvas c at the + location given by rect. + !*/ + + virtual void draw_scroll_bar_slider ( + const canvas& c, + const rectangle& rect, + const bool enabled, + const long lastx, + const long lasty, + const bool is_being_dragged + ) const = 0; + /*! + requires + - the mutex drawable::m is locked + - c == the canvas to draw on + - rect, enabled, lastx, and lasty are the variables + defined in the protected section of the drawable class + - is_being_dragged == true if the user is dragging the slider + ensures + - draws the slider part of the scroll_bar on the canvas c at the + location given by rect. + !*/ + + button_style_type get_up_button_style ( + ) const; + /*! + ensures + - returns the type of button_style to use for a button on the + top side of a vertical scroll bar. + !*/ + + button_style_type get_down_button_style ( + ) const; + /*! + ensures + - returns the type of button_style to use for a button on the + bottom side of a vertical scroll bar. + !*/ + + button_style_type get_left_button_style ( + ) const; + /*! + ensures + - returns the type of button_style to use for a button on the + left side of a horizontal scroll bar. + !*/ + + button_style_type get_right_button_style ( + ) const; + /*! + ensures + - returns the type of button_style to use for a button on the + right side of a horizontal scroll bar. + !*/ + }; + +// ---------------------------------------------------------------------------------------- + + class scroll_bar_style_default : public scroll_bar_style + { + /*! + This is the default style for scroll_bar objects. It will cause + a scroll_bar to appear as the simple MS Windows 2000 scroll_bar style. + !*/ + }; + +// ---------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------------------- + // scrollable_region (and zoomable_region) styles +// ---------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------------------- + + class scrollable_region_style + { + /*! + WHAT THIS OBJECT REPRESENTS + This is an abstract class that defines the interface a + scrollable_region and zoomable_region style object must implement. + + Note that derived classes must be copyable via + their copy constructors. + !*/ + public: + + virtual ~scrollable_region_style() {} + + virtual long get_border_size ( + ) const = 0; + /*! + requires + - the mutex drawable::m is locked + ensures + - returns the size of the border region in pixels + !*/ + + virtual void draw_scrollable_region_border ( + const canvas& c, + const rectangle& rect, + const bool enabled + ) const = 0; + /*! + requires + - the mutex drawable::m is locked + - c == the canvas to draw on + - rect and enabled are the variables defined in the protected section + of the drawable class. + ensures + - draws the border part of a scrollable_region on the canvas c at the + location given by rect. + !*/ + + scroll_bar_style_type get_horizontal_scroll_bar_style ( + ) const; + /*! + ensures + - returns the style of scroll_bar to use for the + horizontal scroll_bar in this widget. + !*/ + + scroll_bar_style_type get_vertical_scroll_bar_style ( + ) const; + /*! + ensures + - returns the style of scroll_bar to use for the + vertical scroll_bar in this widget. + !*/ + }; + +// ---------------------------------------------------------------------------------------- + + class scrollable_region_style_default : public scrollable_region_style + { + public: + /*! + This is the default style for scrollable_region and zoomable_region objects. + !*/ + }; + +// ---------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------------------- + // text_box styles +// ---------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------------------- + + class text_box_style + { + /*! + WHAT THIS OBJECT REPRESENTS + This is an abstract class that defines the interface a + text_box style object must implement. + + Note that derived classes must be copyable via + their copy constructors. + !*/ + public: + + virtual ~text_field_style() {} + + scrollable_region_style_type get_scrollable_region_style ( + ) const; + /*! + ensures + - returns the style of scrollable_region to use for the + text_box. + !*/ + + virtual unsigned long get_padding ( + const font& mfont + ) const = 0; + /*! + requires + - the mutex drawable::m is locked + ensures + - returns the number of pixels that separate the text in the text_box + from the edge of the text_box widget itself. + !*/ + + virtual void draw_text_box ( + const canvas& c, + const rectangle& display_rect, + const rectangle& text_rect, + const bool enabled, + const font& mfont, + const ustring& text, + const rectangle& cursor_rect, + const rgb_pixel& text_color, + const rgb_pixel& bg_color, + const bool has_focus, + const bool cursor_visible, + const long highlight_start, + const long highlight_end + ) const = 0; + /*! + requires + - the mutex drawable::m is locked + - c == the canvas to draw on + - enabled and mfont are the variables defined in the protected section + - text_rect == the rectangle in which we should draw the given text + of the drawable class. + - display_rect == the rectangle returned by scrollable_region::display_rect() + - text == the current text in the text_box + - cursor_rect == A rectangle of width 1 that represents the current + position of the cursor on the screen. + - text_color == the color of the text to be drawn + - bg_color == the background color of the text field + - has_focus == true if this text field has keyboard input focus + - cursor_visible == true if the cursor should be drawn + - if (highlight_start <= highlight_end) then + - text[highlight_start] though text[highlight_end] should be + highlighted + ensures + - draws the text_box on the canvas c at the location given by text_rect. + (Note that the scroll bars and borders are drawn by the scrollable_region + and therefore the style returned by get_scrollable_region_style() + controls how those appear) + - doesn't draw anything outside display_rect + !*/ + }; + +// ---------------------------------------------------------------------------------------- + + class text_box_style_default : public text_box_style + { + public: + /*! + This is the default style for text_box objects. + !*/ + }; + +// ---------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------------------- + // list_box styles +// ---------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------------------- + + class list_box_style + { + /*! + WHAT THIS OBJECT REPRESENTS + This is an abstract class that defines the interface a + list_box style object must implement. + + Note that derived classes must be copyable via + their copy constructors. + !*/ + public: + + virtual ~list_box_style() {} + + virtual void draw_list_box_background ( + const canvas& c, + const rectangle& display_rect, + const bool enabled + ) const = 0; + /*! + requires + - the mutex drawable::m is locked + - c == the canvas to draw on + - display_rect == the display_rect for the list_box. This is the area + in which list box items are drawn (see display_rect in the scrollable_region + widget for more info) + - enabled == true if the list box is enabled + ensures + - draws the background of a list box on the canvas c at the location given + by display_rect. + !*/ + + scrollable_region_style_type get_scrollable_region_style ( + ) const; + /*! + ensures + - returns the style of scrollable_region to use for the + list_box. + !*/ + + virtual void draw_list_box_item ( + const canvas& c, + const rectangle& rect, + const rectangle& display_rect, + const bool enabled, + const font& mfont, + const std::string& text, + const bool is_selected + ) const = 0; + /*! + requires + - the mutex drawable::m is locked + - c == the canvas to draw on + - rect == the rectangle that defines where on the screen this list box item is. + - display_rect == the display_rect for the list_box. This is the area + in which list box items are drawn (see display_rect in the scrollable_region + widget for more info) + - mfont == the font to use to draw the list box item + - text == the text of the list box item to be drawn + - enabled == true if the list box is enabled + - is_selected == true if the item is to be drawn in a selected state + ensures + - draws the list box item on the canvas c at the location given by rect. + !*/ + + // wide character overloads + virtual void draw_list_box_item ( + const canvas& c, + const rectangle& rect, + const rectangle& display_rect, + const bool enabled, + const font& mfont, + const std::wstring& text, + const bool is_selected + ) const = 0; + + virtual void draw_list_box_item ( + const canvas& c, + const rectangle& rect, + const rectangle& display_rect, + const bool enabled, + const font& mfont, + const ustring& text, + const bool is_selected + ) const = 0; + + }; + +// ---------------------------------------------------------------------------------------- + + class list_box_style_default : public list_box_style + { + public: + /*! + This is the default style for list_box objects. + !*/ + }; + +// ---------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------------------- + // text_field styles +// ---------------------------------------------------------------------------------------- +// ---------------------------------------------------------------------------------------- + + class text_field_style + { + /*! + WHAT THIS OBJECT REPRESENTS + This is an abstract class that defines the interface a + text_field style object must implement. + + Note that derived classes must be copyable via + their copy constructors. + !*/ + public: + + virtual ~text_field_style() {} + + virtual unsigned long get_padding ( + const font& mfont + ) const = 0; + /*! + requires + - the mutex drawable::m is locked + ensures + - returns the number of pixels that separate the text in the text_field + from the edge of the text_field widget itself. + !*/ + + virtual void draw_text_field ( + const canvas& c, + const rectangle& rect, + const rectangle& text_rect, + const bool enabled, + const font& mfont, + const ustring& text, + const unsigned long cursor_x, + const unsigned long text_pos, + const rgb_pixel& text_color, + const rgb_pixel& bg_color, + const bool has_focus, + const bool cursor_visible, + const long highlight_start, + const long highlight_end + ) const = 0; + /*! + requires + - the mutex drawable::m is locked + - c == the canvas to draw on + - rect, enabled, and mfont are the variables defined in the protected section + of the drawable class. + - text == the current text in the text_field + - text_rect == the rectangle in which we should draw the given text + - cursor_x == the x coordinate of the cursor relative to the left side + of rect. i.e. the number of pixels that separate the cursor from the + left side of the text_field. + - text_pos == the index of the first letter in text that appears in + this text field. + - text_color == the color of the text to be drawn + - bg_color == the background color of the text field + - has_focus == true if this text field has keyboard input focus + - cursor_visible == true if the cursor should be drawn + - if (highlight_start <= highlight_end) then + - text[highlight_start] though text[highlight_end] should be + highlighted + ensures + - draws the text_field on the canvas c at the location given by rect. + !*/ + + }; + +// ---------------------------------------------------------------------------------------- + + class text_field_style_default : public text_field_style + { + public: + /*! + This is the default style for text_field objects. + !*/ + }; + +// ---------------------------------------------------------------------------------------- + +} + +#endif // DLIB_WIDGETs_STYLE_ABSTRACT_ + + + |