How to setup pango markup attribute for tree view column?

Linux specific forum
uwekel
Enthusiast
Enthusiast
Posts: 740
Joined: Sat Dec 03, 2011 5:54 pm
Location: Oldenburg (Germany)

How to setup pango markup attribute for tree view column?

Post by uwekel »

Hi,

after spending some hours without any solution, i have to ask here :-(

I am trying to setup the pango markup attribute for a tree view column. Unfortunately, i cannot get it to work. What i have so far:

Code: Select all

If OpenWindow(0, 0, 0, 400, 400, "Test", #PB_Window_SystemMenu | #PB_Window_SizeGadget)
  
  ListIconGadget(0, 0, 0, 400, 400, "Text", 300)
  
  ;add two sample rows, one with pango markup
  AddGadgetItem(0, -1, "One")
  AddGadgetItem(0, -1, "<b>Bold</b>")
  
  *tree = GadgetID(0)
  *column = gtk_tree_view_get_column_(*tree, 0)
  *renderers = gtk_tree_view_column_get_cell_renderers_(*column)
  ;first column has a pixbuf and a text renderer, so we have to use index 1
  *renderer.GtkCellRendererText = g_list_nth_data_(*renderers, 1)
  
  ;setting the markup property does not work
  gtk_tree_view_column_add_attribute_(*column, *renderer, "markup", 1)

  ;even re-creating the normal text attribute does not work
  ;gtk_tree_view_column_clear_attributes_(*column, *renderer)
  ;gtk_tree_view_column_add_attribute_(*column, *renderer, "text", 1)
    
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
I think, it is just a little problem or misunderstanding, but i am stuck to that. Maybe someone has done something similar and can help.

Best regards
Uwe
PB 5.70 LTS (x64) - Debian Testing, Gnome 3.30.2
User avatar
Shardik
Addict
Addict
Posts: 1989
Joined: Thu Apr 21, 2005 2:38 pm
Location: Germany

Re: How to setup pango markup attribute for tree view column

Post by Shardik »

Unfortunately I also wasn't able to utilize the pango "markup" attribute. But perhaps you may take a look into my workaround which uses a cell data callback to delete the markup tags during rendering and set the tagged cell text to bold:

Code: Select all

EnableExplicit

#BoldColumn = 0
#PANGO_WEIGHT_BOLD = 700

ImportC ""
  g_object_set(*Object.GtkObject, PropertyName.P-UTF8, PropertyValue.I, Terminator.I = 0)
  g_type_check_instance_is_a(*Instance.GTypeInstance, *Type.GTypeClass)
EndImport

ProcedureC ColumnRenderingCallback(*Column.GtkTreeViewColumn, *Renderer.GtkCellRenderer, *Model, *Iter.GtkTreeIter, *UserData)
  Protected CellText.S
  Protected StrippedText.S
  Protected Row = Val(PeekS(gtk_tree_model_get_string_from_iter_(gtk_tree_view_get_model_(GadgetID(0)), *Iter), -1, #PB_UTF8))

  CellText = GetGadgetItemText(0, Row, #BoldColumn)

  If Left(CellText, 3) = "<b>"
    StrippedText = ReplaceString(CellText, "<b>", "")
    StrippedText = ReplaceString(StrippedText, "</b>", "")
    g_object_set(*Renderer, "text", @StrippedText)
    g_object_set(*Renderer, "weight", #PANGO_WEIGHT_BOLD)
    g_object_set(*Renderer, "weight-set", #True)
  Else
    g_object_set(*Renderer, "weight-set", #False)
  EndIf
EndProcedure

Define Column.I
Define i.I
Define Renderer.I
Define RendererList.I

OpenWindow(0, 100, 100, 430, 118, "Display bold text in tagged cells")
ListIconGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20, "Name", 120, #PB_ListIcon_GridLines)
AddGadgetColumn(0, 1, "Address", GadgetWidth(0) - GetGadgetItemAttribute(0, 0, #PB_ListIcon_ColumnWidth) - 30)
AddGadgetItem(0, -1, "Harry Rannit" + #LF$ + "12 Parliament Way, Battle Street, By the Bay")
AddGadgetItem(0, -1, "<b>Ginger Brokeit</b>" + #LF$ + "130 PureBasic Road, BigTown, CodeCity")
AddGadgetItem(0, -1, "Didi Foundit" + #LF$ + "321 Logo Drive, Mouse House, Downtown")

Column = gtk_tree_view_get_column_(GadgetID(0), #BoldColumn)
RendererList = gtk_tree_view_column_get_cell_renderers_(Column)
Renderer = g_list_nth_data_(RendererList, 1)

For i = 0 To g_list_length_(RendererList) - 1
  Renderer = g_list_nth_data_(RendererList, i)

  If g_type_check_instance_is_a(Renderer, gtk_cell_renderer_text_get_type_())
    Break
  EndIf
Next i

If Renderer
  gtk_tree_view_column_set_cell_data_func_(Column, Renderer, @ColumnRenderingCallback(), 0, 0)
EndIf

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
User avatar
Shardik
Addict
Addict
Posts: 1989
Joined: Thu Apr 21, 2005 2:38 pm
Location: Germany

Re: How to setup pango markup attribute for tree view column

Post by Shardik »

OK, I have found a solution. But it still requires a column renderer callback. Please try the following example which now displays the surname in row 1 column 0 (marked by tags) in bold while leaving the first name in the same cell unchanged:

Code: Select all

EnableExplicit

#BoldColumn = 0

ImportC ""
  g_object_set(*Object.GtkObject, PropertyName.P-UTF8, PropertyValue.I, Terminator.I = 0)
  g_type_check_instance_is_a(*Instance.GTypeInstance, *Type.GTypeClass)
EndImport

ProcedureC ColumnRenderingCallback(*Column.GtkTreeViewColumn, *Renderer.GtkCellRenderer, *Model, *Iter.GtkTreeIter, *UserData)
  Protected CellText.S
  Protected CellTextUTF8.S
  Protected Row.I

  Row = Val(PeekS(gtk_tree_model_get_string_from_iter_(*Model, *Iter), -1, #PB_UTF8))
  CellText = GetGadgetItemText(0, Row, #BoldColumn)
  CellTextUTF8 = Space(StringByteLength(CellText, #PB_UTF8))
  PokeS(@CellTextUTF8, CellText, -1, #PB_UTF8)
  g_object_set(*Renderer, "markup", @CellTextUTF8)
EndProcedure

Define Column.I
Define i.I
Define Renderer.I
Define RendererList.I

OpenWindow(0, 100, 100, 430, 118, "Display bold text in tagged cells")
ListIconGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 20, "Name", 120, #PB_ListIcon_GridLines)
AddGadgetColumn(0, 1, "Address", GadgetWidth(0) - GetGadgetItemAttribute(0, 0, #PB_ListIcon_ColumnWidth) - 30)
AddGadgetItem(0, -1, "Harry Rannit" + #LF$ + "12 Parliament Way, Battle Street, By the Bay")
AddGadgetItem(0, -1, "Ginger <b>Brokeit</b>" + #LF$ + "130 PureBasic Road, BigTown, CodeCity")
AddGadgetItem(0, -1, "Didi Foundit" + #LF$ + "321 Logo Drive, Mouse House, Downtown")

Column = gtk_tree_view_get_column_(GadgetID(0), #BoldColumn)
RendererList = gtk_tree_view_column_get_cell_renderers_(Column)
Renderer = g_list_nth_data_(RendererList, 1)

For i = 0 To g_list_length_(RendererList) - 1
  Renderer = g_list_nth_data_(RendererList, i)

  If g_type_check_instance_is_a(Renderer, gtk_cell_renderer_text_get_type_())
    Break
  EndIf
Next i

g_list_free_(RendererList)

If Renderer
  gtk_tree_view_column_set_cell_data_func_(Column, Renderer, @ColumnRenderingCallback(), 0, 0)
EndIf

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Last edited by Shardik on Thu Oct 30, 2014 1:19 pm, edited 3 times in total.
uwekel
Enthusiast
Enthusiast
Posts: 740
Joined: Sat Dec 03, 2011 5:54 pm
Location: Oldenburg (Germany)

Re: How to setup pango markup attribute for tree view column

Post by uwekel »

Hello Shardik,

thank you for your help - it looks pretty good!

Do you know that it works only in ascii mode? If you switch to unicode mode, only the first letter of the cell text will be drawn. I have no idea why :-(

Best regards
Uwe
PB 5.70 LTS (x64) - Debian Testing, Gnome 3.30.2
User avatar
Shardik
Addict
Addict
Posts: 1989
Joined: Thu Apr 21, 2005 2:38 pm
Location: Germany

Re: How to setup pango markup attribute for tree view column

Post by Shardik »

uwekel wrote:Do you know that it works only in ascii mode? If you switch to unicode mode, only the first letter of the cell text will be drawn. I have no idea why :-(
Sorry for not having tested in Unicode mode. I have modified my last example to work in ASCII and Unicode mode... :wink:
uwekel
Enthusiast
Enthusiast
Posts: 740
Joined: Sat Dec 03, 2011 5:54 pm
Location: Oldenburg (Germany)

Re: How to setup pango markup attribute for tree view column

Post by uwekel »

Hello Shardik,

thank you again! You are really clever :-)
This is exactly what i needed.

Best regards
Uwe
PB 5.70 LTS (x64) - Debian Testing, Gnome 3.30.2
Post Reply