import qs.services import qs.modules.common import qs.modules.common.widgets import QtQuick import QtQuick.Controls import QtQuick.Layouts import Qt5Compat.GraphicalEffects import Qt.labs.synchronizer Item { id: root required property var scopeRoot property int sidebarPadding: 10 anchors.fill: parent property bool aiChatEnabled: Config.options.policies.ai !== 0 property bool translatorEnabled: Config.options.sidebar.translator.enable property bool animeEnabled: Config.options.policies.weeb !== 0 property bool animeCloset: Config.options.policies.weeb === 2 property var tabButtonList: [ ...(root.aiChatEnabled ? [{"icon": "neurology", "name": Translation.tr("Intelligence")}] : []), ...(root.translatorEnabled ? [{"icon": "translate", "name": Translation.tr("Translator")}] : []), ...((root.animeEnabled && !root.animeCloset) ? [{"icon": "bookmark_heart", "name": Translation.tr("Anime")}] : []) ] property int tabCount: swipeView.count function focusActiveItem() { swipeView.currentItem.forceActiveFocus() } Keys.onPressed: (event) => { if (event.modifiers === Qt.ControlModifier) { if (event.key === Qt.Key_PageDown) { swipeView.incrementCurrentIndex() event.accepted = true; } else if (event.key === Qt.Key_PageUp) { swipeView.decrementCurrentIndex() event.accepted = true; } } } ColumnLayout { anchors { fill: parent margins: sidebarPadding } spacing: sidebarPadding Toolbar { Layout.alignment: Qt.AlignHCenter enableShadow: false ToolbarTabBar { id: tabBar Layout.alignment: Qt.AlignHCenter tabButtonList: root.tabButtonList currentIndex: swipeView.currentIndex } } Rectangle { Layout.fillWidth: true Layout.fillHeight: true implicitWidth: swipeView.implicitWidth implicitHeight: swipeView.implicitHeight radius: Appearance.rounding.normal color: Appearance.colors.colLayer1 SwipeView { // Content pages id: swipeView anchors.fill: parent spacing: 10 currentIndex: tabBar.currentIndex clip: true layer.enabled: true layer.effect: OpacityMask { maskSource: Rectangle { width: swipeView.width height: swipeView.height radius: Appearance.rounding.small } } contentChildren: [ ...((root.aiChatEnabled || (!root.translatorEnabled && !root.animeEnabled)) ? [aiChat.createObject()] : []), ...(root.translatorEnabled ? [translator.createObject()] : []), ...(root.animeEnabled ? [anime.createObject()] : []) ] } } Component { id: aiChat AiChat {} } Component { id: translator Translator {} } Component { id: anime Anime {} } } }