feat: add welcome dialog (WIP)

This commit is contained in:
0xMRTT 2022-08-19 23:28:32 +02:00
parent 2dd878d914
commit ec54cd8596
No known key found for this signature in database
GPG key ID: AC9E06BF3DECB6FB
5 changed files with 153 additions and 3 deletions

View file

@ -12,6 +12,7 @@
<file>ui/custom_css_group.ui</file>
<file>ui/presets_manager_window.ui</file>
<file>ui/plugin_row.ui</file>
<file>ui/welcome.ui</file>
</gresource>
<gresource prefix="/com/github/GradienceTeam/Gradience/icons/scalable/actions/">
<file

View file

@ -35,7 +35,7 @@ from .option import GradienceOption
from .app_type_dialog import GradienceAppTypeDialog
from .custom_css_group import GradienceCustomCSSGroup
from .constants import rootdir, app_id, version, bugtracker_url, help_url, project_url
from .welcome import GradienceWelcomeWindow
def to_slug_case(non_slug):
return re.sub(r"[^0-9a-z]+", "-", anyascii(non_slug).lower()).strip("-")
@ -75,6 +75,7 @@ class GradienceApplication(Adw.Application):
self.disabled_plugins = list(
self.settings.get_value("disabled-plugins"))
self.first_run = self.settings.get_boolean("first-run")
print(f"disabled plugins: {self.disabled_plugins}")
def do_activate(self):
@ -116,7 +117,14 @@ class GradienceApplication(Adw.Application):
f"{rootdir}/presets/adwaita.json"
)
self.win.present()
if self.first_run:
print("first run")
welcome = GradienceWelcomeWindow(self.win)
welcome.present()
else:
print("normal run")
self.win.present()
def reload_user_defined_presets(self):
if self.props.active_window.presets_menu.get_n_items() > 1:

View file

@ -10,6 +10,7 @@ blueprints = custom_target('blueprints',
'ui/custom_css_group.blp',
'ui/presets_manager_window.blp',
'ui/plugin_row.blp',
'ui/welcome.blp',
),
output: '.',
command: [find_program('blueprint-compiler'), 'batch-compile', '@OUTPUT@', '@CURRENT_SOURCE_DIR@', '@INPUT@'],
@ -62,6 +63,7 @@ gradience_sources = [
'custom_css_group.py',
'presets_manager_window.py',
'plugin_row.py',
'welcome.py'
]
PY_INSTALLDIR.install_sources(gradience_sources, subdir: 'gradience')

View file

@ -64,7 +64,7 @@ template GradienceWelcomeWindow: Adw.Window {
}
Adw.StatusPage page_Gradience {
Adw.StatusPage page_gradience {
vexpand: true;
hexpand: true;
title: _("Customize Adwaita");

139
src/welcome.py Normal file
View file

@ -0,0 +1,139 @@
from gi.repository import Gtk, Adw, Gio, Gdk
from material_color_utilities_python import *
from .constants import rootdir
from .run_async import RunAsync
@Gtk.Template(resource_path=f"{rootdir}/ui/welcome.ui")
class GradienceWelcomeWindow(Adw.Window):
__gtype_name__ = "GradienceWelcomeWindow"
__settings = Gtk.Settings.get_default()
carousel = Gtk.Template.Child()
btn_close = Gtk.Template.Child()
btn_back = Gtk.Template.Child()
btn_next = Gtk.Template.Child()
btn_install = Gtk.Template.Child()
progressbar = Gtk.Template.Child()
page_welcome = Gtk.Template.Child()
page_gradience = Gtk.Template.Child()
page_configure = Gtk.Template.Child()
page_download = Gtk.Template.Child()
page_finish = Gtk.Template.Child()
img_welcome = Gtk.Template.Child()
label_skip = Gtk.Template.Child()
carousel_pages = [
"welcome",
"gradience",
"configure",
"download",
"finish"
]
images = [
"/com/github/GradienceTeam/Gradience/images/images/gradience-welcome.svg",
"/com/github/GradienceTeam/Gradience/images/images/gradience-welcome-night.svg",
]
def __init__(self, window, **kwargs) -> None:
super().__init__(**kwargs)
self.set_transient_for(window)
# common variables and references
self.window = window
# connect signals
self.connect("close-request", self.__quit)
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.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)
elif page == "download":
self.btn_back.set_visible(True)
self.btn_next.set_visible(False)
self.btn_install.set_visible(True)
elif page == "welcome":
self.btn_back.set_visible(False)
self.btn_next.set_visible(True)
else:
self.btn_back.set_visible(True)
self.btn_next.set_visible(True)
@staticmethod
def __quit(widget=False):
quit()
self.window.present()
def __install_runner(self, widget):
def set_completed(result, error=False):
self.label_skip.set_visible(False)
self.btn_close.set_sensitive(True)
self.__next_page()
self.__installing = True
self.btn_back.set_visible(False)
self.btn_next.set_visible(False)
self.btn_install.set_visible(False)
self.progressbar.set_visible(True)
self.carousel.set_allow_long_swipes(False)
self.carousel.set_allow_mouse_drag(False)
self.carousel.set_allow_scroll_wheel(False)
self.set_deletable(False)
#RunAsync(self.pulse)
#RunAsync(
# callback=set_completed,
# install_latest=True,
# first_run=True
#)
print("install")
self.btn_next.set_visible(True)
def __previous_page(self, widget=False):
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 = 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 update the progress bar every 1s.
while True:
time.sleep(.5)
self.progressbar.pulse()
def __close_window(self, widget):
self.destroy()
self.win.present()