TreeGadget GetItemHeight

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
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: TreeGadget GetItemHeight

Beitrag von Shardik »

HeX0R hat geschrieben:Bekommst Du das auch für MacOS hin?

Code: Alles auswählen

EnableExplicit

Define Frame.NSRect

OpenWindow(0, 100, 100, 390, 100,
  "Ermittlung der Zeilenhöhe im TreeViewGadget")
TreeGadget(0, 5, 5, WindowWidth(0) - 10, WindowHeight(0) - 10)
AddGadgetItem(0, -1, "Item 1", 0, 0)
AddGadgetItem(0, -1, "Subitem 1", 0, 1)
AddGadgetItem(0, -1, "Subitem 2", 0, 1)
SetGadgetItemState(0, 0, #PB_Tree_Expanded)

CocoaMessage(@Frame, GadgetID(0), "frameOfOutlineCellAtRow:", 0)
MessageRequester("Info", "Zeilenhöhe: " + StrF(Frame\size\height))

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: TreeGadget GetItemHeight

Beitrag von HeX0R »

Weltklasse!!
Vielen Dank!

MacOS kann ich leider nicht testen, wird aber sicherlich funktionieren.

@Omi: Danke auch an Dich, aber die Lösung von Shardik macht eigentlich genau was ich brauche.

@ccode_new:
Danke wegen der Mühe, aber:
1.) Dein Code hat das Thema verfehlt!
2.) Lass in Zukunft bitte die dämlichen Bemerkungen in Beispielcodes, mir ist das wurscht, andere fühlen sich dadurch vermutlich aber veräppelt.
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: TreeGadget GetItemHeight

Beitrag von Shardik »

Ich habe aus den bisher gezeigten Lösungen ein Cross-Platform Beispiel zusammengebastelt, auf das ich aus einem Posting im englischen Forum, in dem ich alle mir bekannten Cross-Platform API-Beispiele gesammelt habe, verlinke, damit auch Nutzer des internationalen Forums dieses Beispiel nutzen können.

Ich habe dieses Beispiel auf folgenden Betriebssystemen erfolgreich getestet:
- MacOS 10.6.8 'Snow Leopard' mit PB 5.62 x86
- Linux Mint 18.1 'Serena' x64 mit Cinnamon und PB 5.62 x64 (GTK2 und GTK3)
- Windows 7 SP1 x64 mit PB 5.62 x86

Code: Alles auswählen

EnableExplicit

CompilerIf #PB_Compiler_OS = #PB_OS_Linux
  ImportC ""
    gtk_widget_style_get(*Widget.GtkWidget, PropertyName.P-UTF8, *Value, Null)
  EndImport
CompilerEndIf

Procedure GetRowHeight(GadgetID.I)
  Protected RowHeight.I

  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_MacOS
      Protected Frame.NSRect
      CocoaMessage(@Frame, GadgetID(0), "frameOfOutlineCellAtRow:", 0)
      RowHeight = Int(Frame\size\height)
    CompilerCase #PB_OS_Linux
      Protected *Column.GtkTreeViewColumn
      Protected VerticalSeparator.I
      *Column = gtk_tree_view_get_column_(GadgetID(GadgetID), 0)
      gtk_tree_view_column_cell_get_size_(*Column, 0, 0, 0, 0, @RowHeight)
      gtk_widget_style_get(GadgetID(GadgetID), "vertical-separator",
        @VerticalSeparator, 0)
      RowHeight + VerticalSeparator
    CompilerCase #PB_OS_Windows
      #TVM_GETITEMHEIGHT = 4380
      RowHeight = SendMessage_(GadgetID(GadgetID), #TVM_GETITEMHEIGHT, 0, 0)
  CompilerEndSelect

  ProcedureReturn RowHeight
EndProcedure

OpenWindow(0, 100, 100, 390, 100, "")
TreeGadget(0, 5, 5, WindowWidth(0) - 10, WindowHeight(0) - 10)
AddGadgetItem(0, -1, "Item 1", 0, 0)
AddGadgetItem(0, -1, "Subitem 1", 0, 1)
AddGadgetItem(0, -1, "Subitem 2", 0, 1)
SetGadgetItemState(0, 0, #PB_Tree_Expanded)

While WindowEvent() : Wend ; Event flush (necessary for Linux)

SetWindowTitle(0, "Row height: " + GetRowHeight(0))

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: TreeGadget GetItemHeight

Beitrag von HeX0R »

Hier sieht man dann auch, wofür ich das benötigt hatte.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: TreeGadget GetItemHeight

Beitrag von ccode_new »

@HeX0R

1. sehr schöner und brauchbarer Dialog-Designer (für xml)

2.
@ccode_new:
Danke wegen der Mühe, aber:
1.) Dein Code hat das Thema verfehlt!
2.) Lass in Zukunft bitte die dämlichen Bemerkungen in Beispielcodes, mir ist das wurscht, andere fühlen sich dadurch vermutlich aber veräppelt.
2.1 Mein Code war ja nur ein kleines Beispiel, wobei ich mich an deinem geschriebenen Text:
Mal kurz zum Problem:
Ich versuche mich an einem TreeGadget mit internem Drag&Drop (also auf sich selbst), möchte dabei aber bestimmte Einträge zum droppen verweigern.
orientiert hatte.

2.2 Gerne können dämliche Kommentare ignoriert werden. Wenn meine unnützen Kommentare "dämlich" sind kann man mir das ruhig an den Kopf werfen.

Ansonsten:
:allright:
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: TreeGadget GetItemHeight

Beitrag von HeX0R »

ccode_new hat geschrieben:@HeX0R

2.1 Mein Code war ja nur ein kleines Beispiel, wobei ich mich an deinem geschriebenen Text:
Mal kurz zum Problem:
Ich versuche mich an einem TreeGadget mit internem Drag&Drop (also auf sich selbst), möchte dabei aber bestimmte Einträge zum droppen verweigern.
orientiert hatte.
Nein, hast du nicht, Du machst es vom zu draggenden Element abhängig (dafür brauchst du nicht mal einen Callback), und schaust nicht welches Element während des draggens unter dem Cursor ist!
Das war ja der Knackpunkt.
Schau dir einfach den Code vom Designer an, dann siehst du den Unterschied.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: TreeGadget GetItemHeight

Beitrag von ccode_new »

Hallo HeX0R,

durch deinen Code ist mir jetzt auch klar was du meintest.

Anbei:
Dein Code hat einen sehr unschönen Darstellungsbug (unter Gtk3).

Du musst die Splitter-Komponente (name=splitter) für Gtk3 noch anpassen.

Unter Gtk3 wird das ganze nämlich absolut grausam dargestellt. (Der Splitter lässt sich zudem auch nicht bewegen.)

Du solltest dabei auch auf Size-Window-Events reagieren.

Da ist noch Anpassung notwendig.

...
Hat hier jemand schon mal mit gtk3 Paned-Controlls direkt gearbeitet:

Splitter
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten