amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Dateiname rüber ziehen, wie? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- 2 [ - Beitrag schreiben - ]

15.01.2012, 11:06 Uhr

AGSzabo
Posts: 1663
Nutzer
Hallo, ich habe ein Dateifenster programmiert mit zwei Listen links und rechts und möchte eine Datei clicken, Maus gedrückt lassen, und den Namen sichtbar rüber in die andere Liste ziehen. Wie kann man das machen? Bobs? Gels? Icons? Evtl auch in ganz andere Fenster ziehen? ags
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ - Antworten - Zitieren - Direktlink - ]

15.01.2012, 12:13 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Da ich das gleiche Problem bei NTUI habe, hier meine Gedanken dazu:

1. Alles, was mit dem Fenster RastPort zu tun hat scheidet aus, da du möglicherweise über Fenstergrenzen Hinaus willst (Bobs).

2. Icons wäre irgendwie intuitiv, aber ich glaube AmigaOS stellt da nichts nach außen zur Verfügung, das ist eine reine Workbench interne Sache (korrigiert mich, wenn ich falsch liege).
Ausserdem hat das den Nachteil, dass der Screen Layer (oder ich glaube sogar gleich die ganze IntuiBase) gelockt wird, sodass in der Zeit keine anderen Grafikausgaben möglich sind. Das passiert, weil ja auf dem Screen RastPort gemalt wird.

3. Zuerst erschien mir ein kleines, rahmenloses Fenster gut geeignet, das nutze ich auch um z.B. Tooltips anzuzeigen. Wenn das verschoben wird, kann das allerdings recht CPU intensiv werden, je nachdem was drunter liegt, und damit ruckelig.

4. Letztendlich scheint mir praktikabel und performant zu sein, einfach den Mousepointer einen Drag&Drop Vorgang anzuzeigen. So ist das bei Windows meistens auch (wenn es sich nicht um Icons handelt).
D.h. man zeigt irgendwas mit verschieben und einem Fragezeichen, wenn es über einem Feld ist wo man es loslassen kann evtl. noch verändern.

Was ich für interessanter halte als das grafische Anzeigen des Drag&Drop, wie man die Felder eigentlich miteinander verknüpft.


--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 15.01.2012 um 12:14 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

15.01.2012, 14:33 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

Im alten Directoryopus hat es auch funktioniert.


> wie man die Felder eigentlich miteinander verknüpft.

Was meinst Du damit?
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ - Antworten - Zitieren - Direktlink - ]

15.01.2012, 23:23 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Was hat im alten DirOpus funktioniert?

Was ich meine, die grafische Representation ist eine Sache, ich denke ein Mauspfeil reicht da aus.
Aber woher weis die GUI, von wo nach wo man Drag&Drop machen kann, und was dann passieren soll? Wie teilst du das der Applikation mit, und wie wird das definiert.

Ich könnte mir folgendes vorstellen (aber evtl. denke ich da zu kompliziert):

Man definiert drag&drop IDs, quasi "Rendevouz IDs".
Passt das dragID zu dem dropID eines anderen Objektes, dann kann man Drag&Drop machen und der Mauspfeil kann das auch gleich anzeigen. Das eine Objekt bekommt dann ein "Drag" Event, das andere ein "Drop" Event, und der User kann dann entscheiden was er damit tut.

Z.B.

code:
<listview id="inbox"   dragID="Emails">
<listview id="archive" dropID="Emails" >


Nebeneffekt ist, wenn dann ein ListView dragID und dropID gleich definiert hat, kann man auch innerhalb der Liste per drag&drop sortieren (vorrausgesetzt, die Liste ist unsortiert).

Man könnte über den mechnanismus auch gleich App Drag&Drop abfrühstücken, indem man z.B. dropID="FileDrop" definiert, dann kommt über den gleichen Kanal auch ein Workbench Icon Drop.

Die Informationen über das Drag&Drop Eintrag stehen dann in dem Event drin, in NTUI wäre das der Event String und Int Value.

Wenn die drag&drop IDs stimmen könnte man so auch Daten zwischen zwei Apps austauschen. Die müssen natürlich dafür auch gemacht sein.

