# 17/03/2004 - Joerg "Adi" Sieker adi@sieker.info
# o Added keyboard navigation to the control. # Use the cursor keys to navigate through the ages. :) # The Home key function as go to today # o select day is now a filled rect instead of just an outline git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26331 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -58,6 +58,12 @@
|
|||||||
# Instead set set_x_mrg and set_y_mrg
|
# Instead set set_x_mrg and set_y_mrg
|
||||||
# o Changed default X and Y Margin to 0.
|
# o Changed default X and Y Margin to 0.
|
||||||
# o Added wxCalendar.SetMargin.
|
# o Added wxCalendar.SetMargin.
|
||||||
|
#
|
||||||
|
# 17/03/2004 - Joerg "Adi" Sieker adi@sieker.info
|
||||||
|
# o Added keyboard navigation to the control.
|
||||||
|
# Use the cursor keys to navigate through the ages. :)
|
||||||
|
# The Home key function as go to today
|
||||||
|
# o select day is now a filled rect instead of just an outline
|
||||||
|
|
||||||
import wx
|
import wx
|
||||||
|
|
||||||
@@ -117,8 +123,8 @@ def DefaultColors():
|
|||||||
colors[COLOR_FONT] = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOWTEXT)
|
colors[COLOR_FONT] = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOWTEXT)
|
||||||
colors[COLOR_3D_LIGHT] = wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNHIGHLIGHT)
|
colors[COLOR_3D_LIGHT] = wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNHIGHLIGHT)
|
||||||
colors[COLOR_3D_DARK] = wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW)
|
colors[COLOR_3D_DARK] = wx.SystemSettings_GetColour(wx.SYS_COLOUR_BTNSHADOW)
|
||||||
colors[COLOR_HIGHLIGHT_FONT] = 'PINK'
|
colors[COLOR_HIGHLIGHT_FONT] = wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHTTEXT)
|
||||||
colors[COLOR_HIGHLIGHT_BACKGROUND] = 'RED'
|
colors[COLOR_HIGHLIGHT_BACKGROUND] = wx.SystemSettings_GetColour(wx.SYS_COLOUR_HIGHLIGHT)
|
||||||
return colors
|
return colors
|
||||||
# calendar drawing routing
|
# calendar drawing routing
|
||||||
|
|
||||||
@@ -235,11 +241,22 @@ class CalDraw:
|
|||||||
self.cal_sel[val] = (cfont, cbackgrd)
|
self.cal_sel[val] = (cfont, cbackgrd)
|
||||||
|
|
||||||
# draw border around the outside of the main display rectangle
|
# draw border around the outside of the main display rectangle
|
||||||
def DrawBorder(self, DC):
|
def DrawBorder(self, DC, transparent = False):
|
||||||
brush = wx.Brush(MakeColor(self.colors[COLOR_BACKGROUND]), wx.SOLID)
|
|
||||||
DC.SetBrush(brush)
|
|
||||||
DC.SetPen(wx.Pen(MakeColor(self.colors[COLOR_BORDER]), 1))
|
|
||||||
if self.outer_border is True:
|
if self.outer_border is True:
|
||||||
|
if transparent == False:
|
||||||
|
brush = wx.Brush(MakeColor(self.colors[COLOR_BACKGROUND]), wx.SOLID)
|
||||||
|
else:
|
||||||
|
brush = wx.TRANSPARENT_BRUSH
|
||||||
|
DC.SetBrush(brush)
|
||||||
|
DC.SetPen(wx.Pen(MakeColor(self.colors[COLOR_BORDER])))
|
||||||
|
# full display window area
|
||||||
|
rect = wx.Rect(self.cx_st, self.cy_st, self.sizew, self.sizeh)
|
||||||
|
DC.DrawRectangleRect(rect)
|
||||||
|
|
||||||
|
def DrawFocusIndicator(self, DC):
|
||||||
|
if self.outer_border is True:
|
||||||
|
DC.SetBrush(wx.TRANSPARENT_BRUSH)
|
||||||
|
DC.SetPen(wx.Pen(MakeColor(self.colors[COLOR_HIGHLIGHT_BACKGROUND]), style=wx.DOT))
|
||||||
# full display window area
|
# full display window area
|
||||||
rect = wx.Rect(self.cx_st, self.cy_st, self.sizew, self.sizeh)
|
rect = wx.Rect(self.cx_st, self.cy_st, self.sizew, self.sizeh)
|
||||||
DC.DrawRectangleRect(rect)
|
DC.DrawRectangleRect(rect)
|
||||||
@@ -298,6 +315,8 @@ class CalDraw:
|
|||||||
# get the display rectange list of the day grid
|
# get the display rectange list of the day grid
|
||||||
def GetRect(self):
|
def GetRect(self):
|
||||||
cnt = 0
|
cnt = 0
|
||||||
|
h = 0
|
||||||
|
w = 0
|
||||||
for y in self.gridy[1:-1]:
|
for y in self.gridy[1:-1]:
|
||||||
if y == self.gridy[-2]:
|
if y == self.gridy[-2]:
|
||||||
h = h + self.restH
|
h = h + self.restH
|
||||||
@@ -447,10 +466,7 @@ class CalDraw:
|
|||||||
DC.DrawText(day, point)
|
DC.DrawText(day, point)
|
||||||
cnt_x = cnt_x + 1
|
cnt_x = cnt_x + 1
|
||||||
|
|
||||||
# draw the day numbers
|
def _CalcFontSize(self, DC, f):
|
||||||
def DrawNum(self, DC):
|
|
||||||
f = wx.Font(10, self.font, wx.NORMAL, self.bold) # initial font setting
|
|
||||||
|
|
||||||
if self.num_auto == True:
|
if self.num_auto == True:
|
||||||
test_size = self.max_num_size # max size
|
test_size = self.max_num_size # max size
|
||||||
test_day = ' 99 '
|
test_day = ' 99 '
|
||||||
@@ -468,13 +484,18 @@ class CalDraw:
|
|||||||
f.SetPointSize(self.num_size) # set fixed size
|
f.SetPointSize(self.num_size) # set fixed size
|
||||||
DC.SetFont(f)
|
DC.SetFont(f)
|
||||||
|
|
||||||
|
# draw the day numbers
|
||||||
|
def DrawNum(self, DC):
|
||||||
|
f = wx.Font(10, self.font, wx.NORMAL, self.bold) # initial font setting
|
||||||
|
self._CalcFontSize(DC, f)
|
||||||
|
|
||||||
cnt_x = 0
|
cnt_x = 0
|
||||||
cnt_y = 1
|
cnt_y = 1
|
||||||
for val in self.cal_days:
|
for val in self.cal_days:
|
||||||
x = self.gridx[cnt_x]
|
x = self.gridx[cnt_x]
|
||||||
y = self.gridy[cnt_y]
|
y = self.gridy[cnt_y]
|
||||||
|
|
||||||
self.DrawDayText(x, y, val, f, DC)
|
self._DrawDayText(x, y, val, f, DC)
|
||||||
|
|
||||||
if cnt_x < 6:
|
if cnt_x < 6:
|
||||||
cnt_x = cnt_x + 1
|
cnt_x = cnt_x + 1
|
||||||
@@ -482,7 +503,8 @@ class CalDraw:
|
|||||||
cnt_x = 0
|
cnt_x = 0
|
||||||
cnt_y = cnt_y + 1
|
cnt_y = cnt_y + 1
|
||||||
|
|
||||||
def DrawDayText(self, x, y, text, font, DC):
|
def _DrawDayText(self, x, y, text, font, DC):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
num_val = int(text)
|
num_val = int(text)
|
||||||
num_color = self.cal_sel[num_val][0]
|
num_color = self.cal_sel[num_val][0]
|
||||||
@@ -513,24 +535,36 @@ class CalDraw:
|
|||||||
adj_v = adj_v + self.num_indent_vert
|
adj_v = adj_v + self.num_indent_vert
|
||||||
|
|
||||||
DC.DrawText(text, (x+adj_h, y+adj_v))
|
DC.DrawText(text, (x+adj_h, y+adj_v))
|
||||||
|
|
||||||
|
def DrawDayText(self, DC, key):
|
||||||
|
f = wx.Font(10, self.font, wx.NORMAL, self.bold) # initial font setting
|
||||||
|
self._CalcFontSize(DC, f)
|
||||||
|
|
||||||
|
val = self.cal_days[key]
|
||||||
|
cnt_x = key % 7
|
||||||
|
cnt_y = int(key / 7)+1
|
||||||
|
x = self.gridx[cnt_x]
|
||||||
|
y = self.gridy[cnt_y]
|
||||||
|
self._DrawDayText(x, y, val, f, DC)
|
||||||
|
|
||||||
|
|
||||||
# calculate the dimensions in the center of the drawing area
|
# calculate the dimensions in the center of the drawing area
|
||||||
def Center(self):
|
def Center(self):
|
||||||
borderW = self.x_mrg * 2
|
borderW = self.x_mrg * 2
|
||||||
borderH = self.y_mrg + self.y_end + self.title_offset
|
borderH = self.y_mrg + self.y_end + self.title_offset
|
||||||
|
|
||||||
self.cellW = int((self.sizew-borderW)/7)
|
self.cellW = int((self.sizew - borderW)/7)
|
||||||
self.cellH = int((self.sizeh-borderH)/7)
|
self.cellH = int((self.sizeh - borderH)/7)
|
||||||
|
|
||||||
self.restW = ((self.sizew - borderW)%7 ) - 1
|
self.restW = ((self.sizew - borderW)%7 ) - 1
|
||||||
|
|
||||||
# week title adjustment
|
# week title adjustment
|
||||||
self.weekHdrCellH = int(self.cellH*self.cal_week_scale)
|
self.weekHdrCellH = int(self.cellH * self.cal_week_scale)
|
||||||
# recalculate the cell height exkl. the week header and
|
# recalculate the cell height exkl. the week header and
|
||||||
# subtracting the size
|
# subtracting the size
|
||||||
self.cellH = int((self.sizeh-borderH-self.weekHdrCellH)/6)
|
self.cellH = int((self.sizeh - borderH - self.weekHdrCellH)/6)
|
||||||
|
|
||||||
self.restH = ((self.sizeh-borderH-self.weekHdrCellH)%6 ) - 1
|
self.restH = ((self.sizeh - borderH - self.weekHdrCellH)%6 ) - 1
|
||||||
self.calW = self.cellW * 7
|
self.calW = self.cellW * 7
|
||||||
self.calH = self.cellH * 6 + self.weekHdrCellH
|
self.calH = self.cellH * 6 + self.weekHdrCellH
|
||||||
|
|
||||||
@@ -623,12 +657,14 @@ class PrtCalDraw(CalDraw):
|
|||||||
def SetPreview(self, preview):
|
def SetPreview(self, preview):
|
||||||
self.preview = preview
|
self.preview = preview
|
||||||
|
|
||||||
class Calendar(wx.Window):
|
class Calendar( wx.PyControl ):
|
||||||
def __init__(self, parent, id, pos=wx.DefaultPosition, size=wx.DefaultSize):
|
def __init__(self, parent, id, pos=wx.DefaultPosition, size=wx.Size(200,200),
|
||||||
wx.Window.__init__(self, parent, id, pos, size)
|
style= 0, validator=wx.DefaultValidator,
|
||||||
|
name= "calendar"):
|
||||||
|
wx.PyControl.__init__(self, parent, id, pos, size, style | wx.WANTS_CHARS, validator, name)
|
||||||
|
|
||||||
|
self.hasFocus = False
|
||||||
# set the calendar control attributes
|
# set the calendar control attributes
|
||||||
self.cal = None
|
|
||||||
|
|
||||||
self.hide_grid = False
|
self.hide_grid = False
|
||||||
self.hide_title = False
|
self.hide_title = False
|
||||||
@@ -649,6 +685,9 @@ class Calendar(wx.Window):
|
|||||||
self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDEvent)
|
self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDEvent)
|
||||||
self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightEvent)
|
self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightEvent)
|
||||||
self.Bind(wx.EVT_RIGHT_DCLICK, self.OnRightDEvent)
|
self.Bind(wx.EVT_RIGHT_DCLICK, self.OnRightDEvent)
|
||||||
|
self.Bind(wx.EVT_SET_FOCUS, self.OnSetFocus)
|
||||||
|
self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus)
|
||||||
|
self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
|
||||||
|
|
||||||
self.sel_key = None # last used by
|
self.sel_key = None # last used by
|
||||||
self.sel_lst = [] # highlighted selected days
|
self.sel_lst = [] # highlighted selected days
|
||||||
@@ -661,7 +700,10 @@ class Calendar(wx.Window):
|
|||||||
|
|
||||||
self.Bind(wx.EVT_PAINT, self.OnPaint)
|
self.Bind(wx.EVT_PAINT, self.OnPaint)
|
||||||
self.Bind(wx.EVT_SIZE, self.OnSize)
|
self.Bind(wx.EVT_SIZE, self.OnSize)
|
||||||
|
|
||||||
|
def AcceptsFocus(self):
|
||||||
|
return self.IsShown() and self.IsEnabled()
|
||||||
|
|
||||||
def GetColor(self, name):
|
def GetColor(self, name):
|
||||||
return MakeColor(self.colors[name])
|
return MakeColor(self.colors[name])
|
||||||
|
|
||||||
@@ -703,6 +745,65 @@ class Calendar(wx.Window):
|
|||||||
self.click = 'DRIGHT'
|
self.click = 'DRIGHT'
|
||||||
self.ProcessClick(event)
|
self.ProcessClick(event)
|
||||||
|
|
||||||
|
def OnSetFocus(self, event):
|
||||||
|
self.hasFocus = True
|
||||||
|
self.DrawFocusIndicator(True)
|
||||||
|
|
||||||
|
def OnKillFocus(self, event):
|
||||||
|
self.hasFocus = False
|
||||||
|
self.DrawFocusIndicator(False)
|
||||||
|
|
||||||
|
def OnKeyDown(self, event):
|
||||||
|
if not self.hasFocus:
|
||||||
|
event.Skip()
|
||||||
|
return
|
||||||
|
|
||||||
|
key_code = event.KeyCode()
|
||||||
|
|
||||||
|
if key_code == wx.WXK_TAB:
|
||||||
|
forward = not event.ShiftDown()
|
||||||
|
ne = wx.NavigationKeyEvent()
|
||||||
|
ne.SetDirection(forward)
|
||||||
|
ne.SetCurrentFocus(self)
|
||||||
|
ne.SetEventObject(self)
|
||||||
|
self.GetParent().GetEventHandler().ProcessEvent(ne)
|
||||||
|
event.Skip()
|
||||||
|
return
|
||||||
|
|
||||||
|
delta = None
|
||||||
|
|
||||||
|
if key_code == wx.WXK_UP:
|
||||||
|
delta = -7
|
||||||
|
elif key_code == wx.WXK_DOWN:
|
||||||
|
delta = 7
|
||||||
|
elif key_code == wx.WXK_LEFT:
|
||||||
|
delta = -1
|
||||||
|
elif key_code == wx.WXK_RIGHT:
|
||||||
|
delta = 1
|
||||||
|
elif key_code == wx.WXK_HOME:
|
||||||
|
curDate = wx.DateTimeFromDMY(int(self.cal_days[self.sel_key]),self.month - 1,self.year)
|
||||||
|
newDate = wx.DateTime_Now()
|
||||||
|
ts = newDate - curDate
|
||||||
|
delta = ts.GetDays()
|
||||||
|
|
||||||
|
if delta <> None:
|
||||||
|
curDate = wx.DateTimeFromDMY(int(self.cal_days[self.sel_key]),self.month - 1,self.year)
|
||||||
|
timeSpan = wx.TimeSpan_Days(delta)
|
||||||
|
newDate = curDate + timeSpan
|
||||||
|
|
||||||
|
if curDate.GetMonth() == newDate.GetMonth():
|
||||||
|
self.set_day = newDate.GetDay()
|
||||||
|
key = self.sel_key + delta
|
||||||
|
self.SelectDay(key)
|
||||||
|
else:
|
||||||
|
self.month = newDate.GetMonth() + 1
|
||||||
|
self.year = newDate.GetYear()
|
||||||
|
self.set_day = newDate.GetDay()
|
||||||
|
self.sel_key = None
|
||||||
|
self.DoDrawing(wx.ClientDC(self))
|
||||||
|
|
||||||
|
event.Skip()
|
||||||
|
|
||||||
def SetSize(self, set_size):
|
def SetSize(self, set_size):
|
||||||
self.size = set_size
|
self.size = set_size
|
||||||
|
|
||||||
@@ -890,7 +991,36 @@ class Calendar(wx.Window):
|
|||||||
DC.EndDrawing()
|
DC.EndDrawing()
|
||||||
|
|
||||||
# draw the selection rectangle
|
# draw the selection rectangle
|
||||||
def DrawRect(self, key, fgcolor = 'BLACK', width = 0):
|
def DrawFocusIndicator(self, draw):
|
||||||
|
DC = wx.ClientDC(self)
|
||||||
|
try:
|
||||||
|
if draw == True:
|
||||||
|
self.caldraw.DrawFocusIndicator(DC)
|
||||||
|
else:
|
||||||
|
self.caldraw.DrawBorder(DC,True)
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def DrawRect(self, key, bgcolor = 'WHITE', fgcolor= 'PINK',width = 0):
|
||||||
|
if key == None:
|
||||||
|
return
|
||||||
|
|
||||||
|
DC = wx.ClientDC(self)
|
||||||
|
DC.BeginDrawing()
|
||||||
|
|
||||||
|
brush = wx.Brush(MakeColor(bgcolor))
|
||||||
|
DC.SetBrush(brush)
|
||||||
|
|
||||||
|
DC.SetPen(wx.TRANSPARENT_PEN)
|
||||||
|
|
||||||
|
rect = self.rg[key]
|
||||||
|
DC.DrawRectangle((rect.x+1, rect.y+1), (rect.width-2, rect.height-2))
|
||||||
|
|
||||||
|
self.caldraw.DrawDayText(DC,key)
|
||||||
|
|
||||||
|
DC.EndDrawing()
|
||||||
|
|
||||||
|
def DrawRectOrg(self, key, fgcolor = 'BLACK', width = 0):
|
||||||
if key == None:
|
if key == None:
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -913,18 +1043,31 @@ class Calendar(wx.Window):
|
|||||||
# set the day selection
|
# set the day selection
|
||||||
|
|
||||||
def SetDay(self, day):
|
def SetDay(self, day):
|
||||||
day = day + self.st_pos - 1
|
d = day + self.st_pos - 1
|
||||||
self.SelectDay(day)
|
self.SelectDay(d)
|
||||||
|
|
||||||
|
def IsDayInWeekend(self, key):
|
||||||
|
try:
|
||||||
|
t = Date(self.year, self.month, 1)
|
||||||
|
|
||||||
|
day = self.cal_days[key]
|
||||||
|
day = int(day) + t.day_of_week
|
||||||
|
|
||||||
|
if day % 7 == 6 or day % 7 == 0:
|
||||||
|
return True
|
||||||
|
except:
|
||||||
|
return False
|
||||||
|
|
||||||
def SelectDay(self, key):
|
def SelectDay(self, key):
|
||||||
sel_size = 1
|
sel_size = 1
|
||||||
# clear large selection
|
# clear large selection
|
||||||
self.DrawRect(self.sel_key, self.GetColor(COLOR_BACKGROUND), sel_size)
|
|
||||||
|
if self.sel_key != None:
|
||||||
|
(cfont, bgcolor) = self.__GetColorsForDay(self.sel_key)
|
||||||
|
self.DrawRect(self.sel_key, bgcolor,cfont, sel_size)
|
||||||
|
|
||||||
if self.hide_grid is False:
|
self.DrawRect(key, self.GetColor(COLOR_HIGHLIGHT_BACKGROUND), self.GetColor(COLOR_HIGHLIGHT_FONT), sel_size)
|
||||||
self.DrawRect(self.sel_key, self.GetColor(COLOR_GRID_LINES), sel_size)
|
|
||||||
|
|
||||||
self.DrawRect(key, self.GetColor(COLOR_HIGHLIGHT_BACKGROUND), sel_size)
|
|
||||||
# store last used by
|
# store last used by
|
||||||
self.sel_key = key
|
self.sel_key = key
|
||||||
self.select_day = None
|
self.select_day = None
|
||||||
@@ -935,6 +1078,21 @@ class Calendar(wx.Window):
|
|||||||
self.set_x_mrg = xmarg
|
self.set_x_mrg = xmarg
|
||||||
self.set_y_mrg = ymarg
|
self.set_y_mrg = ymarg
|
||||||
self.set_y_end = ymarg
|
self.set_y_end = ymarg
|
||||||
|
def __GetColorsForDay(self, key):
|
||||||
|
cfont = self.GetColor(COLOR_FONT)
|
||||||
|
bgcolor = self.GetColor(COLOR_BACKGROUND)
|
||||||
|
|
||||||
|
if self.IsDayInWeekend(key) is True and self.show_weekend is True:
|
||||||
|
cfont = self.GetColor(COLOR_WEEKEND_FONT)
|
||||||
|
bgcolor = self.GetColor(COLOR_WEEKEND_BACKGROUND)
|
||||||
|
|
||||||
|
try:
|
||||||
|
dayIdx = int(self.cal_days[key])
|
||||||
|
(cfont, bgcolor) = self.caldraw.cal_sel[dayIdx]
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return (cfont, bgcolor)
|
||||||
|
|
||||||
class CalenDlg(wx.Dialog):
|
class CalenDlg(wx.Dialog):
|
||||||
def __init__(self, parent, month=None, day = None, year=None):
|
def __init__(self, parent, month=None, day = None, year=None):
|
||||||
|
Reference in New Issue
Block a user