Drag&Drop in FullScreen-View

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

  • Drag&Drop in FullScreen-View

    Schönen guten Tag,

    Ich habe nur eine kleine Frage an euch:

    Ich nehme eine NSView und versetze diese mit dem Aufruf "enterFullScreenMode:withOptions:" in den Vollbildmodus.
    Jetzt möchte ich gerne innerhalb dieser View "Drag&Drop-Operationen" durchführen. Diese werden mit der Standard-Methode "dragImage:at:offset:event:source:slideBack:" angestoßen.

    Nun ist mir aufgefallen, dass das NSImage-Objekt, welches ich beim Aufruf übergebe, für mich nicht sichtbar ist. Führe ich die Maus in den Bereich des benachbarten Bildschirms, so ist die Grafik doch da. Es scheint mir so, als ob diese hinter meiner Fullscreen-View gezeichnet wird. Wenn diese NSView nicht im Vollbild-Modus ist, dann funktioniert natürlich alles korrekt.

    Habe ich hier was vergessen? Ist es möglich diese Grafik beim Ziehen vor meiner Vollbild-View zeichnen zu lassen?
  • Der Fullscreen-Mode benutzt normalerweise ein Window mit einem hohen Level - eben gerade um alles andere zu verdecken. Also versuchen, entweder den Level des Fensters runtersetzen oder den des Drag-Bildchens hoch. Ich wüsste allerdings nicht, wo man das WindowLevel für DnD setzen könnte. Und wenn Du das Fenster zu weit runtersetzt (wobei ich auch nicht weiß ob das überhaupt geht), ist es halt kein Fullscreen mehr. Ich meine, irgendwo gelesen zu haben, das das eingebaute DnD bei Fullscreen nicht geht. Also selber basteln.
    Multigrad - 360°-Produktfotografie für den Mac
  • Für D&D innerhalb eines Views würde ich gar nicht auf die D&D-Protokolle abstellen, sondern das selbst handhaben. Schau mir mal Zeichenprogramme an …

    Der ganze Overhead mit Definition der Typen usw. ist ja nicht notwendig.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • mattik schrieb:

    Ich meine, irgendwo gelesen zu haben, das das eingebaute DnD bei Fullscreen nicht geht. Also selber basteln.

    Amin Negm-Awad schrieb:

    Für D&D innerhalb eines Views würde ich gar nicht auf die D&D-Protokolle abstellen, sondern das selbst handhaben. Schau mir mal Zeichenprogramme an …
    Sollte ich dann also meine Drag&Drop-Geschichte selbst machen, wo soll ich da anfangen? Habt ihr da eine kurze Anleitung für mich, wo Ihr aus Erfahrung wisst, dass es mir ausreichend Spielraum bieten wird.

    Ich stelle mir das aktuell so vor, dass ich ein NSWindow benötige, transparent, und dann darin eine Art NSImageView erstelle und diese hin und her schiebe. Ich habe z.B. zwei Screens, müsste ich dann das NSWindow so erstellen, damit die Koordinaten beide Screens abdecken? Oder ist es schon zu weit hergeholt und könnte auch simpler gelöst werden?
  • Als Anfang bietet sich -mouseDragged: an. Darin kannst du entweder eine modale Abarbeitung beginnen (Negm-Awad/Kienle, Band II, S. 175 f., 177 ff.) oder auf weitere Events warten (ebenda, S. 175 f., 182 ff.)
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Ich hab vor kurzem eine ähnliche Anforderung gehabt.

    Vielleicht hilft dir das Testprojekt weiter, dass ich hier angehängt habe.

    Dort gibt es einen von NSView abgeleiteten View, in dem gezeichnet wird.
    Einfach nur ein blaues Quadrat.

    Wird mit der Maus ein Dragging innherhalb des Views ausgeführt,
    handhabt der View das Verschieben des Quadrats eingenständig.

    Wird die Maus nach ausserhalb des Views bewegt, wird ein zweites
    NSWindow Objekt verwendet, um dieses über den gesamten Bildschirm zu bewegen.

    Hiermit hat man innerhalb des eigenen Views die volle Kontrolle über den Drag
    Vorgang (z.B um Verschiebungen an einem Raster auszurichten) und kann
    trotzdem ein globaleres Drag und Drop ermöglichen.

    Wie gesagt ist nur ein Testprojekt. Also nur mässige bis gar keine Struktur und wenig Kommentar.


    Gruss

    Andreas
    Ewig erstaunt...
  • naja, so aufwendig ist das auch nicht ... implementier einfach -mouseDown: darin machst du einen event loop bis mouseUp passiert. als erstes legst du ein nswindow, machst den content view davon layer backed und dann einfach einen sublayer mit deinem bild rein, den du beim bewegen der mouse verschiebst. wenn der event loop fertig ist, machst du das fenster wieder weg und fertig. kannst du jenachdem in weniger als 20 zeilen code implementieren.
  • Ich muss hier nochmal was hinzufügen...

    Habe das D&D mit den Dragging-Source-Methoden und einem NSWindow umgesetzt.
    In das Dragging-Fenster packe ich ein Image rein und verändere das Frame des Fensters anhand der Mausposition. Soweit so gut :D

    Jetzt soll noch so eine Art "slide-back" Funktion rein. Nach dem die Maustaste losgelassen wird, soll das Dragging-Fenster an eine bestimmte Position sliden. Das mache ich, in dem ich in einer Schleife das Frame des Fensters verändere (eigentlich ganz einfach).

    Im Fenstermodus läuft es ganz gut, flüssig und performant. Sobald ich aber im Vollbild bin, so "hackt" das Zeichnen der Vollbild-View, während das Dragging-Fenster in der Loop verschoben wird.

    Warum ist das so. Muss das System im Vollbild-Modus mehr Zeichnen als im normalen Modus? Der Code ist ja immer der Selbe.
    Es liegt auch nicht daran, das ich im Vollbild-Modus eine größere Zeichenfläche habe. Wenn ich das Haupt-Fenster einfach auf die Größe des Bildschirms maximiere, läuft es trotzdem flüssig, obwohl hier die Zeichenfläche nur um ein paar Pixel kleiner ist, als in der Vollbildansicht.

    (Wenn jemand meiner Erläuterung nicht folgen kann, ruhig fragen, ich versuche es dann anders zu erklären)