Colorer le text dans un editor gadget

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Colorer le text dans un editor gadget

Message par Le psychopathe »

Bonjour, bonsoir ^^

Voilà je cherche à colorer du texte dans un editorgadget sous windows et linux. Donc les api sont à proscrire.
Les balises rtf sous linux ??


@dobro : ton post sur le rtf est très intéressant mais je m"y perd ^^
Serait-il possible de me mettre juste par exemple ce mot est en rouge.
{\rtf {\rouge PHRASE ROUGE}}

Merci d'avance pour vos réponses
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

De toute facon, tu ne pourras faire qu'avec les apis.

Sous windows, ce sera le rtf.

Sous Linux, un exemple C facile à reproduire en PB.
http://library.gnome.org/devel/gtk/stab ... l#id801721
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Message par Le psychopathe »

Progi1984 a écrit :De toute facon, tu ne pourras faire qu'avec les apis.

Sous windows, ce sera le rtf.

Sous Linux, un exemple C facile à reproduire en PB.
http://library.gnome.org/devel/gtk/stab ... l#id801721
C'est gentil mais j'ai pas encore appris le C, cette année je vais apprendre le C++ mais cela doit se tenir ^^
Je vais encore abuser est ce que une âme charitable peut me le convertir en PB, en plus cela va servir à d'autre personne.

Code : Tout sélectionner

 GtkWidget *view;
  GtkTextBuffer *buffer;
  GtkTextIter start, end;
  PangoFontDescription *font_desc;
  GdkColor color;
  GtkTextTag *tag;

  view = gtk_text_view_new ();

  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));

  gtk_text_buffer_set_text (buffer, "Hello, this is some text", -1);

  /* Change default font throughout the widget */
  font_desc = pango_font_description_from_string ("Serif 15");
  gtk_widget_modify_font (view, font_desc);
  pango_font_description_free (font_desc);

  /* Change default color throughout the widget */
  gdk_color_parse ("green", &color);
  gtk_widget_modify_text (view, GTK_STATE_NORMAL, &color);

  /* Change left margin throughout the widget */
  gtk_text_view_set_left_margin (GTK_TEXT_VIEW (view), 30);

  /* Use a tag to change the color for just one part of the widget */
  tag = gtk_text_buffer_create_tag (buffer, "blue_foreground",
	   		            "foreground", "blue", NULL);  
  gtk_text_buffer_get_iter_at_offset (buffer, &start, 7);
  gtk_text_buffer_get_iter_at_offset (buffer, &end, 12);
  gtk_text_buffer_apply_tag (buffer, tag, &start, &end);
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

En pseudo code et de mémoire, ca doit fonctionner :

Code : Tout sélectionner

define.GtkWidget *view;
define.GtkTextBuffer *buffer;
define.GtkTextIter start, end;
define.PangoFontDescription *font_desc;
define.GdkColor color;
define.GtkTextTag *tag;

view = gtk_text_view_new_()

buffer = gtk_text_view_get_buffer_(view)

gtk_text_buffer_set_text_(buffer, "Hello, this is some text", -1)

; Change default font throughout the widget 
font_desc = pango_font_description_from_string_("Serif 15")
gtk_widget_modify_font_(view, font_desc)
pango_font_description_free_(font_desc)

