48
48
extern gboolean my_diapo_simple_draw_background;
49
49
extern gboolean my_diapo_simple_display_all_labels;
51
extern gdouble my_diapo_simple_color_scrollbar_line[4];
52
extern gdouble my_diapo_simple_color_scrollbar_inside[4];
53
extern gdouble my_diapo_simple_color_grip[4];
51
extern gdouble my_diapo_simple_color_scrollbar_line[4];
52
extern gdouble my_diapo_simple_color_scrollbar_inside[4];
53
extern gdouble my_diapo_simple_color_grip[4];
55
55
const gint X_BORDER_SPACE = 40; // espace laisse de chaque cote pour eviter de sortir trop facilement (et pour laisser de la place pour les etiquettes).
56
56
const gint ARROW_TIP = 5; // pour gerer la pointe de la fleche.
168
175
if (pButton->type == GDK_BUTTON_PRESS && pButton->button == 1)
170
177
double x_arrow = pDock->iMaxDockWidth - X_BORDER_SPACE - fScrollbarWidth;
171
if (pButton->x > x_arrow) // on a clique dans la zone de scroll.
173
//g_print ("click (y=%d, scroll=%d)\n", (int) pButton->y, pData->iScrollOffset);
179
if (pDock->container.bIsHorizontal)
189
if (x > x_arrow) // on a clique dans la zone de scroll.
191
//g_print ("click (y=%d, scroll=%d)\n", (int) y, pData->iScrollOffset);
175
193
// on regarde sur quoi on clic.
176
194
double y_arrow_top, y_arrow_bottom;
184
202
y_arrow_bottom = pDock->iMaxDockHeight - my_diapo_simple_lineWidth;
185
203
y_arrow_top = my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth;
187
if (pButton->y > y_arrow_top - fScrollbarArrowGap/2 && pButton->y < y_arrow_top + fArrowHeight + fScrollbarArrowGap/2) // bouton haut
205
if (y > y_arrow_top - fScrollbarArrowGap/2 && y < y_arrow_top + fArrowHeight + fScrollbarArrowGap/2) // bouton haut
189
207
_set_scroll (pDock, 0);
191
else if (pButton->y < y_arrow_bottom + fScrollbarArrowGap/2 && pButton->y > y_arrow_bottom - fArrowHeight - fScrollbarArrowGap/2) // bouton bas
209
else if (y < y_arrow_bottom + fScrollbarArrowGap/2 && y > y_arrow_bottom - fArrowHeight - fScrollbarArrowGap/2) // bouton bas
193
211
_set_scroll (pDock, pData->iDeltaHeight);
195
213
else // scrollbar
197
215
pData->bDraggingScrollbar = TRUE;
198
pData->iClickY = pButton->y;
199
217
pData->iClickOffset = pData->iScrollOffset;
257
277
guint nIcones = 0; // nb icones.
258
278
int iDeltaHeight = 0; // hauteur ne pouvant rentrer dans le dock.
259
279
int iMaxIconWidth = 0;
280
int iDockWidth, iDockHeight; // dimension dock.
281
int Ws = g_desktopGeometry.iXScreenWidth[CAIRO_DOCK_HORIZONTAL]; // dimensions ecran.
282
int Hs = g_desktopGeometry.iXScreenHeight[CAIRO_DOCK_HORIZONTAL];
260
283
nIcones = _cd_rendering_diapo_simple_guess_grid(pDock->icons, &nRowsX, &nRowsY);
262
285
// On calcule la taille de l'affichage avec contrainte taille ecran.
265
288
// on calcule la largeur avec contrainte, ce qui donne aussi le nombre de lignes.
266
289
iMaxIconWidth = ((Icon*)pDock->icons->data)->fWidth; // approximation un peu bof.
267
pDock->iMaxDockWidth = nRowsX * (iMaxIconWidth + my_diapo_simple_iconGapX) + 2*X_BORDER_SPACE;
268
int iMaxWidth = sr * g_desktopGeometry.iXScreenWidth[pDock->container.bIsHorizontal];
269
if (pDock->iMaxDockWidth > iMaxWidth)
290
iDockWidth = nRowsX * (iMaxIconWidth + my_diapo_simple_iconGapX) + 2*X_BORDER_SPACE;
291
int iMaxWidth = sr * Ws;
292
if (iDockWidth > iMaxWidth)
271
294
nRowsX = (iMaxWidth - 2*X_BORDER_SPACE) / (iMaxIconWidth + my_diapo_simple_iconGapX);
272
295
nRowsY = ceil((double) nIcones / nRowsX);
273
pDock->iMaxDockWidth = nRowsX * (iMaxIconWidth + my_diapo_simple_iconGapX) + 2*X_BORDER_SPACE;
274
//g_print ("%d -> %d\n", iMaxWidth, pDock->iMaxDockWidth);
296
iDockWidth = nRowsX * (iMaxIconWidth + my_diapo_simple_iconGapX) + 2*X_BORDER_SPACE;
297
//g_print ("%d -> %d\n", iMaxWidth, iDockWidth);
277
300
// on calcule la hauteur avec contrainte, ce qui donne aussi la marge de defilement.
278
pDock->iMaxDockHeight = (nRowsY - 1) * (pDock->iMaxIconHeight * pDock->container.fRatio + my_diapo_simple_iconGapY) + // les icones
301
iDockHeight = (nRowsY - 1) * (pDock->iMaxIconHeight * pDock->container.fRatio + my_diapo_simple_iconGapY) + // les icones
279
302
pDock->iMaxIconHeight * pDock->container.fRatio * my_diapo_simple_fScaleMax + // les icones des bords zooment
280
303
myLabels.iLabelSize + // le texte des icones de la 1ere ligne
281
304
my_diapo_simple_lineWidth + // les demi-lignes du haut et du bas
282
305
my_diapo_simple_arrowHeight + ARROW_TIP; // la fleche etendue
283
int iMaxHeight = MIN (pDock->iMaxDockWidth, sr * g_desktopGeometry.iXScreenHeight[pDock->container.bIsHorizontal]);
284
if (pDock->iMaxDockHeight > iMaxHeight)
306
int iMaxHeight = sr * Hs;
307
if (iDockHeight > iMaxHeight)
286
309
nRowsY = (iMaxHeight - (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth + myLabels.iLabelSize + pDock->iMaxIconHeight * pDock->container.fRatio * my_diapo_simple_fScaleMax)) / (pDock->iMaxIconHeight * pDock->container.fRatio + my_diapo_simple_iconGapY);
287
int iMaxDockHeight0 = pDock->iMaxDockHeight;
288
pDock->iMaxDockHeight = (nRowsY - 1) * (pDock->iMaxIconHeight * pDock->container.fRatio + my_diapo_simple_iconGapY) +
310
int iMaxDockHeight0 = iDockHeight;
311
iDockHeight = (nRowsY - 1) * (pDock->iMaxIconHeight * pDock->container.fRatio + my_diapo_simple_iconGapY) +
289
312
pDock->iMaxIconHeight * pDock->container.fRatio * my_diapo_simple_fScaleMax +
290
313
myLabels.iLabelSize +
291
314
my_diapo_simple_lineWidth +
292
315
my_diapo_simple_arrowHeight + ARROW_TIP;
293
iDeltaHeight = iMaxDockHeight0 - pDock->iMaxDockHeight;
294
//g_print ("%d -> %d\n", iMaxHeight, pDock->iMaxDockHeight);
316
iDeltaHeight = iMaxDockHeight0 - iDockHeight;
317
//g_print ("%d -> %d\n", iMaxHeight, iDockHeight);
297
pDock->iMinDockWidth = pDock->iMaxDockWidth - 2*X_BORDER_SPACE;
298
pDock->iMinDockHeight = pDock->iMaxDockHeight;
302
pDock->iMaxDockWidth = pDock->iMinDockWidth = X_BORDER_SPACE * 2 + 1;
303
pDock->iMaxDockHeight = pDock->iMinDockHeight = my_diapo_simple_lineWidth + my_diapo_simple_arrowHeight + ARROW_TIP + 1;
322
iDockWidth = X_BORDER_SPACE * 2 + 1;
323
iDockHeight = my_diapo_simple_lineWidth + my_diapo_simple_arrowHeight + ARROW_TIP + 1;
306
// pas de decorations.
307
pDock->iDecorationsHeight = 0;
308
pDock->iDecorationsWidth = 0;
310
// On affecte ca aussi au cas ou.
311
pDock->fFlatDockWidth = pDock->iMaxDockWidth;
312
pDock->fMagnitudeMax = my_diapo_simple_fScaleMax / (1+g_fAmplitude);
314
326
CDSlideData *pData = pDock->pRendererData;
315
327
if (pData == NULL)
336
348
int iScrollMargin = iMaxIconWidth * (my_diapo_simple_fScaleMax - 1) / 2
337
349
+ fScrollbarIconGap
338
+ fScrollbarWidth; // donc a droite on a : derniere icone en taille max + demi-gapx + + gab + scrollbar + X_BORDER_SPACE
339
pDock->iMaxDockWidth += iScrollMargin;
350
+ fScrollbarWidth; // donc a droite on a : derniere icone en taille max + demi-gapx + gap + scrollbar + X_BORDER_SPACE
351
iDockWidth += iScrollMargin;
355
//if (pDock->container.bIsHorizontal)
357
pDock->iMaxDockWidth = iDockWidth;
358
pDock->iMaxDockHeight = iDockHeight;
360
/*else // pareil, sauf la fleche qui sera sur les cotes.
362
pDock->iMaxDockWidth = iDockHeight - (my_diapo_simple_arrowHeight + ARROW_TIP);
363
pDock->iMaxDockHeight = iDockWidth + my_diapo_simple_arrowHeight + ARROW_TIP;
365
pDock->iMinDockWidth = pDock->iMaxDockWidth - 2*X_BORDER_SPACE;
366
pDock->iMinDockHeight = pDock->iMaxDockHeight;
367
// pas de decorations.
368
pDock->iDecorationsHeight = 0;
369
pDock->iDecorationsWidth = 0;
370
// On affecte ca aussi au cas ou.
371
pDock->fFlatDockWidth = pDock->iMaxDockWidth;
372
pDock->fMagnitudeMax = my_diapo_simple_fScaleMax / (1+g_fAmplitude);
347
379
static void cairo_dock_draw_frame_horizontal_for_diapo_simple (cairo_t *pCairoContext, CairoDock *pDock)
349
381
const gdouble arrow_dec = 2;
350
gdouble fFrameWidth = pDock->iMaxDockWidth - 2 * X_BORDER_SPACE - 0 * my_diapo_simple_radius;
382
gdouble fFrameWidth = pDock->iMaxDockWidth - 2 * X_BORDER_SPACE;
351
383
gdouble fFrameHeight = pDock->iMaxDockHeight - (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth);
352
gdouble fDockOffsetX = X_BORDER_SPACE + 0*my_diapo_simple_radius;
384
gdouble fDockOffsetX = X_BORDER_SPACE;
353
385
gdouble fDockOffsetY = (pDock->container.bDirectionUp ? .5*my_diapo_simple_lineWidth : my_diapo_simple_arrowHeight + ARROW_TIP);
355
387
cairo_move_to (pCairoContext, fDockOffsetX, fDockOffsetY);
412
444
static void cairo_dock_draw_frame_vertical_for_diapo_simple (cairo_t *pCairoContext, CairoDock *pDock)
414
446
const gdouble arrow_dec = 2;
415
gdouble fFrameWidth = pDock->iMaxDockWidth - 2 * X_BORDER_SPACE - 2 * my_diapo_simple_radius;
447
gdouble fFrameWidth = pDock->iMaxDockWidth - 2 * X_BORDER_SPACE;
416
448
gdouble fFrameHeight = pDock->iMaxDockHeight - (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth);
417
gdouble fDockOffsetX = X_BORDER_SPACE + my_diapo_simple_radius;
449
gdouble fDockOffsetX = X_BORDER_SPACE;
418
450
gdouble fDockOffsetY = (pDock->container.bDirectionUp ? .5*my_diapo_simple_lineWidth : my_diapo_simple_arrowHeight + ARROW_TIP);
420
452
cairo_move_to (pCairoContext, fDockOffsetY, fDockOffsetX);
544
576
cairo_save (pCairoContext);
545
577
cairo_set_line_width (pCairoContext, 2.);
579
if (! pDock->container.bIsHorizontal)
581
cairo_translate (pCairoContext, pDock->container.iHeight/2, pDock->container.iWidth/2);
582
cairo_rotate (pCairoContext, G_PI/2);
583
cairo_scale (pCairoContext, 1., -1.);
584
cairo_translate (pCairoContext, -pDock->container.iWidth/2, -pDock->container.iHeight/2);
547
587
double x_arrow = pDock->iMaxDockWidth - X_BORDER_SPACE - fScrollbarWidth/2; // pointe de la fleche.
548
588
double y_arrow_top, y_arrow_bottom;
549
589
if (pDock->container.bDirectionUp)
625
665
(pDock->container.bDirectionUp ? my_diapo_simple_lineWidth : h), // top left corner.
626
666
pDock->container.iWidth,
627
pDock->container.iHeight - h);
628
cairo_clip (pCairoContext);
629
} // sinon clip inutile.
667
pDock->container.iHeight - h - my_diapo_simple_lineWidth);
671
cairo_rectangle (pCairoContext,
672
(pDock->container.bDirectionUp ? my_diapo_simple_lineWidth : h), // top left corner.
674
pDock->container.iHeight - h - my_diapo_simple_lineWidth,
675
pDock->container.iWidth);
677
cairo_clip (pCairoContext);
632
680
// on dessine les icones, l'icone pointee en dernier.
754
799
fScrollOffset = (pDock->container.bDirectionUp ? - pData->iScrollOffset : pData->iScrollOffset);
756
801
// On calcule la position de base pour toutes les icones
757
int iOffsetY = .5 * pDock->iMaxIconHeight * pDock->container.fRatio * (my_diapo_simple_fScaleMax - 1) + // les icones de la 1ere ligne zooment
758
myLabels.iLabelSize + // le texte des icones de la 1ere ligne
759
.5 * my_diapo_simple_lineWidth + // demi-ligne du haut;
803
if (pDock->container.bDirectionUp)
804
iOffsetY = .5 * pDock->iMaxIconHeight * pDock->container.fRatio * (my_diapo_simple_fScaleMax - 1) + // les icones de la 1ere ligne zooment
805
myLabels.iLabelSize + // le texte des icones de la 1ere ligne
806
.5 * my_diapo_simple_lineWidth + // demi-ligne du haut;
809
iOffsetY = .5 * pDock->iMaxIconHeight * pDock->container.fRatio * (my_diapo_simple_fScaleMax - 1) + // les icones de la 1ere ligne zooment
810
.5 * my_diapo_simple_lineWidth + // demi-ligne du bas;
762
812
double fFoldingX = (pDock->fFoldingFactor > .2 ? (pDock->fFoldingFactor - .2) / .8 : 0.); // placement de 1 a 0.2
763
813
double fFoldingY = (pDock->fFoldingFactor > .5 ? (pDock->fFoldingFactor - .5) / .5 : 0.); // placement de 1 a 0.5
776
826
if (pDock->container.bDirectionUp)
777
827
icon->fY = iOffsetY + (icon->fHeight + my_diapo_simple_iconGapY) * y;
779
icon->fY = pDock->container.iHeight - iOffsetY - icon->fHeight - (nRowsY - 1 - y) * (icon->fHeight + my_diapo_simple_iconGapY) + (my_diapo_simple_arrowHeight + ARROW_TIP); // la ligne du haut quand le dock est en bas, reste en haut quand le dock est en haut.
830
icon->fY = pDock->container.iHeight - iOffsetY - icon->fHeight - (nRowsY - 1 - y) * (icon->fHeight + my_diapo_simple_iconGapY);
781
833
// on en deduit le zoom par rapport a la position de la souris.
782
834
gdouble distanceE = sqrt ((icon->fX + icon->fWidth/2 - Mx) * (icon->fX + icon->fWidth/2 - Mx) + (icon->fY + icon->fHeight/2 - My) * (icon->fY + icon->fHeight/2 - My));
851
902
if (pDock->icons == NULL)
854
// On calcule la configuration de la grille
858
///nIcones = _cd_rendering_diapo_simple_guess_grid (pDock->icons, &nRowsX, &nRowsY);
860
904
CDSlideData *pData = pDock->pRendererData;
861
905
g_return_val_if_fail (pData != NULL, NULL);
862
nRowsX = pData->nRowsX;
863
nRowsY = pData->nRowsY;
864
/*int iMaxIconWidth = ((Icon*)pDock->icons->data)->fWidth; // approximation un peu bof.
865
nRowsX = (pDock->iMaxDockWidth - 2*X_BORDER_SPACE) / (iMaxIconWidth + my_diapo_simple_iconGapX);
866
nRowsY = (pDock->iMaxDockHeight - (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth + myLabels.iLabelSize + pDock->iMaxIconHeight * pDock->container.fRatio * my_diapo_simple_fScaleMax)) / (pDock->iMaxIconHeight * pDock->container.fRatio + my_diapo_simple_iconGapY);*/
907
// On recupere la configuration de la grille
908
gint nRowsX = pData->nRowsX;
909
gint nRowsY = pData->nRowsY;
868
911
// On calcule les parametres des icones
869
912
Icon *pPointedIcon = _cd_rendering_calculate_icons_for_diapo_simple (pDock, nRowsX, nRowsY, pDock->container.iMouseX, pDock->container.iMouseY);
1033
1076
double fFrameWidth = pDock->iMaxDockWidth - 2*X_BORDER_SPACE; // longueur du trait horizontal.
1034
1077
double fFrameHeight = pDock->iMaxDockHeight - (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth); // hauteur du cadre avec les rayons et sans la pointe.
1035
1078
double fDockOffsetX, fDockOffsetY;
1037
1079
fDockOffsetX = X_BORDER_SPACE;
1038
1080
fDockOffsetY = my_diapo_simple_arrowHeight+ARROW_TIP;
1039
///fFrameWidth = pDock->iMaxDockWidth - 2*X_BORDER_SPACE; // longueur du trait horizontal.
1040
///fFrameHeight = pDock->iMaxDockHeight- (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth); // hauteur du cadre avec les rayons et sans la pointe.
1042
1082
//\_____________ On genere les coordonnees du contour.
1043
1083
CairoDockGLPath *pFramePath = cd_generate_frame_path_without_arrow (fFrameWidth, fFrameHeight, fRadius);
1082
1122
CDSlideData *pData = pDock->pRendererData;
1083
1123
if (pData != NULL && pData->iDeltaHeight != 0)
1086
1125
if (pScrollPath == NULL)
1087
1126
pScrollPath = cairo_dock_new_gl_path (4, 0., 0., 0, 0); // des triangles ou des rectangles => 4 points max.
1088
1127
glLineWidth (2.);
1129
if (!pDock->container.bIsHorizontal)
1131
glTranslatef (pDock->container.iHeight/2, pDock->container.iWidth/2, 0.);
1132
glRotatef (-90., 0., 0., 1.);
1133
glScalef (1., -1., 1.); // comme si bDirectionUp
1134
glTranslatef (-pDock->container.iWidth/2, -pDock->container.iHeight/2, 0.);
1090
1136
double x_arrow = pDock->iMaxDockWidth - X_BORDER_SPACE - fScrollbarWidth/2; // pointe de la fleche.
1091
1137
double y_arrow_top, y_arrow_bottom;
1092
1138
if (pDock->container.bDirectionUp)
1166
1211
if (pData != NULL && pData->iDeltaHeight != 0) // on fait un clip pour les icones qui debordent.
1168
1213
int h = my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth;
1214
glEnable (GL_SCISSOR_TEST);
1169
1215
if (pDock->container.bIsHorizontal)
1171
glEnable (GL_SCISSOR_TEST);
1173
(pDock->container.bDirectionUp ? h : 0), // lower left corner of the scissor box.
1218
(pDock->container.bDirectionUp ? h : my_diapo_simple_lineWidth), // lower left corner of the scissor box.
1174
1219
pDock->container.iWidth,
1175
pDock->container.iHeight - h);
1176
} // sinon clip inutile.
1220
pDock->container.iHeight - h - my_diapo_simple_lineWidth);
1224
glScissor ((!pDock->container.bDirectionUp ? h : my_diapo_simple_lineWidth), // lower left corner of the scissor box.
1225
my_diapo_simple_lineWidth,
1226
pDock->container.iHeight - h - my_diapo_simple_lineWidth,
1227
pDock->container.iWidth);
1283
1338
void cd_rendering_register_diapo_simple_renderer (const gchar *cRendererName)
1285
//////////////////////////////////////////////////////////////////////////////////////// On definit le renderer :
1286
CairoDockRenderer *pRenderer = g_new0 (CairoDockRenderer, 1); //Nouvelle structure
1287
pRenderer->cReadmeFilePath = g_strdup_printf ("%s/readme-diapo-simple-view", MY_APPLET_SHARE_DATA_DIR); //On affecte le readme
1288
pRenderer->cPreviewFilePath = g_strdup_printf ("%s/preview-diapo-simple.jpg", MY_APPLET_SHARE_DATA_DIR); // la preview
1289
pRenderer->compute_size = cd_rendering_calculate_max_dock_size_diapo_simple; //La fonction qui défini les bornes
1290
pRenderer->calculate_icons = cd_rendering_calculate_icons_diapo_simple; //qui calcule les param des icones
1291
pRenderer->render = cd_rendering_render_diapo_simple; //qui initie le calcul du rendu
1292
pRenderer->render_optimized = NULL;//cd_rendering_render_diapo_simple_optimized; //pareil en mieux
1293
pRenderer->set_subdock_position = cairo_dock_set_subdock_position_linear; // ?
1294
pRenderer->render_opengl = cd_rendering_render_diapo_simple_opengl;
1296
pRenderer->free_data = cd_rendering_free_slide_data;
1299
pRenderer->bUseReflect = FALSE; // On dit non au reflections
1300
pRenderer->cDisplayedName = D_ (cRendererName);
1302
cairo_dock_register_renderer (cRendererName, pRenderer); //Puis on signale l'existence de notre rendu
1340
CairoDockRenderer *pRenderer = g_new0 (CairoDockRenderer, 1);
1342
pRenderer->compute_size = cd_rendering_calculate_max_dock_size_diapo_simple;
1343
pRenderer->calculate_icons = cd_rendering_calculate_icons_diapo_simple;
1344
pRenderer->render = cd_rendering_render_diapo_simple;
1345
pRenderer->render_optimized = NULL;
1346
pRenderer->render_opengl = cd_rendering_render_diapo_simple_opengl;
1347
pRenderer->free_data = cd_rendering_free_slide_data;
1348
pRenderer->set_subdock_position = cairo_dock_set_subdock_position_linear;
1350
pRenderer->cReadmeFilePath = g_strdup (MY_APPLET_SHARE_DATA_DIR"/readme-diapo-simple-view");
1351
pRenderer->cPreviewFilePath = g_strdup (MY_APPLET_SHARE_DATA_DIR"/preview-diapo-simple.jpg");
1352
pRenderer->bUseReflect = FALSE; // pas de reflections
1353
pRenderer->cDisplayedName = D_(cRendererName);
1355
cairo_dock_register_renderer (cRendererName, pRenderer);