Refactory class UnoGrid

This commit is contained in:
Mauricio Baeza 2020-11-21 22:20:00 -06:00
parent 830d08d01d
commit 41342b8a59
2 changed files with 113 additions and 95 deletions

View File

@ -705,34 +705,6 @@ class LOCellRange(object):
return LOCellRange(self.sheet[cell.AbsoluteName].obj, self.doc) return LOCellRange(self.sheet[cell.AbsoluteName].obj, self.doc)
class EventsMouseGrid(EventsMouse):
selected = False
def mousePressed(self, event):
super().mousePressed(event)
# ~ obj = event.Source
# ~ col = obj.getColumnAtPoint(event.X, event.Y)
# ~ row = obj.getRowAtPoint(event.X, event.Y)
# ~ print(col, row)
# ~ if col == -1 and row == -1:
# ~ if self.selected:
# ~ obj.deselectAllRows()
# ~ else:
# ~ obj.selectAllRows()
# ~ self.selected = not self.selected
return
def mouseReleased(self, event):
# ~ obj = event.Source
# ~ col = obj.getColumnAtPoint(event.X, event.Y)
# ~ row = obj.getRowAtPoint(event.X, event.Y)
# ~ if row == -1 and col > -1:
# ~ gdm = obj.Model.GridDataModel
# ~ for i in range(gdm.RowCount):
# ~ gdm.updateRowHeading(i, i + 1)
return
class EventsModify(EventsListenerBase, XModifyListener): class EventsModify(EventsListenerBase, XModifyListener):
def __init__(self, controller): def __init__(self, controller):
@ -1426,17 +1398,6 @@ class LOChart(object):
return self return self
def _set_column_model(columns):
#~ https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1awt_1_1grid_1_1XGridColumn.html
column_model = create_instance('com.sun.star.awt.grid.DefaultGridColumnModel', True)
for column in columns:
grid_column = create_instance('com.sun.star.awt.grid.GridColumn', True)
for k, v in column.items():
setattr(grid_column, k, v)
column_model.addColumn(grid_column)
return column_model
class LODialog(object): class LODialog(object):
def _get_type_control(self, name): def _get_type_control(self, name):

View File

