def load_disks(self): """ Load the disks within a thread """ # Scan parts dm = self.info.owner.get_disk_manager() perms = self.info.owner.get_perms_manager() perms.up_permissions() self.prober = DriveProber(dm) self.info.prober = self.prober self.prober.probe() perms.down_permissions() # Currently the only GTK call here Gdk.threads_enter() self.info.owner.set_can_previous(True) can_continue = True if len(self.prober.drives) == 0: # No drives self.stack.set_visible_child_name("whoops") can_continue = False elif self.prober.is_broken_windows_uefi(): self.stack.set_visible_child_name("broken-windows") self.can_continue = False else: # Let them choose self.stack.set_visible_child_name("chooser") self.can_continue = True self.spinner.stop() Gdk.threads_leave() if can_continue: GLib.idle_add(self.update_disks)
class InstallerDiskLocationPage(BasePage): """ Disk location selection. """ had_init = False spinner = None stack = None whoops = None chooser = None prober = None can_continue = False def __init__(self): BasePage.__init__(self) self.stack = Gtk.Stack() self.pack_start(self.stack, True, True, 0) self.spinner = LoadingPage() self.whoops = WhoopsPage() self.stack.add_named(self.whoops, "whoops") broken = BrokenWindowsPage(self) self.stack.add_named(broken, "broken-windows") self.stack.add_named(self.spinner, "loading") self.chooser = ChooserPage() self.stack.add_named(self.chooser, "chooser") self.stack.set_visible_child_name("loading") def get_title(self): return "Where should we install?" def get_sidebar_title(self): return "Disks" def get_name(self): return "disk-location" def get_icon_name(self, plasma=False): if plasma: return "drive-harddisk" return "disk-utility" def load_disks(self): """ Load the disks within a thread """ # Scan parts dm = self.info.owner.get_disk_manager() perms = self.info.owner.get_perms_manager() perms.up_permissions() self.prober = DriveProber(dm) self.info.prober = self.prober self.prober.probe() perms.down_permissions() # Currently the only GTK call here Gdk.threads_enter() self.info.owner.set_can_previous(True) can_continue = True if len(self.prober.drives) == 0: # No drives self.stack.set_visible_child_name("whoops") can_continue = False elif self.prober.is_broken_windows_uefi(): self.stack.set_visible_child_name("broken-windows") self.can_continue = False else: # Let them choose self.stack.set_visible_child_name("chooser") self.can_continue = True self.spinner.stop() Gdk.threads_leave() if can_continue: GLib.idle_add(self.update_disks) def update_disks(self): """ Thread load finished, update UI from discovered info """ self.chooser.set_drives(self.info, self.prober) self.info.windows_present = False for drive in self.prober.drives: for os in drive.operating_systems: os_ = drive.operating_systems[os] if os_.otype == "windows": self.info.windows_present = True break # Allow forward navigation now self.info.owner.set_can_next(self.can_continue) return False def init_view(self): """ Prepare for viewing... """ if self.had_init and not self.info.invalidated: return self.info.invalidated = False self.can_continue = False self.had_init = True self.stack.set_visible_child_name("loading") self.spinner.start() self.spinner.show_all() GLib.idle_add(self.prepare_view) def prepare_view(self): """ Do the real job after GTK has done things.. """ self.info.owner.set_can_previous(False) self.queue_draw() t = threading.Thread(target=self.load_disks) t.daemon = True t.start() return False def prepare(self, info): self.info = info self.init_view() self.info.owner.set_can_next(self.can_continue)
class InstallerDiskLocationPage(BasePage): """ Disk location selection. """ had_init = False spinner = None stack = None whoops = None chooser = None prober = None can_continue = False def __init__(self): BasePage.__init__(self) self.stack = Gtk.Stack() self.pack_start(self.stack, True, True, 0) self.spinner = LoadingPage() self.whoops = WhoopsPage() self.stack.add_named(self.whoops, "whoops") broken = BrokenWindowsPage(self) self.stack.add_named(broken, "broken-windows") self.stack.add_named(self.spinner, "loading") self.chooser = ChooserPage() self.stack.add_named(self.chooser, "chooser") self.stack.set_visible_child_name("loading") def get_title(self): return "Where should we install?" def get_name(self): return "disk-location" def get_icon_name(self): return "drive-harddisk-system-symbolic" def load_disks(self): """ Load the disks within a thread """ # Scan parts dm = self.info.owner.get_disk_manager() perms = self.info.owner.get_perms_manager() perms.up_permissions() self.prober = DriveProber(dm) self.info.prober = self.prober self.prober.probe() perms.down_permissions() # Currently the only GTK call here Gdk.threads_enter() self.info.owner.set_can_previous(True) can_continue = True if len(self.prober.drives) == 0: # No drives self.stack.set_visible_child_name("whoops") can_continue = False elif self.prober.is_broken_windows_uefi(): self.stack.set_visible_child_name("broken-windows") self.can_continue = False else: # Let them choose self.stack.set_visible_child_name("chooser") self.can_continue = True self.spinner.stop() Gdk.threads_leave() if can_continue: GLib.idle_add(self.update_disks) def update_disks(self): """ Thread load finished, update UI from discovered info """ self.chooser.set_drives(self.info, self.prober) self.info.windows_present = False for drive in self.prober.drives: for os in drive.operating_systems: os_ = drive.operating_systems[os] if os_.otype == "windows": self.info.windows_present = True break # Allow forward navigation now self.info.owner.set_can_next(self.can_continue) return False def init_view(self): """ Prepare for viewing... """ if self.had_init and not self.info.invalidated: return self.info.invalidated = False self.can_continue = False self.had_init = True self.stack.set_visible_child_name("loading") self.spinner.start() self.spinner.show_all() GLib.idle_add(self.prepare_view) def prepare_view(self): """ Do the real job after GTK has done things.. """ self.info.owner.set_can_previous(False) self.queue_draw() t = threading.Thread(target=self.load_disks) t.daemon = True t.start() return False def prepare(self, info): self.info = info self.init_view() self.info.owner.set_can_next(self.can_continue)