Donnerstag, 9. Juni 2011

[Profil] Notizen Widget mit txt-Datei Import & Export

Da ich leider kein Notizenwidget im Market gefunden habe, welches meinen Anforderungen entsprach, habe ich mir selber eins gebastelt. Man kann einfach eine neue Notiz hinzufügen, sowie einzelne oder auch alle Notizen löschen. Die Notizen werden automatisch nummeriert um nicht den Überblick zu verlieren. Zusätzlich werden die Notizen in einer Datei gespeichert, diese kann entweder auf den PC kopiert werden, aber auch dort verändert werden, das Widget übernimmt dann den Inhalt der Textdatei.


Als erstes muss ein Widget mit Zoom erstellt werden. WIr brauchen ein großes Textfeld für die Notizen, sowie 2 Buttons (oder Bilder). Einer zum hinzufügen einer Notiz und einer zum entfernen. Haben wir das Widget soweit erstellt können wir die Tasks schreiben. Es werden 3 Tasks benötigt. Wieder je einer zum Hinzufügen und Löschen von Notizen und einer zum Aktualisieren der angezeigten Notizen. Dieser soll ausgeführt werden wenn das Textfeld mit den Notizen angeklickt wird.

Kommen wir zu den Tasks. Über einen Dialog eingegebene Notizen sollen automatisch in eine Textdatei gespeichert werden. Danach wird die komplette Datei ausgelesen und deren Inhalt unserem Widget übergeben. Zum kompletten Auslesen habe ich "Read Paragraph" genutzt. Diese Funktion liest einen kompletten Absatz, in unserem Fall die komplette Datei aus. Leider merkt sich "Read Paragraph" wie "Read Line" an welcher Stelle es aufgehört hat die Datei auszulesen und fängt beim nächsten Aufruf an dieser Stelle an. Das heißt also das beim zweiten Aufruf ja schon das Ende der Datei erreicht ist und somit nur "EOF" (End Of File) ausgelesen wird. Um dies zu umgehen lasse ich die Datei immer noch ein zweites mal auslesen, sollte "EOF" ausgelesen worden sein.

Kommen wir nun zum ersten Task:
  • Task 1: "Notiz hinzufügen"
    • 1. Variable -> Variable Query
      • Name: %NOTIZ
      • Label: Notiz hinzufügen
    • 2. Variable -> Variable Add
      • Name: %COUNT
      • Value: 1
    • 3. File -> Write File
      • File: Notizen.txt
      • Text: %COUNT) %NOTIZ 
      • Append: Yes
    • 4. File -> Read Paragraph
      • File: Notizen.txt
      • To Var: %NOTIZEN
    • 5. File -> Read Paragraph
      • File: Notizen.txt
      •  To Var: %NOTIZEN
      • If %NOTIZEN  ~ EOF
    • 6. Zoom -> Element Text
      • Element Notizen.w / Notiz
      • Text: %NOTIZEN
Es wird ein Popup geöffnet in welches man eine neue Notiz eintragen kann. Die Variable %COUNT dient zur Nummerierung der einzelnen Notizen. Sie wird mit jeder neuen Notiz um 1 erhöht. Die neue Notiz wird daraufhin an den Inhalt der Datei Notizen.txt angehängt. Zum Schluss wird die komplette Datei eingelesen und der Inhalt auf dem Widget ausgegeben, dadurch werden auch Notizen angezeigt die manuell in die Notizen.txt eingetragen wurden.

Als nächstes kommt der "Notiz löschen" Task. In einem Popup soll die gewünschte Notiznummer eingegeben werden. wird eine 0 eingegeben werden alle Notizen gelöscht:
  • Task 2: "Notiz löschen"
    • 1. Variable -> Variable Set
      • Name: %COUNT
      • To: 0 
    • 2. Variable -> Variable Query
      • Name: %NUMMER
      • Label: Welche Notiz entfernen?
    • 3. If %NUMMER ~ 0
    • 4. File -> Delete File
      • File: Notizen.txt
    • 5. Zoom -> Element Text
      • Element: Notizen.w / Notiz
      • Element Text: [Leerzeichen]
    • 6. Tasker -> Stop 
    • 7. Tasker -> End If
    • 8. File -> Move File
      • From: Notizen.txt
      • To: Notizen_old.txt
      • 9. Variable -> Variable Add
        • Name: %CHECKNR
        • Value: 1
      • 10. File -> Read Line
        • Notizen_old.txt
        • To Var: %NOTIZEN
      • 11. If %NOTIZEN !~ EOF
      • 12. Variable -> Variable Split
        • Name: %NOTIZEN
        • Splitter: )
        • If %CHECKNR !~ %NUMMER   
      • 13. Variable -> Variable Add
        • Name: %COUNT
        • Value: 1
        • If %CHECKNR !~ %NUMMER 
      • 14. File -> Write File
        • File: Notizen.txt
        • Text: %COUNT) %NOTIZEN2
        • Append: Yes
        • If %CHECKNR !~ %NUMMER
      • 15. Tasker -> Goto Action
        • Number: 9
      • 16. Tasker -> End If
      • 17. File -> Delete File
        • File: Notizen_old.txt
      • 18. File ->  Read Paragraph
        • File: Notizen.txt
        • To Var: %NOTIZEN
      • 19. File -> Read Paragraph
        • File: Notizen-txt
        • To Var: %NOTIZEN
        • If %NOTIZEN ~ EOF
      • 20. Zoom -> Element Text
        • Element: Notizen.w / Notiz
        • Text: %NOTIZEN
      • 21. Variable -> Variable Set
        • Name: %CHECKNR
        • To: 0
    Ein recht langer Task aber ich hoffe ihr blickt durch :)

    Als erstes setzen wir unsere Zählvariable zurück. Über ein Popup wird abgefragt welche Notiz gelöscht werden soll. Wird 0 eingegeben wird die ganze Datei gelöscht und das Widget geleert und danach der Task beendet. Ansonsten wird Notizen.txt kopiert und als Notizen_old.txt gespeichert. Danach kann Notizen.txt gelöscht werden.

    Die Zählvariable %CHECKNR stellt die die jeweilige Notiznummer dar. Damit soll erkannt werden welche Notiz nun gelöscht werden soll. Nun wird jede Notiz einzeln eingelesen und überprüft ob sie gelöscht werden soll. Wenn nicht wird die Notiz an den Inhalt von Notizen.txt angehängt. Über "EOF" kann wieder erkannt werden ob das Ende der Datei erreicht wurde.

    Wenn alle Notizen abgearbeitet wurden. Wird die Notizen.txt komplett eingelesen und der Inhalt an das Widget übergeben. Als letztes wird %CHECKNR wieder auf 0 gesetzt.

    Als letztes noch der "Notizen aktualisieren Task". Dieser liest einfach nur die Notizen.txt ein und übergibt den Inhalt an das Widget.
    • Task: "Notizen aktualisieren"
      • 1. File -> Read Paragraph
        • File: Notizen.txt
        • To Var: %NOTIZEN
      • 2.  File -> Read Paragraph
        • File: Notizen.txt
        • To Var: %NOTIZEN
        • If %NOTIZEN ~ EOF
      • 3. Zoom -> Element Text
        • Element: Notizen.w / Notiz
        • Text: %NOTIZEN   
    Nun müssen die Tasks nur noch als "On Click" Aktion den Buttons/Bildern des Zoom Widgets zugeordnet werden. Dies geschieht im Konfigurationsfenster von Zoom.

    Update:
    Chillman hat einen Notiz ändern Task erstellt, den ich natürlich niemandem vorenthalten will:

    • Task: "Notiz ändern"
      1. Variable -> Variable Set
        • Name: %COUNT
        • To: 0
      2. Variable -> Variable Query
        • Name: %ZEILE
        • Label: Welche Notiz ändern?
        • Input Type: Numeric Integer
      3. File -> Read Line
        • File: Notizen.txt
        • Line: %ZEILE
        • To Var: %OLDNOTE
      4. Variable -> Variable Split
        • Name: %OLDNOTE
        • Splitter: )
      5. Variable -> Variable Query
        • Name: %NEWNOTE
        • Label: Notiz ändern
        • Default: %OLDNOTE2
      6. File -> Move
        • From: Notizen.txt
        • To: Notizen_old.txt
      7. Variable -> Variable Add
        • Name: %CHECKNR
        • Value: 1
      8. File -> Read Line
        • File: Notizen_old.txt
        • To Var: %NOTIZEN
      9. Tasker -> If %NOTIZEN !~ EOF
        • Variable -> Variable Add
          • Name: %COUNT
          • Value: 1
        • File -> Write File
          • File: Notizen.txt
          • Text: %NOTIZEN
          • Append: Yes
          • If %CHECKNR !~ %ZEILE
        • File -> Write File
          • Notizen.txt
          • Text: %ZEILE) %NEWNOTE
          • Append: Yes
          • If %CHECKNR ~ %ZEILE
        • Tasker -> Goto Achtion
          • Number: 7
        • Tasker -> End If
        • File -> Delete File
          • File: Notizen_old.txt
        • File -> Read Paragraph
          • File: Notizen.txt
          • To Var: %NOTIZEN
        • File -> Read Paragraph
          • File: Notizen.txt
          • To Var: %NOTIZEN
          • If %NOTIZEN ~ EOF
        • Zoom -> Element Text
          • Element: Notizen.w / Notiz
          • Text: %NOTIZEN
        • Variable -> Variable Set
          • Name: %CHECKNR
          • To: 0

      Viel Spaß :)

      Kommentare:

      1. Habe dem widget noch ein “notiz ändern “ button zugefügt.

        1. Variable - Variable set
        %COUNT zu 0

        2. Variable - Variable query
        %ZEILE
        Label: Welche Zeile soll geändert
        werden?

        3. File - Read line
        notizen_old.txt
        Line: %ZEILE
        To Var: %OLDNOTE

        4. Variable - Variable split
        Name: %OLDNOTE
        Splitter: )

        5. Variable - Variable query
        %NEWNOTE
        Label: Notiz ändern
        Grundeinstellung: %OLDNOTE2

        Ab hier geht es genau wie beim “notiz löschen “ mit den tasks 8-14 weiter. Jedoch task 13 ohne if-bedingung und 12 und 14 mit
        “if %CHECKNR !~ %ZEILE “
        Nun sollten wir im “notiz ändern “ task bei nr. 12 sein.

        13. File - Write File
        File: notizen.txt
        Text: %ZEILE) %NEWNOTE
        Append: yes
        If: %CHECKNR ~ %ZEILE

        14. Tasker - Goto Action
        Nr. 7

        Ab hier schauen wir wieder in den “notiz löschen “ task und übernehmen alles ab nr. 16

        Hoffe es funzt mit der anleitung

        Gruß Chillmann

        AntwortenLöschen
      2. Edit: task nr. 3 muss natürlich notizen.txt anstatt notizen_old.txt einlesen.

        AntwortenLöschen
      3. Cool :) ich werde den Task mal testen wenn ich die Zeit finde und wenn es funktioniert mit in den Post aufnehmen.

        AntwortenLöschen
      4. Dein Task funktioniert, habe aber einen kleinen Fehler gefunden, nach dem Ändern einer Notiz haben alle nicht geänderten Notizen doppelte Nummern bekommen. Deswegen habe ich bei 12. File -> Write File als Text nur %NOTIZEN genommen, dann funktioniert es.

        Danke für deinen Task!

        AntwortenLöschen
      5. War mir damals schon aufgefallen und wollte was zu schreiben, habs dann aber doch vergessen. Der Fehler ist schon im "Notiz löschen" Task ^^ Action 14. Text: %COUNT) %NOTIZEN2 müsste es heissen. Logisch, %NOTIZEN enthält ja noch die Nummer.
        Aber mit deiner Änderung kann man sich Action 10 aus meinem Task komplett sparen. Die nicht geänderten Zeilen können ja samt Nummer ausgelesen und in die txt eingefügt werden ^^

        So führen Fehler zu Verbesserungen hehe^^

        Gruß Chillmann

        AntwortenLöschen
      6. stimmt, habs gleich mal aktualisiert :)

        AntwortenLöschen
      7. Ich habe eine Möglichkeit gefunden das widget mit einer Sprachaufnahme zu versehen:

        Man benötigt dazu die app SL4A [siehe: http://tasker.wikidot.com/sl4a ]
        Dann kann man scripts ergänzen und diese mit einbinden wie hier vorgeschlagen. [Siehe: http://tasker.wikidot.com/speech]

        Wr können dazu den ersten Task kopieren und folgendermaßen anpassen:
        Task 1: "Notiz aufnehmen"
        1. Variable -> Variable Setzen
        Name: %SAVECLIP zu % CLIP
        if %CLIP ist gesetzt
        2. Sonstiges -> Zwischenablage setzen
        Text: ?
        3. Sonstiges -> Starte Script
        Name: SpeechToClip.py
        4. Task -> Warten bis
        Sekunden 1
        Bis %CLIP !~ ?
        -->5. ist wie 1. mit der Möglichkeit das Aufgenommene zu ändern kann aber auch weggelassen werden. bis 6. zu 10. bleibt alles wie gehabt. ab 11 wird wieder neu angefügt:
        1. zu 5. Variable -> Variable abfragen
        Variable: %NOTIZ
        Eingabe Typ: Notiz hinzufügen
        > Grundeinstellung: %CLIP < - ÄNDERUNG
        2. zu 6. Variable -> Variable Addieren
        Name: %COUNT
        Value: 1
        3. zu 7. Datei -> Schreibe Datei
        Datei: Notizen.txt
        Text: %COUNT) %NOTIZ
        Append: Yes
        4. zu 8. Datei-> Lese Paragraph
        Datei: Notizen.txt
        To Var: %NOTIZEN
        5. zu 9. Datei -> Lese Paragraph
        Datei: Notizen.txt
        To Var: %NOTIZEN
        If %NOTIZEN ~ EOF
        6. zu 10. Zoom -> Element Text
        Element Notizen.w / Notiz
        Text: %NOTIZEN
        11. Sonstiges -> Zwischenablage setzen
        %SAVECLIP
        if: %SAVECLIP ist gesetzt
        12. Variable -> Variable Lösche
        %SAVECLIP

        Das ganze noch mit nem bild oder button auf das ZOOM-Widget verknüpft und los gehts. Viel spaß damit. FERDSCH.

        AntwortenLöschen
      8. Hallo!
        Ich hoffe, mir kann noch jemand helfen, der letzte Beitrag hier liegt ja schon etwas zurück ...
        Erstmal DANKE! Es funktioniert fantastisch! Klasse Widget.
        Ich habe allerdings einen Fehler eingebaut, der permanent auftritt, aber an sich keine Schwierigkeiten verursacht:
        Nach dem letzten Notizeintrag erscheint immer die Nachricht ": doesn't exist"
        Ich hoffe ihr könnt mir helfen. Wo liegt der Fehler? Ich verzweifle hier gerade ....

        AntwortenLöschen