def __init__(self, parent): fsui.Group.__init__(self, parent) self.layout = fsui.HorizontalLayout() # self.layout.padding_left = 10 # self.layout.padding_right = 10 # image = fsui.Image("launcher:res/joystick.png") # self.image_view = fsui.ImageView(self, image) # self.layout.add(self.image_view, valign=0.0) # self.layout.add_spacer(20) self.layout2 = fsui.VerticalLayout() self.layout.add(self.layout2, fill=True, expand=True) heading = gettext("Preferred Controllers") label = fsui.HeadingLabel(self, heading) self.layout2.add(label) self.layout2.add_spacer(20) label = fsui.Label(self, gettext("Preferred controller (if present):")) self.layout2.add(label) self.layout2.add_spacer(6) selector = PreferredJoystickSelector(self, 0) self.layout2.add(selector, fill=True) self.layout2.add_spacer(20) label = fsui.Label( self, gettext("Preferred device for secondary controller:")) self.layout2.add(label) self.layout2.add_spacer(6) selector = PreferredJoystickSelector(self, 1) self.layout2.add(selector, fill=True)
def __init__(self, parent): super().__init__(parent) icon = fsui.Icon("settings", "pkg:workspace") # gettext("WHDLoad Settings") title = gettext("WHDLoad") subtitle = gettext("Options for WHDLoad support in FS-UAE Launcher") self.add_header(icon, title, subtitle) label = fsui.MultiLineLabel(self, gettext( "The following options only apply when you use the automatic " "WHDLoad support in FS-UAE Launcher, for example in relation with " "the online game database."), 640) self.layout.add(label, fill=True, margin_top=0) self.add_option("whdload_splash_delay") label = fsui.Label( self, gettext("Directory for WHDLoad.key file (if you have it):")) self.layout.add(label, margin_top=10) hor_layout = fsui.HorizontalLayout() self.layout.add(hor_layout, margin_top=4, fill=True) label = fsui.Label( self, FSGSDirectories.get_base_dir()) hor_layout.add_spacer(0, expand=True) hor_layout.add(label)
def __init__(self, parent=None): title = gettext("Log Out from Your OAGD.net Account") super().__init__(parent, title, minimizable=False, maximizable=False) self.set_icon(fsui.Icon("password", "pkg:workspace")) self.layout = fsui.VerticalLayout() self.layout.set_padding(20, 20, 20, 20) heading_layout = fsui.HorizontalLayout() self.layout.add(heading_layout) heading_layout.add(fsui.ImageView( self, fsui.Image("workspace:res/48/password.png"))) heading_layout.add_spacer(20) heading_layout_2 = fsui.VerticalLayout() heading_layout.add( heading_layout_2, expand=True, fill=False, valign=0.5) heading_layout_2.add(fsui.HeadingLabel( self, gettext("Log Out from Your OAGD.net Account"))) heading_layout_2.add_spacer(2) heading_layout_2.add(fsui.Label( self, gettext("While logged out you will not get " "database updates"))) self.layout.add_spacer(20) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True) self.created_label = fsui.Label(self, "") hori_layout.add(self.created_label, expand=True) hori_layout.add_spacer(20) self.logout_button = fsui.Button(self, gettext("Log Out")) # self.logout_button.disable() self.logout_button.activated.connect(self.on_logout_activated) hori_layout.add(self.logout_button)
def __init__(self, parent): fsui.Group.__init__(self, parent) self.layout = fsui.VerticalLayout() heading_label = fsui.HeadingLabel(self, gettext("ROM & RAM")) self.layout.add(heading_label, margin=10) self.layout.add_spacer(0) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True) label = fsui.Label(self, gettext("Kickstart ROM") + ":") hori_layout.add(label, margin_left=10, margin_right=10) kickstart_types = [ gettext("Default"), gettext("Custom"), gettext("Internal") ] self.kickstart_type_choice = fsui.Choice(self, kickstart_types) hori_layout.add(self.kickstart_type_choice, margin=10) self.text_field = fsui.TextField(self, "", read_only=True) hori_layout.add(self.text_field, expand=True, margin=10) self.browse_button = IconButton(self, "browse_file_16.png") self.browse_button.set_tooltip(gettext("Browse for File")) self.browse_button.activated.connect(self.on_browse_button) hori_layout.add(self.browse_button, margin=10) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True) label = fsui.Label(self, gettext("Extended ROM") + ":") hori_layout.add(label, margin_left=10, margin_right=10) # self.layout.add_spacer(0) kickstart_types = [gettext("Default"), gettext("Custom")] self.ext_rom_type_choice = fsui.Choice(self, kickstart_types) hori_layout.add(self.ext_rom_type_choice, margin_right=10) self.ext_text_field = fsui.TextField(self, "", read_only=True) hori_layout.add(self.ext_text_field, expand=True, margin_right=10) self.ext_browse_button = IconButton(self, "browse_file_16.png") self.ext_browse_button.set_tooltip(gettext("Browse for File")) self.ext_browse_button.activated.connect(self.on_ext_browse_button) hori_layout.add(self.ext_browse_button, margin_right=10) self.initialize_from_config() self.set_config_handlers()
def __init__(self, parent, gsc): super().__init__(parent) self.layout = fsui.VerticalLayout() self.hori_layout = fsui.HorizontalLayout() self.layout.add(self.hori_layout, fill=True, expand=True) self.progress_label = fsui.Label(self, "") self.progress_label.set_visible(False) self.hori_layout.add(self.progress_label, fill=True, expand=True) # self.progress_2_label = fsui.Label(self, "") # self.progress_2_label.set_visible(False) # self.hori_layout.add(self.progress_2_label, fill=True, expand=True) self.fullscreen_mode_button = FullscreenModeButton(self) self.hori_layout.add( self.fullscreen_mode_button, fill=True, margin_right=10) self.monitor_button = MonitorButton(self) self.hori_layout.add( self.monitor_button, fill=True, margin_right=10) self.screen_info_label = ScreenInfoLabel(self) self.hori_layout.add(self.screen_info_label, fill=True, expand=True, margin_right=10) self.video_sync_checkbox = VideoSyncCheckBox(self) self.hori_layout.add(self.video_sync_checkbox, margin_right=10) self.override_warning = OverrideWarning(self, Option.FULLSCREEN) self.hori_layout.add(self.override_warning, margin_right=10) self.fullscreen_button = FullscreenToggleButton(self) self.hori_layout.add(self.fullscreen_button, fill=True) start_button = StartButton(self, gsc) self.hori_layout.add(start_button, fill=True, margin_left=10) # ConfigBehavior(self, [Option.FULLSCREEN]) gsc.config.add_behavior( self, [Option.FULLSCREEN, "__running", "__progress"])
def __init__(self, parent): super().__init__(parent) icon = fsui.Icon("joystick-settings", "pkg:workspace") # gettext("Joystick Settings") title = gettext("Controllers") subtitle = gettext( "Configure joysticks and set preferred joystick " "devices" ) self.add_header(icon, title, subtitle) label = fsui.Label( self, gettext("Double-click a controller to configure it:") ) self.layout.add(label, margin_bottom=10) self.list_view = fsui.ListView(self) self.list_view.set_min_height(140) self.list_view.item_activated.connect(self.on_joystick_activated) image = fsui.Image("workspace:res/16x16/gamepad.png") for device_name in DeviceManager.get_joystick_names(): if DeviceManager.is_joystick(device_name): self.list_view.add_item(device_name, icon=image) self.layout.add(self.list_view, fill=True, expand=True) self.layout.add_spacer(20) self.pref_group = PreferredJoysticksGroup(self) self.layout.add(self.pref_group, fill=True) # For reset to defaults function self.options_on_page.add(Option.PRIMARY_JOYSTICK) self.options_on_page.add(Option.SECONDARY_JOYSTICK)
def __init__(self, parent, task): fsui.Window.__init__( self, parent, task.get_task_name()) self.set_icon(fsui.Icon("tools", "pkg:workspace")) self.layout = fsui.VerticalLayout() self.layout.min_width = 500 self.layout.set_padding(20, 20, 20, 20) self.icon_header = IconHeader( self, fsui.Icon("tools", "pkg:workspace"), task.get_task_name(), "") self.layout.add(self.icon_header, fill=True, margin_bottom=20) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True) self.created_label = fsui.Label(self, "") hori_layout.add(self.created_label, expand=True) hori_layout.add_spacer(20) self.abort_button = fsui.Button(self, gettext("Stop")) self.abort_button.activated.connect(self.on_abort_activated) hori_layout.add(self.abort_button) self.set_size(self.layout.get_min_size()) self.center_on_parent() self.task = task self.task.progressed.connect(self.on_progress) self.task.failed.connect(self.on_failure) self.task.succeeded.connect(self.close) self.task.stopped.connect(self.close) self.task.start()
def __init__(self, parent=None): print("RefreshWindow parent =", parent) title = gettext("Updating Database") super().__init__(parent, title, maximizable=False) self.set_icon(fsui.Icon("refresh", "pkg:workspace")) self.layout = fsui.VerticalLayout() self.layout.min_width = 500 self.layout.set_padding(20, 20, 20, 20) self.icon_header = IconHeader(self, fsui.Icon("refresh", "pkg:workspace"), gettext("Updating Database"), "") self.layout.add(self.icon_header, fill=True, margin_bottom=20) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True) self.created_label = fsui.Label(self, "") hori_layout.add(self.created_label, expand=True) hori_layout.add_spacer(20) self.stop_button = fsui.Button(self, gettext("Stop")) self.stop_button.activated.connect(self.on_abort_activated) hori_layout.add(self.stop_button) self.set_size(self.layout.get_min_size()) self.center_on_parent() self.task = DatabaseRefreshTask() self.task.progressed.connect(self.on_progress) self.task.failed.connect(self.on_failure) self.task.succeeded.connect(self.close) self.task.stopped.connect(self.close) self.task.start()
def __init__( self, parent, icon: fsui.Icon, title, subtitle="", icon_position=ICON_LEFT, ): Group.__init__(self, parent) self.layout = fsui.HorizontalLayout() image = icon.image(48) self.image_view = fsui.ImageView(self, image) if icon_position == self.ICON_LEFT: self.layout.add(self.image_view) self.layout.add_spacer(20) vert_layout = fsui.VerticalLayout() self.layout.add(vert_layout, expand=True, fill=False, valign=0.5) self.title_label = fsui.HeadingLabel(self, title) vert_layout.add(self.title_label) vert_layout.add_spacer(2) self.subtitle_label = fsui.Label(self, subtitle) vert_layout.add(self.subtitle_label, fill=True) if icon_position == self.ICON_RIGHT: self.layout.add_spacer(20) self.layout.add(self.image_view)
def __init__(self, parent): super().__init__(parent) icon = fsui.Icon("language-settings", "pkg:workspace") # gettext("Appearance") title = gettext("Language") # gettext("Set language and look for FS-UAE applications") subtitle = gettext("Set language for FS-UAE applications") self.add_header(icon, title, subtitle) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True) # hori_layout.add(fsui.Label(self, gettext("Language:"))) hori_layout.add(fsui.Label(self, gettext("Language:"))) hori_layout.add_spacer(0, expand=True) self.language_choice = LanguageSettingChoice(self) hori_layout.add(self.language_choice) self.layout.add_spacer(20) information = "" # information = gettext( # "A change of language will only affect applications " # "which are restarted after the change.") # information += "\n\n" information += gettext( "When Automatic is specified, your preferred language is set " "based on information from the operating system (or English, " "if a supported language is not detected).") self.layout.add(fsui.MultiLineLabel(self, information, 640))
def __init__(self, parent): super().__init__(parent) icon = fsui.Icon("joystick-settings", "pkg:workspace") # gettext("Joystick Settings") title = gettext("Joysticks & Gamepads") subtitle = gettext("Configure joysticks and set preferred joystick " "devices") self.add_header(icon, title, subtitle) self.list_view = fsui.ListView(self) self.list_view.set_min_height(140) self.list_view.item_activated.connect(self.on_joystick_activated) image = fsui.Image("workspace:res/16/gamepad.png") for device_name in DeviceManager.get_joystick_names(): if DeviceManager.is_joystick(device_name): self.list_view.add_item(device_name, icon=image) self.layout.add(self.list_view, fill=True, expand=True) label = fsui.Label( self, gettext("Double-click a device entry to configure it (map " "joystick buttons).")) self.layout.add(label, margin_top=10) self.layout.add_spacer(20) self.pref_group = PreferredJoysticksGroup(self) self.layout.add(self.pref_group, fill=True)
def __init__(self, parent): fsui.Group.__init__(self, parent) self.layout = fsui.VerticalLayout() label = fsui.HeadingLabel(self, gettext("Available Kickstart Versions")) self.layout.add(label, margin_bottom=10) icon_layout = fsui.HorizontalLayout() self.layout.add(icon_layout, fill=True) icon_layout.add_spacer(20) image = fsui.Image("launcher:/data/kickstart.png") self.image_view = fsui.ImageView(self, image) icon_layout.add(self.image_view, valign=0.0, margin_right=10) vert_layout = fsui.VerticalLayout() icon_layout.add(vert_layout, fill=True, expand=True) vert_layout.add_spacer(0) label = fsui.Label( self, gettext("You should have kickstart files for " "each Amiga model you want to use:"), ) vert_layout.add(label, margin_bottom=0) hori_layout = fsui.HorizontalLayout() vert_layout.add(hori_layout, fill=True) self.kickstart_groups = [] column_layout = fsui.VerticalLayout() hori_layout.add(column_layout, expand=True, fill=True, margin=10) self.add_kickstart_group(column_layout, "Amiga 1000", "A1000") column_layout.add_spacer(10) self.add_kickstart_group(column_layout, "Amiga 500", "A500") column_layout.add_spacer(10) self.add_kickstart_group(column_layout, "Amiga 500+", "A500+") column_layout = fsui.VerticalLayout() hori_layout.add(column_layout, expand=True, fill=True, margin=10) self.add_kickstart_group(column_layout, "Amiga 600", "A600") column_layout.add_spacer(10) self.add_kickstart_group(column_layout, "Amiga 1200", "A1200") column_layout.add_spacer(10) self.add_kickstart_group(column_layout, "Amiga 3000", "A3000") column_layout = fsui.VerticalLayout() hori_layout.add(column_layout, expand=True, fill=True, margin=10) self.add_kickstart_group(column_layout, "Amiga 4000", "A4000/040") column_layout.add_spacer(10) self.add_kickstart_group(column_layout, "Amiga CD32", "CD32") column_layout.add_spacer(10) self.add_kickstart_group(column_layout, "Commodore CDTV", "CDTV")
def __init__(self, parent=None): title = gettext("Log Out from Your OpenRetro Account") super().__init__(parent, title, minimizable=False, maximizable=False) self.theme = WorkspaceTheme.instance() self.layout = fsui.VerticalLayout() self.set_icon(fsui.Icon("password", "pkg:workspace")) self.layout.set_padding(20, 20, 20, 20) heading_layout = fsui.HorizontalLayout() self.layout.add(heading_layout) heading_layout.add( fsui.ImageView(self, fsui.Image("workspace:/data/48/password.png"))) heading_layout.add_spacer(20) heading_layout_2 = fsui.VerticalLayout() heading_layout.add(heading_layout_2, expand=True, fill=False, valign=0.5) heading_layout_2.add( fsui.HeadingLabel(self, gettext("Log Out from Your OpenRetro Account"))) heading_layout_2.add_spacer(2) heading_layout_2.add( fsui.Label( self, gettext("While logged out you will not get " "database updates"), )) self.layout.add_spacer(20) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True) self.created_label = fsui.Label(self, "") hori_layout.add(self.created_label, expand=True) hori_layout.add_spacer(20) self.logout_button = fsui.Button(self, gettext("Log Out")) # self.logout_button.set_enabled(False) self.logout_button.activated.connect(self.__logout_activated) hori_layout.add(self.logout_button) if self.window().theme.has_close_buttons: self.close_button = CloseButton(self) hori_layout.add(self.close_button, fill=True, margin_left=10)
def __init__(self, parent): super().__init__(parent) # icon = fsui.Icon("language-settings", "pkg:workspace") # title = gettext("Language") # subtitle = gettext("Set language for FS-UAE applications") # self.add_header(icon, title, subtitle) PrefsNotWorkingWarningPanel(parent=self) self.layout.add_spacer(20) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True) # hori_layout.add(fsui.Label(self, gettext("Language:"))) hori_layout.add(fsui.Label(self, gettext("Language:"))) hori_layout.add_spacer(0, expand=True) self.language_choice = LanguageSettingChoice(self) hori_layout.add(self.language_choice) self.layout.add_spacer(20) information = "" # information = gettext( # "A change of language will only affect applications " # "which are restarted after the change.") # information += "\n\n" information += gettext( "When Automatic is specified, your preferred language is set " "based on information from the operating system (or English, " "if a supported language is not detected)." ) self.layout.add(fsui.MultiLineLabel(self, information, 500)) label = fsui.Label( self, "You can help translate FS-UAE on crowdin.net:" ) self.layout.add(label, margin_top=20) label = fsui.URLLabel( self, "https://crowdin.com/project/fs-uae", "https://crowdin.com/project/fs-uae", ) self.layout.add(label, margin_top=5)
def __init__(self, parent, server): fsui.Window.__init__(self, parent, "FS-UAE Net Play Server") self.layout = fsui.VerticalLayout() self.layout.padding_top = 50 self.layout.padding_bottom = 50 self.layout.padding_left = 50 self.layout.padding_right = 50 self.label = fsui.Label(self, "Close window to stop server") self.layout.add(self.label) self.server = server self.set_size(self.layout.get_min_size())
def __init__(self, parent, with_more_button=True): unused(with_more_button) fsui.Group.__init__(self, parent) self.layout = fsui.VerticalLayout() self.model_ids = [ x["id"] for x in Amiga.models if "/" not in x["id"]] self.model_titles = [ x["title"] for x in Amiga.models if "/" not in x["id"]] self.sub_model_ids = [] self.sub_model_titles = [] self.sub_model_updating = False self.model_choice = fsui.Choice(self, self.model_titles) AmigaEnableBehavior(self.model_choice) self.sub_model_choice = fsui.Choice(self, self.sub_model_titles) AmigaEnableBehavior(self.sub_model_choice) self.accuracy_label = fsui.Label(self, gettext("Accuracy:")) self.accuracy_choice = fsui.Choice(self, [ gettext("High"), gettext("Medium"), gettext("Low")]) AmigaEnableBehavior(self.accuracy_choice) self.ntsc_checkbox = ConfigCheckBox(self, "NTSC", "ntsc_mode") AmigaEnableBehavior(self.ntsc_checkbox) # if fs_uae_launcher.ui.get_screen_size()[1] > 768: # self.layout.add(heading_label, margin=10) # self.layout.add_spacer(0) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True) heading_label = fsui.HeadingLabel(self, gettext("Amiga Model")) hori_layout.add(heading_label, margin=10) hori_layout.add_spacer(10) hori_layout.add(self.ntsc_checkbox, expand=False, margin_left=10, margin_right=10) hori_layout.add_spacer(0, expand=True) hori_layout.add(self.accuracy_label, margin_right=10) hori_layout.add(self.accuracy_choice, margin_right=10) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True) hori_layout.add(self.model_choice, expand=False, margin=10) hori_layout.add(self.sub_model_choice, expand=True, margin=10) ConfigBehavior(self, ["accuracy", "amiga_model"]) self.model_choice.on_changed = self.on_model_changed self.sub_model_choice.on_changed = self.on_sub_model_changed self.accuracy_choice.on_changed = self.on_accuracy_changed
def __init__(self, parent): fsui.Group.__init__(self, parent) self.layout = fsui.HorizontalLayout() # self.layout.padding_left = 10 # self.layout.padding_top = 10 # self.layout.padding_right = 10 # self.layout.padding_bottom = 10 # #image = fsui.Image("launcher:res/search_group.png") # #self.image_view = fsui.ImageView(self, image) # self.layout.add_spacer(20) # #self.layout.add(self.image_view, valign=0.0) # self.layout.add_spacer(48) # self.layout.add_spacer(20) self.layout2 = fsui.VerticalLayout() self.layout.add(self.layout2, fill=True, expand=True) self.title_label = fsui.HeadingLabel(self, "") self.layout2.add(self.title_label, fill=True) # self.layout2.add_spacer(10) # hor_layout = fsui.HorizontalLayout() # self.layout2.add(hor_layout) # self.scan_label = fsui.Label(self, _("Scan for:")) # hor_layout.add(self.scan_label) # hor_layout.add_spacer(10) # self.scan_roms = fsui.CheckBox(self, _("ROMs")) # if Settings.get("scan_roms") == "1": # self.scan_roms.check() # self.scan_roms.on_changed = self.on_change # hor_layout.add(self.scan_roms) # hor_layout.add_spacer(10) # self.scan_files = fsui.CheckBox(self, _("Game Files")) # if Settings.get("scan_files") == "1": # self.scan_files.check() # self.scan_files.on_changed = self.on_change # hor_layout.add(self.scan_files) # hor_layout.add_spacer(10) # self.scan_configs = fsui.CheckBox(self, _("Configurations")) # if Settings.get("scan_configs") == "1": # self.scan_configs.check() # self.scan_configs.on_changed = self.on_change # hor_layout.add(self.scan_configs) # hor_layout.add_spacer(10) self.layout2.add_spacer(10) self.status_label = fsui.Label(self, "") self.layout2.add(self.status_label, fill=True)
def __init__(self, parent, title, task, *, gscontext): print("LaunchDialog parent =", parent) self.gscontext = gscontext self.has_parent = parent is not None self.no_gui = "--no-gui" in sys.argv super().__init__(parent, title, maximizable=False) self.layout = fsui.VerticalLayout() self.layout.add_spacer(400, 20) hor_layout = fsui.HorizontalLayout() self.layout.add(hor_layout, fill=True) hor_layout.padding_right = 20 hor_layout.add_spacer(20) image = fsui.Image("launcher:/data/fs_uae_group.png") self.image_view = fsui.ImageView(self, image) hor_layout.add(self.image_view, valign=0.0) hor_layout.add_spacer(20) ver_layout = fsui.VerticalLayout() hor_layout.add(ver_layout, fill=True, expand=True) self.title_label = fsui.HeadingLabel(self, title) ver_layout.add(self.title_label, fill=True) ver_layout.add_spacer(6) self.sub_title_label = fsui.Label(self, gettext("Preparing...")) ver_layout.add(self.sub_title_label, fill=True) self.layout.add_spacer(20) hor_layout = fsui.HorizontalLayout() self.layout.add(hor_layout, fill=True) hor_layout.add_spacer(20, expand=True) self.cancel_button = fsui.Button(self, gettext("Cancel")) self.cancel_button.activated.connect(self.on_cancel_button) hor_layout.add(self.cancel_button) hor_layout.add_spacer(20) self.layout.add_spacer(20) self.set_size(self.layout.get_min_size()) self.center_on_parent() self.was_closed = False self.task = task self.task.progressed.connect(self.on_progress) self.task.finished.connect(self.on_complete) self.task.failed.connect(self.on_error) self.closed.connect(self.__closed)
def __init__(self, parent, title, model): self.model = model fsui.Group.__init__(self, parent) self.layout = fsui.HorizontalLayout() self.ok_image = fsui.Image("launcher:res/ok_emblem.png") self.na_image = fsui.Image("launcher:res/na_emblem.png") self.icon = fsui.ImageView(self, self.na_image) self.layout.add(self.icon) self.layout.add_spacer(10) self.label = fsui.Label(self, title) self.layout.add(self.label) self.update() LauncherSignal.add_listener("scan_done", self)
def __init__(self, parent, import_type=0): fsui.Group.__init__(self, parent) self.type = import_type self.path = "" self.layout = fsui.VerticalLayout() if self.type == self.AMIGA_FOREVER: title = gettext("Import From Amiga Forever CD/DVD") else: title = gettext("Import Kickstarts and ROMs") label = fsui.HeadingLabel(self, title) self.layout.add(label, margin_bottom=10) icon_layout = fsui.HorizontalLayout() self.layout.add(icon_layout, fill=True) icon_layout.add_spacer(20) if self.type == self.AMIGA_FOREVER: image = fsui.Image("launcher:/data/amiga_forever_group.png") else: image = fsui.Image("launcher:/data/kickstart.png") self.image_view = fsui.ImageView(self, image) icon_layout.add(self.image_view, valign=0.0, margin_right=10) vert_layout = fsui.VerticalLayout() icon_layout.add(vert_layout, fill=True, expand=True) if self.type == self.AMIGA_FOREVER: text = gettext("If you own Amiga Forever, select the drive/folder " 'and click "{0}"').format(gettext("Import")) else: text = gettext("Select a folder containing Amiga kickstart files " 'and click "{0}"').format(gettext("Import")) label = fsui.Label(self, text) vert_layout.add(label, margin_bottom=10) hori_layout = fsui.HorizontalLayout() vert_layout.add(hori_layout, fill=True, margin=0) self.text_field = fsui.TextField(self, "", read_only=True) hori_layout.add(self.text_field, expand=True) self.browse_button = fsui.Button(self, gettext("Browse")) self.browse_button.activated.connect(self.on_browse) hori_layout.add(self.browse_button, margin_left=10) self.import_button = fsui.Button(self, gettext("Import")) self.import_button.activated.connect(self.on_import) self.import_button.set_enabled(False) hori_layout.add(self.import_button, margin_left=10)
def __init__(self, parent): fsui.Group.__init__(self, parent) self.layout = fsui.VerticalLayout() self.hori_layout = None self.widgets = 0 config_widget_factory = ConfigWidgetFactory() self.add_widget(config_widget_factory.create(self, Option.CHIP_MEMORY)) self.add_widget( config_widget_factory.create(self, Option.MOTHERBOARD_RAM)) self.add_widget(config_widget_factory.create(self, Option.SLOW_MEMORY)) self.add_widget( config_widget_factory.create(self, Option.ZORRO_III_MEMORY)) self.add_widget(config_widget_factory.create(self, Option.FAST_MEMORY)) self.add_widget( config_widget_factory.create(self, Option.ACCELERATOR_MEMORY)) self.add_widget(fsui.Label(self, "")) self.add_widget( config_widget_factory.create(self, Option.GRAPHICS_MEMORY))
def __init__(self, parent): fsui.Panel.__init__(self, parent) self.layout = fsui.VerticalLayout() hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True, margin=10, margin_bottom=0) label = fsui.Label(self, gettext("Command:")) hori_layout.add(label, fill=True, margin_right=10) self.text_field = fsui.TextField(self, "") self.text_field.on_changed = self.on_text_changed # self.text_field.set_enabled(False) hori_layout.add(self.text_field, expand=True) # self.help_button = HelpButton( # self, "https://fs-uae.net/docs/options/nes-ines-header") # hori_layout.add(self.help_button, margin_left=10) ConfigBehavior(self, [Option.COMMAND])
def __init__(self, parent=None): title = gettext("OpenRetro Locker Uploader") super().__init__(parent, title) self.theme = WorkspaceTheme.instance() self.layout = fsui.VerticalLayout() self.set_icon(fsui.Icon("refresh", "pkg:workspace")) self.layout.min_width = 600 self.layout.set_padding(20, 20, 20, 20) self.icon_header = IconHeader( self, fsui.Icon("refresh", "pkg:workspace"), gettext("OpenRetro Locker Uploader"), gettext("Upload recognized Amiga files to your OpenRetro locker"), ) self.layout.add(self.icon_header, fill=True, margin_bottom=20) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True) self.created_label = fsui.Label(self, "") hori_layout.add(self.created_label, expand=True) self.upload_button = fsui.Button(self, gettext("Upload")) self.upload_button.activated.connect(self.on_upload_activated) hori_layout.add(self.upload_button, margin_left=10) self.stop_button = fsui.Button(self, gettext("Stop")) self.stop_button.activated.connect(self.on_stop_activated) self.stop_button.disable() hori_layout.add(self.stop_button, margin_left=10) if self.window.theme.has_close_buttons: self.close_button = CloseButton(self) hori_layout.add(self.close_button, margin_left=10) else: self.close_button = None self.set_size(self.layout.get_min_size()) self.center_on_parent() self.task = None
def __init__(self, parent=None): title = gettext("OAGD.net Locker Uploader") super().__init__(parent, title, maximizable=False) self.set_icon(fsui.Icon("refresh", "pkg:workspace")) self.layout = fsui.VerticalLayout() self.layout.min_width = 600 self.layout.set_padding(20, 20, 20, 20) self.icon_header = IconHeader( self, fsui.Icon("refresh", "pkg:workspace"), gettext("OAGD.net Locker Uploader"), gettext("Upload recognized Amiga files to your OAGD.net locker")) self.layout.add(self.icon_header, fill=True, margin_bottom=20) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True) self.created_label = fsui.Label(self, "") hori_layout.add(self.created_label, expand=True) self.upload_button = fsui.Button(self, gettext("Upload")) self.upload_button.activated.connect(self.on_upload_activated) hori_layout.add(self.upload_button, margin_left=10) self.stop_button = fsui.Button(self, gettext("Stop")) self.stop_button.activated.connect(self.on_stop_activated) self.stop_button.disable() hori_layout.add(self.stop_button, margin_left=10) # self.close_button = fsui.Button(self, gettext("Close")) # self.close_button.activated.connect(self.on_close_activated) # hori_layout.add(self.close_button, margin_left=10) self.set_size(self.layout.get_min_size()) self.center_on_parent() self.task = None
def __init__(self, parent=None): title = gettext("HDF Disk Image Creator") super().__init__(parent, title=title) self.theme = WorkspaceTheme.instance() buttons, layout = fsui.DialogButtons.create_with_layout(self) if self.window.theme.has_close_buttons: buttons.create_close_button() self.dialog = None self.path = "" self.set_icon(fsui.Icon("hd-volume", "pkg:workspace")) layout.min_width = 500 self.icon_header = IconHeader( self, fsui.Icon("hd-volume", "pkg:workspace"), gettext("HDF Disk Image Creator"), gettext("Create a single-partition or partitionable hard " "drive image")) layout.add(self.icon_header, fill=True, margin_bottom=20) label = fsui.Label(self, gettext("Create disk image of type:")) layout.add(label) layout.add_spacer(6) self.list_view = fsui.ListView(self) self.list_view.set_min_width(560) self.list_view.set_min_height(60) icon = fsui.Image("workspace:res/16x16/hd-volume.png") self.list_view.add_item( gettext("HDF - Single Partition Hard Disk File"), icon) self.list_view.add_item( gettext("HDF - Partitionable Hard Drive Image (RDB)"), icon) layout.add(self.list_view, expand=True, fill=True) self.list_view.item_selected.connect(self.on_item_selected) layout.add_spacer(20) label = fsui.Label(self, gettext("Filename for the new disk image:")) layout.add(label) layout.add_spacer(6) hori_layout = fsui.HorizontalLayout() layout.add(hori_layout, fill=True) self.name_field = fsui.TextField( self, "", read_only=False) hori_layout.add(self.name_field, expand=True) text = gettext("Size:") label = fsui.Label(self, text) hori_layout.add(label, margin_left=20) self.size_field = fsui.TextField(self, "") self.size_field.set_min_width(60) hori_layout.add(self.size_field, expand=False, margin_left=10) text = gettext("MB") label = fsui.Label(self, text) hori_layout.add(label, margin_left=10) layout.add_spacer(20) label = fsui.Label(self, gettext("Save to directory:")) layout.add(label) layout.add_spacer(6) hori_layout = fsui.HorizontalLayout() layout.add(hori_layout, fill=True) self.dir_field = fsui.TextField(self, "", read_only=True) hori_layout.add(self.dir_field, expand=True) self.browse_button = fsui.Button(self, gettext("Browse")) self.browse_button.clicked.connect(self.on_browse_clicked) hori_layout.add(self.browse_button, margin_left=10) self.created_label = fsui.Label(self, "") layout.add(self.created_label, fill=True) # layout.add_spacer(20) # layout.add_spacer(20) # hori_layout = fsui.HorizontalLayout() # layout.add(hori_layout, fill=True) # self.created_label = fsui.Label(self, "") # hori_layout.add(self.created_label, expand=True) # hori_layout.add_spacer(20) self.create_button = fsui.Button(buttons, gettext("Create")) # self.create_button.activated.connect(self.on_create_clicked) self.create_button.clicked.connect(self.on_create_clicked) # hori_layout.add(self.create_button) buttons.add_button(self.create_button) self.list_view.select_item(0) self.update_name_suggestion()
def __init__(self, parent=None): print("LoginWindow, parent =", parent) super().__init__(parent, gettext("Log In to Your OAGD.net Account")) self.set_icon(fsui.Icon("password", "pkg:workspace")) self.theme = WorkspaceTheme.instance() self.layout = fsui.VerticalLayout() self.layout.set_padding(20, 20, 20, 20) heading_layout = fsui.HorizontalLayout() self.layout.add(heading_layout) heading_layout.add( fsui.ImageView(self, fsui.Image("workspace:res/48/password.png"))) heading_layout.add_spacer(20) heading_layout_2 = fsui.VerticalLayout() heading_layout.add(heading_layout_2, expand=True, fill=False, valign=0.5) heading_layout_2.add( fsui.HeadingLabel(self, gettext("Log In to Your OAGD.net Account"))) heading_layout_2.add_spacer(2) heading_layout_2.add( fsui.Label( self, gettext("Logging in will enable the online game database " "and more"))) self.username_field = fsui.TextField( self, app.settings["database_email"].strip()) self.password_field = fsui.PasswordField(self) if self.username_field.get_text(): self.password_field.focus() self.layout.add_spacer(20) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True) label = fsui.Label(self, gettext("E-mail:")) label.set_min_width(100) hori_layout.add(label) hori_layout.add_spacer(20) # self.username_field.select_all() self.username_field.changed.connect(self.on_text_field_changed) self.username_field.activated.connect(self.on_username_activated) hori_layout.add(self.username_field, expand=True) self.layout.add_spacer(10) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True) label = fsui.Label(self, gettext("Password:"******"Don't have an account already?")) hori_layout.add(label) hori_layout.add_spacer(20) label = fsui.URLLabel( self, gettext("Create an account now"), "https://oagd.net/user/register?referrer=fs-uae-launcher") hori_layout.add(label, expand=True) self.layout.add_spacer(6) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True) label = fsui.Label(self, gettext("Forgot your password?")) hori_layout.add(label) hori_layout.add_spacer(20) self.reset_label = fsui.URLLabel( self, gettext("Reset password via e-mail"), "https://oagd.net/user/reset?referrer=fs-uae-launcher") hori_layout.add(self.reset_label, expand=True) self.layout.add_spacer(20) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True) self.created_label = fsui.Label(self, "") hori_layout.add(self.created_label, expand=True) hori_layout.add_spacer(20) self.login_button = fsui.Button(self, gettext("Log In")) self.login_button.disable() self.login_button.activated.connect(self.on_login_activated) hori_layout.add(self.login_button) if self.window.theme.has_close_buttons: self.close_button = CloseButton(self) hori_layout.add(self.close_button, fill=True, margin_left=10) self.set_size(self.layout.get_min_size()) self.center_on_parent() if len(self.username_field.text()) == 0: self.username_field.focus() else: self.password_field.focus()
def __init__(self, parent, index=0): PagedDialog.__init__( self, parent, "{} - {} Launcher".format(gettext("Settings"), fsgs.product)) # FIXME: remove this once the dialog uses Window as base class # self.setAttribute(Qt.WA_DeleteOnClose, True) # self.add_page( # # gettext("Appearance"), LanguageSettingsPage, # gettext("Language"), LanguageSettingsPage, # fsui.Icon("language-settings", "pkg:workspace")) self.add_page(gettext("Common"), LanguageSettingsPage, fsui.Icon("language-settings", "pkg:workspace"), bold=True) self.add_page(gettext("Controllers"), JoystickSettingsPage, fsui.Icon("gamepad", "pkg:workspace")) self.add_page(gettext("Plugins"), PluginsSettingsPage, fsui.Icon("settings", "pkg:workspace")) self.add_page(gettext("Directories"), DirectoriesSettingsPage, fsui.Icon("folder", "pkg:launcher")) self.add_page(gettext("Advanced"), AdvancedSettingsPage, fsui.Icon("settings", "pkg:workspace")) self.add_page("FS-UAE", FSUAESettingsPage, fsui.Icon("fs-uae", "pkg:launcher"), bold=True) self.add_page(gettext("Keyboard"), KeyboardSettingsPage, fsui.Icon("keyboard-settings", "pkg:workspace")) self.add_page(gettext("Mouse"), MouseSettingsPage, fsui.Icon("mouse-settings", "pkg:workspace")) self.add_page(gettext("Audio"), AudioSettingsPage, fsui.Icon("audio-settings", "pkg:workspace")) self.add_page(gettext("Video"), VideoSettingsPage, fsui.Icon("video-settings", "pkg:workspace")) self.add_page(gettext("Advanced Video"), AdvancedVideoSettingsPage, fsui.Icon("video-settings", "pkg:workspace")) # self.add_page( # gettext("Synchronization"), VideoSyncSettingsPage, # fsui.Icon("video-settings", "pkg:workspace")) # self.add_page( # gettext("Filters & Scaling"), FilterSettingsPage, # fsui.Icon("video-settings", "pkg:workspace")) # self.add_page(gettext("OpenGL Settings"), OpenGLSettingsPage) # if Settings.get("database_feature") == "1": # self.add_page( # gettext("Logging"), LoggingSettingsPage, # fsui.Icon("settings", "pkg:workspace")) self.add_page("{} Launcher".format(fsgs.product), LauncherSettingsPage, fsui.Icon("fs-uae-launcher", "pkg:launcher"), bold=True) self.add_page(gettext("File Database"), ScanSettingsPage, fsui.Icon("indexing-settings", "pkg:workspace")) self.add_page(gettext("Game Database"), GameDatabaseSettingsPage, fsui.Icon("database-settings", "pkg:workspace")) if fsgs.openretro or settings.get(Option.PLATFORMS_FEATURE) == "1": self.add_page(gettext("Game Platforms"), GamePlatformsSettingsPage, fsui.Icon("database-settings", "pkg:workspace")) # self.add_page(gettext("Custom Settings"), CustomSettingsPage) if LauncherSettings.get(Option.NETPLAY_FEATURE) != "0": self.add_page(gettext("Net Play"), NetplaySettingsPage, fsui.Icon("netplay-settings", "pkg:workspace")) self.add_page("WHDLoad", WHDLoadSettingsPage, fsui.Icon("hd", "pkg:launcher")) # self.add_page( # gettext("Experimental Features"), ExperimentalFeaturesPage, # fsui.Icon("settings", "pkg:workspace")) # self.add_page( # gettext("Maintenance"), MaintenanceSettingsPage, # fsui.Icon("maintenance", "pkg:workspace")) self.add_page("{} Arcade".format(fsgs.product), ArcadeSettingsPage, fsui.Icon("fs-uae-arcade", "pkg:launcher"), bold=True) # Old texts # gettext("Video Synchronization") # gettext("Synchronization") gettext("Advanced") last_index = self.get_page_index_by_title( LauncherSettings.get("last_settings_page")) index = last_index or index self.list_view.set_index(index) defaults_button = fsui.Button(self, gettext("Reset to Defaults")) defaults_button.activated.connect(self.__defaults_activated) self.button_layout.insert(0, defaults_button, fill=True) defaults_label = fsui.Label( self, gettext("Choices marked with (*) is the default setting")) self.button_layout.insert(1, defaults_label, margin_left=20) self.set_size((940, 560)) # self.center_on_parent() self.closed.connect(self.__closed) self.page_changed.connect(self.__page_changed)
def __init__(self, parent, with_more_button=True): unused(with_more_button) fsui.Group.__init__(self, parent) self.layout = fsui.VerticalLayout() self.model_ids = [x["id"] for x in Amiga.models if "/" not in x["id"]] self.model_titles = [ x["title"] for x in Amiga.models if "/" not in x["id"] ] self.sub_model_ids = [] self.sub_model_titles = [] self.sub_model_updating = False self.model_choice = fsui.Choice(self, self.model_titles) # AmigaEnableBehavior(self.model_choice) self.sub_model_choice = fsui.Choice(self, self.sub_model_titles) # AmigaEnableBehavior(self.sub_model_choice) self.accuracy_label = fsui.Label(self, gettext("Accuracy:")) self.accuracy_choice = fsui.Choice( self, [gettext("High"), gettext("Medium"), gettext("Low")]) # AmigaEnableBehavior(self.accuracy_choice) self.ntsc_checkbox = ConfigCheckBox(self, "NTSC", Option.NTSC_MODE) AmigaShowBehavior(self.accuracy_label) AmigaShowBehavior(self.accuracy_choice) AmigaShowBehavior(self.ntsc_checkbox) # if fs_uae_launcher.ui.get_screen_size()[1] > 768: # self.layout.add(heading_label, margin=10) # self.layout.add_spacer(0) self.model_title_layout = fsui.HorizontalLayout() self.layout.add(self.model_title_layout, fill=True) if openretro or settings.get(Option.PLATFORMS_FEATURE) == "1": heading_label = fsui.HeadingLabel(self, gettext("Platform & Model")) self.model_title_layout.add(heading_label, margin=10) # platform_group = ConfigWidgetFactory( # check=False, label=False).create(self, Option.PLATFORM) # self.model_title_layout.add(platform_group, margin_left=20) # Adding label to get the vertical spacing correct. # heading_label = fsui.HeadingLabel(self, "") # self.model_title_layout.add(heading_label, margin=10) else: heading_label = fsui.HeadingLabel(self, gettext("Amiga Model")) self.model_title_layout.add(heading_label, margin=10) self.model_title_layout.add_spacer(0, expand=True) self.model_title_layout.add(self.ntsc_checkbox, expand=False, margin_left=10, margin_right=10) self.model_title_layout.add_spacer(20) self.model_title_layout.add(self.accuracy_label, margin_right=10) self.model_title_layout.add(self.accuracy_choice, margin_right=10) self.model_title_layout.add(CustomConfigButton(self), margin_right=10) self.model_layout = fsui.HorizontalLayout() def dummy_min_width(): return 0 # Not sure why this is needed, but on startup, the min width # seems to be set too large due to something in the model layout. self.model_layout.get_min_width = dummy_min_width self.layout.add(self.model_layout, fill=True) if openretro or settings.get(Option.PLATFORMS_FEATURE) == "1": platform_group = ConfigWidgetFactory(check=False, label=False).create( self, Option.PLATFORM) self.model_layout.add(platform_group, margin=10) pass self.other_model_choice = ModelChoice(self) self.model_layout.add(self.other_model_choice, expand=True, margin=10) self.model_layout.add(self.model_choice, expand=False, margin=10) AmigaShowBehavior(self.model_choice) self.model_layout.add(self.sub_model_choice, expand=True, margin=10) AmigaShowBehavior(self.sub_model_choice) ConfigBehavior(self, [Option.ACCURACY, Option.AMIGA_MODEL, Option.PLATFORM]) self.model_choice.on_changed = self.on_model_changed self.sub_model_choice.on_changed = self.on_sub_model_changed self.accuracy_choice.on_changed = self.on_accuracy_changed
def create_group(cls, parent, name, description=None, help_button=True, thin=False): group = fsui.Group(parent) group.layout = fsui.HorizontalLayout() if thin: thin_layout = fsui.VerticalLayout() thin_layout.add(group.layout, fill=True) option = Option.get(name) if description == "": description = gettext(option["description"]) if description: group.label = fsui.Label(group, description + ":") group.layout.add(group.label, margin_right=10) group.layout.add(OverrideWarning(group, name), margin_right=10) if thin: group.layout = fsui.HorizontalLayout() if description: thin_layout.add(group.layout, fill=True, margin_top=6) else: thin_layout.add(group.layout, fill=True, margin_top=0) choice_values = [] if description: default_tmpl = "{0} (*)" # default_tmpl = "Default - {0}" else: default_tmpl = "{0} (*)" # default_tmpl = "Default - {0}" if option["type"].lower() == "boolean": if option["default"] == "1": default_desc = gettext(default_tmpl).format(gettext("On")) elif option["default"] == "0": default_desc = gettext(default_tmpl).format(gettext("Off")) else: default_desc = gettext("Default") choice_values.append(("", default_desc)) choice_values.append(("1", gettext("On"))) choice_values.append(("0", gettext("Off"))) elif option["type"].lower() == "choice": for i, value in enumerate(option["values"]): if option["default"] == value[0]: default_desc = gettext(default_tmpl).format( gettext(value[1])) break else: default_desc = gettext("Default") choice_values.append(("", default_desc)) for option in option["values"]: choice_values.append((option[0], gettext(option[1]))) elif option["type"].lower() == "string": def on_changed(): val = text_field.get_text() LauncherSettings.set(name, val.strip()) text_field = fsui.TextField(group) # text_field.set_min_width(400) text_field.set_text(LauncherSettings.get(name)) text_field.on_changed = on_changed group.layout.add(text_field, expand=True) elif (option["type"].lower() == "integer" and "min" in option and "max" in option): current = LauncherSettings.get(name) if name == Option.LAUNCHER_FONT_SIZE: font = app.qapplication.font() Option.get( Option.LAUNCHER_FONT_SIZE)["default"] = font.pointSize() current_int = int(option["default"]) if current: try: current_int = int(current) except ValueError: pass current_int = max(option["min"], min(option["max"], current_int)) check_box = fsui.CheckBox(group, gettext("Default")) spin_ctrl = fsui.SpinCtrl(group, option["min"], option["max"], current_int) if current == "": check_box.check() spin_ctrl.disable() def on_checkbox(): if check_box.is_checked(): spin_ctrl.set_value(int(option["default"])) spin_ctrl.disable() LauncherSettings.set(name, "") else: spin_ctrl.enable() check_box.on_changed = on_checkbox def on_spin(): val = spin_ctrl.get_value() val = max(option["min"], min(option["max"], val)) LauncherSettings.set(name, str(val)) spin_ctrl.on_changed = on_spin group.layout.add_spacer(0, expand=True) group.layout.add(check_box) group.layout.add(spin_ctrl, margin_left=10) if choice_values: def on_changed(): index = choice.get_index() LauncherSettings.set(name, choice_values[index][0]) choice_labels = [x[1] for x in choice_values] choice = fsui.Choice(group, choice_labels) current = LauncherSettings.get(name) for i, value in enumerate(choice_values): if current == value[0]: choice.set_index(i) break choice.on_changed = on_changed if thin: group.layout.add(choice, expand=True) else: group.layout.add_spacer(0, expand=True) group.layout.add(choice) group.widget = choice if help_button: option_url = "https://fs-uae.net/docs/options/" + name.replace( "_", "-") group.help_button = HelpButton(parent, option_url) group.layout.add(group.help_button, margin_left=10) if thin: group.layout = thin_layout return group
def __init__(self, parent, fsgs): fsui.Window.__init__(self, parent, gettext("Download Game Manually")) self.fsgs = fsgs self.download_page = fsgs.config.get("download_page") self.download_notice = fsgs.config.get("download_notice") self.task = None self.layout = fsui.VerticalLayout() self.layout.set_padding(20, 20, 20, 20) self.icon_header = IconHeader( self, fsui.Icon("web-browser", "pkg:workspace"), gettext("Download Game Manually"), gettext("This game must be downloaded before you can play it")) self.layout.add(self.icon_header, fill=True, margin_bottom=20) label = fsui.HeadingLabel( self, gettext("Please open the following web page and download the " "game from there:")) label.set_min_width(500) self.layout.add(label) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True, margin_top=10) hori_layout.add( fsui.ImageView(self, fsui.Image("launcher:res/16x16/world_link.png"))) label = fsui.URLLabel(self, self.download_page, self.download_page) hori_layout.add(label, margin_left=6) if self.download_notice: label = fsui.MultiLineLabel(self, self.download_notice) label.set_min_width(500) self.layout.add(label, margin_top=20) label = fsui.HeadingLabel( self, gettext("Download to the following directory, and then " "click '{0}':".format(gettext("Scan Downloads")))) label.set_min_width(500) self.layout.add(label, margin_top=20) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True, margin_top=10) hori_layout.add( fsui.ImageView(self, fsui.Image("launcher:res/16x16/folder.png"))) label = fsui.Label(self, FSGSDirectories.ensure_downloads_dir()) hori_layout.add(label, margin_left=6) hori_layout = fsui.HorizontalLayout() self.layout.add(hori_layout, fill=True, margin_top=20) self.status_label = fsui.Label(self, "") hori_layout.add(self.status_label, expand=True) self.scan_button = fsui.Button(self, gettext("Scan Downloads")) self.scan_button.activated.connect(self.on_scan_files) hori_layout.add(self.scan_button, margin_left=20) self.close_button = fsui.Button(self, gettext("Close")) self.close_button.activated.connect(self.on_close) hori_layout.add(self.close_button, margin_left=10) self.set_size(self.layout.get_min_size()) self.center_on_parent()