Advertisement
BigBlow_

TodoList

Mar 19th, 2025
16
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.56 KB | None | 0 0
  1. -- Nom du fichier à afficher
  2.  
  3. local fileName = "list.txt"
  4.  
  5. local saveFileName = "list_save.txt"
  6.  
  7.  
  8.  
  9. -- Côté où est connecté le moniteur (ajuste-le selon ta configuration)
  10.  
  11. local monitorSide = "right"
  12.  
  13.  
  14.  
  15. -- Vérifie si le moniteur est connecté correctement
  16.  
  17. if not peripheral.isPresent(monitorSide) then
  18.  
  19. print("Erreur: Aucun moniteur détecté sur le côté " .. monitorSide)
  20.  
  21. return
  22.  
  23. end
  24.  
  25.  
  26.  
  27. -- Attache le périphérique moniteur
  28.  
  29. local mon = peripheral.wrap(monitorSide)
  30.  
  31. mon.setTextScale(1) -- Ajuste la taille du texte (1 pour agrandir la police)
  32.  
  33. mon.clear() -- Efface le moniteur
  34.  
  35.  
  36.  
  37. -- Fonction pour lire le contenu d'un fichier et restaurer les états cochés
  38.  
  39. local function readFile(fileName)
  40.  
  41. local file = fs.open(fileName, "r")
  42.  
  43. if not file then
  44.  
  45. print("Erreur: Impossible de lire le fichier " .. fileName)
  46.  
  47. return nil
  48.  
  49. end
  50.  
  51.  
  52.  
  53. -- Lit le contenu du fichier ligne par ligne
  54.  
  55. local lines = {}
  56.  
  57. local titles = {} -- Contient les 4 premières lignes (le titre)
  58.  
  59. local lineNumber = 0
  60.  
  61. while true do
  62.  
  63. local line = file.readLine()
  64.  
  65. if line == nil then break end
  66.  
  67. lineNumber = lineNumber + 1
  68.  
  69. if lineNumber <= 4 then
  70.  
  71. table.insert(titles, line) -- Ajoute les 4 premières lignes comme titres
  72.  
  73. else
  74.  
  75. table.insert(lines, {text = line, checked = false}) -- Ajoute les autres lignes avec des cases "checked"
  76.  
  77. end
  78.  
  79. end
  80.  
  81. file.close()
  82.  
  83.  
  84.  
  85. -- Lit les états cochés depuis le fichier de sauvegarde
  86.  
  87. local checkedStates = {}
  88.  
  89. if fs.exists(saveFileName) then
  90.  
  91. local saveFile = fs.open(saveFileName, "r")
  92.  
  93. local savedData = saveFile.readAll()
  94.  
  95. saveFile.close()
  96.  
  97.  
  98.  
  99. -- Vérifie que savedData n'est pas nil et désérialise les données
  100.  
  101. if savedData then
  102.  
  103. checkedStates = textutils.unserialize(savedData) or {}
  104.  
  105. end
  106.  
  107. end
  108.  
  109.  
  110.  
  111. -- Applique les états cochés aux éléments
  112.  
  113. for _, item in ipairs(lines) do
  114.  
  115. if checkedStates[item.text] ~= nil then
  116.  
  117. item.checked = checkedStates[item.text]
  118.  
  119. end
  120.  
  121. end
  122.  
  123.  
  124.  
  125. return titles, lines
  126.  
  127. end
  128.  
  129.  
  130.  
  131. -- Fonction pour sauvegarder l'état des éléments cochés
  132.  
  133. local function saveCheckedState(content)
  134.  
  135. local checkedStates = {}
  136.  
  137. for _, item in ipairs(content) do
  138.  
  139. checkedStates[item.text] = item.checked
  140.  
  141. end
  142.  
  143.  
  144.  
  145. local saveFile = fs.open(saveFileName, "w")
  146.  
  147. saveFile.write(textutils.serialize(checkedStates))
  148.  
  149. saveFile.close()
  150.  
  151. end
  152.  
  153.  
  154.  
  155. -- Fonction pour trier les éléments cochés en haut de la liste et par ordre alphabétique
  156.  
  157. local function sortList(content)
  158.  
  159. table.sort(content, function(a, b)
  160.  
  161. if a.checked ~= b.checked then
  162.  
  163. return a.checked and not b.checked -- Les éléments cochés passent avant les non-cochés
  164.  
  165. else
  166.  
  167. return a.text:lower() < b.text:lower() -- Trie par ordre alphabétique (insensible à la casse)
  168.  
  169. end
  170.  
  171. end)
  172.  
  173. end
  174.  
  175.  
  176.  
  177. -- Fonction pour afficher le contenu avec des cases à cocher et des couleurs
  178.  
  179. local function displayList(titles, content)
  180.  
  181. mon.clear()
  182.  
  183. mon.setCursorPos(1, 1) -- Positionne le curseur au début
  184.  
  185.  
  186.  
  187. -- Affiche les titres sans cases à cocher
  188.  
  189. for i, title in ipairs(titles) do
  190.  
  191. mon.setCursorPos(2, i)
  192.  
  193. mon.setTextColor(colors.yellow) -- Couleur jaune pour les titres
  194.  
  195. mon.write(title)
  196.  
  197. end
  198.  
  199.  
  200.  
  201. -- Affiche la liste à partir de la 5ème ligne avec des cases à cocher
  202.  
  203. for i, item in ipairs(content) do
  204.  
  205. mon.setCursorPos(2, i + #titles)
  206.  
  207. if item.checked then
  208.  
  209. mon.setTextColor(colors.green) -- Couleur verte pour les éléments cochés
  210.  
  211. mon.write("[X] ")
  212.  
  213. else
  214.  
  215. mon.setTextColor(colors.white) -- Couleur blanche pour les éléments décochés
  216.  
  217. mon.write("[ ] ")
  218.  
  219. end
  220.  
  221. mon.write(item.text) -- Affiche le texte de la ligne
  222.  
  223. end
  224.  
  225. mon.setTextColor(colors.white) -- Réinitialise la couleur du texte
  226.  
  227. end
  228.  
  229.  
  230.  
  231. -- Fonction pour gérer les clics sur le moniteur
  232.  
  233. local function handleClick(titles, content)
  234.  
  235. while true do
  236.  
  237. local event, side, x, y = os.pullEvent("monitor_touch")
  238.  
  239. if side == monitorSide then
  240.  
  241. local index = y - #titles -- Calcul l'index en fonction de l'offset des titres
  242.  
  243. if index > 0 and index <= #content then
  244.  
  245. local item = content[index]
  246.  
  247. item.checked = not item.checked -- Inverse l'état de la case
  248.  
  249. sortList(content) -- Trie la liste pour placer les cochés en haut et par ordre alphabétique
  250.  
  251. displayList(titles, content) -- Met à jour l'affichage
  252.  
  253. saveCheckedState(content) -- Sauvegarde l'état actuel
  254.  
  255. end
  256.  
  257. end
  258.  
  259. end
  260.  
  261. end
  262.  
  263.  
  264.  
  265. -- Programme principal
  266.  
  267. local titles, content = readFile(fileName)
  268.  
  269. if content then
  270.  
  271. sortList(content) -- Trie la liste dès le départ
  272.  
  273. displayList(titles, content) -- Affiche les titres et la liste avec les cases à cocher
  274.  
  275. handleClick(titles, content) -- Gère les clics pour cocher/décocher les cases
  276.  
  277. else
  278.  
  279. print("Erreur: Le fichier est vide ou ne peut pas être lu.")
  280.  
  281. end
  282.  
  283.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement