Preference Editor

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Preference Editor

Beitrag von ts-soft »

Dieses Snippet ist bereits ein vollständiger Preference-Editor, sollte aber für
eigene Anwendungen doch noch leicht angepaßt werden.

Ich hab mir das Teil schnell zusammengehackt, um Sprachdateien zu
editieren, hab aber drauf geachtet, das es für viele Arten von Prefs nützlich ist.

Bei Standard Windows INI-Dateien wird kein Space vor "=" und dahinter
gesetzt, bei allen anderen ist da ein Space davor, und natürlich dahinter!

Bedienung:
Doppelclick auf Item und im Kontextmenü wählen

Der Code ist für PB 4.30 läßt sich jedoch auch leicht an PB 4.20 anpassen
(WindowBounds() raus und CreateGadgetList() rein)

Viel Spaß

Code: Alles auswählen

;
;   Copyright (C) 2009 Thomas Schulz (ts-soft)
; -----------------------------------------------------------------------
;   This software is provided 'as-is', without any express Or implied
;   warranty.  In no event will the authors be held liable For any damages
;   arising from the use of this software.
;
;   Permission is granted To anyone To use this software For any purpose,
;   including commercial applications, And To alter it And redistribute it
;   freely, subject To the following restrictions:
;
;   1. The origin of this software must Not be misrepresented; you must not
;      claim that you wrote the original software. If you use this software
;      in a product, an acknowledgment in the product documentation would be
;      appreciated but is Not required.
;   2. Altered source versions must be plainly marked As such, And must Not be
;      misrepresented As being the original software.
;   3. This notice may Not be removed Or altered from any source distribution.
;

EnableExplicit

; hier könnt ihr Titel, Pattern und Kommentarzeichen anpassen
#APPNAME$ = "Preference Editor"
#PATTERN$ = "Supported Files |*.lng;*.pref;*.prefs;*.ini;*.catalog|All Files (*.*)|*.*"
#COMMENTCHAR$ = ";"

Global SEPARATOR$ = " "
Global Format = #PB_Ascii

Enumeration ; windows
  #frmMain
EndEnumeration

Enumeration ; gadgets
  #lvEdit
EndEnumeration

Enumeration ; menu
  #tbNew
  #tbLoad
  #tbSave
  #mnuChangeValue
  #mnuAppendKey
  #mnuInsertKey
  #mnuChangeKey
  #mnuAppendGroupName
  #mnuInsertGroupName
  #mnuChangeGroupName
  #mnuAppendComment
  #mnuInsertComment
  #mnuChangeComment
  #mnuDeleteUnknownLine
EndEnumeration

