summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVivien Kraus <vivien@planete-kraus.eu>2021-10-05 19:09:23 +0200
committerVivien Kraus <vivien@planete-kraus.eu>2021-10-07 12:34:19 +0200
commit84c881aec122036dc1f6f0c2e18f24ce5a28f06b (patch)
treef28cc57e50df5a48860b0c4468ccb7f1850b1953 /src
parent4f2cb622a522691fd13412af9ea4aac0fb36076e (diff)
gui: use libhandy
Diffstat (limited to 'src')
-rw-r--r--src/scm/webid-oidc/client/gui/application.scm125
-rw-r--r--src/ui/Makefile.am3
-rw-r--r--src/ui/main-window.glade136
3 files changed, 220 insertions, 44 deletions
diff --git a/src/scm/webid-oidc/client/gui/application.scm b/src/scm/webid-oidc/client/gui/application.scm
index c2ee97d..ff7dce9 100644
--- a/src/scm/webid-oidc/client/gui/application.scm
+++ b/src/scm/webid-oidc/client/gui/application.scm
@@ -28,6 +28,7 @@
#:use-module (webid-oidc errors)
#:use-module (webid-oidc web-i18n)
#:use-module ((webid-oidc parameters) #:prefix p:)
+ #:use-module ((webid-oidc config) #:prefix config:)
#:use-module ((webid-oidc stubs) #:prefix stubs:)
#:use-module ((webid-oidc oidc-id-token) #:prefix id:)
#:use-module ((webid-oidc jwk) #:prefix jwk:)
@@ -48,7 +49,7 @@
#:duplicates (merge-generics)
#:export
(
- application
+ (the-application . application)
))
(push-duplicate-handler! 'merge-generics)
@@ -58,7 +59,8 @@
(use-typelibs (("Gio" "2.0") #:renamer (protect 'application:new))
("Gtk" "3.0")
- ("GLib" "2.0"))
+ ("GLib" "2.0")
+ ("Handy" "1"))
(define gi:connect
(@ (gi) connect))
@@ -69,7 +71,7 @@
(define gi:make
(@ (gi) make))
-(define application
+(define the-application
(application:new
"eu.planete_kraus.Disfluid"
(list->application-flags '(flags-none))))
@@ -77,52 +79,89 @@
(define app:client
(@ (webid-oidc client application) client))
-(define-method (->widget (application <application-state>))
- (let ((content (box:new (symbol->orientation 'horizontal) 12)))
- (call-with-values
- (lambda ()
- (client:->widget (app:client application)))
- (lambda (client-builder client)
- (call-with-values
- (lambda ()
- (accounts:->widget application))
- (lambda (accounts-builder accounts)
- (call-with-values
- (lambda ()
- (authorizations:->widget application))
- (lambda (authorizations-builder authorizations)
- (box:pack-start content client #t #t 0)
- (box:pack-start content accounts #t #t 0)
- (box:pack-start content authorizations #t #t 0)
- (values
- `(,client-builder ,accounts-builder ,authorizations-builder)
- content)))))))))
-
+(define window-builder #f)
(define main-window #f)
-
-(define current-state #f)
-(define current-state-widget #f)
-(define additional-gc-roots '())
-
-(define-method (set-state! (state <application-state>))
- (when (and main-window current-state-widget)
- (remove main-window current-state-widget))
- (set! current-state state)
+(define explorer-container #f)
+(define authorizations-container #f)
+(define accounts-container #f)
+(define settings-container #f)
+
+(define content-builder #f)
+(define explorer-widget #f)
+(define authorizations-widget #f)
+(define accounts-widget #f)
+(define settings-widget #f)
+
+(define (set-state! application)
(call-with-values
(lambda ()
- (->widget state))
- (lambda (roots widget)
- (set! current-state-widget widget)
- (set! additional-gc-roots roots)))
+ (client:->widget (app:client application)))
+ (lambda (client-builder client)
+ (call-with-values
+ (lambda ()
+ (accounts:->widget application))
+ (lambda (accounts-builder accounts)
+ (call-with-values
+ (lambda ()
+ (authorizations:->widget application))
+ (lambda (authorizations-builder authorizations)
+ (when (and explorer-container explorer-widget)
+ (container:remove explorer-container explorer-widget))
+ (when (and authorizations-container authorizations-widget)
+ (container:remove authorizations-container authorizations-widget))
+ (when (and accounts-container accounts-widget)
+ (container:remove accounts-container accounts-widget))
+ (when (and settings-container settings-widget)
+ (container:remove settings-container settings-widget))
+ (set! explorer-widget (label:new (G_ "Coming soon!")))
+ (set! authorizations-widget authorizations)
+ (set! accounts-widget accounts)
+ (set! settings-widget client)
+ (when explorer-container
+ (box:pack-end explorer-container explorer-widget #t #t 0))
+ (when authorizations-container
+ (box:pack-end authorizations-container authorizations-widget #t #t 0))
+ (when accounts-container
+ (box:pack-end accounts-container accounts-widget #t #t 0))
+ (when settings-container
+ (box:pack-end settings-container settings-widget #t #t 0))
+ (set! content-builder
+ `(,client-builder ,accounts-builder ,authorizations-builder))))))))
(when main-window
- (add main-window current-state-widget)
(show-all main-window)))
-(define (on-activate application)
+(define (on-activate app)
+ (set! window-builder
+ (builder:new-from-file (string-append config:uidir "/main-window.glade")))
(set! main-window
- (gi:make <GtkApplicationWindow>
- #:application application))
+ (builder:get-object window-builder "main_window"))
+ (set-object-property! main-window application app)
+ (add-window app main-window)
+ (set! explorer-container
+ (builder:get-object window-builder "explorer_container"))
+ (set! authorizations-container
+ (builder:get-object window-builder "authorizations_container"))
+ (set! accounts-container
+ (builder:get-object window-builder "accounts_container"))
+ (set! settings-container
+ (builder:get-object window-builder "settings_container"))
+ (let ((squeezer
+ (builder:get-object window-builder "squeezer"))
+ (headerbar-switcher
+ (builder:get-object window-builder "headerbar_switcher"))
+ (bottom-switcher
+ (builder:get-object window-builder "bottom_switcher"))
+ (notify
+ (gi:make <signal>
+ #:name "notify"
+ #:param-types (list G_TYPE_OBJECT))))
+ (gi:connect squeezer notify
+ (lambda _
+ (let ((child (get-visible-child squeezer)))
+ (set-reveal bottom-switcher
+ (not (is-a? child <HdyViewSwitcher>)))))))
(add-hook! application-state-changed-hook set-state! #t)
- (run-hook application-activated-hook application))
+ (run-hook application-activated-hook the-application)
+ (show-all main-window))
-(gi:connect application activate on-activate)
+(gi:connect the-application activate on-activate)
diff --git a/src/ui/Makefile.am b/src/ui/Makefile.am
index 706725c..cbd7b0f 100644
--- a/src/ui/Makefile.am
+++ b/src/ui/Makefile.am
@@ -19,4 +19,5 @@ dist_uipkgdata_DATA = \
%reldir%/client-widget.glade \
%reldir%/account-widget.glade \
%reldir%/accounts-widget.glade \
- %reldir%/authorization-prompt.glade
+ %reldir%/authorization-prompt.glade \
+ %reldir%/main-window.glade
diff --git a/src/ui/main-window.glade b/src/ui/main-window.glade
new file mode 100644
index 0000000..63ecda1
--- /dev/null
+++ b/src/ui/main-window.glade
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.36.0 -->
+<interface>
+ <requires lib="gtk+" version="3.24"/>
+ <requires lib="libhandy" version="0.0"/>
+ <object class="GtkApplicationWindow" id="main_window">
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="vexpand">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkStack" id="stack1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="transition_type">crossfade</property>
+ <child>
+ <object class="GtkBox" id="explorer_container">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="name">explore</property>
+ <property name="title" translatable="yes">Explore</property>
+ <property name="icon_name">eu.planete_kraus.Disfluid-symbolic</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="authorizations_container">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="name">authorizations</property>
+ <property name="title" translatable="yes">Authorizations</property>
+ <property name="icon_name">preferences-system-privacy-symbolic</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="accounts_container">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="name">accounts</property>
+ <property name="title" translatable="yes">Accounts</property>
+ <property name="icon_name">emoji-people-symbolic</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="settings_container">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="name">settings</property>
+ <property name="title" translatable="yes">Settings</property>
+ <property name="icon_name">preferences-system-symbolic</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="HdyViewSwitcherBar" id="bottom_switcher">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="policy">auto</property>
+ <property name="stack">stack1</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child type="titlebar">
+ <object class="HdyHeaderBar">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="show_close_button">True</property>
+ <property name="centering_policy">strict</property>
+ <child type="title">
+ <object class="HdySqueezer" id="squeezer">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="homogeneous">True</property>
+ <property name="transition_type">crossfade</property>
+ <child>
+ <object class="HdyViewSwitcher" id="headerbar_switcher">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="stack">stack1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="name">title_label</property>
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label">Disfluid</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>