Déjà un conseil, évite les affectations dans les conditions :
MenuResult = DrawMenu(&ModeMenu,DScreen);
if (MenuResult == 1)
n'est-il pas beaucoup plus lisible que
if ((MenuResult = DrawMenu(&ModeMenu,DScreen)) == 1)
?
D'autant plus que la comparaison avec le second test est immédiate ainsi.
Ensuite, sauf si je me trompe fondamentalement sur la nature de ton code, ne serait-il pas équivalent de faire ça :
Font_Type_t Font_Type;
if (Key == KEY_MODE)
{
MenuResult = DrawMenu(&ModeMenu,DScreen);
MenuResult2 = DrawMenu(&ModeMenuLP,DScreen);
if (MenuResult2 == 1)
{
Font_Type = A_NORMAL;
}
if (MenuResult2 == 2)
{
Font_Type = A_REVERSE;
}
if (MenuResult2 == 3)
{
Font_Type = = A_XOR;
}
if (MenuResult == 1)
{
if (MainData.Tool == TOOL_LINE) MainData.LineModePlane0 = Font_Type;
if (MainData.Tool == TOOL_CIRCLE) MainData.CircleModePlane0 = Font_Type;
if (MainData.Tool == TOOL_ELLIPSE) MainData.EllipseModePlane0 = Font_Type;
if (MainData.Tool == TOOL_RECTANGLE) MainData.RectangleModePlane0 = Font_Type;
if (MainData.Tool == TOOL_FRAME) MainData.FrameModePlane0 = Font_Type;
}
if (MenuResult == 2)
{
if (MainData.Tool == TOOL_LINE) MainData.LineModePlane1 = Font_Type;
if (MainData.Tool == TOOL_CIRCLE) MainData.CircleModePlane1 = Font_Type;
if (MainData.Tool == TOOL_ELLIPSE) MainData.EllipseModePlane1 = Font_Type;
if (MainData.Tool == TOOL_RECTANGLE) MainData.RectangleModePlane1 = Font_Type;
if (MainData.Tool == TOOL_FRAME) MainData.FrameModePlane1 = Font_Type;
}
}
?
J'ai essayé de désimbriquer les conditions indépendantes les unes des autres pour factoriser le code, mais il est tard, j'ai pu me tromper

Bref, l'idée est là.
Après, une autre idée, ça serait, à la place d'avoir des champs xxxPlane0 et xxxPlane1, d'avoir un tableau xxxPlane[PLANE_COUNT], et de faire un truc du genre :
Headers :
typedef enum Plane_Index_e
{
PLANE_0,
PLANE_1,
PLANE_COUNT /* Comme l'enum commence à 0 , PLANE_0 = 0, PLANE_1 = 1 et PLANE_COUNT = 2, ça tombe bien non ? */
}
Plane_Index_t;
typedef struct Type_De_Main_Data_s
{
Font_Type_t LineModePlane[PLANE_COUNT];
Font_Type_t CircleModePlane[PLANE_COUNT];
Font_Type_t EllipseModePlane[PLANE_COUNT];
Font_Type_t RectangleModePlane[PLANE_COUNT];
Font_Type_t FrameModePlane[PLANE_COUNT];
}
Type_De_Main_Data_t;
code :
Type_De_Main_Data_t MainData;
Font_Type_t Font_Type;
Plane_Index_t Plane_Index;
Boolean_t Update_Font_Type;
if (Key == KEY_MODE)
{
MenuResult = DrawMenu(&ModeMenu,DScreen);
MenuResult2 = DrawMenu(&ModeMenuLP,DScreen);
if (MenuResult2 == 1)
{
Font_Type = A_NORMAL;
}
else if (MenuResult2 == 2)
{
Font_Type = A_REVERSE;
}
else if (MenuResult2 == 3)
{
Font_Type = = A_XOR;
}
else
{
Font_Type = -1; /* à remplacer par un code d'erreur nommé */
}
if (MenuResult == 1)
{
Plane_Index = PLANE_0;
Update_Font_Type = TRUE;
}
else if (MenuResult == 2)
{
Plane_Index = PLANE_1;
Update_Font_Type = TRUE;
}
else
{
Update_Font_Type = FALSE;
}
if ((Font_Type != -1) && (Update_Font_Typ == TRUE))
{
if (MainData.Tool == TOOL_LINE) MainData.LineModePlane [Plane_Index] = Font_Type;
if (MainData.Tool == TOOL_CIRCLE) MainData.CircleModePlane [Plane_Index] = Font_Type;
if (MainData.Tool == TOOL_ELLIPSE) MainData.EllipseModePlane [Plane_Index] = Font_Type;
if (MainData.Tool == TOOL_RECTANGLE) MainData.RectangleModePlane [Plane_Index] = Font_Type;
if (MainData.Tool == TOOL_FRAME) MainData.FrameModePlane [Plane_Index] = Font_Type;
}
}
Dernières considérations : tu peux aussi remplacer ces conditions par des switch (là j'ai gardé tes if).
Enfin, tu peux carrément faire un tableau indexé par tes MenuResult qui contient les constantes qui vont bien, et aller chercher la valeur à la main, genre :
Enfin pour de vrai, ce n'est pas possible de t'arranger pour que tes DrawMenu retournent directement La bonne valeur de Plane_Index et de Font_Type ?
(code non compilé/testé, juste pour l'exemple)
(méga cross)
Edit : et perso j'aurais aussi fait un tableau à deux dimensions comme Kevin le suggère