5
class XSViewer(QMainWindow):
7
def __init__(self, app):
8
apply(QMainWindow.__init__, (self,))
10
self.setCaption('XenStore Viewer')
12
self.new_node = QAction(self, 'New Node')
13
self.new_node.setText('New Node...')
14
self.connect(self.new_node, SIGNAL('activated()'),
17
self.rm_node = QAction(self, 'Remove Node')
18
self.rm_node.setText('Remove Node')
19
self.connect(self.rm_node, SIGNAL('activated()'),
22
self.refresh = QAction(self, 'Refresh')
23
self.refresh.setText('Refresh')
24
self.connect(self.refresh, SIGNAL('activated()'),
27
self.file_menu = QPopupMenu(self)
28
self.new_node.addTo(self.file_menu)
29
self.rm_node.addTo(self.file_menu)
30
self.refresh.addTo(self.file_menu)
33
self.about = QAction(self, 'About')
34
self.about.setText('About...')
35
self.connect(self.about, SIGNAL('activated()'),
38
self.help_menu = QPopupMenu(self)
39
self.about.addTo(self.help_menu)
41
self.menubar = QMenuBar(self)
42
self.menubar.insertItem('&File', self.file_menu)
43
self.menubar.insertItem('&Help', self.help_menu)
45
self.vbox = QVBox(self)
46
self.setCentralWidget(self.vbox)
48
self.xs_tree = QListView(self.vbox)
49
self.xs_tree.addColumn('Key')
50
self.xs_tree.setRootIsDecorated(1)
51
self.xs_tree.connect(self.xs_tree, SIGNAL('selectionChanged(QListViewItem*)'), self.showValue)
53
self.info_box = QHBox(self.vbox)
54
self.info_box.setMargin(2)
55
self.info_box.setSpacing(2)
56
self.info_label = QLabel(self.info_box)
57
self.info_label.setText('Value')
58
self.info = QLineEdit(self.info_box)
59
self.setval = QPushButton(self.info_box)
60
self.setval.setText('Set')
61
self.setval.connect(self.setval, SIGNAL('clicked()'), self.setValue)
63
self.xs_handle = xen.lowlevel.xs.xs()
69
xstransact = self.xs_handle.transaction_start()
70
self.walktree(xstransact, '/', '/', self.xs_tree)
71
self.xs_handle.transaction_end(xstransact)
73
def walktree(self, trans, node, subdir_prepend, parent_widget):
75
ents = self.xs_handle.ls(trans, node)
80
i = QListViewItem(parent_widget, e)
81
i.full_path = subdir_prepend + e
82
self.walktree(trans, i.full_path, i.full_path + '/', i)
85
def showValue(self, item):
86
trans = self.xs_handle.transaction_start()
87
val = self.xs_handle.read(trans, item.full_path)
88
self.info.setText(val)
89
self.xs_handle.transaction_end(trans)
93
trans = self.xs_handle.transaction_start()
94
item = self.xs_tree.currentItem()
95
newval = str(self.info.text())
97
self.xs_handle.write(trans, item.full_path, newval)
99
self.xs_handle.transaction_end(trans)
102
def do_refresh(self):
107
def do_new_node(self):
109
dia.setCaption('Create new node')
113
setting_hbox = QHBox(vbox)
115
path_label = QLabel(setting_hbox)
116
path_label.setText('Node path')
117
path = QLineEdit(setting_hbox)
119
value_label = QLabel(setting_hbox)
120
value_label.setText('Node value')
121
val = QLineEdit(setting_hbox)
123
button_hbox = QHBox(vbox)
125
set = QPushButton(button_hbox)
127
self.connect(set, SIGNAL('clicked()'), dia, SLOT('accept()'))
129
cancel = QPushButton(button_hbox)
130
cancel.setText('Cancel')
131
self.connect(cancel, SIGNAL('clicked()'), dia, SLOT('reject()'))
133
setting_hbox.adjustSize()
134
button_hbox.adjustSize()
137
if dia.exec_loop() == QDialog.Accepted:
138
trans = self.xs_handle.transaction_start()
139
self.xs_handle.write(trans, str(path.text()), str(val.text()))
141
self.xs_handle.transaction_end(trans)
147
def do_rm_node(self):
148
trans = self.xs_handle.transaction_start()
149
item = self.xs_tree.currentItem()
150
newval = str(self.info.text())
152
self.xs_handle.rm(trans, item.full_path)
154
self.xs_handle.transaction_end(trans)
159
about_dia = QMessageBox(self)
160
about_dia.setIcon(QMessageBox.Information)
162
about_dia.setCaption('About XenStore Viewer')
163
about_dia.setText('XenStore Viewer\n'
164
'by Mark Williamson <mark.williamson@cl.cam.ac.uk>')
166
about_dia.exec_loop()