Thanks @cvp
This is what I’ve cobbled together (with inspiration from @cvp and @jonb.
Very crude.
- I’m trying to understand how to position UI elements in table view row.
- 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'
self.background_color='#f6feff'
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.add_subview(tf)
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
self.add_subview(b)
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.add_subview(tv)
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
ui.animate(showtable,.4)
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
ui.animate(hidetable,.4)
tableview.hidden = True
def as_cell(self):
c=ui.TableViewCell()
self.frame=c.content_view.bounds
c.content_view.add_subview(self)
c.set_needs_display()
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
v.present()
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
cell.content_view.add_subview(seg)
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.border_color='blue'
tf_stent.corner_radius = 5
cell.content_view.add_subview(tf_stent)
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.add_subview(tfl)
self.tfl = tfl
return cell
def change_row_ht(ht=44):
self.tbl.row_height = ht
#redraw display
self.tbl.set_needs_display()
def seg_action(self, sender):
sideRL = sender.segments[sender.selected_index]
MainView()