diff --git a/mainwindow.ui b/mainwindow.ui
index 148dbf6..90afebb 100644
--- a/mainwindow.ui
+++ b/mainwindow.ui
@@ -214,6 +214,11 @@
Memory usage graph
+
+
+ Size
+
+
@@ -249,6 +254,7 @@
+
@@ -705,6 +711,20 @@
Qubes OS
+
+
+ true
+
+
+ true
+
+
+ Size
+
+
+ Size on Disk
+
+
diff --git a/qubesmanager/main.py b/qubesmanager/main.py
index 79fee93..040a974 100755
--- a/qubesmanager/main.py
+++ b/qubesmanager/main.py
@@ -510,6 +510,25 @@ class VmUpdateInfoWidget(QWidget):
self.layout().addWidget(self.icon, alignment=Qt.AlignCenter)
+class VmSizeOnDiskItem (QTableWidgetItem):
+ def __init__(self, vm):
+ super(VmSizeOnDiskItem, self).__init__()
+
+ self.vm = vm
+ self.value = 0
+ self.update()
+ self.setTextAlignment(Qt.AlignCenter)
+
+ def update(self):
+ if self.vm.qid == 0:
+ self.setText("n/a")
+ else:
+ self.value = self.vm.get_disk_utilization()/(1024*1024)
+ self.setText( str(self.value) + " MiB")
+
+ def __lt__(self, other):
+ return self.value < other.value
+
class VmRowInTable(object):
cpu_graph_hue = 210
@@ -559,15 +578,20 @@ class VmRowInTable(object):
self.mem_widget = ChartWidget(vm, lambda vm, val: vm.get_mem()*100/qubes_host.memory_total if vm.last_running else 0, self.mem_graph_hue, 0)
table.setCellWidget(row_no, VmManagerWindow.columns_indices['MEM Graph'], self.mem_widget)
table.setItem(row_no, VmManagerWindow.columns_indices['MEM Graph'], self.mem_widget.tableItem)
-
- def update(self, counter, blk_visible = None, cpu_load = None):
+ self.size_widget = VmSizeOnDiskItem(vm)
+ table.setItem(row_no, VmManagerWindow.columns_indices['Size'], self.size_widget)
+
+
+ def update(self, counter, blk_visible = None, cpu_load = None, update_size_on_disk = False):
self.info_widget.update_vm_state(self.vm, blk_visible)
if cpu_load is not None:
self.cpu_usage_widget.update_load(self.vm, cpu_load)
self.mem_usage_widget.update_load(self.vm, None)
self.load_widget.update_load(self.vm, cpu_load)
self.mem_widget.update_load(self.vm, None)
+ if update_size_on_disk == True:
+ self.size_widget.update()
class NewAppVmDlg (QDialog, ui_newappvmdlg.Ui_NewAppVMDlg):
def __init__(self, parent = None):
@@ -613,7 +637,8 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
"CPU": 6,
"CPU Graph": 7,
"MEM": 8,
- "MEM Graph": 9,}
+ "MEM Graph": 9,
+ "Size": 10,}
@@ -640,6 +665,7 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
self.sort_by_mem = None
self.sort_by_cpu = None
self.sort_by_state = None
+ self.sort_by_size_on_disk = None
self.screen_number = -1
self.screen_changed = False
@@ -661,6 +687,7 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
self.columns_actions[ self.columns_indices["CPU Graph"] ] = self.action_cpu_graph
self.columns_actions[ self.columns_indices["MEM"] ] = self.action_mem
self.columns_actions[ self.columns_indices["MEM Graph"] ] = self.action_mem_graph
+ self.columns_actions[ self.columns_indices["Size"] ] = self.action_size_on_disk
self.visible_columns_count = len(self.columns_indices);
@@ -670,12 +697,15 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
self.action_cpu_graph.setChecked(False)
self.table.setColumnHidden( self.columns_indices["MEM Graph"], True)
self.action_mem_graph.setChecked(False)
+ self.table.setColumnHidden( self.columns_indices["Size"], True)
+ self.action_size_on_disk.setChecked(False)
self.table.setColumnWidth(self.columns_indices["State"], 80)
self.table.setColumnWidth(self.columns_indices["Name"], 150)
self.table.setColumnWidth(self.columns_indices["Label"], 40)
self.table.setColumnWidth(self.columns_indices["Type"], 40)
+ self.table.setColumnWidth(self.columns_indices["Size"], 100)
self.action_showallvms.setChecked(True)
self.table.horizontalHeader().setResizeMode(QHeaderView.Fixed)
@@ -719,6 +749,7 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
self.connect(self.action_toolbar, SIGNAL("toggled(bool)"), self.showhide_toolbar)
self.counter = 0
+ self.update_size_on_disk = False
self.shutdown_monitor = {}
self.last_measure_results = {}
self.last_measure_time = time.time()
@@ -891,6 +922,9 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
rows_with_blk.append( self.blk_manager.attached_devs[d]['attached_to']['vm'])
self.blk_manager.blk_lock.release()
+ if self.counter % 60 == 0 or out_of_schedule:
+ self.update_size_on_disk = True
+
if self.counter % 3 == 0 or out_of_schedule:
(self.last_measure_time, self.last_measure_results) = \
qubes_host.measure_cpu_usage(self.last_measure_results,
@@ -909,7 +943,7 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
else:
blk_visible = False
- vm_row.update(self.counter, blk_visible=blk_visible, cpu_load = cur_cpu_load)
+ vm_row.update(self.counter, blk_visible=blk_visible, cpu_load = cur_cpu_load, update_size_on_disk = self.update_size_on_disk)
else:
for vm_row in self.vms_in_table.values():
@@ -919,7 +953,7 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
else:
blk_visible = False
- vm_row.update(self.counter, blk_visible=blk_visible)
+ vm_row.update(self.counter, blk_visible=blk_visible, update_size_on_disk = self.update_size_on_disk)
if self.sort_by_cpu != None:
self.table.sortItems(self.columns_indices["CPU"], self.sort_by_cpu)
@@ -928,9 +962,12 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
elif self.sort_by_state != None and reload_table:
#needed to sort after reload (fill_table sorts items with setSortingEnabled, but by that time the widgets values are not correct yet).
self.table.sortItems(self.columns_indices["State"], self.sort_by_state)
+ elif self.sort_by_size_on_disk != None and self.update_size_on_disk == True:
+ self.table.sortItems(self.columns_indices["Size"], self.sort_by_size_on_disk)
self.table_selection_changed()
+ self.update_size_on_disk = False
if not out_of_schedule:
self.counter += 1
QTimer.singleShot (self.update_interval, self.update_table)
@@ -948,19 +985,27 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
if column == self.columns_indices["CPU"] or column == self.columns_indices["CPU Graph"]:
self.sort_by_mem = None
self.sort_by_state = None
+ self.sort_by_size_on_disk = None
self.sort_by_cpu = order
return
elif column == self.columns_indices["MEM"] or column == self.columns_indices["MEM Graph"]:
self.sort_by_cpu = None
self.sort_by_state = None
+ self.sort_by_size_on_disk = None
self.sort_by_mem = order
return
- elif column == self.columns_indices["State"]:
-
+ elif column == self.columns_indices["State"]:
self.sort_by_cpu = None
self.sort_by_mem = None
+ self.sort_by_size_on_disk = None
self.sort_by_state = order
return
+ elif column == self.columns_indices["Size"]:
+ self.sort_by_cpu = None
+ self.sort_by_mem = None
+ self.sort_by_state = None
+ self.sort_by_size_on_disk = order
+ return
else:
self.sort_by_cpu = None
self.sort_by_mem = None
@@ -1446,6 +1491,9 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
def on_action_mem_graph_toggled(self, checked):
self.showhide_column( self.columns_indices['MEM Graph'], checked)
+ def on_action_size_on_disk_toggled(self, checked):
+ self.showhide_column( self.columns_indices['Size'], checked)
+
@pyqtSlot(name='on_action_about_qubes_triggered')
def action_about_qubes_triggered(self):