Make the setup parts a dialog

A more traditional interface.
pull/145/head
Peter Hutterer 2019-07-15 15:05:30 +10:00
parent 64dca90f54
commit 517a7e6882
4 changed files with 445 additions and 441 deletions

View File

@ -2,7 +2,51 @@
<!-- Generated with glade 3.22.1 --> <!-- Generated with glade 3.22.1 -->
<interface> <interface>
<requires lib="gtk+" version="3.20"/> <requires lib="gtk+" version="3.20"/>
<template class="SetupPerspective" parent="GtkStack"> <template class="SetupDialog" parent="GtkDialog">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Initial Device Setup</property>
<property name="modal">True</property>
<property name="window_position">center</property>
<property name="destroy_with_parent">True</property>
<property name="type_hint">dialog</property>
<property name="gravity">center</property>
<child type="titlebar">
<placeholder/>
</child>
<child internal-child="vbox">
<object class="GtkBox">
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox">
<property name="can_focus">False</property>
<property name="layout_style">end</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkButton" id="btn_quit">
<property name="label" translatable="yes">Quit</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkStack" id="stack">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="margin_bottom">100</property> <property name="margin_bottom">100</property>
@ -18,13 +62,9 @@
<object class="GtkLabel"> <object class="GtkLabel">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="label" translatable="yes">Device Setup</property> <property name="label" translatable="yes">No device found by Tuhi. Let's setup your device for the first time. This needs to be done only once for this device.</property>
<property name="justify">center</property> <property name="wrap">True</property>
<property name="track_visited_links">False</property> <property name="max_width_chars">55</property>
<attributes>
<attribute name="weight" value="medium"/>
<attribute name="size" value="50000"/>
</attributes>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -32,6 +72,20 @@
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Hold the button on the device until the blue light is flashing. Once the device is found, we will process to the next stage.</property>
<property name="wrap">True</property>
<property name="max_width_chars">55</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>
@ -55,9 +109,6 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="label" translatable="yes">Searching for device</property> <property name="label" translatable="yes">Searching for device</property>
<attributes>
<attribute name="size" value="20000"/>
</attributes>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -66,24 +117,6 @@
</packing> </packing>
</child> </child>
</object> </object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Hold the button on the device until the blue light is flashing.</property>
<property name="wrap">True</property>
<property name="max_width_chars">65</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="size" value="20000"/>
</attributes>
</object>
<packing> <packing>
<property name="expand">True</property> <property name="expand">True</property>
<property name="fill">True</property> <property name="fill">True</property>
@ -107,13 +140,9 @@
<object class="GtkLabel"> <object class="GtkLabel">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="label" translatable="yes">Device Setup</property> <property name="label" translatable="yes">Compatible device found. Attempting to connect.</property>
<property name="justify">center</property> <property name="wrap">True</property>
<property name="track_visited_links">False</property> <property name="max_width_chars">55</property>
<attributes>
<attribute name="weight" value="medium"/>
<attribute name="size" value="50000"/>
</attributes>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -144,9 +173,6 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="label" translatable="yes">Connecting to device...</property> <property name="label" translatable="yes">Connecting to device...</property>
<attributes>
<attribute name="size" value="20000"/>
</attributes>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -161,22 +187,6 @@
<property name="position">1</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkLabel" id="device_name_p1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Device found</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="size" value="20000"/>
</attributes>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object> </object>
<packing> <packing>
<property name="name">page1</property> <property name="name">page1</property>
@ -195,13 +205,9 @@
<object class="GtkLabel"> <object class="GtkLabel">
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="label" translatable="yes">Device Setup</property> <property name="label" translatable="yes">Connected to device and finalizing setup.</property>
<property name="justify">center</property> <property name="justify">center</property>
<property name="track_visited_links">False</property> <property name="track_visited_links">False</property>
<attributes>
<attribute name="weight" value="medium"/>
<attribute name="size" value="50000"/>
</attributes>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -209,6 +215,22 @@
<property name="position">0</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Press the button on the device now!</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="size" value="20000"/>
</attributes>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>
@ -232,9 +254,6 @@
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="label" translatable="yes">waiting for reply</property> <property name="label" translatable="yes">waiting for reply</property>
<attributes>
<attribute name="size" value="20000"/>
</attributes>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
@ -246,22 +265,6 @@
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Press the button on the device now!</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="size" value="20000"/>
</attributes>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property> <property name="position">2</property>
</packing> </packing>
</child> </child>
@ -279,22 +282,6 @@
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="homogeneous">True</property> <property name="homogeneous">True</property>
<property name="baseline_position">bottom</property> <property name="baseline_position">bottom</property>
<child>
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Setup Complete</property>
<attributes>
<attribute name="weight" value="medium"/>
<attribute name="size" value="50000"/>
</attributes>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="visible">True</property> <property name="visible">True</property>
@ -424,23 +411,19 @@
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">1</property> <property name="position">0</property>
</packing> </packing>
</child> </child>
<child> <child>
<object class="GtkButton"> <object class="GtkLabel">
<property name="label" translatable="yes">Let's go!</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">True</property> <property name="can_focus">False</property>
<property name="receives_default">True</property> <property name="label" translatable="yes">Setup Complete</property>
<property name="halign">center</property>
<property name="valign">end</property>
<signal name="clicked" handler="_on_go_button_clicked" swapped="no"/>
</object> </object>
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">3</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
</object> </object>
@ -450,5 +433,17 @@
<property name="position">3</property> <property name="position">3</property>
</packing> </packing>
</child> </child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="-6">btn_quit</action-widget>
</action-widgets>
</template> </template>
</interface> </interface>

View File

@ -18,53 +18,53 @@ gi.require_version("Gtk", "3.0")
@Gtk.Template(resource_path="/org/freedesktop/TuhiGui/ui/SetupPerspective.ui") @Gtk.Template(resource_path="/org/freedesktop/TuhiGui/ui/SetupPerspective.ui")
class SetupPerspective(Gtk.Stack): class SetupDialog(Gtk.Dialog):
__gtype_name__ = "SetupPerspective" __gtype_name__ = "SetupDialog"
__gsignals__ = { __gsignals__ = {
'new-device': 'new-device':
(GObject.SignalFlags.RUN_FIRST, None, (GObject.TYPE_PYOBJECT,)), (GObject.SignalFlags.RUN_FIRST, None, (GObject.TYPE_PYOBJECT,)),
} }
device_name_p1 = Gtk.Template.Child() stack = Gtk.Template.Child()
device_name_p3 = Gtk.Template.Child() device_name_p3 = Gtk.Template.Child()
label_size = Gtk.Template.Child() label_size = Gtk.Template.Child()
label_btaddr = Gtk.Template.Child() label_btaddr = Gtk.Template.Child()
label_battery = Gtk.Template.Child() label_battery = Gtk.Template.Child()
btn_quit = Gtk.Template.Child()
def __init__(self, tuhi, *args, **kwargs): def __init__(self, tuhi, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self._tuhi = tuhi self._tuhi = tuhi
self._sig = tuhi.connect('unregistered-device', self._on_unregistered_device) self._sig = tuhi.connect('unregistered-device', self._on_unregistered_device)
tuhi.start_search() tuhi.start_search()
self.device = None
def _on_unregistered_device(self, tuhi, device): def _on_unregistered_device(self, tuhi, device):
tuhi.disconnect(self._sig) tuhi.disconnect(self._sig)
self.device_name_p1.set_text(device.name) self.stack.set_visible_child_name('page1')
self.set_visible_child_name('page1')
self._sig = device.connect('button-press-required', self._on_button_press_required) self._sig = device.connect('button-press-required', self._on_button_press_required)
device.register() device.register()
def _on_button_press_required(self, tuhi, device): def _on_button_press_required(self, tuhi, device):
tuhi.disconnect(self._sig) tuhi.disconnect(self._sig)
self.set_visible_child_name('page2') self.stack.set_visible_child_name('page2')
self._sig = device.connect('registered', self._on_registered) self._sig = device.connect('registered', self._on_registered)
def _on_registered(self, tuhi, device): def _on_registered(self, tuhi, device):
tuhi.disconnect(self._sig) tuhi.disconnect(self._sig)
self.device_name_p3.set_text(device.name) self.device_name_p3.set_text(device.name)
self.set_visible_child_name('page3') self.stack.set_visible_child_name('page3')
self.label_size.set_text(f'not implemented') w, h = device.dimensions # in 100th of mm
self.label_size.set_text(f'{w/100}x{h/100}mm')
self.label_btaddr.set_text(device.address) self.label_btaddr.set_text(device.address)
self.label_battery.set_text(f'{device.battery_percent}%') self.label_battery.set_text(f'{device.battery_percent}%')
self.device = device self.device = device
self.btn_quit.set_label("Let's go")
@GObject.Property @GObject.Property
def name(self): def name(self):
return "setup_perspective" return "setup_dialog"
@Gtk.Template.Callback("_on_go_button_clicked")
def _on_go_button_clicked(self, button):
self.emit('new-device', self.device)

View File

@ -184,6 +184,10 @@ class TuhiKeteDevice(_DBusObject):
def name(self): def name(self):
return self._bluez_device.property('Name') return self._bluez_device.property('Name')
@GObject.Property
def dimensions(self):
return self.property('Dimensions')
@GObject.Property @GObject.Property
def listening(self): def listening(self):
return self.property('Listening') return self.property('Listening')

View File

@ -13,7 +13,7 @@
from gi.repository import Gtk, Gdk from gi.repository import Gtk, Gdk
from .setupperspective import SetupPerspective from .setupdialog import SetupDialog
from .drawingperspective import DrawingPerspective from .drawingperspective import DrawingPerspective
from .errorperspective import ErrorPerspective from .errorperspective import ErrorPerspective
from .tuhi import TuhiKeteManager from .tuhi import TuhiKeteManager
@ -70,23 +70,28 @@ class MainWindow(Gtk.ApplicationWindow):
dp = DrawingPerspective() dp = DrawingPerspective()
self._add_perspective(dp) self._add_perspective(dp)
active = dp
self.headerbar.set_title(f'Tuhi')
self.stack_perspectives.set_visible_child_name(active.name)
if not self._tuhi.devices: if not self._tuhi.devices:
sp = SetupPerspective(self._tuhi) dialog = SetupDialog(self._tuhi)
sp.connect('new-device', self._on_new_device_registered) dialog.set_transient_for(self)
self._add_perspective(sp) dialog.connect('response', self._on_setup_dialog_closed)
active = sp dialog.show()
else: else:
dp.device = self._tuhi.devices[0] dp.device = self._tuhi.devices[0]
active = dp active = dp
self.headerbar.set_title(f'Tuhi - {dp.device.name}') self.headerbar.set_title(f'Tuhi - {dp.device.name}')
self.stack_perspectives.set_visible_child_name(active.name) def _on_setup_dialog_closed(self, dialog, response):
device = dialog.device
dialog.destroy()
if device is None:
self.destroy()
def _on_new_device_registered(self, setupperspective, device):
logger.debug('device was registered') logger.debug('device was registered')
setupperspective.disconnect_by_func(self._on_new_device_registered)
self.headerbar.set_title(f'Tuhi - {device.name}') self.headerbar.set_title(f'Tuhi - {device.name}')
dp = self._get_child('drawing_perspective') dp = self._get_child('drawing_perspective')