Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
lutris / usr / lib / python3 / dist-packages / lutris / gui / views / flowbox.py
Size: Mime:
"""Unused flowbox view (most code removed)"""
# Third Party Libraries
from gi.repository import Gdk, GObject, Gtk

# Lutris Modules
from lutris.game import Game
from lutris.gui.widgets.utils import get_pixbuf_for_game

try:
    FlowBox = Gtk.FlowBox
    FLOWBOX_SUPPORTED = True
except AttributeError:
    FlowBox = object
    FLOWBOX_SUPPORTED = False


class GameItem(Gtk.VBox):

    def __init__(self, game, parent, icon_type="banner"):
        super(GameItem, self).__init__()

        self.icon_type = icon_type

        self.parent = parent
        self.game = Game(game["id"])
        self.id = game["id"]
        self.name = game["name"]
        self.slug = game["slug"]
        self.runner = game["runner"]
        self.platform = game["platform"]
        self.installed = game["installed"]

        image = self.get_image()
        self.pack_start(image, False, False, 0)
        label = self.get_label()
        self.pack_start(label, False, False, 0)

        self.connect("button-press-event", self.popup_contextual_menu)
        self.show_all()

    def get_image(self):
        # For some reason, button-press-events are not registered by the image
        # so it needs to be wrapped in an EventBox
        eventbox = Gtk.EventBox()
        self.image = Gtk.Image()
        self.set_image_pixbuf()
        eventbox.add(self.image)
        return eventbox

    def set_image_pixbuf(self):
        pixbuf = get_pixbuf_for_game(self.slug, self.icon_type, self.installed)
        self.image.set_from_pixbuf(pixbuf)

    def get_label(self):
        self.label = Gtk.Label(self.name)
        self.label.set_size_request(184, 40)

        if self.icon_type == "banner":
            self.label.set_max_width_chars(20)
        else:
            self.label.set_max_width_chars(15)

        self.label.set_property("wrap", True)
        self.label.set_justify(Gtk.Justification.CENTER)
        self.label.set_halign(Gtk.Align.CENTER)
        eventbox = Gtk.EventBox()
        eventbox.add(self.label)
        return eventbox

    def set_label_text(self, text):
        self.label.set_text(text)

    def popup_contextual_menu(self, widget, event):
        if event.button != 3:
            return
        self.parent.popup_contextual_menu(event, self)


class GameFlowBox(FlowBox):
    __gsignals__ = {
        "game-selected": (GObject.SIGNAL_RUN_FIRST, None, ()),
        "game-activated": (GObject.SIGNAL_RUN_FIRST, None, ()),
        "remove-game": (GObject.SIGNAL_RUN_FIRST, None, ()),
    }

    def __init__(self, game_list, icon_type="banner", filter_installed=False):
        super(GameFlowBox, self).__init__()

        self.set_valign(Gtk.Align.START)

        self.connect("child-activated", self.on_child_activated)
        self.connect("selected-children-changed", self.on_selection_changed)
        self.connect("key-press-event", self.handle_key_press)

        self.set_filter_func(self.filter_func)
        self.set_sort_func(self.sort_func)
        self.set_activate_on_single_click(False)
        self.set_max_children_per_line(1)
        self.set_max_children_per_line(20)

        self.contextual_menu = None

        self.icon_type = icon_type

        self.filter_text = ""
        self.filter_runner = None
        self.filter_platform = None
        self.filter_installed = filter_installed

        self.game_list = game_list

    @property
    def selected_game(self):
        """Because of shitty naming conventions in previous Game views, this
        returns an id and not a game.
        """
        children = self.get_selected_children()
        if not children:
            return None
        game_item = children[0].get_children()[0]
        return game_item.game.id

    def filter_func(self, child):
        game = child.get_children()[0]
        if self.filter_installed:
            if not game.installed:
                return False
        if self.filter_text:
            if self.filter_text.lower() not in game.name.lower():
                return False
        if self.filter_runner:
            if self.filter_runner != game.runner:
                return False
        if self.filter_platform:
            if not game.game.runner:
                return False
            if self.filter_platform != game.game.platform:
                return False
        return True

    @staticmethod
    def sort_func(child1, child2):
        game1 = child1.get_children()[0]
        game2 = child2.get_children()[0]
        if game1.name.lower() > game2.name.lower():
            return 1
        if game1.name.lower() < game2.name.lower():
            return -1
        return 0

    def on_child_activated(self, widget, child):
        self.emit("game-activated")

    def on_selection_changed(self, widget):
        self.emit("game-selected")

    def get_child(self, game_item):
        for child in self.get_children():
            widget = child.get_children()[0]
            if widget == game_item:
                return child

    def set_selected_game(self, game_id):
        for game in self.game_list:
            if game["id"] == game_id:
                self.select_child(self.get_child(game["item"]))

    def popup_contextual_menu(self, event, widget):
        self.select_child(self.get_child(widget))
        self.contextual_menu.popup(event, game=widget.game)

    def handle_key_press(self, widget, event):
        if not self.selected_game:
            return
        key = event.keyval
        if key == Gdk.KEY_Delete:
            self.emit("remove-game")