Man könnte natürlich auch das Clipboard bemühen, sodass die Apps nichts voneinander wissen. Aber ist das sinnvoll? Ich meine, wie soll man sinnvoll auf einen Drag&Drop reagieren wenn man ein Listview Eintrag in einen anderen ListView schiebt, der was ganz anderes macht. In der Regel will man Drag&Drop doch eher für Dinge, die genau dafür gemacht sind, es sei denn man will wirklich nur einen String oder einen Dateinamen übertragen.

Weis jemand wie das MUI macht?

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de



[ Dieser Beitrag wurde von Der_Wanderer am 15.01.2012 um 23:28 Uhr geändert. ]

[ Dieser Beitrag wurde von Der_Wanderer am 15.01.2012 um 23:32 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

17.01.2012, 16:39 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Der_Wanderer:
Man definiert drag&drop IDs, quasi "Rendevouz IDs".
Passt das dragID zu dem dropID eines anderen Objektes, dann kann man Drag&Drop machen und der Mauspfeil kann das auch gleich anzeigen.

Dafür bieten sich MIME-Typen an. Damit hat man auch gleich eine plattformübergreifende Ausgangsbasis für den Datenaustausch zwischen verschiedenen Anwendungen.

Zitat:
Man könnte natürlich auch das Clipboard bemühen, sodass die Apps nichts voneinander wissen. Aber ist das sinnvoll? Ich meine, wie soll man sinnvoll auf einen Drag&Drop reagieren wenn man ein Listview Eintrag in einen anderen ListView schiebt, der was ganz anderes macht. In der Regel will man Drag&Drop doch eher für Dinge, die genau dafür gemacht sind, es sei denn man will wirklich nur einen String oder einen Dateinamen übertragen.
Mmh, was kann man denn überhaupt ins Clipboard packen? Text, Grafik und Sounddaten. Das könnte man alles auch via Drag&Drop kopieren, wenn die Aktion letztendlich eben nichts anderes als ein Kopiervorgang ist. Eine standardisierte Möglichkeit, den Text im Clipboard als Dateinamen zu taggen, gibt es allerdings nicht.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

17.01.2012, 16:48 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Das mit dem MIME typen ist eine gute Idee.
Allerdings will man meistens gar keine Daten übertragen, sondern nur Indizes verschieben. Z.b. innerhalb eines ListView sortieren, oder von einem ListView in den anderen, wobei dann die App entscheiden muss, um was es hier eigentlich geht (z.b. eine Datei soll verschoben/kopiert/gelöscht werden, oder ein Bild soll angezeigt werden)

--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

21.01.2012, 19:45 Uhr

AGSzabo
Posts: 1663
Nutzer
Ok, ich habe mich entschieden ein Icon zu nehmen und dieses nach der Rettung des Hintergrundes in den Screenrastport zu malen. Das sollte gehen und auch nicht ruckeln. Jetzt kommt die noch viel größere Frage: woher weiss mein Zielfenster, dass etwas rein kommt? Und wenn es obendrein noch von einem anderen Task ist? Erste Überlegung geht auf etwas mit WhichLayer() raus. Dann hätte das Fenster einen Pointer in UserData und in der struct auf die das Zeigt eine hoffentlich einmalige ID, anhand der ich erkennen kann ob das eines von meinen Fenstern ist, um dann dem zugehörigen Task (Zeiger auch in der Struct) ein Signal oder eine Message zu senden. Würde das alles gehen, und wenn ich es nicht schon richtig beschrieben habe, wie?
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ Dieser Beitrag wurde von AGSzabo am 21.01.2012 um 19:46 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

21.01.2012, 22:13 Uhr

cha05e90
Posts: 157
Nutzer
Zitat:
Original von AGSzabo:
Im alten Directoryopus hat es auch funktioniert.


Stimmt! Warum guckst Du nicht mal in die Sourcen vom DOpus4 - die müssten eigentlich irgendwo zu finden sein...
--
SAM440ep-OS4.1|A2000/060-CGX4-OS3.9|A2000/040-P96-OS3.9|A1000-OS1.3|PegasosII/G4-OS4.1-MorphOS2.7

[ - Antworten - Zitieren - Direktlink - ]

26.01.2012, 23:56 Uhr

AGSzabo
Posts: 1663
Nutzer
Ich hatte gerade eine Idee: zum "rüber" ziehen öffnet man ein temporäres fenster ohne border und mit NOCAREREFRESH und LAYER_NOBACKFILL im Vordergrund über den ganzen bildschirm. Dann kann man mit dem Windowrastport arbeiten und braucht sich nicht in den screen zu klinken. Das Problem ist ja auch, dass man allein von einem Screen keine IntuiMessages bekommen kann. Bevor man mit WhichLayer() schaut, über wem man das Icon los gelassen hat, macht man das Fenster zu, damit es nicht die anderen Layer überlagert. Kann man mit WhichLayer() auch fenster anderer Anwendungen finden, oder haben die immer (?) eine andere LayerInfo zugrunde? Am besten man mach für das Verschieben einen eigenen Task auf, denn das Verschieben gehört keiner Appliaktion sondern ist ein eigenständiges Ereignis. Dieser Task muss dann blos noch den anderen Task informieren, wenn das Icon über einen seiner Fenster losgelassen wurde. Kann man das so machen oder sind meine Ideen nicht gut? Oder wenn man ohne Fenster irgendwie am leben bleiben kann um die Mauspos im Screen abzuhorchen, bräuchte man kein Fenster! Das Fenster ist eigentlich auch nur dazu da, um an die Mausposition Events zu kommen. Vielleicht reicht es, wenn es ganz mikrig ist?
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ Dieser Beitrag wurde von AGSzabo am 27.01.2012 um 00:01 Uhr geändert. ]

[ Dieser Beitrag wurde von AGSzabo am 27.01.2012 um 00:09 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

27.01.2012, 10:04 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
Ich hatte gerade eine Idee: zum "rüber" ziehen öffnet man ein temporäres fenster ohne border und mit NOCAREREFRESH und LAYER_NOBACKFILL im Vordergrund über den ganzen bildschirm.

Und wer sorgt dafür, dass es vor allen anderen Fenstern bleibt?
Und was ist mit Fenstern, die währenddessen ihren Inhalt aktualisieren?
Zitat:
Oder wenn man ohne Fenster irgendwie am leben bleiben kann um die Mauspos im Screen abzuhorchen, bräuchte man kein Fenster!
Was verstehst Du unter „am Leben bleiben“? Niemand wird getötet, weil er kein Fenster hat.

Der korrekte Weg, Maus-Events unabhängig von Fenstern abzufangen, führt übrigens über das input.device, bzw. die commodities.library.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

27.01.2012, 10:46 Uhr

thomas
Posts: 7716
Nutzer

Die Mausbewegungen kann man dem Quellfenster entnehmen, das ist ja ohnehin aktiv. Wenn das Quellfenster während des Ziehens den Fokus verliert, dann ist sowieso etwas gravierendes passiert, das die Aktion abbrechen sollte.


--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

27.01.2012, 10:50 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

Zitat:
Und wer sorgt dafür, dass es vor allen anderen Fenstern bleibt?
Und was ist mit Fenstern, die währenddessen ihren Inhalt aktualisieren?


Ja, das hab ich mich auch schon gefragt.

Zitat:
Was verstehst Du unter „am Leben bleiben“?

Einen Programmcode, der weder dem source noch dem destination fenster gehört, also nicht über deren IDCMP ports läuft, sondern über was drittes. nur die info, das etwas fallen gelassen wurde, darf am port ankommen.

Zitat:
Der korrekte Weg, Maus-Events unabhängig von Fenstern abzufangen, führt übrigens über das input.device, bzw. die commodities.library.

Ja, da hab ich mich auch gestern schon angefangen zu informeiren, das scheint aber unglaublich kompliziert zu sein.
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ - Antworten - Zitieren - Direktlink - ]

27.01.2012, 10:56 Uhr

AGSzabo
Posts: 1663
Nutzer
Zitat:
Original von thomas:

Die Mausbewegungen kann man dem Quellfenster entnehmen, das ist ja ohnehin aktiv. Wenn das Quellfenster während des Ziehens den Fokus verliert, dann ist sowieso etwas gravierendes passiert, das die Aktion abbrechen sollte.


Und auch mit dem IDCMP Port des Quellfensters arbeiten? Ich verstehe nicht ob das möglich ist.
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ - Antworten - Zitieren - Direktlink - ]

27.01.2012, 11:07 Uhr

thomas
Posts: 7716
Nutzer