@ -2998,10 +2998,10 @@ def _add_listeners(events, control, name=''):
getattr(control, key)(listeners[key](events, name)) getattr(control, key)(listeners[key](events, name))
# ~ if is_grid: if is_grid:
# ~ controllers = EventsGrid(events, name) controllers = EventsGrid(events, name)
# ~ control.addSelectionListener(controllers) control.addSelectionListener(controllers)
# ~ control.Model.GridDataModel.addGridDataListener(controllers) control.Model.GridDataModel.addGridDataListener(controllers)
return return
@ -3188,6 +3188,34 @@ class EventsGrid(EventsListenerBase, XGridDataListener, XGridSelectionListener):
return return
class EventsMouseGrid(EventsMouse):
selected = False
def mousePressed(self, event):
super().mousePressed(event)
# ~ obj = event.Source
# ~ col = obj.getColumnAtPoint(event.X, event.Y)
# ~ row = obj.getRowAtPoint(event.X, event.Y)
# ~ print(col, row)
# ~ if col == -1 and row == -1:
# ~ if self.selected:
# ~ obj.deselectAllRows()
# ~ else:
# ~ obj.selectAllRows()
# ~ self.selected = not self.selected
return
def mouseReleased(self, event):
# ~ obj = event.Source
# ~ col = obj.getColumnAtPoint(event.X, event.Y)
# ~ row = obj.getRowAtPoint(event.X, event.Y)
# ~ if row == -1 and col > -1:
# ~ gdm = obj.Model.GridDataModel
# ~ for i in range(gdm.RowCount):
# ~ gdm.updateRowHeading(i, i + 1)
return
# ~ BorderColor = ? # ~ BorderColor = ?
# ~ FontStyleName = ? # ~ FontStyleName = ?
# ~ HelpURL = ? # ~ HelpURL = ?
@ -3780,11 +3808,12 @@ class UnoGrid(UnoBaseObject):
def __init__(self, obj): def __init__(self, obj):
super().__init__(obj) super().__init__(obj)
self._gdm = self.model.GridDataModel self._gdm = self.model.GridDataModel
# ~ self._columns = {} self._columns = []
self._data = []
# ~ self._format_columns = () # ~ self._format_columns = ()
def __setattr__(self, name, value): def __setattr__(self, name, value):
if name in ('_gdm',): if name in ('_gdm', '_columns', '_data'):
self.__dict__[name] = value self.__dict__[name] = value
else: else:
super().__setattr__(name, value) super().__setattr__(name, value)
@ -3797,6 +3826,55 @@ class UnoGrid(UnoBaseObject):
def type(self): def type(self):
return 'grid' return 'grid'
@property
def columns(self):
return self._columns
@columns.setter
def columns(self, values):
self._columns = values
#~ https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1awt_1_1grid_1_1XGridColumn.html
model = create_instance('com.sun.star.awt.grid.DefaultGridColumnModel', True)
for properties in values:
column = create_instance('com.sun.star.awt.grid.GridColumn', True)
for k, v in properties.items():
setattr(column, k, v)
model.addColumn(column)
self.model.ColumnModel = model
return
@property
def data(self):
return self._data
@data.setter
def data(self, values):
self._data = values
self.clear()
headings = tuple(range(1, len(values) + 1))
self._gdm.addRows(headings, values)
# ~ rows = range(grid_dm.RowCount)
# ~ colors = [COLORS['GRAY'] if r % 2 else COLORS['WHITE'] for r in rows]
# ~ grid.Model.RowBackgroundColors = tuple(colors)
return
@property
def value(self):
if self.column == -1 or self.row == -1:
return ''
return self[self.column, self.row]
@property
def row(self):
return self.obj.CurrentRow
@property
def column(self):
return self.obj.CurrentColumn
def clear(self):
self._gdm.removeAllRows()
return
# UP
def _format_cols(self): def _format_cols(self):
rows = tuple(tuple( rows = tuple(tuple(
self._format_columns[i].format(r) for i, r in enumerate(row)) for row in self._data self._format_columns[i].format(r) for i, r in enumerate(row)) for row in self._data
@ -3810,39 +3888,13 @@ class UnoGrid(UnoBaseObject):
# ~ def format_columns(self, value): # ~ def format_columns(self, value):
# ~ self._format_columns = value # ~ self._format_columns = value
@property # ~ @property
def value(self): # ~ def rows(self):
return self[self.column, self.row] # ~ return self._gdm.RowCount
@property # ~ @property
def data(self): # ~ def columns(self):
return self._data # ~ return self._gdm.ColumnCount
@data.setter
def data(self, values):
# ~ self._data = values
self.clear()
headings = tuple(range(1, len(values) + 1))
self._gdm.addRows(headings, values)
# ~ rows = range(grid_dm.RowCount)
# ~ colors = [COLORS['GRAY'] if r % 2 else COLORS['WHITE'] for r in rows]
# ~ grid.Model.RowBackgroundColors = tuple(colors)
return
@property
def row(self):
return self.obj.CurrentRow
@property
def rows(self):
return self._gdm.RowCount
@property
def column(self):
return self.obj.CurrentColumn
@property
def columns(self):
return self._gdm.ColumnCount
def set_cell_tooltip(self, col, row, value): def set_cell_tooltip(self, col, row, value):
self._gdm.updateCellToolTip(col, row, value) self._gdm.updateCellToolTip(col, row, value)
@ -3862,10 +3914,6 @@ class UnoGrid(UnoBaseObject):
row.append(d) row.append(d)
return tuple(row) return tuple(row)
def clear(self):
self._gdm.removeAllRows()
return
def add_row(self, data): def add_row(self, data):
# ~ self._data.append(data) # ~ self._data.append(data)
data = self._validate_column(data) data = self._validate_column(data)
@ -4068,28 +4116,33 @@ class LODialog(object):
return _P.to_url(path) return _P.to_url(path)
def _special_properties(self, tipo, args): def _special_properties(self, tipo, args):
columns = args.pop('Columns', ())
if tipo == 'link' and not 'Label' in args: if tipo == 'link' and not 'Label' in args:
args['Label'] = args['URL'] args['Label'] = args['URL']
elif tipo == 'grid': return args
args['ColumnModel'] = self._set_column_model(columns)
elif tipo == 'button': if tipo == 'button':
if 'ImageURL' in args: if 'ImageURL' in args:
args['ImageURL'] = self._set_image_url(args['ImageURL']) args['ImageURL'] = self._set_image_url(args['ImageURL'])
args['FocusOnClick'] = args.get('FocusOnClick', False) args['FocusOnClick'] = args.get('FocusOnClick', False)
elif tipo == 'roadmap': return args
if not 'Height' in args:
args['Height'] = self.height if tipo == 'roadmap':
args['Height'] = args.get('Height', self.height)
if 'Title' in args: if 'Title' in args:
args['Text'] = args.pop('Title') args['Text'] = args.pop('Title')
elif tipo == 'tree': return args
if tipo == 'tree':
args['SelectionType'] = args.get('SelectionType', SINGLE) args['SelectionType'] = args.get('SelectionType', SINGLE)
elif tipo == 'tab': return args
if not 'Width' in args:
args['Width'] = self.width if tipo == 'grid':
if not 'Height' in args: args['ShowRowHeader'] = args.get('ShowRowHeader', True)
args['Height'] = self.height return args
if tipo == 'tab':
args['Width'] = args.get('Width', self.width)
args['Height'] = args.get('Height', self.height)
return args return args
@ -4097,6 +4150,7 @@ class LODialog(object):
tipo = args.pop('Type').lower() tipo = args.pop('Type').lower()
root = args.pop('Root', '') root = args.pop('Root', '')
sheets = args.pop('Sheets', ()) sheets = args.pop('Sheets', ())
columns = args.pop('Columns', ())
args = self._special_properties(tipo, args) args = self._special_properties(tipo, args)
model = self.model.createInstance(self.MODELS[tipo]) model = self.model.createInstance(self.MODELS[tipo])
@ -4106,11 +4160,14 @@ class LODialog(object):
control = self.obj.getControl(name) control = self.obj.getControl(name)
_add_listeners(self.events, control, name) _add_listeners(self.events, control, name)
control = UNO_CLASSES[tipo](control) control = UNO_CLASSES[tipo](control)
if tipo in ('listbox',): if tipo in ('listbox',):
control.path = self.path control.path = self.path
if tipo == 'tree' and root: if tipo == 'tree' and root:
control.root = root control.root = root
elif tipo == 'grid' and columns:
control.columns = columns
elif tipo == 'pages' and sheets: elif tipo == 'pages' and sheets:
control.sheets = sheets control.sheets = sheets
control.events = self.events control.events = self.events