Example #1
0
    def __init__(self, parent):
        app_name = "{} Launcher".format(Product.base_name)
        title = "{} - {}".format(gettext("About"), app_name)
        super().__init__(parent, title, minimizable=False, maximizable=False)
        self.theme = LauncherTheme.get()
        self.layout = VerticalLayout()
        self.layout.set_padding(20)

        self.icon_header = IconHeader(
            self,
            Icon("fs-uae-launcher", "pkg:launcher"),
            "{name} {version}".format(name=app_name, version=app.version),
            "Copyright © 2012-2020 Frode Solheim",
        )
        self.layout.add(self.icon_header, fill=True, margin_bottom=20)

        # FIXME: Python version
        # FIXME: Qt version
        # FIXME: PyQt5 version
        # (FIXME: Linux distribution?)

        self.text_area = TextArea(self,
                                  about_message,
                                  read_only=True,
                                  font_family="monospace")
        self.text_area.scroll_to_start()
        self.text_area.set_min_width(760)
        self.text_area.set_min_height(340)
        self.layout.add(self.text_area, fill=True, expand=True)

        CloseButton.add_to_layout(self, self.layout, margin_top=20)
Example #2
0
    def __init__(self, parent):
        super().__init__(parent)
        self.layout = VerticalLayout()

        self.page_titles = []
        self.pages = []
        self.current_page = None
Example #3
0
class ConfigPanel(Panel):
    def __init__(self, parent):
        super().__init__(parent)
        Skin.set_background_color(self)
        self.layout = VerticalLayout()
        self.config_widget_factory = ConfigWidgetFactory()

    def add_option(self, name, fill=True):
        self.layout.add(
            self.config_widget_factory.create(self, name),
            fill=fill,
            margin=10,
            margin_bottom=0,
        )

    def add_amiga_option(self, name, fill=True, parent=None):
        if parent is None:
            parent = self
        parent.layout.add(
            self.config_widget_factory.create(parent,
                                              name,
                                              platforms=AMIGA_PLATFORMS),
            fill=fill,
            margin=10,
            margin_bottom=0,
        )
Example #4
0
    def __init__(self, parent):
        Panel.__init__(self, parent, paintable=True)
        self.set_min_height(29)
        # self.set_background_color(Color(0xd8, 0xd8, 0xd8))
        self.layout = VerticalLayout()
        self.hori_layout = HorizontalLayout()
        if Skin.fws():
            self.top_border_size = 2
        else:
            self.top_border_size = 1
        self.layout.add(self.hori_layout,
                        fill=True,
                        expand=True,
                        margin_top=self.top_border_size)

        element = ProtectionElement(self)
        self.hori_layout.add(element, fill=True)

        element = WarningsElement(self)
        self.hori_layout.add(element, fill=True, expand=True)
        self.hori_layout.add_spacer(16)

        for language, icon_name in reversed([
            ("en", "flag-gb"),
            ("de", "flag-de"),
            ("fr", "flag-fr"),
            ("es", "flag-es"),
            ("it", "flag-it"),
            ("ja", "flag-jp"),
                # ("", "flag-unknown"),
        ]):
            icon = Image("workspace:res/16/" + icon_name + ".png")
            element = LanguageElement(self, language, icon)
            self.hori_layout.add(element, fill=True)
        self.hori_layout.add_spacer(16)

        element = PlayersElement(self)
        self.hori_layout.add(element, fill=True)

        # for config_key, icon_name in [
        #     ("database_url", "database_url_16"),
        #     ("hol_url", "hol_url_16"),
        #     ("lemonamiga_url", "lemon_url_16"),
        #     ("mobygames_url", "mobygames_url_16"),
        #     ("wikipedia_url", "wikipedia_url_16"),
        # ]:
        #     icon = Image("launcher:res/" + icon_name + ".png")
        #     element = LinkButtonElement(self, config_key, icon)
        #     self.hori_layout.add(element)

        element = WebLinkElement(self)
        self.hori_layout.add(element, fill=True)

        # this listener is added after all status bar children have
        # added their listeners, this is important for re-layout...
        LauncherConfig.add_listener(self)
