Merge lp:~cairo-dock-team/cairo-dock-plug-ins/desklet-rendering-pan-view into lp:~cairo-dock-team/cairo-dock-plug-ins/plug-ins

Proposed by Tofe
Status: Merged
Approved by: Tofe
Approved revision: 1702
Merged at revision: 1702
Proposed branch: lp:~cairo-dock-team/cairo-dock-plug-ins/desklet-rendering-pan-view
Merge into: lp:~cairo-dock-team/cairo-dock-plug-ins/plug-ins
Diff against target: 826 lines (+768/-2)
5 files modified
Folders/src/applet-load-icons.c (+1/-1)
desklet-rendering/src/CMakeLists.txt (+1/-0)
desklet-rendering/src/rendering-desklet-viewport.c (+707/-0)
desklet-rendering/src/rendering-desklet-viewport.h (+56/-0)
desklet-rendering/src/rendering-init.c (+3/-1)
To merge this branch: bzr merge lp:~cairo-dock-team/cairo-dock-plug-ins/desklet-rendering-pan-view
Reviewer Review Type Date Requested Status
Tofe (community) Approve
Review via email: mp+30172@code.launchpad.net

Description of the change

Added view "Viewport", which is alike "Slide", but with panning possibilites. Also default view of "Folders" is now "Viewport".

