EditGadget und RichText (Teil 2) Lösungsansatz

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

EditGadget und RichText (Teil 2) Lösungsansatz

Beitrag von Makke »

Hallo zusammen,

als Nachtrag zu dem Thema: http://www.purebasic.fr/german/viewtopi ... 21&t=28296 (Danke an CodeCommander für die Links) wollte ich meinen ersten Lösungsansatz präsentieren:

Code: Alles auswählen


EnableExplicit

ImportC ""
   gtk_text_buffer_create_tag(*buffer.GtkTextBuffer,tag_name.p-Ascii,first_property_name.p-ascii,tag_value ,null=0) As "gtk_text_buffer_create_tag"
   gtk_text_buffer_apply_tag_by_name(*buffer.GtkTextBuffer, name.p-Ascii,*start,*end) As "gtk_text_buffer_apply_tag_by_name"
EndImport   


Procedure AddFormatedText(Gadget.i, Text.s)
  
  Static.b              initialized
  Static.l              pangoStyleNormal, pangoStyleItalic, pangoUnderlineNone, pangoUnderineSingle, pangoWeightNormal, pangoWeightBold
  Static.s              pangoPropertyItalic, pangoPropertyUnderline, pangoPropertyBold, pangoPropertyColor, tagBold, tagItalic, tagUnderline, tagColorRed, tagColorGreen, startBracket, endBracket, regExp
  Static.GDKColor       gdkColorRed, gdkColorGreen
  Protected.l           startPosI, endPosI, startPosU, endPosU, startPosB, endPosB, startPosR, endPosR, startPosG, endPosG, lenDiff
  Protected.i           textBuffer
  Protected.s           tempText
  Protected.GtkTextIter startIter, endIter
  
  If initialized = #False
    
    pangoStyleNormal    = 0
    pangoStyleItalic    = 2
    pangoUnderlineNone  = 0
    pangoUnderineSingle = 1
    pangoWeightNormal   = 400
    pangoWeightBold     = 700
    
    pangoPropertyItalic    = "style"
    pangoPropertyUnderline = "underline"
    pangoPropertyBold      = "weight"
    pangoPropertyColor     = "foreground-gdk"
    
    tagItalic     = "i"
    tagUnderline  = "u"
    tagBold       = "b"
    tagColorRed   = "r"
    tagColorGreen = "g"
    
    gdkColorRed\red   = $A8 * $A8
    gdkColorRed\green = $38 * $38
    gdkColorRed\blue  = $38 * $38
    gdkColorRed\pixel = 1
    
    gdkColorGreen\red   = $98 * $98
    gdkColorGreen\green = $C8 * $C8
    gdkColorGreen\blue  = $98 * $98
    gdkColorGreen\pixel = 2
    
    startBracket = "["
    endBracket   = "]"
    
    regExp = "["+startBracket+"]["+tagItalic+tagUnderline+tagBold+tagColorRed+tagColorGreen+"]["+endBracket+"]"
    
    initialized = #True
    
  EndIf
  
  tempText = Text
  
  If CreateRegularExpression(0, regExp)
    
    Text = ReplaceRegularExpression(0, Text, "")
    
    SetGadgetText(Gadget, Text)
    
    textBuffer = gtk_text_view_get_buffer_(GadgetID(Gadget))
    
    gtk_text_buffer_create_tag(textBuffer, tagItalic,     pangoPropertyItalic,    pangoStyleItalic)
    gtk_text_buffer_create_tag(textBuffer, tagUnderline,  pangoPropertyUnderline, pangoUnderineSingle)
    gtk_text_buffer_create_tag(textBuffer, tagBold,       pangoPropertyBold,      pangoWeightBold)
    gtk_text_buffer_create_tag(textBuffer, tagColorRed,   pangoPropertyColor,     gdkColorRed)
    gtk_text_buffer_create_tag(textBuffer, tagColorGreen, pangoPropertyColor,     gdkColorGreen)
    
    If ExamineRegularExpression(0, tempText)
      
      While NextRegularExpressionMatch(0)
        
        If lenDiff = 0
          lenDiff = 1
        Else
          lenDiff + 3
        EndIf
        
        If RegularExpressionMatchString(0) = startBracket+tagItalic+endBracket And startPosI <= 0
          
          startPosI = RegularExpressionMatchPosition(0) - lenDiff
          
        ElseIf RegularExpressionMatchString(0) = startBracket+tagItalic+endBracket And startPosI > 0
          
          endPosI = RegularExpressionMatchPosition(0) - lenDiff
          
          gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosI)
          gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, endPosI)
          gtk_text_buffer_apply_tag_by_name(textBuffer, tagItalic, @startIter, @endIter)
          
          startPosI = 0
    
        ElseIf RegularExpressionMatchString(0) = startBracket+tagUnderline+endBracket And startPosU <= 0
          
          startPosU = RegularExpressionMatchPosition(0) - lenDiff
          
        ElseIf RegularExpressionMatchString(0) = startBracket+tagUnderline+endBracket And startPosU > 0
          
          endPosU = RegularExpressionMatchPosition(0) - lenDiff
          
          gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosU)
          gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, endPosU)
          gtk_text_buffer_apply_tag_by_name(textBuffer, tagUnderline, @startIter, @endIter)
          
          startPosU = 0
    
        ElseIf RegularExpressionMatchString(0) = startBracket+tagBold+endBracket And startPosB <= 0
          
          startPosB = RegularExpressionMatchPosition(0) - lenDiff
          
        ElseIf RegularExpressionMatchString(0) = startBracket+tagBold+endBracket And startPosB > 0
          
          endPosB = RegularExpressionMatchPosition(0) - lenDiff
          
          gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosB)
          gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, endPosB)
          gtk_text_buffer_apply_tag_by_name(textBuffer, tagBold, @startIter, @endIter)
          
          startPosB = 0
    
        ElseIf RegularExpressionMatchString(0) = startBracket+tagColorRed+endBracket And startPosR <= 0
          
          startPosR = RegularExpressionMatchPosition(0) - lenDiff
          
        ElseIf RegularExpressionMatchString(0) = startBracket+tagColorRed+endBracket And startPosR > 0
          
          endPosR = RegularExpressionMatchPosition(0) - lenDiff
          
          gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosR)
          gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, endPosR)
          gtk_text_buffer_apply_tag_by_name(textBuffer, tagColorRed, @startIter, @endIter)
          
          startPosR = 0
    
        ElseIf RegularExpressionMatchString(0) = startBracket+tagColorGreen+endBracket And startPosG <= 0
          
          startPosG = RegularExpressionMatchPosition(0) - lenDiff
          
        ElseIf RegularExpressionMatchString(0) = startBracket+tagColorGreen+endBracket And startPosG > 0
          
          endPosG = RegularExpressionMatchPosition(0) - lenDiff
          
          gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosG)
          gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, endPosG)
          gtk_text_buffer_apply_tag_by_name(textBuffer, tagColorGreen, @startIter, @endIter)
          
          startPosG = 0
    
        EndIf
        
      Wend
      
    EndIf
    
    FreeRegularExpression(0)
    
  EndIf
  
  lenDiff = Len(Text)-1
  
  If startPosI > 0 And endPosI = 0
    gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosI)
    gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, lenDiff)
    gtk_text_buffer_apply_tag_by_name(textBuffer, tagItalic, @startIter, @endIter)
  EndIf
  
  If startPosU > 0 And endPosU = 0
    gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosU)
    gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, lenDiff)
    gtk_text_buffer_apply_tag_by_name(textBuffer, tagUnderline, @startIter, @endIter)
  EndIf
  
  If startPosB > 0 And endPosB = 0
    gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosB)
    gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, lenDiff)
    gtk_text_buffer_apply_tag_by_name(textBuffer, tagBold, @startIter, @endIter)
  EndIf
  
  If startPosR > 0 And endPosR = 0
    gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosR)
    gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, lenDiff)
    gtk_text_buffer_apply_tag_by_name(textBuffer, tagColorRed, @startIter, @endIter)
  EndIf
  
  If startPosG > 0 And endPosG = 0
    gtk_text_buffer_get_iter_at_offset_(textBuffer, @startIter, startPosG)
    gtk_text_buffer_get_iter_at_offset_(textBuffer, @endIter, lenDiff)
    gtk_text_buffer_apply_tag_by_name(textBuffer, tagColorGreen, @startIter, @endIter)
  EndIf
  