Example #5
0
class ConfigPanel(Panel):
    def __init__(self, parent):
        super().__init__(parent)
        Skin.set_background_color(self)
        self.layout = VerticalLayout()
        self.config_widget_factory = ConfigWidgetFactory()

    def add_option(self, name, fill=True):
        self.layout.add(self.config_widget_factory.create(
            self, name), fill=fill, margin=10, margin_bottom=0)
    def __init__(self, parent):
        super().__init__(
            parent,
            title=get_workspace_window_title(),
            border=False,
            below=True,
        )
        self.theme = get_launcher_theme(self)
        self.layout = VerticalLayout()

        self.background_widget = BackgroundWidget(self)
        self.layout.add(WorkspaceTitleBar(self), fill=True)

        # self.layout.padding_top = 300
        # self.layout.padding_right = 300
        # self.layout.padding_bottom = 300
        # self.layout.padding_left = 300

        self.set_background_color(self.theme.window_bgcolor())

        print("\n\nFIXME: Hardcoded to use rightmost screen\n\n")
        rect = screen_rects()[-1]
        self.set_position_and_size((rect["x"], rect["y"]),
                                   (rect["w"], rect["h"]))
        # self.set_position((1920, 0))

        # self.layout.add_spacer(0, expand=True)

        # horilayout = HorizontalLayout()
        # self.layout.add(horilayout, fill=True)
        # button = Button(self, "Close")
        # button.activated.connect(self.close)
        # horilayout.add(button)
        # button = Button(self, "Prefs")
        # button.activated.connect(self.__prefs)
        # horilayout.add(button)

        self.iconview = WorkspaceIconView(self)
        self.layout.add(self.iconview, expand=True, fill=True)

        # self.layout.add(
        #     BottomDebugPanel(self, close=False, quit=True), fill=True
        # )

        # self.layout.add(button)
        # self.layout.update()

        # FIXME: self.show_maximized() ?
        # FIXME: If we set maximized before show, then the button does not
        # appear ?
        self.show()
        self.set_maximized(True)
Example #7
0
    def __init__(self, parent):
        super().__init__(
            parent,
            title=gettext("Execute a file"),
            maximizable=False,
            minimizable=False,
            escape=True,
        )
        vertlayout = VerticalLayout(20)
        self.layout.add(vertlayout, fill=True, expand=True)
        vertlayout.add(Label(self,
                             gettext("Enter command and its arguments:")))

        horilayout = HorizontalLayout()
        vertlayout.add(horilayout, fill=True, margin_top=10)
        horilayout.add(Label(self, gettext("Command:")), fill=True)
        self.textfield = TextField(self)
        self.textfield.set_min_width(300)
        self.textfield.activated.connect(self.__on_execute)
        horilayout.add(self.textfield, expand=True, fill=True, margin_left=10)

        # Creating execute button first, so it will become default for when
        # the user presses return in the text field. This only applies when
        # this dialog is implemented as an actual Dialog though.
        self.executebutton = Button(self, gettext("Execute"))
        self.executebutton.activated.connect(self.__on_execute)
        self.cancelbutton = Button(self, gettext("Cancel"))
        self.cancelbutton.activated.connect(self.__on_cancel)

        horilayout = HorizontalLayout()
        vertlayout.add(horilayout, fill=True, margin_top=20)
        horilayout.add_spacer(0, expand=True)
        horilayout.add(self.cancelbutton, margin_left=10)
        horilayout.add(self.executebutton, margin_left=10)
        self._command = ""