Warum sollte das nicht gehen? Solange das Fenster aktiv ist, bekommst du IDCMP-Messages, egal wo der Mauszeiger ist. Wenn du mit echten Gadgets arbeiten würdest, könntest du es sogar so einrichten, dass du nur so lange Mausbewegungen gemeldet bekommst, solange das Quellgadget aktiv ist. Mit BOOPSI würden diese sogar direkt an das aktive Objekt gesendet (und nur an das).


--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

27.01.2012, 11:14 Uhr

AGSzabo
Posts: 1663
Nutzer
@thomas:

bei mir ist es fast genauso. ich will bloß nicht den verschiebemechnismus in das quellgadget (listview) bauen, sondern allgemeiner haben.
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ - Antworten - Zitieren - Direktlink - ]

27.01.2012, 14:51 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Warum willst nutzt du nicht einfach einen Mousepointer, der einen Drag&Drop Vorgang symbolisiert. So ist das auch unter Windows und es hat sich noch keiner dran gestört. Und du musst nicht zu solchen "Technischen Stunts" greifen die mit Sicherheit hier und da Probleme bereiten werden.
Den Code kannst du dann auch getrost im ListView haben, und musst keine Kopfstände machen um irgendwie einen weiteren Task ins Spiel zu bringen der über das input.device Events parst.
Das Drag&Drop ist sowieso recht spezifisch, das wäre unverhältnismässig kompliziert da etwas generelles zu versuchen. Eine Funktion die den Mauspfeil setzt und eine andere die das Objekt unterhalb bestimmter Koordinaten unabhängig vom aktiven Fenster ermittelt reicht schon.
Das Fenster ansich mit deinen IDCMP Events ist völlig ausreichend. Wie bereits vor mir jemand erwähnt hat, wenn der Fokus verloren geht sollte der Vorgang ohnehin abgebrochen werden.

Was ich anfangs schrieb, was viel interessanter ist, wie verknüpft man vom Design her die einzelnen Elemente. Was muss der GUI Designer machen, was muss der App Entwickler machen, und wie findet das ganze zusammen.

Was will man mit Drag&Drop überhaupt erreichen? Welche Use-Cases gibt es?


--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

27.01.2012, 15:27 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

Ich habe nun schonmal das Drag implementiert (noch nicht das Drop), ein Icon im Screenrastport mit vorheriger Speicherung des Ausschnittes in einer vorrübergehenden Friend-Bitmap mit BltBitMap(). Genaugenommen macht es nicht die ListView, sondern die ListRow, und es wird das selbe Icon verwendet, das auch links in der Liste neben der Zeile erscheint, und das dann noch unter dem Maupointer zentriert. Mal sehen wie ich das Drop nun auch hin bekomme! User Cases sind zB zweierlei:

- In meinem Filerquester von der dirs/dateien Liste nach links in die Bookmarks liste ziehen.

- Von einem Filerequester in einen anderen ziehen. Schon hat man eine art Dateimanager!

ps: ACHTUNG! Es stürzt ab wenn man über die Ränder des Screen hinaus zieht! Also den Fall abfangen!


ags
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ Dieser Beitrag wurde von AGSzabo am 27.01.2012 um 15:31 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

27.01.2012, 15:58 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
Ich habe nun schonmal das Drag implementiert (noch nicht das Drop), ein Icon im Screenrastport mit vorheriger Speicherung des Ausschnittes in einer vorrübergehenden Friend-Bitmap mit BltBitMap().

Das schlägt allerdings dann fehl, wenn Du über dem Fenster einer anderen Anwendung bist, die genau in diesem Moment etwas aktualisiert. Dann malt diese Anwendung zum einen über Dein Icon, zum anderen stellst Du dann einen veralteten Zustand wieder her. Deshalb: Layer locken, wenn man so etwas macht.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

27.01.2012, 17:25 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

Ah danke, LockLayers(layerinfo) ist mein freund :) Denn der Screen scheint keinen eigenen Layer zu haben, zumindest hat er laut Screenstruktur auf direktem Weg nur eine LayerInfo.

@Der_Wanderer

Ich glaube ich habe das Drop Verhalten gelöst: dem Quellobjekt wird ein Notify angefügt, mit Target Zielobjekt, über das beim loslassen ein Drop Event da hin gesendet wird. Ich weiß, das ist jetzt meine eigene Terminologie, aber vielleicht hilft es Dir trotzdem.

