-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Michael Shiloh wrote:
> That is a wonderful story. Thanks for sharing!
>
> So, will the baby be named in some way for Openmoko :-)?
>
> Thanks for the great story and the great smile, and best of luck!
>
> Michael
I don't know which will be his/her name, but for sure he/she will know
the story of Openmoko.
Here as attachment (I know it not to much nice to send attachments in a
ML, but are two very little text files :) there are the source of the
program I wrote.
Is not complete, I have still to work a lot on it, but may be someone
may be interested on it (any sugestion is welcome).
Michele Renda
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)
Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org
iEYEARECAAYFAkiIvU0ACgkQSIAU/I6SkT17UQCeKQRk+nZOB3FlAcQ+o0wnyUWD
CIIAmgIIacXfl4CRygFaOD1zlQ4fL1w/
=mGPw
-----END PGP SIGNATURE-----
# ogino.py
#
# Copyright 2008 Michele Renda <[EMAIL PROTECTED]>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
#!/usr/bin/env python
import datetime
class Ogino:
UNKNOW = -1
MESTRUATION = 0
NONE = 1
LOW = 2
HIGH = 3
def __init__(self, start_date, duration_min, duration_max=None):
self.start_date = start_date
self.duration_min = duration_min
if isinstance(duration_max, int):
self.duration_max = duration_max
else:
self.duration_max = duration_min
def getStartDate(self):
return self.start_date
def getEndDateMin(self):
return self.start_date + datetime.timedelta(self.duration_min)
def getEndDateMax(self):
return self.start_date + datetime.timedelta(self.duration_max)
def getHighFertilityStartDate(self):
return self.getEndDateMin() - datetime.timedelta(16)
def getHighFertilityEndDate(self):
return self.getEndDateMax() - datetime.timedelta(12)
def getLowFertilityStartDate(self):
return self.getHighFertilityStartDate() - datetime.timedelta(3)
def getLowFertilityEndDate(self):
return self.getHighFertilityEndDate() + datetime.timedelta(1)
def getFertilityStatus(self, day):
if day == self.getStartDate() or (day >= self.getEndDateMin() and day <= self.getEndDateMax()):
return self.MESTRUATION
elif day >= self.getHighFertilityStartDate() and day <= self.getHighFertilityEndDate():
return self.HIGH
elif day >= self.getLowFertilityStartDate() and day <= self.getLowFertilityEndDate() :
return self.LOW
elif day >= self.getStartDate() and day <= self.getEndDateMax():
return self.NONE
else:
return self.UNKNOW
def getFertilityStatusString(self, day):
ris = self.getFertilityStatus(day)
if ris == self.UNKNOW:
return 'UNKNOW'
elif ris == self.MESTRUATION:
return 'MESTRUATION'
elif ris == self.NONE:
return 'NONE'
elif ris == self.LOW:
return 'LOW'
elif ris == self.HIGH:
return 'HIGH'
else:
return '???'
# ogino-gtk.py
#
# Copyright 2008 Michele Renda <[EMAIL PROTECTED]>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
#!/usr/bin/env python
import pygtk
pygtk.require('2.0')
import gtk
import ogino
from datetime import datetime
from datetime import timedelta
class MessageWindow:
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.show()
def main(self):
gtk.main()
class MainWindow:
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_title("Ogino")
self.window.resize(280, 380)
self.window.connect("delete_event", self.delete)
self.window.connect("destroy_event", self.destroy)
menu = self.getMenu()
input_box = self.getInputBox()
self.main_vbox = gtk.VBox(False, 0)
self.window.add(self.main_vbox)
menu_box = gtk.HBox(False, 0)
menu_box.pack_start(menu, True)
self.main_vbox.pack_start(menu_box, False, False);
self.main_vbox.pack_start(input_box, False);
#main_vbox.pack_start(table, False, False, 0);
self.window.show_all()
def getMenu(self):
ui = gtk.UIManager()
menu = '''<ui>
<menubar name="MenuBar">
<menu action="File">
<menuitem action="Quit"/>
</menu>
<menu action="Edit">
<menuitem action="Preferences"/>
</menu>
</menubar>
</ui>'''
accel_group = ui.get_accel_group()
self.window.add_accel_group(accel_group)
action_group = gtk.ActionGroup('Main')
action_group.add_actions([
('Quit', gtk.STOCK_QUIT, '_Quit', None, 'Quit the Program', self.close),
('File', None, '_File'),
('Edit', None, '_Edit'),
('Preferences', gtk.STOCK_PREFERENCES, '_Preferences', '<Control>p', 'Edit preferences')])
ui.insert_action_group(action_group, 0)
ui.add_ui_from_string(menu)
menu = ui.get_widget('/MenuBar')
menu.show()
return menu
def getInputBox(self):
hbox = gtk.HBox(False, 0)
lbl1 = gtk.Label("Last cicle was on: (dd/mm/yyyy)")
self.txt_start_date = gtk.Entry(10)
self.txt_start_date.set_text('25/07/2008')
# lbl2 = gtk.Label("(DD/MM/YYYY)")
lbl3 = gtk.Label("between two cicle there are")
self.txt_duration_min = gtk.Entry(2)
self.txt_duration_min.set_width_chars(4)
self.txt_duration_min.set_text('28')
lbl4 = gtk.Label("from")
lbl5 = gtk.Label("to")
self.txt_duration_max = gtk.Entry(2);
self.txt_duration_max.set_width_chars(4)
self.txt_duration_max.set_text('28')
lbl6 = gtk.Label("days")
self.table = None
self.btn_calculate = gtk.Button("Calculate")
self.btn_calculate.connect('button_release_event', self.btnCalculate, None)
table = gtk.Table(5, 5, False)
lbl1.set_alignment(0.0, 0.0)
#lbl2.set_alignment(0.0, 0.0)
table.attach(lbl1, 0, 5, 0, 1, gtk.SHRINK, gtk.SHRINK)
table.attach(self.txt_start_date, 1, 4, 1, 2)
table.attach(lbl3, 0, 5, 2, 3, gtk.SHRINK, gtk.SHRINK)
table.attach(lbl4, 0, 1, 3, 4, gtk.SHRINK, gtk.SHRINK)
table.attach(self.txt_duration_min, 1, 2, 3, 4, gtk.SHRINK, gtk.SHRINK)
table.attach(lbl5, 2, 3, 3, 4, gtk.SHRINK, gtk.SHRINK)
table.attach(self.txt_duration_max, 3, 4, 3, 4, gtk.SHRINK, gtk.SHRINK)
table.attach(lbl6, 4, 5, 3, 4, gtk.SHRINK, gtk.SHRINK)
table.attach(self.btn_calculate, 0, 5, 4, 5)
#table.set_size_request(0,0)
#table.size_allocate(gtk.gdk.Rectangle(width=100, height=100))
return table
def getTableBox(self, engine):
self.start_date = engine.getStartDate()
self.end_date = engine.getEndDateMax()
# I make the calculation of the first day I have to display and of the last day I have to display too.
# First day of the week Monday
self.view_start_date = datetime.strptime(self.start_date.strftime('%Y 1 %W'), '%Y %w %W')
# First day of the week Sunday
# self.view_start_date = datetime.strptime(self.start_date.strftime('%Y 0 %U'), '%Y %w %U')
# First day of the week Monday
self.view_end_date = datetime.strptime(self.end_date.strftime('%Y 0 %W'), '%Y %w %W')
# First day of the week Sunday
# self.view_end_date = datetime.strptime(self.start_end.strftime('%Y 6 %U'), '%Y %w %W')
#gtk.gdk
num_week = (self.view_end_date - self.view_start_date).days // 7
table = gtk.Table(num_week + 1, 7, True) # +1 for week label
i = 0;
d = self.view_start_date
while d >= self.view_start_date and d <= self.view_start_date + timedelta(6):
l = gtk.Label(d.strftime('%a'))
table.attach(l, i, i+1, 0, 1, gtk.SHRINK, gtk.SHRINK)
d = d + timedelta(1)
i = i + 1
i = 0;
d = self.view_start_date
while d >= self.view_start_date and d <= self.view_end_date:
row = i // 7
col = i % 7
b = gtk.Button(d.strftime('%d'));
fertility = engine.getFertilityStatus(d)
if fertility == engine.MESTRUATION:
c = gtk.gdk.Color(65535,0,0)
b.modify_bg(gtk.STATE_NORMAL, c)
b.modify_bg(gtk.STATE_PRELIGHT, c)
b.modify_bg(gtk.STATE_ACTIVE, c)
elif fertility == engine.NONE:
c = gtk.gdk.Color(34000,45000,65535)
b.modify_bg(gtk.STATE_NORMAL, c)
b.modify_bg(gtk.STATE_PRELIGHT, c)
b.modify_bg(gtk.STATE_ACTIVE, c)
elif fertility == engine.LOW:
c = gtk.gdk.Color(32767,65535,32767)
b.modify_bg(gtk.STATE_NORMAL, c)
b.modify_bg(gtk.STATE_PRELIGHT, c)
b.modify_bg(gtk.STATE_ACTIVE, c)
elif fertility == engine.HIGH:
c = gtk.gdk.Color(0,56000,0)
b.modify_bg(gtk.STATE_NORMAL, c)
b.modify_bg(gtk.STATE_PRELIGHT, c)
b.modify_bg(gtk.STATE_ACTIVE, c)
b.set_size_request(40,40)
if d.date() == datetime.today().date():
if b.get_use_stock():
label = b.child.get_children()[1]
elif isinstance(b.child, gtk.Label):
label = b.child
else:
raise ValueError("button does not have a label")
label.set_markup('<b>' + d.strftime('%d') + '</b>')
#label.modify_font(pango.set_weight(pango.WEIGHT_BOLD))
table.attach(b, col, col+1, 1+row, 1+row+1, gtk.SHRINK, gtk.SHRINK)
d = d + timedelta(1)
i = i + 1
return table;
def btnCalculate(self, widget, event, callback_data ):
self.start_date = datetime.strptime(self.txt_start_date.get_text(), '%d/%m/%Y')
self.duration_min = int(self.txt_duration_min.get_text())
self.duration_max = int(self.txt_duration_max.get_text())
self.engin = ogino.Ogino(self.start_date, self.duration_min, self.duration_max)
if self.table is not None:
self.table.destroy()
self.table = self.getTableBox(self.engin)
self.main_vbox.pack_start(self.table, False, False, 0);
self.table.show()
self.window.show_all()
def main(self):
gtk.main()
def close(self, widget, data=None):
gtk.main_quit()
def delete(self, widget, event, data=None):
print "delete signal occurred"
gtk.main_quit()
def destroy(self, widget, data=None):
print "destroy signal occurred"
gtk.main_quit()
def showMessage(self, message):
self.window.set_title(message)
if __name__ == "__main__":
MainWindow().main();
_______________________________________________
Openmoko community mailing list
[email protected]
http://lists.openmoko.org/mailman/listinfo/community