~cairo-dock-team/ubuntu/quantal/cairo-dock-plug-ins/3.0.2

« back to all changes in this revision

Viewing changes to desklet-rendering/src/rendering-desklet-tree.c

Tags: upstream-2.2.0~0beta4
ImportĀ upstreamĀ versionĀ 2.2.0~0beta4

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
static int s_iLeafPosition[2][3*3] = {{-30,30,1 , 60,107,0 , -45,115,1},{-60,65,0 , 55,115,1 , -30,115,0}};
29
29
 
30
30
 
31
 
CDTreeParameters *rendering_configure_tree (CairoDesklet *pDesklet, cairo_t *pSourceContext, gpointer *pConfig)
 
31
static CDTreeParameters *configure (CairoDesklet *pDesklet, CairoDeskletRendererConfigPtr pConfig)
 
32
{
 
33
        CDTreeParameters *pTree = g_new0 (CDTreeParameters, 1);
 
34
        return pTree;
 
35
}
 
36
 
 
37
 
 
38
static void load_data (CairoDesklet *pDesklet)
 
39
{
 
40
        CDTreeParameters *pTree = (CDTreeParameters *) pDesklet->pRendererData;
 
41
        if (pTree == NULL)
 
42
                return ;
 
43
        
 
44
        double fImageWidth = TREE_WIDTH * pTree->fTreeWidthFactor, fImageHeight = TREE_HEIGHT * pTree->fTreeHeightFactor;
 
45
        gchar *cImageFilePath = g_strconcat (MY_APPLET_SHARE_DATA_DIR, "/branche1.svg", NULL);
 
46
        
 
47
        pTree->pBrancheSurface[0] = cairo_dock_create_surface_from_image_simple (cImageFilePath,
 
48
                fImageWidth,
 
49
                fImageHeight);
 
50
        
 
51
        cImageFilePath[strlen(cImageFilePath)-5] = '2';
 
52
        pTree->pBrancheSurface[0] = cairo_dock_create_surface_from_image_simple (cImageFilePath,
 
53
                fImageWidth,
 
54
                fImageHeight);
 
55
        g_free (cImageFilePath);
 
56
}
 
57
 
 
58
 
 
59
static void free_data (CairoDesklet *pDesklet)
32
60
{
33
61
        cd_message ("");
 
62
        CDTreeParameters *pTree = (CDTreeParameters *) pDesklet->pRendererData;
 
63
        if (pTree == NULL)
 
64
                return ;
 
65
        
 
66
        cairo_surface_destroy (pTree->pBrancheSurface[0]);
 
67
        cairo_surface_destroy (pTree->pBrancheSurface[1]);
 
68
        
 
69
        g_free (pTree);
 
70
        pDesklet->pRendererData = NULL;
 
71
}
 
72
 
 
73
 
 
74
static void set_icon_size (CairoDesklet *pDesklet, Icon *pIcon)
 
75
{
 
76
        CDTreeParameters *pTree = (CDTreeParameters *) pDesklet->pRendererData;
 
77
        if (pTree == NULL)
 
78
                return ;
 
79
        
 
80
        if (pIcon == pDesklet->pIcon)
 
81
        {
 
82
                pIcon->fWidth = 0.;
 
83
                pIcon->fHeight = 0.;
 
84
        }
 
85
        else
 
86
        {
 
87
                pIcon->fWidth = 48 * MIN (pTree->fTreeWidthFactor, pTree->fTreeHeightFactor);
 
88
                pIcon->fHeight = 48 * MIN (pTree->fTreeWidthFactor, pTree->fTreeHeightFactor);
 
89
        }
 
90
}
 
91
 
 
92
 
 
93
static void calculate_icons (CairoDesklet *pDesklet)
 
94
{
 
95
        g_return_if_fail (pDesklet != NULL);
 
96
        CDTreeParameters *pTree = (CDTreeParameters *) pDesklet->pRendererData;
 
97
        if (pTree == NULL)
 
98
                return ;
 
99
        
 
100
        Icon *pIcon = pDesklet->pIcon;
 
101
        if (pIcon != NULL)  // on ne veut pas charger cette icone.
 
102
        {
 
103
                pIcon->fWidth = -1;
 
104
                pIcon->fHeight = -1;
 
105
        }
 
106
        
 
107
        // on compte le nombre d'icones.
34
108
        GList *pIconsList = pDesklet->icons;
35
109
        if (pIconsList == NULL)
36
 
                return NULL;
 
110
                return ;
37
111
        
38
112
        int iNbIcons = 0;
39
 
        Icon *pIcon;
40
113
        GList *ic;
41
114
        for (ic = pIconsList; ic != NULL; ic = ic->next)
42
115
        {
43
116
                pIcon = ic->data;
44
 
                if (! CAIRO_DOCK_IS_SEPARATOR (pIcon))
 
117
                if (! CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon))
45
118
                        iNbIcons ++;
46
119
        }