Example #8
0
    def __init__(self, parent):
        Panel.__init__(self, parent, paintable=True)
        self.set_min_height(29)
        # self.set_background_color(Color(0xd8, 0xd8, 0xd8))
        self.layout = VerticalLayout()
        self.hori_layout = HorizontalLayout()
        if Skin.fws():
            self.top_border_size = 2
        else:
            self.top_border_size = 1
        self.layout.add(self.hori_layout, fill=True, expand=True,
                        margin_top=self.top_border_size)

        element = ProtectionElement(self)
        self.hori_layout.add(element, fill=True)

        element = WarningsElement(self)
        self.hori_layout.add(element, fill=True, expand=True)
        self.hori_layout.add_spacer(16)

        for language, icon_name in reversed([
            ("en", "flag-gb"),
            ("de", "flag-de"),
            ("fr", "flag-fr"),
            ("es", "flag-es"),
            ("it", "flag-it"),
            ("ja", "flag-jp"),
            # ("", "flag-unknown"),
        ]):
            icon = Image("workspace:res/16/" + icon_name + ".png")
            element = LanguageElement(self, language, icon)
            self.hori_layout.add(element, fill=True)
        self.hori_layout.add_spacer(16)

        element = PlayersElement(self)
        self.hori_layout.add(element, fill=True)

        # for config_key, icon_name in [
        #     ("database_url", "database_url_16"),
        #     ("hol_url", "hol_url_16"),
        #     ("lemonamiga_url", "lemon_url_16"),
        #     ("mobygames_url", "mobygames_url_16"),
        #     ("wikipedia_url", "wikipedia_url_16"),
        # ]:
        #     icon = Image("launcher:res/" + icon_name + ".png")
        #     element = LinkButtonElement(self, config_key, icon)
        #     self.hori_layout.add(element)

        element = WebLinkElement(self)
        self.hori_layout.add(element, fill=True)

        # this listener is added after all status bar children have
        # added their listeners, this is important for re-layout...
        LauncherConfig.add_listener(self)
Example #9
0
    def __init__(self, parent):
        super().__init__(parent)
        # self.set_background_color(fsui.Color(0x999900))
        # This min width is not important
        # self.set_min_width(400)

        horilayout = HorizontalLayout()
        self.layout.add(horilayout, fill=True, expand=True)

        vertlayout = VerticalLayout()
        horilayout.add(vertlayout, fill=True, expand=True)

        self.top_panel = Launcher2TopPanel(self)
        vertlayout.add(self.top_panel, fill=True)

        # self.running_panel = Launcher2RunningPanel(self)
        # vertlayout.add(self.running_panel, fill=True)
        # self.running_panel.set_visible(False)

        self.configpanel = ConfigPanel(self)
        # FIXME: Refer to theme? dialog_bg_color?
        self.configpanel.set_background_color(
            Color(Launcher2Colors.CONFIG_PANEL_COLOR)
        )
        # self.configpanel.set_background_color(Color(0xBBBBBB))
        vertlayout.add(self.configpanel, fill=True, expand=True)

        self.bottom_panel = Launcher2BottomPanel(self)
        self.layout.add(self.bottom_panel, fill=True)

        design_test = True
        if design_test:
            self.side = Launcher2SidePanel(self)
            horilayout.add(self.side, fill=True)

            # The Launcher should fit into a 1280x720 display, with
            # common/reasonable GUI elements such as a task bar.
            # Or maybe use 1366x768
            # Or maybe 1280x768 to support 1280x1024 and 1366x768.
            # Windows 10 taskbar width/side: 62 pixels
            # Windows 10 taskbar height/bottom: 40 pixels
            # screen_size = (1280, 720)
            screen_size = (1366, 768)

            min_width = screen_size[0] - 62
            # Subtracting an additional 40 For Launcher title bar
            min_height = screen_size[1] - 40 - 40

            self.parent().set_min_size((min_width, min_height))
            self.parent().left.set_min_width(380)

            self.parent().set_min_size((1280, 720 - 40))

            # For now, make the minimum _client size_ 1280x720 which will cause
            # the window with decorations to be 1280x740. This should not be
            # the min. required size going forward though. Too big for
            # 768-height screens with bottom Windows 10 taskbar...
            # self.parent().set_min_size((1280, 720))

        ConfigDispatch(self, {"__running": self.__on_running_config})