; Change default color throughout the widget 
gdk_color_parse_("green", @color)
gtk_widget_modify_text_(view, #GTK_STATE_NORMAL, @color)

; Change left margin throughout the widget 
gtk_text_view_set_left_margin_(view, 30)

; Use a tag to change the color for just one part of the widget 
tag = gtk_text_buffer_create_tag_(buffer, "blue_foreground", "foreground", "blue", #NULL)  
gtk_text_buffer_get_iter_at_offset_(buffer, @start, 7)
gtk_text_buffer_get_iter_at_offset_(buffer, @end, 12)
gtk_text_buffer_apply_tag_(buffer, tag, @start, @end)
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Et bien sur, PB ne gère pas l'API de Pango :( Essaie de voir sur le forum EN ce qu'ils peuvent t'aider à traduire ce code !
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Message par Le psychopathe »

c'est la merde mdr ^^
Je vais faire un web gadget et créer des pages à la volée en insérant du html
Tant pis
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Un conseil, poste sur le forum EN, comme ca, on verra comment ils font et je pense pouvoir t'aider pour la suite :)
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Message par Le psychopathe »

Progi1984 a écrit :Un conseil, poste sur le forum EN, comme ca, on verra comment ils font et je pense pouvoir t'aider pour la suite :)
Je regardes ça lundi si possible car j'ai plus le net, je viens de déménager (2 semaines et france telecom ne sont pas pressé...)
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Message par Geo Trouvpatou »

Salut.

Je ne sais pas si cela va t'aider.

Vu que tu cherches du code portable, en voici qui fonctionne sous Linux.

Bon y'a des erreurs du compilo mais avec des pros de Linux ici ça devrait pouvoir se corriger.
A l'époque où je cherchais pour faire un éditeur multi-plateforme j'avais trouvé ceci.
Cela permet de mettre du code en gras italique et souligné, alors peut-être aussi en couleur... A voir.
http://www.purebasic.fr/french/viewtopic.php?p=77205

Et un tuto pour comprendre ça :
http://franckh.developpez.com/tutoriels/gtk/gtktexttag/

Ensuite pour Windows quelqu'un (Un français) à fait un éditeur où l'on pouvait aussi mettre en gras italique et souligné.

Bon ce français à bien fait de mettre son pseudo dans son code :

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4
;
; Explication du programme :
; Modifier un texte dans un StringGadget ou un EditorGadget en partant de la position du curseur

Procedure EditText(Gadget, Type, Text_Start.s, Text_End.s = "")
  ; type = 0 : Insertion de texte sur le curseur
  ; type = 1 : insertion de texte autour de la sélection
  Protected Debut_Position, Fin_position, Texte.s, Index.l
  Select GadgetType(Gadget)
    Case #PB_GadgetType_String
      SendMessage_(GadgetID(Gadget), #EM_GETSEL, @Debut_Position, @Fin_position)
      Texte = GetGadgetText(Gadget)
      If Type = 0
        Texte = Left(Texte, Debut_Position) + Text_Start + Text_End + Right(Texte, Len(Texte) - Fin_position)
        Debut_Position + Len(Text_Start + Text_End)
        Fin_position = Debut_Position
      Else
        Texte = Left(Texte, Debut_Position) + Text_Start + Mid(Texte, Debut_Position + 1, Fin_position - Debut_Position) + Text_End + Right(Texte, Len(Texte) - Fin_position)
        Debut_Position + Len(Text_Start)
        Fin_position + Len(Text_Start)
      EndIf
      SetGadgetText(Gadget, Texte)
      SendMessage_(GadgetID(Gadget), #EM_SETSEL, Debut_Position, Fin_position)
      SetActiveGadget(Gadget)
     
    Case #PB_GadgetType_Editor
      SendMessage_(GadgetID(Gadget), #EM_GETSEL, @Debut_Position, @Fin_position)
      For Index = 0 To CountGadgetItems(Gadget) - 1
        If Texte <> ""
          Texte + Chr(10)
        EndIf
        Texte + GetGadgetItemText(Gadget, Index)
      Next
      If Type = 0
        Texte = Left(Texte, Debut_Position) + Text_Start + Text_End + Right(Texte, Len(Texte) - Fin_position)
        Debut_Position + Len(Text_Start + Text_End)
        Fin_position = Debut_Position
      Else
        Texte = Left(Texte, Debut_Position) + Text_Start + Mid(Texte, Debut_Position + 1, Fin_position - Debut_Position) + Text_End + Right(Texte, Len(Texte) - Fin_position)
        Debut_Position + Len(Text_Start)
        Fin_position + Len(Text_Start)
      EndIf
      SetGadgetText(Gadget, Texte)
      SendMessage_(GadgetID(Gadget), #EM_SETSEL, Debut_Position, Fin_position)
      SetActiveGadget(Gadget)
     
  EndSelect
EndProcedure


; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, "Texte", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0 Or CreateGadgetList(WindowID(0)) = 0
  End
EndIf

StringGadget(0, 0, 0, 300, 25, "")

EditorGadget(1, 0, 30, 300, 100)

ButtonGadget(2, 0, 150, 300, 25, "Insérer le texte 'Blabla' au l'endroit du curseur")
ButtonGadget(3, 0, 175, 300, 25, "Entourer le texte sélectionné par '<b>' et '</b>'")

Repeat
  Event = WaitWindowEvent()
 
  Select Event
    Case #PB_Event_Menu
      Select EventMenu() ; Menus
         
      EndSelect
     
    Case #PB_Event_Gadget
      Select EventGadget() ; Gadgets
        Case 0 ; String
          Gadget_LostFocus = 0
          Debug "String"
        Case 1 ; Editor
           Gadget_LostFocus = 1
          Debug "Editor"
        Case 2
          Debug "Insertion"
          EditText(Gadget_LostFocus, 0, "Blabla")
        Case 3
          EditText(Gadget_LostFocus, 1, "<b>", "</b>")
      EndSelect
  EndSelect
 
Until Event = #PB_Event_CloseWindow

End
Arrgghhh!!! je viens de faire tourner le code de LSI et cela ne fonctionne pas tout à fait comme pour Linux.

Mais ça peut peut-être ouvrir quelques pistes pour transformer à la volée le code sélectionné sous Windows, peut-être avec un mix du code de Dobro.

Bye.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

pour info , j'ai ajouté un Tuto sur le RTF dans la rubrique correspondante
Forum Débutant ;)
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Message par Geo Trouvpatou »

Les erreurs Linux sont peut-être dû au code :

Code : Tout sélectionner

Case #gadget_Main_Button_Bold 
    ApplyStyle("bold") 
Case #gadget_Main_Button_Italic 
    ApplyStyle("italic") 
Case #gadget_Main_Button_Underline 
    ApplyStyle("underline")
qui se trouve dans la boucle principale.

Comme me l'avait expliqué Cpl.Bator il faudra plutôt faire un truc du genre :

Code : Tout sélectionner

g_signal_connect_(GadgetID(#gadget_Main_Button_Bold), "clicked", @ApplyStyle("bold"), WindowID(#window_Main))
au niveau de la construction de l'interface et bien sûr de supprimer le code causant l'erreur de la boucle Repeat...Until
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Message par Le psychopathe »

Je n'ai pas eu le temps de tester mais il semblerait que cela soit un debut de piste :
FORUM ENGLISH
http://purebasic.fr/english/viewtopic.p ... 123#176123

Code : Tout sélectionner

;Philipp Schmieder (WishMaster/vonTurnundTaxis)
;http://www.noname-development.de
;03.01.2007

;Released under the terms of the LGPL (http://www.gnu.org/licenses/lgpl.html)


Define StartIter.GtkTextIter
Define EndIter.GtkTextIter
Define PBStartIter.GtkTextIter
Define PBEndIter.GtkTextIter

Enumeration
    #Pango_Style_Normal
    #Pango_Style_Oblique
EndEnumeration

#Pango_Weight_Normal = 400
#Pango_Weight_Bold = 800

If OpenWindow(1, 1, 1, 800, 530, "")
    If CreateGadgetList(WindowID(1))
       
       
        EditorGadget(1, 0, 0, 800, 500)
        SetGadgetText(1, "PureBasic" + Chr(10) + "PureBasic, ontwikkeld door Frédéric Laboureur (Fantaisie Software, Frankrijk)," + Chr(10) + "is een commerciële compiler voor Windows, Linux, AmigaOS en Mac OS. De programma's zijn klein en" + Chr(10) + "snel, de syntax een mix tussen BASIC en C. Naast de vele krachtig geoptimaliseerde bibliotheken" + Chr(10) + "(GUI-gadgets, beeld, geluid, netwerk, database, compressie, cryptografie, ....) kan men rechtstreeks" + Chr(10) + "WinAPI aanspreken en Assembler-code gebruiken (Inline-Assembler). Bovendien is het mogelijk om" + Chr(10) + "een bibliotheek te schrijven. Verder biedt PureBasic sinds versie 3.5 een rudimentaire 3D-engine" + Chr(10) + "(OGRE 3D), waarmee het mogelijk is snel en eenvoudig kleine 3-D toepassingen te programmeren." + Chr(10) + Chr(10) + "Een essentieel voordeel vergeleken met andere programmeertalen is het bijzondere feit dat de taal" + Chr(10) + "doorlopend ontwikkeld wordt, steeds krachtiger wordt en dat nieuwe instructies de taal verder" + Chr(10) + "optimaliseren. De aanschaf van PureBasic houdt automatisch in dat alle toekomstige updates gratis" + Chr(10) + "zijn in de vorm van downloads. Verdere kosten bij het verkopen van door u ontwikkelde programma's" + Chr(10) + "zijn er niet, geschreven programma's kunnen licentie-vrij verhandeld worden zonder rekening te" + Chr(10) + "hoeven houden met beperkingen van de kant van de fabrikant.")
       
        Buffer = gtk_text_view_get_buffer_(GadgetID(1))



        ButtonGadget(2, 0, 500, 200, 30, "Reset Styles")
        ButtonGadget(3, 200, 500, 200, 30, "Bold")
        ButtonGadget(4, 400, 500, 200, 30, "Oblique")
        ComboBoxGadget(5, 600, 500, 200, 30)
        AddGadgetItem(5, 0, "very small")
        AddGadgetItem(5, 0, "small")
        AddGadgetItem(5, 0, "big")
        AddGadgetItem(5, 0, "huge")

        gtk_text_buffer_create_tag_(Buffer, "bold", "weight", #Pango_Weight_Bold)
        gtk_text_buffer_create_tag_(Buffer, "oblique", "style", #Pango_Style_Oblique)
       
        gtk_text_buffer_create_tag_(Buffer, "very small", "size", 4000)
        gtk_text_buffer_create_tag_(Buffer, "small", "size", 9000)
        gtk_text_buffer_create_tag_(Buffer, "big", "size", 15000)
        gtk_text_buffer_create_tag_(Buffer, "huge", "size", 30000)

        gtk_text_buffer_get_iter_at_offset_(Buffer, @PBStartIter, 0)
        gtk_text_buffer_get_iter_at_offset_(Buffer, @PBEndIter, 9)
       
       
        gtk_text_buffer_apply_tag_by_name_(Buffer, "bold", @PBStartIter, @PBEndIter)
        gtk_text_buffer_apply_tag_by_name_(Buffer, "big", @PBStartIter, @PBEndIter)

       
        Repeat
            Event = WaitWindowEvent()
            If Event = #PB_Event_Gadget
                Select EventGadget()
                    Case 2
                        gtk_text_buffer_get_selection_bounds_(Buffer, @StartIter, @EndIter)
                        gtk_text_buffer_remove_all_tags_(Buffer, @StartIter, @EndIter)
                    Case 3
                        gtk_text_buffer_get_selection_bounds_(Buffer, @StartIter, @EndIter)
                        gtk_text_buffer_apply_tag_by_name_(Buffer, "bold", @StartIter, @EndIter)
                    Case 4
                        gtk_text_buffer_get_selection_bounds_(Buffer, @StartIter, @EndIter)
                        gtk_text_buffer_apply_tag_by_name_(Buffer, "oblique", @StartIter, @EndIter)
                    Case 5
                        gtk_text_buffer_get_selection_bounds_(Buffer, @StartIter, @EndIter)
                        gtk_text_buffer_remove_tag_by_name_(Buffer, "small", @StartIter, @EndIter)
                        gtk_text_buffer_remove_tag_by_name_(Buffer, "very small", @StartIter, @EndIter)
                        gtk_text_buffer_remove_tag_by_name_(Buffer, "big", @StartIter, @EndIter)
                        gtk_text_buffer_remove_tag_by_name_(Buffer, "huge", @StartIter, @EndIter)
                        gtk_text_buffer_apply_tag_by_name_(Buffer, GetGadgetText(5), @StartIter, @EndIter)
                EndSelect
            EndIf
        Until Event = #PB_Event_CloseWindow
    EndIf
EndIf

Et un autre post au l editor gadget gère la couleur ^^
http://www.purebasic.fr/english/viewtopic.php?t=19817
Et encore dans le même style :
http://www.purebasic.fr/english/viewtopic.php?t=11375
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Re: Colorer le text dans un editor gadget

Message par Progi1984 »

Tite question : est il possible de sauvegarder du texte formaté sous gtk+ et de le restaurer comme on le fait avec le RTF sous Windows ?
Répondre