/* * Copyright (C) 2015 Marco Martin * Copyright (C) 2018 Eike Hein * Copyright (C) 2021 Harald Sitter * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ import QtQuick 2.1 import QtQuick.Layouts 1.1 import QtQuick.Controls 2.3 as QtControls import org.kde.kirigami 2.5 as Kirigami import org.kde.plasma.core 2.1 as PlasmaCore import org.kde.kcm 1.2 ScrollViewKCM { id: root ConfigModule.quickHelp: i18n("Language") implicitWidth: Kirigami.Units.gridUnit * 25 implicitHeight: Kirigami.Units.gridUnit * 25 Component { id: addLanguageItemComponent Kirigami.BasicListItem { id: languageItem property string languageCode: model.LanguageCode width: availableLanguagesList.width reserveSpaceForIcon: false label: model.display checkable: true onCheckedChanged: { if (checked) { addLanguagesSheet.selectedLanguages.push(index); // There's no property change notification for pushing to an array // in a var prop, so we can't bind selectedLanguages.length to // addLanguagesButton.enabled. addLanguagesButton.enabled = true; } else { addLanguagesSheet.selectedLanguages = addLanguagesSheet.selectedLanguages.filter(function(item) { return item !== index }); // There's no property change notification for pushing to an array // in a var prop, so we can't bind selectedLanguages.length to // addLanguagesButton.enabled. if (!addLanguagesSheet.selectedLanguages.length) { addLanguagesButton.enabled = false; } } } data: [Connections { target: addLanguagesSheet function onSheetOpenChanged() { languageItem.checked = false } }] } } Kirigami.OverlaySheet { id: addLanguagesSheet parent: root.parent topPadding: 0 leftPadding: 0 rightPadding: 0 bottomPadding: 0 header: Kirigami.Heading { text: i18nc("@title:window", "Add Languages") } property var selectedLanguages: [] onSheetOpenChanged: selectedLanguages = [] ListView { id: availableLanguagesList implicitWidth: 18 * Kirigami.Units.gridUnit model: kcm.availableTranslationsModel delegate: addLanguageItemComponent } footer: RowLayout { QtControls.Button { id: addLanguagesButton Layout.alignment: Qt.AlignHCenter text: i18nc("@action:button", "Add") enabled: false onClicked: { var langs = kcm.selectedTranslationsModel.selectedLanguages.slice(); addLanguagesSheet.selectedLanguages.sort().forEach(function(index) { langs.push(kcm.availableTranslationsModel.langCodeAt(index)); }); kcm.selectedTranslationsModel.selectedLanguages = langs; addLanguagesSheet.sheetOpen = false; } } } } header: ColumnLayout { id: messagesLayout spacing: Kirigami.Units.largeSpacing Kirigami.InlineMessage { Layout.fillWidth: true type: Kirigami.MessageType.Error text: i18nc("@info", "There are no additional languages available on this system.") visible: !availableLanguagesList.count } Kirigami.InlineMessage { Layout.fillWidth: true type: kcm.everSaved ? Kirigami.MessageType.Positive : Kirigami.MessageType.Information text: (kcm.everSaved ? i18nc("@info", "Your changes will take effect the next time you log in.") : i18nc("@info", "There are currently no preferred languages configured.")) visible: !languagesList.count || kcm.everSaved } Kirigami.InlineMessage { Layout.fillWidth: true type: Kirigami.MessageType.Error text: { // Don't eval the i18ncp call when we have no missing languages. It causes unnecesssary warnings // as %2 will be "" and thus considered missing. if (!visible) { return "" } i18ncp("@info %2 is the language code", "The translation files for the language with the code '%2' could not be found. The language will be removed from your configuration. If you want to add it back, please install the localization files for it and add the language again.", "The translation files for the languages with the codes '%2' could not be found. These languages will be removed from your configuration. If you want to add them back, please install the localization files for it and add the languages again.", kcm.selectedTranslationsModel.missingLanguages.length, kcm.selectedTranslationsModel.missingLanguages.join(i18nc("@info separator in list of language codes", "', '"))) } visible: kcm.selectedTranslationsModel.missingLanguages.length > 0 } QtControls.Label { Layout.fillWidth: true visible: languagesList.count text: i18n("The language at the top of this list is the one you want to see and use most often.") wrapMode: Text.WordWrap } } Component { id: languagesListItemComponent Item { width: ListView.view.width height: listItem.implicitHeight Kirigami.SwipeListItem { id: listItem contentItem: RowLayout { Kirigami.ListItemDragHandle { listItem: listItem listView: languagesList onMoveRequested: kcm.selectedTranslationsModel.move(oldIndex, newIndex) } QtControls.BusyIndicator { visible: model.IsInstalling running: visible // the control style (e.g. org.kde.desktop) may force a padding that will shrink the indicator way down. ignore it. padding: 0 Layout.alignment: Qt.AlignVCenter implicitWidth: Kirigami.Units.iconSizes.small implicitHeight: implicitWidth QtControls.ToolTip { text: xi18nc('@info:tooltip/rich', 'Installing missing packages to complete this translation.') } } Kirigami.Icon { visible: model.IsIncomplete Layout.alignment: Qt.AlignVCenter implicitWidth: Kirigami.Units.iconSizes.small implicitHeight: implicitWidth source: "data-warning" color: Kirigami.Theme.negativeTextColor MouseArea { id: area anchors.fill: parent hoverEnabled: true } QtControls.ToolTip { visible: area.containsMouse text: xi18nc('@info:tooltip/rich', `Not all translations for this language are installed. Use the Install Missing Packages button to download and install all missing packages.`) } } Kirigami.Icon { visible: model.IsMissing Layout.alignment: Qt.AlignVCenter implicitWidth: Kirigami.Units.iconSizes.smallMedium implicitHeight: implicitWidth source: "error" color: Kirigami.Theme.negativeTextColor } QtControls.Label { Layout.fillWidth: true Layout.alignment: Qt.AlignVCenter text: switch(index){ // Don't assing undefind to string if the index is invalid. case -1: ""; break; case 0: i18nc("@item:inlistbox 1 = Language name", "%1 (Default)", model.display); break; default: model.display; break; } color: (model.IsMissing ? Kirigami.Theme.negativeTextColor : (listItem.checked || (listItem.pressed && !listItem.checked && !listItem.sectionDelegate) ? listItem.activeTextColor : listItem.textColor)) } } actions: [ Kirigami.Action { visible: model.IsIncomplete iconName: "install" tooltip: i18nc("@info:tooltip", "Install Missing Packages") onTriggered: kcm.selectedTranslationsModel.completeLanguage(index) }, Kirigami.Action { enabled: !model.IsMissing && index > 0 visible: languagesList.count > 1 iconName: "go-top" tooltip: i18nc("@info:tooltip", "Promote to default") onTriggered: kcm.selectedTranslationsModel.move(index, 0) }, Kirigami.Action { property bool removing: false enabled: removing || !model.IsMissing iconName: "edit-delete" visible: languagesList.count > 1 tooltip: i18nc("@info:tooltip", "Remove") onTriggered: { removing = true; // Don't crash by re-evaluating `enabled` during destruction. kcm.selectedTranslationsModel.remove(model.LanguageCode); } }] } } } view: ListView { id: languagesList model: kcm.selectedTranslationsModel delegate: languagesListItemComponent } footer: RowLayout { id: footerLayout QtControls.Button { Layout.alignment: Qt.AlignRight enabled: availableLanguagesList.count text: i18nc("@action:button", "Add languages…") onClicked: addLanguagesSheet.sheetOpen = !addLanguagesSheet.sheetOpen checkable: true checked: addLanguagesSheet.sheetOpen } } }