Forum Archive

Form_Dialog datetime type with year

cvp

For people like @Grun6 who write their own Form_Dialog, the datetime field type does not really allow to select the year, but only month/day/hour/minute.
With this modification, this code creates one date picker AND one time picker and so the user can really also select the year.

def show_datepicker(self, mode):
        ui.end_editing()
        self.shield_view = ui.View()
        self.shield_view.flex = 'WH'
        self.shield_view.frame = (0, 0, self.view.width, self.view.height)

        self.dismiss_datepicker_button = ui.Button()
        self.dismiss_datepicker_button.flex = 'WH'
        self.dismiss_datepicker_button.frame = (0, 0, self.view.width, self.view.height)
        self.dismiss_datepicker_button.background_color = (0, 0, 0, 0.5)
        self.dismiss_datepicker_button.action = self.dismiss_datepicker
        self.dismiss_datepicker_button.alpha = 0.0
        self.shield_view.add_subview(self.dismiss_datepicker_button)

        self.date_picker = ui.DatePicker()
        self.date_picker.date = self.selected_date_value
        self.date_picker.background_color = 'white'
        if mode == ui.DATE_PICKER_MODE_DATE_AND_TIME:
            self.date_picker.mode = ui.DATE_PICKER_MODE_DATE
            w = self.shield_view.width/2
        else:
            self.date_picker.mode = mode
            w = self.shield_view.width
        self.date_picker.frame = (0, self.shield_view.height - self.date_picker.height, w, self.date_picker.height)
        self.date_picker.flex = 'TW'
        self.date_picker.transform = ui.Transform.translation(0, self.date_picker.height)
        self.shield_view.add_subview(self.date_picker)

        if mode == ui.DATE_PICKER_MODE_DATE_AND_TIME:       
            self.time_picker = ui.DatePicker()
            self.time_picker.date = self.selected_date_value
            self.time_picker.background_color = 'white'
            self.time_picker.mode = ui.DATE_PICKER_MODE_TIME
            self.time_picker.frame = (w, self.shield_view.height - self.time_picker.height, w, self.date_picker.height)
            self.time_picker.flex = 'TW'
            self.time_picker.transform = ui.Transform.translation(0, self.time_picker.height)
            self.shield_view.add_subview(self.time_picker)

        self.container_view.add_subview(self.shield_view)

        def fade_in():
            self.dismiss_datepicker_button.alpha = 1.0
            self.date_picker.transform = ui.Transform.translation(0, 0)
            if hasattr(self,'time_picker'):
                self.time_picker.transform = ui.Transform.translation(0, 0)
        ui.animate(fade_in, 0.3)

    def dismiss_datepicker(self, sender):
        value = self.date_picker.date
        if hasattr(self,'time_picker'):
            value_time = self.time_picker.date
            # store time of value_time in value
            date_str = datetime.datetime.strftime(value,'%Y:%m:%d %H:%M:%S')
            time_str = datetime.datetime.strftime(value_time,'%Y:%m:%d %H:%M:%S')
            date_str = date_str[:10] + time_str[10:]
            value = datetime.datetime.strptime(date_str, '%Y:%m:%d %H:%M:%S')

        if self.selected_date_type == 'date':
            self.selected_date_cell.detail_text_label.text = value.strftime(self.selected_date_format)
        elif self.selected_date_type == 'time':
            self.selected_date_cell.detail_text_label.text = value.strftime(self.selected_date_format)
        else:
            self.selected_date_cell.detail_text_label.text = value.strftime(self.selected_date_format)

        self.values[self.selected_date_key] = value

        def fade_out():
            self.dismiss_datepicker_button.alpha = 0.0
            self.date_picker.transform = ui.Transform.translation(0, self.date_picker.height)
            if hasattr(self,'time_picker'):
                self.time_picker.transform = ui.Transform.translation(0, self.time_picker.height)
Grun6

Nice modification @cvp