• crazyfox


    Thank you again for saving my project (and sanity)
    I had read that thread before, but didn’t make the connection.

    Here’s what worked for me:
    I ended up using

    vi = ObjCInstance(b)

    Since my object ‘b’ is ui.Button

    Also, the popover location was off by the title bar height. Used GetTitleBarHeight() from here. Adjusted popover padding with help from here.

    I appreciate how helpful this community is. I’m learning a lot.

    posted in Pythonista read more
  • crazyfox

    Hi all-

    I’m trying to present a popover triggered by a button in a TableViewCell.
    My underlying table is a TreeNode (from File Picker) and so I can’t use row_height * row index calculation.
    Converting button.center to screen_coordinates is where I’m getting stuck (I think this is how to accomplish the task)

    Any thoughts?

    posted in Pythonista read more
  • crazyfox

    @JonB thanks for the suggestions.

    posted in Pythonista read more
  • crazyfox

    Hi all,

    I have multiple tableviews presented in navigationview. There is a textview in the root view. I want to collect all user selections (from all nav views) and display in textview.

    1. I'm getting stuck on how to update the textview when a selection is made in deeper sub-levels.

    2. What if the individual tables are generated from separate classes?

    Can you point me towards a strategy to accomplish this task?


    import ui
    import console
    class MyTableView(object):
        def __init__(self, items, name):
            self.items = items
            self.tv = ui.TableView()
            self.tv.name = self.name = name
            self.tv.delegate = self.tv.data_source = self
        def tableview_did_select(self, tableview, section, row):
            if self.name == 'House' and self.items[row] == 'Kitchen':
                print(self.name, row)
                pushed_view = eval('kitchen_tv.tv')
                # does not work. 
                # print('pushed view: {}\nnav view: {}'.format(pushed_view.name,pushed_view.navigation_view))
                # pushed_view.navigation_view.superview.superview['txv'].text += self.items[row] +'\n'
            elif self.name == 'Kitchen' and self.items[row] == 'Fruits':
                pushed_view = eval('fruit_tv.tv')
                # does not work
                pushed_view.navigation_view.superview.superview['txv'].text += self.items[row]+'\n'
                tableview.navigation_view.superview.superview['txv'].text += self.items[row]+'\n' #this works
        def tableview_number_of_sections(self, tableview):
            return 1
        def tableview_number_of_rows(self, tableview, section):
            return len(self.items)
        def tableview_cell_for_row(self, tableview, section, row):
            cell = ui.TableViewCell()
            cell.text_label.text = self.items[row]
            return cell
    house_list = 'Bed Bath Kitchen'.split()
    kitchen_list = 'Fruits Vegetables Drinks'.split()
    fruit_list = 'Orange Grape Apple Banana'.split()
    house_tv = MyTableView(house_list, 'House')
    kitchen_tv = MyTableView(kitchen_list, 'Kitchen')
    fruit_tv = MyTableView(fruit_list, 'Fruits')
    root = ui.View(frame=(0,0,630,330),background_color= '#e3f4ff')
    txv = ui.TextView(name='txv', frame=(320,10,300,300), background_color='white')
    nav_base = ui.View(frame = (10,10,300,300), background_color= '#fafafa') #container for nav
    nav = ui.NavigationView(house_tv.tv)

    posted in Pythonista read more
  • crazyfox

    @cvp. Helpful! Thank you.

    posted in Pythonista read more
  • crazyfox

    @cvp Thank you for taking the time.
    I think I was making it harder than it should be.

    @crazyfox first, replace load_str by load_view_str 😀

    ...I see it now. Editing/posting error trying include pyui string.

    @crazyfox sincerely, I don't understand your

            cell = ui.TableViewCell()
            cell = MyDropDown(tableview, section, row, frame=(100,0,200,100), items=itemslist).as_cell() 

    ...This evolved out of series of TypeErrors and issues with arguments I could not fix elegantly.

    Much more to learn. Thanks again for your help.
    Until next mental block.

    posted in Pythonista read more
  • crazyfox

    Thanks @cvp
    This is what I’ve cobbled together (with inspiration from @cvp and @jonb.
    Very crude.

    1. I’m trying to understand how to position UI elements in table view row.
    2. looks like row_height in main table has to tall enough for dropdown views and touch capture.

    I’m an absolute beginner, so any feedback is appreciated.
    Thanks, KP

    [picture link] don’t know why I can’t do inline images. https://imgur.com/n4U3RCf

    import ui, console,dialogs
    pyui_str = r'''
        "nodes" : [
            "nodes" : [
            "frame" : "{{21, 24}, {480, 287}}",
            "class" : "TableView",
            "attributes" : {
              "flex" : "WH",
              "data_source_items" : "Row 1\nRow 2\nRow 3",
              "name" : "tableview1",
              "frame" : "{{120, 110}, {200, 200}}",
              "data_source_number_of_lines" : 1,
              "class" : "TableView",
              "background_color" : "RGBA(1.0, 1.0, 1.0, 1.0)",
              "data_source_delete_enabled" : true,
              "data_source_font_size" : 18,
              "row_height" : 66,
              "uuid" : "BE2CD45E-DD3C-496F-98C3-93E1222A94AA"
            "selected" : false
        "frame" : "{{0, 0}, {523, 405}}",
        "class" : "View",
        "attributes" : {
          "enabled" : true,
          "background_color" : "RGBA(1.000000,1.000000,1.000000,1.000000)",
          "tint_color" : "RGBA(0.000000,0.478000,1.000000,1.000000)",
          "border_color" : "RGBA(0.000000,0.000000,0.000000,1.000000)",
          "flex" : ""
        "selected" : false
    class MyDropDown(ui.View):
        def __init__(self, tableview, section, row, items=[], frame=(0,0,200,200), *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.frame = frame
            self.border_width = 1
            self.border_color = 'red'
            tf = ui.TextField(name='tf')
            tf.enabled = False
            tf.frame = (self.x,self.y,self.width-32,32)
            tf.border_width= 1
            tf.corner_radius = 5
            self.tf = tf
            b = ui.Button()
            b.frame = (tf.x+tf.width,self.y,32,32)
            b.image = ui.Image.named('iob:arrow_down_b_32')
            b.border_width = 1
            b.corner_radius = 5
            b.action = self.b_action
            tv = ui.TableView()
            tv.frame = (self.x,tf.height,tf.width,self.height-32)
            tv.border_width = 1
            tv.corner_radius = 5
            tv.data_source = ui.ListDataSource(items=items)
            tv.height = min(24*3,24*len(items))
            tv.row_height= 24
            tv.delegate = self
            tv.hidden = True
            self.tv = tv
        def b_action(self,sender):
            self.h = self.height
            def showtable():
                self.border_color = 'green'
                self.tv.hidden = False
                self.height = self.tv.height+32
        def tableview_did_select(self,tableview, section, row):
            # Called when a row was selected
            data = tableview.data_source.items[row]
            self.tf.text = data
            def hidetable():
                self.border_color = 'red'
                self.height = self.h
            tableview.hidden = True    
        def as_cell(self):
            return c
    class MainView(ui.View):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            v = ui.load_str(pyui_str)
            t = v['tableview1']
            t.delegate = t.data_source = self
            t.row_height = 222
            self.content_view = None
            self.tbl = t
        def tableview_number_of_rows(self, tableview, section):
            # Return the number of rows in the section
            #return len(self.items)
            return 2
        def tableview_cell_for_row(self, tableview, section, row):
            # Create and return a cell for the given section/row
            if row==0:
                itemslist = ['as','sd','df']
            elif row==1:
                itemslist = ['wer','qwe','ghj']
            cell = ui.TableViewCell()
            cell = MyDropDown(tableview, section, row, frame=(100,0,200,100), items=itemslist).as_cell()
            seg = ui.SegmentedControl(name='segRL')
            seg.segments = ['R','L']
            seg.selected_index = -1
            seg.frame = (0,0,96,32)
            seg.action = self.seg_action
            tf_stent = ui.TextField(name='tf_stent',placeholder='boo')
            tf_stent.enabled = True
            tf_stent.clear_button_mode = 'while_editing'
            tf_stent.frame = (500,0,60,32)
            tf_stent.border_width= 1
            tf_stent.corner_radius = 5
            tfl = ui.TextField(name='tfl')
            tfl.enabled = True
            tfl.clear_button_mode = 'while_editing'
            tfl.frame = (seg.width+4,0,120,32)
            tfl.border_width= 1
            tfl.corner_radius = 5
            self.tfl = tfl
            return cell
        def change_row_ht(ht=44):
            self.tbl.row_height = ht
            #redraw display
        def seg_action(self, sender):
            sideRL = sender.segments[sender.selected_index]

    posted in Pythonista read more
  • crazyfox

    Hi all,
    Any ideas on recreating the UI seen in Apple Mail rules (attached) or similar(smart mailboxes, etc)? i.e. Expandable table with multiple dropdowns in each row.

    I am populating tableviewcell_for_row with custom UIView class and other standard elements. The layout has been difficult to define and dropdown selections are restricted to row height. I think I can make it work but is not pretty.

    Is there a more elegant way to approach this?



    posted in Pythonista read more
  • crazyfox

    I’m having the same issue.
    iPad Pro 13.3 cannot see snippets button.

    Disappointing as this was a big selling point for me.

    Am I missing a setting somewhere?

    posted in Editorial read more
  • crazyfox

    Thank you. Sorry didn’t mean to hijack your thread.

    It works. Thanks again for pointing me in the right direction.

    posted in Pythonista read more

Internal error.

Oops! Looks like something went wrong!