omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello β€” I'm @olemoritz on Twitter.


    Date Picker w/ blank year

    Pythonista
    3
    21
    2651
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • osamu
      osamu last edited by osamu

      Hi, guys!

      Does anybody know if we can implement Date Picker w/ the year left blank?

      Blank year is expressed as ----, and I know it's internal expression is the year 1604.

      cvp 1 Reply Last reply Reply Quote 0
      • cvp
        cvp @osamu last edited by cvp

        @osamu hide it

        import ui
        from  objc_util import ObjCInstance,ObjCClass
        d = ui.DatePicker()
        d.frame = (0,0,300,100)
        d.mode = ui.DATE_PICKER_MODE_DATE
        objc = ObjCInstance(d)
        back_ui_color = ObjCClass('UIColor').color(red=0.8, green=0.8, blue=0.8, alpha=1.0)
        objc.backgroundColor = back_ui_color
        
        h = ui.View()
        hc = ObjCInstance(h)
        hc.backgroundColor = back_ui_color
        w = 100
        h.frame = (d.width-w,0,w,d.height)
        d.add_subview(h)
        d.present('sheet')
        

        osamu 1 Reply Last reply Reply Quote 0
        • osamu
          osamu last edited by

          This post is deleted!
          1 Reply Last reply Reply Quote 0
          • osamu
            osamu @cvp last edited by ccc

            @cvp thank you.

            what I meant is to enter year 1604 in order to invalidate the year as the following image that I failed to embed:

            cvp 4 Replies Last reply Reply Quote 0
            • cvp
              cvp @osamu last edited by

              @osamu said

              And I failed to embed the image

              Use

              ![](url)
              
              1 Reply Last reply Reply Quote 0
              • cvp
                cvp @osamu last edited by cvp

                @osamu Ok, I understand, I'll try to hide the year by a normal (ObjectiveC) picker. Back in some hours.

                1 Reply Last reply Reply Quote 0
                • cvp
                  cvp @osamu last edited by

                  @osamu I'm still in progress...

                  1 Reply Last reply Reply Quote 0
                  • cvp
                    cvp @osamu last edited by cvp

                    @osamu ok, try this (hoping I had correctly understood, but not sure)
                    The view title will show the selected date

                    from   datetime import datetime
                    import ui
                    from   objc_util import ObjCInstance,ObjCClass
                    from   math import pi,cos,sin
                    
                    #===================== delegate of UIPickerView: begin =====================
                    def pickerView_numberOfRowsInComponent_(self, cmd, picker_view, component):
                        return(len(ObjCInstance(picker_view).data))
                    
                    def numberOfComponentsInPickerView_(self, cmd, picker_view):
                        return 1
                    
                    def rowSize_forComponent_(self, cmd, picker_view, component):
                        return ObjCInstance(picker_view).myRowWidth
                    
                    def pickerView_rowHeightForComponent_(self, cmd, picker_view, component):
                        return ObjCInstance(picker_view).myRowHeight
                    
                    def pickerView_didSelectRow_inComponent_(self, cmd, picker_view, row, component):
                        UIPickerView = ObjCInstance(picker_view)
                        UIPickerView.selectedRow = row
                        if UIPickerView.myDidSelectRow:
                            UIPickerView.myDidSelectRow()
                        return
                    
                    def pickerView_viewForRow_forComponent_reusingView_(self, cmd, picker_view, row, component,view_ptr):
                        UIPickerView = ObjCInstance(picker_view)
                        if view_ptr == None:
                          #view = ObjCClass('UILabel').alloc().init()
                          #view.setText_(UIPickerView.data[row])
                          uiview = ui.Label()
                          uiview.alignment = ui.ALIGN_CENTER
                          uiview.text_color = 'red'
                          uiview.text = UIPickerView.data[row]
                          view = ObjCInstance(uiview)
                          view.setClipsToBounds_(True)
                          if UIPickerView.horiz:
                            a = pi/2
                            rot = CGAffineTransform(cos(a),-sin(a),sin(a),cos(a),0,0)
                            view.setTransform_(rot, restype=None, argtypes=[CGAffineTransform])
                        else:
                          view = ObjCInstance(view_ptr)
                        return view.ptr
                    
                    methods = [
                    	numberOfComponentsInPickerView_, pickerView_numberOfRowsInComponent_, rowSize_forComponent_, pickerView_rowHeightForComponent_, pickerView_didSelectRow_inComponent_, pickerView_viewForRow_forComponent_reusingView_]
                    
                    protocols = ['UIPickerViewDataSource', 'UIPickerViewDelegate']
                    
                    UIPickerViewDataSourceAndDelegate = create_objc_class(
                        'UIPickerViewDataSourceAndDelegate', methods=methods, protocols=protocols)
                    #===================== delegate of UIPickerView: end =======================
                    
                    class MyUIPickerView(ui.View):
                        def __init__(self, data, horiz=False,myRowHeight=100, myDidSelectRow=None, **kwargs):
                            super().__init__(**kwargs)
                            
                            UIPickerView = ObjCClass('UIPickerView')
                            self._picker_view = UIPickerView.alloc().initWithFrame_(ObjCInstance(self).bounds()).autorelease()
                            ObjCInstance(self).addSubview_(self._picker_view)
                            self.delegate_and_datasource = UIPickerViewDataSourceAndDelegate.alloc().init().autorelease()
                            self._picker_view.delegate = self.delegate_and_datasource
                            self._picker_view.dataSource = self.delegate_and_datasource
                            
                            self._picker_view.myRowWidth = self.width
                            self._picker_view.myRowHeight = myRowHeight
                            self._picker_view.myDidSelectRow = myDidSelectRow
                            self._picker_view.data = data
                            self._picker_view.horiz = horiz
                            
                            if horiz:
                              a = -pi/2
                              rot = CGAffineTransform(cos(a),-sin(a),sin(a),cos(a),0,0)
                              self._picker_view.setTransform_(rot, restype=None, argtypes=[CGAffineTransform])
                    
                            
                        def layout(self):
                            self._picker_view.frame = ObjCInstance(self).bounds()
                    
                    
                    v = ui.View()
                    v.name = 'for @osamu'
                    v.frame = (0,0,300,150)
                    d = ui.DatePicker()
                    d.frame = v.frame
                    d.mode = ui.DATE_PICKER_MODE_DATE
                    def d_action(sender):
                    	d_str = sender.date.strftime('%Y%m%d %H%M%S')
                    	v.name = d_str
                    d.action = d_action
                    v.add_subview(d)
                    objc = ObjCInstance(d)
                    back_ui_color = ObjCClass('UIColor').color(red=0.8, green=0.8, blue=0.8, alpha=1.0)
                    objc.backgroundColor = back_ui_color
                    
                    years = ['2019','2020','2021','2022','----']
                    w = 100
                    def myDidSelectRow():
                    	#print(pv._picker_view.selectedRow)
                    	year = years[pv._picker_view.selectedRow]
                    	if year == '----':
                    		year = '1604'
                    	d_str = year + d.date.strftime('%m%d %H%M%S')
                    	d.date = datetime. strptime(d_str, '%Y%m%d %H%M%S')
                    	v.name = d_str
                    pv = MyUIPickerView(years, myRowHeight=32, myDidSelectRow=myDidSelectRow, frame=(d.width-w,0,w,d.height))
                    pv.background_color = 'lightgray'
                    #pv.border_width = 1
                    #pv.border_color = 'blue'
                    #pv.corner_radius = 5
                    v.add_subview(pv)
                    hc = ObjCInstance(pv)
                    hc.backgroundColor = back_ui_color
                    v.present('sheet')
                    

                    italicised text

                    osamu 4 Replies Last reply Reply Quote 0
                    • osamu
                      osamu @cvp last edited by

                      @cvp Thank you very much indeed for spending time πŸ™
                      This picker is the one that shows up when you enter birthday and other dates when using contacts app. I’m going to try your code.

                      cvp 2 Replies Last reply Reply Quote 0
                      • cvp
                        cvp @osamu last edited by

                        @osamu In this case, the ---- can't be selected but only shows a maximum date.
                        I think that we can also set this maximum date without all the code I wrote

                        1 Reply Last reply Reply Quote 0
                        • cvp
                          cvp @osamu last edited by cvp

                          @osamu try this little script. You will not see the wanted "----" but after the now-date, day/month/years are grayed and not selectable with automatic return to today picker. I'm sure I'm not clear, thus try it.

                          import ui
                          v = ui.View()
                          v.name = 'for @osamu'
                          v.frame = (0,0,300,150)
                          d = ui.DatePicker()
                          d.frame = v.frame
                          d.mode = ui.DATE_PICKER_MODE_DATE
                          v.add_subview(d)
                          objc = ObjCInstance(d)
                          nsDate = ObjCClass('NSDate').alloc().init() # initialized with now-date
                          #print(dir(nsDate))
                          objc.setMaximumDate_(nsDate)
                          v.present('sheet')
                          
                          osamu 1 Reply Last reply Reply Quote 0
                          • osamu
                            osamu @cvp last edited by

                            @cvp said:

                            objc.setMaximumDate_(nsDate)

                            Thank you, I’m interested in the above attribute.

                            1 Reply Last reply Reply Quote 0
                            • osamu
                              osamu @cvp last edited by

                              @cvp I tried the first version but Pythonista claimed create_objc_class() is missing. There may be some more. I guess I need to sneak into your library and steal them.

                              cvp 1 Reply Last reply Reply Quote 0
                              • cvp
                                cvp @osamu last edited by

                                @osamu my error

                                from   objc_util import *
                                
                                osamu 1 Reply Last reply Reply Quote 0
                                • osamu
                                  osamu @cvp last edited by

                                  @cvp I got it. Thank you.

                                  1 Reply Last reply Reply Quote 0
                                  • osamu
                                    osamu @cvp last edited by

                                    @cvp This script initializes the year as 2019. If I set;
                                    years = [str(y) for y in range(1605,datetime.now().year+1)] + ['----']
                                    the initial year is set to 1605 and we’re far away from β€”β€” and recent years. Can we control this initial value?

                                    1 Reply Last reply Reply Quote 0
                                    • JonB
                                      JonB last edited by

                                      Have you tried reversing the list?

                                      osamu 1 Reply Last reply Reply Quote 0
                                      • osamu
                                        osamu @JonB last edited by

                                        @JonB That’s a good idea πŸ‘

                                        1 Reply Last reply Reply Quote 0
                                        • osamu
                                          osamu @cvp last edited by ccc

                                          @cvp one last question.
                                          Can I set the initial year?
                                          The following does not work.

                                          class MyUIPickerView(ui.View):
                                              def __init__(self, data, horiz=False,myRowHeight=100, myDidSelectRow=None, **kwargs):
                                                  super().__init__(**kwargs)
                                                  
                                                  UIPickerView = ObjCClass('UIPickerView')
                                                  self._picker_view = UIPickerView.alloc().initWithFrame_(ObjCInstance(self).bounds()).autorelease()
                                                  ObjCInstance(self).addSubview_(self._picker_view)
                                                 ...
                                                 self._picker_view.selectedRow = XXX
                                          

                                          Thanks in advance.

                                          cvp 1 Reply Last reply Reply Quote 0
                                          • cvp
                                            cvp @osamu last edited by cvp

                                            @osamu selectedRow is not an attribute of UIPickerView but is an user attribute set in the pickerView_didSelectRow_inComponent_ delegate, thus you can't set it.

                                            I think we would need to use kind of

                                            .
                                            .
                                            .
                                                    self._picker_view.horiz = horiz
                                                    xxx = 1
                                                    self._picker_view.selectRow_inComponent_animated_(xxx,0,True)
                                            

                                            Tested, ok

                                            osamu 1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post
                                            Powered by NodeBB Forums | Contributors