Cross-platform column justification of ListIconGadget
Re: Cross-platform column justification of ListIconGadget
PureBasic 6.01 LTS 64 bit | Windows 10 Pro x64 | Intel(R) Core(TM) i7-8700 CPU @ 3.20Ghz 16 GB RAM, SSD 500 GB, PC locally assembled
- Kwai chang caine
- Always Here
- Posts: 5357
- Joined: Sun Nov 05, 2006 11:42 pm
- Location: Lyon - France
Re: Cross-platform column justification of ListIconGadget
I have not see this code
Thanks SHARDIK for sharing
A little bit late
Thanks SHARDIK for sharing
A little bit late
The happiness is a road...
Not a destination
Not a destination
Re: Cross-platform column justification of ListIconGadget
My last cross-platform code example is from 2012 and therefore still contains MacOS code for the Carbon framework. The last PureBasic version which is able to run this code example on MacOS is PB 5.11 with subsystem "Carbon". Although I already posted this link inside this thread to a Cocoa solution, for your convenience I have now replaced the Carbon part by the linked Cocoa part so that this example is now working with current PB versions on MacOS (tested successfully on MacOS 10.6.8 'Snow Leopard' with PB 5.44 x86 in both ASCII and Unicode mode and on MacOS 10.9.5 'Mavericks' with PB 5.44 x86 and x64 in both ASCII and Unicode mode).
Furthermore I have included Charly's suggested change in order to be able to run the example on Linux with both GTK2 and GTK3 (Thank you for that hint, Charly!).
Update: I have added the corrected GTK API function gtk_tree_view_column_set_alignment(*TreeColumn, Alignment.F) to the Linux ImportC block because the predefined PureBasic function declares incorrectly Alignment as Integer which resulted in missing header alignment when run on Linux. Thank you to eck49 for reporting the problem!
Furthermore I have included Charly's suggested change in order to be able to run the example on Linux with both GTK2 and GTK3 (Thank you for that hint, Charly!).
Code: Select all
EnableExplicit
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
ImportC ""
g_object_set_double(*Object, Property.P-ASCII, Value.D,
Null) As "g_object_set"
gtk_cell_layout_get_cells(*CellLayout)
gtk_tree_view_column_set_alignment(*TreeColumn.GtkTreeViewColumn,
Alignment.F)
EndImport
CompilerEndSelect
Enumeration
#PB_ListIcon_JustifyColumnLeft
#PB_ListIcon_JustifyColumnCenter
#PB_ListIcon_JustifyColumnRight
EndEnumeration
Procedure SetListIconColumnJustification(ListIconID.I, Column.I, Alignment.I)
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
Protected AlignmentFactor.F
Protected *CellRenderers
Protected *Column
Protected Count.I
Protected i.I
Select Alignment
Case #PB_ListIcon_JustifyColumnLeft
AlignmentFactor = 0.0
Case #PB_ListIcon_JustifyColumnCenter
AlignmentFactor = 0.5
Case #PB_ListIcon_JustifyColumnRight
AlignmentFactor = 1.0
EndSelect
*Column = gtk_tree_view_get_column_(GadgetID(ListIconID), Column)
If *Column
gtk_tree_view_column_set_alignment(*Column, AlignmentFactor)
*CellRenderers = gtk_cell_layout_get_cells(*Column)
If *CellRenderers
Count = g_list_length_(*CellRenderers)
For i = 0 To Count - 1
g_object_set_double(g_list_nth_data_(*CellRenderers, i), "xalign",
AlignmentFactor, #Null)
Next i
g_list_free_(*CellRenderers)
EndIf
EndIf
CompilerCase #PB_OS_MacOS
Protected ColumnHeaderCell.I
Protected ColumnObject.I
Protected ColumnObjectArray.I
Select Alignment
Case #PB_ListIcon_JustifyColumnLeft
Alignment = #NSLeftTextAlignment
Case #PB_ListIcon_JustifyColumnCenter
Alignment = #NSCenterTextAlignment
Case #PB_ListIcon_JustifyColumnRight
Alignment = #NSRightTextAlignment
EndSelect
; ----- Justify text of column cells
CocoaMessage(@ColumnObjectArray, GadgetID(ListIconID), "tableColumns")
CocoaMessage(@ColumnObject, ColumnObjectArray, "objectAtIndex:", Column)
CocoaMessage(0, CocoaMessage(0, ColumnObject, "dataCell"), "setAlignment:", Alignment)
; ----- Justify text of column header
CocoaMessage(@ColumnHeaderCell, ColumnObject, "headerCell")
CocoaMessage(0, ColumnHeaderCell, "setAlignment:", Alignment)
; ----- Redraw ListIcon contents to see change
CocoaMessage(0, GadgetID(ListIconID), "reloadData")
CompilerCase #PB_OS_Windows
Protected ListIconColumn.LV_COLUMN
ListIconColumn\mask = #LVCF_FMT
Select Alignment
Case #PB_ListIcon_JustifyColumnLeft
ListIconColumn\fmt = #LVCFMT_LEFT
Case #PB_ListIcon_JustifyColumnCenter
ListIconColumn\fmt = #LVCFMT_CENTER
Case #PB_ListIcon_JustifyColumnRight
ListIconColumn\fmt = #LVCFMT_RIGHT
EndSelect
SendMessage_(GadgetID(ListIconID), #LVM_SETCOLUMN, Column, @ListIconColumn)
CompilerEndSelect
EndProcedure
OpenWindow(0, 200, 100, 445, 90, "Right justify 1st column")
ListIconGadget(0, 5, 5, 435, 80, "Name", 110)
AddGadgetColumn(0, 1, "Address", 300)
AddGadgetItem(0, -1, "Harry Rannit" + #LF$ + "12 Parliament Way, Battle Street, By the Bay")
AddGadgetItem(0, -1, "Ginger Brokeit" + #LF$ + "130 PureBasic Road, BigTown, CodeCity")
SetListIconColumnJustification(0, 0, #PB_ListIcon_JustifyColumnRight)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Last edited by Shardik on Fri Feb 26, 2021 9:40 pm, edited 2 times in total.
Re: Cross-platform column justification of ListIconGadget
@Shardik
Thanks for this code, which is just what I want, except that the alignment of the headers seems to be displaced. Help!
Linux, Ubuntu 16.04 not sure which gtk flavour, PB 5.70.
Using the code from the 2/2/2017 post in this thread, but adapting the test code at the bottom to this
(In each case the last column, col3, is just a dummy to guarantee the whole of col2 is visible).
The listicon headers are justified thus:
Upper col0 Left, cols 1&2 Centre
Lower col0 Centre col1 Right and the header text for col2 is nowhere to be seen.
If I change the order of the second set of calls to the natural order, 0,1,2 instead of 2,1,0 both listicons are affected.
Upper col0 Left, col1 Right, col2 Centre
Lower col0 Left, col1 Left, col2 Centre
In every case the data items are aligned as intended, it is only the headers which are not.
The C importation is beyond my ken. Help!
Thanks for this code, which is just what I want, except that the alignment of the headers seems to be displaced. Help!
Linux, Ubuntu 16.04 not sure which gtk flavour, PB 5.70.
Using the code from the 2/2/2017 post in this thread, but adapting the test code at the bottom to this
Code: Select all
OpenWindow(0, 200, 100, 999, 350, "Show Listicon justifications")
ListIconGadget(0, 5, 5, 835, 80, "Name", 110)
AddGadgetColumn(0, 1, "Address", 350)
AddGadgetColumn(0, 2, "Phone", 200)
AddGadgetColumn(0, 3, "--", 20)
AddGadgetItem(0, -1, "Harry Rannit" + #LF$ + "12 Parliament Way, Battle Street, By the Bay" + #LF$ + "45678")
AddGadgetItem(0, -1, "Ginger Brokeit" + #LF$ + "130 PureBasic Road, BigTown, CodeCity" + #LF$ + "678 998")
SetListIconColumnJustification(0, 0, #PB_ListIcon_JustifyColumnRight)
SetListIconColumnJustification(0, 1, #PB_ListIcon_JustifyColumnCenter)
SetListIconColumnJustification(0, 2, #PB_ListIcon_JustifyColumnLeft)
ListIconGadget(1, 5, 100, 835, 80, "Who", 110)
AddGadgetColumn(1, 1, "Where", 350)
AddGadgetColumn(1, 2, "Number", 200)
AddGadgetColumn(1, 3, "--", 20)
AddGadgetItem(1, -1, "Roger Bodgedit" + #LF$ + "999 Duff Place, Codswallop" + #LF$ + "07777 45678")
AddGadgetItem(1, -1, "Fred Fixedit" + #LF$ + "White House, NotThatOne, Gleeful" + #LF$ + "Fortify 245")
SetListIconColumnJustification(1, 2, #PB_ListIcon_JustifyColumnRight)
SetListIconColumnJustification(1, 1, #PB_ListIcon_JustifyColumnCenter)
SetListIconColumnJustification(1, 0, #PB_ListIcon_JustifyColumnLeft)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
The listicon headers are justified thus:
Upper col0 Left, cols 1&2 Centre
Lower col0 Centre col1 Right and the header text for col2 is nowhere to be seen.
If I change the order of the second set of calls to the natural order, 0,1,2 instead of 2,1,0 both listicons are affected.
Upper col0 Left, col1 Right, col2 Centre
Lower col0 Left, col1 Left, col2 Centre
In every case the data items are aligned as intended, it is only the headers which are not.
The C importation is beyond my ken. Help!
Ubuntu 22.04 64-bit
Purebasic 6.00 (as of 5 Sep 2022)
(native tongue: English)
Purebasic 6.00 (as of 5 Sep 2022)
(native tongue: English)
Re: Cross-platform column justification of ListIconGadget
You are right. The problem is a wrong internal declaration in PureBasic of the GTK API function gtk_tree_view_column_set_alignment_(*TreeColumn, xalign). Alignment has to be declared as Float in order to work correctly.eck49 wrote:Thanks for this code, which is just what I want, except that the alignment of the headers seems to be displaced. Help!
I have therefore changed my above code example from 02.02.2017 accordingly and added the corrected GTK API function gtk_tree_view_column_set_alignment(*TreeColumn, Alignment.F) to the ImportC block.
Re: Cross-platform column justification of ListIconGadget
Late to the party, but thank you Shardik for your cross-platform alignment code (both here, and elsewhere for TextGadgets) - exactly what I needed. Good work !
Re: Cross-platform column justification of ListIconGadget
You are welcome!pierre2 wrote:Late to the party, but thank you Shardik for your cross-platform alignment code (both here, and elsewhere for TextGadgets) - exactly what I needed. Good work !
Re: Cross-platform column justification of ListIconGadget
Using Linux Mint 21 Vannessa Mate, when I compile I get this message:
gtk_tree_view_column_set_alignment() is not a function, array, list, map or macro.
Is anyone able to point me in the right direction, please ?
gtk_tree_view_column_set_alignment() is not a function, array, list, map or macro.
Is anyone able to point me in the right direction, please ?
Re: Cross-platform column justification of ListIconGadget
My Projects ThreadToGUI / OOP-BaseClass / EventDesigner V3
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
PB v3.30 / v5.75 - OS Mac Mini OSX 10.xx - VM Window Pro / Linux Ubuntu
Downloads on my Webspace / OneDrive
Re: Cross-platform column justification of ListIconGadget
Same thing, I'm afraid, with or without the ImportC.
Re: Cross-platform column justification of ListIconGadget
@Shardik: Can I include your code from above into the next version of my LIGEnhancements-module (with a proper comment about its origin, of course)? The module itself only works for Windows right now, but who knows the future...
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Re: Cross-platform column justification of ListIconGadget
Yes, you may include the code into your LIGEnhancemant module. But on MacOS the code currently doesn't work anymore in PB 6.0 and above because Fred changed internals of the ListIconGadget cells. I have almost finished a modified version for MacOS which works both on PB 5.73 and earlier and on PB 6.0 and newer.
Re: Cross-platform column justification of ListIconGadget
Thanks!Shardik wrote: ↑Tue Feb 14, 2023 11:16 amYes, you may include the code into your LIGEnhancemant module. But on MacOS the code currently doesn't work anymore in PB 6.0 and above because Fred changed internals of the ListIconGadget cells. I have almost finished a modified version for MacOS which works both on PB 5.73 and earlier and on PB 6.0 and newer.
Since my module only works on Windows right now...this is a problem for future me/you.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB