50 lines
2.1 KiB
Python
50 lines
2.1 KiB
Python
from gi.repository import Gtk, Gio
|
|
from .settingsmanager import SettingsManager
|
|
from .statemanager import StateManager
|
|
|
|
import gettext
|
|
|
|
_ = gettext.gettext
|
|
|
|
|
|
@Gtk.Template(resource_path='/com/xronlinux/BreezyDesktop/gtk/display-distance-dialog-content.ui')
|
|
class DisplayDistanceDialogContent(Gtk.Box):
|
|
__gtype_name__ = 'DisplayDistanceDialogContent'
|
|
|
|
display_distance_subtitle = Gtk.Template.Child()
|
|
display_distance_scale = Gtk.Template.Child()
|
|
display_distance_adjustment = Gtk.Template.Child()
|
|
|
|
def __init__(self, settings_key, save_button, on_save_callback, subtitle, lower_limit, upper_limit):
|
|
super(Gtk.Box, self).__init__()
|
|
self.init_template()
|
|
|
|
self.display_distance_subtitle.set_markup(f"""<span size="small">{subtitle}</span>""")
|
|
|
|
self.on_save_callback = on_save_callback
|
|
self.settings = SettingsManager.get_instance().settings
|
|
self.state_manager = StateManager.get_instance()
|
|
self.prev_distance = self.settings.get_double('display-distance')
|
|
self.display_distance_adjustment.set_value(self.settings.get_double(settings_key))
|
|
|
|
self.display_distance_scale.set_format_value_func(lambda scale, val: self._format_distance(val))
|
|
self.state_manager.connect('notify::connected-device-full-distance-cm', lambda *args: self.display_distance_scale.queue_draw())
|
|
self.settings.connect('changed::units', lambda *args: self.display_distance_scale.queue_draw())
|
|
save_button.connect('clicked', self._on_save_button_clicked)
|
|
|
|
def _on_save_button_clicked(self, button):
|
|
self.on_save_callback(self.prev_distance, self.display_distance_adjustment.get_value())
|
|
|
|
def _get_units(self):
|
|
units = self.settings.get_string('units')
|
|
return units if units in ['cm', 'in'] else 'cm'
|
|
|
|
def _format_distance(self, normalized):
|
|
full_cm = float(self.state_manager.get_property('connected-device-full-distance-cm') or 0.0)
|
|
if full_cm <= 0:
|
|
return f"{round(normalized, 2)}"
|
|
cm = normalized * full_cm
|
|
if self._get_units() == 'in':
|
|
inches = cm / 2.54
|
|
return f"{inches:.2f} in"
|
|
return f"{cm:.1f} cm" |