def __init__(self, parent, document): VeuszDialog.__init__(self, parent, 'dataedit.ui') self.document = document # set up dataset list self.dsbrowser = DatasetBrowser(document, parent, parent) self.splitter.insertWidget(0, self.dsbrowser) # actions for data table for text, slot in ( (_('Copy'), self.slotCopy), (_('Delete row'), self.slotDeleteRow), (_('Insert row'), self.slotInsertRow), ): act = qt4.QAction(text, self) self.connect(act, qt4.SIGNAL('triggered()'), slot) self.datatableview.addAction(act) self.datatableview.setContextMenuPolicy(qt4.Qt.ActionsContextMenu) # layout edit dialog improvement self.splitter.setStretchFactor(0, 3) self.splitter.setStretchFactor(1, 4) # don't want text to look editable or special self.linkedlabel.setFrameShape(qt4.QFrame.NoFrame) self.linkedlabel.viewport().setBackgroundRole(qt4.QPalette.Window) # document changes self.connect(document, qt4.SIGNAL('sigModified'), self.slotDocumentModified) # select first item, if any or initialise if none if len(self.document.data) > 0: self.selectDataset(sorted(self.document.data.keys())[0]) else: self.slotDatasetSelected("") self.connect(self.dsbrowser.navtree, qt4.SIGNAL("selecteditem"), self.slotDatasetSelected) # connect buttons for btn, slot in ( (self.deletebutton, self.slotDatasetDelete), (self.unlinkbutton, self.slotDatasetUnlink), (self.duplicatebutton, self.slotDatasetDuplicate), (self.importbutton, self.slotDatasetImport), (self.createbutton, self.slotDatasetCreate), (self.editbutton, self.slotDatasetEdit), ): self.connect(btn, qt4.SIGNAL('clicked()'), slot) # menu for new button self.newmenu = qt4.QMenu() for text, slot in ((_('Numerical dataset'), self.slotNewNumericalDataset), (_('Text dataset'), self.slotNewTextDataset), (_('Date/time dataset'), self.slotNewDateDataset)): a = self.newmenu.addAction(text) self.connect(a, qt4.SIGNAL('triggered()'), slot) self.newbutton.setMenu(self.newmenu)
def __init__(self, thedocument, mainwin, *args): qt4.QDockWidget.__init__(self, *args) self.setWindowTitle(_("Data - Veusz")) self.setObjectName("veuszdatawindow") self.nav = DatasetBrowser(thedocument, mainwin, self) self.setWidget(self.nav)
def __init__(self, parent, document): VeuszDialog.__init__(self, parent, 'dataedit.ui') self.document = document # set up dataset list self.dsbrowser = DatasetBrowser(document, parent, parent) self.splitter.insertWidget(0, self.dsbrowser) # actions for data table for text, slot in ( (_('Copy'), self.slotCopy), (_('Delete row'), self.slotDeleteRow), (_('Insert row'), self.slotInsertRow), ): act = qt4.QAction(text, self) self.connect(act, qt4.SIGNAL('triggered()'), slot) self.datatableview.addAction(act) self.datatableview.setContextMenuPolicy( qt4.Qt.ActionsContextMenu ) # layout edit dialog improvement self.splitter.setStretchFactor(0, 3) self.splitter.setStretchFactor(1, 4) # don't want text to look editable or special self.linkedlabel.setFrameShape(qt4.QFrame.NoFrame) self.linkedlabel.viewport().setBackgroundRole(qt4.QPalette.Window) # document changes self.connect(document, qt4.SIGNAL('sigModified'), self.slotDocumentModified) # select first item, if any or initialise if none if len(self.document.data) > 0: self.selectDataset( sorted(self.document.data.keys())[0] ) else: self.slotDatasetSelected("") self.connect(self.dsbrowser.navtree, qt4.SIGNAL("selecteditem"), self.slotDatasetSelected) # connect buttons for btn, slot in ( (self.deletebutton, self.slotDatasetDelete), (self.unlinkbutton, self.slotDatasetUnlink), (self.duplicatebutton, self.slotDatasetDuplicate), (self.importbutton, self.slotDatasetImport), (self.createbutton, self.slotDatasetCreate), (self.editbutton, self.slotDatasetEdit), ): self.connect(btn, qt4.SIGNAL('clicked()'), slot) # menu for new button self.newmenu = qt4.QMenu() for text, slot in ( (_('Numerical dataset'), self.slotNewNumericalDataset), (_('Text dataset'), self.slotNewTextDataset), (_('Date/time dataset'), self.slotNewDateDataset) ): a = self.newmenu.addAction(text) self.connect(a, qt4.SIGNAL('triggered()'), slot) self.newbutton.setMenu(self.newmenu)
class DataEditDialog(VeuszDialog): """Dialog for editing and rearranging data sets.""" def __init__(self, parent, document): VeuszDialog.__init__(self, parent, 'dataedit.ui') self.document = document # set up dataset list self.dsbrowser = DatasetBrowser(document, parent, parent) self.splitter.insertWidget(0, self.dsbrowser) # actions for data table for text, slot in ( (_('Copy'), self.slotCopy), (_('Delete row'), self.slotDeleteRow), (_('Insert row'), self.slotInsertRow), ): act = qt4.QAction(text, self) self.connect(act, qt4.SIGNAL('triggered()'), slot) self.datatableview.addAction(act) self.datatableview.setContextMenuPolicy( qt4.Qt.ActionsContextMenu ) # layout edit dialog improvement self.splitter.setStretchFactor(0, 3) self.splitter.setStretchFactor(1, 4) # don't want text to look editable or special self.linkedlabel.setFrameShape(qt4.QFrame.NoFrame) self.linkedlabel.viewport().setBackgroundRole(qt4.QPalette.Window) # document changes self.connect(document, qt4.SIGNAL('sigModified'), self.slotDocumentModified) # select first item, if any or initialise if none if len(self.document.data) > 0: self.selectDataset( sorted(self.document.data.keys())[0] ) else: self.slotDatasetSelected("") self.connect(self.dsbrowser.navtree, qt4.SIGNAL("selecteditem"), self.slotDatasetSelected) # connect buttons for btn, slot in ( (self.deletebutton, self.slotDatasetDelete), (self.unlinkbutton, self.slotDatasetUnlink), (self.duplicatebutton, self.slotDatasetDuplicate), (self.importbutton, self.slotDatasetImport), (self.createbutton, self.slotDatasetCreate), (self.editbutton, self.slotDatasetEdit), ): self.connect(btn, qt4.SIGNAL('clicked()'), slot) # menu for new button self.newmenu = qt4.QMenu() for text, slot in ( (_('Numerical dataset'), self.slotNewNumericalDataset), (_('Text dataset'), self.slotNewTextDataset), (_('Date/time dataset'), self.slotNewDateDataset) ): a = self.newmenu.addAction(text) self.connect(a, qt4.SIGNAL('triggered()'), slot) self.newbutton.setMenu(self.newmenu) def slotDatasetSelected(self, name): """Called when a new dataset is selected.""" # FIXME: Make readonly models readonly!! model = None if name: # get selected dataset ds = self.document.data[name] # make model for dataset if ds.dimensions == 1: model = DatasetTableModel1D(self, self.document, name) elif ds.dimensions == 2: model = DatasetTableModel2D(self, self.document, name) # disable context menu if no menu for a in self.datatableview.actions(): a.setEnabled(model is not None) self.datatableview.setModel(model) self.setUnlinkState() def setUnlinkState(self): """Enable the unlink button correctly.""" # get dataset dsname = self.getSelectedDataset() try: ds = self.document.data[dsname] unlink = ds.canUnlink() linkinfo = ds.linkedInformation() except KeyError: ds = None unlink = False linkinfo = "" self.editbutton.setVisible(type(ds) in recreate_register) self.unlinkbutton.setEnabled(unlink) self.linkedlabel.setText(linkinfo) self.deletebutton.setEnabled(ds is not None) self.duplicatebutton.setEnabled(ds is not None) def slotDocumentModified(self): """Set unlink status when document modified.""" self.setUnlinkState() def getSelectedDataset(self): """Return the selected dataset.""" return self.dsbrowser.navtree.getSelectedDataset() def selectDataset(self, dsname): """Select dataset with name given.""" self.dsbrowser.navtree.selectDataset(dsname) self.slotDatasetSelected(dsname) def slotDatasetDelete(self): """Delete selected dataset.""" self.document.applyOperation( document.OperationDatasetDelete(self.getSelectedDataset()) ) def slotDatasetUnlink(self): """Allow user to remove link to file or other datasets.""" datasetname = self.getSelectedDataset() d = self.document.data[datasetname] if d.linked is not None: op = document.OperationDatasetUnlinkFile(datasetname) else: op = document.OperationDatasetUnlinkRelation(datasetname) self.document.applyOperation(op) def slotDatasetDuplicate(self): """Duplicate selected dataset.""" datasetname = self.getSelectedDataset() if datasetname is not None: # generate new name for dataset newname = datasetname + '_copy' index = 2 while newname in self.document.data: newname = '%s_copy_%i' % (datasetname, index) index += 1 self.document.applyOperation( document.OperationDatasetDuplicate(datasetname, newname)) def slotDatasetImport(self): """Show import dialog.""" self.mainwindow.slotDataImport() def slotDatasetCreate(self): """Show dataset creation dialog.""" self.mainwindow.slotDataCreate() def slotDatasetEdit(self): """Reload dataset into dataset creation dialog.""" dsname = self.getSelectedDataset() if dsname: dataset = self.document.data[dsname] recreate_register[type(dataset)](self.mainwindow, self.document, dataset, dsname) def slotCopy(self): """Copy text from selection.""" # get list of selected rows and columns selmodel = self.datatableview.selectionModel() model = self.datatableview.model() indices = [] for index in selmodel.selectedIndexes(): indices.append( (index.row(), index.column()) ) indices.sort() # build up text stream for copying to clipboard lines = [] rowitems = [] lastrow = -1 for row, column in indices: if row != lastrow: if rowitems: # items are tab separated lines.append( '\t'.join(rowitems) ) rowitems = [] lastrow = row rowitems.append( unicode( model.createIndex(row, column).data().toString()) ) if rowitems: lines.append( '\t'.join(rowitems) ) lines.append('') # blank line at end lines = '\n'.join(lines) # put text on clipboard qt4.QApplication.clipboard().setText(lines) def slotDeleteRow(self): """Delete the current row.""" self.datatableview.model().removeRows( self.datatableview.currentIndex().row(), 1) def slotInsertRow(self): """Insert a new row.""" self.datatableview.model().insertRows( self.datatableview.currentIndex().row(), 1) def slotNewNumericalDataset(self): """Add new value dataset.""" self.newDataset( document.Dataset(data=[0.]) ) def slotNewTextDataset(self): """Add new text dataset.""" self.newDataset( document.DatasetText(data=['']) ) def slotNewDateDataset(self): """Add new date dataset.""" self.newDataset( document.DatasetDateTime(data=[]) ) def newDataset(self, ds): """Add new dataset to document.""" # get a name for dataset name = _('new dataset') if name in self.document.data: count = 1 while name in self.document.data: name = _('new dataset %i') % count count += 1 # add new dataset self.document.applyOperation( document.OperationDatasetSet(name, ds)) self.dsbrowser.selectDataset(name)
class DataEditDialog(VeuszDialog): """Dialog for editing and rearranging data sets.""" def __init__(self, parent, document): VeuszDialog.__init__(self, parent, 'dataedit.ui') self.document = document # set up dataset list self.dsbrowser = DatasetBrowser(document, parent, parent) self.splitter.insertWidget(0, self.dsbrowser) # actions for data table for text, slot in ( (_('Copy'), self.slotCopy), (_('Delete row'), self.slotDeleteRow), (_('Insert row'), self.slotInsertRow), ): act = qt4.QAction(text, self) self.connect(act, qt4.SIGNAL('triggered()'), slot) self.datatableview.addAction(act) self.datatableview.setContextMenuPolicy(qt4.Qt.ActionsContextMenu) # layout edit dialog improvement self.splitter.setStretchFactor(0, 3) self.splitter.setStretchFactor(1, 4) # don't want text to look editable or special self.linkedlabel.setFrameShape(qt4.QFrame.NoFrame) self.linkedlabel.viewport().setBackgroundRole(qt4.QPalette.Window) # document changes self.connect(document, qt4.SIGNAL('sigModified'), self.slotDocumentModified) # select first item, if any or initialise if none if len(self.document.data) > 0: self.selectDataset(sorted(self.document.data.keys())[0]) else: self.slotDatasetSelected("") self.connect(self.dsbrowser.navtree, qt4.SIGNAL("selecteditem"), self.slotDatasetSelected) # connect buttons for btn, slot in ( (self.deletebutton, self.slotDatasetDelete), (self.unlinkbutton, self.slotDatasetUnlink), (self.duplicatebutton, self.slotDatasetDuplicate), (self.importbutton, self.slotDatasetImport), (self.createbutton, self.slotDatasetCreate), (self.editbutton, self.slotDatasetEdit), ): self.connect(btn, qt4.SIGNAL('clicked()'), slot) # menu for new button self.newmenu = qt4.QMenu() for text, slot in ((_('Numerical dataset'), self.slotNewNumericalDataset), (_('Text dataset'), self.slotNewTextDataset), (_('Date/time dataset'), self.slotNewDateDataset)): a = self.newmenu.addAction(text) self.connect(a, qt4.SIGNAL('triggered()'), slot) self.newbutton.setMenu(self.newmenu) def slotDatasetSelected(self, name): """Called when a new dataset is selected.""" # FIXME: Make readonly models readonly!! model = None if name: # get selected dataset ds = self.document.data[name] # make model for dataset if ds.dimensions == 1: model = DatasetTableModel1D(self, self.document, name) elif ds.dimensions == 2: model = DatasetTableModel2D(self, self.document, name) # disable context menu if no menu for a in self.datatableview.actions(): a.setEnabled(model is not None) self.datatableview.setModel(model) self.setUnlinkState() def setUnlinkState(self): """Enable the unlink button correctly.""" # get dataset dsname = self.getSelectedDataset() try: ds = self.document.data[dsname] unlink = ds.canUnlink() linkinfo = ds.linkedInformation() except KeyError: ds = None unlink = False linkinfo = "" self.editbutton.setVisible(type(ds) in recreate_register) self.unlinkbutton.setEnabled(unlink) self.linkedlabel.setText(linkinfo) self.deletebutton.setEnabled(ds is not None) self.duplicatebutton.setEnabled(ds is not None) def slotDocumentModified(self): """Set unlink status when document modified.""" self.setUnlinkState() def getSelectedDataset(self): """Return the selected dataset.""" return self.dsbrowser.navtree.getSelectedDataset() def selectDataset(self, dsname): """Select dataset with name given.""" self.dsbrowser.navtree.selectDataset(dsname) self.slotDatasetSelected(dsname) def slotDatasetDelete(self): """Delete selected dataset.""" self.document.applyOperation( document.OperationDatasetDelete(self.getSelectedDataset())) def slotDatasetUnlink(self): """Allow user to remove link to file or other datasets.""" datasetname = self.getSelectedDataset() d = self.document.data[datasetname] if d.linked is not None: op = document.OperationDatasetUnlinkFile(datasetname) else: op = document.OperationDatasetUnlinkRelation(datasetname) self.document.applyOperation(op) def slotDatasetDuplicate(self): """Duplicate selected dataset.""" datasetname = self.getSelectedDataset() if datasetname is not None: # generate new name for dataset newname = datasetname + '_copy' index = 2 while newname in self.document.data: newname = '%s_copy_%i' % (datasetname, index) index += 1 self.document.applyOperation( document.OperationDatasetDuplicate(datasetname, newname)) def slotDatasetImport(self): """Show import dialog.""" self.mainwindow.slotDataImport() def slotDatasetCreate(self): """Show dataset creation dialog.""" self.mainwindow.slotDataCreate() def slotDatasetEdit(self): """Reload dataset into dataset creation dialog.""" dsname = self.getSelectedDataset() if dsname: dataset = self.document.data[dsname] recreate_register[type(dataset)](self.mainwindow, self.document, dataset, dsname) def slotCopy(self): """Copy text from selection.""" # get list of selected rows and columns selmodel = self.datatableview.selectionModel() model = self.datatableview.model() indices = [] for index in selmodel.selectedIndexes(): indices.append((index.row(), index.column())) indices.sort() # build up text stream for copying to clipboard lines = [] rowitems = [] lastrow = -1 for row, column in indices: if row != lastrow: if rowitems: # items are tab separated lines.append('\t'.join(rowitems)) rowitems = [] lastrow = row rowitems.append( unicode(model.createIndex(row, column).data().toString())) if rowitems: lines.append('\t'.join(rowitems)) lines.append('') # blank line at end lines = '\n'.join(lines) # put text on clipboard qt4.QApplication.clipboard().setText(lines) def slotDeleteRow(self): """Delete the current row.""" self.datatableview.model().removeRows( self.datatableview.currentIndex().row(), 1) def slotInsertRow(self): """Insert a new row.""" self.datatableview.model().insertRows( self.datatableview.currentIndex().row(), 1) def slotNewNumericalDataset(self): """Add new value dataset.""" self.newDataset(document.Dataset(data=[0.])) def slotNewTextDataset(self): """Add new text dataset.""" self.newDataset(document.DatasetText(data=[''])) def slotNewDateDataset(self): """Add new date dataset.""" self.newDataset(document.DatasetDateTime(data=[])) def newDataset(self, ds): """Add new dataset to document.""" # get a name for dataset name = _('new dataset') if name in self.document.data: count = 1 while name in self.document.data: name = _('new dataset %i') % count count += 1 # add new dataset self.document.applyOperation(document.OperationDatasetSet(name, ds)) self.dsbrowser.selectDataset(name)