diff --git a/backupdlg.ui b/backupdlg.ui
index 33de66b..04cb139 100644
--- a/backupdlg.ui
+++ b/backupdlg.ui
@@ -25,10 +25,10 @@
- 12
- 75
+ 9
+ 50
false
- true
+ false
false
@@ -40,75 +40,68 @@
-
- -
-
-
-
- 12
- 75
- false
- true
- false
-
-
-
- Select backup destination directory:
-
-
-
- -
-
-
- Device
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
-
- dev1
-
-
- -
-
- longdeviceblablabla
-
-
- -
-
- dev2
-
-
- -
-
- dev3
-
-
-
-
- -
-
-
- Backup directory:
-
-
-
- -
-
-
- -
-
-
- ...
+
+
-
+
+
+ Backup destination directory
+
+
-
+
+
+ Device:
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
-
+
+ dev1
+
+
+ -
+
+ longdeviceblablabla
+
+
+ -
+
+ dev2
+
+
+ -
+
+ dev3
+
+
+
+
+ -
+
+
+ Backup directory:
+
+
+
+ -
+
+
+ -
+
+
+ ...
+
+
+
+
@@ -119,10 +112,10 @@
- 12
- 75
+ 9
+ 50
false
- true
+ false
false
@@ -150,10 +143,10 @@ p, li { white-space: pre-wrap; }
- 12
- 75
+ 9
+ 50
false
- true
+ false
false
@@ -170,10 +163,10 @@ p, li { white-space: pre-wrap; }
- 12
- 75
+ 9
+ 50
false
- true
+ false
false
@@ -182,21 +175,6 @@ p, li { white-space: pre-wrap; }
- -
-
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A lot of info<br />A lot of info<br />A lot of info<br />A lot of info<br />A lot of info<br />A lot of info<br />A lot of info A lot of info A lot of info A lot of info A lot of info A lot of info</p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A lot of info A lot of info A lot of info A lot of info A lot of info A lot of info</p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A lot of info A lot of info A lot of info A lot of info A lot of info A lot of info</p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A lot of info A lot of info A lot of info A lot of info A lot of info A lot of info</p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A lot of info A lot of info A lot of info A lot of info A lot of info A lot of info<br />A lot of info</p></body></html>
-
-
-
-
diff --git a/globalsettingsdlg.ui b/globalsettingsdlg.ui
index 850361c..0795e1f 100644
--- a/globalsettingsdlg.ui
+++ b/globalsettingsdlg.ui
@@ -6,8 +6,8 @@
0
0
- 568
- 342
+ 678
+ 288
@@ -15,68 +15,157 @@
-
-
-
-
- 0
- 0
-
-
-
- UpdateVM:
+
+
+ System defaults
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ UpdateVM:
+
+
+
+ -
+
+
+ -
+
+
+ ClockVM:
+
+
+
+ -
+
+
+ -
+
+
+ Default netVM:
+
+
+
+ -
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Default template:
+
+
+
+ -
+
+
+
-
-
-
- -
-
-
- ClockVM:
+
+
+ Default memory settings
+
+
+
+ 11
+ 26
+ 134
+ 16
+
+
+
+ Minimal VM's memory:
+
+
+
+
+
+ 11
+ 57
+ 139
+ 16
+
+
+
+ dom0 memory margin:
+
+
+
+
+
+ 156
+ 26
+ 121
+ 25
+
+
+
+ MB
+
+
+ 999999999
+
+
+ 10
+
+
+
+
+
+ 156
+ 57
+ 121
+ 25
+
+
+
+ MB
+
+
+ 999999999
+
+
+ 50
+
+
- -
-
-
- -
-
-
- Default netVM:
+
-
+
+
+ Kernel
+
+
-
+
+
+ Default kernel:
+
+
+
+ -
+
+
+
- -
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Default template:
-
-
-
- -
-
-
- -
-
-
- Default kernel:
-
-
-
- -
-
-
- -
+
-
Qt::Horizontal
diff --git a/icons/add.png b/icons/add.png
new file mode 100644
index 0000000..a15dd10
Binary files /dev/null and b/icons/add.png differ
diff --git a/icons/edit.png b/icons/edit.png
new file mode 100644
index 0000000..b17a7ce
Binary files /dev/null and b/icons/edit.png differ
diff --git a/icons/flag-blue.png b/icons/flag-blue.png
new file mode 100644
index 0000000..6f6b4ab
Binary files /dev/null and b/icons/flag-blue.png differ
diff --git a/icons/flag-green.png b/icons/flag-green.png
new file mode 100644
index 0000000..9b0b06d
Binary files /dev/null and b/icons/flag-green.png differ
diff --git a/icons/flag-red.png b/icons/flag-red.png
new file mode 100644
index 0000000..3a9b9ac
Binary files /dev/null and b/icons/flag-red.png differ
diff --git a/icons/flag-yellow.png b/icons/flag-yellow.png
new file mode 100644
index 0000000..ab7835a
Binary files /dev/null and b/icons/flag-yellow.png differ
diff --git a/icons/pencil.png b/icons/pencil.png
new file mode 100644
index 0000000..1ecb10c
Binary files /dev/null and b/icons/pencil.png differ
diff --git a/icons/remove.png b/icons/remove.png
new file mode 100644
index 0000000..fffb248
Binary files /dev/null and b/icons/remove.png differ
diff --git a/mainwindow.ui b/mainwindow.ui
index b5e8fdf..bd5bfb7 100644
--- a/mainwindow.ui
+++ b/mainwindow.ui
@@ -22,6 +22,13 @@
Qubes VM Manager
+
+
+ :/qubes.png:/qubes.png
+
+
+
+
true
@@ -42,6 +49,12 @@
+
+ 0
+
+
+ 0
+
-
@@ -87,10 +100,10 @@
QAbstractItemView::SelectRows
- true
+ false
- Qt::DashLine
+ Qt::NoPen
true
@@ -128,16 +141,33 @@
Name
+
+ VM name
+
+
+
+
+ Upd
+
+
+ Update info
+
Template
+
+ VM's template
+
NetVM
+
+ VM's netVM
+
@@ -148,6 +178,9 @@
CPU Graph
+
+ CPU usage graph
+
@@ -158,6 +191,9 @@
MEM Graph
+
+ Memory usage graph
+
@@ -198,6 +234,7 @@
Columns visibility
+
@@ -212,17 +249,6 @@
-
-
-
- 0
- 0
-
-
-
- false
-
-
toolBar
@@ -522,6 +548,14 @@
Global settings
+
+
+ true
+
+
+ Upd
+
+
diff --git a/multiselectwidget.ui b/multiselectwidget.ui
index db9cb70..f5e0ab6 100644
--- a/multiselectwidget.ui
+++ b/multiselectwidget.ui
@@ -86,6 +86,13 @@
+ -
+
+
+ >>
+
+
+
-
@@ -100,6 +107,13 @@
+ -
+
+
+ <<
+
+
+
-
diff --git a/qubesmanager/main.py b/qubesmanager/main.py
index 183fb24..ca76aa5 100755
--- a/qubesmanager/main.py
+++ b/qubesmanager/main.py
@@ -156,7 +156,7 @@ class VmIconWidget (QWidget):
label_icon = QLabel()
icon = QIcon (icon_path)
- icon_sz = QSize (VmManagerWindow.row_height * 0.8, VmManagerWindow.row_height * 0.3)
+ icon_sz = QSize (VmManagerWindow.row_height * 0.8, VmManagerWindow.row_height * 0.8)
icon_pixmap = icon.pixmap(icon_sz, QIcon.Disabled if not enabled else QIcon.Normal)
label_icon.setPixmap (icon_pixmap)
label_icon.setFixedSize (icon_sz)
@@ -187,7 +187,7 @@ class VmNetvmWidget (QWidget):
class VmUsageBarWidget (QWidget):
- def __init__(self, min, max, format, label, update_func, vm, load, parent = None):
+ def __init__(self, min, max, format, update_func, vm, load, parent = None):
super (VmUsageBarWidget, self).__init__(parent)
self.min = min
@@ -198,10 +198,20 @@ class VmUsageBarWidget (QWidget):
self.widget.setMinimum(min)
self.widget.setMaximum(max)
self.widget.setFormat(format);
- self.label = QLabel(label)
+
+ self.widget.setStyleSheet(
+ "QProgressBar:horizontal{ \
+ border: 1px solid lightblue;\
+ border-radius: 4px;\
+ background: white;\
+ text-align: center;\
+ }\
+ QProgressBar::chunk:horizontal {\
+ background: qlineargradient(x1: 0, y1: 0.5, x2: 1, y2: 0.5, stop: 0 hsv(210, 170, 207), stop: 1 white);\
+ }"
+ )
layout = QHBoxLayout()
- layout.addWidget(self.label)
layout.addWidget(self.widget)
self.setLayout(layout)
@@ -298,21 +308,26 @@ class MemChartWidget (QWidget):
class VmUpdateInfoWidget(QWidget):
- def __init__(self, vm, parent = None):
+ def __init__(self, vm, show_text=True, parent = None):
super (VmUpdateInfoWidget, self).__init__(parent)
layout = QHBoxLayout ()
- self.label = QLabel("---")
- layout.addWidget(self.label, alignment=Qt.AlignCenter)
+ self.show_text = show_text
+ if self.show_text:
+ self.label=QLabel("")
+ layout.addWidget(self.label, alignment=Qt.AlignCenter)
+ else:
+ self.icon = QLabel("")
+ layout.addWidget(self.icon, alignment=Qt.AlignHCenter)
self.setLayout(layout)
self.previous_outdated = False
- self.previous_update_recommended = False
+ self.previous_update_recommended = None
def update_outdated(self, vm):
outdated = vm.is_outdated()
if outdated and not self.previous_outdated:
- self.label.setText("outdated")
-
+ self.update_status_widget("outdated")
+
self.previous_outdated = outdated
if vm.is_updateable():
update_recommended = self.previous_update_recommended
@@ -323,11 +338,37 @@ class VmUpdateInfoWidget(QWidget):
update_recommended = True
else:
update_recommended = False
- self.label.setText("OK")
+ if not self.show_text and self.previous_update_recommended != False:
+ self.update_status_widget("ok")
+
if update_recommended and not self.previous_update_recommended:
- self.label.setText("check updates")
+ self.update_status_widget("update")
self.previous_update_recommended = update_recommended
+ def update_status_widget(self, state):
+
+ if state == "ok":
+ label_text = ""
+ icon_path = ":/flag-green.png"
+ tooltip_text = "VM up to date"
+ elif state == "update":
+ label_text = "Check updates"
+ icon_path = ":/flag-yellow.png"
+ tooltip_text = "Update recommended"
+ elif state == "outdated":
+ label_text = "VM outdated"
+ icon_path = ":/flag-red.png"
+ tooltip_text = "VM outdated"
+
+ if self.show_text:
+ self.label.setText(label_text)
+ else:
+ self.layout().removeWidget(self.icon)
+ self.icon.deleteLater()
+ self.icon = VmIconWidget(icon_path, True)
+ self.icon.setToolTip(tooltip_text)
+ self.layout().addWidget(self.icon, alignment=Qt.AlignCenter)
+
class VmBlockDevicesWidget(QWidget):
def __init__(self, vm, parent=None):
@@ -353,31 +394,34 @@ class VmRowInTable(object):
self.info_widget = VmInfoWidget(vm)
table.setCellWidget(row_no, 0, self.info_widget)
+ self.upd_widget = VmUpdateInfoWidget(vm, False)
+ table.setCellWidget(row_no, 1, self.upd_widget)
+
self.template_widget = VmTemplateWidget(vm)
- table.setCellWidget(row_no, 1, self.template_widget)
+ table.setCellWidget(row_no, 2, self.template_widget)
self.netvm_widget = VmNetvmWidget(vm)
- table.setCellWidget(row_no, 2, self.netvm_widget)
+ table.setCellWidget(row_no, 3, self.netvm_widget)
- self.cpu_usage_widget = VmUsageBarWidget(0, 100, "", "CPU",
+ self.cpu_usage_widget = VmUsageBarWidget(0, 100, "",
lambda vm, val: val if vm.last_power_state else 0, vm, 0)
- table.setCellWidget(row_no, 3, self.cpu_usage_widget)
+ table.setCellWidget(row_no, 4, self.cpu_usage_widget)
self.load_widget = LoadChartWidget(vm)
- table.setCellWidget(row_no, 4, self.load_widget)
+ table.setCellWidget(row_no, 5, self.load_widget)
- self.mem_usage_widget = VmUsageBarWidget(0, qubes_host.memory_total/1024, "%v MB", "MEM",
+ self.mem_usage_widget = VmUsageBarWidget(0, qubes_host.memory_total/1024, "%v MB",
lambda vm, val: vm.get_mem()/1024 if vm.last_power_state else 0, vm, 0)
- table.setCellWidget(row_no, 5, self.mem_usage_widget)
+ table.setCellWidget(row_no, 6, self.mem_usage_widget)
self.mem_widget = MemChartWidget(vm)
- table.setCellWidget(row_no, 6, self.mem_widget)
+ table.setCellWidget(row_no, 7, self.mem_widget)
- self.updateinfo_widget = VmUpdateInfoWidget(vm)
- table.setCellWidget(row_no, 7, self.updateinfo_widget)
+ self.updateinfo_widget = VmUpdateInfoWidget(vm, True)
+ table.setCellWidget(row_no, 8, self.updateinfo_widget)
self.blockdevices_widget = VmBlockDevicesWidget(vm)
- table.setCellWidget(row_no, 8, self.blockdevices_widget)
+ table.setCellWidget(row_no, 9, self.blockdevices_widget)
def update(self, counter, cpu_load = None):
@@ -388,6 +432,7 @@ class VmRowInTable(object):
self.load_widget.update_load(self.vm, cpu_load)
self.mem_widget.update_load(self.vm)
self.updateinfo_widget.update_outdated(self.vm)
+ self.upd_widget.update_outdated(self.vm)
class NewAppVmDlg (QDialog, ui_newappvmdlg.Ui_NewAppVMDlg):
def __init__(self, parent = None):
@@ -437,18 +482,20 @@ class ThreadMonitor(QObject):
class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
row_height = 30
+ column_width = 200
max_visible_rows = 7
update_interval = 1000 # in msec
show_inactive_vms = True
columns_indices = { "Name": 0,
- "Template": 1,
- "NetVM": 2,
- "CPU": 3,
- "CPU Graph": 4,
- "MEM": 5,
- "MEM Graph": 6,
- "Update Info": 7,
- "Block Device": 8 }
+ "Upd": 1,
+ "Template": 2,
+ "NetVM": 3,
+ "CPU": 4,
+ "CPU Graph": 5,
+ "MEM": 6,
+ "MEM Graph": 7,
+ "Update Info": 8,
+ "Block Device": 9 }
@@ -462,7 +509,7 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
self.connect(self.table, SIGNAL("itemSelectionChanged()"), self.table_selection_changed)
cur_pos = self.pos()
- self.table.setColumnWidth(0, 200)
+ self.table.setColumnWidth(0, self.column_width)
self.setSizeIncrement(QtCore.QSize(200, 30))
self.centralwidget.setSizeIncrement(QtCore.QSize(200, 30))
self.table.setSizeIncrement(QtCore.QSize(200, 30))
@@ -471,15 +518,21 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
self.table.setColumnHidden( self.columns_indices["NetVM"], True)
self.actionNetVM.setChecked(False)
+ self.table.setColumnHidden( self.columns_indices["Update Info"], True)
+ self.actionUpdate_Info.setChecked(False)
self.table.setColumnHidden( self.columns_indices["CPU Graph"], True)
self.actionCPU_Graph.setChecked(False)
self.table.setColumnHidden( self.columns_indices["MEM Graph"], True)
self.actionMEM_Graph.setChecked(False)
self.table.setColumnHidden( self.columns_indices["Block Device"], True)
self.actionBlock_Devices.setChecked(False)
+ self.table.setColumnWidth(self.columns_indices["Upd"], 50)
+
+ #self.table.setFrameShape(QFrame.NoFrame)
+ self.table.setContentsMargins(0,0,0,0)
+ self.centralwidget.layout().setContentsMargins(0,0,0,0)
+ self.layout().setContentsMargins(0,0,0,0)
- self.update_table_columns()
- self.set_table_geom_height()
self.counter = 0
self.shutdown_monitor = {}
@@ -487,37 +540,43 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
self.last_measure_time = time.time()
QTimer.singleShot (self.update_interval, self.update_table)
+ def show(self):
+ super(VmManagerWindow, self).show()
+ self.set_table_geom_height()
+ self.update_table_columns()
+
def set_table_geom_height(self):
- minH = self.table.horizontalHeader().height() + \
- 2*self.table.contentsMargins().top() +\
- self.centralwidget.layout().contentsMargins().top() +\
- self.centralwidget.layout().contentsMargins().bottom()
- #self.table.contentsMargins().bottom() # this is huge, dunno why
- #2*self.centralwidget.layout().verticalSpacing() # and this is negative...
+ minH = self.table.horizontalHeader().height() +\
+ 2*self.table.frameWidth()
#All this sizing is kind of magic, so change it only if you have to
#or if you know what you're doing :)
n = self.table.rowCount();
- if n > self.max_visible_rows:
- for i in range (0, self.max_visible_rows):
- minH += self.table.rowHeight(i)
- maxH = minH
- for i in range (self.max_visible_rows, n):
- maxH += self.table.rowHeight(i)
+ maxH = minH
+ if n >= self.max_visible_rows:
+ minH += self.max_visible_rows*self.row_height
+ maxH += n*self.row_height
else:
- for i in range (n):
- minH += self.table.rowHeight(i)
+ minH += n*self.row_height
maxH = minH
-
+
self.centralwidget.setMinimumHeight(minH)
- maxH += self.menubar.height() + self.statusbar.height() +\
- self.toolbar.height()
+ self.centralwidget.setMaximumHeight(maxH)
+
+ mainwindow_to_add = self.menubar.height() +\
+ self.toolbar.height() + \
+ self.menubar.contentsMargins().top() + self.menubar.contentsMargins().bottom() +\
+ self.toolbar.contentsMargins().top() + self.toolbar.contentsMargins().bottom()
+
+ maxH += mainwindow_to_add
+ minH += mainwindow_to_add
+
self.setMaximumHeight(maxH)
- self.adjustSize()
-
+ self.setMinimumHeight(minH)
+
def get_vms_list(self):
self.qvm_collection.lock_db_for_reading()
self.qvm_collection.load()
@@ -613,12 +672,14 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
def update_table_columns(self):
- width = self.table.horizontalHeader().length() +\
- self.table.verticalScrollBar().width() +\
- self.centralwidget.layout().contentsMargins().left() +\
- self.centralwidget.layout().contentsMargins().right()
+ table_width = self.table.horizontalHeader().length() +\
+ self.table.verticalScrollBar().width() + \
+ 2*self.table.frameWidth() + 1
+
+ self.table.setFixedWidth( table_width )
+ self.centralwidget.setFixedWidth(table_width)
+ self.setFixedWidth(table_width)
- self.table.setFixedWidth( width )
def table_selection_changed (self):
@@ -738,6 +799,7 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
@pyqtSlot(name='on_action_removevm_triggered')
def action_removevm_triggered(self):
+
vm = self.get_selected_vm()
assert not vm.is_running()
assert not vm.installed_by_rpm
@@ -885,7 +947,7 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
@pyqtSlot(name='on_action_settings_triggered')
def action_settings_triggered(self):
vm = self.get_selected_vm()
- settings_window = VMSettingsWindow(vm)
+ settings_window = VMSettingsWindow(vm, 1)
settings_window.exec_()
@@ -980,30 +1042,33 @@ class VmManagerWindow(Ui_VmManagerWindow, QMainWindow):
def showhide_collumn(self, col_num, show):
self.table.setColumnHidden( col_num, not show)
self.update_table_columns()
-
+
+ def on_actionUpd_toggled(self, checked):
+ self.showhide_collumn( self.columns_indices['Upd'], checked)
+
def on_actionTemplate_toggled(self, checked):
- self.showhide_collumn( 1, checked)
+ self.showhide_collumn( self.columns_indices['Template'], checked)
def on_actionNetVM_toggled(self, checked):
- self.showhide_collumn( 2, checked)
+ self.showhide_collumn( self.columns_indices['NetVM'], checked)
def on_actionCPU_toggled(self, checked):
- self.showhide_collumn( 3, checked)
+ self.showhide_collumn( self.columns_indices['CPU'], checked)
def on_actionCPU_Graph_toggled(self, checked):
- self.showhide_collumn( 4, checked)
+ self.showhide_collumn( self.columns_indices['CPU Graph'], checked)
def on_actionMEM_toggled(self, checked):
- self.showhide_collumn( 5, checked)
+ self.showhide_collumn( self.columns_indices['MEM'], checked)
def on_actionMEM_Graph_toggled(self, checked):
- self.showhide_collumn( 6, checked)
+ self.showhide_collumn( self.columns_indices['MEM Graph'], checked)
def on_actionUpdate_Info_toggled(self, checked):
- self.showhide_collumn( 7, checked)
+ self.showhide_collumn( self.columns_indices['Update Info'], checked)
def on_actionBlock_Devices_toggled(self, checked):
- self.showhide_collumn( 8, checked)
+ self.showhide_collumn( self.columns_indices['Block Device'], checked)
class QubesTrayIcon(QSystemTrayIcon):
@@ -1139,4 +1204,3 @@ def main():
app.exec_()
trayIcon = None
-
diff --git a/qubesmanager/multiselectwidget.py b/qubesmanager/multiselectwidget.py
index f0c0c23..46c7cf2 100644
--- a/qubesmanager/multiselectwidget.py
+++ b/qubesmanager/multiselectwidget.py
@@ -9,7 +9,9 @@ class MultiSelectWidget(Ui_MultiSelectWidget, QWidget):
super(MultiSelectWidget, self).__init__()
self.setupUi(self);
self.add_selected_button.clicked.connect(self.add_selected)
+ self.add_all_button.clicked.connect(self.add_all)
self.remove_selected_button.clicked.connect(self.remove_selected)
+ self.remove_all_button.clicked.connect(self.remove_all)
self.available_list.setSelectionMode(QAbstractItemView.ExtendedSelection)
self.selected_list.setSelectionMode(QAbstractItemView.ExtendedSelection)
@@ -20,15 +22,25 @@ class MultiSelectWidget(Ui_MultiSelectWidget, QWidget):
row = src.indexFromItem(s).row()
item = src.takeItem(row)
dst.addItem(item)
+ dst.sortItems()
def add_selected(self):
self.switch_selected(self.available_list, self.selected_list)
- self.selected_list.sortItems()
-
def remove_selected(self):
self.switch_selected(self.selected_list, self.available_list)
- self.available_list.sortItems()
+
+ def move_all(self, src, dst):
+ while src.count() > 0:
+ item = src.takeItem(0)
+ dst.addItem(item)
+ dst.sortItems()
+
+ def add_all(self):
+ self.move_all(self.available_list, self.selected_list)
+
+ def remove_all(self):
+ self.move_all(self.selected_list, self.available_list)
def clear(self):
self.available_list.clear()
@@ -36,7 +48,6 @@ class MultiSelectWidget(Ui_MultiSelectWidget, QWidget):
-
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
ui = MultiSelectWidget()
diff --git a/qubesmanager/restore.py b/qubesmanager/restore.py
index 9371f85..d243a25 100644
--- a/qubesmanager/restore.py
+++ b/qubesmanager/restore.py
@@ -53,7 +53,7 @@ class RestoreVMsWindow(Ui_Restore, QWizard):
self.setupUi(self)
self.selectVMsWidget = MultiSelectWidget(self)
- self.verticalLayout.insertWidget(1, self.selectVMsWidget)
+ self.selectVMsLayout.insertWidget(1, self.selectVMsWidget)
self.selectVMsWidget.available_list.addItem("netVM1")
self.selectVMsWidget.available_list.addItem("appVM1")
diff --git a/qubesmanager/settings.py b/qubesmanager/settings.py
index a213af7..b7ce7e1 100644
--- a/qubesmanager/settings.py
+++ b/qubesmanager/settings.py
@@ -50,10 +50,12 @@ from multiselectwidget import *
class VMSettingsWindow(Ui_SettingsDialog, QDialog):
- def __init__(self, vm, parent=None):
+ def __init__(self, vm, init_page=0, parent=None):
super(VMSettingsWindow, self).__init__(parent)
self.setupUi(self)
+ if init_page in range(self.tabWidget.count()):
+ self.tabWidget.setCurrentIndex(init_page)
self.connect(self.buttonBox, SIGNAL("accepted()"), self.save_and_apply)
self.connect(self.buttonBox, SIGNAL("rejected()"), self.reject)
diff --git a/resources.qrc b/resources.qrc
index 360ff93..483f372 100644
--- a/resources.qrc
+++ b/resources.qrc
@@ -1,5 +1,13 @@
+ icons/pencil.png
+ icons/edit.png
+ icons/add.png
+ icons/flag-blue.png
+ icons/flag-green.png
+ icons/flag-red.png
+ icons/flag-yellow.png
+ icons/remove.png
icons/on.png
icons/appsprefs.png
icons/newfirewall.png
diff --git a/restoredlg.ui b/restoredlg.ui
index 88360e1..8ff2cee 100644
--- a/restoredlg.ui
+++ b/restoredlg.ui
@@ -20,170 +20,168 @@
QWizard::NoBackButtonOnLastPage|QWizard::NoBackButtonOnStartPage
-
-
-
-
-
- Device
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
-
- dev1
-
-
- -
-
- longdeviceblablabla
-
-
- -
-
- dev2
-
-
- -
-
- dev3
-
-
-
-
- -
-
-
- Backup directory:
-
-
-
- -
-
-
- -
-
-
- ...
-
-
-
- -
-
+
+
-
+
- 12
- 75
- false
- true
- false
+ 50
+ false
-
- Select backup source location:
+
+ Backup source location
+
+
-
+
+
+
+ 50
+ false
+
+
+
+ Device
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
-
+
+ dev1
+
+
+ -
+
+ longdeviceblablabla
+
+
+ -
+
+ dev2
+
+
+ -
+
+ dev3
+
+
+
+
+ -
+
+
+ Backup directory:
+
+
+
+ -
+
+
+ -
+
+
+ ...
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 215
+
+
+
+
-
+
-
-
-
-
- 12
- 75
- false
- true
- false
-
-
-
- Select VMs to restore:
+
+
+ VMs to restore
+
-
-
-
- -
-
+
- 12
- 75
- false
- true
- false
+ 50
+ false
-
- Restore options:
+
+ Restore options
+
+
-
+
+
+
+ 50
+ false
+
+
+
+ Do not restore VMs that have missing templates or netvms.
+
+
+ skip broken
+
+
+
+ -
+
+
+ Ignore missing templates or netvms, restore VMs anyway.
+
+
+ ignore missing
+
+
+
+ -
+
+
+ Do not restore VMs that are already present on the host.
+
+
+ skip conflicting
+
+
+
+ -
+
+
+ Ignore dom0 username mismatch while restoring homedir.
+
+
+ ignore username mismatch
+
+
+
+
- -
-
-
-
-
-
- Do not restore VMs that have missing templates or netvms.
-
-
- skip broken
-
-
-
- -
-
-
- Do not restore VMs that are already present on the host.
-
-
- skip conflicting
-
-
-
- -
-
-
- Ignore dom0 username mismatch while restoring homedir.
-
-
- ignore username mismatch
-
-
-
- -
-
-
- Ignore missing templates or netvms, restore VMs anyway.
-
-
- ignore missing
-
-
-
- -
-
-
- Force to run, even with root privileges.
-
-
- force root
-
-
-
-
-
@@ -192,10 +190,10 @@
- 12
- 75
+ 9
+ 50
false
- true
+ false
false
@@ -223,10 +221,10 @@ p, li { white-space: pre-wrap; }
- 12
- 75
+ 9
+ 50
false
- true
+ false
false
@@ -243,10 +241,10 @@ p, li { white-space: pre-wrap; }
- 12
- 75
+ 9
+ 50
false
- true
+ false
false
@@ -255,21 +253,6 @@ p, li { white-space: pre-wrap; }
- -
-
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A lot of info<br />A lot of info<br />A lot of info<br />A lot of info<br />A lot of info<br />A lot of info<br />A lot of info A lot of info A lot of info A lot of info A lot of info A lot of info</p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A lot of info A lot of info A lot of info A lot of info A lot of info A lot of info</p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A lot of info A lot of info A lot of info A lot of info A lot of info A lot of info</p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A lot of info A lot of info A lot of info A lot of info A lot of info A lot of info</p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A lot of info A lot of info A lot of info A lot of info A lot of info A lot of info<br />A lot of info</p></body></html>
-
-
-
-
diff --git a/settingsdlg.ui b/settingsdlg.ui
index 19d0b76..59d0c1b 100644
--- a/settingsdlg.ui
+++ b/settingsdlg.ui
@@ -26,7 +26,7 @@
- 0
+ 2
@@ -35,131 +35,123 @@
Basic
-
+
-
-
-
-
-
-
- Settings
-
-
-
-
-
-
- Name & label:
-
-
-
- -
-
-
- myappvm
-
-
-
- -
-
-
- true
-
-
-
- -
-
-
- Use this template:
-
-
-
- -
-
-
- -
-
-
- Allow networking
-
-
- true
-
-
-
-
-
-
- -
-
-
- Info
-
-
-
-
-
-
- Type:
-
-
-
- -
-
-
-
- 75
- true
-
-
-
- AppVM
-
-
-
- -
-
-
- Installed by RPM:
-
-
-
- -
-
-
-
- 75
- true
-
-
-
- No
-
-
-
-
-
-
-
+
+
+ Settings
+
+
+ -
+
+
+ Name & label:
+
+
+
+ -
+
+
+ myappvm
+
+
+
+ -
+
+
+ true
+
+
+
+ -
+
+
+ Template:
+
+
+
+ -
+
+
+ -
+
+
+ NetVM:
+
+
+
+ -
+
+
+ -
+
+
+ true
+
+
+ Include in backups by default
+
+
+ true
+
+
+
+
+
-
-
-
- Qt::Vertical
+
+
+ Info
-
-
- 20
- 157
-
-
-
+
+
+ QFormLayout::AllNonFixedFieldsGrow
+
+
-
+
+
+ Type:
+
+
+
+ -
+
+
+
+ 75
+ true
+
+
+
+ AppVM
+
+
+
+ -
+
+
+ Installed by RPM:
+
+
+
+ -
+
+
+
+ 75
+ true
+
+
+
+ No
+
+
+
+
+
-
-
-
-
- Advanced
-
-
- -
+
-
Disk storage
@@ -168,7 +160,7 @@
-
- false
+ true
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
@@ -181,16 +173,6 @@
- -
-
-
- false
-
-
- Allow to grow
-
-
-
-
@@ -205,64 +187,39 @@
- -
-
-
- false
-
-
- Include in backups
-
-
- true
-
-
-
- -
+
-
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 73
+
+
+
+
+
+
+
+
+ Advanced
+
+
+ -
Memory/CPU
-
-
-
-
-
- false
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
- 10000
-
-
- 100
-
-
- 400
-
-
-
- -
-
+
+
-
+
- MB
-
-
-
- -
-
-
- false
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
- 1
+ Initial memory:
@@ -289,57 +246,70 @@
- -
-
+
-
+
- Memory:
+ Max memory:
+
+
+
+ -
+
+
+ false
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ 10000
+
+
+ 100
+
+
+ 400
+
+
+
+ -
+
+
+ MB
-
-
-
- Max Memory:
-
-
-
- -
- VCPUs:
+ VCPUs no.:
+
+
+
+ -
+
+
+ false
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ 1
+
+
+
+ -
+
+
+ Include in memory balancing
- -
-
-
- Networking
-
-
-
-
-
-
- NetVM:
-
-
-
- -
-
-
- -
-
-
- VM updateable?
-
-
-
-
-
-
- -
+
-
Kernel
@@ -378,7 +348,7 @@
- -
+
-
Paths
@@ -469,6 +439,168 @@
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 88
+
+
+
+
+
+
+
+
+ Firewall rules
+
+
+ -
+
+
+ Allow network access except...
+
+
+
+ -
+
+
+ Deny network access except...
+
+
+
+ -
+
+
+ QLayout::SetMaximumSize
+
+
-
+
+
-
+
+
+ false
+
+
+ false
+
+
+ false
+
+
+ true
+
+
+ true
+
+
+ 40
+
+
+ false
+
+
+
+ -
+
+
-
+
+
+ Allow ICMP traffic
+
+
+ true
+
+
+
+ -
+
+
+ Allow DNS queries
+
+
+ true
+
+
+
+
+
+
+
+ -
+
+
-
+
+
+
+
+
+
+ :/add.png:/add.png
+
+
+
+ 24
+ 24
+
+
+
+
+ -
+
+
+
+
+
+
+ :/pencil.png:/pencil.png
+
+
+
+ 24
+ 24
+
+
+
+
+ -
+
+
+
+
+
+
+ :/remove.png:/remove.png
+
+
+
+ 24
+ 24
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
+
+
@@ -495,6 +627,112 @@
+
+
+ Services
+
+
+ -
+
+
+ -
+
+
+
+
+
+
+ :/add.png:/add.png
+
+
+
+ 24
+ 24
+
+
+
+
+ -
+
+
-
+
+ ntpd
+
+
+ Checked
+
+
+ -
+
+ cupsd
+
+
+ Checked
+
+
+ -
+
+ meminfo
+
+
+ Checked
+
+
+
+
+ -
+
+
+ Checked services will be turned on.
+
+
+
+ -
+
+
+ Unchecked services will be turned off.
+
+
+
+ -
+
+
+ Unlisted services will follow default VM's settings.
+
+
+
+ -
+
+
+
+
+
+
+ :/remove.png:/remove.png
+
+
+
+ 24
+ 24
+
+
+
+
+ -
+
+
+ Qt::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
-