Aufruf von OpenFileRequester()

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Plenz
Beiträge: 38
Registriert: 05.05.2021 01:19

Aufruf von OpenFileRequester()

Beitrag von Plenz »

Lässt sich der OpenFileRequester() so starten, dass die angezeigten Dateien sofort nach dem Datum sortiert sind (neueste zuerst)?
Axolotl
Beiträge: 146
Registriert: 31.12.2008 16:34

Re: Aufruf von OpenFileRequester()

Beitrag von Axolotl »

Laut Hilfe gibt es keine Flags, die man der Procedure übergeben kann um die Sortierung zu beinflussen.
Eventuell kann das Selberbauen des Dialogs mit Hilfe von ExplorerListGadget und Co. weiterhelfen.
Unter Windows gibt es die Möglichkeit 'Explorer-Style Hook Procedures' zu verwenden, dann kann man über WM_INITDIALOG und WM_NOTIFY Nachrichten Einfluss auf die Dialogbox nehmen. Das habe ich aber noch nicht ausprobiert, nur kurz danach gesucht.
Wie es geht steht wohl hier. https://docs.microsoft.com/en-us/window ... alog-boxes
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Aufruf von OpenFileRequester()

Beitrag von Sicro »

Code von hier nehmen:
https://www.rsbasic.de/aktualisierung/w ... A4ndern.pb

Code abändern zu:

Code: Alles auswählen

