Commit 807b9751 authored by eetu's avatar eetu Committed by GitHub

Merge branch 'master' into applauncher_fixes

parents 61263bc7 4dd1e103
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
<context>
<name>AppLauncher</name>
<message>
<location filename="../qml/AppLauncher.qml" line="67"/>
<source>Remove</source>
<translation>Verwijderen</translation>
</message>
<message>
<location filename="../qml/AppLauncher.qml" line="82"/>
<source>Uninstall</source>
<translation>Verwijderen</translation>
</message>
</context>
<context>
<name>AppSwitcher</name>
<message>
<location filename="../qml/AppSwitcher.qml" line="173"/>
<source>Close
All</source>
<translation>Alles sluiten</translation>
</message>
<message>
<location filename="../qml/AppSwitcher.qml" line="187"/>
<source>No apps open</source>
<translation>Geen open apps</translation>
</message>
</context>
<context>
<name>BatteryPanel</name>
<message>
<location filename="../qml/BatteryPanel.qml" line="39"/>
<source>Battery level</source>
<translation>Batterijniveau</translation>
</message>
</context>
<context>
<name>CommonPanel</name>
<message>
<location filename="../qml/CommonPanel.qml" line="42"/>
<source>Close</source>
<translation>Sluiten</translation>
</message>
</context>
<context>
<name>LauncherItemDelegate</name>
<message>
<location filename="../qml/LauncherItemDelegate.qml" line="147"/>
<source>Remove</source>
<translation>Verwijderen</translation>
</message>
<message>
<location filename="../qml/LauncherItemDelegate.qml" line="148"/>
<source>Uninstall</source>
<translation>Verwijderen</translation>
</message>
<message>
<location filename="../qml/LauncherItemDelegate.qml" line="170"/>
<source>Removing</source>
<translation>Verwijderen</translation>
</message>
<message>
<location filename="../qml/LauncherItemDelegate.qml" line="172"/>
<source>Uninstalling</source>
<translation>Verwijderen</translation>
</message>
</context>
<context>
<name>SimPanel</name>
<message>
<location filename="../qml/SimPanel.qml" line="76"/>
<source>OK</source>
<translation>Oké</translation>
</message>
<message>
<location filename="../qml/SimPanel.qml" line="87"/>
<source>Clear</source>
<translation>Wissen</translation>
</message>
<message>
<location filename="../qml/SimPanel.qml" line="135"/>
<source>No pin required!</source>
<translation>Geen PIN-code nodig!</translation>
</message>
</context>
<context>
<name>USBModeSelector</name>
<message>
<location filename="../qml/USBModeSelector.qml" line="82"/>
<source>Current mode: Charging only</source>
<translation>Huidige modus: alleen opladen</translation>
</message>
<message>
<location filename="../qml/USBModeSelector.qml" line="98"/>
<source>MTP Mode</source>
<translation>MTP-modus</translation>
</message>
<message>
<location filename="../qml/USBModeSelector.qml" line="118"/>
<source>Mass Storage Mode</source>
<translation>Massaopslagmodus</translation>
</message>
<message>
<location filename="../qml/USBModeSelector.qml" line="138"/>
<source>Developer Mode</source>
<translation>Ontwikkelaarsmodus</translation>
</message>
</context>
</TS>
......@@ -34,17 +34,20 @@ import QtQuick.Controls.Styles.Nemo 1.0
GridView {
id: gridview
cellWidth: cellSize
cellHeight: cellSize
width: parent.width
width: cellWidth * columns
cacheBuffer: gridview.contentHeight
property Item reorderItem
property bool onUninstall
property alias deleter: deleter
property var switcher: null
property string searchString
property int minCellSize: Theme.iconSizeLauncher + Theme.itemSpacingHuge
property int rows: Math.floor(parent.height / minCellSize)
property int columns: Math.floor(parent.width / minCellSize)
cellWidth: parent.width / columns
cellHeight: Math.round(parent.height / rows)
property int cellSize: Math.min(parent.width,parent.height)/4
property int folderIndex: -1
property bool isRootFolder:true
property bool newFolderActive
......@@ -232,7 +235,7 @@ GridView {
height: parent.height
width: parent.width - (removeIcon.visible ? removeIcon.width : 0)
anchors.verticalCenter: parent.verticalCenter
font.pixelSize: Theme.fontSizeLarge
font.pixelSize: Theme.fontSizeSmall
elide:Text.ElideRight
horizontalAlignment:Text.AlignHCenter
verticalAlignment:Text.AlignVCenter
......@@ -266,14 +269,13 @@ GridView {
source: "image://theme/trash"
visible: deleter.state != "uninstall"
}
Label {
id: uninstallLabel
height: parent.height
width: parent.width - (trashIcon.visible ? trashIcon.width : 0)
anchors.verticalCenter: parent.verticalCenter
text: qsTr("Uninstall")
font.pixelSize: Theme.fontSizeLarge
font.pixelSize: Theme.fontSizeSmall
elide:Text.ElideRight
horizontalAlignment:Text.AlignHCenter
verticalAlignment:Text.AlignVCenter
......@@ -288,12 +290,11 @@ GridView {
//Using loader that in the future we can also have widgets as delegate
delegate: Loader {
id:loader
width: cellSize
height: cellSize
width: cellWidth
height: cellHeight
onXChanged: item.x = x
onYChanged: item.y = y
property QtObject modelData : model
property int cellSize: gridview.cellHeight
property int cellIndex: index
sourceComponent: object.type == LauncherModel.Folder ? folder : app
}
......
......@@ -68,7 +68,7 @@ Item {
left: parent.left
}
font.weight: Font.Light
font.pixelSize: Theme.fontSizeExtraLarge
font.pixelSize: Theme.fontSizeLarge
}
}
Flickable {
......
......@@ -14,6 +14,8 @@ Item {
property bool shouldAuthenticate: Lipstick.compositor.visible
&& authenticator.availableMethods !== 0
property int remainingAttempts
onShouldAuthenticateChanged: {
if (shouldAuthenticate) {
DeviceLock.authorization.requestChallenge()
......@@ -36,32 +38,50 @@ Item {
}
}
Authenticator {
id: authenticator
onAuthenticated: {
DeviceLock.unlock(authenticationToken)
Desktop.instance.setLockScreen(false)
Desktop.instance.codepadVisible = false
remainingAttempts = 0
}
onFeedback: {
console.log('### still locked', feedback, attemptsRemaining)
remainingAttempts = attemptsRemaining
animation.start()
}
}
ColumnLayout {
anchors.fill: parent
spacing: Theme.itemSpacingLarge
spacing: Theme.itemSpacingExtraSmall
SequentialAnimation {
id: animation;
SequentialAnimation {
loops: 4
NumberAnimation { target: codePad; property: "anchors.horizontalCenterOffset"; to: 55; duration: 50 }
NumberAnimation { target: codePad; property: "anchors.horizontalCenterOffset"; to: 0; duration: 50 }
}
NumberAnimation { target: codePad; property: "anchors.horizontalCenterOffset"; to: 0; duration: 100 }
}
Label {
font.pixelSize: Theme.fontSizeMedium
width: parent.width
text: remainingAttempts > 0 ? qsTr("Attempts remaining:") + " " + remainingAttempts : ""
anchors.horizontalCenter: parent.horizontalCenter
}
TextField {
id: lockCodeField
anchors.horizontalCenter: parent.horizontalCenter
readOnly: true
echoMode: TextInput.PasswordEchoOnEdit
font.pixelSize: Theme.fontSizeExtraLarge
font.pixelSize: Theme.fontSizeMedium
}
GridLayout {
id: codePad
height: parent.height
width: parent.width
anchors.horizontalCenter: parent.horizontalCenter
......@@ -70,27 +90,19 @@ Item {
model: ["1","2","3","4","5","6","7","8","9","Ca","0","OK"]
delegate:
Button {
height: Theme.itemHeightHuge
width: Theme.itemHeightHuge
Layout.maximumWidth: Theme.itemHeightHuge * 1.5
Layout.maximumHeight: Theme.itemHeightHuge * 1.5
Label {
id: btnLabel
id:button
Layout.maximumWidth: Theme.itemWidthSmall
Layout.maximumHeight: Theme.itemHeightHuge * 2
Layout.minimumHeight: Theme.itemHeightHuge * 1.5
text: modelData
font.pixelSize: Theme.fontSizeExtraLarge * 1.5
anchors {
centerIn: parent
}
}
onClicked: {
if (btnLabel.text !== "Ca" && btnLabel.text !== "OK") {
lockCodeField.insert(lockCodeField.cursorPosition, btnLabel.text)
if (button.text !== "Ca" && button.text !== "OK") {
lockCodeField.insert(lockCodeField.cursorPosition, button.text)
} else {
if (btnLabel.text === "OK") {
if (button.text === "OK") {
authenticator.enterLockCode(lockCodeField.text)
lockCodeField.text = ""
} else if (btnLabel.text === "Ca"){
} else if (button.text === "Ca"){
lockCodeField.text = ""
}
}
......
......@@ -59,7 +59,7 @@ Flickable {
id: displayDayOfWeek
text: Qt.formatDateTime(wallClock.time, "dddd")
color: Theme.textColor
font.pixelSize: Theme.fontSizeExtraLarge
font.pixelSize: Theme.fontSizeLarge
font.weight: Font.Bold
anchors {
top: parent.top
......@@ -71,7 +71,7 @@ Flickable {
Label {
id: displayCurrentDate
text: Qt.formatDate(wallClock.time, "d MMMM yyyy")
font.pixelSize: Theme.fontSizeExtraLarge
font.pixelSize: Theme.fontSizeLarge
color: Theme.textColor
font.weight: Font.Light
wrapMode: Text.WordWrap
......
......@@ -67,19 +67,18 @@ Item {
Item {
id: iconWrapper
width: parent.width -parent.width/10
height: width - iconText.height
anchors.centerIn: parent
height: parent.height - iconText.height
width: parent.width
anchors.horizontalCenter: parent.horizontalCenter
y: Math.round((parent.height - (height + iconText.height)) / 2)
Image {
id: iconImage
anchors {
// centerIn: launcherItem.n.otNemoIcon ? parent : undefined
horizontalCenter: /* launcherItemnotNemoIcon ? undefined : */parent.horizontalCenter
top: parent.top
//topMargin: Theme.itemSpacingExtraSmall
}
width:/*launcherItem.notNemoIcon ? parent.width-parent.width/3 : */parent.width - parent.width/4
height: width
anchors.centerIn: parent
sourceSize.width: Theme.iconSizeLauncher
sourceSize.height: Theme.iconSizeLauncher
height: Theme.iconSizeLauncher
width: height
asynchronous: true
onStatusChanged: {
if (iconImage.status == Image.Error) {
......@@ -89,11 +88,7 @@ Item {
}
Spinner {
id: spinnerr
anchors {
centerIn: iconImage
top: iconImage.top
topMargin: Theme.itemSpacingExtraSmall
}
anchors.centerIn: iconImage
width: iconWrapper.width
height: width
enabled: (modelData.object.type === LauncherModel.Application) ? modelData.object.isLaunching ? switcher.switchModel.getWindowIdForTitle(modelData.object.title) == 0 : false : false
......@@ -116,13 +111,13 @@ Item {
width: iconWrapper.width
elide: Text.ElideRight
horizontalAlignment: Text.AlignHCenter
font.pixelSize: Theme.fontSizeSmall
font.pixelSize: Theme.fontSizeTiny
color: Theme.textColor
//https://bugreports.qt.io/browse/QTBUG-56052
y: -contentHeight + font.pixelSize + iconWrapper.y + iconWrapper.height
anchors {
left: parent.left
right: parent.right
bottom: parent.bottom
topMargin: Theme.itemSpacingExtraSmall
}
}
}
......
......@@ -73,10 +73,11 @@ Item {
}
Item {
id:folderIconStack
width: size
height: size
property int size: parent.width -parent.width/10
property int iconSize: (/*launcherItem.notNemoIcon ? size-size/3 : */ (size - size/4)) * 0.9
width: parent.width
height: parent.height - iconText.height
anchors.horizontalCenter: parent.horizontalCenter
y: Math.round((parent.height - (height + iconText.height)) / 2)
property int iconSize: Theme.iconSizeLauncher * 0.9
property real transparency: 0.6
property int iconCount: 4
property var icons: addIcons()
......@@ -146,13 +147,13 @@ Item {
width: launcherItem.width
elide: Text.ElideRight
horizontalAlignment: Text.AlignHCenter
font.pixelSize: Theme.fontSizeSmall
font.pixelSize: Theme.fontSizeTiny
color: Theme.textColor
//https://bugreports.qt.io/browse/QTBUG-56052
y: -contentHeight + font.pixelSize + folderIconStack.y + folderIconStack.height
anchors {
left: parent.left
right: parent.right
bottom: parent.bottom
topMargin: Theme.itemSpacingExtraSmall
}
}
......@@ -173,15 +174,16 @@ Item {
id: folderLoader
property Item reorderItem
property bool isRootFolder:false
property int folderIndex: -1
cacheBuffer: folderLoader.contentHeight
parent: gridview.contentItem
y: wrapper.y + wrapper.width
x: 0
z: wrapper.z + 100
width: gridview.width
height: count == 0 ? 0 : (Math.floor((count*wrapper.height-1)/width) + 1) * wrapper.height
height: count == 0 ? 0 : (Math.floor((count*wrapper.width-1)/width) + 1) * wrapper.height
cellWidth: wrapper.width
cellHeight: wrapper.width
cellHeight: wrapper.height
onReorderItemChanged: if(reorderItem == null) folderIconStack.icons=folderIconStack.addIcons()
Rectangle {
......
......@@ -89,9 +89,11 @@ MouseArea {
drag.target = null
parentItem.reorderItem = null
pager.interactive = true
if(parentItem.onUninstall){
parentItem.onUninstall = false
deleteState="basic"
deleter.uninstalling(deleteState)
}
parentItem.folderIndex = -1
reparent(parentItem.contentItem)
z = parent.z
......@@ -188,7 +190,7 @@ MouseArea {
}
Timer {//Just placeholder to get visual feedback
id:deleteTimer
interval: 5000
interval: 3000
onTriggered: {
iconWrapper.opacity=1.0
enabled = true
......
import QtQuick 2.0
import QtQuick 2.6
import org.nemomobile.lipstick 0.1
import org.nemomobile.devicelock 1.0
import org.nemomobile.configuration 1.0
import "notifications"
Image {
id: lockScreen
source: lockScreenWallpaper.value
fillMode: Image.PreserveAspectCrop
property bool displayOn
ConfigurationValue{
id: lockScreenWallpaper
key: "/home/glacier/lockScreen/wallpaperImage"
......@@ -22,22 +26,78 @@ Image {
right: parent.right
}
}
DeviceLockUI {
id: deviceLockUI
visible: false//DeviceLock.state === DeviceLock.Locked
anchors {
top: clock.bottom
left: parent.left
MouseArea {
id:mouseArea
anchors.fill: parent
}
Connections {
target:Lipstick.compositor
onDisplayOff: {
displayOn = false
displayOffTimer.stop()
}
onDisplayOn:{
displayOn = true
displayOffTimer.stop()
}
}
height: parent.height-clock.height
width: parent.width
Connections {
target: LipstickSettings
onLockscreenVisibleChanged: {
if (lockscreenVisible() && displayOn) {
displayOffTimer.restart()
}
}
}
Timer {
id:displayOffTimer
interval: 7000
onRunningChanged: {
if(running && !displayOn) {
stop()
}
}
onTriggered: {
if(displayOn && lockscreenVisible() && !Lipstick.compositor.gestureOnGoing && !codepad.visible) {
setLockScreen(true)
Lipstick.compositor.setDisplayOff()
}
}
}
//visible:
z: 201
ListView {
id: notificationColumn
opacity: codePad.visible ? 1 - codePad.opacity : 1
anchors{
top: clock.bottom
topMargin: Theme.itemSpacingHuge
bottom:parent.bottom
bottomMargin: Theme.itemSpacingHuge
left:parent.left
leftMargin: Theme.itemSpacingLarge
right:parent.right
rightMargin: Theme.itemSpacingLarge
}
interactive:false
spacing: 0
MouseArea {
anchors.fill: parent
model: NotificationListModel {
id: notifmodel
}
delegate: NotificationItem {
enabled:DeviceLock.state !== DeviceLock.Locked
scale: notificationColumn.opacity
transformOrigin: Item.Left
iconSize: Theme.itemHeightMedium
appName.font.pixelSize: Theme.fontSizeSmall
appName.visible: DeviceLock.state !== DeviceLock.Locked
appName.anchors.verticalCenter: appIcon.verticalCenter
appName.anchors.top: null
appBody.font.pixelSize: Theme.fontSizeTiny
appBody.visible: false
appSummary.visible: false
}
}
}
......@@ -51,7 +51,7 @@ Rectangle {
Label {
id: weekdayDisplay
font.pixelSize: Theme.fontSizeLarge
font.pixelSize: Theme.fontSizeMedium
color: Theme.textColor
horizontalAlignment: Text.AlignHCenter
font.weight: Font.Bold
......@@ -65,7 +65,7 @@ Rectangle {
Label {
id: dateDisplay
font.pixelSize: Theme.fontSizeLarge
font.pixelSize: Theme.fontSizeMedium
color: Theme.textColor
horizontalAlignment: Text.AlignHCenter
font.weight: Font.Light
......
......@@ -46,9 +46,17 @@ Page {
// This is used in the favorites page and in the lock screen
WallClock {
id: wallClock
enabled: true /* XXX: Disable when display is off */
enabled: true
updateFrequency: WallClock.Minute
}
//force refresh
Connections {
target: Lipstick.compositor
onDisplayAboutToBeOn: {
wallClock.enabled = false
wallClock.enabled = true
}
}
// This is used in the lock screen
ConfigurationValue {
id: wallpaperSource
......
......@@ -30,7 +30,6 @@
****************************************************************************************/
import QtQuick 2.6
import org.nemomobile.lipstick 0.1
import QtQuick.Controls 1.4
import QtQuick.Controls.Nemo 1.0
import QtQuick.Controls.Styles.Nemo 1.0
import org.nemomobile.contacts 1.0
......@@ -120,7 +119,7 @@ Item {
}
font.capitalization: Font.AllUppercase
font.pixelSize: Theme.fontSizeMedium
font.pixelSize: Theme.fontSizeSmall
color: Theme.textColor
anchors{
left: parent.left
......@@ -163,7 +162,6 @@ Item {
filterType: PeopleModel.FilterAll
filterPattern: searchString
requiredProperty: PeopleModel.PhoneNumberRequired
//searchableProperty: root.searchableProperty
}
//Orginal function ** Copyright (C) 2013 Jolla Ltd. ** Contact: Joona Petrell <joona.petrell@jollamobile.com> **BSD
......@@ -259,7 +257,7 @@ Item {
}
Image {
id: iconImage
width: parent.height-Theme.itemSpacingMedium
width: Math.min(Theme.iconSizeLauncher, parent.height-Theme.itemSpacingMedium)
height: width
source:iconSource
anchors.verticalCenter: parent.verticalCenter
......@@ -308,7 +306,7 @@ Item {
left: parent.left
right: parent.right
}
font.pixelSize:Theme.fontSizeLarge
font.pixelSize:Theme.fontSizeMedium
color:Theme.textColor
elide:Text.ElideRight
verticalAlignment:Text.AlignVCenter
......@@ -320,7 +318,7 @@ Item {
top:mainLabel.bottom
left:mainLabel.left
}
font.pixelSize:Theme.fontSizeSmall
font.pixelSize:Theme.fontSizeTiny
color:Theme.textColor
elide:Text.ElideRight
verticalAlignment:Text.AlignVCenter
......
......@@ -59,7 +59,7 @@ Item {
property int oldY
anchors.fill: row
z: row.z + 10
enabled: !lockscreenVisible()
//enabled: !lockscreenVisible()
onClicked: {
if(oldX != mouseX && oldY !== mouseY && row.childAt(mouseX, mouseY) && row.currentChild !== row.childAt(mouseX, mouseY)) {
row.currentChild = row.childAt(mouseX, mouseY)
......
......@@ -45,6 +45,8 @@ Compositor {
property Item topmostApplicationWindow
property Item topmostAlarmWindow: null
property bool gestureOnGoing
function windowToFront(winId) {
var o = root.windowForId(winId)
var window = null
......@@ -141,6 +143,7 @@ Compositor {
swipeAnimation.stop()
cancelAnimation.stop()
lockAnimation.stop()
gestureOnGoing = true
if (root.appActive) {
state = "swipe"
}
......@@ -176,6 +179,9 @@ Compositor {
// Locks
if (!Desktop.instance.lockscreenVisible()) {
Desktop.instance.setLockScreen(true)
if(gesture == "down") {
setDisplayOff()
}
}
// Brings up codepad, only left and right swipes allowed for it for now
else if (Desktop.instance.lockscreenVisible() && !Desktop.instance.codepad.visible && DeviceLock.state == DeviceLock.Locked && (gesture !== "down" && gesture !== "up")) {
......@@ -193,6 +199,7 @@ Compositor {
cancelAnimation.start()
}
}
gestureOnGoing = false
}
// States are for the animations that follow your finger during swipes
states: [
......
......@@ -6,7 +6,14 @@ MouseArea {
id: notifyArea
height: childrenRect.height
width: rootitem.width
width: parent.width
property alias appIcon: appIcon
property alias appBody: appBody
property alias appName: appName
property alias appSummary: appSummary
property int iconSize: Theme.itemHeightExtraLarge
drag.target: notifyArea
drag.axis: Drag.XAxis
......@@ -54,10 +61,10 @@ MouseArea {
Image {
id: appIcon
height: Theme.itemHeightExtraLarge
width: height
property string defaultIcon: "/usr/share/lipstick-glacier-home-qt5/qml/images/glacier.svg"
height: iconSize
width: iconSize
anchors{
left: parent.left
leftMargin: Theme.itemSpacingLarge
......@@ -78,7 +85,7 @@ MouseArea {
Label {
id: appName
text: modelData.appName
width: (rootitem.width-appIcon.width)-Theme.itemSpacingHuge
width: (parent.width-appIcon.width)-Theme.itemSpacingHuge
color: Theme.textColor
font.pixelSize: Theme.fontSizeMedium
font.capitalization: Font.AllUppercase
......@@ -93,9 +100,9 @@ MouseArea {
Label {
id: appSummary
text: modelData.summary
width: (rootitem.width-appIcon.width)-Theme.itemSpacingHuge
width: (parent.width-appIcon.width)-Theme.itemSpacingHuge
color: Theme.textColor
font.pixelSize: Theme.fontSizeLarge
font.pixelSize: Theme.fontSizeSmall
//font.bold :true
//font.capitalization: Font.AllUppercase
......@@ -109,10 +116,10 @@ MouseArea {
Label {
id: appBody
width: (rootitem.width-appIcon.width)-Theme.itemSpacingHuge
width: (parent.width-appIcon.width)-Theme.itemSpacingHuge
text: modelData.body
color: Theme.textColor
font.pixelSize: Theme.fontSizeMedium
font.pixelSize: Theme.fontSizeSmall
anchors{
left: appName.left
top: appSummary.bottom
......
......@@ -144,7 +144,7 @@ Item {
rightMargin: notificationArea.notificationMargin
//bottomMargin: notificationArea.notificationMargin
}
font.pixelSize: Theme.fontSizeLarge
font.pixelSize: Theme.fontSizeMedium
text: notificationPreviewPresenter.notification != null ? notificationPreviewPresenter.notification.previewSummary : ""
color: Theme.textColor
clip: true
......@@ -159,7 +159,7 @@ Item {
right: summary.right
}
font {
pixelSize: Theme.fontSizeMedium
pixelSize: Theme.fontSizeSmall
bold: true
}
text: notificationPreviewPresenter.notification != null ? notificationPreviewPresenter.notification.previewBody : ""
......
......@@ -93,7 +93,7 @@ Rectangle {
leftMargin: Theme.itemSpacingLarge
}
wrapMode: Text.Wrap
font.pointSize: 8
font.pixelSize: Theme.fontSizeMedium
font.bold: true
color: "#ffffff"
}
......
......@@ -35,7 +35,9 @@ Item {
}
MouseArea {
id:mouse
anchors.fill: parent
anchors.centerIn: parent
width: parent.width + Theme.itemSpacingSmall
height: parent.height + Theme.itemSpacingSmall
enabled: !lockscreenVisible()
onClicked: parent.clicked()
}
......
......@@ -85,7 +85,7 @@ Component {
verticalCenter: statusImage.verticalCenter
}
width: root.width
font.pixelSize: Theme.fontSizeMedium
font.pixelSize: Theme.fontSizeSmall
text: modelData.name
wrapMode: Text.Wrap
color: modelData.state === "online" ? Theme.accentColor : Theme.textColor
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment