X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=inline;f=sface%2Fsliceview.py;h=2914c0422c49b959b7c745a1b034aaa41e04dbaf;hb=cdff851fa265da6a9e368e02ee466ca77f46a831;hp=d9850bbb06649db025ccfdc80448764a75dd1962;hpb=37dfde8c6c59f3c33d1225d3c73cb5ec11c12306;p=sface.git
diff --git a/sface/sliceview.py b/sface/sliceview.py
index d9850bb..2914c04 100644
--- a/sface/sliceview.py
+++ b/sface/sliceview.py
@@ -4,9 +4,9 @@ import pickle
from PyQt4.QtCore import *
from PyQt4.QtGui import *
-from sfa.util.record import SfaRecord, SliceRecord, AuthorityRecord
from sface.config import config
from sface.sfidata import SfiData
+from sface.sfiprocess import SfiProcess
NAME_COLUMN = 0
MEMBERSHIP_STATUS_COLUMN = 1
@@ -14,6 +14,10 @@ MEMBERSHIP_STATUS_COLUMN = 1
# maximum length of a name to display before clipping
NAME_MAX_LEN = 48
+MODE_AUTHORITY_SLICES = 0x01
+MODE_USER_SLICES = 0x02
+MODE_SELECT_SINGLE = 0x10
+
slice_status = { "in": "Selected",
"out": "Not Selected"}
@@ -71,8 +75,9 @@ class SliceNameDelegate(QStyledItemDelegate):
painter.restore()
class SliceView(QTableView):
- def __init__(self, parent=None):
+ def __init__(self, mode=0, parent=None):
QTableView.__init__(self, parent)
+ self.mode = mode
self.setSelectionBehavior(QAbstractItemView.SelectRows)
self.setSelectionMode(QAbstractItemView.SingleSelection)
@@ -89,9 +94,26 @@ class SliceView(QTableView):
else:
QTableView.keyPressEvent(self, event)
+ def selectionChanged(self, selected, deselected):
+ QTableView.selectionChanged(self, selected, deselected)
+ if (self.mode & MODE_SELECT_SINGLE) != 0:
+ self.unselectAll()
+ self.toggleSelection()
+
def mouseDoubleClickEvent(self, event):
self.toggleSelection()
+ def unselectAll(self):
+ index = self.currentIndex()
+ model = index.model()
+ for row in range(0, model.rowCount()):
+ status_index = model.index(row, MEMBERSHIP_STATUS_COLUMN, index.parent())
+ model.setData(status_index, QString(slice_status['out']))
+
+ #model.emit(SIGNAL("dataChanged(QModelIndex, QModelIndex)"),
+ # model.index(0, MEMBERSHIP_STATUS_COLUMN, index.parent()),
+ # model.index(model.rowCount(), MEMBERSHIP_STATUS_COLUMN, index.parent()))
+
def toggleSelection(self):
index = self.currentIndex()
model = index.model()
@@ -112,9 +134,6 @@ class SliceView(QTableView):
node_index = model.index(current.row(), 0, current.parent())
node_data = node_index.data().toString()
-MODE_AUTHORITY_SLICES = 1
-MODE_USER_SLICES = 2
-
class SliceModel(QStandardItemModel):
def __init__(self, rows=0, columns=4, parent=None, mode=MODE_AUTHORITY_SLICES):
QStandardItemModel.__init__(self, rows, columns, parent)
@@ -123,7 +142,7 @@ class SliceModel(QStandardItemModel):
def updateModel(self):
self.clear()
- if (self.mode == MODE_AUTHORITY_SLICES):
+ if (self.mode & MODE_AUTHORITY_SLICES) != 0:
slice_names = SfiData().getAuthorityHrns(type="slice")
else: # MODE_USER_SLICES
slice_names = SfiData().getUserSliceHrns()
@@ -155,3 +174,88 @@ class SliceModel(QStandardItemModel):
return slices
+class SlicePickerWindow(QDialog):
+ def __init__(self, mode=MODE_AUTHORITY_SLICES, parent=None):
+ super(SlicePickerWindow, self).__init__(parent)
+ self.mode = mode
+ self.slices = None
+
+ self.setWindowTitle("Slice Picker")
+
+ sliceLabel = QLabel("Slices:")
+ self.sliceView = SliceView(mode=self.mode)
+
+ self.status = QLabel("")
+ self.status.setMaximumWidth(640)
+
+ self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
+ self.buttonBox.button(QDialogButtonBox.Ok).setDefault(True)
+
+ layout = QVBoxLayout()
+ layout.addWidget(sliceLabel)
+ layout.addWidget(self.sliceView)
+ layout.addWidget(self.status)
+ layout.addWidget(self.buttonBox)
+ self.setLayout(layout)
+
+ self.connect(self.buttonBox, SIGNAL("accepted()"), self, SLOT("accept()"))
+ self.connect(self.buttonBox, SIGNAL("rejected()"), self, SLOT("reject()"))
+
+ self.sliceModel = SliceModel(mode=mode)
+
+ self.refresh()
+
+ def accept(self):
+ self.slices = self.sliceModel.getSelectedSlices()
+ print self.slices
+ QDialog.accept(self)
+
+ def setStatus(self, x):
+ self.status.setText(x)
+
+ def refresh(self):
+ if (self.mode & MODE_AUTHORITY_SLICES) != 0:
+ self.refreshAuthority()
+ else:
+ self.refreshUser()
+
+ def refreshUser(self):
+ self.process = SfiProcess(self)
+ self.connect(self.process, SIGNAL('finished()'), self.getUserRecordFinished)
+
+ self.process.getRecord(hrn=config.getUser(), type="user", filename=config.getUserRecordFile())
+ self.setStatus("Refreshing user record. This will take a moment...")
+
+ def getUserRecordFinished(self):
+ self.disconnect(self.process, SIGNAL('finished()'), self.getUserRecordFinished)
+
+ faultString = self.process.getFaultString()
+ if not faultString:
+ self.setStatus("Slice list refreshed.")
+ self.updateSliceView()
+ else:
+ self.setStatus("User rec refresh error: %s" % (faultString))
+
+ def refreshAuthority(self):
+ self.process = SfiProcess(self)
+ self.connect(self.process, SIGNAL('finished()'), self.getAuthorityRecordFinished)
+
+ self.process.listRecords(config.getAuthority(), None)
+ self.setStatus("Refreshing slice list. This will take a moment...")
+
+ def getAuthorityRecordFinished(self):
+ self.disconnect(self.process, SIGNAL('finished()'), self.getAuthorityRecordFinished)
+
+ faultString = self.process.getFaultString()
+ if not faultString:
+ self.setStatus("Slice list refreshed.")
+ self.updateSliceView()
+ else:
+ self.setStatus("Authority rec refresh error: %s" % (faultString))
+
+ def updateSliceView(self):
+ self.sliceModel.updateModel()
+
+ self.sliceView.setModel(self.sliceModel)
+ self.sliceView.resizeColumnToContents(0)
+