Example #10
0
class Book(Panel):
    def __init__(self, parent):
        super().__init__(parent)
        self.layout = VerticalLayout()

        self.page_titles = []
        self.pages = []
        self.current_page = None

    def add_page(self, function, title=""):
        self.page_titles.append(title)
        self.pages.append(function)

    def set_page(self, page):
        print("Book.set_page", page)
        try:
            index = page + 0
        except TypeError:
            for i, p in enumerate(self.pages):
                if page == p:
                    index = i
                    break
            else:
                raise Exception("page not found")
        if self.current_page:
            self.current_page.hide()
            self.layout.remove(self.current_page)
        if callable(self.pages[index]):
            page = self.pages[index](self)
            self.pages[index] = page
        else:
            page = self.pages[index]
        self.layout.add(page, fill=True, expand=True)
        self.current_page = page
        page.show()
        if hasattr(page, "on_show"):
            page.on_show()

        print("Book, about to call self.layout.update, size =", self.size())
        # self.layout.set_size((1000, 100))
        # self.layout.update()

        # self.layout.set_size(self.size())
        self.layout.update()
    def __init__(
        self,
        parent,
        icon,
        button_type=TYPE_TAB,
        left_padding=0,
        right_padding=0,
    ):
        Panel.__init__(self, parent, paintable=True)
        Skin.set_background_color(self)
        self.layout = VerticalLayout()
        # self.set_background_color((0xdd, 0xdd, 0xdd))
        # self.set_min_width(Constants.TAB_WIDTH + left_padding + right_padding)
        # self.set_min_height(Constants.TAB_HEIGHT)
        self.set_min_size((64, 48))
        self.group_id = 0
        self.icon = icon
        self.type = button_type
        self.state = self.STATE_NORMAL
        self.hover = False
        self.left_padding = left_padding
        self.right_padding = right_padding

        self.bgcolor = get_theme(self).window_bgcolor()
Example #12
0
 def __init__(self, parent):
     super().__init__(parent)
     Skin.set_background_color(self)
     self.layout = VerticalLayout()
     self.config_widget_factory = ConfigWidgetFactory()