47
 
        if (iNbIcons == 0)
48
 
                return NULL;
49
120
        
50
 
        CDTreeParameters *pTree = g_new0 (CDTreeParameters, 1);
 
121
        // on en deduit les parametres de l'arbre.
51
122
        pTree->iNbIconsInTree = iNbIcons;
52
123
        pTree->iNbBranches = (int) ceil (1.*iNbIcons/3.);
53
124
        
57
128
        
58
129
        cd_message (" -> %d icones, %d branches, proportions : %.2fx%.2f", pTree->iNbIconsInTree, pTree->iNbBranches, pTree->fTreeWidthFactor, pTree->fTreeHeightFactor);
59
130
        
60
 
        return pTree;
61
 
}
62
 
 
63
 
 
64
 
void rendering_load_tree_data (CairoDesklet *pDesklet, cairo_t *pSourceContext)
65
 
{
66
 
        CDTreeParameters *pTree = (CDTreeParameters *) pDesklet->pRendererData;
67
 
        if (pTree == NULL)
68
 
                return ;
69
 
        
70
 
        double fImageWidth = TREE_WIDTH * pTree->fTreeWidthFactor, fImageHeight = TREE_HEIGHT * pTree->fTreeHeightFactor;
71
 
        gchar *cImageFilePath = g_strconcat (MY_APPLET_SHARE_DATA_DIR, "/branche1.svg", NULL);
72
 
        
73
 
        pTree->pBrancheSurface[0] = cairo_dock_create_surface_from_image_simple (cImageFilePath,
74
 
                pSourceContext,
75
 
                fImageWidth,
76
 
                fImageHeight);
77
 
        
78
 
        cImageFilePath[strlen(cImageFilePath)-5] = '2';
79
 
        pTree->pBrancheSurface[0] = cairo_dock_create_surface_from_image_simple (cImageFilePath,
80
 
                pSourceContext,
81
 
                fImageWidth,
82
 
                fImageHeight);
83
 
        /**pTree->pBrancheSurface[0] = cairo_dock_load_image (pSourceContext,
84
 
                cImageFilePath,
85
 
                &fImageWidth,
86
 
                &fImageHeight,
87
 
                0.,
88
 
                1.,
89
 
                FALSE);
90
 
        cImageFilePath[strlen(cImageFilePath)-5] = '2';
91
 
        pTree->pBrancheSurface[1] = cairo_dock_load_image (pSourceContext,
92
 
                cImageFilePath,
93
 
                &fImageWidth,
94
 
                &fImageHeight,
95
 
                0.,
96
 
                1.,
97
 
                FALSE);*/
98
 
        g_free (cImageFilePath);
99
 
}
100
 
 
101
 
 
102
 
void rendering_free_tree_data (CairoDesklet *pDesklet)
103
 
{
104
 
        cd_message ("");
105
 
        CDTreeParameters *pTree = (CDTreeParameters *) pDesklet->pRendererData;
106
 
        if (pTree == NULL)
107
 
                return ;
108
 
        
109
 
        cairo_surface_destroy (pTree->pBrancheSurface[0]);
110
 
        cairo_surface_destroy (pTree->pBrancheSurface[1]);
111
 
        
112
 
        g_free (pTree);
113
 
        pDesklet->pRendererData = NULL;
114
 
}
115
 
 
116
 
 
117
 
void rendering_load_icons_for_tree (CairoDesklet *pDesklet, cairo_t *pSourceContext)
118
 
{
119
 
        g_return_if_fail (pDesklet != NULL && pSourceContext != NULL);
120
 
        CDTreeParameters *pTree = (CDTreeParameters *) pDesklet->pRendererData;
121
 
        if (pTree == NULL)
122
 
                return ;
123
 
        
124
 
        GList* ic;
125
 
        Icon *icon;
126
 
        for (ic = pDesklet->icons; ic != NULL; ic = ic->next)
 
131
        // on calcule les tailles de chaque icone.
 
132
        for (ic = pIconsList; ic != NULL; ic = ic->next)
127
133
        {
128
 
                icon = ic->data;
129
 
                icon->fWidth = 48 * MIN (pTree->fTreeWidthFactor, pTree->fTreeHeightFactor);
130
 
                icon->fHeight = 48 * MIN (pTree->fTreeWidthFactor, pTree->fTreeHeightFactor);
131
 
                
132
 
                cairo_dock_fill_icon_buffers_for_desklet (icon, pSourceContext);
 
134
                pIcon = ic->data;
 
135
                if (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon))
 
136
                {
 
137
                        pIcon->fWidth = 0;
 
138
                        pIcon->fHeight = 0;
 
139
                }
 
140
                else
 
141
                {
 
142
                        pIcon->fWidth = 48 * MIN (pTree->fTreeWidthFactor, pTree->fTreeHeightFactor);
 
143
                        pIcon->fHeight = 48 * MIN (pTree->fTreeWidthFactor, pTree->fTreeHeightFactor);
 
144
                }
133
145
        }
