diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2018-02-14 15:10:29 +0100 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2018-06-22 16:48:46 +0100 |
commit | bde703f83b83232f830426b45957b10e4e44043d (patch) | |
tree | 27da098843ec9e42879bc0a4fdce7d3ace81815f /platform/gl/gl-app.h | |
parent | a313e64f9a1912e1c4a1102eaf345749ca8e26cb (diff) | |
download | mupdf-bde703f83b83232f830426b45957b10e4e44043d.tar.xz |
gl: Add layout packer and various widgets.
* Move window setup and swap buffer calls into ui_begin/end.
* Rearrange source files.
* Simplify grab logic:
Make it more robust in the face of user errors, such as setting
ui.active to NULL explicitly.
* Copy text to primary selection as well.
Diffstat (limited to 'platform/gl/gl-app.h')
-rw-r--r-- | platform/gl/gl-app.h | 105 |
1 files changed, 93 insertions, 12 deletions
diff --git a/platform/gl/gl-app.h b/platform/gl/gl-app.h index 2aea2aed..6efb1ff7 100644 --- a/platform/gl/gl-app.h +++ b/platform/gl/gl-app.h @@ -6,6 +6,7 @@ int win_open_file(char *buf, int len); #include "mupdf/fitz.h" #include "mupdf/ucdn.h" +#include "mupdf/pdf.h" /* for pdf specifics and forms */ #ifndef __APPLE__ #include <GL/freeglut.h> @@ -13,7 +14,7 @@ int win_open_file(char *buf, int len); #include <GLUT/glut.h> #endif -extern fz_context *ctx; +/* UI */ enum { @@ -55,33 +56,62 @@ enum KEY_F12, }; +enum side { ALL, T, R, B, L }; +enum fill { NONE = 0, X = 1, Y = 2, BOTH = 3 }; +enum anchor { CENTER, N, NE, E, SE, S, SW, W, NW }; + +struct layout +{ + enum side side; + enum fill fill; + enum anchor anchor; + int padx, pady; +}; + struct ui { + int window_w, window_h; + int x, y; - int down, middle, right; + int down, down_x, down_y; + int middle, middle_x, middle_y; + int right, right_x, right_y; + int scroll_x, scroll_y; int key, mod, plain; - void *hot, *active, *focus; + int grab_down, grab_middle, grab_right; + const void *hot, *active, *focus; int fontsize; int baseline; int lineheight; + + struct layout *layout; + fz_irect *cavity; + struct layout layout_stack[32]; + fz_irect cavity_stack[32]; }; extern struct ui ui; +void ui_init(int w, int h, const char *title); +void ui_quit(void); +void ui_invalidate(void); +void ui_finish(void); + void ui_set_clipboard(const char *buf); const char *ui_get_clipboard(void); -void ui_init_fonts(fz_context *ctx, float pixelsize); -void ui_finish_fonts(fz_context *ctx); -float ui_measure_character(fz_context *ctx, int ucs); -void ui_begin_text(fz_context *ctx); -float ui_draw_character(fz_context *ctx, int ucs, float x, float y); -void ui_end_text(fz_context *ctx); -float ui_draw_string(fz_context *ctx, float x, float y, const char *str); -float ui_measure_string(fz_context *ctx, char *str); +void ui_init_fonts(float pixelsize); +void ui_finish_fonts(void); +float ui_measure_character(int ucs); +void ui_begin_text(void); +float ui_draw_character(int ucs, float x, float y); +void ui_end_text(void); + +float ui_draw_string(float x, float y, const char *str); +float ui_measure_string(const char *str); struct texture { @@ -90,12 +120,63 @@ struct texture float s, t; }; +void ui_texture_from_pixmap(struct texture *tex, fz_pixmap *pix); void ui_draw_image(struct texture *tex, float x, float y); +enum +{ + UI_INPUT_CANCEL = -1, + UI_INPUT_ACCEPT = 1, + UI_INPUT_CONTINUE = 0, +}; + struct input { char text[256]; char *end, *p, *q; }; -int ui_input(int x0, int y0, int x1, int y1, struct input *input); +struct list +{ + fz_irect area; + int scroll_y; + int item_y; +}; + +void ui_begin(void); +void ui_end(void); + +int ui_mouse_inside(fz_irect *area); + +void ui_layout(enum side side, enum fill fill, enum anchor anchor, int padx, int pady); +fz_irect ui_pack_layout(int slave_w, int slave_h, enum side side, enum fill fill, enum anchor anchor, int padx, int pady); +fz_irect ui_pack(int slave_w, int slave_h); +void ui_pack_push(fz_irect cavity); +void ui_pack_pop(void); + +void ui_panel_begin(int w, int h, int opaque); +void ui_panel_end(void); + +void ui_spacer(void); +void ui_label(const char *fmt, ...); +int ui_button(const char *label); +void ui_checkbox(const char *label, int *value); +void ui_slider(float *value, float min, float max, int width); + +void ui_input_init(struct input *input, const char *text); +int ui_input(struct input *input, int width); +void ui_scrollbar(int x0, int y0, int x1, int y1, int *value, int page_size, int max); + +void ui_list_begin(struct list *list, int count, int req_w, int req_h); +int ui_list_item(struct list *list, void *id, int indent, const char *label, int selected); +void ui_list_end(struct list *list); + +/* App */ + +extern fz_context *ctx; +extern pdf_document *pdf; +extern pdf_page *page; +extern fz_matrix page_ctm, page_inv_ctm; +extern int page_x_ofs, page_y_ofs; + +void run_main_loop(void); |