Example #13
0
class StatusBar(Panel):

    def __init__(self, parent):
        Panel.__init__(self, parent, paintable=True)
        self.set_min_height(29)
        # self.set_background_color(Color(0xd8, 0xd8, 0xd8))
        self.layout = VerticalLayout()
        self.hori_layout = HorizontalLayout()
        if Skin.fws():
            self.top_border_size = 2
        else:
            self.top_border_size = 1
        self.layout.add(self.hori_layout, fill=True, expand=True,
                        margin_top=self.top_border_size)

        element = ProtectionElement(self)
        self.hori_layout.add(element, fill=True)

        element = WarningsElement(self)
        self.hori_layout.add(element, fill=True, expand=True)
        self.hori_layout.add_spacer(16)

        for language, icon_name in reversed([
            ("en", "flag-gb"),
            ("de", "flag-de"),
            ("fr", "flag-fr"),
            ("es", "flag-es"),
            ("it", "flag-it"),
            ("ja", "flag-jp"),
            # ("", "flag-unknown"),
        ]):
            icon = Image("workspace:res/16/" + icon_name + ".png")
            element = LanguageElement(self, language, icon)
            self.hori_layout.add(element, fill=True)
        self.hori_layout.add_spacer(16)

        element = PlayersElement(self)
        self.hori_layout.add(element, fill=True)

        # for config_key, icon_name in [
        #     ("database_url", "database_url_16"),
        #     ("hol_url", "hol_url_16"),
        #     ("lemonamiga_url", "lemon_url_16"),
        #     ("mobygames_url", "mobygames_url_16"),
        #     ("wikipedia_url", "wikipedia_url_16"),
        # ]:
        #     icon = Image("launcher:res/" + icon_name + ".png")
        #     element = LinkButtonElement(self, config_key, icon)
        #     self.hori_layout.add(element)

        element = WebLinkElement(self)
        self.hori_layout.add(element, fill=True)

        # this listener is added after all status bar children have
        # added their listeners, this is important for re-layout...
        LauncherConfig.add_listener(self)

    def on_destroy(self):
        LauncherConfig.remove_listener(self)

    def on_config(self, key, value):
        unused(value)
        layout = False
        if key in ["languages", "protection"]:
            layout = True
        if layout:
            self.layout.update()

    def on_paint(self):
        dc = self.create_dc()
        size = self.size()
        if Skin.fws():
            dc.draw_rectangle(
                0, 0, size[0], 2, Color(0xe5, 0xe5, 0xe5, 0xff))
            return
        color_1 = Skin.get_background_color()
        if color_1 is not None:
            color_1 = color_1.copy().darken(0.12)
        else:
            color_1 = Color(0x00, 0x00, 0x00, 0x30)
        dc.draw_line(0, 0, size[0], 0, color_1)
        self.draw_background(self, dc, offset=1, height=size[1] - 1)

    @classmethod
    def draw_element_background(cls, widget, dc):
        cls.draw_background(widget, dc)

    @classmethod
    def draw_background(cls, widget, dc, offset=None, height=None):
        size = widget.size()
        if Skin.fws():
            return
        x = 0
        y = 0
        w = size[0]
        h = size[1]
        if offset is not None:
            y += offset
        if height is not None:
            h = height

        color_1 = Skin.get_background_color()
        color_2 = color_1
        # if fsui.System.macosx:
        #     color_1 = Color(0xa7, 0xa7, 0xa7)
        #     color_2 = Color(0xc0, 0xc0, 0xc0)
        if color_1 is not None:
            color_1 = color_1.copy().darken(0.08)
        else:
            color_1 = Color(0x00, 0x00, 0x00, 0x20)
            color_2 = Color(0x00, 0x00, 0x00, 0x00)
        dc.draw_vertical_gradient(x, y, w, h, color_1, color_2)
Example #14
0
class StatusBar(Panel):
    def __init__(self, parent):
        Panel.__init__(self, parent, paintable=True)
        self.set_min_height(29)
        # self.set_background_color(Color(0xd8, 0xd8, 0xd8))
        self.layout = VerticalLayout()
        self.hori_layout = HorizontalLayout()
        if Skin.fws():
            self.top_border_size = 2
        else:
            self.top_border_size = 1
        self.layout.add(self.hori_layout,
                        fill=True,
                        expand=True,
                        margin_top=self.top_border_size)

        element = ProtectionElement(self)
        self.hori_layout.add(element, fill=True)

        element = WarningsElement(self)
        self.hori_layout.add(element, fill=True, expand=True)
        self.hori_layout.add_spacer(16)

        for language, icon_name in reversed([
            ("en", "flag-gb"),
            ("de", "flag-de"),
            ("fr", "flag-fr"),
            ("es", "flag-es"),
            ("it", "flag-it"),
            ("ja", "flag-jp"),
                # ("", "flag-unknown"),
        ]):
            icon = Image("workspace:res/16/" + icon_name + ".png")
            element = LanguageElement(self, language, icon)
            self.hori_layout.add(element, fill=True)
        self.hori_layout.add_spacer(16)

        element = PlayersElement(self)
        self.hori_layout.add(element, fill=True)

        # for config_key, icon_name in [
        #     ("database_url", "database_url_16"),
        #     ("hol_url", "hol_url_16"),
        #     ("lemonamiga_url", "lemon_url_16"),
        #     ("mobygames_url", "mobygames_url_16"),
        #     ("wikipedia_url", "wikipedia_url_16"),
        # ]:
        #     icon = Image("launcher:res/" + icon_name + ".png")
        #     element = LinkButtonElement(self, config_key, icon)
        #     self.hori_layout.add(element)

        element = WebLinkElement(self)
        self.hori_layout.add(element, fill=True)

        # this listener is added after all status bar children have
        # added their listeners, this is important for re-layout...
        LauncherConfig.add_listener(self)

    def on_destroy(self):
        LauncherConfig.remove_listener(self)

    def on_config(self, key, value):
        unused(value)
        layout = False
        if key in ["languages", "protection"]:
            layout = True
        if layout:
            self.layout.update()

    def on_paint(self):
        dc = self.create_dc()
        size = self.size()
        if Skin.fws():
            dc.draw_rectangle(0, 0, size[0], 2, Color(0xe5, 0xe5, 0xe5, 0xff))
            return
        color_1 = Skin.get_background_color()
        if color_1 is not None:
            color_1 = color_1.copy().darken(0.12)
        else:
            color_1 = Color(0x00, 0x00, 0x00, 0x30)
        dc.draw_line(0, 0, size[0], 0, color_1)
        self.draw_background(self, dc, offset=1, height=size[1] - 1)

    @classmethod
    def draw_element_background(cls, widget, dc):
        cls.draw_background(widget, dc)

    @classmethod
    def draw_background(cls, widget, dc, offset=None, height=None):
        size = widget.size()
        if Skin.fws():
            return
        x = 0
        y = 0
        w = size[0]
        h = size[1]
        if offset is not None:
            y += offset
        if height is not None:
            h = height

        color_1 = Skin.get_background_color()
        color_2 = color_1
        # if fsui.System.macosx:
        #     color_1 = Color(0xa7, 0xa7, 0xa7)
        #     color_2 = Color(0xc0, 0xc0, 0xc0)
        if color_1 is not None:
            color_1 = color_1.copy().darken(0.08)
        else:
            color_1 = Color(0x00, 0x00, 0x00, 0x20)
            color_2 = Color(0x00, 0x00, 0x00, 0x00)
        dc.draw_vertical_gradient(x, y, w, h, color_1, color_2)
