Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions examples/table.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Name,Age,City
Pièrre,35,Paris
Flôrent,34,Paris
Loïc,36,Paris
33 changes: 33 additions & 0 deletions examples/table.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
#
# Copyright © 2009 Pierre Raybaut
# Licensed under the terms of the MIT License
# (see formlayout.py for details)

"""
Table examples
"""

from formlayout import fedit

datalist = [('list of lists:', [[u'Pièrre', 35, 'Paris'],
[u'Flôrent', 34, 'Paris'],
[u'Loïc', 36, 'Paris']]),
('tuple marks header:', [('Name', 'Age', 'City'),
[u'Pièrre', 35, 'Paris'],
[u'Flôrent', 34, 'Paris'],
[u'Loïc', 36, 'Paris']]),
(None, 'No header CSV:'),
(None, 'table.csv'),
(None, 'Numered headers CSV:'),
(None, '#table.csv'),
(None, 'Horizontal header CSV:'),
(None, '_table.csv'),
(None, 'Vertical header CSV:'),
(None, '|tablev.csv'),
(None, 'Both headers CSV:'),
(None, '/tablehv.csv'),
]

print('result:', fedit(datalist, title='Table examples',
type='questions', scrollbar=True))
4 changes: 4 additions & 0 deletions examples/tablehv.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Age,City
Pièrre,35,Paris
Flôrent,34,Paris
Loïc,36,Paris
3 changes: 3 additions & 0 deletions examples/tablev.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Pièrre,35,Paris
Flôrent,34,Paris
Loïc,36,Paris
89 changes: 89 additions & 0 deletions formlayout.py
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,59 @@ def apply(self, callback):
self.dialog.formwidget.get_widgets())


class TableModel(QAbstractTableModel):
def __init__(self, data, header, parent=None):
QAbstractTableModel.__init__(self, parent)
if isinstance(data, list):
self.tabledata = list(data)
else:
if PY2:
self.tabledata = [[el.decode('utf-8') for el in row]
for row in data]
else:
self.tabledata = [row for row in data]
if header in ['_', '/']:
self.hdata = self.tabledata.pop(0)
elif header == '#':
self.hdata = range(1, self.columnCount(parent)+1)
if header in ['|', '/']:
self.vdata = [row.pop(0) for row in self.tabledata]
elif header == '#':
self.vdata = range(1, self.rowCount(parent)+1)

def rowCount(self, parent):
return len(self.tabledata)

def columnCount(self, parent):
return len(self.tabledata[0])

def headerData(self, section, orientation, role):
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
return self.hdata[section]
elif orientation == Qt.Vertical and role == Qt.DisplayRole:
return self.vdata[section]
else:
return None

def data(self, index, role):
if index.isValid() and role == Qt.DisplayRole:
return self.tabledata[index.row()][index.column()]
else:
return None

def setData(self, index, value, role):
if index.isValid() and role == Qt.EditRole:
if PY2:
value = to_text_string(value.toString())
self.tabledata[index.row()][index.column()] = value
return True
else:
return None

def flags(self, index):
return QAbstractTableModel.flags(self, index) | Qt.ItemIsEditable


def font_is_installed(font):
"""Check if font is installed"""
return [fam for fam in QFontDatabase().families()
Expand Down Expand Up @@ -518,6 +571,26 @@ def setup(self):
lab = QLabel()
lab.setPixmap(pixmap)
self.formlayout.addRow(lab)
elif value.endswith('.csv'):
# CSV file
import csv
header = None
if value.startswith(('_', '|', '/', '#')):
header, value = value[0], value[1:]
if PY2:
csvfile = open(value, 'rb')
else:
csvfile = open(value, 'r')
csvdata = csv.reader(csvfile)
tablemodel = TableModel(csvdata, header)
table = QTableView()
if header in ['_', None]:
table.verticalHeader().hide()
if header in ['|', None]:
table.horizontalHeader().hide()
table.setModel(tablemodel)
table.setEditTriggers(QAbstractItemView.NoEditTriggers)
self.formlayout.addRow(table)
else:
# Comment
self.formlayout.addRow(QLabel(value))
Expand Down Expand Up @@ -545,6 +618,17 @@ def setup(self):
field = QTextEdit(value, self)
else:
field = QLineEdit(value, self)
elif isinstance(value, list) and isinstance(value[0],
(list, tuple)):
header = None
field = QTableView()
if isinstance(value[0], tuple):
header = '_'
else:
field.horizontalHeader().hide()
field.verticalHeader().hide()
tablemodel = TableModel(value, header)
field.setModel(tablemodel)
elif isinstance(value, (list, tuple)):
save_value = value
value = list(value) # always needed to protect self.data
Expand Down Expand Up @@ -676,6 +760,11 @@ def get(self):
value = field.value()
else:
value = to_text_string(field.text())
elif isinstance(value, list) and isinstance(value[0],
(list, tuple)):
value = list(field.model().tabledata)
if hasattr(field.model(), 'hdata'):
value.insert(0, field.model().hdata)
elif isinstance(value, (list, tuple)):
index = int(field.currentIndex())
if isinstance(value[0], int):
Expand Down