Unreal Engine Marketplace Additional Asset Filters

A Tampermonkey userscript to add additional asset filters to the Unreal Engine Marketplace

目前為 2022-05-03 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Unreal Engine Marketplace Additional Asset Filters
// @namespace    https://github.com/Drakmyth/ue-marketplace-filters
// @version      0.1
// @author       Drakmyth
// @description  A Tampermonkey userscript to add additional asset filters to the Unreal Engine Marketplace
// @homepage     https://github.com/Drakmyth/ue-marketplace-filters
// @supportURL   https://github.com/Drakmyth/ue-marketplace-filters/issues
// @license      MIT
// @match        https://www.unrealengine.com/marketplace/*
// @run-at       document-body
// @grant        none
// ==/UserScript==

(function() {
    `use strict`;

    var hideOwned = false;
    var hideExternal = false;

    function doControlsExist() {
        var sortContainer = getSortContainer();
        return sortContainer.querySelector(`span.filter-controls`);
    }

    function addControls() {
        var controlsElement = document.createElement(`span`);
        controlsElement.className = `filter-controls`;

        var hideOwnedCheckbox = createCheckbox(`Hide Owned`, hideOwned, toggleHideOwned);
        controlsElement.appendChild(hideOwnedCheckbox);

        var hideExternalCheckbox = createCheckbox(`Hide External`, hideExternal, toggleHideExternal);
        controlsElement.appendChild(hideExternalCheckbox);

        var sortContainer = getSortContainer();
        sortContainer.appendChild(controlsElement);
    }

    function getSortContainer() {
        return document.getElementsByClassName(`sort-select`)[0];
    }

    function createCheckbox(text, initial, onChange) {
        var labelElement = document.createElement(`label`);
        labelElement.style.marginLeft = `5px`;
        labelElement.style.marginRight = `5px`;

        var checkboxElement = document.createElement(`input`);
        checkboxElement.type = `checkbox`;
        checkboxElement.checked = initial;
        checkboxElement.style.marginRight = `3px`;
        checkboxElement.addEventListener(`change`, onChange);
        labelElement.appendChild(checkboxElement);

        var textElement = document.createTextNode(text);
        labelElement.appendChild(textElement);

        return labelElement;
    }

    function toggleHideOwned(event) {
        hideOwned = event.target.checked;
        onBodyChange();
    }

    function toggleHideExternal(event) {
        hideExternal = event.target.checked;
        onBodyChange();
    }

    function isContainerOwned(container) {
        return container.querySelector(`article.asset--owned`);
    }

    function isContainerExternal(container) {
        return !container.querySelector(`span.btn`);
    }

    function onBodyChange(mut) {

        if (!doControlsExist()) {
            addControls();
        }

        var assetContainers = document.getElementsByClassName(`asset-container`);

        for (let container of assetContainers) {
            var isOwned = isContainerOwned(container);
            var isExternal = isContainerExternal(container);
            if ((hideOwned && isOwned) || (hideExternal && isExternal)) {
                container.style.display = `none`;
            } else {
                container.style.display = null;
            }
        }
    }


    var mo = new MutationObserver(onBodyChange);
    mo.observe(document.body, {childList: true, subtree: true});
})();