Example #15
0
    def __init__(self, parent, *, exception, backtrace, recoverable=False):
        self.theme = get_launcher_theme(self)
        window_parent = None
        if recoverable:
            title = "Recoverable Alert"
        else:
            title = "Software Failure"
        minimizable = False
        maximizable = False
        super().__init__(window_parent, title, border=False)
        self.layout = VerticalLayout()

        if recoverable:
            text_color = Color(0xFFAA22)
            # background_color = Color(0x111111)
            title_foreground_color = Color(0x000000)
            title_background_color = Color(0xFFAA22)
        else:
            text_color = Color(0xFF2222)
            title_foreground_color = Color(0x000000)
            title_background_color = Color(0xFF2222)
        background_color = Color(0x181818)

        self.set_background_color(background_color)

        if not self.theme.titlebar_system():
            self.__titlebar = TitleBar(
                self,
                title=title,
                minimizable=minimizable,
                maximizable=maximizable,
                # foreground_color=Color(0xFFFFFF),
                # background_color=Color(0x282828),
                foreground_color=title_foreground_color,
                background_color=title_background_color,
                foreground_inactive_color=Color(0xCCCCCC),
                background_inactive_color=Color(0x333333),
            )
            self.layout.add(self.__titlebar, fill=True)

        self.errorpanel = ExceptionPanel(self, title, exception,
                                         background_color, text_color)
        self.layout.add(self.errorpanel, fill=True, expand=True)

        # FIXME: For frozen version, we might want to clean up the file
        # references, so absolute paths from the development host is removed.
        text = f"{exception}\n\n{backtrace}"

        self.textarea = TextArea(
            self,
            text=text,
            read_only=True,
            border=False,
            text_color=Color(0xFFFFFF),
            background_color=background_color,
            padding=20,
        )
        self.textarea.set_min_size((640, 320))
        # FIXME: Include a suitable fixed-with font with the launcher and use
        # that? This font might not be available.
        self.textarea.set_font(Font("Courier New", 14))
        self.textarea.scroll_to_start()
        self.layout.add(self.textarea, fill=True, expand=True)