Das suchen über WhichLayer() und änliche Tricks über wd_Userdata entfällt. Die Notify() Funktion der Engine kann aber prüfen, ob das Zielobjekt zu einem anderen Task gehört und in dem Fall diesen Locken (ObtainSemaphore()), genau wie beim füllen der Liste über einen Dir-lese-Prozess.

:)
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ - Antworten - Zitieren - Direktlink - ]

27.01.2012, 18:57 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

Ok, hab ich gemacht, das LockLayers. Aber es scheint, die übrigen Zeichenfunktionen nicht zu blokieren. nichtmal in meinem eigenen fenster. hmmm...

Korrigiere, meine eigenen Zeichnereien werde nicht blokiert. Die von einem anderen Programm aber schon. Das nutzt mir im Fall des Befüllens der ListView nichts, weil ich da selber zeichne. Mit dem LockLayers() scheinen nur andere Tasks geblock zu werden (Die Uhr). Kann das sein oder kann man da was machen?

Aha, das Include verrät mir, dass ein LayerInfo über eine Semaphore gelockt wird. hmm.... im Grunde möchte ich ja meinen ListView refresh wärend des Icon-Ziehens NICHT blokieren, sondern nur bewirken, dass alles richtig dargestellt wird. Also mein Icon über der sich änderenden ListView.

--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ Dieser Beitrag wurde von AGSzabo am 27.01.2012 um 19:38 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

27.01.2012, 20:00 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Ich verstehe nicht warum du dich da so abquälst. Nimm doch einen Mauspfeil, das schon auch die Resourcen. Das mit dem Icons geht sowieso nur, wenn es ein Icon gibt. Was machst du bei ListView Einträgen ohne Icon, oder mit mehreren Icons, oder wenn es was ganz anderes ist?

Was mich interessiert ist, wie detektierst du über welchem Objekt du bist, du hattest erwähnt du würdest kein WhichLayer() benötigen?

Und wie detektierst du Objekte aus einem anderen Programm?
Hast du Kenntnis über dessen GUI Struktur? Das würde aber einiges an Syncrhonisierungsaufwand kosten.




--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

27.01.2012, 20:36 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

Qual? Nee, das war schnell erledigt. Ist ja auch ganz einfach. Ohne Icon bekommt, wenn es denn ziehbar ist, ein default icon, oder lässt sich schlicht und ergreifed nicht ziehen. ein fehlendes icon ist mir unter linux an so einer stelle noch nie untergekommen.

Mehrere Icons mit Multiselect muss ich noch drüber nach denken. Im Prinzip geht es aber genauso.

Anderes Programm detektiere ich nur, wenn es ein Open XUI GUI hat und wenn sich die beiden abgesprochen haben. Dazu hänge ich dem Sender eine kleine Struktur an, in der unter anderem ein Zeiger auf den Empfänger steht. Diese Struktur kann man erzeugen wenn beide aufgebaut sind. Beim Fallenlassen ruft der Sender die oxNotify() Funktion der Engine, mit einem Zeiger auf sich selbst und der Bemerkung, dass es sich um ein Drop-Event handelt. Die Engine schaut sich an, was in der Struktur steht:

Target = ListeSoUndSo
Catch = oxEVENT_DROP
Send = oxLISTVIEW_METHOD_ADD_SORTED

Daraus erkennt die Engine, dass sie das Event beim Target in Form der Methode abliefern soll, mit welche eine neue Zeile eingefügt wird. Zusätzlich dazu bekommt oxNotify() noch einen Parameter: Zeiger auf eine Message. Das muss etwas sein, was sowohl vom Sender als auch Empfänger verstanden werden kann. ZB ein Zeiger auf die Texte der Listenzeile.

Das Target/Catch/Send system scheint überflüssig, in der Praxis kann man damit aber fast alles miteinander verbinden. Man kann auch ein

Hook = function_pointer

angeben. Dann wird mit dem Event eine Behandlungsroutine aufgerufen. Die kann zB die Zeile in der Quellliste löschen lassen, oder die Datei kopieren. Der Hook kann die in Frage kommenden Ziele mit HIT_TEST abfragen und dann die Add-Methode an den unter der Maus liegenden manuell senden. Man kann auch das alles kombinieren.

