Use dispatch tables for tool functions
[colloquium.git] / src / presentation.h
1 /*
2  * presentation.h
3  *
4  * Colloquium - A tiny presentation program
5  *
6  * Copyright (c) 2011 Thomas White <taw@bitwiz.org.uk>
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20  *
21  */
22
23 #ifndef PRESENTATION_H
24 #define PRESENTATION_H
25
26 #ifdef HAVE_CONFIG_H
27 #include <config.h>
28 #endif
29
30
31 #include <gtk/gtk.h>
32
33 #include "stylesheet.h"
34
35
36 struct slide
37 {
38         struct presentation *parent;
39
40         cairo_surface_t *render_cache;
41         int              render_cache_seq;
42
43         int              num_objects;
44         struct object  **objects;
45         int              object_seq;
46 };
47
48
49 struct toolinfo
50 {
51         void (*click_create)(struct presentation *p, struct toolinfo *tip,
52                              double x, double y);
53         void (*click_select)(struct presentation *p, struct toolinfo *tip,
54                              double x, double y);
55         void (*create_default)(struct presentation *p, struct style *sty);
56         void (*select)(struct object *o, struct toolinfo *tip);
57         void (*deselect)(struct object *o, struct toolinfo *tip);
58         void (*drag_object)(struct toolinfo *tip, struct presentation *p,
59                             struct object *o, double x, double y);
60 };
61
62
63 struct presentation
64 {
65         char             *titlebar;
66         char             *filename;
67         int               completely_empty;
68
69         struct toolinfo  *select_tool;
70         struct toolinfo  *text_tool;
71
72         GtkWidget        *window;
73         GtkWidget        *drawingarea;
74         GtkUIManager     *ui;
75         GtkActionGroup   *action_group;
76         GtkIMContext     *im_context;
77         GtkWidget        *tbox;
78         int               drag_preview_pending;
79         int               have_drag_data;
80         int               drag_highlight;
81         int               drag_width;
82         int               drag_height;
83         int               draw_drag_box;
84         int               drag_x;
85         int               drag_y;
86
87         /* Stylesheet */
88         StyleSheet       *ss;
89         struct style     *default_style;
90
91         /* Dialogue boxes */
92         StylesheetWindow *stylesheetwindow;
93
94         /* Slideshow stuff */
95         GtkWidget        *slideshow;
96         GtkWidget        *ss_drawingarea;
97         GdkCursor        *blank_cursor;
98         int               ss_blank;
99         char              ss_geom[256];
100
101         double            slide_width;
102         double            slide_height;
103         double            border_offs_x;
104         double            border_offs_y;
105
106         /* The slide currently being displayed */
107         unsigned int      view_slide_number;
108         struct slide     *view_slide;
109         struct object    *editing_object;
110
111         /* Tool status */
112         struct toolinfo  *cur_tool;
113         double            drag_offs_x;
114         double            drag_offs_y;
115
116         unsigned int      num_slides;
117         struct slide    **slides;
118 };
119
120
121 extern struct presentation *new_presentation(void);
122 extern struct slide *add_slide(struct presentation *p, int pos);
123 extern int add_object_to_slide(struct slide *s, struct object *o);
124 extern void remove_object_from_slide(struct slide *s, struct object *o);
125 extern struct object *find_object_at_position(struct slide *s,
126                                               double x, double y);
127
128 #endif  /* PRESENTATION_H */