Skip to content
Snippets Groups Projects

Main

Merged BARDOU VINCENT requested to merge vbardou/sae_a21_d21:main into main
Compare and
4 files
+ 81
142
Preferences
Compare changes
Files
4
@@ -9,29 +9,32 @@ using System.Windows.Forms;
namespace SAE_D21_A21_Jeroglifico.Components.Lesson
{
// classe destinée à contenir des mots et a fournir des méthode pour les organiser
// (placement sur plusieurs lignes, retrait d'un mot enreplacant ces voisins ajout au milieu de mots déjà existants...)
// cette class sert principalement pour l'exercice des mots dans le désordre
// elle était à l'origine concue pour contenir des label, puis a étée généralisée à tous les controls, pour servir à l'exo des phrases à trou
public class WordContainer : UserControl
{
public List<Control> words = new List<Control>();
public Dictionary<object, Point> locations;
public bool justify = false;
public bool centered = false;
public bool replace;
public List<Control> words = new List<Control>(); // La list des controls gérés
public Dictionary<object, Point> locations; // dico permettant d'assigner une place à chaque control, et de retrouver cette place directement avec le control
public bool centered = false; // indique si les controls sont centrés sur leur ligne
public bool replace; // indique si les controls doivent se "refermer" sur un espace vide
public int wordSpacing = 10;
int margin = 0;
public List<Panel> lines = new List<Panel>();
public List<Panel> lines = new List<Panel>();// pour tracer des lignes simplement, des panel à fond noir dont la hauteur est réduite à 1px
public int lineHeight = 30;
public bool lineVisible = true;
int lineBorderHeight = 1;
public int interLine = 10;
int lastLineNo = 0;
int currentLineNo = 0;
int lastLineNo = 0; // nombre de lignes existantes
int currentLineNo = 0; // ligne courante (la plus basse qui contienne un control)
public Color lineColor = Color.Black;
Color shadowColor = Color.Gray;
public WordContainer(int width, bool replace)
{
@@ -39,39 +42,43 @@ namespace SAE_D21_A21_Jeroglifico.Components.Lesson
this.replace = replace;
}
public void AddWord(Control lbl, Point loc)
public void AddWord(Control lbl, Point loc) // ajout d'un control en mod fixe, on lui donne des coordonés, et il s'y place, indépendament des autres
{
Controls.Add(lbl);
lbl.Location = loc;
}
public void AddWord(Control lbl, bool shadow)
// ajout d'un control en mode mobile, le composant est placé après les composants déjà présents
// shadow indique si le composant doit avoir une ombre, cette fonctionnalité n'a pas pu être implémentée
public void AddWord(Control lbl, bool shadow)
{
Controls.Add(lbl); // avant le placement pour trigger le autosize de lbl
Controls.Add(lbl);
lbl.Size = lbl.GetPreferredSize(lbl.Size);
if (locations == null || locations[lbl.Tag] == null)
if (locations == null || locations[lbl.Tag] == null) // si location n'est pas utilisé pour ce control c'est à dire qu'il est placé en mode mobile
{
if (words.Count == 0)
if (words.Count == 0) // le placement est relatif aux autres controls, si il n'y en à pas le cas est traité différament
{
if (lines.Count == 0)
{
AddLine();
}
currentLineNo++;
Console.WriteLine("+line words0 " + currentLineNo);
lbl.Left = lines[currentLineNo - 1].Left;
// on place le nouveau control au début de la ligne
lbl.Left = lines[currentLineNo - 1].Left;
lbl.Top = lines[currentLineNo - 1].Top - lbl.Height;
}
else
{
// on ajoute le nouveau control à la suite du dernier de la liste
lbl.Left = words[words.Count - 1].Right + wordSpacing;
lbl.Top = lines[currentLineNo - 1].Top - lbl.Height;
}
words.Add(lbl);
if (lbl.Right > lines[currentLineNo - 1].Right)
words.Add(lbl); // ajout a la liste
if (lbl.Right > lines[currentLineNo - 1].Right) // en cas de débordement en dehors de la ligne on le décent d'une ligne
{
currentLineNo++;
Console.WriteLine("débordement " + currentLineNo);
if (currentLineNo > lastLineNo)
{
AddLine();
@@ -96,60 +103,38 @@ namespace SAE_D21_A21_Jeroglifico.Components.Lesson
}
}
//permet d'ajouter un mot a une certaine posi
// ajout d'un Control à la position acctuel de la souris, en mode mobile
public void AddWordAt(WordLabel lbl, bool shadow)
{
Point pos = PointToClient(MousePosition);
Point pos = PointToClient(MousePosition); // position de la souris
bool added = false;
if (locations == null || locations[lbl.Tag] == null)
if (locations == null || locations[lbl.Tag] == null) // on vérifie qu'on n'est pas en mode fixe
{
for (int i = 0; i < words.Count && !added; i++)
for (int i = 0; i < words.Count && !added; i++) // on cherche avec quel Control déjà présent la souris est en collision
{
if (Collids.PointIn(MousePosition, words[i]))
{
Controls.Add(lbl);
lbl.Left = words[i].Location.X;
// ajout à la gauche du Control précédent celui pointé par la souris, le nouveau control remplace celui pointé
lbl.Left = words[i].Location.X;
lbl.Top = words[i].Location.Y;
words.Insert(i, lbl);
Replace();
if (shadow)
{
/*WordLabel shade = new WordLabel(lbl.Text);
Controls.Add(shade);
shade.BackColor = shadowColor;
shade.ForeColor = shade.BackColor;
shade.Left = lbl.Left;
shade.Top = lbl.Top;*/
}
words.Insert(i, lbl); // insertion dans la liste, l'ordre de la liste définit l'ordre d'affichage
Replace(); // replacement des controls (le control remplacé et tous ceux qui suivent vont nottament être décalés)
added = true;
added = true; // on cesse de chercher le control en collision avec la souris
}
}
}
if (!added)
if (!added) // aucune collision avec le pointeur n'a étée trouvée, on ajoute le label a la fin des précédents au lieu de l'insérer
{
AddWord(lbl, shadow);
}
}
public void FakeAdd(WordLabel lbl, Point p)
{
bool found = false;
for (int i = 0; i < words.Count && !found; i++)
{
if (p.X > words[i].Left && p.X < words[i].Left)
{
found = true;
Replace(i);
}
// meme chose en Y
}
}
// supprime un control identifié par son tag en mode mobile
public Control RemoveWord(object tag)
{
int nb_words = words.Count;
@@ -157,7 +142,7 @@ namespace SAE_D21_A21_Jeroglifico.Components.Lesson
int remove_index;
bool found = false;
for (int i = 0; i < nb_words && !found; i++)
for (int i = 0; i < nb_words && !found; i++) // cherche le control
{
if (words[i].Tag == tag)
{
@@ -165,17 +150,10 @@ namespace SAE_D21_A21_Jeroglifico.Components.Lesson
to_remove = words[i];
remove_index = i;
foreach (Control w in words)
{
Console.WriteLine("........" + w.Text);
}
words.RemoveAt(remove_index);
Console.WriteLine("removed");
foreach (Control w in words)
{
Console.WriteLine("........" + w.Text);
}
if (replace)
words.RemoveAt(remove_index); // le control est retiré de la liste
if (replace) // si on remplace les mots ajoutés
{
if (words.Count > 0)
{
@@ -184,25 +162,24 @@ namespace SAE_D21_A21_Jeroglifico.Components.Lesson
else
{
currentLineNo = 0;
Console.WriteLine(" words empty " + currentLineNo);
}
}
Controls.Remove(to_remove);
return to_remove;
return to_remove; // on renvoie le Control supprimé
}
}
return null;
}
// replace tous les composant, en lignes les un après les autres dans lordre de words
public void Replace()
{
Console.WriteLine("replace");
currentLineNo = 0;
Control lblCurrent;
Control lblBefore;
if (words.Count > 0)
if (words.Count > 0) // on place le premier composant, les autres lui sont relatifs
{
words[0].Left = margin;
words[0].Top = lines[0].Top - words[0].Height;
@@ -212,24 +189,22 @@ namespace SAE_D21_A21_Jeroglifico.Components.Lesson
int wStartLine = 0;
for (int i = 1; i < words.Count; i++)
{
Console.WriteLine("........." + words[i].Text);
lblCurrent = words[i];
lblBefore = words[i - 1];
lblCurrent.Left = lblBefore.Right + wordSpacing;
Console.WriteLine((currentLineNo - 1) + " line no");
lblCurrent.Left = lblBefore.Right + wordSpacing; // chaque Control est placé à la droite du précédent + une marge
lblCurrent.Top = lines[currentLineNo - 1].Top - lblCurrent.Height;
if (lblCurrent.Right > Width - margin)
if (lblCurrent.Right > Width - margin) // si le control dépase de la ligne
{
currentLineNo++;
Console.WriteLine("new line replace " + currentLineNo + " " + lblCurrent.Text);
lblCurrent.Top += lineHeight + interLine + lineBorderHeight;
lblCurrent.Left = margin;
if (centered)
if (centered) // si les Controls doivent êtres centrés
{
int spaceLeft = (Width - margin * 2 - lblBefore.Right) / 2;
for (int j = wStartLine; j < i; j++)
int spaceLeft = (Width - margin * 2 - lblBefore.Right) / 2; // on calcule l'espace non occupé sur la ligne
for (int j = wStartLine; j < i; j++) // tous les controls de la ligne sont décalés de la moitié de lespace restant, la ligne est centrée
{
words[j].Left += spaceLeft;
}
@@ -238,7 +213,7 @@ namespace SAE_D21_A21_Jeroglifico.Components.Lesson
}
}
if (centered)
if (centered) // on centre la dernière ligne
{
int spaceLeft = (Width - margin * 2 - words[words.Count - 1].Right) / 2;
for (int j = wStartLine; j < words.Count; j++)
@@ -248,57 +223,15 @@ namespace SAE_D21_A21_Jeroglifico.Components.Lesson
}
}
private void Replace(int start)
{
Control lbl;
int currentLineBottom = words[words.Count - 1].Bottom;
int i;
if (start == 0)
{
i = 1;
words[0].Left = margin;
Console.WriteLine("start from first");
}
else
{
i = start;
}
for (; i < words.Count; i++)
{
lbl = words[i];
lbl.Left = words[i - 1].Right + wordSpacing;
lbl.Top = words[i - 1].Top;
if (lbl.Right > Width - margin)
{
lbl.Top += lineHeight + interLine + lineBorderHeight;
lbl.Left = margin;
}
}
if (currentLineBottom < words[words.Count - 1].Bottom)
{
currentLineNo++;
}
else if (currentLineBottom > words[words.Count - 1].Bottom)
{
currentLineNo--;
}
}
public void CenterAlign()
{
}
public void AddLine()
public void AddLine() // ajout d'une nouvelle ligne
{
Panel newEmptyLine = new Panel();
lastLineNo++;
newEmptyLine.Tag = lastLineNo;
newEmptyLine.Height = lineBorderHeight;
if (lineVisible)
{
newEmptyLine.BackColor = lineColor;
@@ -307,19 +240,20 @@ namespace SAE_D21_A21_Jeroglifico.Components.Lesson
{
newEmptyLine.Visible = false;
}
newEmptyLine.Width = Width - 2 * margin;
newEmptyLine.Left = margin;
if (lines.Count == 0)
if (lines.Count == 0) // si il n'y a pas encore de ligne
{
newEmptyLine.Top = interLine + lineHeight;
newEmptyLine.Top = interLine + lineHeight; // le placement se fait par rapport au top du container
}
else
{
newEmptyLine.Top = lines[lastLineNo - 2].Bottom + lineHeight + interLine;
newEmptyLine.Top = lines[lastLineNo - 2].Bottom + lineHeight + interLine; // sinon, la ligne est placée relativement à la ligne précédente
}
lines.Add(newEmptyLine);
Controls.Add(newEmptyLine);
Controls.Add(newEmptyLine); // me faite pas marcher, personne lira jusque ici
Height = newEmptyLine.Bottom + margin;
}