Ich bin noch am überlegen, was ich tun kann, wenn es mehrere in Frage kommende Empfänger gibt. Im Moment hänge ich dazu einfach mehrere Kommunikationsstrukturen an den Sender. Der Empfänger könnte dann prüfen, ob dem DROP event ein Drag vorausgegangen ist, in dem die Mauskoordinate über dem Empfänger waren...

So, das sind nur ein paar Überlegungen...
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ - Antworten - Zitieren - Direktlink - ]

27.01.2012, 20:51 Uhr

AGSzabo
Posts: 1663
Nutzer
...ps: ich hab keine Ahnung ob das so funktioniert aber alles was ich bisher gemacht habe hat so angefangen und wurde dann gut. es ist braistorming.
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ - Antworten - Zitieren - Direktlink - ]

28.01.2012, 13:06 Uhr

AGSzabo
Posts: 1663
Nutzer
Nochmal nachgedacht: die beiden am Drag/Drop beteiligten Widgets brauchen eine Drag/Drop Info Struktur oder einen Zeiger darauf. Da stehen applikationsspezifische Daten drin, damit der Hook weiss um welches Directory es sich handelt zB. Bei mir hat jedes Objekt einen UserData Zeiger, vielleicht geht es damit.
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ - Antworten - Zitieren - Direktlink - ]

28.01.2012, 20:07 Uhr

AGSzabo
Posts: 1663
Nutzer
Ich glaube ich habe eine praktikable Lösung für alles hier gefunden. Im Moment bin ich mir aber noch nicht sicher, ob ich das Zielfenster, wenn es unter der Maus ist, aktivieren soll (???). Welche vor und Nachteile hätte das für den User?

Wenn nicht, kann das Draging vom Quellobjekt ausgeführt werden, bis zum Ende, ich meine, das Quellobjekt kann dann dafür sorgen, beim loslassen der Mautaste das Icon wieder verschwinden zu lassen.

Wenn das andere Fenster doch aktiviert werden soll, muss zuerst das Quellfenster das Draging übernehmen und dann an das Zielfenster übergeben... welches es wieder weiter gibt, wenn WhichLayer() ein andres Fenster festgestellt hat. Ich hoffe man versteht mich.

Man könnte aber auch das Draging immer dem Quellfenster überlassen, damit das Draging nicht extra in jede dragfähige Klasse eingebaut werden muss. aber ohne das Zielfenster zu aktivieren wenn die Maus darüber ist.

Ferner sollte man natürlich in jedem Fall prüfen, ob das Fenster unter der Maus kompatibel ist. Bei mir ginge das über wd_Userdata -> windowobject -> magic matchword at offset $abc. Ich weiss aber nicht, ob das ggf. probleme machen kann, zu einem illegalen Speicherzugriff führen könnte?

--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ Dieser Beitrag wurde von AGSzabo am 28.01.2012 um 20:25 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

29.01.2012, 11:42 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Also

1. Der Drag&Drop Vorgang sollte komplett im Kontext des Quellobjektes laufen. So wie jeder andere Vorgang auf einem Objekt.

2. Fenster solltest du keine aktivieren oder deaktivieren. Das könnte zu unerwünschten Nebeneffekten führen.

3. Das mit dem "Magic Cookie" hatte ich "Rendevouz ID" genannt. So kann das Toolkit herausfinden, ob Quellobjekt und Zielobjekt kompatibel sind.

4. Ich würde eine "DropAttempt" Message machen, die ein Objekt bekommt um zu sehen ob, es das Drop überhaupt will. So kann auch das Zielobjekt selbst überprüfen, ob die Rendevouz ID im Event mit dem eigenen übereinstimmt. Dadurch muss das Quellobjekt keine Annahmen über die Strukur des Zielobjektes machen. (=> wichtig für robusten, erweiterbaren Code).
Je nach Resultat kann dann der Mauspfeil Ok oder nicht-Ok anzeigen.

5. Beim Loslassen gibts dann eine "Drop" Message an das Zielobjekt.
Die Dropmessage muss alle Informationen enthalten, die nötig sind, um das durchzuführen. Ein Zugriff auf das Quellobjekt wäre besser zu vermeiden.

