; Module/File: Drag&Drop_File(s)InWindowOrGadget.pb ; Function: Drag & Drop of files from desktop to window or gadget - Linux ; Author: Omi ; Date: Aug. 09, 2014 ; Version: 0.2, Fehler mit Rekursionstiefe behoben ; Target Compiler: PureBasic 5.22/5.31 ; Target OS: Linux: (X/K/L)ubuntu, Mint, 32/64, Ascii/Uni ;-------------------------------------------------------------- EnableExplicit ; Object constants #MainWin= 0 #LIG1 = 0 ; Window Variablen #WinX= 300 #WinY= 200 #WinW= 300 #WinH= 225 Global.i gEvent, gQuit Global NewList DropFiles.s() Declare.s PathAddSlash(Path.s) Declare FolderExist(FN$) Declare FileExist(FN$) ;{ Programmfunktion - ... ;Ext: Für ALLE kann "" oder "*.*" eingesetzt werden. Sonst in From: "mp3;flac;ogg" eingeben Procedure ListFiles(Pfad.s, Ext.s, SubDirsOn.b, List FList.s()) Protected.i I, FIdx Pfad= PathAddSlash(Pfad) FIdx= ExamineDirectory(#PB_Any, Pfad, "") If FIdx While NextDirectoryEntry(FIdx) If DirectoryEntryType(FIdx)= #PB_DirectoryEntry_File For I= 1 To CountString(Ext, ";")+ 1 If StringField(Ext, I, ";") = LCase(GetExtensionPart(DirectoryEntryName(FIdx))) AddElement(FList()) FList()= Pfad + DirectoryEntryName(FIdx) Break EndIf Next I Continue ElseIf DirectoryEntryName(FIdx) <> "." And DirectoryEntryName(FIdx) <> ".." And SubDirsOn ListFiles(Pfad + DirectoryEntryName(FIdx), Ext, SubDirsOn, FList()) EndIf Wend FinishDirectory(FIdx) EndIf EndProcedure Procedure SplitDropFiles(S.s, Ext.s= ""); hier per LinkedList(), extension in lowercase in form "mp3;flac;ogg" Protected.i I, nFiles Protected.s Fn ClearList(DropFiles()) nFiles= CountString(S, #LF$)+ 1 For I= 1 To nFiles Fn= StringField(S, I, #LF$) If FolderExist(Fn); Zuerst Folder abfragen, sonst wird unerklärlicherweise Folder als File zurückgegeben! ListFiles(Fn, Ext, #True, DropFiles()) ElseIf FileExist(Fn) AddElement(DropFiles()) DropFiles()= Fn EndIf Next I ResetList(DropFiles()) While NextElement(DropFiles()) Debug DropFiles(); Alle Listenelemente ausgeben Wend EndProcedure Procedure.s PathAddSlash(Path.s) If Right(Path, 1) <> "/" : Path + "/" : EndIf ProcedureReturn Path EndProcedure Procedure FileExist(FN$) Protected.i Ret= #True If FileSize(FN$) < 0 Ret=#False EndIf ProcedureReturn Ret EndProcedure Procedure FolderExist(FN$); mit und ohne abschl. Slash/Backslash gültig. Ebenso Laufwerke möglich Protected.i Ret= #False FN$= PathAddSlash(FN$) If FileSize(FN$) = -2 Ret=#True EndIf ProcedureReturn Ret EndProcedure ;} If OpenWindow(#MainWin, #WinX, #WinY, #WinW, #WinH, "Drop desktop-file(s) - demo", #PB_Window_SystemMenu) ListIconGadget(#LIG1, 5, 95, 290, 100, "Spalte 1", 200) EnableWindowDrop(#MainWin, #PB_Drop_Files, #PB_Drag_Link); Register for Drop in Window EnableGadgetDrop(#LIG1, #PB_Drop_Files, #PB_Drag_Link); Register for Drop in Gadget, for example ListIconGadget Repeat gEvent= WaitWindowEvent() Select gEvent Case #PB_Event_CloseWindow gQuit= #True Case #PB_Event_WindowDrop; Drop-Action in Window MessageRequester("File-Drop", "extern drop in window") If EventDropType() = #PB_Drop_Files; Drop-Type SplitDropFiles(EventDropFiles(), "mp3;wma;wav;ogg;flac"); Drop-Content - "mp3;wma;wav;ogg;flac". Remove parameter for ALL filetypes EndIf Case #PB_Event_GadgetDrop; Drop-Action in Gadget MessageRequester("File-Drop", "extern drop in ListIconGadget") If EventDropType() = #PB_Drop_Files; Drop-Type SplitDropFiles(EventDropFiles(), "mp3;wma;wav;ogg;flac"); Drop-Content - "mp3;wma;wav;ogg;flac" EndIf EndSelect Until gQuit EndIf End ; IDE Options = PureBasic 5.41 LTS (Linux - x86) ; CursorPosition = 18 ; Folding = -- ; EnableUnicode ; CurrentDirectory = /home/charly-xubuntu/Programming/PureBasic/purebasic/