1 /*
2 * This file is part of gtkD.
3 *
4 * gtkD is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License
6 * as published by the Free Software Foundation; either version 3
7 * of the License, or (at your option) any later version, with
8 * some exceptions, please read the COPYING file.
9 *
10 * gtkD is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public License
16 * along with gtkD; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
18 */19 20 // generated automatically - do not change21 // find conversion definition on APILookup.txt22 // implement new conversion functionalities on the wrap.utils pakage23 24 25 modulegtk.DrawingArea;
26 27 privateimportglib.ConstructionException;
28 privateimportgobject.ObjectG;
29 privateimportgobject.Signals;
30 privateimportgtk.Widget;
31 privateimportgtk.c.functions;
32 publicimportgtk.c.types;
33 privateimportstd.algorithm;
34 35 36 /**
37 * `GtkDrawingArea` is a widget that allows drawing with cairo.
38 *
39 * 
40 *
41 * It’s essentially a blank widget; you can draw on it. After
42 * creating a drawing area, the application may want to connect to:
43 *
44 * - The [signal@Gtk.Widget::realize] signal to take any necessary actions
45 * when the widget is instantiated on a particular display.
46 * (Create GDK resources in response to this signal.)
47 *
48 * - The [signal@Gtk.DrawingArea::resize] signal to take any necessary
49 * actions when the widget changes size.
50 *
51 * - Call [method@Gtk.DrawingArea.set_draw_func] to handle redrawing the
52 * contents of the widget.
53 *
54 * The following code portion demonstrates using a drawing
55 * area to display a circle in the normal widget foreground
56 * color.
57 *
58 * ## Simple GtkDrawingArea usage
59 *
60 * ```c
61 * static void
62 * draw_function (GtkDrawingArea *area,
63 * cairo_t *cr,
64 * int width,
65 * int height,
66 * gpointer data)
67 * {
68 * GdkRGBA color;
69 * GtkStyleContext *context;
70 *
71 * context = gtk_widget_get_style_context (GTK_WIDGET (area));
72 *
73 * cairo_arc (cr,
74 * width / 2.0, height / 2.0,
75 * MIN (width, height) / 2.0,
76 * 0, 2 * G_PI);
77 *
78 * gtk_style_context_get_color (context,
79 * &color);
80 * gdk_cairo_set_source_rgba (cr, &color);
81 *
82 * cairo_fill (cr);
83 * }
84 *
85 * int
86 * main (int argc, char **argv)
87 * {
88 * gtk_init ();
89 *
90 * GtkWidget *area = gtk_drawing_area_new ();
91 * gtk_drawing_area_set_content_width (GTK_DRAWING_AREA (area), 100);
92 * gtk_drawing_area_set_content_height (GTK_DRAWING_AREA (area), 100);
93 * gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (area),
94 * draw_function,
95 * NULL, NULL);
96 * return 0;
97 * }
98 * ```
99 *
100 * The draw function is normally called when a drawing area first comes
101 * onscreen, or when it’s covered by another window and then uncovered.
102 * You can also force a redraw by adding to the “damage region” of the
103 * drawing area’s window using [method@Gtk.Widget.queue_draw].
104 * This will cause the drawing area to call the draw function again.
105 *
106 * The available routines for drawing are documented on the
107 * [GDK Drawing Primitives][gdk4-Cairo-Interaction] page
108 * and the cairo documentation.
109 *
110 * To receive mouse events on a drawing area, you will need to use
111 * event controllers. To receive keyboard events, you will need to set
112 * the “can-focus” property on the drawing area, and you should probably
113 * draw some user-visible indication that the drawing area is focused.
114 *
115 * If you need more complex control over your widget, you should consider
116 * creating your own `GtkWidget` subclass.
117 */118 publicclassDrawingArea : Widget119 {
120 /** the main Gtk struct */121 protectedGtkDrawingArea* gtkDrawingArea;
122 123 /** Get the main Gtk struct */124 publicGtkDrawingArea* getDrawingAreaStruct(booltransferOwnership = false)
125 {
126 if (transferOwnership)
127 ownedRef = false;
128 returngtkDrawingArea;
129 }
130 131 /** the main Gtk struct as a void* */132 protectedoverridevoid* getStruct()
133 {
134 returncast(void*)gtkDrawingArea;
135 }
136 137 /**
138 * Sets our main struct and passes it to the parent class.
139 */140 publicthis (GtkDrawingArea* gtkDrawingArea, boolownedRef = false)
141 {
142 this.gtkDrawingArea = gtkDrawingArea;
143 super(cast(GtkWidget*)gtkDrawingArea, ownedRef);
144 }
145 146 147 /** */148 publicstaticGTypegetType()
149 {
150 returngtk_drawing_area_get_type();
151 }
152 153 /**
154 * Creates a new drawing area.
155 *
156 * Returns: a new `GtkDrawingArea`
157 *
158 * Throws: ConstructionException GTK+ fails to create the object.
159 */160 publicthis()
161 {
162 auto__p = gtk_drawing_area_new();
163 164 if(__pisnull)
165 {
166 thrownewConstructionException("null returned by new");
167 }
168 169 this(cast(GtkDrawingArea*) __p);
170 }
171 172 /**
173 * Retrieves the content height of the `GtkDrawingArea`.
174 *
175 * Returns: The height requested for content of the drawing area
176 */177 publicintgetContentHeight()
178 {
179 returngtk_drawing_area_get_content_height(gtkDrawingArea);
180 }
181 182 /**
183 * Retrieves the content width of the `GtkDrawingArea`.
184 *
185 * Returns: The width requested for content of the drawing area
186 */187 publicintgetContentWidth()
188 {
189 returngtk_drawing_area_get_content_width(gtkDrawingArea);
190 }
191 192 /**
193 * Sets the desired height of the contents of the drawing area.
194 *
195 * Note that because widgets may be allocated larger sizes than they
196 * requested, it is possible that the actual height passed to your draw
197 * function is larger than the height set here. You can use
198 * [method@Gtk.Widget.set_valign] to avoid that.
199 *
200 * If the height is set to 0 (the default), the drawing area may disappear.
201 *
202 * Params:
203 * height = the height of contents
204 */205 publicvoidsetContentHeight(intheight)
206 {
207 gtk_drawing_area_set_content_height(gtkDrawingArea, height);
208 }
209 210 /**
211 * Sets the desired width of the contents of the drawing area.
212 *
213 * Note that because widgets may be allocated larger sizes than they
214 * requested, it is possible that the actual width passed to your draw
215 * function is larger than the width set here. You can use
216 * [method@Gtk.Widget.set_halign] to avoid that.
217 *
218 * If the width is set to 0 (the default), the drawing area may disappear.
219 *
220 * Params:
221 * width = the width of contents
222 */223 publicvoidsetContentWidth(intwidth)
224 {
225 gtk_drawing_area_set_content_width(gtkDrawingArea, width);
226 }
227 228 /**
229 * Setting a draw function is the main thing you want to do when using
230 * a drawing area.
231 *
232 * The draw function is called whenever GTK needs to draw the contents
233 * of the drawing area to the screen.
234 *
235 * The draw function will be called during the drawing stage of GTK.
236 * In the drawing stage it is not allowed to change properties of any
237 * GTK widgets or call any functions that would cause any properties
238 * to be changed. You should restrict yourself exclusively to drawing
239 * your contents in the draw function.
240 *
241 * If what you are drawing does change, call [method@Gtk.Widget.queue_draw]
242 * on the drawing area. This will cause a redraw and will call @draw_func again.
243 *
244 * Params:
245 * drawFunc = callback that lets you draw
246 * the drawing area's contents
247 * userData = user data passed to @draw_func
248 * destroy = destroy notifier for @user_data
249 */250 publicvoidsetDrawFunc(GtkDrawingAreaDrawFuncdrawFunc, void* userData, GDestroyNotifydestroy)
251 {
252 gtk_drawing_area_set_draw_func(gtkDrawingArea, drawFunc, userData, destroy);
253 }
254 255 /**
256 * Emitted once when the widget is realized, and then each time the widget
257 * is changed while realized.
258 *
259 * This is useful in order to keep state up to date with the widget size,
260 * like for instance a backing surface.
261 *
262 * Params:
263 * width = the width of the viewport
264 * height = the height of the viewport
265 */266 gulongaddOnResize(voiddelegate(int, int, DrawingArea) dlg, ConnectFlagsconnectFlags=cast(ConnectFlags)0)
267 {
268 returnSignals.connect(this, "resize", dlg, connectFlags ^ ConnectFlags.SWAPPED);
269 }
270 }