Procedure SavePreference()
  Protected File.s = SaveFileRequester("", "", #PATTERN$, 0)
  Protected FF, I, J

  If File
    FF = CreateFile(#PB_Any, File)
    If FF
      WriteStringFormat(FF, Format)
      J = CountGadgetItems(#lvEdit)
      If J
        For I = 1 To J
          WriteStringN(FF, GetGadgetItemText(#lvEdit, I - 1), Format)
        Next
      EndIf
      CloseFile(FF)
    EndIf
  EndIf
EndProcedure

Procedure LoadPreference()
  Protected File.s = OpenFileRequester("", "", #PATTERN$, 0)
  Protected FF, string.s

  If File
    If LCase(GetExtensionPart(File)) = "ini"
      SEPARATOR$ = ""
    Else
      SEPARATOR$ = " "
    EndIf

    FF = ReadFile(#PB_Any, File)
    If FF
      ClearGadgetItems(#lvEdit)
      SetWindowTitle(#frmMain, #APPNAME$ + " - " + GetFilePart(File))

      If ReadStringFormat(FF) = #PB_Ascii
        Format = #PB_Ascii
      Else
        Format = #PB_UTF8
      EndIf

      While Not Eof(FF)
        string = ReadString(FF, Format)
        If FindString(string, "=", 1)
          string = Trim(StringField(string, 1, "=")) + SEPARATOR$ + "=" + SEPARATOR$ + Trim(StringField(string, 2, "="))
        EndIf
        AddGadgetItem(#lvEdit, -1, string)
      Wend

      CloseFile(FF)
    EndIf

  EndIf
EndProcedure

Procedure OpenMain()
  Protected Style.i = #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget |#PB_Window_SystemMenu

  If OpenWindow(#frmMain, #PB_Ignore, #PB_Ignore, 640, 480, #APPNAME$, Style)

    If CreatePopupMenu(#frmMain)
      MenuItem(#mnuChangeValue, "change value")
      MenuBar()
      MenuItem(#mnuAppendKey, "append new key")
      MenuItem(#mnuInsertKey, "insert new key")
      MenuItem(#mnuChangeKey, "change keyname")
      MenuBar()
      MenuItem(#mnuAppendGroupName, "append new group")
      MenuItem(#mnuInsertGroupName, "insert new group")
      MenuItem(#mnuChangeGroupName, "change groupname")
      MenuBar()
      MenuItem(#mnuAppendComment, "append comment")
      MenuItem(#mnuInsertComment, "insert comment")
      MenuItem(#mnuChangeComment, "change comment")
      MenuBar()
      MenuItem(#mnuDeleteUnknownLine, "delete this line")
    EndIf

    WindowBounds(#frmMain, 500, 300, #PB_Ignore, #PB_Ignore)
    If CreateToolBar(#frmMain, WindowID(#frmMain))
      ToolBarStandardButton(#tbNew, #PB_ToolBarIcon_New)
      ToolBarStandardButton(#tbLoad, #PB_ToolBarIcon_Open)
      ToolBarStandardButton(#tbSave, #PB_ToolBarIcon_Save)
    EndIf
    CompilerIf #PB_Compiler_OS = #PB_OS_Linux
    ListViewGadget(#lvEdit, 5, 5, 630, 480 - ToolBarHeight(#frmMain) - 10)
    CompilerElse
    ListViewGadget(#lvEdit, 5, 5 + ToolBarHeight(#frmMain), 630, 480 - ToolBarHeight(#frmMain) - 10)
    CompilerEndIf
    AddGadgetItem(#lvEdit, -1, #COMMENTCHAR$)
  EndIf
EndProcedure

OpenMain()

Define.s result
Define.i i

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow : Break

    Case #PB_Event_SizeWindow
      ResizeGadget(#lvEdit, #PB_Ignore, #PB_Ignore, WindowWidth(#frmMain) -10, WindowHeight(#frmMain) - ToolBarHeight(#frmMain) - 10)

    Case #PB_Event_Menu
      Select EventMenu()
        Case #tbNew
          ClearGadgetItems(#lvEdit)
          SetWindowTitle(#frmMain, #APPNAME$)
          AddGadgetItem(#lvEdit, -1, #COMMENTCHAR$)
        Case #tbLoad
          LoadPreference()
        Case #tbSave
          SavePreference()
        Case #mnuChangeValue
          result = InputRequester("", "new value", Trim(StringField(GetGadgetItemText(#lvEdit, GetGadgetState(#lvEdit)), 2, "=")))
          If result
            SetGadgetItemText(#lvEdit, GetGadgetState(#lvEdit), Trim(StringField(GetGadgetItemText(#lvEdit, GetGadgetState(#lvEdit)), 1, "=")) + SEPARATOR$ + "=" + SEPARATOR$ + result)
          EndIf
        Case #mnuAppendKey
          result = InputRequester("", "new key name", "")
          If result
            If Right(result, 1) <> "=" : result + SEPARATOR$ + "=" +  SEPARATOR$: EndIf
            AddGadgetItem(#lvEdit, GetGadgetState(#lvEdit) + 1, result)
            SetGadgetState(#lvEdit, GetGadgetState(#lvEdit) + 1)
          EndIf          
        Case #mnuInsertKey
          result = InputRequester("", "new key name", "")
          If result
            If Right(result, 1) <> "=" : result + SEPARATOR$ + "=" +  SEPARATOR$: EndIf
            AddGadgetItem(#lvEdit, GetGadgetState(#lvEdit), result)
            SetGadgetState(#lvEdit, GetGadgetState(#lvEdit) -1)
          EndIf
        Case #mnuChangeKey
          result = InputRequester("", "new key", Trim(StringField(GetGadgetItemText(#lvEdit, GetGadgetState(#lvEdit)), 1, "=")))
          If result
            SetGadgetItemText(#lvEdit, GetGadgetState(#lvEdit), result + SEPARATOR$ + "=" + SEPARATOR$ + Trim(StringField(GetGadgetItemText(#lvEdit, GetGadgetState(#lvEdit)), 2, "=")))
          EndIf
        Case #mnuAppendGroupName
          result = InputRequester("", "new group name", "")
          If result
            If Left(result, 1) <> "[" : result = "[" + result : EndIf
            If Right(result, 1) <> "]" : result + "]" : EndIf
            AddGadgetItem(#lvEdit, GetGadgetState(#lvEdit) + 1, result)
            SetGadgetState(#lvEdit, GetGadgetState(#lvEdit) + 1)
          EndIf        
        Case #mnuInsertGroupName
          result = InputRequester("", "new group name", "")
          If result
            If Left(result, 1) <> "[" : result = "[" + result : EndIf
            If Right(result, 1) <> "]" : result + "]" : EndIf
            AddGadgetItem(#lvEdit, GetGadgetState(#lvEdit), result)
          EndIf
          SetGadgetState(#lvEdit, GetGadgetState(#lvEdit) -1)
        Case #mnuChangeGroupName
          result = InputRequester("", "new group name", "")
          If result
            If Left(result, 1) <> "[" : result = "[" + result : EndIf
            If Right(result, 1) <> "]" : result + "]" : EndIf
            SetGadgetItemText(#lvEdit, GetGadgetState(#lvEdit), result)
          EndIf
        Case #mnuAppendComment
          result = InputRequester("", "new comment", "")
          If result
            If Left(result, 1) <> #COMMENTCHAR$ : result = #COMMENTCHAR$ + result : EndIf
            AddGadgetItem(#lvEdit, GetGadgetState(#lvEdit) + 1, result)
            SetGadgetState(#lvEdit, GetGadgetState(#lvEdit) + 1)
          EndIf 
        Case #mnuInsertComment
          result = InputRequester("", "new comment", "")
          If result
            If Left(result, 1) <> #COMMENTCHAR$ : result = #COMMENTCHAR$ + result : EndIf
            AddGadgetItem(#lvEdit, GetGadgetState(#lvEdit), result)
            SetGadgetState(#lvEdit, GetGadgetState(#lvEdit) -1)
          EndIf
  
        Case #mnuChangeComment
          result = InputRequester("", "new comment", GetGadgetItemText(#lvEdit, GetGadgetState(#lvEdit)))
          If result
            If Left(result, Len(#COMMENTCHAR$)) <> #COMMENTCHAR$ : result = #COMMENTCHAR$ + result : EndIf
            SetGadgetItemText(#lvEdit, GetGadgetState(#lvEdit), result)
          EndIf
        Case #mnuDeleteUnknownLine
          RemoveGadgetItem(#lvEdit, GetGadgetState(#lvEdit))
          If Not CountGadgetItems(#lvEdit) : AddGadgetItem(#lvEdit, -1, #COMMENTCHAR$) : EndIf          
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
        Case #lvEdit
          If EventType() = #PB_EventType_LeftDoubleClick

            For i = #mnuChangeValue To #mnuDeleteUnknownLine
              DisableMenuItem(#frmMain, i, #False)
            Next
            If GetGadgetState(#lvEdit) >= 0
              If Left(GetGadgetItemText(#lvEdit, GetGadgetState(#lvEdit)), 1) = "["
                DisableMenuItem(#frmMain, #mnuChangeComment, #True)
                DisableMenuItem(#frmMain, #mnuChangeKey, #True)
                DisableMenuItem(#frmMain, #mnuChangeValue, #True)
              ElseIf Left(GetGadgetItemText(#lvEdit, GetGadgetState(#lvEdit)), Len(#COMMENTCHAR$)) = #COMMENTCHAR$
                DisableMenuItem(#frmMain, #mnuChangeGroupName, #True)
                DisableMenuItem(#frmMain, #mnuChangeKey, #True)
                DisableMenuItem(#frmMain, #mnuChangeValue, #True)
              ElseIf GetGadgetItemText(#lvEdit, GetGadgetState(#lvEdit)) = ""
                For i = #mnuChangeValue To #mnuDeleteUnknownLine - 1
                  DisableMenuItem(#frmMain, i, #True)
                Next            
              Else
                DisableMenuItem(#frmMain, #mnuChangeGroupName, #True)
                DisableMenuItem(#frmMain, #mnuChangeComment, #True)
              EndIf
            Else
              DisableMenuItem(#frmMain, #mnuChangeComment, #True)
              DisableMenuItem(#frmMain, #mnuChangeGroupName, #True)
              DisableMenuItem(#frmMain, #mnuChangeKey, #True)
              DisableMenuItem(#frmMain, #mnuChangeValue, #True)
              DisableMenuItem(#frmMain, #mnuChangeGroupName, #True)
              DisableMenuItem(#frmMain, #mnuChangeGroupName, #True)
            EndIf
            DisplayPopupMenu(#frmMain, WindowID(#frmMain))
          EndIf
      EndSelect
  EndSelect
ForEver
Update

Sollte jetzt unter jedem von PB unterstütztem OS laufen. Komplett
neugestaltet und mehr Funktionen!
Zuletzt geändert von ts-soft am 17.03.2009 09:59, insgesamt 3-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
kswb73
Beiträge: 319
Registriert: 04.02.2008 16:51
Kontaktdaten:

Beitrag von kswb73 »

Hab einen Bug gefunden. Beim speichern musst du auch an Element 0 denken, sonst fehlt der erste Eintrag in der neuen Datei.
Ansonsten würde ich bei der neuen Datei zu Anfang direkt die originalwerte übertragen, da es nervig ist wenn man bei jeder kleinen Änderung alles neu schreiben muss.
Windows XP: PB 4.31, PB 4.4, PB 4.51
Open Suse 11.2: PB 4.4
tmjuk
Beiträge: 380
Registriert: 30.06.2006 00:10
Wohnort: Backaryd, Schweden

Beitrag von tmjuk »

Edit:Code entfernt wegen Update von TS-Soft


Torsten
Zuletzt geändert von tmjuk am 17.03.2009 15:14, insgesamt 1-mal geändert.
PB 4.51 32 Windows Vista, 32 XP, PB 4.51 32 Ubuntu 10.10
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

kswb73 hat geschrieben:Hab einen Bug gefunden. Beim speichern musst du auch an Element 0 denken, sonst fehlt der erste Eintrag in der neuen Datei.
:oops: , habs mal geändert, danke für den Hinweis
kswb73 hat geschrieben: Ansonsten würde ich bei der neuen Datei zu Anfang direkt die originalwerte übertragen, da es nervig ist wenn man bei jeder kleinen Änderung alles neu schreiben muss.

Ich denke mal, das kann sich dann jeder bei Bedarf selber reinbauen, soll ja
mehr sowas wie eine Vorlage und nicht ein fertiges Programm sein.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

tmjuk hat geschrieben:Oberfläche ein bischen angepasst.
Erprobt unter Suse mit
KDE3
KDE4
Gnome

Probiert selber
Danke Dir, funktioniert unter Linux schon besser, aber die Button im Dialog
sind abgeschnitten. Man kann aber schon mit Arbeiten, aber die unterschied-
lichen Zeilenabstände sind einfach :freak:

Wenn ich das jetzt für Windows übernehme, hat der linke Button nur noch
halbe größe :mrgreen: , also lassen wir lieber beide Versionen erstmal
getrennt :wink:

PS: Hab den anderen Vorschlag von kswb73 jetzt auch noch integriert,
ist doch praktischer.

Danke für euer Interesse

Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
tmjuk
Beiträge: 380
Registriert: 30.06.2006 00:10
Wohnort: Backaryd, Schweden

Beitrag von tmjuk »

Nein, bekommt sicher keinen Schönheitspreis unter Linux :lol:
Funktioniert aber. Und das ist erst mal wichtig.
Bei mir sind übrigens die Buttons nicht abgeschnitten.
Liegt wohl an der verwendeten Systemschriftart.

Edit:
Ich versuche eigentlich immer nur einen Code für Windows und Linux zu schreiben, aber wie man sieht kann es manchmal zu einem Krampf entarten :wink:
Edit2:
Werde heute abend eine Linux-Only Version schreiben.
PB 4.51 32 Windows Vista, 32 XP, PB 4.51 32 Ubuntu 10.10
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Update

Sollte jetzt unter jedem von PB unterstütztem OS laufen. Komplett
neugestaltet und mehr Funktionen!

Source im ersten Beitrag!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

super! :allright: Wäre es möglich, auch deutsche Oberfläche anzubieten?
Win11 x64 | PB 6.20
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Andesdaf hat geschrieben:super! :allright: Wäre es möglich, auch deutsche Oberfläche anzubieten?
Die beiden Konstanten (#APPNAME$ und #PATTERN$) sind zum Anpassen
an die Gegebenheiten, und die anderen 7 Wörter (+ wiederholungen) wirste
wohl alleine schaffen, Du fauler Sa.. :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

stimmt, ich bin wirklich eine faule Sa. :mrgreen:
Edit: Ja, ich meine eine. Jetzt ratet mal was der dritte Buchstabe ist.
Win11 x64 | PB 6.20
Antworten