You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
256 lines
9.6 KiB
Python
256 lines
9.6 KiB
Python
# window.py
|
|
|
|
#
|
|
# Copyright 2022 user
|
|
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
import time
|
|
import socket
|
|
from gi.repository import Gtk, Gdk, GLib, Adw
|
|
from jade_gui.classes.partition import Partition
|
|
from jade_gui.widgets.desktop import DesktopEntry
|
|
from jade_gui.widgets.disk import DiskEntry
|
|
from jade_gui.widgets.partition import PartitionEntry
|
|
from jade_gui.functions.keyboard_screen import KeyboardScreen
|
|
from jade_gui.functions.timezone_screen import TimezoneScreen
|
|
from jade_gui.functions.locale_screen import LocaleScreen
|
|
from jade_gui.functions.user_screen import UserScreen
|
|
from jade_gui.functions.desktop_screen import DesktopScreen
|
|
from jade_gui.functions.misc_screen import MiscScreen
|
|
from jade_gui.functions.partition_screen import PartitionScreen
|
|
from jade_gui.functions.summary_screen import SummaryScreen
|
|
from jade_gui.functions.install_screen import InstallScreen
|
|
from jade_gui.functions.finished_screen import FinishedScreen
|
|
from jade_gui.functions.welcome_screen import WelcomeScreen
|
|
from jade_gui.classes.jade_screen import JadeScreen
|
|
from jade_gui.locales.locales_list import locations
|
|
from jade_gui.keymaps import keymaps
|
|
from jade_gui.desktops import desktops
|
|
from jade_gui.utils import disks
|
|
from jade_gui.utils.threading import RunAsync
|
|
|
|
|
|
@Gtk.Template(resource_path="/al/getcryst/jadegui/window.ui")
|
|
class JadeGuiWindow(Gtk.ApplicationWindow):
|
|
__gtype_name__ = "JadeGuiWindow"
|
|
|
|
event_controller = Gtk.EventControllerKey.new()
|
|
carousel = Gtk.Template.Child()
|
|
|
|
# quit_button = Gtk.Template.Child()
|
|
about_button = Gtk.Template.Child()
|
|
# no_internet = Gtk.Template.Child()
|
|
|
|
next_button = Gtk.Template.Child()
|
|
back_button = Gtk.Template.Child()
|
|
revealer = Gtk.Template.Child()
|
|
|
|
def __init__(self, **kwargs):
|
|
super().__init__(**kwargs)
|
|
self.finished_screen = FinishedScreen(
|
|
window=self, set_valid=self.page_valid, **kwargs
|
|
)
|
|
self.installer_screen = InstallScreen(
|
|
window=self, set_valid=self.page_valid, **kwargs
|
|
)
|
|
self.partition_screen = PartitionScreen(
|
|
window=self, set_valid=self.page_valid, **kwargs
|
|
)
|
|
self.misc_screen = MiscScreen(window=self, set_valid=self.page_valid, **kwargs)
|
|
self.desktop_screen = DesktopScreen(
|
|
window=self, set_valid=self.page_valid, **kwargs
|
|
)
|
|
self.user_screen = UserScreen(window=self, set_valid=self.page_valid, **kwargs)
|
|
self.keyboard_screen = KeyboardScreen(
|
|
window=self, set_valid=self.page_valid, keymaps=keymaps, **kwargs
|
|
)
|
|
self.timezone_screen = TimezoneScreen(
|
|
window=self, set_valid=self.page_valid, locations=locations, **kwargs
|
|
)
|
|
self.locale_screen = LocaleScreen(
|
|
window=self, set_valid=self.page_valid, locations=locations, **kwargs
|
|
)
|
|
self.welcome_screen = WelcomeScreen(
|
|
window=self,
|
|
set_valid=self.page_valid,
|
|
next_page=self.next,
|
|
online=self.online,
|
|
**kwargs
|
|
)
|
|
|
|
self.summary_screen = SummaryScreen(
|
|
window=self, set_valid=self.page_valid, **kwargs
|
|
)
|
|
self.carousel.append(self.welcome_screen)
|
|
self.carousel.append(self.keyboard_screen)
|
|
self.carousel.append(self.timezone_screen)
|
|
self.carousel.append(self.locale_screen)
|
|
self.carousel.append(self.user_screen)
|
|
self.carousel.append(self.desktop_screen)
|
|
self.carousel.append(self.misc_screen)
|
|
self.carousel.append(self.partition_screen)
|
|
# self.carousel.append(self.manual_partition)
|
|
self.carousel.append(self.summary_screen)
|
|
self.carousel.append(self.installer_screen)
|
|
self.carousel.append(self.finished_screen)
|
|
### Widgets for first page (welcome screen)
|
|
# self.quit_button.connect("clicked", self.confirmQuit)
|
|
# self.summary_screen.connect_buttons()
|
|
self.about_button.connect("clicked", self.show_about)
|
|
self.partition_mode = "Auto"
|
|
### ---------
|
|
|
|
self.next_button.connect("clicked", self.next)
|
|
self.back_button.connect("clicked", self.back)
|
|
|
|
### Test desktops
|
|
firstdesktop = DesktopEntry(
|
|
window=self, desktop=desktops[0], button_group=None, **kwargs
|
|
) # Manually specifying onyx since the other entries need a button group to attach to
|
|
self.desktop_screen.list_desktops.append(firstdesktop)
|
|
self.desktop_screen.chosen_desktop = (
|
|
self.desktop_screen.list_desktops.get_row_at_index(0).get_title()
|
|
)
|
|
self.desktop_screen.list_desktops.select_row(firstdesktop)
|
|
for desktop in desktops:
|
|
if desktop != desktops[0]:
|
|
self.desktop_screen.list_desktops.append(
|
|
DesktopEntry(
|
|
window=self,
|
|
desktop=desktop,
|
|
button_group=firstdesktop.select_button,
|
|
**kwargs
|
|
)
|
|
)
|
|
### ---------
|
|
|
|
### Test partitions
|
|
self.available_disks = disks.get_disks()
|
|
firstdisk = DiskEntry(
|
|
window=self,
|
|
disk=self.available_disks[0],
|
|
disk_size=disks.get_disk_size(self.available_disks[0]),
|
|
disk_type=disks.get_disk_type(self.available_disks[0]),
|
|
# disk_model=disks.get_disk_model(available_disks[0]),
|
|
button_group=None,
|
|
valid=self.page_valid,
|
|
**kwargs
|
|
)
|
|
self.partition_screen.disk_list.append(firstdisk)
|
|
for disk in self.available_disks:
|
|
if disk != self.available_disks[0]:
|
|
self.partition_screen.disk_list.append(
|
|
DiskEntry(
|
|
window=self,
|
|
disk=disk,
|
|
disk_size=disks.get_disk_size(disk),
|
|
disk_type=disks.get_disk_type(disk),
|
|
# disk_model=disks.get_disk_model(disk),
|
|
button_group=firstdisk.select_button,
|
|
valid=self.page_valid,
|
|
**kwargs
|
|
)
|
|
)
|
|
|
|
self.available_partitions = disks.get_partitions()
|
|
for partition in self.available_partitions:
|
|
self.partition_screen.partition_list.append(
|
|
PartitionEntry(
|
|
window=self,
|
|
partition=Partition(
|
|
partition=partition,
|
|
mountpoint="",
|
|
filesystem="",
|
|
size=disks.get_disk_size(partition),
|
|
),
|
|
**kwargs
|
|
)
|
|
)
|
|
### ---------
|
|
RunAsync(self.welcome_screen.check_internet)
|
|
|
|
def online(self):
|
|
if self.timezone_screen.guessed_timezone is None:
|
|
self.timezone_screen.ip_request_timezone()
|
|
|
|
def _get_current_page(self, offset=0) -> JadeScreen:
|
|
current_index = self.carousel.get_position()
|
|
return self.carousel.get_nth_page(current_index + offset)
|
|
|
|
def on_page_change(self, page: JadeScreen):
|
|
self.next_button.set_sensitive(page.is_valid())
|
|
|
|
disable_next = page not in [self.welcome_screen, self.finished_screen]
|
|
disable_back = page not in [
|
|
self.welcome_screen,
|
|
self.installer_screen,
|
|
self.finished_screen,
|
|
]
|
|
|
|
if disable_back == disable_next:
|
|
self.revealer.set_reveal_child(disable_next)
|
|
self.next_button.set_visible(True)
|
|
self.back_button.set_visible(True)
|
|
else:
|
|
self.next_button.set_visible(disable_next)
|
|
self.back_button.set_visible(disable_back)
|
|
|
|
page.on_show()
|
|
|
|
def next(self, *_):
|
|
previous_page = self._get_current_page()
|
|
page = self._get_current_page(1)
|
|
self.carousel.scroll_to(page, True)
|
|
|
|
previous_page.on_complete()
|
|
self.on_page_change(page)
|
|
|
|
def back(self, *_):
|
|
page = self._get_current_page(-1)
|
|
self.carousel.scroll_to(page, True)
|
|
|
|
self.on_page_change(page)
|
|
|
|
def page_valid(self, valid: bool):
|
|
self.next_button.set_sensitive(valid)
|
|
|
|
def show_page(self, _, page, *__):
|
|
self.carousel.scroll_to(page, True)
|
|
|
|
def confirm_quit(self, *_):
|
|
def handle_response(_widget, response_id):
|
|
if response_id == Gtk.ResponseType.YES:
|
|
_widget.destroy()
|
|
self.destroy()
|
|
elif response_id == Gtk.ResponseType.NO:
|
|
_widget.destroy()
|
|
|
|
dialog = Gtk.MessageDialog(
|
|
transient_for=self,
|
|
modal=True,
|
|
parent=self,
|
|
text="Do you want to try\nCrystal without installing?",
|
|
buttons=Gtk.ButtonsType.YES_NO,
|
|
)
|
|
dialog.connect("response", handle_response)
|
|
dialog.present()
|
|
|
|
def show_about(self, *_):
|
|
builder = Gtk.Builder.new_from_resource("/al/getcryst/jadegui/about.ui")
|
|
about_window = builder.get_object("aboutWindow")
|
|
about_window.set_transient_for(self)
|
|
about_window.present()
|