Allow to take notes on calendar days
authorEnrico Zini <enrico@enricozini.org>
Sat, 12 Sep 2009 18:04:28 +0000 (19:04 +0100)
committerEnrico Zini <enrico@enricozini.org>
Sat, 12 Sep 2009 18:04:28 +0000 (19:04 +0100)
src/app_calendar.vala

index 2c0c3cb604f6db7902fd6ba83bd55cd3a807fbd3..66a0ae5ea8c183aab67d555aa4014292e2fb4ef4 100644 (file)
@@ -28,6 +28,11 @@ public class Calendar : Applet
        protected Gtk.ScrolledWindow scroll;
        protected Gtk.TextBuffer text_buffer;
        protected Gtk.TextView text;
+       protected int cur_year;
+       protected int cur_month;
+       protected int cur_day;
+       protected bool text_dirty;
+       protected Regex re_dayfile;
 
        public Calendar()
        {
@@ -38,34 +43,113 @@ public class Calendar : Applet
                pack_start(calendar, false, false, 0);
 
                text_buffer = new Gtk.TextBuffer(null);
+               text_buffer.changed += on_textbuffer_changed;
                text = new Gtk.TextView.with_buffer(text_buffer);
                text.wrap_mode = Gtk.WrapMode.WORD;
-               text.cursor_visible = false;
-               text.editable = false;
+               text.cursor_visible = true;
+               text.editable = true;
                scroll = new Gtk.ScrolledWindow (null, null);
                scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
                scroll.add(text);
                pack_start(scroll, true, true, 0);
 
-               on_month_changed();
+               re_dayfile = new Regex("[0-9][0-9]\\.txt");
+
+               text_dirty = false;
+       }
+       
+       private void on_textbuffer_changed()
+       {
+               text_dirty = true;
+       }
+
+       private string month_path(int year, int month)
+       {
+               return "%s/cal/%04d/%02d".printf(zavai.config.homedir, year, month);
+       }
+
+       private string day_path(int year, int month, int day)
+       {
+               return "%s/%02d.txt".printf(month_path(year, month), day);
+       }
+
+       private void flush()
+       {
+               if (text_dirty)
+                       save(cur_year, cur_month, cur_day);
        }
 
        private void on_month_changed()
        {
+               flush();
                calendar.clear_marks();
-               calendar.mark_day(1);
+               string mpath = month_path(calendar.year, calendar.month);
+               Dir dir;
+               try {
+                       dir = Dir.open(mpath);
+               } catch (FileError e) {
+                       zavai.log.error(e.message);
+                       return;
+               }
+               while (true)
+               {
+                       var d = dir.read_name();
+                       if (d == null) break;
+                       if (re_dayfile.match(d))
+                       {
+                               calendar.mark_day((int)d.to_ulong(null, 10));
+                       }
+               }
        }
 
        private void on_day_selected()
        {
-               string day = "%02d/%02d/%04d".printf(calendar.day, calendar.month, calendar.year);
-               text_buffer.text = day;
+               flush();
+               load(calendar.year, calendar.month, calendar.day);
+               // Scroll to beginning
                Gtk.TextIter iter;
                text_buffer.get_iter_at_offset(out iter, 0);
                Gtk.TextMark mark = text_buffer.create_mark(null, iter, true);
                text.scroll_mark_onscreen(mark);
        }
 
+       private void load(int year, int month, int day)
+       {
+               string path = day_path(year, month, day);
+               if (!FileUtils.test (path, FileTest.IS_REGULAR))
+                       text_buffer.text = "";
+               else
+               {
+                       try {
+                               string text;
+                               FileUtils.get_contents(path, out text);
+                               text_buffer.text = text;
+                       } catch (FileError e) {
+                               zavai.log.error(e.message);
+                               text_buffer.text = "";
+                       }
+               }
+               text_dirty = false;
+               cur_year = year; cur_month = month; cur_day = day;
+       }
+
+       private void save(int year, int month, int day)
+       {
+               string mpath = month_path(year, month);
+               if (DirUtils.create_with_parents(mpath, 0777) < 0)
+               {
+                       zavai.log.error("Cannot create directory " + mpath);
+                       return;
+               }
+               string path = day_path(year, month, day);
+               try {
+                       FileUtils.set_contents(path, text_buffer.text);
+               } catch (FileError e) {
+                       zavai.log.error(e.message);
+               }
+               text_dirty = false;
+       }
+
        public override void start()
        {
                // Go to current date
@@ -76,6 +160,7 @@ public class Calendar : Applet
        }
        public override void stop()
        {
+               flush();
        }
 }