Procedure HookCallback(DialogHandle.I, Msg.I, WParam.I, LParam.I)
  Protected DialogWindow.I
  Protected *NMHdr.NMHDR

  If Msg = #WM_NOTIFY
    *NMHdr = LParam

    If *NMHdr\code = #CDN_FOLDERCHANGE
      DialogWindow = FindWindowEx_(GetParent_(DialogHandle), 0, "ShellDll_DefView", 0)
     
      If DialogWindow
        #byModified   = $7605 + 1
        #byAttributes = $7608 + 1
        SendMessage_(DialogWindow, #WM_COMMAND, #OFN_VIEW_REPORT, 0)
        SendMessage_(DialogWindow, #WM_COMMAND, #ByAttributes, 0)
        SendMessage_(DialogWindow, #WM_COMMAND, #ByModified, 0)
      EndIf
    EndIf
  EndIf
EndProcedure
Warum "+1" und warum erst "ByAttributes" sortiert wird, kann hier nachgelesen werden:
https://stackoverflow.com/questions/296 ... 83#2971783
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Aufruf von OpenFileRequester()

Beitrag von mk-soft »

Vielleicht hat das noch keiner gemerkt. Wir sind hier in de Linux Ecke ! :)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Aufruf von OpenFileRequester()

Beitrag von Sicro »

mk-soft hat geschrieben: 12.05.2021 20:18 Vielleicht hat das noch keiner gemerkt. Wir sind hier in de Linux Ecke ! :)
Da hat mich mal wieder der Spaß mit der WinAPI gepackt, dass ich das gar nicht mitbekommen habe :lol: :freak:

Unter Linux würde ich auf die Schnelle ein OpenFileRequester selber bauen. Das ist keine große Sache und erspart dir die aufwändige Arbeit mit den APIs von GTK2-, GTK3- und QT.

Wenn du ein Beispiel-Code benötigst, wären noch weitere Informationen - wie du dir den Requester vorstellst - hilfreich (z. B. ob nur Dateien angezeigt werden sollen oder auch in Verzeichnisse gewechselt werden können soll).
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Axolotl
Beiträge: 146
Registriert: 31.12.2008 16:34

Re: Aufruf von OpenFileRequester()

Beitrag von Axolotl »

Jupp, hatte ich gemerkt, wollte durch meine Antwort die Linux Spezialisten 'locken'. Ich kann ja nur ein bischen 'Windows'.
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Aufruf von OpenFileRequester()

Beitrag von mk-soft »

Muss mal schauen ob es die möglichkeit gibt die Sortierung anzupassen.
Dafür muss aber der OpenFileRequester neue geschrieben werden.

Habe aber noch nicht gefunden (gesucht) wie die Sortierfolge geändert wird.

Code: Alles auswählen

;-TOP

; Modify by mk-soft

EnableExplicit

ImportC ""
  gtk_file_chooser_dialog_new(title.p-utf8, *parent.GtkWidget, action.i, b1.p-utf8, a1.i, b2.p-utf8, a2.i, null);
  gtk_file_filter_set_name(*filter, label.p-utf8);
  gtk_file_filter_add_pattern(*filter,pattern.p-utf8)
  gtk_file_chooser_set_current_folder(*dialog, path.p-utf8)  
EndImport


Procedure.s MyOpenFileRequester(Title.s, Path.s, Pattern.s, PatterPostion, Flags = 0)
  Protected *dialog, *filter, *mem 
  Protected r1.l 
  Protected part.s, label.s, patter.s , index
  Protected FileName.s
  
  *dialog = gtk_file_chooser_dialog_new(Title, 0, #GTK_FILE_CHOOSER_ACTION_OPEN,
                                        #GTK_STOCK_CANCEL,#GTK_RESPONSE_CANCEL,
                                        #GTK_STOCK_OPEN,#GTK_RESPONSE_ACCEPT,
                                        #Null);
  
  gtk_window_set_modal_(*dialog, #True)
  
  gtk_file_chooser_set_current_folder_(*dialog,path)
  
  Repeat
    index + 1
    part = StringField(pattern, index, ";")
    If part = ""
      Break
    EndIf
    *filter = gtk_file_filter_new_()
    label.s = StringField(part, 1, "|")
    patter.s =  StringField(part, 2, "|")
    gtk_file_filter_set_name(*filter, label)
    gtk_file_filter_add_pattern(*filter, patter)
    gtk_file_chooser_add_filter_(*dialog, *filter)
  ForEver
  
  r1 = gtk_dialog_run_(*dialog)
  If r1  = #GTK_RESPONSE_ACCEPT
    *mem = gtk_file_chooser_get_filename_(*dialog);
    filename.s = PeekS(*mem, -1, #PB_UTF8) 
    If *mem 
      g_free_(*mem);
    EndIf
  Else
    FileName = ""
  EndIf 
  
  gtk_widget_destroy_(*dialog) 
  
  ProcedureReturn FileName
  
EndProcedure

OpenWindow(0, 0, 0, 0, 0, "", #PB_Window_Invisible)

Define file.s = MyOpenFileRequester("Test", "/home", "PB-Files|*.pb;All Files|*", 0 , 0)
MessageRequester("Ifo", "Result = " + file)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Plenz
Beiträge: 38
Registriert: 05.05.2021 01:19

Re: Aufruf von OpenFileRequester()

Beitrag von Plenz »

Unter Linux würde ich auf die Schnelle ein OpenFileRequester selber bauen.
Natürlich könnte ich das auch selbst machen. Leider ist mein Programm aber schon hart am Limit dessen, was die Testversion zulässt :cry:
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: Aufruf von OpenFileRequester()

Beitrag von Shardik »

Plenz hat geschrieben: 12.05.2021 00:18 Lässt sich der OpenFileRequester() so starten, dass die angezeigten Dateien sofort nach dem Datum sortiert sind (neueste zuerst)?
Eigentlich ist dies in Linux so gelöst, dass man in einem FileRequester auf den Spaltentitel klickt (z.B. auf "Letzte Änderung") und fortan sind die Dateien nach dem Datum sortiert (neueste zuerst). Dies wird durch ein Dreieck mit der Spitze nach oben im Spaltenkopf angezeigt. Klickt man erneut auf den Spaltentitel, wird die Sortierreihenfolge umgekehrt (neueste zuletzt) und die Spitze des Dreiecks im Spaltenkopf zeigt dann nach unten. Dies erfolgt separat jeweils für Ordner und Dateien.

Diese Einstellung merkt sich der der FileRequester und beim nächsten Aufruf von OpenFileRequester() und sogar beim nächsten Start des Programms wird die Sortierung so eingestellt, wie der Anwender sie zuletzt eingestellt hatte.

Dies wirkt einer Bevormundung des Anwenders durch den Programmierer entgegen, denn während Du vielleicht am liebsten Ordner und Dateien nach Datum sortiert haben möchtest, möchte ein anderer Anwender vielleicht lieber eine Sortierung nach Ordner- und Dateinamen.
Plenz
Beiträge: 38
Registriert: 05.05.2021 01:19

Re: Aufruf von OpenFileRequester()

Beitrag von Plenz »

Ich könnte durchaus damit leben, wenn es so wäre, aber das ist leider nicht der Fall. Ich wähle z.B. kurz hintereinander zwei Bilddateien aus. Manchmal sind die Dateien beim zweiten Mal so sortiert, wie ich es beim ersten Mal eingestellt habe. Aber meistens muss ich wieder zweimal auf "Datum" klicken. Jedenfalls unter Linux Mint 19.3. Und nach einem Neustart meines Programms sowieso.

Ich will ja auch niemanden bevormunden. Optimal fände ich einen Flag, der die gewünschte Sortierung automatisch auslöst.
Alternativ könnte man dem Fenster ja auch einen Tastendruck schicken, aber die Sortierung reagiert leider nicht auf Tastendrücke.
Antworten