2
* This file is a part of the Cairo-Dock project
4
* Copyright : (C) see the 'copyright' file.
5
* E-mail : see the 'copyright' file.
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.
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/>.
31
#include <glitz-glx.h>
32
#include <cairo-glitz.h>
35
#include "rendering-diapo.h"
37
extern gint my_diapo_iconGapX;
38
extern gint my_diapo_iconGapY;
39
extern gdouble my_diapo_fScaleMax;
40
extern gint my_diapo_sinW;
41
extern gboolean my_diapo_lineaire;
42
extern gboolean my_diapo_wide_grid;
43
extern gboolean my_diapo_text_only_on_pointed;
45
extern gdouble my_diapo_color_frame_start[4];
46
extern gdouble my_diapo_color_frame_stop[4];
47
extern gboolean my_diapo_fade2bottom;
48
extern gboolean my_diapo_fade2right;
49
extern guint my_diapo_arrowWidth;
50
extern guint my_diapo_arrowHeight;
51
extern gdouble my_diapo_arrowShift;
52
extern guint my_diapo_lineWidth;
53
extern guint my_diapo_radius;
54
extern gdouble my_diapo_color_border_line[4];
55
extern gboolean my_diapo_draw_background;
56
extern gboolean my_diapo_display_all_icons;
58
const gint X_CONST_BORDER_SPACE = 40;
59
const gint Y_CONST_BORDER_SPACE = 40;
60
const gint MaxTextWidth = 125;
62
void cd_rendering_calculate_max_dock_size_diapo (CairoDock *pDock)
69
//////////////////////////////////////////////////////////////////////////////////////// On calcule la configuration de la grille :
70
nIcones = cairo_dock_rendering_diapo_guess_grid(pDock->icons, &nRowsX, &nRowsY);
73
//////////////////////////////////////////////////////////////////////////////////////// On définit les tailles :
76
cairo_dock_calculate_icons_positions_at_rest_diapo (pDock->icons, &(pDock->iMinDockWidth), &(pDock->iMinDockHeight), nRowsX);
77
pDock->iMinDockWidth += X_CONST_BORDER_SPACE * 2;
78
pDock->iMinDockHeight += Y_CONST_BORDER_SPACE * 3 + my_diapo_arrowHeight-60; // 60 -> pour que la fleche aille plus bas
79
cairo_dock_rendering_diapo_calculate_max_dock_size (pDock->icons, pDock->iMinDockWidth, pDock->iMinDockHeight, &(pDock->iMaxDockWidth), &(pDock->iMaxDockHeight), nRowsX, nRowsY);
80
pDock->iMaxDockWidth += X_CONST_BORDER_SPACE * 2;
81
pDock->iMaxDockHeight += Y_CONST_BORDER_SPACE * 3 + my_diapo_arrowHeight-60; // 60 -> pour que la fleche aille plus bas
82
pDock->iMinDockWidth = pDock->iMaxDockWidth;
83
pDock->iMinDockHeight = pDock->iMaxDockHeight;
87
pDock->iMaxDockWidth = pDock->iMaxDockHeight = pDock->iMinDockWidth = pDock->iMinDockHeight = 0;
91
//////////////////////////////////////////////////////////////////////////////////////// Définition de la zone de déco - 0 pour l'instant
92
pDock->iDecorationsHeight = 0;
93
pDock->iDecorationsWidth = 0;
96
//////////////////////////////////////////////////////////////////////////////////////// On affecte ca aussi au cas où
97
pDock->fFlatDockWidth = pDock->iMinDockWidth;
101
void cd_rendering_render_diapo (cairo_t *pCairoContext, CairoDock *pDock)
103
if(my_diapo_draw_background)
105
//\____________________ On trace le cadre.
106
cairo_save (pCairoContext);
107
cairo_dock_draw_frame_for_diapo (pCairoContext, pDock);
109
//\____________________ On dessine les decorations dedans.
110
cairo_dock_render_decorations_in_frame_for_diapo (pCairoContext, pDock);
112
//\____________________ On dessine le cadre.
113
if (my_diapo_lineWidth > 0)
115
cairo_set_line_width (pCairoContext, my_diapo_lineWidth);
116
cairo_set_source_rgba (pCairoContext,
117
my_diapo_color_border_line[0],
118
my_diapo_color_border_line[1],
119
my_diapo_color_border_line[2],
120
my_diapo_color_border_line[3] * (1. - 0*pDock->fFoldingFactor));
121
cairo_stroke (pCairoContext);
123
cairo_restore (pCairoContext);
126
//\____________________ On dessine la ficelle qui les joint.
128
if (myIcons.iStringLineWidth > 0)
129
cairo_dock_draw_string (pCairoContext, pDock, myIcons.iStringLineWidth, FALSE, FALSE);
130
//\____________________ On dessine les icones avec leurs etiquettes.
133
//////////////////////////////////////////////////////////////////////////////////////// Si y'en a pas on se barre (dock vide)
134
//if (pFirstDrawnElement == NULL) return;
135
if (pDock->icons == NULL) return;
138
//////////////////////////////////////////////////////////////////////////////////////// On parcourt la liste les icones :
141
for (ic = pDock->icons; ic != NULL; ic = ic->next)
144
//////////////////////////////////////////////////////////////////////////////////////// On recupere la structure d'infos
148
//////////////////////////////////////////////////////////////////////////////////////// On sauvegarde le contexte de cairo
149
cairo_save (pCairoContext);
152
//////////////////////////////////////////////////////////////////////////////////////// On affiche l'icone en cours avec les options :
153
cairo_dock_render_one_icon (icon, pDock, pCairoContext, 0., FALSE);
156
//////////////////////////////////////////////////////////////////////////////////////// On restore le contexte de cairo
157
cairo_restore (pCairoContext);
160
//////////////////////////////////////////////////////////////////////////////////////// On affiche le texte !
161
if(icon->pTextBuffer != NULL)
163
cairo_save (pCairoContext);
165
if(2*icon->fTextXOffset > MaxTextWidth)
167
zoom = MaxTextWidth / (2*icon->fTextXOffset);
168
cairo_scale(pCairoContext, zoom, zoom);
170
if (pDock->container.bIsHorizontal)
172
cairo_set_source_surface (pCairoContext,
174
(icon->fDrawX + (icon->fWidth * icon->fScale)/2)/zoom - icon->fTextXOffset,
175
(icon->fDrawY + (icon->fHeight * icon->fScale) + (my_diapo_iconGapY / 2) - 6 )/zoom); // 6 ~= hauteur texte / 2
179
cairo_set_source_surface (pCairoContext,
181
(icon->fDrawY + (icon->fWidth * icon->fScale)/2)/zoom - icon->fTextXOffset,
182
(icon->fDrawX + (icon->fHeight * icon->fScale) + (my_diapo_iconGapY / 2) - 6)/zoom); // 6 ~= hauteur texte / 2
185
if ((my_diapo_text_only_on_pointed && icon->bPointed) || my_diapo_display_all_icons)
186
cairo_paint (pCairoContext);
187
else if (!my_diapo_text_only_on_pointed)
188
cairo_paint_with_alpha (pCairoContext, 1. + (icon->fScale - my_diapo_fScaleMax)/(my_diapo_fScaleMax - 1));
190
cairo_restore (pCairoContext);
195
static void _cd_rendering_check_if_mouse_inside_diapo (CairoDock *pDock)
197
if (! pDock->container.bInside)
199
pDock->iMousePositionType = CAIRO_DOCK_MOUSE_OUTSIDE;
201
else if ((pDock->container.iMouseX < my_diapo_iconGapX) || (pDock->container.iMouseX > pDock->iMaxDockWidth - my_diapo_iconGapX) || (pDock->container.iMouseY < my_diapo_iconGapY) || (pDock->container.iMouseY > pDock->iMaxDockHeight - my_diapo_iconGapY))
203
pDock->iMousePositionType = CAIRO_DOCK_MOUSE_ON_THE_EDGE;
207
pDock->iMousePositionType = CAIRO_DOCK_MOUSE_INSIDE;
210
Icon *cd_rendering_calculate_icons_diapo (CairoDock *pDock)
215
gint posMouseAbsX = 0;
216
gint posMouseAbsY = 0;
219
//////////////////////////////////////////////////////////////////////////////////////// On calcule la configuration de la grille :
220
nIcones = cairo_dock_rendering_diapo_guess_grid(pDock->icons, &nRowsX, &nRowsY);
223
//\_______________ On calcule la position du curseur.
224
posMouseAbsX = pDock->container.iMouseX;
225
posMouseAbsY = pDock->container.iMouseY;
228
//////////////////////////////////////////////////////////////////////////////////////// On calcule les tailles des icones en fonction de la souris
229
cairo_dock_calculate_wave_with_position_diapo(pDock->icons, posMouseAbsX, posMouseAbsY, nRowsX);
232
//////////////////////////////////////////////////////////////////////////////////////// On calcule les positions des icones
233
Icon *pPointedIcon = cairo_dock_calculate_icons_position_for_diapo(pDock, nRowsX, nRowsY, posMouseAbsX, posMouseAbsY);
235
_cd_rendering_check_if_mouse_inside_diapo (pDock);
238
/// caluler bCanDrop ...
240
//////////////////////////////////////////////////////////////////////////////////////// On revoie l'icone pointee et NULL sinon
245
void cd_rendering_register_diapo_renderer (const gchar *cRendererName)
247
//////////////////////////////////////////////////////////////////////////////////////// On definit le renderer :
248
CairoDockRenderer *pRenderer = g_new0 (CairoDockRenderer, 1); //Nouvelle structure
249
pRenderer->cReadmeFilePath = g_strdup_printf ("%s/readme-diapo-view", MY_APPLET_SHARE_DATA_DIR); //On affecte le readme
250
pRenderer->cPreviewFilePath = g_strdup_printf ("%s/preview-diapo.jpg", MY_APPLET_SHARE_DATA_DIR); // la preview
251
pRenderer->compute_size = cd_rendering_calculate_max_dock_size_diapo; //La fonction qui défini les bornes
252
pRenderer->calculate_icons = cd_rendering_calculate_icons_diapo; //qui calcule les param des icones
253
pRenderer->render = cd_rendering_render_diapo; //qui initie le calcul du rendu
254
pRenderer->render_optimized = NULL; //pareil en mieux
255
pRenderer->set_subdock_position = cairo_dock_set_subdock_position_linear; // ?
257
pRenderer->bUseReflect = FALSE; // On dit non au reflections
259
cairo_dock_register_renderer (cRendererName, pRenderer); //Puis on signale l'existence de notre rendu
263
guint cairo_dock_rendering_diapo_guess_grid(GList *pIconList, guint *nRowX, guint *nRowY)
265
//////////////////////////////////////////////////////////////////////////////////////// Calcul du nombre de ligne / colonne :
266
guint count = g_list_length(pIconList);
267
if(my_diapo_wide_grid)
269
*nRowX = count ? ceil(sqrt(count)) : 0;
270
*nRowY = count ? ceil(((double) count) / *nRowX) : 0;
274
*nRowY = count ? ceil(sqrt(count)) : 0;
275
*nRowX = count ? ceil(((double) count) / *nRowY) : 0;
280
Icon* cairo_dock_calculate_icons_position_for_diapo(CairoDock *pDock, guint nRowsX, guint nRowsY, gint Mx, gint My)
282
//////////////////////////////////////////////////////////////////////////////////////// On calcule la position de base pour toutes les icones :
288
guint maxWidth [nRowsX];
289
guint maxHeight[nRowsY];
290
guint curDockWidth = 0;
291
guint curDockHeight = 0;
294
cairo_dock_rendering_diapo_calculate_max_icon_size(pDock->icons, (guint*) &maxWidth, (guint*) &maxHeight, nRowsX, nRowsY);
295
GList *pointed_ic = NULL;
296
//////////////////////////////////////////////////////////////////////////////////////// On crée une liste d'icone des icones à parcourir :
300
for (ic = pDock->icons; ic != NULL; ic = ic->next)
303
//////////////////////////////////////////////////////////////////////////////////////// On recupere la structure d'infos
305
cairo_dock_rendering_diapo_get_gridXY_from_index(nRowsX, i, &x, &y);
308
//////////////////////////////////////////////////////////////////////////////////////// On affecte les parametres de dessin :
310
//////////////////////////////////////////////////////////////////////////////////////// On va PAS se servir des fX fY comme d'index de la grille ailleurs qu'ici CAR le fY est changé dans des fonctions de drawing qui devrait pas ! -> je pense que c'est corrige.
315
//////////////////////////////////////////////////////////////////////////////////////// On passe au réferentiel de l'image :
316
icon->fXMin = icon->fXMax = icon->fXAtRest = //Ca on s'en sert pas encore
317
icon->fDrawX = iconeX + my_diapo_iconGapX + maxWidth [x] / 2 - (icon->fWidth * icon->fScale) / 2;
318
icon->fDrawY = iconeY + my_diapo_iconGapY + maxHeight[y] / 2 - (icon->fHeight * icon->fScale) / 2;
319
icon->fDrawX -= (icon->fDrawX - pDock->container.iWidth/2) * pDock->fFoldingFactor;
320
icon->fDrawY *= pDock->fFoldingFactor;
323
//////////////////////////////////////////////////////////////////////////////////////// On prépare pour la suivante :
325
if(!(i % nRowsX)) // si on est à la fin d'une ligne on change
327
curDockWidth = iconeX + maxWidth[x] + 2 * my_diapo_iconGapX;
329
iconeY += maxHeight[y] + 2 * my_diapo_iconGapY;
331
else // sinon on bouge juste X
333
iconeX += maxWidth[x] + 2 * my_diapo_iconGapX;
337
//////////////////////////////////////////////////////////////////////////////////////// On affecte tous les parametres qui n'ont pas été défini précédement
339
icon->fOrientation = 0.;//2. * G_PI * pDock->fFoldingFactor; // rotation de l'icone
341
icon->fWidthFactor = icon->fHeightFactor = 1. - pDock->fFoldingFactor;
343
if(iconeX != 0.)//cas de la rangé non terminée
345
iconeY += maxHeight[y] + 2 * my_diapo_iconGapY;
347
curDockHeight = iconeY;
350
//////////////////////////////////////////////////////////////////////////////////////// On calcule l'offset pour que ce soit centré :
351
offsetX = (pDock->iMaxDockWidth - curDockWidth ) / 2;
352
offsetY = (pDock->iMaxDockHeight - curDockHeight) / 2;
353
pDock->container.iWidth = curDockWidth;
354
pDock->container.iHeight = curDockHeight;
355
pDock->iDecorationsWidth = offsetX; // Alors désolé mais ca c'est de la grosse feinte : on utilise les tailles de decoration inutilisés
356
pDock->iDecorationsHeight = offsetY; // pour passer les offsets aux fonctions de dessin ... c'est sale mais ca marche !
357
for (ic = pDock->icons; ic != NULL; ic = ic->next)
360
cairo_dock_rendering_diapo_get_gridXY_from_index(nRowsX, i++, &x, &y);
361
//////////////////////////////////////////////////////////////////////////////////////// On recupere la structure d'infos
363
icon->fDrawX += offsetX;
364
icon->fDrawY += offsetY;
366
////////////////////////////////////////////////////////////////////////////////////////On va check de la mouse là :
367
if((Mx > icon->fDrawX - my_diapo_iconGapX) &&
368
(My > icon->fDrawY - my_diapo_iconGapY) &&
369
(Mx < icon->fDrawX + maxWidth[x] + my_diapo_iconGapX) &&
370
(My < icon->fDrawY + maxHeight[y] + my_diapo_iconGapY))
372
icon->bPointed = TRUE;
378
icon->bPointed = FALSE;
382
return pointed_ic == NULL ? NULL : pointed_ic->data;
387
void cairo_dock_calculate_wave_with_position_diapo(GList *pIconList, gint Mx, gint My, guint nRowsX)
392
if (pIconList == NULL)
394
cd_debug("Rendering>Diapo -> pIconList == NULL Totaly uncool \n Returning badly...");
397
if(( (Icon*) pIconList->data ) == NULL)
399
cd_debug("Rendering>Diapo -> (Icon*) pIconList->data == NULL Totaly uncool \n Returning badly...");
405
for (ic = pIconList; ic != NULL; ic = ic->next)
408
cairo_dock_rendering_diapo_get_gridXY_from_index(nRowsX, i, &x, &y);
410
gdouble x2 = icon->fDrawX + (icon->fWidth) / 2 + (my_diapo_fScaleMax - 1) * 20; // formule empirique de chez empirique pour corriger le décalage incalculable... (si vous y arrivez envoyez moi un mail -> mapremierpartiedepseudo.ladeuxieme@gmail.com et je vous appellerais Dieu... merci ! Ateention ! Pas d'entourre les poules hein !) // fDrawXAtRest
412
gdouble y2 = icon->fDrawY + (icon->fHeight) / 2 + (my_diapo_fScaleMax - 1) * 20; // idem // fDrawYAtRest
414
gdouble distanceE = sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
415
if(my_diapo_lineaire)
417
gdouble eloignementMax = 3. * (icon->fWidth + icon->fHeight) / 2;
418
if(distanceE > eloignementMax)
424
icon->fScale = - (1./eloignementMax) * distanceE + my_diapo_fScaleMax;
429
icon->fPhase = distanceE * G_PI / my_diapo_sinW + G_PI / 2.;
430
if (icon->fPhase < 0)
434
else if (icon->fPhase > G_PI)
438
icon->fScale = 1. + (my_diapo_fScaleMax-1.) * sin (icon->fPhase);
445
//////////////////////////////////////////////////////////////////////////////////////// Fonction calculant la taille maximale du dock
446
void cairo_dock_calculate_icons_positions_at_rest_diapo (GList *pIconList, gint* Wmin, gint* Hmin, guint nRowsX)
453
for (ic = pIconList; ic != NULL; ic = ic->next)
456
icon->fDrawX = iconeX; // fDrawXAtRest
457
icon->fDrawY = iconeY; // fDrawYAtRest
458
if(!(i % nRowsX)) // si on est à la fin d'une ligne on change
460
*Wmin = iconeX + icon->fWidth + 2 * my_diapo_iconGapX;
462
iconeY += icon->fHeight + 2 * my_diapo_iconGapY;
464
else // sinon on bouge juste X
466
iconeX += icon->fWidth + 2 * my_diapo_iconGapX;
470
if(iconeX != 0.)//cas de la rangée non terminée
472
iconeY += icon->fHeight + 2 * my_diapo_iconGapY;
477
//////////////////////////////////////////////////////////////////////////////////////// Fonction calculant sur chaque colonne et sur chaque ligne la taille d'icone maximale
478
void cairo_dock_rendering_diapo_calculate_max_icon_size(GList *pIconList, gint* maxWidth, gint* maxHeight, guint nRowsX, guint nRowsY)
483
for(i = 0 ; i < nRowsX ; i++) maxWidth [i] = 0;
484
for(i = 0 ; i < nRowsY ; i++) maxHeight[i] = 0;
487
//////////////////////////////////////////////////////////////////////////////////////// On crée une liste d'icone des icones à parcourir :
491
for (ic = pIconList; ic != NULL; ic = ic->next)
495
//////////////////////////////////////////////////////////////////////////////////////// On recupere la structure d'infos
497
cairo_dock_rendering_diapo_get_gridXY_from_index(nRowsX, i, &x, &y);
498
guint W = icon->fWidth * icon->fScale;
499
guint H = icon->fHeight * icon->fScale;
512
//////////////////////////////////////////////////////////////////////////////////////// Fonction calculant la taille maximale du dock en placant une fausse souris au milieu de la vue
513
void cairo_dock_rendering_diapo_calculate_max_dock_size (GList *pIconList, gint Wmin, gint Hmin, gint* Wmax, gint* Hmax, guint nRowsX, guint nRowsY)
516
if (pIconList == NULL)
518
gint maxWidth [nRowsX];
519
gint maxHeight[nRowsY];
522
cairo_dock_calculate_wave_with_position_diapo(pIconList, (Wmin / 2) + X_CONST_BORDER_SPACE, (Hmin / 2) + Y_CONST_BORDER_SPACE, nRowsX);
524
cairo_dock_rendering_diapo_calculate_max_icon_size(pIconList, (guint*) &maxWidth, (guint*) &maxHeight, nRowsX, nRowsY);
527
for(i = 0 ; i < nRowsX ; i++) *Wmax += maxWidth [i] + 2 * my_diapo_iconGapX;
528
for(i = 0 ; i < nRowsY ; i++) *Hmax += maxHeight[i] + 2 * my_diapo_iconGapY;
529
*Wmax += + 2*X_CONST_BORDER_SPACE;
530
*Hmax += + 2*Y_CONST_BORDER_SPACE;
533
//////////////////////////////////////////////////////////////////////////////////////// Fonctions utiles pour transformer l'index de la liste en couple (x,y) sur la grille
534
void cairo_dock_rendering_diapo_get_gridXY_from_index(guint nRowsX, guint index, guint* gridX, guint* gridY)
536
*gridX = index % nRowsX;
537
*gridY = (index - *gridX) / nRowsX;
541
//////////////////////////////////////////////////////////////////////////////////////// Et inversement (proportionnel)
542
guint cairo_dock_rendering_diapo_get_index_from_gridXY(guint nRowsX, guint gridX, guint gridY)
544
return gridX + gridY * nRowsX;
548
//////////////////////////////////////////////////////////////////////////////////////// Methodes de dessin :
551
static void cairo_dock_draw_frame_horizontal_for_diapo (cairo_t *pCairoContext, CairoDock *pDock)
553
const gdouble arrow_dec = 2;
554
gint fFrameWidth = pDock->container.iWidth;
555
gint fFrameHeight = pDock->container.iHeight - my_diapo_arrowHeight + 60; // 60->pour que la fleche aille plus bas...
556
gdouble fDockOffsetX = pDock->iDecorationsWidth;
557
gdouble fDockOffsetY = pDock->iDecorationsHeight;
559
cairo_move_to (pCairoContext, fDockOffsetX, fDockOffsetY);
562
//HautGauche -> HautDroit
563
if(pDock->container.bDirectionUp)
565
cairo_rel_line_to (pCairoContext, fFrameWidth, 0);
570
cairo_rel_line_to (pCairoContext, (fFrameWidth/2 - my_diapo_arrowWidth/2 - my_diapo_arrowShift * fFrameWidth), 0); // _
571
cairo_rel_line_to (pCairoContext, + my_diapo_arrowWidth/2 + my_diapo_arrowShift * fFrameWidth - my_diapo_arrowShift * fFrameWidth / arrow_dec, -my_diapo_arrowHeight); // \.
572
cairo_rel_line_to (pCairoContext, + my_diapo_arrowWidth/2 - my_diapo_arrowShift * fFrameWidth + my_diapo_arrowShift * fFrameWidth / arrow_dec, +my_diapo_arrowHeight); // /
573
cairo_rel_line_to (pCairoContext, (fFrameWidth/2 - my_diapo_arrowWidth/2 + my_diapo_arrowShift * fFrameWidth) , 0); // _
575
//\_________________ Coin haut droit.
576
cairo_rel_curve_to (pCairoContext,
579
my_diapo_radius, my_diapo_radius );
582
//HautDroit -> BasDroit
583
cairo_rel_line_to (pCairoContext, 0, fFrameHeight + my_diapo_lineWidth - my_diapo_radius * 2 );
584
//\_________________ Coin bas droit.
585
cairo_rel_curve_to (pCairoContext,
588
-my_diapo_radius , my_diapo_radius);
591
//BasDroit -> BasGauche
592
if(!pDock->container.bDirectionUp)
594
cairo_rel_line_to (pCairoContext, - fFrameWidth , 0);
599
cairo_rel_line_to (pCairoContext, - (fFrameWidth/2 - my_diapo_arrowWidth/2 - my_diapo_arrowShift * fFrameWidth), 0); // _
600
cairo_rel_line_to (pCairoContext, - my_diapo_arrowWidth/2 - my_diapo_arrowShift * fFrameWidth + my_diapo_arrowShift * fFrameWidth / arrow_dec, my_diapo_arrowHeight); // /
601
cairo_rel_line_to (pCairoContext, - my_diapo_arrowWidth/2 + my_diapo_arrowShift * fFrameWidth - my_diapo_arrowShift * fFrameWidth / arrow_dec, -my_diapo_arrowHeight); // \.
602
cairo_rel_line_to (pCairoContext, - (fFrameWidth/2 - my_diapo_arrowWidth/2 + my_diapo_arrowShift * fFrameWidth) , 0); // _
604
//\_________________ Coin bas gauche.
605
cairo_rel_curve_to (pCairoContext,
608
-my_diapo_radius, -my_diapo_radius );
611
//BasGauche -> HautGauche
612
cairo_rel_line_to (pCairoContext, 0, - fFrameHeight - my_diapo_lineWidth + my_diapo_radius * 2);
613
//\_________________ Coin haut gauche.
614
cairo_rel_curve_to (pCairoContext,
616
0 , -my_diapo_radius ,
617
my_diapo_radius, -my_diapo_radius );
622
static void cairo_dock_draw_frame_vertical_for_diapo (cairo_t *pCairoContext, CairoDock *pDock)
624
const gdouble arrow_dec = 2;
625
gint fFrameWidth = pDock->container.iWidth;
626
gint fFrameHeight = pDock->container.iHeight - my_diapo_arrowHeight + 60; // 60->pour que la fleche aille plus bas...
627
gdouble fDockOffsetX = pDock->iDecorationsWidth;
628
gdouble fDockOffsetY = pDock->iDecorationsHeight;
631
cairo_move_to (pCairoContext, fDockOffsetY, fDockOffsetX);
633
if(pDock->container.bDirectionUp)
635
cairo_rel_line_to (pCairoContext, 0, fFrameWidth);
639
cairo_rel_line_to (pCairoContext,0,(fFrameWidth/2 - my_diapo_arrowWidth/2 - my_diapo_arrowShift * fFrameWidth)); // _
640
cairo_rel_line_to (pCairoContext, -my_diapo_arrowHeight, my_diapo_arrowWidth/2 + my_diapo_arrowShift * fFrameWidth - my_diapo_arrowShift * fFrameWidth / arrow_dec); // \.
641
cairo_rel_line_to (pCairoContext, my_diapo_arrowHeight, + my_diapo_arrowWidth/2 - my_diapo_arrowShift * fFrameWidth + my_diapo_arrowShift * fFrameWidth / arrow_dec); // /
642
cairo_rel_line_to (pCairoContext,0,(fFrameWidth/2 - my_diapo_arrowWidth/2 + my_diapo_arrowShift * fFrameWidth)); // _
644
//\_________________ Coin haut droit.
645
cairo_rel_curve_to (pCairoContext,
648
my_diapo_radius, my_diapo_radius);
649
cairo_rel_line_to (pCairoContext, fFrameHeight + my_diapo_lineWidth - my_diapo_radius * 2, 0);
650
//\_________________ Coin bas droit.
651
cairo_rel_curve_to (pCairoContext,
654
my_diapo_radius, -my_diapo_radius);
656
if(!pDock->container.bDirectionUp)
658
cairo_rel_line_to (pCairoContext, 0, - fFrameWidth);
663
cairo_rel_line_to (pCairoContext, 0, - (fFrameWidth/2 - my_diapo_arrowWidth/2 - my_diapo_arrowShift * fFrameWidth)); // _
664
cairo_rel_line_to (pCairoContext, my_diapo_arrowHeight, - my_diapo_arrowWidth/2 - my_diapo_arrowShift * fFrameWidth + my_diapo_arrowShift * fFrameWidth / arrow_dec); // /
665
cairo_rel_line_to (pCairoContext, -my_diapo_arrowHeight, - my_diapo_arrowWidth/2 + my_diapo_arrowShift * fFrameWidth - my_diapo_arrowShift * fFrameWidth / arrow_dec ); // \.
666
cairo_rel_line_to (pCairoContext, 0, - (fFrameWidth/2 - my_diapo_arrowWidth/2 + my_diapo_arrowShift * fFrameWidth)); // _
669
//\_________________ Coin bas gauche.
670
cairo_rel_curve_to (pCairoContext,
673
-my_diapo_radius, -my_diapo_radius);
674
cairo_rel_line_to (pCairoContext, - fFrameHeight - my_diapo_lineWidth + my_diapo_radius * 2, 0);
675
//\_________________ Coin haut gauche.
676
cairo_rel_curve_to (pCairoContext,
679
-my_diapo_radius, my_diapo_radius);
685
void cairo_dock_draw_frame_for_diapo (cairo_t *pCairoContext, CairoDock *pDock)
687
if (pDock->container.bIsHorizontal)
688
cairo_dock_draw_frame_horizontal_for_diapo (pCairoContext, pDock);
690
cairo_dock_draw_frame_vertical_for_diapo (pCairoContext, pDock);
695
void cairo_dock_render_decorations_in_frame_for_diapo (cairo_t *pCairoContext, CairoDock *pDock)
697
////////////////////////////////////////////////////////////////////////////////////////On se fait un beau pattern dégradé :
699
cairo_pattern_t *mon_super_pattern;
700
mon_super_pattern = cairo_pattern_create_linear (0.0, 0.0,
701
my_diapo_fade2right ? pDock->iMaxDockWidth : 0.0, // Y'aurait surement des calculs complexes à faire mais
702
my_diapo_fade2bottom ? pDock->iMaxDockHeight : 0.0); // a quelques pixels près pour un dégradé : OSEF !
704
cairo_pattern_add_color_stop_rgba (mon_super_pattern, 0,
705
my_diapo_color_frame_start[0],
706
my_diapo_color_frame_start[1],
707
my_diapo_color_frame_start[2],
708
my_diapo_color_frame_start[3] * (1. - 0*pDock->fFoldingFactor)); // de transparent a opaque au depliage
710
cairo_pattern_add_color_stop_rgba (mon_super_pattern,1,
711
my_diapo_color_frame_stop[0],
712
my_diapo_color_frame_stop[1],
713
my_diapo_color_frame_stop[2] ,
714
my_diapo_color_frame_stop[3] * (1. - 0*pDock->fFoldingFactor));
715
cairo_set_source (pCairoContext, mon_super_pattern);
717
////////////////////////////////////////////////////////////////////////////////////////On remplit le contexte en le préservant pour pouvoir tracer le contour apres.
718
cairo_fill_preserve (pCairoContext);
719
cairo_pattern_destroy (mon_super_pattern);