REBOL [ AUTHORS: "Shadwolf (strike again)" AppName: "RTE-line" PURPOSE: {Après mûre réflection et comme R3 est toujours pas d'actualité j'ai décidé de travailler de mon coté à la réalisation d'une Widget pour rebol/view VID2.0 Voici ce que je compte implémenter une ligne a un nombre de 80 charactere On affiche la ligne dans une face toute simple et on utilisera face/effect/draw pour realiser l'affichage On utilisera les events clavier et sourie pour inserer le texte. Le formatage du texte se fera pardes bouton externe et une ligne nous indiquera quel est le mode courant. La saisie des evenements claviers renseignera un "objet" qui aura les données suivantes: position, char_ASCII, fnt_couleur Le curseur se déplacera au clavier ou a l'aide de la sourie. Déplacements du curseur au clavier: A partir de le position courant du curseur on ira chercher la position du caractère le plus proche de cette position ainsi le curseur se déplacera au bon endroit quelque soit la taille du caractère précédent Déplacement du curseur à la sourie: quand on cliquera sur une position relative et dans notre table indexée (ou la position sert d'indexe) la position la plus proche et on placera le curseur a cette position La table serra triée par sort/all table de ash (enfin table des caractères saisies indexée en fontion de leur position [ [0x0 "a" red bold 12] [0x5 "b" green underline 25] [0x30 "c" yellow normal 25] ] Cette table sera traité par un moteur de dessin draw/AGG On poura aussi y adjoindre un autre moteur pour les besoin de sauvegarde typée.. (MDP etc...) Insertion de nouveaux caractères dans un texte deja existant: Lors de la saisie du nouveau caractère on détecte si a la position actuelle du curseur il ya deja un caractère Si tel est le cas on parcours la liste et on applique une incrémentation des valeur de position dans la liste a partir de la position trouvée. Comme chaque caractère est géré de façon propre ca aura pour effet de décaler tout le bloc une autre implémentation possible ce serrait les objet liés un peu dans le genre d'une liste chainée de struct! en C comme c'est plus dificile a mettre en place je testerai ca dans une évolution La hauteur de la ligne doit dépendre de la taille du texte le plus haut. Le text plus petit doit etre dessendu en bas de la ligne. La touche entrée ne fait rien elle servira dans la version multiline. } ] stylize/master [ rte: box with [ color: gray ;tampon: "" ;buffer: [[]] ;line-index: 1 ascii-char-tab: [] ; table ou on stoquera tout ce que l'on va dessiner char-sz: 12 font-st: none current-text-offset: 5x0 cursor-text-offset: 5x0 max-text-offset: 0x0 text-color: black pane: [] set-font-style: func [ font-s [word!] sz-tt [integer!] ] [ if char-sz <> sz-tt [ if char-sz < sz-tt [ size/y: sz-tt + 15 show self ] char-sz: sz-tt ] font-st: font-s ;insert tail buffer/:line-index compose/deep [[ [ space: 2x0 size: (char-sz) style: [(font-s)] color: (text-color)] (cursor-text-offset - 6x0) "" ]] ] feel: make feel [ engage: func [f a e] [ switch a [ key [ probe e/key switch/default e/key [ #"^M" [ ; touche entrer ; pas implémenter pour l'instant ] #"^H" [ ; touche backspace ; A FAIRE !! ] ][ l-fnt-disp/text: rejoin [ to-string f/char-sz "," to-string f/font-st "," to-string f/text-color ] show l-fnt-disp ; ascii-char-item: compose [ (f/cursor-text-offset) (to-string e/key) (f/char-sz) (f/font-st) (f/text-color) ] ;ascii-char-item a l'emplacement actuel du curseur, le char saisi, la taille de la fnt, ; le style de la font,la couleur de la font ; probe ascii-char-item draw-text: copy [] ; on insert ascii-char-item dans notre table insert tail f/ascii-char-tab reduce [(ascii-char-item)] probe f/ascii-char-tab ;on fabrique le block de donnée draw foreach char f/ascii-char-tab [ font-obj: make face/font compose/deep [space: 2x0 size: (char/3) style: [(char/4)] color: (char/5)] insert tail draw-text compose [ font (font-obj) pen (font-obj/color) text (char/1) (char/2)] ] probe draw-text ;on dessine le contenu de du block de donnée draw f/effect: make effect reduce [ 'draw (draw-text) ] ;probe f/effect ; on déplace la position actuelle du curseur switch f/char-sz [ 12 [ either find "fijltr" e/key [ f/cursor-text-offset/x: f/cursor-text-offset/x + 3 ][ f/cursor-text-offset/x: f/cursor-text-offset/x + 5 ] ] 20 [ either find "fijltr" e/key [ f/cursor-text-offset/x: f/cursor-text-offset/x + 6 ][ f/cursor-text-offset/x: f/cursor-text-offset/x + 12 ] ] 30 [ either find "fijltr" e/key [ f/cursor-text-offset/x: f/cursor-text-offset/x + 12 ][ f/cursor-text-offset/x: f/cursor-text-offset/x + 22 ] ] ] if find "ABCDEFGHIJKLMNOPQRSTUVWXYZ" e/key [ f/cursor-text-offset/x: f/cursor-text-offset/x + 2 probe f/cursor-text-offset/x: f/cursor-text-offset/x ] f/pane/1/offset: f/cursor-text-offset comment { ; on garde ca a titre d'example f/tampon: copy rejoin [f/tampon to-string e/key] draw-text: [] print "f/buffer:" probe f/buffer ; on ajoute la nouvelle lettre saisieque dans le tampon correspondant à la ligne actuelle cur-line: f/line-index probe cur-line tmp-c-line: f/buffer/:cur-line tm-buff: third last tmp-c-line tm-buff: rejoin [ tm-buff e/key ] replace (last tmp-c-line) (third last tmp-c-line) tm-buff ; on redessinne dans la box ce qu'on a dans le tampon de saisie foreach line-to-draw f/buffer [ foreach text-block line-to-draw [ font-style: text-block/1 start-offset: text-block/2 text-to-show: text-block/3 font-obj: make face/font font-style ;insert tail draw-text compose [ font (font-obj) pen (f/text-color) text (start-offset) (text-to-show)] insert tail draw-text compose [ font (font-obj) pen (font-obj/color) text (start-offset) (text-to-show)] ] ] f/effect: make effect reduce [ 'draw draw-text ] draw-text: none f/cursor-text-offset: as-pair (f/cursor-text-offset/x + 5.5) f/current-text-offset/y ;show f ] f/pane/1/offset: f/cursor-text-offset probe "f/pane/1/offset" probe f/pane/1/offset } ] show f ] down [ ;insert f/buffer compose [(as-pair 0 (line-index * 20)) ""] f/color: white show f focus f ] ] ] ] append init [ ; probe buffer set-font-style 'normal char-sz insert pane make face [ color: red size: 2x20 offset: cursor-text-offset ] show self ] ] ] view layout [ across btn "bold" [test-rte/set-font-style 'bold (to-integer dd1/text)] btn "underline" [test-rte/set-font-style 'underline (to-integer dd1/text)] btn "italic" [test-rte/set-font-style 'italic (to-integer dd1/text)] btn "normal" [test-rte/set-font-style 'normal (to-integer dd1/text)] dd1: drop-down "12" "20" "30" [test-rte/set-font-style test-rte/font-st (to-integer dd1/text) ] col-r: box 20x20 black edge [ siez: 2x2 color: black] [ test-rte/text-color: request-color col-r/color: test-rte/text-color show col-r test-rte/set-font-style test-rte/font-st test-rte/char-sz ] return test-rte: rte 400x20 return text black "Current font style: " l-fnt-disp: text black 200x20 "" ] do-events