import QtQuick 2.0 import QtQml.Models 2.1 import QtQuick.Layouts 1.3 import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.4 import QtGraphicalEffects 1 import QtQuick.Window 2 import Qt.labs.settings 1.0 import QtQuick.Dialogs 1.1 Rectangle { id: box //width: 1000 * Screen.devicePixelRatio; height: 650 * Screen.devicePixelRatio property alias view: view //: For Right to Left language, set this string to RTL, else keep it untranslated property var direction: qsTr("LTR") LayoutMirroring.enabled: (direction == "LTR" ? false : true) // for tests //LayoutMirroring.enabled: true // TO-DO GridLayout RowLayout are not sensible to mirroring, change to other layout tools LayoutMirroring.childrenInherit: true Settings { property alias width: box.width property alias height: box.height } Component { id: slidebackground LinearGradient { start: Qt.point(0, 0) end: Qt.point(0, box.height) gradient: Gradient { GradientStop { position: 1.0; color: "#2397D4" } GradientStop { position: 0.0; color: "#262F45" } } } } Rectangle { id: banner opacity: 0.95 layer.enabled: true width: parent.width;height: 120 LinearGradient { anchors.fill: parent start: Qt.point(0, 0) end: Qt.point(0, 400) gradient: Gradient { GradientStop { position: 0.0; color: "lightgray" } GradientStop { position: 1.0; color: "white" } } } Image { anchors.fill: parent anchors.bottomMargin: 10 anchors.topMargin: 10 source: "img/mageia-2013-black-alpha.png" fillMode: Image.PreserveAspectFit } } Rectangle { id: slideshow property Item displayItem: null anchors {left: parent.left; top: buttonbox.bottom; bottom: parent.bottom; right: parent.right} color: "#2397D4" width: parent.width ObjectModel { id: itemModel // Welcome page Rectangle { //: the button in buttons bar property var title: qsTr("Welcome") width: view.width; height: view.height Loader { sourceComponent: slidebackground ; anchors.fill: parent} Column { anchors.centerIn: parent anchors.verticalCenter: parent.verticalCenter Label { //: the %1 will be replaced with the user name anchors.horizontalCenter: parent.horizontalCenter horizontalAlignment: TextInput.AlignHCenter text: qsTr("Welcome to Mageia, %1").arg(user)+'\n' font.weight: Font.DemiBold font.pixelSize: Qt.application.font.pixelSize * 1.5 color: "white" } Label { horizontalAlignment: TextInput.AlignHCenter anchors.horizontalCenter: parent.horizontalCenter text: qsTr("We are going to guide you through a few important steps and help
you with the configuration of your newly installed system.

Now, click on Media sources to go to the first step."); textFormat: Text.RichText color: "white" } } } // Configure source page Rectangle { property var title: qsTr("Media sources") width: view.width; height: view.height Loader { sourceComponent: slidebackground ; anchors.fill: parent} Flickable { width: view.width; height: view.height contentWidth: gridRepo.width; contentHeight: gridRepo.height clip: true flickableDirection: Flickable.VerticalFlick GridLayout { id: gridRepo columns: 2 Label { Layout.columnSpan: 2 Layout.topMargin: 10 Layout.leftMargin: 10 text: qsTr("Configure software repositories"); font.bold: true; color: "white" } Label { Layout.columnSpan: 2 Layout.topMargin: 10 Layout.leftMargin: 10 text: qsTr("Mageia official repositories contain:"); color: "white" } Button {id: coreBg Layout.margins: 5 Layout.alignment: Qt.AlignTop Layout.fillWidth: true //height: Qt.application.font.pixelSize * 1.3 style: ButtonStyle { label: Label { horizontalAlignment: TextInput.AlignHCenter //: Should be as displayed in software manager, thus in general not translated text: qsTr("core"); font.bold: true; color: "black"; } background: Rectangle { LinearGradient { anchors.fill: parent start: Qt.point(0, 0) end: Qt.point(0, 20) gradient: Gradient { GradientStop { position: 0.0; color: "lightgreen" } GradientStop { position: 1.0; color: "green" } } } } } } Label { text: qsTr("- the free-open-source packages"); wrapMode: Text.WordWrap Layout.maximumWidth: slideshow.width -20 - coreBg.width color: "white" } Button { Layout.margins: 5 Layout.alignment: Qt.AlignTop Layout.fillWidth: true style: ButtonStyle { label: Label { horizontalAlignment: TextInput.AlignHCenter //: Should be as displayed in software manager, thus in general not translated text: qsTr("nonfree"); font.bold: true; color: "white"; } background: Rectangle { LinearGradient { anchors.fill: parent start: Qt.point(0, 0) end: Qt.point(0, 20) gradient: Gradient { GradientStop { position: 0.0; color: "red" } GradientStop { position: 1.0; color: "darkred" } } } } } } Label { width: parent.width text: qsTr("- closed-source programs, e.g. Nvidia proprietary drivers, non-free drivers for some Wi-Fi cards, etc"); Layout.maximumWidth: slideshow.width - 110 wrapMode: Text.WordWrap color: "white" } Button { Layout.margins: 5 Layout.alignment: Qt.AlignTop Layout.fillWidth: true style: ButtonStyle { label: Label { horizontalAlignment: TextInput.AlignHCenter //: Should be as displayed in software manager, thus in general not translated text: qsTr("tainted"); font.bold: true; color: "white"; } background: Rectangle { LinearGradient { anchors.fill: parent start: Qt.point(0, 0) end: Qt.point(0, 20) gradient: Gradient { GradientStop { position: 0.0; color: "red" } GradientStop { position: 1.0; color: "darkred" } } } } } } Label { text: qsTr("- these packages (eg audio and video codecs needed for certain multimedia files or commercial DVDs) may infringe on patents or copyright laws in certain countries. "); wrapMode: Text.WordWrap Layout.maximumWidth: slideshow.width -110 color: "white" } Button { Layout.margins: 5 Layout.alignment: Qt.AlignTop Layout.fillWidth: true style: ButtonStyle { label: Label { horizontalAlignment: TextInput.AlignHCenter //: Should be as displayed in software manager, thus in general not translated text: qsTr("backports"); font.bold: true; color: "black"; } background: Rectangle { LinearGradient { anchors.fill: parent start: Qt.point(0, 0) end: Qt.point(0, 20) gradient: Gradient { GradientStop { position: 0.0; color: "lightgray" } GradientStop { position: 1.0; color: "darkgray" } } } } } } Label { text: qsTr("- include new versions of packages, and new packages, that do not meet the updates policy."); wrapMode: Text.WordWrap Layout.maximumWidth: slideshow.width -110 color: "white" } Button { Layout.margins: 5 Layout.alignment: Qt.AlignTop Layout.fillWidth: true style: ButtonStyle { label: Label { horizontalAlignment: TextInput.AlignHCenter text: qsTr("Note! "); font.bold: true; color: "black"; } background: Rectangle { color: "#e6c200"; } } } Label { text: qsTr("If you enabled the online repositories during installation, some media sources should be installed already. Otherwise, we will now configure these online repositories. If this computer will have access to the Internet, you can delete the Local entry from the list of repositories."); wrapMode: Text.WordWrap textFormat: Text.RichText color: "white" Layout.fillWidth: true Layout.maximumWidth: slideshow.width - 110 } Label { text: qsTr("Now, please enable or disable the online repositories of your choice: click on the Edit software repositories button. Select at least the release and updates pair. Debug and Testing are for special cases.")+"
"+ qsTr("After you have checked and enabled the repositories you need, you can go to the next slide.") wrapMode: Text.WordWrap textFormat: Text.RichText color: "white" Layout.fillWidth: true Layout.maximumWidth: slideshow.width - 10 Layout.columnSpan: 2 Layout.margins: 10 } MButton { Layout.columnSpan: 2 Layout.alignment: Qt.AlignHCenter objectName: "launch" onMbuttonClicked: { launch.command(["drakrpm-edit-media",])} buttonText: qsTr("Edit software sources")+" *" } } } Label { anchors {top: parent.bottom; topMargin: 3; horizontalCenter: parent.left; horizontalCenterOffset: parent.width * .4 } text: qsTr("(*) Administrator password is needed.") Layout.maximumWidth: slideshow.width * .4 font.italic: true color: "white" } } // Update page Rectangle { property var title: qsTr("Update") width: view.width; height: view.height Loader { sourceComponent: slidebackground ; anchors.fill: parent} Column { spacing: 10 Label { text: qsTr("How Mageia manages updates"); font.bold: true; topPadding: 30 ; leftPadding: 20 color: "white"} Label { width: slideshow.width - 40 padding: 20 text: qsTr("Mageia provides software which may be updated in order to fix bugs or security issues. It is highly recommended that you update your system regularly. \ An Update icon will appear in your task bar when new updates are available. To run the updates, just click on the icon below and give your user password - or use the Software Manager (root password). \ This is a background process and you will be able to use your computer normally during the updates."+"\n"); wrapMode: Text.WordWrap color: "white" } MButton { anchors.horizontalCenter: parent.horizontalCenter objectName: "launch" onMbuttonClicked: { launch.command(["drakrpm-update",])} buttonText: qsTr("Check system updates")+" *" } MButton { anchors.horizontalCenter: parent.horizontalCenter objectName: "link" //: (en) indicates that the content of the link is in English onMbuttonClicked: { link.weblink("https://advisories.mageia.org/")} buttonText: qsTr("Advisories of updates (en)") } } Label { anchors {top: parent.bottom; topMargin: 3; horizontalCenter: parent.left; horizontalCenterOffset: parent.width * .4 } text: qsTr("(*) User password is needed") wrapMode: Text.WordWrap font.italic: true color: "white" } } // MCC Page Rectangle { //: The button in the buttons bar, shortcut for Mageia Control Center property var title: qsTr("MCC") width: view.width; height: view.height Loader { sourceComponent: slidebackground ; anchors.fill: parent} Column { x: 10; y: 30 spacing: 10 Label { text: qsTr("Mageia Control Center (aka drakconf) is a set of tools to help you configure your system.") width: view.width * 0.9 padding: 10 wrapMode: Text.WordWrap textFormat: Text.RichText color: "white" } Label { padding: 5 anchors.horizontalCenter: parent.horizontalCenter text: ""; wrapMode: Text.WordWrap;textFormat: Text.RichText color: "white" } MButton { anchors.horizontalCenter: parent.horizontalCenter objectName: "launch" onMbuttonClicked: { launch.command(["drakconf",])} buttonText: qsTr("Mageia Control Center")+" *" } MButton { anchors.horizontalCenter: parent.horizontalCenter objectName: "link" onMbuttonClicked: { link.weblink("https://www.mageia.org/doc")} buttonText: qsTr("MCC documentation") } } Label { anchors {top: parent.bottom; topMargin: 3; horizontalCenter: parent.left; horizontalCenterOffset: parent.width * .4 } text: qsTr("(*) Administrator password is needed") wrapMode: Text.WordWrap font.italic: true color: "white" } } // Install software page Rectangle { property var title: qsTr("Install software") width: view.width; height: view.height Loader { sourceComponent: slidebackground ; anchors.fill: parent} Column { Label { text: qsTr("Install and remove software") width: slideshow.width topPadding: 30; leftPadding: 20; padding: 10 font.bold: true wrapMode: Text.WordWrap color: "white" } Label { text: qsTr("With Mageia, you will find the software in the media repositories. Mageia users simply access these media via one of the Software Managers."); width: slideshow.width padding: 20 wrapMode: Text.WordWrap textFormat: Text.RichText color: "white" } MButton { anchors.left: parent.left; anchors.leftMargin: 20; width: slideshow.width * .35 objectName: "launch" onMbuttonClicked: { launch.command(["rpmdrake",])} buttonText: qsTr("RPMdrake")+" *" } Label { text: qsTr("The next slide shows a small selection of popular applications - any of which may be installed at this point.
"); width: slideshow.width padding: 20 wrapMode: Text.WordWrap textFormat: Text.RichText color: "white" } Label { text: qsTr("You can find a more detailed list here:"); width: slideshow.width padding: 20 wrapMode: Text.WordWrap textFormat: Text.RichText color: "white" } MButton { anchors.left: parent.left; anchors.leftMargin: 20 width: slideshow.width * .35 objectName: "link" //: Translate only if the link is to a specific page for your language onMbuttonClicked: { link.weblink(qsTr("https://wiki.mageia.org/en/List_of_applications"))} buttonText: qsTr("List of applications (wiki)") } } Label { anchors {top: parent.bottom; topMargin: 3; horizontalCenter: parent.left; horizontalCenterOffset: parent.width * .4 } text: qsTr("(*) Administrator password is needed") wrapMode: Text.WordWrap font.italic: true color: "white" } } // Applications page function update_list(group) { appListDM.items.remove(0,appListDM.count ); var rowCount = appList.count; for( var i = 0;i < rowCount;i++ ) { var entry = appList.get(i); var pattern = new RegExp(group, "g"); if(pattern.test(entry.group) && !pyinstallable.other(entry.name, entry.repo)) { appListDM.items.insert(entry, "group"); } } for(var child in applicationsListView.contentItem.children) { if (applicationsListView.contentItem.children[child].naturalwidth > softListRect.installwidth ) { softListRect.installwidth = applicationsListView.contentItem.children[child].naturalwidth } } appListDM.filterOnGroup = "items"; } Rectangle { property var title: qsTr("Applications") width: view.width; height: view.height Loader { sourceComponent: slidebackground ; anchors.fill: parent} Column { Rectangle { // warning banner id: warning width: view.width height: warnText.height color: "gold" Label { id: warnText width: view.width horizontalAlignment: TextInput.AlignHCenter font.pixelSize: Qt.application.font.pixelSize * .9 text: qsTr("Here is a small selection of popular applications - any of which may be installed or launched at this point.")+"
"+qsTr("Ensure that you have enabled the Media sources.") textFormat: Text.RichText wrapMode: Text.WordWrap color: "black" font.weight: Font.DemiBold } } Item { width: row.width height: 200 Row { id: row // Under the warning // Software categories Component { //The hightlight id: catHighlight Rectangle { width: categoriesList.width height: Qt.application.font.pixelSize + 16 color: "#262F45" y: categoriesList.currentItem.y; } } ListView { id:categoriesList width: 190 highlight: catHighlight highlightFollowsCurrentItem: false focus: true model: [{'name': qsTr("Featured"), 'group': "featured"}, {'name': qsTr("Games"),'group': "games"}, {'name':qsTr("Internet"),'group': "internet"}, {'name':qsTr("Video"),'group': "video"}, {'name':qsTr("Audio"),'group': "audio"}, {'name':qsTr("Office"),'group': "office"}, {'name':qsTr("Graphics"),'group': "graphics"}, {'name':qsTr("System"),'group': "system"}, {'name':qsTr("Programming"),'group': "programming"}] height: (Qt.application.font.pixelSize + 16) * 9 delegate: Rectangle{ property variant myGroup: modelData.group width: parent.width height: Qt.application.font.pixelSize + 16 color:"#20FFFFFF" Label {id: catLabel; anchors.horizontalCenter: parent.horizontalCenter text: modelData.name ; padding: 7 color: "white" } MouseArea { anchors.centerIn: parent width: parent.width height: 25 onClicked: { categoriesList.currentIndex = index; itemModel.update_list(modelData.group); } } } } Rectangle { // Software list id: softListRect height: view.height width: view.width - categoriesList.width color: "transparent" // the width of install and Launch button will be calculated then updated. We give here a minimal size property real installwidth: Qt.application.font.pixelSize * 2 DelegateModel { id: appListDM model: AppList {id: appList} groups: [ DelegateModelGroup { includeByDefault: false name: "group" } ] filterOnGroup: "group" Component.onCompleted: { var rowCount = appList.count; items.remove(0,rowCount); for( var i = 0;i < rowCount;i++ ) { var entry = appList.get(i); var pattern = /featured/g; if(pattern.test(entry.group) && !pyinstallable.other(entry.name, entry.repo) ) { items.insert(entry, "group"); } } // The lsit has to be painted first for buttons width evaluation applicationsListView.forceLayout() for(var child in applicationsListView.contentItem.children) { if (applicationsListView.contentItem.children[child].naturalwidth > softListRect.installwidth ) { softListRect.installwidth = applicationsListView.contentItem.children[child].naturalwidth } } console.log("Screen: ", Screen.devicePixelRatio, Screen.pixelDensity) } delegate: Row { spacing: 10 property int naturalwidth : optButton.item.implicitWidth Image { source: icon width: 32 height: 32 } //CheckBox{ enabled: installable //} Column{ Label { text: title font.weight: Font.DemiBold color: "white" } Label { text: description font.italic: true font.pixelSize: Qt.application.font.pixelSize * .9 width: view.width - (190 + 44 +38 + softListRect.installwidth + tag.width ) wrapMode: Text.WordWrap color: "white" } } Loader { id: optButton Component { id: button; Button { width: softListRect.installwidth; height: Qt.application.font.pixelSize * 1.3 objectName: "launch" onClicked: { launch.command(["gurpmi",name,])} style: ButtonStyle { label: Label { horizontalAlignment: TextInput.AlignHCenter verticalAlignment: TextInput.AlignVCenter text: qsTr("Install"); font.pixelSize: Qt.application.font.pixelSize * .8 color: "black" } } } } Component { id: launcher; Button { width: softListRect.installwidth; height: Qt.application.font.pixelSize * 1.3 objectName: "launch" onClicked: { launch.command([command,])} style: ButtonStyle { label: Label { horizontalAlignment: TextInput.AlignHCenter verticalAlignment: TextInput.AlignVCenter text: qsTr("Launch"); font.pixelSize: Qt.application.font.pixelSize * .8 color: "black" } } } } Component { id: dummy;Label {text: qsTr("Installed") padding: 2 horizontalAlignment: TextInput.AlignHCenter font.pixelSize: Qt.application.font.pixelSize * .8 width: softListRect.installwidth color: "white" } } sourceComponent: ( pyinstallable.installable(name, repo)) ? button : (command === "" ? dummy : launcher) } Loader { id: tag Component { id: repotag Rectangle { color: "#FF4C4C" radius: 3 width: Qt.application.font.pixelSize * 3.5; height: Qt.application.font.pixelSize * 1.3 Label { anchors.centerIn: parent text: repo font.pixelSize: Qt.application.font.pixelSize * .8 color: "white" } } } Component { id: dumm; Label { width: Qt.application.font.pixelSize * 3.5; text: " "}} sourceComponent: repo == "" ? dumm : repotag } } } Rectangle { height: view.height-warning.height width: view.width-200 color: "transparent" ListView { id: applicationsListView anchors.fill: parent clip: true model: appListDM spacing: 5 } } } } } } } // Configuration summary Page Rectangle { Version {id:version} property var title: qsTr("Your configuration") width: view.width; height: view.height Loader { sourceComponent: slidebackground ; anchors.fill: parent} Column { Rectangle{ height: 50 width:1 color:"transparent" } ListView { id: confList width: view.width height: view.height -150 model: ConfList delegate: Label { text: name leftPadding: 50 textFormat: Text.RichText color: "white" } } MButton { anchors.horizontalCenter: parent.horizontalCenter objectName: "launch" onMbuttonClicked: { about.open() } buttonText: qsTr("About") } MessageDialog { id: about title: qsTr("About Mageiawelcome") //: %1 will be replaced with the release number, %2 with author's names text: qsTr("Release %1
Authors : %2").arg(version.version).arg("Daniel Napora, Papoteur, Antony Baker
") //: replace with the list of translator's names detailedText: qsTr("Translators: English is the source language") standardButtons: StandardButton.Close } } } // Links page Rectangle { property var title: qsTr("More information") width: view.width; height: view.height Loader { sourceComponent: slidebackground ; anchors.fill: parent} Column { anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter Grid { columns: 3 spacing: view.width * .03 Label { horizontalAlignment: TextInput.AlignHCenter width: view.width * .2 text: qsTr("Documentation") wrapMode: Text.WordWrap font.bold: true color: "white" } Label { horizontalAlignment: TextInput.AlignHCenter width: view.width * .2 text: qsTr("Support") wrapMode: Text.WordWrap font.bold: true color: "white" } Label { horizontalAlignment: TextInput.AlignHCenter width: view.width * .2 text: qsTr("Community") wrapMode: Text.WordWrap font.bold: true color: "white" } Repeater{ model: [{'name': qsTr("Release notes"), 'url': //: Translate only if the link is to a specific page for your language qsTr("https://wiki.mageia.org/en/Mageia_7_Release_Notes")}, {'name': qsTr("Forums"),'url': //: Translate only if the link is to a specific page for your language qsTr("https://forums.mageia.org/en/")}, {'name': qsTr("Community Center"),'url': "https://www.mageia.org/community/"}, {'name': qsTr("Errata"), 'url': //: Translate only if the link is to a specific page for your language qsTr("https://wiki.mageia.org/en/Mageia_7_Errata")}, {'name': qsTr("Wiki"), 'url': //: Translate only if the link is to a specific page for your language qsTr("https://wiki.mageia.org/en/Documentation")}, {'name': qsTr("Contribute"),'url': "https://www.mageia.org/contribute/"}, {'name': qsTr("Newcomers Howto"),'url': //: Translate only if the link is to a specific page for your language qsTr("https://wiki.mageia.org/en/Newcomers_start_here")}, {'name': qsTr("Chat Room"), //: Translate only if the link is to a specific page for your language 'url': qsTr("irc://irc.freenode.net/#mageia")}, {'name': qsTr("Donations"),'url': "https://www.mageia.org/donate/"}, {'name': qsTr("Documentation"),'url': "https://www.mageia.org/doc/"}, {'name': qsTr("Bugs tracker"),'url': "https://bugs.mageia.org/"}, {'name': qsTr("Join us!"),'url': "https://identity.mageia.org/"}] delegate: Button { width: view.width * .2 objectName: "link" onClicked: { link.weblink(modelData.url)} style: ButtonStyle { label: Label { text: modelData.name horizontalAlignment: TextInput.AlignHCenter color: "black" width: parent.width wrapMode: Text.WordWrap } background: Rectangle { color: "lightgrey" radius: 5 } } } } } } } } ListView { id: view z: 1 anchors.rightMargin: 0 anchors.leftMargin: 0 anchors.topMargin: 0 anchors { fill: parent; bottomMargin: startCB.implicitHeight +10 } model: itemModel preferredHighlightBegin: 0; preferredHighlightEnd: 0 highlightRangeMode: ListView.StrictlyEnforceRange orientation: ListView.Horizontal snapMode: ListView.SnapOneItem; flickDeceleration: 2000 highlightFollowsCurrentItem: true highlightMoveDuration: 800 cacheBuffer: 200 } } Rectangle { id: buttonbox width: banner.width; height: buttonRow.height anchors { top: banner.bottom; } color: "#262F45" RowLayout { id: buttonRow Rectangle { Layout.preferredWidth: 8 Layout.preferredHeight: buttonbox.height color: buttonbox.color } Repeater { model: itemModel.count Button { Layout.fillHeight: true Layout.preferredWidth: (buttonbox.width - 8)/8-9; Layout.topMargin: 6 Layout.bottomMargin: 6 style: ButtonStyle { background: Rectangle { radius: 5 color: view.currentIndex == index ? "#2397D4" : "white" } label: Label{ text: itemModel.get(index).title font.pointSize: 9 color: view.currentIndex == index ? "white" : "#262F45" horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter wrapMode : Text.WordWrap } } onClicked: view.currentIndex = index } } } } Row { anchors.right: box.right anchors.bottom: box.bottom anchors.margins: 6 CheckBox { id:startCB text: qsTr("Show this window at startup") checked: startupcheck onClicked: norun.setRunAtLaunch(checked) } } Connections { target: launch onInstalled: { // get the signal to reload the applist console.log("Reload applications list") itemModel.update_list(categoriesList.currentItem.myGroup) } } }