Seite 1 von 2

Re: editorgadget scrollen (gelöst)

Verfasst: 19.05.2011 19:44
von Shardik
Ich habe mein Beispiel von oben jetzt auch noch für den Einsatz unter
MacOS X erweitert:

Code: Alles auswählen

CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
  ImportC ""
    RevealDataBrowserItem(ControlRef.L, ItemID.L, PropertyID.L, RevealOptions.L)
  EndImport
CompilerEndIf

OpenWindow(0, 200, 100, 140, 150, "ListView", #PB_Window_SystemMenu)
ListIconGadget(0, 5, 5, WindowWidth(0) - 10, WindowHeight(0) - 40, "Spalte 1", 70)
SpinGadget(1, 5, WindowHeight(0) - 30, 50, 25, 1, 50)
SetGadgetState(1, 1)
SetGadgetText(1, Str(GetGadgetState(1)))
ButtonGadget(2, 60, WindowHeight(0) - 30, 70, 25, "Anzeigen")

For i= 1 To 50
  AddGadgetItem(0, -1, "Zeile " + Str(i))
Next

Repeat
  Event = WaitWindowEvent()

  If Event = #PB_Event_Gadget
    Select EventGadget()
      Case 1
        SetGadgetText(1, Str(GetGadgetState(1)))
      Case 2
        CompilerSelect #PB_Compiler_OS
          CompilerCase #PB_OS_Linux
            gtk_tree_view_scroll_to_point_(GadgetID(0), -1, (GetGadgetState(1) - 1) * 22 - 20)
          CompilerCase #PB_OS_MacOS
            RevealDataBrowserItem(GadgetID(0), GetGadgetState(1), 0, 1)
          CompilerCase #PB_OS_Windows
            SendMessage_(GadgetID(0), #LVM_ENSUREVISIBLE, GetGadgetState(1), #True)
        CompilerEndSelect
    EndSelect
  EndIf
Until Event = #PB_Event_CloseWindow

Re: editorgadget scrollen (gelöst)

Verfasst: 19.11.2015 19:28
von Kukulkan
Hallo,

das ist fast genau das was ich auch cross-platform benötige. Allerdings muss ich vorher noch die Positionen ermitteln, damit ich bei einem Restart des Programms an exakt die selbe Position scrollen kann. Hat jemand auch dazu die passenden Befehle um die Position zu ermitteln? Selbst in der GTK Doku finde ich die Funktion, aber kein Gegenstück um die Position zu ermitteln...

Danke,

Kukulkan

Re: editorgadget scrollen (gelöst)

Verfasst: 19.11.2015 21:35
von Omi
Hallo Kukulkan,
betrifft Deine Ansinnen das Editor- oder das ListIconGadget?

Fürs ListIconGadget kann man (zumindest in gtk2) das Adjustment (Slider) abfragen und setzen
Ein Rohling ohne Funktion ...

Code: Alles auswählen

ImportC ""
	gtk_adjustment_get_value.d(*adjustment.GtkAdjustment)
	gtk_adjustment_set_value(*adjustment.GtkAdjustment, value.d)
EndImport

Define *adjust.GtkAdjustment
Define vOffs.d
;holt das vertikale Adjustment ...
*adjust= gtk_tree_view_get_vadjustment_(GadgetID(ListIconGadget))
;holt die vert. Sliderstellung als double ...
vOffs= gtk_adjustment_get_value(*adjust)
;setzt die vert. Sliderstellung als double ...
gtk_adjustment_set_value(*adjust, vOffs)
In gtk3 läuft das Ganze nochmal über die Zwischenschicht GtkScrollable.

Falls der Rohling nicht reicht bastele ich Dir mal ein kleines Beispiel.

Gruß Charly

Re: editorgadget scrollen (gelöst)

Verfasst: 20.11.2015 09:03
von Kukulkan
Hallo Omi,

damit komm ich schonmal klar. Danke! :allright:

Jetzt noch für MacOS, dann hab ich es fast zusammen. Die API für Windows hab ich schon gefunden.

Re: editorgadget scrollen (gelöst)

Verfasst: 24.11.2015 15:49
von Shardik
Kukulkan hat geschrieben:Allerdings muss ich vorher noch die Positionen ermitteln, damit ich bei einem Restart des Programms an exakt die selbe Position scrollen kann. Hat jemand auch dazu die passenden Befehle um die Position zu ermitteln?
Ich hatte im englischen Forum bereits einmal ein Beispiel von Blue, das unter Windows die oberste sichtbare Zeile in einem ListViewGadget ermittelt, um den Linux- und Mac-spezifischen Teil erweitert:
http://www.purebasic.fr/english/viewtop ... 25&start=6

Für ein ListIconGadget muß in der dort gezeigten Prozedur GetVisibleTopRow() lediglich für Windows in der SendMessage_()-Funktion die Konstante #LB_GETTOPINDEX (ListBox bei Microsoft, ListViewGadget bei PureBasic) gegen #LVM_GETTOPINDEX (ListView bei Microsoft, ListIconGadget bei PureBasic) ausgetauscht werden.

Ich habe trotzdem noch einmal ein komplett neues Beispiel erstellt, das bei Betätigen der Schaltfläche "Get current top row" im Fenstertitel die Zeilennummer der obersten sichtbaren Zeile anzeigt. Zu beachten ist, dass - wie in meinem englischen Posting erwähnt - betriebssystembedingt bei Linux und MacOS als oberste Zeile auch eine oberste Zeile angegeben wird, die nur teilweise sichtbar ist. Wenn man nur die Zeilennummer der obersten voll sichtbaren Zeile haben möchte, müßte man die Zeilennummer bei Linux und MacOS entsprechend aufrunden.

Ich habe das Beispiel erfolgreich unter folgenden Betriebssystemen getestet:
- MacOS X 10.6.8 (Snow Leopard)
- Ubuntu 12.04 x64 mit KDE (Gtk2 und Gtk3)
- Windows 7 x64 SP1

Code: Alles auswählen

CompilerIf #PB_Compiler_OS = #PB_OS_Linux
  ImportC ""
    gtk_tree_view_get_visible_range(*TreeView.GtkTreeView, *StartPath, *EndPath)
  EndImport
CompilerEndIf

Procedure.I GetVisibleTopRow(ListIconID.I)
  Protected VisibleTopRow.I

  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Linux
      Protected *EndPath
      Protected *StartPath

      If gtk_tree_view_get_visible_range(GadgetID(ListIconID), @*StartPath, @*EndPath)
        VisibleTopRow = PeekI(gtk_tree_path_get_indices_(*StartPath))
        gtk_tree_path_free_(*StartPath)
        gtk_tree_path_free_(*EndPath)
      EndIf
    CompilerCase #PB_OS_MacOS
      Protected ContentView.I
      Protected EnclosingScrollView.I
      Protected VisibleRange.NSRange
      Protected VisibleRect.NSRect
      
      ; ----- Get scroll view inside of ListIconGadget
      EnclosingScrollView = CocoaMessage(0, GadgetID(ListIconID), "enclosingScrollView")
      
      If EnclosingScrollView
        ContentView = CocoaMessage(0, EnclosingScrollView, "contentView")
        ; ----- Get visible area
        ;       (automatically subtract horizontal scrollbar if shown)
        CocoaMessage(@VisibleRect, ContentView, "documentVisibleRect")
        ; ----- Subtract border width
        If CocoaMessage(0, EnclosingScrollView, "borderType") > 0
          VisibleRect\size\height - 5
        EndIf
        ; ----- Get visible top row
        CocoaMessage(@VisibleRange, GadgetID(ListIconID), "rowsInRect:@", @VisibleRect)
        VisibleTopRow = Int(VisibleRange\location)
      EndIf
    CompilerCase #PB_OS_Windows
      VisibleTopRow = SendMessage_(GadgetID(ListIconID), #LVM_GETTOPINDEX, 0, 0)
  CompilerEndSelect

  ProcedureReturn VisibleTopRow
EndProcedure

OpenWindow(0, 100, 100, 200, 155, "")
ListIconGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 55, "Column 1",
  100)
ButtonGadget(1, 10, WindowHeight(0) - 35, WindowWidth(0) - 20, 25,
  "Get current top row")

For i = 1 To 50
  AddGadgetItem(0, -1, "Item " + Str(i))
Next i

SetWindowTitle(0, "Top row: " + Str(GetVisibleTopRow(0) + 1))

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      If EventGadget() = 1
        SetWindowTitle(0, "Top row: " + Str(GetVisibleTopRow(0) + 1))
      EndIf
  EndSelect
ForEver

Re: editorgadget scrollen (gelöst)

Verfasst: 24.11.2015 16:06
von Kukulkan
Hallo Shardik,

Super, DANKE! :allright: <)

Re: editorgadget scrollen (gelöst)

Verfasst: 24.11.2015 16:32
von NeoChris
Warum heisst Listicongadget Listview und ListViewGadget Listbox? Warum so verdreht? Warum nicht einheitlich Listbox = Listboxgadget und Listview = Listviewgadget ?
Wie kam man den überhaupt auf diese Idee mit den Bezeichnungen? Hat das einen bestimmten Grund? Heisst auf Linux diese gtk Controls so? oder beim Macintosh? :?

Re: editorgadget scrollen (gelöst)

Verfasst: 17.08.2017 09:59
von NeoChris
Ich warte schon so lange auf eine Antwort und fast jeden Tag schau ich rein aber immer noch keine Antwort. Weiss den keiner warum das so is?

Re: editorgadget scrollen (gelöst)

Verfasst: 17.08.2017 11:06
von NicTheQuick
Nein. :wink:

Re: editorgadget scrollen (gelöst)

Verfasst: 02.09.2017 08:42
von GPI
NeoChris hat geschrieben:Ich warte schon so lange auf eine Antwort und fast jeden Tag schau ich rein aber immer noch keine Antwort. Weiss den keiner warum das so is?
Vermutlich historisch begründet. Ich würde auf die Amiga-Version tippen. Möglich das es dort "gedreht" ist.