To post a comment you must log in.
Revision history for this message
Tofe (chris-chapuis) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'Folders/src/applet-load-icons.c'
--- Folders/src/applet-load-icons.c 2010-07-17 00:33:47 +0000
+++ Folders/src/applet-load-icons.c 2010-07-17 12:02:42 +0000
@@ -353,7 +353,7 @@
353 pList = g_list_prepend (pList, pIcon);353 pList = g_list_prepend (pList, pIcon);
354 }354 }
355 pList = g_list_reverse (pList);355 pList = g_list_reverse (pList);
356 CD_APPLET_LOAD_MY_ICONS_LIST (pList, myConfig.cRenderer, "Slide", NULL);356 CD_APPLET_LOAD_MY_ICONS_LIST (pList, myConfig.cRenderer, "Viewport", NULL);
357 myData.iNbIcons = myConfig.iNbIcons;357 myData.iNbIcons = myConfig.iNbIcons;
358 358
359 //\_______________________ On se place en ecoute.359 //\_______________________ On se place en ecoute.
360360
=== modified file 'desklet-rendering/src/CMakeLists.txt'
--- desklet-rendering/src/CMakeLists.txt 2010-07-06 00:03:56 +0000
+++ desklet-rendering/src/CMakeLists.txt 2010-07-17 12:02:42 +0000
@@ -9,6 +9,7 @@
9 rendering-desklet-simple.c rendering-desklet-simple.h9 rendering-desklet-simple.c rendering-desklet-simple.h
10 rendering-desklet-decorations.c rendering-desklet-decorations.h10 rendering-desklet-decorations.c rendering-desklet-decorations.h
11 rendering-desklet-slide.c rendering-desklet-slide.h11 rendering-desklet-slide.c rendering-desklet-slide.h
12 rendering-desklet-viewport.c rendering-desklet-viewport.h
12 rendering-struct.h13 rendering-struct.h
13)14)
1415
1516
=== modified file 'desklet-rendering/src/rendering-desklet-slide.c' (properties changed: +x to -x)
=== modified file 'desklet-rendering/src/rendering-desklet-slide.h' (properties changed: +x to -x)
=== added file 'desklet-rendering/src/rendering-desklet-viewport.c'
--- desklet-rendering/src/rendering-desklet-viewport.c 1970-01-01 00:00:00 +0000
+++ desklet-rendering/src/rendering-desklet-viewport.c 2010-07-17 12:02:42 +0000
@@ -0,0 +1,707 @@
1/**
2* This file is a part of the Cairo-Dock project
3*
4* Copyright : (C) see the 'copyright' file.
5* E-mail : see the 'copyright' file.
6*
7* This program is free software; you can redistribute it and/or
8* modify it under the terms of the GNU General Public License
9* as published by the Free Software Foundation; either version 3
10* of the License, or (at your option) any later version.
11*
12* This program is distributed in the hope that it will be useful,
13* but WITHOUT ANY WARRANTY; without even the implied warranty of
14* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15* GNU General Public License for more details.
16* You should have received a copy of the GNU General Public License
17* along with this program. If not, see <http://www.gnu.org/licenses/>.
18*/
19
20#include <string.h>
21#include <math.h>
22#include <cairo-dock.h>
23
24#include "rendering-desklet-viewport.h"
25
26#define _cairo_dock_set_path_as_current(...) _cairo_dock_set_vertex_pointer(pVertexTab)
27
28
29static gboolean on_enter_icon_viewport (gpointer pUserData, Icon *pPointedIcon, CairoContainer *pContainer, gboolean *bStartAnimation)
30{
31 gtk_widget_queue_draw (pContainer->pWidget); // et oui, on n'a rien d'autre a faire.
32
33 return CAIRO_DOCK_LET_PASS_NOTIFICATION;
34}
35
36static inline void _viewport_pan_delta(CairoDesklet *pDesklet, double fDeltaX, double fDeltaY)
37{
38 CDViewportParameters *pViewportConf = (CDViewportParameters *) pDesklet->pRendererData;
39 pViewportConf->fCurrentPanXSpeed = fDeltaX;
40 pViewportConf->fCurrentPanYSpeed = fDeltaY;
41 pViewportConf->iCurrentOffsetX += fDeltaX;
42 pViewportConf->iCurrentOffsetY += fDeltaY;
43 if (pViewportConf->iCurrentOffsetX < 0)
44 {
45 pViewportConf->iCurrentOffsetX = 0;
46 pViewportConf->fCurrentPanXSpeed = 0;
47 }
48 else if( pViewportConf->iCurrentOffsetX > pViewportConf->iMaxOffsetX )
49 {
50 pViewportConf->iCurrentOffsetX = pViewportConf->iMaxOffsetX;
51 pViewportConf->fCurrentPanXSpeed = 0;
52 }
53 if (pViewportConf->iCurrentOffsetY < 0)
54 {
55 pViewportConf->iCurrentOffsetY = 0;
56 pViewportConf->fCurrentPanYSpeed = 0;
57 }
58 else if( pViewportConf->iCurrentOffsetY > pViewportConf->iMaxOffsetY )
59 {
60 pViewportConf->iCurrentOffsetY = pViewportConf->iMaxOffsetY;
61 pViewportConf->fCurrentPanYSpeed = 0;
62 }
63
64 gtk_widget_queue_draw (pDesklet->container.pWidget);
65}
66
67static gboolean on_update_desklet (gpointer pUserData, CairoDesklet *pDesklet, gboolean *bContinueAnimation)
68{
69 if (pDesklet->icons != NULL)
70 {
71 CDViewportParameters *pViewportConf = (CDViewportParameters *) pDesklet->pRendererData;
72 if (pViewportConf == NULL)
73 return CAIRO_DOCK_LET_PASS_NOTIFICATION;
74
75 if (! pDesklet->container.bInside) // on est en-dehors du desklet, on ralentit.
76 {
77 _viewport_pan_delta (pDesklet, pViewportConf->fCurrentPanXSpeed*.85, pViewportConf->fCurrentPanYSpeed*.85);
78 if (fabs (pViewportConf->fCurrentPanXSpeed)+fabs (pViewportConf->fCurrentPanYSpeed) < pViewportConf->iIconSize/15)
79 // vitesse de translation epsilonesque, on quitte.
80 {
81 pViewportConf->fCurrentPanXSpeed = 0;
82 pViewportConf->fCurrentPanYSpeed = 0;
83 return CAIRO_DOCK_LET_PASS_NOTIFICATION;
84 }
85 *bContinueAnimation = TRUE;
86 }
87 else
88 {
89 double fDeltaX = 0;
90 double fDeltaY = 0;
91 // si on est dans la marge de 20% de la largeur du desklet a gauche,
92 // alors on translate a droite
93 if (pDesklet->container.iMouseX <= pDesklet->container.iWidth*0.2)
94 {
95 // La force de translation va de 0 (lorsqu'on est a 20%) jusqu'a
96 // pViewportConf->iIconSize / 2. (lorsqu'on est a 0%)
97 fDeltaX = (pViewportConf->iIconSize / 10) *
98 (pDesklet->container.iWidth*0.2 - pDesklet->container.iMouseX)/(pDesklet->container.iWidth*0.2);
99 *bContinueAnimation = TRUE;
100 }
101 // si on est dans la marge de 20% de la largeur du desklet a droite,
102 // alors on translate a gauche (-1)
103 else if( pDesklet->container.iMouseX >= pDesklet->container.iWidth*0.8 )
104 {
105 // La force de translation va de 0 (lorsqu'on est a 80%) jusqu'a
106 // pViewportConf->iIconSize / 2. (lorsqu'on est a 100%)
107 fDeltaX = -(pViewportConf->iIconSize / 10) *
108 (pDesklet->container.iMouseX - pDesklet->container.iWidth*0.8)/(pDesklet->container.iWidth*0.2);
109 *bContinueAnimation = TRUE;
110 }
111 // si on est dans la marge de 20% de la hauteur du desklet en haut,
112 // alors on translate en bas
113 if (pDesklet->container.iMouseY <= pDesklet->container.iHeight*0.2)
114 {
115 // La force de translation va de 0 (lorsqu'on est a 20%) jusqu'a
116 // pViewportConf->iIconSize / 2. (lorsqu'on est a 0%)
117 fDeltaY = -(pViewportConf->iIconSize / 10) *
118 (pDesklet->container.iHeight*0.2 - pDesklet->container.iMouseY)/(pDesklet->container.iHeight*0.2);
119 *bContinueAnimation = TRUE;
120 }
121 // si on est dans la marge de 20% de la hauteur du desklet en bas,
122 // alors on translate en haut (-1)
123 else if( pDesklet->container.iMouseY >= pDesklet->container.iHeight*0.8 )
124 {
125 // La force de translation va de 0 (lorsqu'on est a 80%) jusqu'a
126 // pViewportConf->iIconSize / 2. (lorsqu'on est a 100%)
127 fDeltaY = (pViewportConf->iIconSize / 10) *
128 (pDesklet->container.iMouseY - pDesklet->container.iHeight*0.8)/(pDesklet->container.iHeight*0.2);
129 *bContinueAnimation = TRUE;
130 }
131 if( *bContinueAnimation == TRUE )
132 {
133 _viewport_pan_delta( pDesklet, fDeltaX, fDeltaY );
134 }
135 else
136 {
137 pViewportConf->fCurrentPanXSpeed = 0.;
138 pViewportConf->fCurrentPanYSpeed = 0.;
139 }
140 }
141 }
142 return CAIRO_DOCK_LET_PASS_NOTIFICATION;
143}
144
145static gboolean on_mouse_move (gpointer pUserData, CairoDesklet *pDesklet, gboolean *bStartAnimation)
146{
147 if (pDesklet->icons != NULL)
148 {
149 CDViewportParameters *pViewportConf = (CDViewportParameters *) pDesklet->pRendererData;
150 if (pViewportConf == NULL)
151 return CAIRO_DOCK_LET_PASS_NOTIFICATION;
152 if (pViewportConf->bInfiniteWidth && (pDesklet->container.iMouseX <= pDesklet->container.iWidth*0.2 || pDesklet->container.iMouseX >= pDesklet->container.iWidth*0.8))
153 *bStartAnimation = TRUE;
154 if (pViewportConf->bInfiniteHeight && (pDesklet->container.iMouseY <= pDesklet->container.iHeight*0.2 || pDesklet->container.iMouseY >= pDesklet->container.iHeight*0.8))
155 *bStartAnimation = TRUE;
156 }
157 return CAIRO_DOCK_LET_PASS_NOTIFICATION;
158}
159
160static CDViewportParameters *configure (CairoDesklet *pDesklet, gpointer *pConfig) // gboolean, int, gdouble[4]
161{
162 CDViewportParameters *pViewportConf = g_new0 (CDViewportParameters, 1);
163 if (pConfig != NULL)
164 {
165 pViewportConf->bRoundedRadius = GPOINTER_TO_INT (pConfig[0]);
166 pViewportConf->iRadius = GPOINTER_TO_INT (pConfig[1]);
167 if (pConfig[2] != NULL)
168 memcpy (pViewportConf->fLineColor, pConfig[2], 4 * sizeof (gdouble));
169 }
170
171 pViewportConf->iLineWidth = 2;
172 pViewportConf->iGapBetweenIcons = 10;
173 pViewportConf->iMinimumIconSize = 48;
174 pViewportConf->iCurrentOffsetX = 0;
175 pViewportConf->iCurrentOffsetY = 0;
176 pViewportConf->fCurrentPanXSpeed = 0;
177 pViewportConf->fCurrentPanYSpeed = 0;
178 pViewportConf->iMaxOffsetX = 0;
179 pViewportConf->iMaxOffsetY = 0;
180 pViewportConf->bInfiniteHeight=TRUE;
181 pViewportConf->bInfiniteWidth=FALSE;
182
183 cairo_dock_register_notification_on_container (CAIRO_CONTAINER (pDesklet), CAIRO_DOCK_ENTER_ICON, (CairoDockNotificationFunc) on_enter_icon_viewport, CAIRO_DOCK_RUN_FIRST, NULL);
184
185 cairo_dock_register_notification_on_container (CAIRO_CONTAINER (pDesklet), CAIRO_DOCK_UPDATE_DESKLET, (CairoDockNotificationFunc) on_update_desklet, CAIRO_DOCK_RUN_AFTER, NULL);
186 cairo_dock_register_notification_on_container (CAIRO_CONTAINER (pDesklet), CAIRO_DOCK_MOUSE_MOVED, (CairoDockNotificationFunc) on_mouse_move, CAIRO_DOCK_RUN_AFTER, NULL);
187
188 return pViewportConf;
189}
190
191
192static inline void _compute_icons_grid (CairoDesklet *pDesklet, CDViewportParameters *pViewportConf)
193{
194 pViewportConf->fMargin = (pViewportConf->bRoundedRadius ?
195 .5 * pViewportConf->iLineWidth + (1. - sqrt (2) / 2) * pViewportConf->iRadius :
196 .5 * pViewportConf->iLineWidth + .5 * pViewportConf->iRadius);
197
198 int iNbIcons = 0;
199 Icon *pIcon;
200 GList *ic;
201 for (ic = pDesklet->icons; ic != NULL; ic = ic->next)
202 {
203 pIcon = ic->data;
204 if (! CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon))
205 iNbIcons ++;
206 }
207 pViewportConf->iNbIcons = iNbIcons;
208
209 double w = pDesklet->container.iWidth - 2 * pViewportConf->fMargin;
210 double h = pDesklet->container.iHeight - 2 * pViewportConf->fMargin;
211 int dh = myLabels.iLabelSize; // taille verticale ajoutee a chaque icone.
212 int dw = 2 * dh; // taille horizontale ajoutee a chaque icone.
213 int di = pViewportConf->iGapBetweenIcons; // ecart entre 2 lignes/colonnes.
214
215 int p, q; // nombre de lignes et colonnes.
216 int iSize;
217 pViewportConf->iIconSize = 0, pViewportConf->iNbLines = 0, pViewportConf->iNbColumns = 0;
218 //g_print ("%d icones sur %dx%d (%d)\n", pViewportConf->iNbIcons, (int)w, (int)h, myLabels.iLabelSize);
219 for (p = 1; p <= pViewportConf->iNbIcons; p ++)
220 {
221 q = (int) ceil ((double)pViewportConf->iNbIcons / p);
222 iSize = MIN ((h - (p - 1) * di) / p - dh, (w - (q - 1) * di) / q - dw);
223 //g_print (" %dx%d -> %d\n", p, q, iSize);
224 if (iSize > pViewportConf->iIconSize)
225 {
226 pViewportConf->iIconSize = iSize;
227 pViewportConf->iNbLines = p;
228 pViewportConf->iNbColumns = q;
229 }
230 else if(iSize > 0) // there is only one maximum
231 {
232 break;
233 }
234 }
235 // si les icones sont trop petites, et qu'on a une largeur et/ou une
236 // hauteur infinie(s), essayer d'avoir au moins une taille minimale
237 if( pViewportConf->iIconSize < pViewportConf->iMinimumIconSize &&
238 (pViewportConf->bInfiniteWidth || pViewportConf->bInfiniteHeight) )
239 {
240 if( pViewportConf->bInfiniteWidth && pViewportConf->bInfiniteHeight )
241 {
242 // surface infinie: on garde le meme nb de colonnes&lignes,
243 // mais on met la taille d'icone a iMinimumIconSize
244 pViewportConf->iIconSize = pViewportConf->iMinimumIconSize;
245 }
246 else if( pViewportConf->bInfiniteHeight )
247 {
248 // hauteur infinie et largeur fixe: on calcule le nombre de colonnes
249 // maxi avec pViewportConf->iIconSize = pViewportConf->iMinimumIconSize
250 pViewportConf->iIconSize = pViewportConf->iMinimumIconSize;
251 pViewportConf->iNbColumns = (w + di) / ( pViewportConf->iIconSize + dw + di );
252 if( pViewportConf->iNbColumns < 1 )
253 {
254 pViewportConf->iNbColumns = 1;
255 pViewportConf->iIconSize = w - dw;
256 }
257 pViewportConf->iNbLines = (int) ceil ((double)pViewportConf->iNbIcons / pViewportConf->iNbColumns);
258 }
259 else if( pViewportConf->bInfiniteWidth )
260 {
261 // largeur infinie et hauteur fixe: on calcule le nombre de lignes
262 // maxi avec pViewportConf->iIconSize = pViewportConf->iMinimumIconSize
263 pViewportConf->iIconSize = pViewportConf->iMinimumIconSize;
264 pViewportConf->iNbLines = (h + di) / ( pViewportConf->iIconSize + dh + di );
265 if( pViewportConf->iNbLines < 1 )
266 {
267 pViewportConf->iNbLines = 1;
268 pViewportConf->iIconSize = h - dh;
269 }
270 pViewportConf->iNbColumns = (int) ceil ((double)pViewportConf->iNbIcons / pViewportConf->iNbLines);
271 }
272 // on calcule l'offset maximal atteignable en X
273 pViewportConf->iMaxOffsetX = MAX(( pViewportConf->iIconSize + dw + di )*pViewportConf->iNbColumns - (w + di), 0);
274 // on calcule l'offset maximal atteignable en Y
275 pViewportConf->iMaxOffsetY = MAX(( pViewportConf->iIconSize + dh + di )*pViewportConf->iNbLines - (h + di), 0);
276 }
277}
278
279static void load_data (CairoDesklet *pDesklet)
280{
281 CDViewportParameters *pViewportConf = (CDViewportParameters *) pDesklet->pRendererData;
282 if (pViewportConf == NULL)
283 return ;
284
285 _compute_icons_grid (pDesklet, pViewportConf);
286}
287
288
289static void free_data (CairoDesklet *pDesklet)
290{
291 cairo_dock_remove_notification_func_on_container (CAIRO_CONTAINER (pDesklet), CAIRO_DOCK_ENTER_ICON, (CairoDockNotificationFunc) on_enter_icon_viewport, NULL);
292
293 CDViewportParameters *pViewportConf = (CDViewportParameters *) pDesklet->pRendererData;
294 if (pViewportConf == NULL)
295 return ;
296
297 g_free (pViewportConf);
298 pDesklet->pRendererData = NULL;
299}
300
301
302static void set_icon_size (CairoDesklet *pDesklet, Icon *pIcon)
303{
304 CDViewportParameters *pViewportConf = (CDViewportParameters *) pDesklet->pRendererData;
305 if (pViewportConf == NULL)
306 return ;
307
308 if (pIcon == pDesklet->pIcon)
309 {
310 pIcon->fWidth = 0.;
311 pIcon->fHeight = 0.;
312 }
313 else
314 {
315 pIcon->fWidth = pViewportConf->iIconSize;
316 pIcon->fHeight = pViewportConf->iIconSize;
317 }
318}
319
320static void calculate_icons (CairoDesklet *pDesklet)
321{
322 CDViewportParameters *pViewportConf = (CDViewportParameters *) pDesklet->pRendererData;
323 if (pViewportConf == NULL)
324 return ;
325
326 _compute_icons_grid (pDesklet, pViewportConf);
327 cd_debug ("pViewportConf->iIconSize : %d\n", pViewportConf->iIconSize);
328
329 Icon *pIcon = pDesklet->pIcon;
330 if (pIcon != NULL) // on ne veut pas charger cette icone.
331 {
332 pIcon->fWidth = -1;
333 pIcon->fHeight = -1;
334 }
335
336 GList* ic;
337 for (ic = pDesklet->icons; ic != NULL; ic = ic->next)
338 {
339 pIcon = ic->data;
340 if (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon))
341 {
342 pIcon->fWidth = -1;
343 pIcon->fHeight = -1;
344 }
345 else
346 {
347 pIcon->fWidth = pViewportConf->iIconSize;
348 pIcon->fHeight = pViewportConf->iIconSize;
349
350 pIcon->fScale = 1.;
351 pIcon->fAlpha = 1.;
352 pIcon->fWidthFactor = 1.;
353 pIcon->fHeightFactor = 1.;
354 pIcon->fGlideScale = 1.;
355 }
356 }
357}
358
359
360static void render (cairo_t *pCairoContext, CairoDesklet *pDesklet)
361{
362 CDViewportParameters *pViewportConf = (CDViewportParameters *) pDesklet->pRendererData;
363 //g_print ("%s(%x)\n", __func__, pViewportConf);
364 if (pViewportConf == NULL)
365 return ;
366
367 double fRadius = pViewportConf->iRadius;
368 double fLineWidth = pViewportConf->iLineWidth;
369 // le cadre.
370 cairo_set_line_width (pCairoContext, pViewportConf->iLineWidth);
371 if (pViewportConf->bRoundedRadius)
372 {
373 cairo_translate (pCairoContext, 0., .5 * fLineWidth);
374 cairo_dock_draw_rounded_rectangle (pCairoContext,
375 fRadius,
376 fLineWidth,
377 pDesklet->container.iWidth - 2 * fRadius - fLineWidth,
378 pDesklet->container.iHeight - 2*fLineWidth);
379 }
380 else
381 {
382 cairo_move_to (pCairoContext, 0., 0.);
383 cairo_rel_line_to (pCairoContext,
384 0.,
385 pDesklet->container.iHeight - fRadius - fLineWidth);
386 cairo_rel_line_to (pCairoContext,
387 pViewportConf->iRadius,
388 pViewportConf->iRadius);
389 cairo_rel_line_to (pCairoContext,
390 pDesklet->container.iWidth - fRadius - fLineWidth,
391 0.);
392 }
393 cairo_set_source_rgba (pCairoContext, pViewportConf->fLineColor[0], pViewportConf->fLineColor[1], pViewportConf->fLineColor[2], pViewportConf->fLineColor[3]);
394 cairo_stroke (pCairoContext);
395
396 // les icones.
397 double w = pDesklet->container.iWidth - 2 * pViewportConf->fMargin;
398 double h = pDesklet->container.iHeight - 2 * pViewportConf->fMargin;
399 int dh = myLabels.iLabelSize; // taille verticale ajoutee a chaque icone.
400 int dw = 2 * dh; // taille horizontale ajoutee a chaque icone.
401 if( pViewportConf->iMaxOffsetY == 0 )
402 {
403 dh = (h - pViewportConf->iNbLines * (pViewportConf->iIconSize + myLabels.iLabelSize)) / pViewportConf->iNbLines; // ecart entre 2 lignes.
404 }
405 if( pViewportConf->iMaxOffsetX == 0 )
406 {
407 dw = (w - pViewportConf->iNbColumns * pViewportConf->iIconSize) / pViewportConf->iNbColumns; // ecart entre 2 colonnes.
408 }
409
410 // on determine la 1ere icone a tracer : l'icone suivant l'icone pointee.
411
412 double x = pViewportConf->fMargin + dw/2, y = pViewportConf->fMargin + dh/2;
413 int q = 0;
414 Icon *pIcon;
415 GList *ic;
416 GList *pVisibleIcons = NULL;
417 for (ic = pDesklet->icons; ic != NULL; ic = ic->next)
418 {
419 pIcon = ic->data;
420 if (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon))
421 continue;
422
423 pIcon->fDrawX = x - pViewportConf->iCurrentOffsetX;
424 pIcon->fDrawY = y - pViewportConf->iCurrentOffsetY;
425
426 x += pViewportConf->iIconSize + dw;
427 q ++;
428 if (q == pViewportConf->iNbColumns)
429 {
430 q = 0;
431 x = pViewportConf->fMargin + dw/2;
432 y += pViewportConf->iIconSize + myLabels.iLabelSize + dh;
433 }
434 // On ne dessine que les icones qui sont visibles
435 if( pIcon->fDrawX - pViewportConf->fMargin + dw/2 >= 0 &&
436 pIcon->fDrawY - pViewportConf->fMargin + myLabels.iLabelSize >= 0 &&
437 pIcon->fDrawX - pViewportConf->fMargin + dw/2 <= w - (pViewportConf->iIconSize + dw) &&
438 pIcon->fDrawY - pViewportConf->fMargin + myLabels.iLabelSize <= h - (pViewportConf->iIconSize + myLabels.iLabelSize + dh))
439 {
440 pVisibleIcons = g_list_append(pVisibleIcons, pIcon);
441 }
442 }
443
444 GList *pFirstDrawnElement = cairo_dock_get_first_drawn_element_linear (pVisibleIcons);
445 if (pFirstDrawnElement == NULL)
446 return;
447 ic = pFirstDrawnElement;
448 do
449 {
450 pIcon = ic->data;
451 if (pIcon->pIconBuffer != NULL && ! CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon))
452 {
453 cairo_save (pCairoContext);
454
455 cairo_dock_render_one_icon_in_desklet (pIcon, pCairoContext, FALSE, FALSE, pDesklet->container.iWidth);
456
457 cairo_restore (pCairoContext);
458
459
460 if (pIcon->pTextBuffer != NULL)
461 {
462 cairo_save (pCairoContext);
463 cairo_translate (pCairoContext, pIcon->fDrawX, pIcon->fDrawY);
464
465 double fOffsetX = 0., fAlpha;
466 if (pIcon->bPointed)
467 {
468 fAlpha = 1.;
469 if (pIcon->fDrawX + pIcon->fWidth/2 + pIcon->iTextWidth/2 > pDesklet->container.iWidth)
470 fOffsetX = pDesklet->container.iWidth - (pIcon->fDrawX + pIcon->fWidth/2 + pIcon->iTextWidth/2);
471 if (pIcon->fDrawX + pIcon->fWidth/2 - pIcon->iTextWidth/2 < 0)
472 fOffsetX = pIcon->iTextWidth/2 - (pIcon->fDrawX + pIcon->fWidth/2);
473 cairo_set_source_surface (pCairoContext,
474 pIcon->pTextBuffer,
475 fOffsetX + pIcon->fWidth/2 - pIcon->iTextWidth/2,
476 -myLabels.iLabelSize);
477 cairo_paint_with_alpha (pCairoContext, fAlpha);
478 }
479 else
480 {
481 fAlpha = .6;
482 if (pIcon->iTextWidth > pIcon->fWidth + 2 * myLabels.iLabelSize)
483 {
484 fOffsetX = - myLabels.iLabelSize;
485 cairo_pattern_t *pGradationPattern = cairo_pattern_create_linear (fOffsetX,
486 0.,
487 fOffsetX + pIcon->fWidth + 2*myLabels.iLabelSize,
488 0.);
489 cairo_pattern_set_extend (pGradationPattern, CAIRO_EXTEND_NONE);
490 cairo_pattern_add_color_stop_rgba (pGradationPattern,
491 0.,
492 0.,
493 0.,
494 0.,
495 fAlpha);
496 cairo_pattern_add_color_stop_rgba (pGradationPattern,
497 0.75,
498 0.,
499 0.,
500 0.,
501 fAlpha);
502 cairo_pattern_add_color_stop_rgba (pGradationPattern,
503 1.,
504 0.,
505 0.,
506 0.,
507 0.);
508 cairo_set_source_surface (pCairoContext,
509 pIcon->pTextBuffer,
510 fOffsetX,
511 -myLabels.iLabelSize);
512 cairo_mask (pCairoContext, pGradationPattern);
513 cairo_pattern_destroy (pGradationPattern);
514 }
515 else
516 {
517 fOffsetX = pIcon->fWidth/2 - pIcon->iTextWidth/2;
518 cairo_set_source_surface (pCairoContext,
519 pIcon->pTextBuffer,
520 fOffsetX,
521 -myLabels.iLabelSize);
522 cairo_paint_with_alpha (pCairoContext, fAlpha);
523 }
524 }
525
526 cairo_restore (pCairoContext);
527 }
528 }
529 ic = cairo_dock_get_next_element (ic, pVisibleIcons);
530 }
531 while (ic != pFirstDrawnElement);
532}
533
534
535static void render_opengl (CairoDesklet *pDesklet)
536{
537 CDViewportParameters *pViewportConf = (CDViewportParameters *) pDesklet->pRendererData;
538 if (pViewportConf == NULL)
539 return ;
540
541 // le cadre.
542 double fRadius = (pViewportConf->bRoundedRadius ? pViewportConf->iRadius : 0.);
543 double fLineWidth = pViewportConf->iLineWidth;
544 if (fLineWidth != 0 && pViewportConf->fLineColor[3] != 0)
545 {
546 cairo_dock_draw_rounded_rectangle_opengl (pDesklet->container.iWidth - 2 * fRadius,
547 pDesklet->container.iHeight,
548 fRadius,
549 fLineWidth,
550 pViewportConf->fLineColor);
551 glTranslatef (-pDesklet->container.iWidth/2, -pDesklet->container.iHeight/2, 0.);
552 }
553
554 glTranslatef (-pDesklet->container.iWidth/2, -pDesklet->container.iHeight/2, 0.);
555
556 // les icones.
557 double w = pDesklet->container.iWidth - 2 * pViewportConf->fMargin;
558 double h = pDesklet->container.iHeight - 2 * pViewportConf->fMargin;
559 int dh = myLabels.iLabelSize; // taille verticale ajoutee a chaque icone.
560 int dw = 2 * dh; // taille horizontale ajoutee a chaque icone.
561 if( pViewportConf->iMaxOffsetY == 0 )
562 {
563 // ecart entre 2 lignes si il faut repartir vertivalement les icones.
564 dh = (h - pViewportConf->iNbLines * (pViewportConf->iIconSize + myLabels.iLabelSize) - 2*pViewportConf->fMargin - myLabels.iLabelSize) / pViewportConf->iNbLines;
565 }
566 if( pViewportConf->iMaxOffsetX == 0 )
567 {
568 // ecart entre 2 colonnes si il faut repartir horizontalement les icones.
569 dw = (w - pViewportConf->iNbColumns * pViewportConf->iIconSize - 2*pViewportConf->fMargin) / pViewportConf->iNbColumns;
570 }
571
572 _cairo_dock_enable_texture ();
573 _cairo_dock_set_blend_alpha ();
574 _cairo_dock_set_alpha (1.);
575
576
577 double x = pViewportConf->fMargin + dw/2, y = pViewportConf->fMargin + myLabels.iLabelSize + dh/2;
578 int q = 0;
579 Icon *pIcon;
580 GList *ic;
581 GList *pVisibleIcons = NULL;
582 for (ic = pDesklet->icons; ic != NULL; ic = ic->next)
583 {
584 pIcon = ic->data;
585 if (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon))
586 continue;
587
588 pIcon->fDrawX = x - pViewportConf->iCurrentOffsetX;
589 pIcon->fDrawY = y - pViewportConf->iCurrentOffsetY;
590
591 x += pViewportConf->iIconSize + dw;
592 q ++;
593 if (q == pViewportConf->iNbColumns)
594 {
595 q = 0;
596 x = pViewportConf->fMargin + dw/2;
597 y += pViewportConf->iIconSize + myLabels.iLabelSize + dh;
598 }
599 // On ne dessine que les icones qui sont visibles
600 if( pIcon->fDrawX - pViewportConf->fMargin - dw/2 >= 0 &&
601 pIcon->fDrawY - pViewportConf->fMargin - myLabels.iLabelSize - dh/2 >= 0 &&
602 pIcon->fDrawX - pViewportConf->fMargin - dw/2 <= w - (pViewportConf->iIconSize + dw/2) &&
603 pIcon->fDrawY - pViewportConf->fMargin - myLabels.iLabelSize - dh/2 <= h - (pViewportConf->iIconSize + myLabels.iLabelSize + dh/2))
604 {
605 pVisibleIcons = g_list_append(pVisibleIcons, pIcon);
606 }
607 }
608
609
610 GList *pFirstDrawnElement = cairo_dock_get_first_drawn_element_linear (pVisibleIcons);
611 if (pFirstDrawnElement == NULL)
612 return;
613 ic = pFirstDrawnElement;
614 do
615 {
616 pIcon = ic->data;
617
618 if (pIcon->iIconTexture != 0 && ! CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon))
619 {
620 glPushMatrix ();
621
622 glTranslatef (pIcon->fDrawX + pIcon->fWidth/2,
623 pDesklet->container.iHeight - pIcon->fDrawY - pIcon->fHeight/2,
624 0.);
625 //g_print (" %d) %d;%d %dx%d\n", pIcon->iIconTexture, (int)(pIcon->fDrawX + pIcon->fWidth/2), (int)(pDesklet->container.iHeight - pIcon->fDrawY - pIcon->fHeight/2), (int)(pIcon->fWidth/2), (int)(pIcon->fHeight/2));
626 _cairo_dock_apply_texture_at_size (pIcon->iIconTexture, pIcon->fWidth, pIcon->fHeight);
627
628 /// generer une notification ...
629 /*if (pIcon->bHasIndicator && g_pIndicatorBuffer.iTexture != 0)
630 {
631 glPushMatrix ();
632 glTranslatef (0., - pIcon->fHeight/2 + g_pIndicatorBuffer.iHeight/2 * pIcon->fWidth / g_pIndicatorBuffer.iWidth, 0.);
633 _cairo_dock_apply_texture_at_size (g_pIndicatorBuffer.iTexture, pIcon->fWidth, g_pIndicatorBuffer.iHeight * pIcon->fWidth / g_pIndicatorBuffer.iWidth);
634 glPopMatrix ();
635 }*/
636
637 if (pIcon->iLabelTexture != 0)
638 {
639 glPushMatrix ();
640
641 double dx = .5 * (pIcon->iTextWidth & 1); // on decale la texture pour la coller sur la grille des coordonnees entieres.
642 double dy = .5 * (pIcon->iTextHeight & 1);
643 double u0 = 0., u1 = 1.;
644 double fOffsetX = 0.;
645 if (pIcon->bPointed)
646 {
647 _cairo_dock_set_alpha (1.);
648 if (pIcon->fDrawX + pIcon->fWidth/2 + pIcon->iTextWidth/2 > pDesklet->container.iWidth)
649 fOffsetX = pDesklet->container.iWidth - (pIcon->fDrawX + pIcon->fWidth/2 + pIcon->iTextWidth/2);
650 if (pIcon->fDrawX + pIcon->fWidth/2 - pIcon->iTextWidth/2 < 0)
651 fOffsetX = pIcon->iTextWidth/2 - (pIcon->fDrawX + pIcon->fWidth/2);
652 }
653 else
654 {
655 _cairo_dock_set_alpha (.6);
656 if (pIcon->iTextWidth > pIcon->fWidth + 2 * myLabels.iLabelSize)
657 {
658 fOffsetX = 0.;
659 u1 = (double) (pIcon->fWidth + 2 * myLabels.iLabelSize) / pIcon->iTextWidth;
660 }
661 }
662
663 glTranslatef (ceil (fOffsetX) + dx, ceil (pIcon->fHeight/2 + pIcon->iTextHeight / 2) + dy, 0.);
664
665 glBindTexture (GL_TEXTURE_2D, pIcon->iLabelTexture);
666 _cairo_dock_apply_current_texture_portion_at_size_with_offset (u0, 0.,
667 u1 - u0, 1.,
668 pIcon->iTextWidth * (u1 - u0), pIcon->iTextHeight,
669 0., 0.);
670 _cairo_dock_set_alpha (1.);
671
672 glPopMatrix ();
673 }
674
675 if (pIcon->iQuickInfoTexture != 0)
676 {
677 glTranslatef (0., (- pIcon->fHeight + pIcon->iQuickInfoHeight)/2, 0.);
678
679 _cairo_dock_apply_texture_at_size (pIcon->iQuickInfoTexture,
680 pIcon->iQuickInfoWidth,
681 pIcon->iQuickInfoHeight);
682 }
683
684 glPopMatrix ();
685 }
686
687 ic = cairo_dock_get_next_element (ic, pVisibleIcons);
688
689 } while (ic != pFirstDrawnElement);
690
691 _cairo_dock_disable_texture ();
692}
693
694
695
696void rendering_register_viewport_desklet_renderer (void)
697{
698 CairoDeskletRenderer *pRenderer = g_new0 (CairoDeskletRenderer, 1);
699 pRenderer->render = (CairoDeskletRenderFunc) render;
700 pRenderer->configure = (CairoDeskletConfigureRendererFunc) configure;
701 pRenderer->load_data = (CairoDeskletLoadRendererDataFunc) load_data;
702 pRenderer->free_data = (CairoDeskletFreeRendererDataFunc) free_data;
703 pRenderer->calculate_icons = (CairoDeskletCalculateIconsFunc) calculate_icons;
704 pRenderer->render_opengl = (CairoDeskletGLRenderFunc) render_opengl;
705
706 cairo_dock_register_desklet_renderer ("Viewport", pRenderer);
707}
0708
=== added file 'desklet-rendering/src/rendering-desklet-viewport.h'
--- desklet-rendering/src/rendering-desklet-viewport.h 1970-01-01 00:00:00 +0000
+++ desklet-rendering/src/rendering-desklet-viewport.h 2010-07-17 12:02:42 +0000
@@ -0,0 +1,56 @@
1/**
2* This file is a part of the Cairo-Dock project
3*
4* Copyright : (C) see the 'copyright' file.
5* E-mail : see the 'copyright' file.
6*
7* This program is free software; you can redistribute it and/or
8* modify it under the terms of the GNU General Public License
9* as published by the Free Software Foundation; either version 3
10* of the License, or (at your option) any later version.
11*
12* This program is distributed in the hope that it will be useful,
13* but WITHOUT ANY WARRANTY; without even the implied warranty of
14* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15* GNU General Public License for more details.
16* You should have received a copy of the GNU General Public License
17* along with this program. If not, see <http://www.gnu.org/licenses/>.
18*/
19
20
21#ifndef __RENDERING_DESKLET_VIEWPORT__
22#define __RENDERING_DESKLET_VIEWPORT__
23
24#include "cairo-dock.h"
25
26
27typedef struct {
28 // from config
29 gboolean bRoundedRadius;
30 gint iRadius;
31 gdouble fLineColor[4];
32 gint iLineWidth;
33 gint iGapBetweenIcons;
34 gint iMinimumIconSize;
35 gboolean bInfiniteWidth;
36 gboolean bInfiniteHeight;
37 // computed data
38 gdouble fMargin;
39 gint iNbIcons;
40 GList* iFirstIconToShow;
41 gint iIconSize;
42 gint iNbLines, iNbColumns;
43 gint iMaxOffsetX;
44 gint iMaxOffsetY;
45 // current state
46 gint iCurrentOffsetX;
47 gint iCurrentOffsetY;
48 gint fCurrentPanXSpeed;
49 gint fCurrentPanYSpeed;
50 } CDViewportParameters;
51
52
53void rendering_register_viewport_desklet_renderer (void);
54
55
56#endif
057
=== modified file 'desklet-rendering/src/rendering-init.c'
--- desklet-rendering/src/rendering-init.c 2010-07-06 00:03:56 +0000
+++ desklet-rendering/src/rendering-init.c 2010-07-17 12:02:42 +0000
@@ -26,12 +26,13 @@
26//#include "rendering-desklet-controler.h"26//#include "rendering-desklet-controler.h"
27//#include "rendering-desklet-mediaplayer.h"27//#include "rendering-desklet-mediaplayer.h"
28#include "rendering-desklet-slide.h"28#include "rendering-desklet-slide.h"
29#include "rendering-desklet-viewport.h"
29#include "rendering-desklet-decorations.h"30#include "rendering-desklet-decorations.h"
30#include "rendering-init.h"31#include "rendering-init.h"
3132
3233
33CD_APPLET_DEFINE_BEGIN (N_("desklet rendering"),34CD_APPLET_DEFINE_BEGIN (N_("desklet rendering"),
34 2,0,0,35 2,1,0,
35 CAIRO_DOCK_CATEGORY_THEME,36 CAIRO_DOCK_CATEGORY_THEME,
36 N_("This module provides different views for your desklets."),37 N_("This module provides different views for your desklets."),
37 "Fabounet (Fabrice Rey)")38 "Fabounet (Fabrice Rey)")
@@ -47,6 +48,7 @@
47 //rendering_register_controler_desklet_renderer ();48 //rendering_register_controler_desklet_renderer ();
48 //rendering_register_mediaplayer_desklet_renderer (); // By ChAnGFu49 //rendering_register_mediaplayer_desklet_renderer (); // By ChAnGFu
49 rendering_register_slide_desklet_renderer (); // By ChAnGFu50 rendering_register_slide_desklet_renderer (); // By ChAnGFu
51 rendering_register_viewport_desklet_renderer (); // By Tofe
50 52
51 //\_______________ On enregistre les decorations.53 //\_______________ On enregistre les decorations.
52 cd_rendering_register_desklet_decorations ();54 cd_rendering_register_desklet_decorations ();

Subscribers

People subscribed via source and target branches