def init_ui(self): self.text = str(cal_data.today_date_list()) # Calendar self.cal = CalendarWidget(as_popup=True, touch_switch=self.touch_switch) # Popup self.popup = Popup(content=self.cal, on_dismiss=self.update_value, title="") self.cal.parent_popup = self.popup self.bind(focus=self.show_popup) # When you click it the popup pops up
def prepare_data(self): """ Prepare data for showing on widget loading """ # Get days abbrs and month names lists self.month_names = cal_data.get_month_names() self.month_names_eng = cal_data.get_month_names_eng() self.days_abrs = cal_data.get_days_abbrs() # Today date self.active_date = cal_data.today_date_list() # Set title self.title = "%s - %s" % (self.month_names[self.active_date[1] - 1], self.active_date[2]) # Quarter where current month in the self.quarter[1] self.get_quarter()
class CalendarWidget(RelativeLayout): """ Basic calendar widget """ active_date = ListProperty(cal_data.today_date_list()) def __init__(self, as_popup=False, touch_switch=False, *args, **kwargs): super(CalendarWidget, self).__init__(*args, **kwargs) self.as_popup = as_popup self.touch_switch = touch_switch self.prepare_data() self.init_ui() def init_ui(self): self.left_arrow = ArrowButton(text="<", on_press=self.go_prev, pos_hint={ "top": 1, "left": 0 }) self.right_arrow = ArrowButton(text=">", on_press=self.go_next, pos_hint={ "top": 1, "right": 1 }) self.add_widget(self.left_arrow) self.add_widget(self.right_arrow) # Title self.title_label = MonthYearLabel(text=self.title) self.add_widget(self.title_label) # ScreenManager self.sm = MonthsManager() self.add_widget(self.sm) self.create_month_scr(self.quarter[1], toogle_today=True) def create_month_scr(self, month, toogle_today=False): """ Screen with calendar for one month """ scr = Screen() m = self.month_names_eng[self.active_date[1] - 1] scr.name = "%s-%s" % (m, self.active_date[2]) # like march-2015 # Grid for days grid_layout = ButtonsGrid() scr.add_widget(grid_layout) # Days abbrs for i in range(7): if i >= 5: # weekends l = DayAbbrWeekendLabel(text=self.days_abrs[i]) else: # work days l = DayAbbrLabel(text=self.days_abrs[i]) grid_layout.add_widget(l) # Buttons with days numbers for week in month: for day in week: if day[1] >= 5: # weekends tbtn = DayNumWeekendButton(text=str(day[0])) else: # work days tbtn = DayNumButton(text=str(day[0])) tbtn.bind(on_press=self.get_btn_value) if toogle_today: # Down today button if day[0] == self.active_date[0] and day[2] == 1: tbtn.state = "down" # Disable buttons with days from other months if day[2] == 0: tbtn.disabled = True grid_layout.add_widget(tbtn) self.sm.add_widget(scr) def prepare_data(self): """ Prepare data for showing on widget loading """ # Get days abbrs and month names lists self.month_names = cal_data.get_month_names() self.month_names_eng = cal_data.get_month_names_eng() self.days_abrs = cal_data.get_days_abbrs() # Today date self.active_date = cal_data.today_date_list() # Set title self.title = "%s - %s" % (self.month_names[self.active_date[1] - 1], self.active_date[2]) # Quarter where current month in the self.quarter[1] self.get_quarter() def get_quarter(self): """ Get caledar and months/years nums for quarter """ self.quarter_nums = cal_data.calc_quarter(self.active_date[2], self.active_date[1]) self.quarter = cal_data.get_quarter(self.active_date[2], self.active_date[1]) def get_btn_value(self, inst): """ Get day value from pressed button """ self.active_date[0] = int(inst.text) if self.as_popup: self.parent_popup.dismiss() def go_prev(self, inst): """ Go to screen with previous month """ # Change active date self.active_date = [ self.active_date[0], self.quarter_nums[0][1], self.quarter_nums[0][0] ] # Name of prev screen n = self.quarter_nums[0][1] - 1 prev_scr_name = "%s-%s" % (self.month_names_eng[n], self.quarter_nums[0][0]) # If it's doen't exitst, create it if not self.sm.has_screen(prev_scr_name): self.create_month_scr(self.quarter[0]) self.sm.current = prev_scr_name self.sm.transition.direction = "left" self.get_quarter() self.title = "%s - %s" % (self.month_names[self.active_date[1] - 1], self.active_date[2]) self.title_label.text = self.title def go_next(self, inst): """ Go to screen with next month """ # Change active date self.active_date = [ self.active_date[0], self.quarter_nums[2][1], self.quarter_nums[2][0] ] # Name of prev screen n = self.quarter_nums[2][1] - 1 next_scr_name = "%s-%s" % (self.month_names_eng[n], self.quarter_nums[2][0]) # If it's doen't exitst, create it if not self.sm.has_screen(next_scr_name): self.create_month_scr(self.quarter[2]) self.sm.current = next_scr_name self.sm.transition.direction = "right" self.get_quarter() self.title = "%s - %s" % (self.month_names[self.active_date[1] - 1], self.active_date[2]) self.title_label.text = self.title def on_touch_move(self, touch): """ Switch months pages by touch move """ if self.touch_switch: # Left - prev if touch.dpos[0] < -30: self.go_prev(None) # Right - next elif touch.dpos[0] > 30: self.go_next(None)