NSBrowser und Gruppierung

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSBrowser und Gruppierung

    Hi Leute,

    ich hab zur Zeit ein Problem, für das mir einfach keine Lösung einfallen will. Ich verwende in meiner App ein NSBrowser, um diverse Daten darzustellen. Jetzt würde ich in jeder Spalte die einzelnen Items gerne Gruppieren, also mit einer jeweiligen Überschrift oder einem Separater versehen. Ähnlich dem Finder in Mountain Lion & Mavericks, wenn man in die Spaltendarstellung wechselt und nach Art gruppiert.

    Mein Problem - ich hab so gar keine Idee, wie das gehen soll. Wo müsste ich ansetzen? Wie kann ich verhindern, dass ein Item im NSBrowser selektiert werden kann (um wenigstens mal Row-Separators einfügen zu können - wäre schonmal ein Anfang)? Wie kann ich die Sache mit dem Header so (oder ähnlich) wie im Finder gestalten? Viele Fragen, keine Antworten. Hab mich schon durch die NSBrowser Doku durchgewühlt. Aber entweder hab ich was wichtiges übersehen, nicht um genug Ecken gedacht oder es geht mit Bordmitteln nicht ohne weiteres.

    Vielleicht hat ja jemand von euch eine Idee oder einen Vorschlag, wie ich nen Schritt weiter kommen kann.

    Danke & Gruß
    Marc
  • Danke für den Hinweis, hilft aber leider auch nicht weiter. Hab da schon alles näher betrachtet, aber es gibt einfach nicht's, womit ich mein Vorhaben so umsetzen kann.

    Allerdings frage ich mich gerade auch, ob ich bei NSBrowser überhaupt richtig bin. Denn die Art von Gruppierung wie ich sie gerne hätte, findet sich nur in NSTableView. Ich frage mich gerade, ob Apple beim Finder in OS X 10.8+ überhaupt einen NSBrowser nutzt, oder ein eigenes Control, was letztlich "nur" eine Kombination aus NSSplitView und NSTableView ist. Oder aber sie verwenden anstelle eines NSMatrix Objektes für die Spalten Instanzen von NSTableView, was der Browser so m. E. aber nicht unterstützen dürfe. Oder nochmals was ganz anderes.

    Tendiere gerade dazu, einen NSBrowser mit Hilfe von Scrollviews / SplitViews selbst zu basteln. Ob das so einfach ist, sei mal dahin gestellt... :rolleyes:

    Gruß Marc
  • Also, einen View-based NSBrowser müsste man ja hinbekommen, wenn ich das alles richtig überflogen habe... damit wärst Du dann schon dichte dran. Als Delegierter kannst Du dann noch toll steuern, wie sich das Ding verhalten soll... natürlich gibt es per se keine Funktionen für die Gruppierung wie im TableView oder OutlineView... aber wie gesagt, dass bekommt man schon auch hin. Was Apple aber verwendet... keine Ahnung.Ich würde es NICHT über geschachtelte SplitViews und Co probieren...

    volker
  • Stimmt, geschachtelte Splitviews wären keine Lösung. Aber ist auch nicht notwendig, da ich ja einem NSSplitView beliebig viele Views anhängen kann, und es immer einen Splitter dazwischen hängt. Vielleicht finde ich ha aber auch einen Weg, ein TableView oder OutlineView dem Browser unterzujubeln, mit denen die Gruppierung elegant lösbar ist. Wäre nicht das schlechteste. Werd dann aber wohl nicht drum herum kommen, eine Sub Klasse von NSBrowser anzulegen.

    Wie dem auch sei - eine Einfache Lösung scheint es nicht zu geben. Wird etwas komplexer das ganze. Schade eigentlich. Fänd es irgendwie nett, wenn Apple da was fertiges gebastelt hätte. :)

    Gruß Marc
  • Naja, so kompliziert ist das nicht. Laut Delegate Dokumetnation sehe ich eien große Chance schnell zum ergebnis zu kommen:

    An active delegate creates a column’s rows (that is, the NSBrowserCells) itself, while a passive one leaves that job to the NSBrowser. Normally, passive delegates are preferable, because they’re easier to implement. An active delegate must implement browser:createRowsForColumn: to create the rows of the specified column.

    Sprich, eigene NSBrowserCells entsprechend des aktiven Delegierten implementieren. Denen kann man doch Eigenschaften geben, die sie als Gruppe oder normalen Eintrag ausweisen...

    Oder täusch ich mich da?

    Volker
  • Ah, jetzt weiß ich was du meinst. Ich verwende bereits eigene Zellen (um z. B. ein Icon vor den Text dazu zu hängen). Das Problem ist nicht, eigene Zellen in NSBrower zu verwenden und je nach flag zu bestimmen wie diese gezeichnet werden, sondern den NSBrowser davon abzuhalten, per Tatstatur oder Maus diese Gruppenzellen nicht zu selektieren bzw. beim Auswählen mit Tastatur zu überbringen.

    Ich schätze mal dass es daran liegt, dass die Darstellung und Verwaltung der Zeilen NSMatrix Instanzen verwendet. Und NSMatrix kennt leider keine Sektionen / Gruppen. Wenn, müsste ich vermutlich eine eigene NSMatrix Klasse verwenden und mich um das ganze Gruppierungs-geraffel selbst kümmern. Damit können aber die Gruppenüberschriften noch nicht am obersten Ende hängen bleiben (wie die Option in NSTableView, welche für "floating section headers" sorgt). Oder aber ich verwende eine eigene Matrix-Instanz, um sie sozusagen als Proxy für eine untergeordnete TableView fungieren zu lassen. Ob das allerdings so klappt...

    Wie gesagt -immer vorausgesetzt dass ich nicht etwas übersehen oder falsch verstanden hab. :)

    Gruß Marc
  • Für die Selektion kannst Du doch aber nen Delegierten verwenden:
    Managing Selection Behavior
    – browser:shouldTypeSelectForEvent:withCurrentSearchString:
    – browser:typeSelectStringForRow:inColumn:
    – browser:nextTypeSelectMatchFromRow:toRow:inColumn:forString:
    Managing Selection
    – browser:selectCellWithString:inColumn:
    – browser:selectRow:inColumn:
    – browser:selectionIndexesForProposedSelection:inColumn:

    Und für die Pfeiltasten notfalls NSBrowsdr subclassen ?!

    Volker
  • Nee, leider auch nicht. Denn die type-Funktionen kümmern sich darum, dass man per Eintippen ein Item selektiert. Als z. B. ein Item hat den Titel "Neuer Ordner" und man fängt an zu Tippen N-e-u und NSBrowser springt zu dem Eintrag. Das lässt sich unterbinden. Die andern Select-Funktionen werden aufgerufen, wenn der NSBrowser das Delegate dazu veranlassen will, einen Eintrag auszuwählen (weil programmatisch eine Zelle ausgewählt werden soll). Hilft leider auch nicht weiter. :(

    Marc
  • Und das Click-Event abfangen um zu verhindern, dass auf einen Gruppen-Header geklickt und er somit ausgewählt wird. Plus das Handling, wenn per Shift+KeyDown mehrere Einträge markiert werden sollen. Wie du siehst, hängt dann doch ne Ecke dran. Ich glaub ich tendiere so langsam doch zu TableViews. Das ist das ganze Gruppen-Header handling schon drinnen, dass ich (auch was die Darstellung angeht) sonst mühsam nach programmieren müsste.

    Muss mir nochmal in Ruhe die NSBrowser-Klasse anschauen und mich eingraben.

    Gruß Marc
  • Vielleicht ist es einfacher, für die Überschriften keine separaten Einträge zu generieren sondern die Überschriften jeweils in der Zelle des ersten Eintrags einer Gruppe zu zeichnen. Ist nicht ganz so schön und macht den Zellencode noch hässlicher, aber man muss fast nichts am Browser oder Delegate ändern. Die Überschriften wären automatisch nicht selektierbar, weil es sie gar nicht wirklich gibt.
    Multigrad - 360°-Produktfotografie für den Mac
  • Nee, ist auch keine Lösung. Nach vielem Hin und Her und diversen Untersuchungen komme ich zu dem Entschluss, dass Apple im Finder von NSBrowser weg hin zur View-Based NSTableView gegangen ist. Zumindest vermute ich das. Bin jetzt mal am experimentieren, in wie weit ich mit TableViews weiter kommt. Wenn ich irgendwie hängen bleib, meld ich mich wieder. ;)

    Auf jeden Fall vielen Dank schonmal.