~comcloudway/melon

8c2a3b3819ee022f4ef116d02c53fcf81566bc7c — Jakob Meier a month ago 0ac93c8 main
Replace & with & in ActionRow title and description
M melon/browse/__init__.py => melon/browse/__init__.py +2 -2
@@ 32,8 32,8 @@ class BrowseScreen(Adw.NavigationPage):
            )
            for server in servers:
                row = Adw.ActionRow()
                row.set_title(server["name"])
                row.set_subtitle(server["description"])
                row.set_title(server["name"].replace("&", "&"))
                row.set_subtitle(server["description"].replace("&", "&"))
                icon = Adw.Avatar()
                icon.set_custom_image(
                    Gdk.Texture.new_from_filename(server["logo_path"])

M melon/browse/channel.py => melon/browse/channel.py +2 -2
@@ 49,7 49,7 @@ class BrowseChannelScreen(Adw.NavigationPage):
            if feed.id == feed_id:
                feed_name = feed.name
                break
        self.results.set_title(feed_name)
        self.results.set_title(feed_name.replace("&", "&"))
        spinner = Gtk.Spinner()
        spinner.set_size_request(20, 20)
        spinner.start()


@@ 79,7 79,7 @@ class BrowseChannelScreen(Adw.NavigationPage):
        self.scrollview.set_child(self.box)

        # update meta
        self.set_title(unidecode(self.channel.name))
        self.set_title(unidecode(self.channel.name).replace("&", "&"))
        self.about.set_title(unidecode(self.channel.name).replace("&", "&"))
        self.about.set_description(unidecode(self.channel.bio).replace("&", "&"))


M melon/browse/playlist.py => melon/browse/playlist.py +5 -3
@@ 50,9 50,11 @@ class BrowsePlaylistScreen(Adw.NavigationPage):
        # base layout
        self.box = Adw.PreferencesPage()
        self.about = Adw.PreferencesGroup()
        self.about.set_title(unidecode(self.playlist.title))
        self.about.set_description(unidecode(self.playlist.description))
        self.set_title(self.playlist.title)
        self.about.set_title(unidecode(self.playlist.title).replace("&", "&"))
        self.about.set_description(
            unidecode(self.playlist.description).replace("&", "&")
        )
        self.set_title(self.playlist.title.replace("&", "&"))

        self.results = None
        self.scrollview.set_child(self.box)

M melon/browse/search.py => melon/browse/search.py +1 -1
@@ 41,7 41,7 @@ class GlobalSearchScreen(Adw.NavigationPage):
            instance = get_server_instance(server)
            results = instance.search(self.text, self.search_mode)
            box = Adw.ExpanderRow()
            box.set_title(instance.name)
            box.set_title(instance.name.replace("&", "&"))
            box.set_subtitle(_("No results"))
            count = len(results)
            box.set_subtitle(

M melon/browse/server.py => melon/browse/server.py +2 -2
@@ 112,7 112,7 @@ class Search(ViewStackPage):
        if self.query != "":
            desc = _("Try using a different query")
        self.query = ""
        self.results.set_description(desc)
        self.results.set_description(desc.replace("&", "&"))
        self.results.set_icon_name("weather-few-clouds-night-symbolic")
        self.inner.append(self.results)



@@ 188,7 188,7 @@ class BrowseServerScreen(Adw.NavigationPage):
    def __init__(self, id, window=None, *args, **kwargs):
        super().__init__(*args, **kwargs)
        server = get_servers_list()[id]
        self.set_title(server["name"])
        self.set_title(server["name"].replace("&", "&"))
        self.instance = get_server_instance(server)

        # main stack view

M melon/import_providers/utils.py => melon/import_providers/utils.py +1 -1
@@ 7,7 7,7 @@ class ImportPicker(Gtk.FileDialog):

    def __init__(self, provider: ImportProvider, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.set_title(provider.picker_title)
        self.set_title(provider.picker_title.replace("&", "&"))
        self.set_modal(True)
        self.provider = provider


M melon/importer.py => melon/importer.py +4 -4
@@ 40,13 40,13 @@ class ImporterScreen(Adw.NavigationPage):
            if len(providers) == 0:
                continue
            group = Adw.PreferencesGroup()
            group.set_title(server["name"])
            group.set_description(server["description"])
            group.set_title(server["name"].replace("&", "&"))
            group.set_description(server["description"].replace("&", "&"))
            for provider in providers:
                count += 1
                row = Adw.ActionRow()
                row.set_title(provider.title)
                row.set_subtitle(provider.description)
                row.set_title(provider.title.replace("&", "&"))
                row.set_subtitle(provider.description.replace("&", "&"))
                row.add_suffix(Gtk.Image.new_from_icon_name("go-next-symbolic"))
                row.set_activatable(True)
                row.connect("activated", pass_me(self.do_import, provider))

M melon/player/__init__.py => melon/player/__init__.py +1 -1
@@ 21,7 21,7 @@ class PlayerScreen(Adw.NavigationPage):
        Gtk.UriLauncher.new(uri=self.video.url).launch()

    def display_info(self):
        self.set_title(self.video.title)
        self.set_title(self.video.title.replace("&", "&"))
        self.scrollview.set_child(self.box)
        # video details
        self.about = Adw.PreferencesGroup()

M melon/player/playlist.py => melon/player/playlist.py +4 -2
@@ 200,8 200,10 @@ class PlaylistPlayerScreen(PlayerScreen):

    def display_control(self):
        self.ctr_group = Adw.PreferencesGroup()
        self.ctr_group.set_title(self.playlist.inner.title)
        self.ctr_group.set_description(self.playlist.inner.description)
        self.ctr_group.set_title(self.playlist.inner.title.replace("&", "&"))
        self.ctr_group.set_description(
            self.playlist.inner.description.replace("&", "&")
        )

        # if the video isn't the first
        # show a previous button

M melon/playlist/__init__.py => melon/playlist/__init__.py +3 -3
@@ 43,7 43,7 @@ class LocalPlaylistScreen(Adw.NavigationPage):
    def update(self):
        playlist = self.playlist

        self.set_title(playlist.title)
        self.set_title(playlist.title.replace("&", "&"))

        self.header_bar = Adw.HeaderBar()



@@ 85,8 85,8 @@ class LocalPlaylistScreen(Adw.NavigationPage):
            self.box = Adw.PreferencesPage()
            # create data group
            group = Adw.PreferencesGroup()
            group.set_title(unidecode(playlist.title))
            group.set_description(unidecode(playlist.description))
            group.set_title(unidecode(playlist.title).replace("&", "&"))
            group.set_description(unidecode(playlist.description).replace("&", "&"))
            group.set_header_suffix(edit_button)
            app_conf = get_app_settings()
            self.box.add(group)

M melon/settings/__init__.py => melon/settings/__init__.py +2 -2
@@ 112,8 112,8 @@ class SettingsScreen(Adw.NavigationPage):
        # generate preferencesgroups for every server
        for server_id, server in get_servers_list().items():
            group = Adw.PreferencesGroup()
            group.set_title(server["name"])
            group.set_description(server["description"])
            group.set_title(server["name"].replace("&", "&"))
            group.set_description(server["description"].replace("&", "&"))
            instance = get_server_instance(server)
            epref = Preference(
                "server-enabled",

M melon/widgets/feeditem.py => melon/widgets/feeditem.py +1 -1
@@ 167,7 167,7 @@ class AdaptiveFeedItem(Adw.ActionRow):
        # add predefined list before custom menu entries and add them
        for dt in predefined + self.menuitems:
            row = Adw.ActionRow()
            row.set_title(dt[0])
            row.set_title(dt[0].replace("&", "&"))
            row.set_activatable(True)
            # run callback & close dialog on click
            row.connect(

M melon/widgets/preferencerow.py => melon/widgets/preferencerow.py +14 -14
@@ 18,8 18,8 @@ class PreferenceRow:
        if pref.type is PreferenceType.TOGGLE:
            # implemented as Switch Row
            self.widget = Adw.SwitchRow()
            self.widget.set_title(pref.name)
            self.widget.set_subtitle(pref.description)
            self.widget.set_title(pref.name.replace("&", "&"))
            self.widget.set_subtitle(pref.description.replace("&", "&"))
            self.widget.set_active(pref.value)
            self.widget.connect(
                "notify::active",


@@ 28,8 28,8 @@ class PreferenceRow:
        elif pref.type is PreferenceType.DROPDOWN:
            # implemented as Combo Row
            self.widget = Adw.ComboRow()
            self.widget.set_title(pref.name)
            self.widget.set_subtitle(pref.description)
            self.widget.set_title(pref.name.replace("&", "&"))
            self.widget.set_subtitle(pref.description.replace("&", "&"))
            opts = pref.default
            model = Gtk.StringList.new(opts)
            self.widget.set_model(model)


@@ 45,7 45,7 @@ class PreferenceRow:
                self.widget = Adw.EntryRow()
            else:
                self.widget = Adw.PasswordEntryRow()
            self.widget.set_title(pref.name)
            self.widget.set_title(pref.name.replace("&", "&"))
            self.widget.set_tooltip_text(pref.description)
            self.widget.set_text(pref.value)
            self.widget.connect(


@@ 55,8 55,8 @@ class PreferenceRow:
            # implemented as Spin Row
            # BUG: wont accept any input
            self.widget = Adw.SpinRow()
            self.widget.set_title(pref.name)
            self.widget.set_subtitle(pref.description)
            self.widget.set_title(pref.name.replace("&", "&"))
            self.widget.set_subtitle(pref.description.replace("&", "&"))
            self.current_value = float(pref.value)
            self.widget.set_value(self.current_value)
            self.widget.connect(


@@ 67,8 67,8 @@ class PreferenceRow:
            self.widget.connect(lambda v: self.pass_to_callback(v))
        elif pref.type is PreferenceType.HIDDEN:
            self.widget = Adw.ActionRow()
            self.widget.set_title(pref.name)
            self.widget.set_subtitle(pref.description)
            self.widget.set_title(pref.name.replace("&", "&"))
            self.widget.set_subtitle(pref.description.replace("&", "&"))
            reset_btn = IconButton(
                "", "object-rotate-left-symbolic", tooltip=_("Reset value")
            )


@@ 78,8 78,8 @@ class PreferenceRow:
        else:
            # shouldn't be reachable
            self.widget = Adw.ActionRow()
            self.widget.set_title(pref.name)
            self.widget.set_subtitle(pref.description)
            self.widget.set_title(pref.name.replace("&", "&"))
            self.widget.set_subtitle(pref.description.replace("&", "&"))

    def pass_to_callback(self, value):
        if value == self.current_value:


@@ 124,15 124,15 @@ class MultiRow(Adw.PreferencesRow):
        self.inner.set_margin_start(padding)
        self.inner.set_margin_end(padding)
        self.set_child(self.inner)
        self.inner.set_title(self.pref.name)
        self.inner.set_description(self.pref.description)
        self.inner.set_title(self.pref.name.replace("&", "&"))
        self.inner.set_description(self.pref.description.replace("&", "&"))
        self.adder = IconButton(_("Add"), "list-add-symbolic")
        self.adder.connect("clicked", lambda x: self.open_add())
        self.inner.set_header_suffix(self.adder)
        # create items list
        for index, item in enumerate(self.values):
            row = Adw.ActionRow()
            row.set_title(item)
            row.set_title(item.replace("&", "&"))
            drag_source = Gtk.DragSource()
            drag_source.set_content(
                Gdk.ContentProvider.new_union(