-
-
Notifications
You must be signed in to change notification settings - Fork 403
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
highlight of table cells in front end. #516
Comments
Hello @WAvdBeek, You specified style['background'] but it should be style['background-color']. from remi import App, gui, start
class HighLightTableItem(gui.TableItem):
''' Hightlight the item when hovered over
'''
def __init__(self, *arg, **kwargs):
""" init, like before """
super(HighLightTableItem, self).__init__(*arg, **kwargs)
self.onmouseout.do(self.mouseout, js_stop_propagation = True, js_prevent_default = True)
self.onmouseleave.do(self.mouseout, js_stop_propagation = True, js_prevent_default = True)
self.onmouseover.do(self.mouseover, js_stop_propagation = True, js_prevent_default = True)
self.hover_over = False
def mouseover(self, _emitter):
""" mouse over """
self.hover_over = True
self.style['background-color'] = "rgba(4, 90, 188, 0.26)"
def mouseout(self, _emitter):
""" mouse out """
self.hover_over = False
del self.style['background-color']
class HighLightTableWidget(gui.Table):
''' A subclass of gui.Table that has the feature
that the last selected row is highlighted
and that allows for multi_row selection.
'''
@property
@gui.editor_attribute_decorator("WidgetSpecific", '''Table colum count.''', int, {'possible_values': '', 'min': 0, 'max': 100, 'default': 1, 'step': 1})
def column_count(self): return self.__column_count
@column_count.setter
def column_count(self, value): self.set_column_count(value)
@property
@gui.editor_attribute_decorator("WidgetSpecific", '''Table row count.''', int, {'possible_values': '', 'min': 0, 'max': 100, 'default': 1, 'step': 1})
def row_count(self): return len(self.children)
@row_count.setter
def row_count(self, value): self.set_row_count(value)
@property
@gui.editor_attribute_decorator("WidgetSpecific", '''Table use title.''', bool, {})
def use_title(self): return self.__use_title
@use_title.setter
def use_title(self, value): self.set_use_title(value)
def __init__(self, n_rows=2, n_columns=2, use_title=True, editable=False, use_selection=False, *arg, **kwargs):
self.__column_count = 0
self.__use_title = use_title
super(HighLightTableWidget, self).__init__(*arg, **kwargs)
self._editable = editable
self.set_use_title(use_title)
self.set_column_count(n_columns)
self.set_row_count(n_rows)
self.css_display = 'table'
# the additions below
self.attributes['tabindex'] = '1'
self.onkeydown.do(self.keydown)
self.onkeyup.do(self.keyup)
#self.onmouseout.do(self.mouseout)
#self.onmouseover.do(self.mouseover)
self.multi_selection_enabled = False
self.hover_over = False
self.selected_row_list = []
self.use_selection = use_selection
def set_use_title(self, use_title):
"""Returns the TableItem instance at row, column cordinates
Args:
use_title (bool): enable title bar.
"""
self.__use_title = use_title
self._update_first_row()
def _update_first_row(self):
cl = HighLightTableItem
if self.__use_title:
cl = gui.TableTitle
if len(self.children) > 0:
for c_key in self.children['0'].children.keys():
instance = cl(self.children['0'].children[c_key].get_text())
self.children['0'].append(instance, c_key)
# here the cells of the first row are overwritten
# and aren't appended by the standard Table.append
# method. We have to restore de standard on_click
#internal listener in order to make it working
# the Table.on_table_row_click functionality
instance.onclick.do(self.children['0'].on_row_item_click)
def append_from_list(self, content, fill_title=False):
"""
Appends rows created from the data contained in the provided
list of tuples of strings. The first tuple of the list can be
set as table title.
Args:
content (list): list of tuples of strings. Each tuple is a row.
fill_title (bool): if true, the first tuple in the list will
be set as title.
"""
row_index = 0
for row in content:
tr = gui.TableRow()
column_index = 0
for item in row:
if row_index == 0 and fill_title:
ti = gui.TableTitle(item)
else:
ti = HighLightTableItem(item)
tr.append(ti, str(column_index))
column_index = column_index + 1
self.append(tr, str(row_index))
row_index = row_index + 1
def set_row_count(self, count):
"""Sets the table row count.
Args:
count (int): number of rows
"""
current_row_count = self.row_count
current_column_count = self.column_count
if count > current_row_count:
cl = HighLightTableItem
for i in range(current_row_count, count):
tr = gui.TableRow()
for c in range(0, current_column_count):
tr.append(cl(), str(c))
if self._editable:
tr.children[str(c)].onchange.do(
self.on_item_changed, int(i), int(c))
self.append(tr, str(i))
self._update_first_row()
elif count < current_row_count:
for i in range(count, current_row_count):
self.remove_child(self.children[str(i)])
def set_column_count(self, count):
"""Sets the table column count.
Args:
count (int): column of rows
"""
current_row_count = self.row_count
current_column_count = self.column_count
if count > current_column_count:
cl = HighLightTableItem
for r_key in self.children.keys():
row = self.children[r_key]
for i in range(current_column_count, count):
row.append(cl(), str(i))
if self._editable:
row.children[str(i)].onchange.do(
self.on_item_changed, int(r_key), int(i))
self._update_first_row()
elif count < current_column_count:
for row in self.children.values():
for i in range(count, current_column_count):
row.remove_child(row.children[str(i)])
self.__column_count = count
@gui.decorate_event
def on_item_changed(self, item, new_value, row, column):
"""Event for the item change.
Args:
emitter (TableWidget): The emitter of the event.
item (TableItem): The TableItem instance.
new_value (str): New text content.
row (int): row index.
column (int): column index.
"""
return (item, new_value, row, column)
@gui.decorate_event
def on_table_row_click(self, row, item):
''' Highlight selected row(s)
and put the result of a muti_row selection
in the list "self.selected_row_list".
'''
if not self.multi_selection_enabled:
self.remove_selection()
if self.use_selection:
if row not in self.selected_row_list:
self.selected_row_list.append(row)
row.style['outline'] = "2px dotted blue"
return (row, item)
def keydown(self, _emitter, _key, ctrl, _shift, _alt):
""" key down function """
# print("key:%d ctrl:%d shift:%d alt:%d", (key, ctrl, shift, alt))
if self.use_selection:
if ctrl.lower() == 'true':
self.multi_selection_enabled = True
def keyup(self, _emitter, _key, _ctrl, _shift, _alt):
""" key up function """
self.multi_selection_enabled = False
def remove_selection(self):
""" remove selection """
for r in self.selected_row_list:
del r.style['outline']
self.selected_row_list = []
class MyApp(App):
def main(self):
#creating a container VBox type, vertical (you can use also HBox or Widget)
main_container = gui.VBox(width=300, height=200, style={'margin':'0px auto'})
self.table = HighLightTableWidget.new_from_list([('ID', 'First Name', 'Last Name'),
('101', 'Danny', 'Young'),
('102', 'Christine', 'Holand'),
('103', 'Lars', 'Gordon'),
('104', 'Roberto', 'Robitaille'),
('105', 'Maria', 'Papadopoulos')], width=300, height=200, margin='10px')
main_container.append(self.table)
# returning the root widget
return main_container
if __name__ == "__main__":
start(MyApp, address='0.0.0.0', port=0, start_browser=True, update_interval = 0) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I wrote some code on the backend to change color of a tab item.
I copy paste the original table & table item and added the code to it via mouseover & mouseout function.
i think this also should be possible on the front end.
any idea how?
here is the code:
The text was updated successfully, but these errors were encountered: