Gradience/gradience/share_window.py

158 lines
4.7 KiB
Python

import sys
import time
from gi.repository import Gtk, Adw, Gio
from .modules.run_async import RunAsync
from .modules.utils import buglog
from .modules.flatpak_overrides import create_gtk_user_override
from .constants import rootdir, app_id, rel_ver
@Gtk.Template(resource_path=f"{rootdir}/ui/share_window.ui")
class GradienceShareWindow(Adw.Window):
__gtype_name__ = "GradienceShareWindow"
settings = Gtk.Settings.get_default()
btn_close = Gtk.Template.Child()
btn_back = Gtk.Template.Child()
btn_next = Gtk.Template.Child()
btn_install = Gtk.Template.Child()
btn_agree = Gtk.Template.Child()
carousel = Gtk.Template.Child()
switch_system = Gtk.Template.Child()
switch_adw_gtk3 = Gtk.Template.Child()
progressbar = Gtk.Template.Child()
img_welcome = Gtk.Template.Child()
label_skip = Gtk.Template.Child()
images = [
f"{rootdir}/images/welcome.svg",
f"{rootdir}/images/welcome-dark.svg",
]
carousel_pages = [
"welcome", # 0
"gradience", # 1
"configure", # 2
"download", # 3
"finish", # 4
]
page_welcome = Gtk.Template.Child()
page_release = Gtk.Template.Child()
def __init__(self, window, **kwargs) -> None:
super().__init__(**kwargs)
self.set_transient_for(window)
# common variables and references
self.window = window
self.gio_settings = Gio.Settings(app_id)
# connect signals
self.carousel.connect("page-changed", self.page_changed)
self.btn_close.connect("clicked", self.close_window)
self.btn_back.connect("clicked", self.previous_page)
self.btn_next.connect("clicked", self.next_page)
self.btn_install.connect("clicked", self.install_runner)
self.settings.connect(
"notify::gtk-application-prefer-dark-theme", self.theme_changed
)
self.connect("close-request", self.quit)
self.btn_close.set_sensitive(False)
if self.settings.get_property("gtk-application-prefer-dark-theme"):
self.img_welcome.set_from_resource(self.images[1])
self.page_changed()
def theme_changed(self, settings, key):
self.img_welcome.set_from_resource(
self.images[settings.get_property(
"gtk-application-prefer-dark-theme")]
)
def get_page(self, index):
return self.carousel_pages[index]
def page_changed(self, widget=False, index=0, *_args):
"""
This function is called on first load and when the user require
to change the page. It sets the widgets status according to
the step of the onboard progress.
"""
page = self.get_page(index)
if page == "finish":
self.btn_back.set_visible(False)
self.btn_next.set_visible(False)
self.carousel.set_interactive(False)
elif page == "download":
self.btn_back.set_visible(True)
self.btn_next.set_visible(False)
self.btn_install.set_visible(True)
self.carousel.set_interactive(False)
elif page == "welcome":
self.btn_back.set_visible(False)
self.btn_next.set_visible(True)
self.carousel.set_interactive(True)
else:
self.btn_back.set_visible(True)
self.btn_next.set_visible(True)
self.btn_install.set_visible(False)
self.carousel.set_interactive(True)
def quit(self, *args):
self.destroy()
def install_runner(self, widget):
def set_completed(result, error=False):
self.label_skip.set_visible(False)
self.btn_close.set_sensitive(True)
self.window.settings.set_boolean("first-run", False)
self.next_page()
self.installing = True
self.set_deletable(False)
def install():
print("Installing Gradience…")
RunAsync(self.pulse)
RunAsync(
install,
callback=set_completed,
)
def previous_page(self, widget=False, index=None):
if index is None:
index = int(self.carousel.get_position())
previous_page = self.carousel.get_nth_page(index - 1)
self.carousel.scroll_to(previous_page, True)
def next_page(self, widget=False, index=None):
if index is None:
index = int(self.carousel.get_position())
next_page = self.carousel.get_nth_page(index + 1)
self.carousel.scroll_to(next_page, True)
def pulse(self):
# This function updates the progress bar every 1s.
while True:
time.sleep(0.5)
self.progressbar.pulse()
def close_window(self, widget):
self.destroy()
self.window.present()