9db6c513c9
- Add install_station package with __init__.py and core modules - Include boot_manager.py for boot loader configuration (BootManager class with singleton pattern) - Add common.py with password strength validation utilities and ZFS dataset definitions - Add custom.py with Partitions class for disk partitioning management (1010 lines) - Establish foundation for GTK+ based GhostBSD installer application Modules added: - boot_manager: UEFI/BIOS boot manager selection with rEFInd and FreeBSD options - common: Password validation functions and deprecated decorator utility - custom: Comprehensive partition management with GTK+ interface
143 lines
4.8 KiB
Python
143 lines
4.8 KiB
Python
from gi.repository import Gtk, Gdk
|
|
import os
|
|
from install_station.system_calls import (
|
|
language_dictionary,
|
|
localize_system
|
|
)
|
|
from install_station.data import InstallationData, tmp, logo
|
|
import gettext
|
|
|
|
gettext.bindtextdomain('install-station', '/usr/local/share/locale')
|
|
gettext.textdomain('install-station')
|
|
_ = gettext.gettext
|
|
|
|
# Ensure temp directory exists
|
|
if not os.path.exists(tmp):
|
|
os.makedirs(tmp)
|
|
|
|
lang_dictionary = language_dictionary()
|
|
# Text to be replace be multiple language file.
|
|
welltext = _("Select the language you want to use with GhostBSD.")
|
|
|
|
cssProvider = Gtk.CssProvider()
|
|
cssProvider.load_from_path('/usr/local/lib/install-station/ghostbsd-style.css')
|
|
screen = Gdk.Screen.get_default()
|
|
styleContext = Gtk.StyleContext()
|
|
styleContext.add_provider_for_screen(
|
|
screen,
|
|
cssProvider,
|
|
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
|
|
)
|
|
|
|
|
|
class Language:
|
|
_instance = None
|
|
|
|
def __new__(cls):
|
|
"""Implement singleton pattern."""
|
|
if cls._instance is None:
|
|
cls._instance = super(Language, cls).__new__(cls)
|
|
cls._instance._initialized = False
|
|
return cls._instance
|
|
|
|
def __init__(self):
|
|
"""Initialize only once."""
|
|
if not self._initialized:
|
|
self._language = None
|
|
self._vbox1 = None
|
|
self._initialize_ui()
|
|
self._initialized = True
|
|
|
|
# On selection it overwrite the default language file.
|
|
def _language_selection(self, tree_selection):
|
|
model, treeiter = tree_selection.get_selected()
|
|
if treeiter is not None:
|
|
value = model[treeiter][0]
|
|
self._language = lang_dictionary[value]
|
|
InstallationData.language = value
|
|
InstallationData.language_code = lang_dictionary[value]
|
|
return
|
|
|
|
def _setup_language_columns(self, treeView):
|
|
cell = Gtk.CellRendererText()
|
|
column = Gtk.TreeViewColumn(None, cell, text=0)
|
|
column_header = Gtk.Label(label=_('Language'))
|
|
column_header.set_use_markup(True)
|
|
column_header.show()
|
|
column.set_widget(column_header)
|
|
column.set_sort_column_id(0)
|
|
treeView.append_column(column)
|
|
return
|
|
|
|
# Initial definition.
|
|
def _initialize_ui(self):
|
|
# Add a Default vertical box
|
|
self._vbox1 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0)
|
|
self._vbox1.show()
|
|
# Add a second vertical box
|
|
grid = Gtk.Grid()
|
|
title = Gtk.Label(label=_('Welcome To GhostBSD!'), name="Header")
|
|
title.set_property("height-request", 50)
|
|
self._vbox1.pack_start(title, False, False, 0)
|
|
self._vbox1.pack_start(grid, True, True, 0)
|
|
grid.set_row_spacing(10)
|
|
grid.set_column_spacing(3)
|
|
grid.set_column_homogeneous(True)
|
|
grid.set_row_homogeneous(True)
|
|
grid.set_margin_left(10)
|
|
grid.set_margin_right(10)
|
|
grid.set_margin_top(10)
|
|
grid.set_margin_bottom(10)
|
|
# Adding a Scrolling Window
|
|
sw = Gtk.ScrolledWindow()
|
|
sw.set_shadow_type(Gtk.ShadowType.ETCHED_IN)
|
|
sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
|
|
# Adding a treestore and store language in it.
|
|
store = Gtk.TreeStore(str)
|
|
for line in lang_dictionary:
|
|
store.append(None, [line])
|
|
treeview = Gtk.TreeView()
|
|
treeview.set_model(store)
|
|
treeview.set_rules_hint(True)
|
|
self._setup_language_columns(treeview)
|
|
tree_selection = treeview.get_selection()
|
|
tree_selection.set_mode(Gtk.SelectionMode.SINGLE)
|
|
tree_selection.connect("changed", self._language_selection)
|
|
sw.add(treeview)
|
|
sw.show()
|
|
grid.attach(sw, 1, 2, 1, 9)
|
|
# add text in a label.
|
|
vbox2 = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=0)
|
|
vbox2.set_border_width(10)
|
|
vbox2.show()
|
|
wellcome_text = Gtk.Label(label=welltext)
|
|
wellcome_text.set_use_markup(True)
|
|
table = Gtk.Table()
|
|
table.attach(wellcome_text, 0, 1, 3, 4)
|
|
vbox2.pack_start(table, False, False, 5)
|
|
image = Gtk.Image()
|
|
image.set_from_file(logo)
|
|
image.show()
|
|
# grid.attach(self.wellcome, 1, 1, 3, 1)
|
|
vbox2.pack_start(image, True, True, 5)
|
|
grid.attach(vbox2, 2, 2, 2, 9)
|
|
grid.show()
|
|
|
|
@classmethod
|
|
def get_model(cls):
|
|
return cls()._vbox1
|
|
|
|
@classmethod
|
|
def get_language(cls):
|
|
"""Get the selected language."""
|
|
return InstallationData.language_code or cls()._language
|
|
|
|
def save_selection(self):
|
|
# Language is now saved in InstallationData automatically
|
|
pass
|
|
|
|
@classmethod
|
|
def save_language(cls):
|
|
language_code = InstallationData.language_code or cls()._language
|
|
if language_code:
|
|
localize_system(language_code) |