Icon *cd_rendering_calculate_icons_3D_plane (CairoDock *pDock) { Icon *pPointedIcon = cairo_dock_apply_wave_effect (pDock); //\____________________ On calcule les position/etirements/alpha des icones. double fReflectionOffsetY = (pDock->bDirectionUp ? -1 : 1) * myIcons.fReflectSize * pDock->fRatio; Icon* icon; GList* ic; for (ic = pDock->icons; ic != NULL; ic = ic->next) { icon = ic->data; cd_rendering_calculate_construction_parameters_3D_plane (icon, pDock->iCurrentWidth, pDock->iCurrentHeight, pDock->iMaxDockWidth, fReflectionOffsetY); } cairo_dock_check_if_mouse_inside_linear (pDock); cairo_dock_check_can_drop_linear (pDock); return pPointedIcon; }
static Icon *cd_calculate_icons (CairoDock *pDock) { //\_____________ On calcule le nombre de groupes et la place qu'ils occupent. int iNbGroups = 1; double fCurrentGroupWidth = - myIconsParam.iIconGap, fGroupsWidth = 0.; double fSeparatorsPonderation = 0; GList *ic; Icon *pIcon; for (ic = pDock->icons; ic != NULL; ic = ic->next) { pIcon = ic->data; if (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon)) { pIcon->fScale = 1.; if (pIcon->fInsertRemoveFactor != 0) { if (pIcon->fInsertRemoveFactor > 0) pIcon->fScale *= pIcon->fInsertRemoveFactor; else pIcon->fScale *= (1 + pIcon->fInsertRemoveFactor); } if (fCurrentGroupWidth > 0) // le groupe courant est non vide, sinon c'est juste 2 separateurs cote a cote ou un au debut. { iNbGroups ++; fSeparatorsPonderation += pIcon->fScale; fGroupsWidth += MAX (0, fCurrentGroupWidth); fCurrentGroupWidth = - myIconsParam.iIconGap; } continue; } pIcon->fScale = 1.; if (pIcon->fInsertRemoveFactor != 0) { if (pIcon->fInsertRemoveFactor > 0) pIcon->fScale *= pIcon->fInsertRemoveFactor; else pIcon->fScale *= (1 + pIcon->fInsertRemoveFactor); } fCurrentGroupWidth += pIcon->fWidth * pIcon->fScale + myIconsParam.iIconGap; } if (fCurrentGroupWidth > 0) // le groupe courant est non vide, sinon c'est juste un separateur a la fin. { fGroupsWidth += fCurrentGroupWidth; } else iNbGroups --; if (fGroupsWidth < 0) fGroupsWidth = 0; //\_____________ On en deduit l'ecart entre les groupes d'icones. double W = cairo_dock_get_max_authorized_dock_width (pDock); double fScreenBorderGap = myDocksParam.iDockRadius + myDocksParam.iDockLineWidth; // on laisse un ecart avec le bord de l'ecran. double fGroupGap; if (iNbGroups > 1) { fGroupGap = (W - 2*fScreenBorderGap - fGroupsWidth) / (iNbGroups - 1); if (fSeparatorsPonderation != 0 && iNbGroups > 2) fGroupGap /= fSeparatorsPonderation / (iNbGroups - 1); } else fGroupGap = W - fScreenBorderGap - fGroupsWidth; //\_____________ On determine la position de chaque icone. Icon *pPointedIcon = NULL; double xm = pDock->container.iMouseX; double xg = fScreenBorderGap; // abscisse de l'icone courante, et abscisse du debut du groupe courant. if (iNbGroups <= 1) // if only 1 group, there is no separator that will expand icons => we use the alignment to place them. xg = pDock->fAlign * (W - fGroupsWidth) + 2 * fScreenBorderGap * (.5 - pDock->fAlign); double x = xg; fCurrentGroupWidth = - myIconsParam.iIconGap; for (ic = pDock->icons; ic != NULL; ic = ic->next) { pIcon = ic->data; if (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon)) { pIcon->fX = x; pIcon->fDrawX = pIcon->fX; if (pDock->container.bDirectionUp) pIcon->fY = pDock->iMaxDockHeight - pDock->iMinDockHeight; else pIcon->fY = pDock->iMinDockHeight; pIcon->fDrawY = pIcon->fY; pIcon->fWidthFactor = 0; if (fCurrentGroupWidth > 0) // le groupe courant est non vide, sinon c'est juste 2 separateurs cote a cote. { xg += fCurrentGroupWidth + fGroupGap * pIcon->fScale; if (pPointedIcon == NULL && xm > x && xm < xg) { pIcon->bPointed = TRUE; pPointedIcon = pIcon; } else pIcon->bPointed = FALSE; x = xg; fCurrentGroupWidth = - myIconsParam.iIconGap; } continue; } fCurrentGroupWidth += pIcon->fWidth * pIcon->fScale + myIconsParam.iIconGap; pIcon->fX = x; if (pPointedIcon == NULL && xm > pIcon->fX - .5*myIconsParam.iIconGap && xm <= pIcon->fX + pIcon->fWidth * pIcon->fScale + .5*myIconsParam.iIconGap) { pIcon->bPointed = TRUE; pPointedIcon = pIcon; } else pIcon->bPointed = FALSE; pIcon->fDrawX = pIcon->fX; if (pDock->container.bDirectionUp) pIcon->fY = pDock->iMaxDockHeight - (myDocksParam.iDockLineWidth + myDocksParam.iFrameMargin + pIcon->fHeight); else pIcon->fY = myDocksParam.iDockLineWidth + myDocksParam.iFrameMargin; pIcon->fDrawY = pIcon->fY; pIcon->fWidthFactor = 1.; pIcon->fHeightFactor = 1.; pIcon->fOrientation = 0.; pIcon->fAlpha = 1.; x += pIcon->fWidth * pIcon->fScale + myIconsParam.iIconGap; } cairo_dock_check_if_mouse_inside_linear (pDock); cairo_dock_check_can_drop_linear (pDock); return pPointedIcon; }