Skip to content

Commit 3134d0c

Browse files
committed
Merge remote-tracking branch 'origin/pr/304'
* origin/pr/304: Add --open-at to New Qube Improve Disposable Config Tools + Add Create New DVM Template Pull request description: - make a new page in global config concerned with Disposables - the page has controls for default disposable template, list of disposable templates, preloading config, and policy related to open in disposable / open url in disposable - add a page for creating new disposable template to create new qube fixes QubesOS/qubes-issues#10665
2 parents 0ccf47d + 97feb86 commit 3134d0c

17 files changed

Lines changed: 4127 additions & 3080 deletions

icons/scalable/disp-dark.svg

Lines changed: 1 addition & 0 deletions
Loading

icons/scalable/disp-light.svg

Lines changed: 1 addition & 0 deletions
Loading

qubes_config/global_config.glade

Lines changed: 2885 additions & 2578 deletions
Large diffs are not rendered by default.

qubes_config/global_config/basics_handler.py

Lines changed: 1 addition & 197 deletions
Original file line numberDiff line numberDiff line change
@@ -210,177 +210,6 @@ def get_model(self) -> TraitSelector:
210210
return self.model
211211

212212

213-
class PreloadDispvmHandler(AbstractTraitHolder):
214-
"""Handler for preloaded disposables. Requires SpinButton widgets:
215-
'basics_preload_dispvm'"""
216-
217-
def __init__(
218-
self,
219-
qapp: qubesadmin.Qubes,
220-
gtk_builder: Gtk.Builder,
221-
defdispvm_model: VMListModeler,
222-
):
223-
self.qapp = qapp
224-
self.defdispvm_model = defdispvm_model
225-
self.preload_dispvm_spin: Gtk.SpinButton = gtk_builder.get_object(
226-
"basics_preload_dispvm"
227-
)
228-
self.preload_dispvm_threshold_spin: Gtk.SpinButton = gtk_builder.get_object(
229-
"basics_preload_dispvm_threshold"
230-
)
231-
self.preload_dispvm_check: Gtk.CheckButton = gtk_builder.get_object(
232-
"basics_preload_dispvm_check"
233-
)
234-
235-
self.defdispvm_model.connect_change_callback(self.on_defdispvm_changed)
236-
self.preload_dispvm_check.connect("toggled", self.on_check_changed)
237-
238-
self.default_max = 1
239-
self.preload_dispvm_spin.props.numeric = True
240-
self.preload_dispvm_spin_adjustment = Gtk.Adjustment()
241-
self.preload_dispvm_spin_adjustment.configure(0, 0, 9999, 1, 5, 0)
242-
self.preload_dispvm_spin.configure(self.preload_dispvm_spin_adjustment, 0.1, 0)
243-
244-
self.preload_dispvm_threshold_spin.props.numeric = True
245-
self.preload_dispvm_threshold_spin_adjustment = Gtk.Adjustment()
246-
self.preload_dispvm_threshold_spin_adjustment.configure(
247-
0, 0, 999999, 100, 1000, 0
248-
)
249-
self.preload_dispvm_threshold_spin.configure(
250-
self.preload_dispvm_threshold_spin_adjustment, 0.1, 0
251-
)
252-
253-
self.on_defdispvm_changed()
254-
self.on_check_changed()
255-
self.initial_preload_dispvm_spin_sensitive = (
256-
self.preload_dispvm_spin.is_sensitive()
257-
)
258-
self.preload_dispvm_threshold_spin.set_value(self.get_current_threshold_value())
259-
260-
def on_defdispvm_changed(self):
261-
defdispvm = self.defdispvm_model.get_selected()
262-
if defdispvm:
263-
self.preload_dispvm_check.set_sensitive(True)
264-
self.preload_dispvm_check.set_active(self.get_feat_value() is not None)
265-
else:
266-
self.preload_dispvm_check.set_sensitive(False)
267-
self.preload_dispvm_check.set_active(False)
268-
269-
def on_check_changed(self, *args): # pylint: disable=unused-argument
270-
defdispvm = self.defdispvm_model.get_selected()
271-
preloadcheck = self.preload_dispvm_check.get_active()
272-
if defdispvm and preloadcheck:
273-
if self.get_feat_value() is None:
274-
value = self.default_max
275-
else:
276-
value = self.get_current_value()
277-
self.preload_dispvm_spin.set_value(value)
278-
self.preload_dispvm_spin.set_sensitive(True)
279-
else:
280-
self.preload_dispvm_spin.set_value(0)
281-
self.preload_dispvm_spin.set_sensitive(False)
282-
283-
@staticmethod
284-
def get_readable_description() -> str: # pylint: disable=arguments-differ
285-
"""Get human-readable description of the widget"""
286-
# the pylint: disable above is because pylint does not understand
287-
# static methods
288-
return _("Number of preloaded disposables from default dispvm")
289-
290-
def get_feat_value(self):
291-
"""Get current system value as is"""
292-
return get_feature(self.qapp.domains["dom0"], "preload-dispvm-max")
293-
294-
def get_feat_threshold_value(self):
295-
"""Get current system threshold value as is"""
296-
return get_feature(self.qapp.domains["dom0"], "preload-dispvm-threshold")
297-
298-
def get_current_value(self):
299-
"""Get current system value of the handled feature"""
300-
return int(self.get_feat_value() or 0)
301-
302-
def get_current_threshold_value(self):
303-
"""Get current system value of the handled feature"""
304-
return int(self.get_feat_threshold_value() or 0)
305-
306-
def is_max_changed(self) -> bool:
307-
"""Has the user selected something different from the initial value?"""
308-
if (
309-
self.initial_preload_dispvm_spin_sensitive
310-
!= self.preload_dispvm_spin.is_sensitive()
311-
):
312-
return True
313-
if self.preload_dispvm_spin.get_value_as_int() != self.get_current_value():
314-
return True
315-
return False
316-
317-
def is_threshold_changed(self) -> bool:
318-
"""Has the user selected something different from the initial value?"""
319-
return (
320-
self.preload_dispvm_threshold_spin.get_value_as_int()
321-
!= self.get_current_threshold_value()
322-
)
323-
324-
def is_changed(self) -> bool:
325-
"""Has the user selected something different from the initial value?"""
326-
if self.is_max_changed() or self.is_threshold_changed():
327-
return True
328-
return False
329-
330-
def get_unsaved(self):
331-
"""Get human-readable description of unsaved changes, or
332-
empty string if none were found."""
333-
if self.is_changed():
334-
return self.get_readable_description()
335-
return ""
336-
337-
def save(self):
338-
"""Save changes: update system value and mark it as new initial value"""
339-
if not self.is_changed():
340-
return
341-
342-
if self.is_threshold_changed():
343-
threshold_value = str(self.preload_dispvm_threshold_spin.get_value_as_int())
344-
apply_feature_change(
345-
self.qapp.domains["dom0"],
346-
"preload-dispvm-threshold",
347-
threshold_value,
348-
)
349-
350-
# Every other feature must be set before "max" (prior to preload routine).
351-
if self.is_max_changed():
352-
if self.preload_dispvm_spin.is_sensitive():
353-
value = str(self.preload_dispvm_spin.get_value_as_int())
354-
else:
355-
value = None
356-
apply_feature_change(
357-
self.qapp.domains["dom0"],
358-
"preload-dispvm-max",
359-
value,
360-
)
361-
if value is None:
362-
self.initial_preload_dispvm_spin_sensitive = False
363-
else:
364-
self.initial_preload_dispvm_spin_sensitive = True
365-
366-
def reset(self):
367-
"""Reset selection to the initial value."""
368-
if self.preload_dispvm_spin.is_sensitive():
369-
self.preload_dispvm_spin.set_value(self.get_current_value())
370-
if self.preload_dispvm_threshold_spin.is_sensitive():
371-
self.preload_dispvm_threshold_spin.set_value(
372-
self.get_current_threshold_value()
373-
)
374-
375-
def update_current_value(self):
376-
"""This should never be called."""
377-
raise NotImplementedError
378-
379-
def get_model(self) -> TraitSelector:
380-
"""This should never be called."""
381-
raise NotImplementedError
382-
383-
384213
class QMemManHelper:
385214
"""Helper class to handle the ugliness of managing qmemman config."""
386215

@@ -622,9 +451,6 @@ def __init__(self, gtk_builder: Gtk.Builder, qapp: qubesadmin.Qubes):
622451
self.defnetvm_combo: Gtk.ComboBox = gtk_builder.get_object(
623452
"basics_defnetvm_combo"
624453
)
625-
self.defdispvm_combo: Gtk.ComboBox = gtk_builder.get_object(
626-
"basics_defdispvm_combo"
627-
)
628454
self.fullscreen_combo: Gtk.ComboBoxText = gtk_builder.get_object(
629455
"basics_fullscreen_combo"
630456
)
@@ -671,25 +497,7 @@ def __init__(self, gtk_builder: Gtk.Builder, qapp: qubesadmin.Qubes):
671497
additional_options=NONE_CATEGORY,
672498
)
673499
)
674-
self.handlers.append(
675-
PropertyHandler(
676-
qapp=self.qapp,
677-
trait_holder=self.qapp,
678-
trait_name="default_dispvm",
679-
widget=self.defdispvm_combo,
680-
vm_filter=self._default_dispvm_filter,
681-
readable_name=_("Default disposable qube template"),
682-
additional_options=NONE_CATEGORY,
683-
)
684-
)
685-
defdispvm_model: VMListModeler = self.handlers[-1].get_model() # type: ignore
686-
self.handlers.append(
687-
PreloadDispvmHandler(
688-
qapp=self.qapp,
689-
gtk_builder=gtk_builder,
690-
defdispvm_model=defdispvm_model,
691-
)
692-
)
500+
693501
self.handlers.append(
694502
FeatureHandler(
695503
trait_holder=self.vm,
@@ -752,10 +560,6 @@ def _default_template_filter(vm) -> bool:
752560
def _default_netvm_filter(vm) -> bool:
753561
return getattr(vm, "provides_network", False)
754562

755-
@staticmethod
756-
def _default_dispvm_filter(vm) -> bool:
757-
return getattr(vm, "template_for_dispvms", False)
758-
759563
def save(self):
760564
for handler in self.handlers:
761565
handler.save()

0 commit comments

Comments
 (0)