bugfix
This commit is contained in:
parent
919b316cf3
commit
534ee61e61
151
kivyblocks/dateinput.py
Normal file
151
kivyblocks/dateinput.py
Normal file
@ -0,0 +1,151 @@
|
||||
from appPublic.timeUtils import curDateString, monthMaxDay
|
||||
|
||||
from kivy.factory import Factory
|
||||
from kivy.properties import NumericProperty
|
||||
from kivy.uix.boxlayout import BoxLayout
|
||||
from kivy.uix.label import Label
|
||||
from kivyblocks.baseWidget import SelectInput, HBox
|
||||
from kivyblocks.utils import CSize
|
||||
|
||||
class YearInput(SelectInput):
|
||||
e_year = NumericProperty(None)
|
||||
def __init__(self, show_years=10, **kw):
|
||||
super(YearInput, self).__init__(**kw)
|
||||
self.show_years = show_years
|
||||
self.showed_min = None
|
||||
self.showed_max = None
|
||||
self.valueField = self.dropdown.valueField
|
||||
self.textField = self.dropdown.textField
|
||||
|
||||
def e_year_change(self, y):
|
||||
self.e_year = y
|
||||
smin = self.e_year - int((self.show_years)/2)
|
||||
smax = smin + self.show_years
|
||||
self.set_selectable_data(self.years_data(smin, smax))
|
||||
|
||||
def years_data(self, smin, smax):
|
||||
d = [
|
||||
{
|
||||
self.valueField:-10000,
|
||||
self.textField:'-'
|
||||
}
|
||||
]
|
||||
self.showed_min = smin
|
||||
self.showed_max = smax
|
||||
while smin < smax:
|
||||
d.append({
|
||||
self.valueField:smin,
|
||||
self.textField:'%4d' % smin
|
||||
})
|
||||
smin += 1
|
||||
d.append({
|
||||
self.valueField:10000,
|
||||
self.textField:'+'
|
||||
})
|
||||
return d
|
||||
|
||||
def dropdown_select(self, o, d):
|
||||
if d[0] == -10000:
|
||||
smin = self.showed_min - self.show_years
|
||||
if smin < 0:
|
||||
smin = 0
|
||||
smax = smin + self.show_years
|
||||
self.set_selectable_data(self.years_data(smin, smax))
|
||||
return
|
||||
if d[0] == 10000:
|
||||
smax = self.showed_max + self.show_years
|
||||
if smax > 9999:
|
||||
smax = 9999
|
||||
smin = smax - self.show_years
|
||||
self.set_selectable_data(self.years_data(smin, smax))
|
||||
self.dropdown.open()
|
||||
return
|
||||
super().dropdown_select(o,d)
|
||||
|
||||
def setValue(self, v):
|
||||
super().setValue(v)
|
||||
self.e_year_change(v)
|
||||
|
||||
class DateInput(HBox):
|
||||
def __init__(self, allow_copy=True, **kw):
|
||||
print('DateInput():kw=', kw)
|
||||
kw['size_hint_y'] = None
|
||||
kw['height'] = CSize(3)
|
||||
kw['size_hint_x'] = None
|
||||
kw['width'] = 10
|
||||
super(DateInput, self).__init__(**kw)
|
||||
self.register_event_type('on_changed')
|
||||
self.old_datestr = None
|
||||
value = kw.get('value',kw.get('defautvalue',curDateString()))
|
||||
y = int(value[:4])
|
||||
m = int(value[5:7])
|
||||
d = int(value[9:10])
|
||||
months_data = []
|
||||
days_data = []
|
||||
for i in range(12):
|
||||
j = i + 1
|
||||
months_data.append({
|
||||
'text':'%02d' % j,
|
||||
'value':j
|
||||
})
|
||||
for i in range(31):
|
||||
j = i + 1
|
||||
days_data.append({
|
||||
'text':'%02d' % j,
|
||||
'value':j
|
||||
})
|
||||
self.days_data = days_data
|
||||
self.yw = YearInput(data=[],
|
||||
size_hint_x=None, width=4)
|
||||
self.mw = SelectInput(size_hint_x=None, width=2,
|
||||
data=months_data)
|
||||
self.dw = SelectInput( size_hint_x=None, width=2,
|
||||
data=days_data)
|
||||
self.mw.set_selectable_data(months_data)
|
||||
self.dw.set_selectable_data(days_data)
|
||||
self.yw.setValue(y)
|
||||
self.mw.setValue(m)
|
||||
self.dw.setValue(d)
|
||||
self.add_widget(self.yw)
|
||||
self.add_widget(Label(text='-',size_hint_x=None, width=CSize(1)))
|
||||
self.add_widget(self.mw)
|
||||
self.add_widget(Label(text='-',size_hint_x=None, width=CSize(1)))
|
||||
self.add_widget(self.dw)
|
||||
self.yw.bind(on_changed=self.data_changed)
|
||||
self.mw.bind(on_changed=self.data_changed)
|
||||
self.dw.bind(on_changed=self.data_changed)
|
||||
|
||||
def data_changed(self, o, d):
|
||||
y = self.yw.getValue()
|
||||
m = self.mw.getValue()
|
||||
d = self.dw.getValue()
|
||||
mdays = monthMaxDay(y,m)
|
||||
if o == self.yw or o == self.mw:
|
||||
data = self.days_data[:mdays]
|
||||
self.dw.set_selectable_data(data)
|
||||
if d <= mdays and d>0:
|
||||
datestr = '%d-%02d-%02d' % (y,m,d)
|
||||
if self.old_datestr != datestr:
|
||||
self.old_datestr = datestr
|
||||
self.dispatch('on_changed', datestr)
|
||||
|
||||
def on_changed(self, *args):
|
||||
pass
|
||||
|
||||
def getValue(self):
|
||||
y = self.yw.getValue()
|
||||
m = self.mw.getValue()
|
||||
d = self.dw.getValue()
|
||||
mdays = monthMaxDay(y,m)
|
||||
if d <= mdays and d>0:
|
||||
return '%d-%02d-%02d' % (y,m,d)
|
||||
return None
|
||||
|
||||
def setValue(self, datestr):
|
||||
self.old_value = datestr
|
||||
y = int(datestr[:4])
|
||||
m = int(datestr[5:7])
|
||||
d = int(datestr[9:10])
|
||||
self.yw.setValue(y)
|
||||
self.mw.setValue(m)
|
||||
self.dw.setValue(d)
|
Loading…
Reference in New Issue
Block a user