OpenPreferences change + new command(s)

Got an idea for enhancing PureBasic? New command(s) you'd like to see?
BinoX
User
User
Posts: 46
Joined: Mon Jan 31, 2005 11:57 am

OpenPreferences change + new command(s)

Post by BinoX »

Can OpenPreferences have support for #PB_File_SharedWrite?

It would be nice to be able to edit the preferences file externally without having to close the program.

I realise this may cause issues with updates, however a couple of new command could change this:

e.g.
PreferenceFileHasChanged() (Which will return true if the file has been changed - maybe check the filesystem modified date)
and
ReloadPreferenceFile() Which could re-open the file with the new values (Assuming that the preferences are stored in memory and not re-read from the file each time)


so it could be:

Code: Select all

If PreferenceFileHasChanged()
   ReloadPreferenceFile()
EndIf
User avatar
kenmo
Addict
Addict
Posts: 1967
Joined: Tue Dec 23, 2003 3:54 am

Re: OpenPreferences change + new command(s)

Post by kenmo »

I agree, these would be helpful.

I think the Preferences library is a bit outdated compared to the rest of PB. It could use some new features and improvements (first: ability to handle more than 1 prefs file at once! Use ID or #PB_Any like the File() commands)



In the meantime, you can simulate your requested behavior using temporary prefs files and copying to the "real" file.

Code: Select all

; 2018-09-24

;-
;- Globals

Global _PrefTempFile.s = GetTemporaryDirectory() + "tempPref.ini"
Global _PrefSaveFile.s
Global _PrefFlags.i




;-
;- Procedures

Procedure.i OpenPreferences_Ex(Filename.s, Flags.i = #Null)
  _PrefSaveFile = Filename
  _PrefFlags = Flags
  CopyFile(_PrefSaveFile, _PrefTempFile)
  ProcedureReturn (OpenPreferences(_PrefTempFile, Flags))
EndProcedure

Procedure.i CreatePreferences_Ex(Filename.s, Flags.i = #Null)
  _PrefSaveFile = Filename
  _PrefFlags = Flags
  If (CreatePreferences(Filename, Flags))
    ClosePreferences()
    ProcedureReturn (CreatePreferences(_PrefTempFile, Flags))
  EndIf
EndProcedure

Procedure ClosePreferences_Ex()
  ClosePreferences()
  CopyFile(_PrefTempFile, _PrefSaveFile)
EndProcedure

Procedure FlushPreferenceBuffers_Ex()
  FlushPreferenceBuffers()
  CopyFile(_PrefTempFile, _PrefSaveFile)
EndProcedure

Procedure.i PreferenceFileHasChanged_Ex()
  ProcedureReturn (Bool(GetFileDate(_PrefSaveFile, #PB_Date_Modified) > GetFileDate(_PrefTempFile, #PB_Date_Modified)))
EndProcedure

Procedure.i ReloadPreferences_Ex()
  ClosePreferences()
  ProcedureReturn (OpenPreferences_Ex(_PrefSaveFile, _PrefFlags))
EndProcedure







;-
;- Demo Program

CompilerIf (#PB_Compiler_IsMainFile)

; Create a starting point for the user to edit externally...
CreatePreferences_Ex("test.ini")
WritePreferenceInteger("Number", 5)
FlushPreferenceBuffers_Ex()

Debug "Number = " + ReadPreferenceString("Number", "")
Debug "Try editing 'test.ini'"

OpenWindow(0, 0, 0, 220, 40, "Edit test.ini", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ButtonGadget(0, 5, 5, 160, 22, "Open test.ini")
Repeat
  Select (WaitWindowEvent(100))
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Gadget
      RunProgram("test.ini")
    Case #Null
      If (PreferenceFileHasChanged_Ex())
        ReloadPreferences_Ex()
        Debug ""
        Debug "File updated!  Number = " + ReadPreferenceString("Number", "")
      EndIf
  EndSelect
ForEver

;WritePreferenceInteger("Number", 555)
;WritePreferenceInteger("Quit", 1)
ClosePreferences_Ex()
CompilerEndIf

;-
BinoX
User
User
Posts: 46
Joined: Mon Jan 31, 2005 11:57 am

Re: OpenPreferences change + new command(s)

Post by BinoX »

Huh..

To be honest, it didn't occur to me to copy the file... that really would have been the obvious solution.

Thanks!
PeDe
Enthusiast
Enthusiast
Posts: 119
Joined: Sun Nov 26, 2017 3:13 pm
Location: Vienna
Contact:

Re: OpenPreferences change + new command(s)

Post by PeDe »

I have used this replacement for the preferences, and it works very well:

viewtopic.php?p=465077#p465077

Peter
Post Reply