6. Die App bekommt im Moment des "Drop" von der Aktion mit. (onDrop)
Als Callback oder Notify. Daraufhin managed die App, was eigentlich passiert. Die Objekte sollte da nichts "auf eigene Faust" versuchen. So ein Drag&Drop kann sehr unterschiedliche Aktionen erfordern, sodass nur die App das regeln kann.

7. Icons würde ich keine machen, nicht jeder Drag&Drop Vorgang mit Icons verbunden ist. Ich glaube du versteifst dich zu sehr auf den Fall eines Filemanagers.




--
--
Author of
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

29.01.2012, 12:27 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

Zu Punkt 7: ich werde kein Icon verwenden, sondern einen beliebigen Inhalt in Form von beliebigen GUI Elementen. Du kannst im Rrinzip dann auch einen ganzen Button ziehen oder ein Wort Text.

Zu 1: das Objekt gibt den Auftrag zum Ziehen an das Fenster weiter, dann brauche ich es nicht in jede Klasse, die ziehbar sein soll mit einzubauen. Popwindows sind schießlich auch eine Unterfunktion des Fensters (und können auch beliebige Elemente beinhalten).

Zu 4: kein einmaliges DropAttempt, sondern ein fortwährendes Draging mit Mauskoordinaten und id. Damit kann sich ein Zielobjekt hevorheben, wenn die Maus mit dem gezogenen Inhalt darüber ist.

--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ Dieser Beitrag wurde von AGSzabo am 29.01.2012 um 12:44 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

31.01.2012, 10:30 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von AGSzabo:
Zu 4: kein einmaliges DropAttempt, sondern ein fortwährendes Draging mit Mauskoordinaten und id. Damit kann sich ein Zielobjekt hevorheben, wenn die Maus mit dem gezogenen Inhalt darüber ist.

Ich hoffe, dass Dir klar ist, dass ein Zielobjekt, das sich hervorhebt, also während eines D&D-Vorgangs neu zeichnet und ein D&D-System, das das ge’drag’te Object an beliebigen Screen-Koordinaten (vorzugsweise denselben, an denen das Zielobject liegt) zeichnen will, ein ziemliches Konfliktpotential besitzen.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

31.01.2012, 11:10 Uhr

AGSzabo
Posts: 1663
Nutzer
@Holger:

Nein, war mir nicht klar. Es ist aber nicht unmöglich und ich werde es hin bekommen. Bisher funktioniert mein D&D fast nur bis auf dieses Feature ausgezeichnet. Etwas anderes, was mir auch noch nicht klar ist, ggf. müssen mehrere Fenster refresht werden, die zu verschiedenen Tasks gehören können ...

ps: ich habe das highliten hinbekommen :)


HALT, stop mal, unter OS4.1 funktioniert es nicht, sonst schon. weiss jemand, was da im Grafiksystem evtl anders ist und was ich noch berücksichtigen muss?


KORRIGIERE: einmal layer gelockt und schon gehts auch unter os4.1! Da hat wohl jemand gemeint er darf in mein fenster malen. :) :)


--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ Dieser Beitrag wurde von AGSzabo am 31.01.2012 um 20:45 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

31.01.2012, 21:38 Uhr

AGSzabo
Posts: 1663
Nutzer
@Der_Wanderer:

Zitat:
Passt das dragID zu dem dropID eines anderen Objektes, dann kann man Drag&Drop machen und der Mauspfeil kann das auch gleich anzeigen. Das eine Objekt bekommt dann ein "Drag" Event, das andere ein "Drop" Event, und der User kann dann entscheiden was er damit tut.

Ich habs etwas auf gebohrt: ein gedraggtes etwas hat immer 1 ID, aber eine dropzone kann mehrere IDs akzeptieren. Das entscheidet der User in einem Hook. Von einem Programm ins andere funktioniert auch schon. :)

Man muss blos aufpassen, dass keine ID doppelt vergeben wird.
--
Author of Open eXternal User Interfaces, eXternal Format Rippers and the Book "Torakosmos". Developing with E-UAE on an Ubuntu dualcore system.

[ Dieser Beitrag wurde von AGSzabo am 31.01.2012 um 21:41 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]


-1- 2 [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Dateiname rüber ziehen, wie? [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.