134
146
}
135
147
 
136
148
 
137
 
 
138
 
void rendering_draw_tree_in_desklet (cairo_t *pCairoContext, CairoDesklet *pDesklet)
 
149
static void render (cairo_t *pCairoContext, CairoDesklet *pDesklet)
139
150
{
140
151
        CDTreeParameters *pTree = (CDTreeParameters *) pDesklet->pRendererData;
141
152
        cd_message ("");
163
174
        for (ic = pDesklet->icons; ic != NULL; ic = ic->next)
164
175
        {
165
176
                pIcon = ic->data;
166
 
                if (! CAIRO_DOCK_IS_SEPARATOR (pIcon))
 
177
                if (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon))
 
178
                        continue;
 
179
                
 
180
                x = s_iLeafPosition[iBrancheType][3*iLeafNumber];
 
181
                y = s_iLeafPosition[iBrancheType][3*iLeafNumber+1];
 
182
                sens = s_iLeafPosition[iBrancheType][3*iLeafNumber+2];
 
183
                
 
184
                pIcon->fDrawX = w / 2 + x * pTree->fTreeWidthFactor - pIcon->fWidth / 2;
 
185
                pIcon->fDrawY = h - (iBrancheNumber * TREE_HEIGHT + y) * pTree->fTreeHeightFactor - sens * pIcon->fHeight;
 
186
                pIcon->fScale = 1;
 
187
                pIcon->fAlpha = 1;
 
188
                pIcon->fWidthFactor = 1;
 
189
                pIcon->fHeightFactor = 1;
 
190
                
 
191
                cairo_save (pCairoContext);
 
192
                cairo_dock_render_one_icon_in_desklet (pIcon, pCairoContext, FALSE, TRUE, pDesklet->container.iWidth);
 
193
                cairo_restore (pCairoContext);
 
194
                
 
195
                iLeafNumber ++;
 
196
                if (iLeafNumber == 3)
167
197
                {
168
 
                        x = s_iLeafPosition[iBrancheType][3*iLeafNumber];
169
 
                        y = s_iLeafPosition[iBrancheType][3*iLeafNumber+1];
170
 
                        sens = s_iLeafPosition[iBrancheType][3*iLeafNumber+2];
171
 
                        
172
 
                        pIcon->fDrawX = w / 2 + x * pTree->fTreeWidthFactor - pIcon->fWidth / 2;
173
 
                        pIcon->fDrawY = h - (iBrancheNumber * TREE_HEIGHT + y) * pTree->fTreeHeightFactor - sens * pIcon->fHeight;
174
 
                        pIcon->fScale = 1;
175
 
                        pIcon->fAlpha = 1;
176
 
                        pIcon->fWidthFactor = 1;
177
 
                        pIcon->fHeightFactor = 1;
178
 
                        
179
 
                        cairo_save (pCairoContext);
180
 
                        cairo_dock_render_one_icon_in_desklet (pIcon, pCairoContext, FALSE, TRUE, pDesklet->container.iWidth);
181
 
                        cairo_restore (pCairoContext);
182
 
                        
183
 
                        iLeafNumber ++;
184
 
                        if (iLeafNumber == 3)
185
 
                        {
186
 
                                iLeafNumber = 0;
187
 
                                iBrancheNumber ++;
188
 
                                iBrancheType = iBrancheNumber % 2;
189
 
                        }
 
198
                        iLeafNumber = 0;
 
199
                        iBrancheNumber ++;
 
200
                        iBrancheType = iBrancheNumber % 2;
190
201
                }
191
202
        }
192
203
}
195
206
void rendering_register_tree_desklet_renderer (void)
196
207
{
197
208
        CairoDeskletRenderer *pRenderer = g_new0 (CairoDeskletRenderer, 1);
198
 
        pRenderer->render = rendering_draw_tree_in_desklet ;
199
 
        pRenderer->configure = rendering_configure_tree;
200
 
        pRenderer->load_data = rendering_load_tree_data;
201
 
        pRenderer->free_data = rendering_free_tree_data;
202
 
        pRenderer->load_icons = rendering_load_icons_for_tree;
 
209
        pRenderer->render = render ;
 
210
        pRenderer->configure = (CairoDeskletConfigureRendererFunc)configure;
 
211
        pRenderer->load_data = load_data;
 
212
        pRenderer->free_data = free_data;
 
213
        pRenderer->calculate_icons = calculate_icons;
203
214
        
204
215
        cairo_dock_register_desklet_renderer (MY_APPLET_TREE_DESKLET_RENDERER_NAME, pRenderer);
205
216
}