EndProcedure



If OpenWindow(0, 0, 0, 600, 300, "EditTest", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  EditorGadget(0, 10, 10, 580, 280)
EndIf

AddFormatedText(0, "Dies ist [b]fetter Text[b] und der folgende ist [u]unterstrichen[u]."+#LF$+#LF$+"Nun folgt noch [i]Italic[i]."+#LF$+#LF$+"Und jetzt noch ein [r]dunkel roter Text[r]."+#LF$+#LF$+"[g][b]Dieser Text soll nun fett und grün sein![b][g] Und jetzt wieder normal.")

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

End
Die Procedur macht das was ich benötige und ist zunächst ausreichend. Ich denke aber es gibt hier viel Spielraum für Optimierung und Erweiterung, wenn also jemand Spaß daran hat, ich bin gespannt.
---
Windows 11 (64 bit)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: EditGadget und RichText (Teil 2) Lösungsansatz

Beitrag von ts-soft »

Jetzt noch UTF-8 und dieses blöde As weg:

Code: Alles auswählen

ImportC ""
   gtk_text_buffer_create_tag(*buffer.GtkTextBuffer, tag_name.p-utf8, first_property_name.p-utf8, tag_value, null = 0)
   gtk_text_buffer_apply_tag_by_name(*buffer.GtkTextBuffer, name.p-utf8, *start, *end)
EndImport   
So ist es richtig. Das mit dem As hab ich gemacht, weil das manchmal Probleme mit 64-Bit macht und
in diesem Falle vollkommen unnötig.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Makke
Beiträge: 156
Registriert: 24.08.2011 18:00
Computerausstattung: AMD Ryzen 7 5700X - AMD Radeon RX 6800 XT - 32 GB DDR4 SDRAM
Wohnort: Ruhrpott
Kontaktdaten:

Re: EditGadget und RichText (Teil 2) Lösungsansatz

Beitrag von Makke »

Hm mit ASCII funktioniert es (Linux 64bit). Wenn ich mir die Hilfe zu PB, Abschnitt Unicode und dort der Passus zu UTF-8 durchlese:
Ein Nachteil ist seine variable Länge, wodurch alle String-Operationen langsamer ausgeführt werden, aufgrund der notwendigen Vorverarbeitung ("Pre-Processing") zum ausfindig machen eines Zeichens im Text.
Schmeckt das ganze nach UTF-8 ist langsamer als ASCII und da in dem Code die Funktion sehr häufig aufgerufen wird, erscheint es mir besser bei ASCII zu verbleiben.
---
Windows 11 (64 bit)
Antworten