← Back to team overview

ubuntu-touch-coreapps-reviewers team mailing list archive

[Merge] lp:~dinko-metalac/sudoku-app/bottom-edge into lp:sudoku-app

 

Dinko Osmankovic has proposed merging lp:~dinko-metalac/sudoku-app/bottom-edge into lp:sudoku-app.

Commit message:
Some bottom edge love and theme work.

Requested reviews:
  Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot): continuous-integration

For more details, see:
https://code.launchpad.net/~dinko-metalac/sudoku-app/bottom-edge/+merge/265113

Some bottom edge love and theme work.
-- 
Your team Sudoku Touch developers is subscribed to branch lp:sudoku-app.
=== modified file 'click/manifest.json.in'
--- click/manifest.json.in	2014-10-08 14:58:56 +0000
+++ click/manifest.json.in	2015-07-17 11:50:08 +0000
@@ -1,7 +1,7 @@
 {
     "architecture": "all",
     "description": "Sudoku game for Ubuntu devices.",
-    "framework": "ubuntu-sdk-14.10-qml-dev3",
+    "framework": "ubuntu-sdk-15.04",
     "hooks": {
         "sudoku": {
             "apparmor": "sudoku.apparmor",

=== modified file 'click/sudoku.apparmor'
--- click/sudoku.apparmor	2014-09-08 09:52:14 +0000
+++ click/sudoku.apparmor	2015-07-17 11:50:08 +0000
@@ -3,5 +3,5 @@
         "networking",
         "usermetrics"
     ],
-    "policy_version": 1.2
+    "policy_version": 1.3
 }
\ No newline at end of file

=== modified file 'components/AboutTab.qml'
--- components/AboutTab.qml	2014-10-06 12:41:09 +0000
+++ components/AboutTab.qml	2015-07-17 11:50:08 +0000
@@ -76,17 +76,18 @@
                 //anchors.horizontalCenter: parent.horizontalCenter;
                 width: parent.width
                 y: units.gu(6);
-                UbuntuShape {
+                Rectangle {
                     Layouts.item: "icon"
                     property real maxWidth: units.gu(45)
                     anchors.horizontalCenter: parent.horizontalCenter
                     width: Math.min(parent.width, maxWidth)/2
                     height: Math.min(parent.width, maxWidth)/2
-                    image: Image {
+                    Image {
                         objectName: "aboutImage"
                         //height: width
                         source: "../icons/about.png"
                         smooth: true
+                        anchors.fill: parent
                         fillMode: Image.PreserveAspectFit
 
                     }

=== modified file 'components/BigBlock.qml'
--- components/BigBlock.qml	2014-10-06 12:41:09 +0000
+++ components/BigBlock.qml	2015-07-17 11:50:08 +0000
@@ -4,31 +4,35 @@
 import "../js/SudokuCU.js" as SudokuCU
 import QtFeedback 5.0
 
-UbuntuShape {
+Rectangle {
     width: 3*blockSize + 5*blockDistance
     height: 3*blockSize + 5*blockDistance
     id: block
     Rectangle {
+        color: UbuntuColors.warmGrey
         height: parent.height - units.dp(6)
-        width: units.dp(1)
+        width: units.dp(2)
         x: block.width*1/3;
         y: units.dp(3)
     }
     Rectangle {
+        color: UbuntuColors.warmGrey
         height: parent.height - units.dp(6)
-        width: units.dp(1)
+        width: units.dp(2)
         x: block.width*2/3;
         y: units.dp(3)
     }
     Rectangle {
+        color: UbuntuColors.warmGrey
         width: parent.height - units.dp(6)
-        height: units.dp(1)
+        height: units.dp(2)
         y: block.width*1/3;
         x: units.dp(3)
     }
     Rectangle {
+        color: UbuntuColors.warmGrey
         width: parent.height - units.dp(6)
-        height: units.dp(1)
+        height: units.dp(2)
         y: block.width*2/3;
         x: units.dp(3)
     }

=== added file 'components/BottomEdge.qml'
--- components/BottomEdge.qml	1970-01-01 00:00:00 +0000
+++ components/BottomEdge.qml	2015-07-17 11:50:08 +0000
@@ -0,0 +1,237 @@
+import QtQuick 2.2
+import QtFeedback 5.0
+import Ubuntu.Components 1.1
+
+Item {
+    id: bottomEdge
+    
+    property int hintSize: units.gu(8)
+    property color hintColor: Theme.palette.normal.overlay
+    property string hintIconName: "view-grid-symbolic"
+    property alias hintIconSource: hintIcon.source
+    property color hintIconColor: UbuntuColors.coolGrey
+    property bool bottomEdgeEnabled: true
+
+    property int expandAngle: 360
+    property real expandedPosition: (0.85 - 0.25 * expandAngle/360) * height
+    property real collapsedPosition: height - hintSize/2
+
+    property list<RadialAction> actions
+    property real actionButtonSize: units.gu(7)
+    property real actionButtonDistance: 1.5* hintSize
+
+    anchors.fill: parent
+
+    HapticsEffect {
+        id: clickEffect
+        attackIntensity: 0.0
+        attackTime: 50
+        intensity: 1.0
+        duration: 10
+        fadeTime: 50
+        fadeIntensity: 0.0
+    }
+
+    Rectangle {
+        id: bgVisual
+        
+        z: 1
+        color: "black"
+        anchors.fill: parent
+        opacity: 1.0 * ((bottomEdge.height - bottomEdgeHint.y) / bottomEdge.height)
+    }
+    
+    Rectangle {
+        id: bottomEdgeHint
+
+        color: hintColor
+        width: hintSize
+        height: width
+        radius: units.gu(2)//width/2
+        visible: bottomEdgeEnabled
+
+        anchors.horizontalCenter: parent.horizontalCenter
+        y: collapsedPosition
+        z: parent.z + 1
+
+        Label {
+            text: i18n.tr("Delete scores")
+            visible: bottomEdgeHint.state == "expanded"
+            fontSize: "large"
+            color: "white"
+            font.bold: true
+            anchors.top: parent.bottom
+            anchors.bottomMargin: units.gu(5)
+            anchors.horizontalCenter: parent.horizontalCenter
+        }
+
+        Rectangle {
+            id: dropShadow
+            width: parent.width
+            height: parent.height
+            border.color: "#B3B3B3"
+            color: "Transparent"
+            radius: parent.radius
+            z: -1
+            anchors {
+                centerIn: parent
+                verticalCenterOffset: units.gu(-0.3)
+            }
+        }
+        
+        Icon {
+            id: hintIcon
+            width: hintSize/4
+            height: width
+            name: hintIconName
+            color: hintIconColor
+            anchors {
+                centerIn: parent
+                verticalCenterOffset: width * ((bottomEdgeHint.y - expandedPosition)
+                                               /(expandedPosition - collapsedPosition))
+            }
+        }
+
+        property real actionListDistance: -actionButtonDistance * ((bottomEdgeHint.y - collapsedPosition)
+                                                                   /(collapsedPosition - expandedPosition))
+
+        Repeater {
+            id: actionList
+            readonly property real itemSpace: bottomEdge.expandAngle/actionList.count;
+            readonly property real substractAngle: (bottomEdge.expandAngle == 360 || !actionList.count) ?
+                                                    0 : (actionList.count-1)/2 * itemSpace
+            model: actions
+            delegate: Rectangle {
+                id: actionDelegate
+                readonly property real radAngle: (index % actionList.count * actionList.itemSpace - actionList.substractAngle) * Math.PI / 180
+                property real distance: bottomEdgeHint.actionListDistance
+                z: -1
+                width: actionButtonSize
+                height: width
+                radius: width/2
+                anchors.centerIn: parent
+                color: modelData.backgroundColor
+                opacity: modelData.enabled ? 1.0 : 0.7
+                transform: Translate {
+                    x: distance * Math.sin(radAngle + Math.PI/2)
+                    y: -distance * Math.cos(radAngle + Math.PI/2)
+                }
+
+                Icon {
+                    anchors.centerIn: parent
+                    width: parent.width/2
+                    height: width
+                    name: modelData.iconName
+                    color: modelData.iconColor
+                }
+
+                MouseArea {
+                    enabled: modelData.enabled
+                    anchors.fill: parent
+                    onClicked: {
+                        clickEffect.start()
+                        bottomEdgeHint.state = "collapsed"
+                        modelData.triggered(null)
+                    }
+                }
+            }
+        }
+        
+        MouseArea {
+            id: mouseArea
+            
+            property real previousY: -1
+            property string dragDirection: "None"
+            
+            z: 1
+            anchors.fill: parent
+            visible: bottomEdgeEnabled
+            
+            preventStealing: true
+            drag {
+                axis: Drag.YAxis
+                target: bottomEdgeHint
+                minimumY: expandedPosition
+                maximumY: collapsedPosition
+            }
+            
+            onReleased: {
+                if ((dragDirection === "BottomToTop") &&
+                        bottomEdgeHint.y < collapsedPosition) {
+                    bottomEdgeHint.state = "expanded"
+                } else {
+                    if (bottomEdgeHint.state === "collapsed") {
+                        bottomEdgeHint.y = collapsedPosition
+                    }
+                    bottomEdgeHint.state = "collapsed"
+                }
+                previousY = -1
+                dragDirection = "None"
+            }
+
+            onClicked: {
+                if (bottomEdgeHint.y === collapsedPosition)
+                    bottomEdgeHint.state = "expanded"
+                else
+                    bottomEdgeHint.state = "collapsed"
+            }
+            
+            onPressed: {
+                previousY = bottomEdgeHint.y
+            }
+            
+            onMouseYChanged: {
+                var yOffset = previousY - bottomEdgeHint.y
+                if (Math.abs(yOffset) <= units.gu(2)) {
+                    return
+                }
+                previousY = bottomEdgeHint.y
+                dragDirection = yOffset > 0 ? "BottomToTop" : "TopToBottom"
+            }
+        }
+        
+        state: "collapsed"
+        states: [
+            State {
+                name: "collapsed"
+                PropertyChanges {
+                    target: bottomEdgeHint
+                    y: collapsedPosition
+                }
+            },
+            State {
+                name: "expanded"
+                PropertyChanges {
+                    target: bottomEdgeHint
+                    y: expandedPosition
+                }
+            },
+            
+            State {
+                name: "floating"
+                when: mouseArea.drag.active
+            }
+        ]
+        
+        transitions: [
+            Transition {
+                to: "expanded"
+                SpringAnimation {
+                    target: bottomEdgeHint
+                    property: "y"
+                    spring: 2
+                    damping: 0.2
+                }
+            },
+            
+            Transition {
+                to: "collapsed"
+                SmoothedAnimation {
+                    target: bottomEdgeHint
+                    property: "y"
+                    duration: UbuntuAnimation.BriskDuration
+                }
+            }
+        ]
+    }
+}

=== added file 'components/BottomEdgeSlide.qml'
--- components/BottomEdgeSlide.qml	1970-01-01 00:00:00 +0000
+++ components/BottomEdgeSlide.qml	2015-07-17 11:50:08 +0000
@@ -0,0 +1,331 @@
+import QtQuick 2.2
+import QtFeedback 5.0
+import Ubuntu.Components 1.1
+
+Item {
+    id: bottomEdge
+    
+    property int hintSize: units.gu(8)
+    property color hintColor: Theme.palette.normal.overlay
+    property string hintIconName: "view-grid-symbolic"
+    property alias hintIconSource: hintIcon.source
+    property color hintIconColor: UbuntuColors.coolGrey
+    property bool bottomEdgeEnabled: true
+
+    property int expandAngle: 360
+    property real expandedPosition: (0.85 - 0.45 * expandAngle/360) * height
+    property real collapsedPosition: height - hintSize/2
+
+    property real actionButtonSize: units.gu(7)
+    property real actionButtonDistance: 1.5* hintSize
+
+    anchors.fill: parent
+
+    HapticsEffect {
+        id: clickEffect
+        attackIntensity: 0.0
+        attackTime: 50
+        intensity: 1.0
+        duration: 10
+        fadeTime: 50
+        fadeIntensity: 0.0
+    }
+
+    /*Rectangle {
+        id: bgVisual
+        
+        z: 10
+        color: "black"
+        //anchors.fill: parent
+        width: parent.width
+        height: parent.height/2*3
+        y: bottomEdgeHint.y
+        opacity: 0.0
+    }*/
+    Rectangle {
+        width: parent.width
+        height: parent.height/2*3
+        color: Theme.palette.normal.background
+        y: bottomEdgeHint.y + bottomEdgeHint.height/2
+        Rectangle {
+            id: dropShadowSlide
+            width: parent.width
+            height: parent.height
+            border.color: "#B3B3B3"
+            color: Theme.palette.normal.background
+            radius: parent.radius
+            z: -1
+            anchors {
+                centerIn: parent
+                verticalCenterOffset: units.gu(-0.3)
+            }
+        }
+
+        Flow {
+            id: informationRow;
+            //y: 7*mainView.pageHeight/10;
+            //width: mainView.pageWidth - units.dp(8);
+            //anchors.horizontalCenter: parent.horizontalCenter
+            /*x: !mainView.wideAspect() ? 0.5*(mainView.width - width) :
+                                        0.25*(mainView.width-9*sudokuBlocksGrid.blockSize-
+                                              22*sudokuBlocksGrid.blockDistance)+9*sudokuBlocksGrid.blockSize + 35*sudokuBlocksGrid.blockDistance + units.gu(2)
+
+                                              */
+            anchors.top: parent.top
+            anchors.left: parent.left
+            anchors.topMargin: units.gu(6)
+            anchors.leftMargin: units.gu(4)
+            /*anchors.topMargin: !mainView.wideAspect() ?
+                                   9*sudokuBlocksGrid.blockSize + 35*sudokuBlocksGrid.blockDistance :
+                                   mainView.height*0.15
+*/
+            //columns: !wideAspect ? 3 : 1
+            flow: mainView.wideAspect() ? Flow.LeftToRight : Flow.TopToBottom
+            spacing: mainView.width/mainView.height < mainView.resizeFactor ? units.gu(4) : units.gu(50)/6
+            Row {
+                spacing: units.gu(4)
+                Rectangle {
+                    id: redFlag
+                    color: sudokuBlocksGrid.defaultNotAllowedColor
+                    width: units.gu(5)
+                    height: width
+                    //border.color: defaultBorderColor
+                    //radius: "medium"
+                    Label {
+                        id: redFlagText
+                        text: i18n.tr("4")
+                        fontSize: "large"
+                        font.bold: true
+                        color: "white"
+                        width:units.gu(5);
+                        wrapMode: TextEdit.WordWrap;
+                        horizontalAlignment: Text.AlignHCenter
+                        anchors.centerIn: parent
+                        //                                    anchors.left: redFlag.right;
+                        //                                    anchors.leftMargin: units.dp(2);
+                        //                                    anchors.verticalCenter: redFlag.verticalCenter;
+                    }
+                }
+                Label {
+                    text: i18n.tr("Not allowed")
+                    anchors.verticalCenter: parent.verticalCenter
+                }
+            }
+
+            Row {
+                spacing: units.gu(4)
+                Rectangle {
+                    id: blueFlag
+                    color: "#dcdcd5"
+                    //border.color: defaultBorderColor
+                    width: units.gu(5)
+                    height: width
+                    //radius: "medium";
+                    Label {
+                        id: blueFlagText
+                        text: i18n.tr("4")
+                        fontSize: "large"
+                        color: sudokuBlocksGrid.defaultStartingColor
+                        font.bold: true
+                        width:units.gu(5);
+                        wrapMode: TextEdit.WordWrap;
+                        horizontalAlignment: Text.AlignHCenter
+                        anchors.centerIn: parent
+                        //                                    anchors.left: blueFlag.right;
+                        //                                    anchors.leftMargin: units.dp(2);
+                        //                                    anchors.verticalCenter: blueFlag.verticalCenter;
+                    }
+                }
+                Label {
+                    text: i18n.tr("Start blocks")
+                    anchors.verticalCenter: parent.verticalCenter
+                }
+            }
+
+            Row {
+                spacing: units.gu(4)
+                Rectangle {
+                    id: orangeFlag
+                    color: "#dcdcd5"
+                    //border.color: defaultBorderColor
+                    width: units.gu(5)
+                    height: width
+                    //radius: "medium";
+                    Label {
+                        text: i18n.tr("4")
+                        fontSize: "large"
+                        color: sudokuBlocksGrid.defaultHintColor
+                        font.bold: true
+                        width:units.gu(5);
+                        wrapMode: TextEdit.WordWrap;
+                        horizontalAlignment: Text.AlignHCenter
+                        anchors.centerIn: parent
+                        //                                    anchors.left: orangeFlag.right;
+                        //                                    anchors.leftMargin: units.dp(2);
+                        //                                    anchors.verticalCenter: orangeFlag.verticalCenter;
+                    }
+                }
+                Label {
+                    text: i18n.tr("Hinted blocks")
+                    anchors.verticalCenter: parent.verticalCenter
+                }
+            }
+        }
+
+    }
+    
+    Rectangle {
+        id: bottomEdgeHint
+
+        color: hintColor
+        width: hintSize
+        height: width
+        radius: units.gu(2)//width/2
+        visible: bottomEdgeEnabled
+
+        anchors.horizontalCenter: parent.horizontalCenter
+        y: collapsedPosition
+        z: parent.z + 1
+
+        Rectangle {
+            id: dropShadow
+            width: parent.width
+            height: parent.height
+            border.color: "#B3B3B3"
+            color: Theme.palette.normal.background
+            radius: parent.radius
+            z: -1
+            anchors {
+                centerIn: parent
+                verticalCenterOffset: units.gu(-0.3)
+            }
+        }
+        
+        Icon {
+            id: hintIcon
+            width: hintSize/4
+            height: width
+            name: hintIconName
+            color: hintIconColor
+            anchors {
+                centerIn: parent
+                verticalCenterOffset: width * ((bottomEdgeHint.y - expandedPosition)
+                                               /(expandedPosition - collapsedPosition))
+            }
+        }
+
+        property real actionListDistance: -actionButtonDistance * ((bottomEdgeHint.y - collapsedPosition)
+                                                                   /(collapsedPosition - expandedPosition))
+
+        MouseArea {
+            id: mouseArea
+            
+            property real previousY: -1
+            property string dragDirection: "None"
+            
+            z: 1
+            anchors.fill: parent
+            visible: bottomEdgeEnabled
+            
+            preventStealing: true
+            drag {
+                axis: Drag.YAxis
+                target: bottomEdgeHint
+                minimumY: expandedPosition
+                maximumY: collapsedPosition
+            }
+            
+            onReleased: {
+                if ((dragDirection === "BottomToTop") &&
+                        bottomEdgeHint.y < collapsedPosition) {
+                    bottomEdgeHint.state = "expanded"
+                } else {
+                    if (bottomEdgeHint.state === "collapsed") {
+                        bottomEdgeHint.y = collapsedPosition
+                    }
+                    bottomEdgeHint.state = "collapsed"
+                }
+                previousY = -1
+                dragDirection = "None"
+            }
+
+            onClicked: {
+                if (bottomEdgeHint.y === collapsedPosition)
+                    bottomEdgeHint.state = "expanded"
+                else
+                    bottomEdgeHint.state = "collapsed"
+            }
+            
+            onPressed: {
+                previousY = bottomEdgeHint.y
+            }
+            
+            onMouseYChanged: {
+                var yOffset = previousY - bottomEdgeHint.y
+                if (Math.abs(yOffset) <= units.gu(2)) {
+                    return
+                }
+                previousY = bottomEdgeHint.y
+                dragDirection = yOffset > 0 ? "BottomToTop" : "TopToBottom"
+            }
+        }
+        
+        state: "collapsed"
+        states: [
+            State {
+                name: "collapsed"
+                PropertyChanges {
+                    target: bottomEdgeHint
+                    y: collapsedPosition
+                }
+                PropertyChanges {
+                    target: hintIcon
+                    width: hintSize/4
+                }
+            },
+            State {
+                name: "expanded"
+                PropertyChanges {
+                    target: bottomEdgeHint
+                    y: expandedPosition
+                }
+                PropertyChanges {
+                    target: hintIcon
+                    width: hintSize/2
+                }
+            },
+            
+            State {
+                name: "floating"
+                when: mouseArea.drag.active
+            }
+        ]
+        
+        transitions: [
+            Transition {
+                to: "expanded"
+                SpringAnimation {
+                    target: bottomEdgeHint
+                    property: "y"
+                    spring: 2
+                    damping: 0.2
+                }
+                SpringAnimation {
+                    target: hintIcon
+                    property: "width"
+                    spring: 2
+                    damping: 0.2
+                }
+            },
+            
+            Transition {
+                to: "collapsed"
+                SmoothedAnimation {
+                    target: bottomEdgeHint
+                    property: "y"
+                    duration: UbuntuAnimation.BriskDuration
+                }
+            }
+        ]
+    }
+}

=== modified file 'components/HighscoresTab.qml'
--- components/HighscoresTab.qml	2014-10-06 12:41:09 +0000
+++ components/HighscoresTab.qml	2015-07-17 11:50:08 +0000
@@ -1,6 +1,6 @@
 import QtQuick 2.3
-import Ubuntu.Components 1.1
-import Ubuntu.Components.ListItems 1.0 as ListItem
+import Ubuntu.Components 1.2
+//import Ubuntu.Components.ListItems 1.0 as ListItem
 import QtQuick.LocalStorage 2.0
 import Ubuntu.Components.Popups 1.0
 import Ubuntu.Layouts 1.0
@@ -20,56 +20,88 @@
     {
         highscoresModel.clear()
     }
-
-    tools: ToolbarItems {
-        ToolbarButton {
-            action: Action {
-                objectName: "allusersbutton"
-                text: "All\nusers"
-                iconSource: Qt.resolvedUrl("../icons/all-users.svg")
-                onTriggered: {
-                    var allScores = Settings.getAllScores()
-                    highscoresModel.clear();
-                    highscoresHeaderText = i18n.tr("<b>Best scores for all players</b>");
-                    for(var i = 0; i < allScores.length; i++) {
-                        var rowItem = allScores[i];
-                        //print("ROW ",rowItem)
-                        var firstName = Settings.getUserFirstName(rowItem[0]);
-                        var lastName = Settings.getUserLastName(rowItem[0]);
-                        //res.push([dbItem.first_name, dbItem.last_name, dbItem.score])
-                        highscoresModel.append({'firstname': firstName,
-                                                   'lastname':  lastName,
-                                                   'score': rowItem[1] });
-                    }
-                }
-            }
-        }
-        ToolbarButton {
-            action: Action {
-                text: "Current\nuser"
-                objectName: "currentuserbutton"
-                iconSource: Qt.resolvedUrl("../icons/single-user.svg")
-                onTriggered: {
-                    var firstName = Settings.getUserFirstName(currentUserId);
-                    var lastName = Settings.getUserLastName(currentUserId);
-                    //print(firstName, lastName)
-                    // TRANSLATORS: %1 is user's first name and %2 is last name
-                    highscoresHeaderText = "<b>" + i18n.tr("Best scores for %1 %2").arg(firstName).arg(lastName) + "</b>"
-                    var allScores = Settings.getAllScoresForUser(currentUserId)
-                    highscoresModel.clear();
-                    for(var i = 0; i < allScores.length; i++) {
-                        var rowItem = allScores[i];
-                        //res.push([dbItem.first_name, dbItem.last_name, dbItem.score])
-                        highscoresModel.append({'firstname': firstName,
-                                                   'lastname':  lastName,
-                                                   'score': rowItem[1] });
-                    }
-                }
-            }
-        }
+    function clearModelProfileId(id)
+    {
+        var firstName = Settings.getUserFirstName(currentUserId);
+        var lastName = Settings.getUserLastName(currentUserId);
+        for (var i = 0; i < highscoresModel.count; i++)
+        {
+            if (highscoresModel.get(i).firstname === firstName &&
+                highscoresModel.get(i).lastname === lastName )
+                highscoresModel.remove(i);
+        }
+    }
+
+    BottomEdge {
+        z:2
+        hintIconName: "delete"
+        actions: [
+            RadialAction {
+                iconName: "contact"
+                iconColor: UbuntuColors.orange
+                onTriggered: {
+                    Settings.deleteScoresWithProfileId(currentUserId)
+                    highscoresModel.clearModelProfileId(currentUserId);
+                }
+            },
+            RadialAction {
+                iconName: "contact-group"
+                iconColor: UbuntuColors.orange
+                onTriggered: {
+                    Settings.deleteAllScores();
+                    highscoresModel.clear();
+                }
+            }
+        ]
+    }
+
+    head.actions:  [
+        Action {
+            objectName: "allusersbutton"
+            text: "All\nusers"
+            iconSource: Qt.resolvedUrl("../icons/all-users.svg")
+            onTriggered: {
+                var allScores = Settings.getAllScores()
+                highscoresModel.clear();
+                highscoresHeaderText = i18n.tr("<b>Best scores for all players</b>");
+                for(var i = 0; i < allScores.length; i++) {
+                    var rowItem = allScores[i];
+                    //print("ROW ",rowItem)
+                    var firstName = Settings.getUserFirstName(rowItem[1]);
+                    var lastName = Settings.getUserLastName(rowItem[1]);
+                    //res.push([dbItem.first_name, dbItem.last_name, dbItem.score])
+                    highscoresModel.append({ 'id': rowItem[0],
+                                               'firstname': firstName,
+                                               'lastname':  lastName,
+                                               'score': rowItem[2] });
+                }
+            }
+        },
+        Action {
+            text: "Current\nuser"
+            objectName: "currentuserbutton"
+            iconSource: Qt.resolvedUrl("../icons/single-user.svg")
+            onTriggered: {
+                var firstName = Settings.getUserFirstName(currentUserId);
+                var lastName = Settings.getUserLastName(currentUserId);
+                //print(firstName, lastName)
+                // TRANSLATORS: %1 is user's first name and %2 is last name
+                highscoresHeaderText = "<b>" + i18n.tr("Best scores for %1 %2").arg(firstName).arg(lastName) + "</b>"
+                var allScores = Settings.getAllScoresForUser(currentUserId)
+                highscoresModel.clear();
+                for(var i = 0; i < allScores.length; i++) {
+                    var rowItem = allScores[i];
+                    //res.push([dbItem.first_name, dbItem.last_name, dbItem.score])
+                    highscoresModel.append({'firstname': firstName,
+                                               'lastname':  lastName,
+                                               'score': rowItem[1] });
+                }
+            }
+        }
+
         //locked: true
         //opened: true
-    }
+    ]
 
 
     ListModel {
@@ -82,12 +114,13 @@
             for(var i = 0; i < allScores.length; i++) {
                 var rowItem = allScores[i];
                 //print("ROW ",rowItem)
-                var firstName = Settings.getUserFirstName(rowItem[0]);
-                var lastName = Settings.getUserLastName(rowItem[0]);
+                var firstName = Settings.getUserFirstName(rowItem[1]);
+                var lastName = Settings.getUserLastName(rowItem[1]);
                 //res.push([dbItem.first_name, dbItem.last_name, dbItem.score])
-                highscoresModel.append({'firstname': firstName,
+                highscoresModel.append({ 'id': rowItem[0],
+                                           'firstname': firstName,
                                            'lastname':  lastName,
-                                           'score': rowItem[1] });
+                                           'score': rowItem[2] });
             }
         }
 
@@ -105,20 +138,44 @@
     Column {
         anchors.fill: parent
         clip: true
-        ListView {
+        UbuntuListView {
             id: highScoresListView
             model: highscoresModel
             width: parent.width
             height:parent.height
 
-            header: ListItem.Header {
+            header: Label {
                 id: highscoresHeader
                 objectName: "highscoreslabel"
                 text: highscoresHeaderText
+                height: units.gu(5)
             }
-            delegate: ListItem.SingleValue {
-                text: (index+1) + ".   " + firstname + " " + lastname
-                value: score
+
+            delegate: ListItem {
+                Label {
+                    anchors.left: parent.left
+                    anchors.leftMargin: units.gu(1)
+                    text: (index+1) + ".   " + firstname + " " + lastname
+                }
+                Label {
+                    anchors.right: parent.right
+                    anchors.rightMargin: units.gu(1)
+                    text: score
+                }
+
+                leadingActions: ListItemActions {
+                    actions: [
+                        Action {
+                            iconName: "delete"
+                            onTriggered: {
+                                //print(index, id, firstname);
+                                Settings.deleteScoreWithId(id);
+                                highscoresModel.remove(index,1);
+                            }
+                        }
+                    ]
+                }
+                //value: score
             }
         }
     }

=== added file 'components/RadialAction.qml'
--- components/RadialAction.qml	1970-01-01 00:00:00 +0000
+++ components/RadialAction.qml	2015-07-17 11:50:08 +0000
@@ -0,0 +1,9 @@
+import QtQuick 2.0
+import Ubuntu.Components 1.1
+
+Action {
+    property string iconName: "add"
+    property color iconColor: "Black"
+    property color backgroundColor: "White"
+    property bool enabled: true
+}

=== modified file 'components/SudokuBlocksGrid.qml'
--- components/SudokuBlocksGrid.qml	2015-02-23 07:44:43 +0000
+++ components/SudokuBlocksGrid.qml	2015-07-17 11:50:08 +0000
@@ -511,15 +511,34 @@
 
 
 
-
             SudokuButtonsGrid {
                 id:buttonsGrid;
+            }
 
+            Rectangle {
+                id: backRectangle
+                color: UbuntuColors.coolGrey
+                //anchors.fill: parent
+                z:-2
+                width: bigBlocksGrid.width
+                height: bigBlocksGrid.height
+                x: bigBlocksGrid.x
+                y: bigBlocksGrid.y
+                PropertyAnimation {
+                    target: backRectangle;
+                    property: "scale";
+                    from: 0.0;
+                    to: 1.0;
+                    duration: UbuntuAnimation.SlowDuration;
+                    running: true;
+                    loops: 1;
+                }
             }
 
             Grid {
-                rowSpacing: blockDistance
-                columnSpacing: blockDistance
+                id: bigBlocksGrid
+                rowSpacing: units.dp(2)
+                columnSpacing: units.dp(2)
                 columns: 3
                 z: -1
                 x: units.gu(1) - units.dp(4)
@@ -529,22 +548,20 @@
                     id: blocks
                     delegate: BigBlock {
                         id: block
-                        color: index % 2 == 0 ? UbuntuColors.warmGrey : Qt.lighter(UbuntuColors.warmGrey, 1.15)
+                        color: index % 2 == 0 ? "#dcdcd5" : "#ecece5"
                         PropertyAnimation {
+                            id: blocksAnimation
                             target: block;
                             property: "scale";
                             from: 0.0;
                             to: 1.0;
-                            duration: UbuntuAnimation.SlowDuration;
+                            duration: UbuntuAnimation.FastDuration;
                             running: true;
                             loops: 1;
                         }
                     }
                 }
             }
-
-
-
         }
     }
 }

=== modified file 'components/SudokuButtonsGrid.qml'
--- components/SudokuButtonsGrid.qml	2015-02-23 07:44:43 +0000
+++ components/SudokuButtonsGrid.qml	2015-07-17 11:50:08 +0000
@@ -54,7 +54,8 @@
         buttonText: "0";
         //width: units.gu(5);
         //height: units.gu(5);
-        size: mainView.width/mainView.height < mainView.resizeFactor ? mainView.width/10: units.gu(50)/10;
+        size: mainView.width/mainView.height < mainView.resizeFactor ?
+                  mainView.width/10: units.gu(50)/10;
         //color: defaultColor;
         //border.width: 0
         //border.color: defaultBorderColor
@@ -129,6 +130,7 @@
         buttonColor: defaultColor;
         textColor: defaultTextColor
     }
+
     Component.onCompleted: {
         switch(difficultySelector.selectedIndex) {
         case 0:

=== modified file 'icons/about.png'
Binary files icons/about.png	2014-03-18 12:16:55 +0000 and icons/about.png	2015-07-17 11:50:08 +0000 differ
=== modified file 'js/localStorage.js'
--- js/localStorage.js	2014-08-19 10:48:30 +0000
+++ js/localStorage.js	2015-07-17 11:50:08 +0000
@@ -105,6 +105,60 @@
     return res;
 }
 
+function deleteScoreWithId(id)
+{
+    var db = getDatabase();
+    var res="";
+    db.transaction(function(tx) {
+        var rs = tx.executeSql('DELETE FROM scores WHERE id=?;', [id]);
+        //console.log(id, rs.rowsAffected)
+        if (rs.rowsAffected > 0) {
+            res = "OK";
+        } else {
+            res = "Error";
+        }
+    }
+    );
+    // The function returns “OK” if it was successful, or “Error” if it wasn't
+    return res;
+}
+
+function deleteAllScores()
+{
+    var db = getDatabase();
+    var res="";
+    db.transaction(function(tx) {
+        var rs = tx.executeSql('DELETE FROM scores;');
+        //console.log(id, rs.rowsAffected)
+        if (rs.rowsAffected > 0) {
+            res = "OK";
+        } else {
+            res = "Error";
+        }
+    }
+    );
+    // The function returns “OK” if it was successful, or “Error” if it wasn't
+    return res;
+}
+
+function deleteScoresWithProfileId(profile_id)
+{
+    var db = getDatabase();
+    var res="";
+    db.transaction(function(tx) {
+        var rs = tx.executeSql('DELETE FROM scores WHERE profile_id=?;', profile_id);
+        //console.log(id, rs.rowsAffected)
+        if (rs.rowsAffected > 0) {
+            res = "OK";
+        } else {
+            res = "Error";
+        }
+    }
+    );
+    // The function returns “OK” if it was successful, or “Error” if it wasn't
+    return res;
+}
+
 function getAllScores()
 {
     var db = getDatabase();
@@ -112,10 +166,10 @@
 
     //print("GETTING ALL SCORES")
     db.transaction( function(tx) {
-        var rs = tx.executeSql("SELECT profile_id, score FROM scores order by score desc limit 10;");
+        var rs = tx.executeSql("SELECT id, profile_id, score FROM scores order by score desc limit 10;");
         for(var i = 0; i < rs.rows.length; i++) {
             var dbItem = rs.rows.item(i);
-            res.push([dbItem.profile_id, dbItem.score])
+            res.push([dbItem.id, dbItem.profile_id, dbItem.score])
         }
     });
     //print(res);

=== modified file 'po/com.ubuntu.sudoku.pot'
--- po/com.ubuntu.sudoku.pot	2015-02-23 07:44:43 +0000
+++ po/com.ubuntu.sudoku.pot	2015-07-17 11:50:08 +0000
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: sudoku-app\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-02-23 08:42+0100\n"
+"POT-Creation-Date: 2015-07-17 13:47+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@xxxxxx>\n"
@@ -18,15 +18,15 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 
-#: ../components/AboutTab.qml:102
+#: ../components/AboutTab.qml:103
 msgid "Author(s): "
 msgstr ""
 
-#: ../components/AboutTab.qml:112
+#: ../components/AboutTab.qml:113
 msgid "Contact: "
 msgstr ""
 
-#: ../components/AboutTab.qml:138
+#: ../components/AboutTab.qml:139
 msgid "Version: "
 msgstr ""
 
@@ -43,7 +43,7 @@
 msgstr ""
 
 #: ../components/AddProfileDialog.qml:53
-#: ../components/ManageProfileDialog.qml:69 ../sudoku-app.qml:351
+#: ../components/ManageProfileDialog.qml:69 ../sudoku-app.qml:354
 msgid "OK"
 msgstr ""
 
@@ -63,19 +63,40 @@
 
 #: ../components/AddProfileDialog.qml:85
 #: ../components/ManageProfileDialog.qml:127
-#: ../components/SudokuBlocksGrid.qml:492 ../sudoku-app.qml:504
-#: ../sudoku-app.qml:965 ../sudoku-app.qml:1017
+#: ../components/SudokuBlocksGrid.qml:492 ../sudoku-app.qml:507
+#: ../sudoku-app.qml:881 ../sudoku-app.qml:933
 msgid "Cancel"
 msgstr ""
 
-#: ../components/HighscoresTab.qml:33 ../components/HighscoresTab.qml:81
-#: ../sudoku-app.qml:24 ../sudoku-app.qml:153 ../sudoku-app.qml:206
-#: ../sudoku-app.qml:242
+#: ../components/BottomEdge.qml:58
+msgid "Delete scores"
+msgstr ""
+
+#: ../components/BottomEdgeSlide.qml:96 ../components/BottomEdgeSlide.qml:126
+#: ../components/BottomEdgeSlide.qml:155
+msgid "4"
+msgstr ""
+
+#: ../components/BottomEdgeSlide.qml:110
+msgid "Not allowed"
+msgstr ""
+
+#: ../components/BottomEdgeSlide.qml:140
+msgid "Start blocks"
+msgstr ""
+
+#: ../components/BottomEdgeSlide.qml:169
+msgid "Hinted blocks"
+msgstr ""
+
+#: ../components/HighscoresTab.qml:66 ../components/HighscoresTab.qml:113
+#: ../sudoku-app.qml:24 ../sudoku-app.qml:153 ../sudoku-app.qml:207
+#: ../sudoku-app.qml:244
 msgid "<b>Best scores for all players</b>"
 msgstr ""
 
 #. TRANSLATORS: %1 is user's first name and %2 is last name
-#: ../components/HighscoresTab.qml:57 ../sudoku-app.qml:175
+#: ../components/HighscoresTab.qml:89 ../sudoku-app.qml:176
 #, qt-format
 msgid "Best scores for %1 %2"
 msgstr ""
@@ -122,7 +143,7 @@
 msgstr[0] ""
 msgstr[1] ""
 
-#: ../js/localStorage.js:11 ../sudoku-app.qml:684
+#: ../js/localStorage.js:11 ../sudoku-app.qml:688
 #: com.ubuntu.sudoku_sudoku.desktop.in.in.h:1
 msgid "Sudoku"
 msgstr ""
@@ -131,7 +152,7 @@
 msgid "User"
 msgstr ""
 
-#: ../sudoku-app.qml:50 ../sudoku-app.qml:51 ../sudoku-app.qml:756
+#: ../sudoku-app.qml:50 ../sudoku-app.qml:51 ../sudoku-app.qml:763
 msgid "New game"
 msgstr ""
 
@@ -171,141 +192,129 @@
 msgid "Show scores for all users"
 msgstr ""
 
-#: ../sudoku-app.qml:167 ../sudoku-app.qml:168
+#: ../sudoku-app.qml:168 ../sudoku-app.qml:169
 msgid "Show scores for current user"
 msgstr ""
 
-#: ../sudoku-app.qml:231
+#: ../sudoku-app.qml:233
 msgid ""
 "You are a cheat... \n"
 "But we give you\n"
 msgstr ""
 
-#: ../sudoku-app.qml:233
+#: ../sudoku-app.qml:235
 msgid "point."
 msgid_plural "points."
 msgstr[0] ""
 msgstr[1] ""
 
-#: ../sudoku-app.qml:338
+#: ../sudoku-app.qml:341
 msgid "Sudoku games played today"
 msgstr ""
 
-#: ../sudoku-app.qml:339
+#: ../sudoku-app.qml:342
 msgid "No Sudoku games played today"
 msgstr ""
 
-#: ../sudoku-app.qml:368
+#: ../sudoku-app.qml:371
 msgid "New Game"
 msgstr ""
 
-#: ../sudoku-app.qml:369
+#: ../sudoku-app.qml:372
 msgid "Select difficulty level"
 msgstr ""
 
-#: ../sudoku-app.qml:433 ../sudoku-app.qml:1064
+#: ../sudoku-app.qml:436 ../sudoku-app.qml:982
 msgid "Easy"
 msgstr ""
 
-#: ../sudoku-app.qml:452 ../sudoku-app.qml:1064
+#: ../sudoku-app.qml:455 ../sudoku-app.qml:982
 msgid "Moderate"
 msgstr ""
 
-#: ../sudoku-app.qml:469 ../sudoku-app.qml:1064
+#: ../sudoku-app.qml:472 ../sudoku-app.qml:982
 msgid "Hard"
 msgstr ""
 
-#: ../sudoku-app.qml:486
+#: ../sudoku-app.qml:489
 msgid ""
 "Ultra\n"
 "Hard"
 msgstr ""
 
-#: ../sudoku-app.qml:740
+#: ../sudoku-app.qml:744
 msgid "You are a cheat..."
 msgstr ""
 
-#: ../sudoku-app.qml:740
+#: ../sudoku-app.qml:744
 msgid "Congratulations!"
 msgstr ""
 
-#: ../sudoku-app.qml:775
+#: ../sudoku-app.qml:780
 msgid "Show hint"
 msgstr ""
 
-#: ../sudoku-app.qml:838
-msgid "Not allowed"
-msgstr ""
-
-#: ../sudoku-app.qml:859
-msgid "Start blocks"
-msgstr ""
-
-#: ../sudoku-app.qml:880
-msgid "Hinted blocks"
-msgstr ""
-
-#: ../sudoku-app.qml:904
+#: ../sudoku-app.qml:820
 msgid "Scores"
 msgstr ""
 
-#: ../sudoku-app.qml:914
+#: ../sudoku-app.qml:830
 msgid "Settings"
 msgstr ""
 
-#: ../sudoku-app.qml:936 ../sudoku-app.qml:984
+#: ../sudoku-app.qml:852 ../sudoku-app.qml:900
 msgid "Select profile"
 msgstr ""
 
-#: ../sudoku-app.qml:1057
+#: ../sudoku-app.qml:973
 msgid "<b>Sudoku settings</b>"
 msgstr ""
 
-#: ../sudoku-app.qml:1063
+#: ../sudoku-app.qml:979
 msgid "Default Difficulty"
 msgstr ""
 
-#: ../sudoku-app.qml:1064
+#: ../sudoku-app.qml:982
 msgid "Ultra Hard"
 msgstr ""
 
-#: ../sudoku-app.qml:1064
+#: ../sudoku-app.qml:982
 msgid "Always ask"
 msgstr ""
 
-#: ../sudoku-app.qml:1106
+#: ../sudoku-app.qml:1024
 msgid "Theme"
 msgstr ""
 
-#: ../sudoku-app.qml:1130
+#: ../sudoku-app.qml:1050
 msgid "Hints"
 msgstr ""
 
-#: ../sudoku-app.qml:1146
+#: ../sudoku-app.qml:1066
 msgid "Vibration Alerts"
 msgstr ""
 
-#: ../sudoku-app.qml:1161
+#: ../sudoku-app.qml:1083
 msgid "<b>Profiles settings</b>"
 msgstr ""
 
-#: ../sudoku-app.qml:1165
+#: ../sudoku-app.qml:1087
 msgid "Current profile"
 msgstr ""
 
-#: ../sudoku-app.qml:1169
+#: ../sudoku-app.qml:1091
 msgid "None"
 msgstr ""
 
-#: ../sudoku-app.qml:1205
+#: ../sudoku-app.qml:1127
 msgid "Add profile"
 msgstr ""
 
-#: ../sudoku-app.qml:1214
+#: ../sudoku-app.qml:1136
 msgid "Manage profiles"
 msgstr ""
 
-#: ../sudoku-app.qml:1246
+#: ../sudoku-app.qml:1168
 msgid "About"
 msgstr ""
 

=== modified file 'sudoku-app.qml'
--- sudoku-app.qml	2015-02-23 07:44:43 +0000
+++ sudoku-app.qml	2015-07-17 11:50:08 +0000
@@ -154,12 +154,13 @@
                 for(var i = 0; i < allScores.length; i++) {
                     var rowItem = allScores[i];
                     //print("ROW ",rowItem)
-                    var firstName = Settings.getUserFirstName(rowItem[0]);
-                    var lastName = Settings.getUserLastName(rowItem[0]);
+                    var firstName = Settings.getUserFirstName(rowItem[1]);
+                    var lastName = Settings.getUserLastName(rowItem[1]);
                     //res.push([dbItem.first_name, dbItem.last_name, dbItem.score])
-                    highscoresModel.append({'firstname': firstName,
+                    highscoresModel.append({ 'id': rowItem[0],
+                                               'firstname': firstName,
                                                'lastname':  lastName,
-                                               'score': rowItem[1] });
+                                               'score': rowItem[2] });
                 }
             }
         },
@@ -207,15 +208,16 @@
         for(var i = 0; i < allScores.length; i++) {
             var rowItem = allScores[i];
             //print("ROW ",rowItem)
-            var firstName = Settings.getUserFirstName(rowItem[0]);
-            var lastName = Settings.getUserLastName(rowItem[0]);
+            var firstName = Settings.getUserFirstName(rowItem[1]);
+            var lastName = Settings.getUserLastName(rowItem[1]);
             //res.push([dbItem.first_name, dbItem.last_name, dbItem.score])
             /*highscoresModel.append({'firstname': firstName,
                                        'lastname':  lastName,
                                        'score': rowItem[1] });*/
-            hsPage.appendModel({'firstname': firstName,
-                                   'lastname':  lastName,
-                                   'score': rowItem[1] })
+            hsPage.appendModel({ 'id': rowItem[0],
+                              'firstname': firstName,
+                              'lastname':  lastName,
+                              'score': rowItem[2] });
 
         }
     }
@@ -243,15 +245,16 @@
                 for(var i = 0; i < allScores.length; i++) {
                     var rowItem = allScores[i];
                     //(print("ROW ",rowItem)
-                    var firstName = Settings.getUserFirstName(rowItem[0]);
-                    var lastName = Settings.getUserLastName(rowItem[0]);
+                    var firstName = Settings.getUserFirstName(rowItem[1]);
+                    var lastName = Settings.getUserLastName(rowItem[1]);
                     //res.push([dbItem.first_name, dbItem.last_name, dbItem.score])
                     /*highscoresModel.append({'firstname': firstName,
                                                'lastname':  lastName,
                                                'score': rowItem[1] });*/
-                    hsPage.appendModel({'firstname': firstName,
-                                           'lastname':  lastName,
-                                           'score': rowItem[1] })
+                    hsPage.appendModel({ 'id': rowItem[0],
+                                      'firstname': firstName,
+                                      'lastname':  lastName,
+                                      'score': rowItem[2] });
                 }
 
                 winTimer.restart();
@@ -649,15 +652,16 @@
             var rowItem = allScores[i];
             //res.push[dbItem.first_name, dbItem.last_name, dbItem.score])
             //print("ROW ",rowItem[0])
-            var firstName = Settings.getUserFirstName(rowItem[0])
-            var lastName = Settings.getUserLastName(rowItem[0])
+            var firstName = Settings.getUserFirstName(rowItem[1])
+            var lastName = Settings.getUserLastName(rowItem[1])
             //print(firstName, lastName)
             /*highscoresModel.append({'firstname': firstName,
                                        'lastname':  lastName,
                                        'score': rowItem[1] });*/
-            hsPage.appendModel({'firstname': firstName,
+            hsPage.appendModel({ 'id': rowItem[0],
+                                   'firstname': firstName,
                                    'lastname':  lastName,
-                                   'score': rowItem[1] })
+                                   'score': rowItem[2] })
         }
 
         if(Settings.getSetting("currentUserId")=="Unknown")
@@ -748,46 +752,39 @@
 
             page: Page {
 
-                tools: ToolbarItems {
-                    opened: true
-                    ToolbarButton {
-                        action: Action {
-                            objectName: "newgamebutton"
-                            text: i18n.tr("New game");
-                            iconSource: Qt.resolvedUrl("icons/new_game_ubuntu.svg")
-                            onTriggered: {
-                                if(gameFinishedRectangle.visible) gameFinishedRectangle.visible = false;
-                                //print("new block distance:", blockDistance);
-                                //createNewGame()
-                                if (settingsTab.difficultyIndex == 4)
-                                    PopupUtils.open(newGameComponent)
-                                else {
-                                    createNewGame()
-                                }
-                            }
-                        }
-                    }
-                    ToolbarButton {
-                        action: Action {
-                            objectName: "hintbutton"
-                            id: revealHintAction
-                            iconSource: Qt.resolvedUrl("icons/hint.svg")
-                            text: i18n.tr("Show hint");
-                            enabled: disableHints.checked;
-                            onTriggered: {
-                                revealHint()
-                            }
-                        }
-                    }
-                    /*
-                    Action {
-                        iconSource: Qt.resolvedUrl("icons/close.svg")
-                        text: i18n.tr("Close");
-                        onTriggered: Qt.quit()
-                    }
-                    */
+                BottomEdgeSlide {
+                    z:2
+                    hintIconName: "help-contents"
                 }
 
+                head.actions: [
+                    Action {
+                        objectName: "newgamebutton"
+                        text: i18n.tr("New game");
+                        iconSource: Qt.resolvedUrl("icons/new_game_ubuntu.svg")
+                        onTriggered: {
+                            if(gameFinishedRectangle.visible) gameFinishedRectangle.visible = false;
+                            //print("new block distance:", blockDistance);
+                            //createNewGame()
+                            if (settingsTab.difficultyIndex == 4)
+                            PopupUtils.open(newGameComponent)
+                            else {
+                                createNewGame()
+                            }
+                        }
+                    },
+                    Action {
+                        objectName: "hintbutton"
+                        id: revealHintAction
+                        iconSource: Qt.resolvedUrl("icons/hint.svg")
+                        text: i18n.tr("Show hint");
+                        enabled: disableHints.checked;
+                        onTriggered: {
+                            revealHint()
+                        }
+                    }
+                ]
+
                 //Column {
                 //    id: mainColumn;
                 //width: mainView.width;
@@ -810,87 +807,6 @@
 
                 }
 
-                Flow {
-                    id: informationRow;
-                    //y: 7*mainView.pageHeight/10;
-                    //width: mainView.pageWidth - units.dp(8);
-                    //anchors.horizontalCenter: parent.horizontalCenter
-                    x: !mainView.wideAspect() ? 0.5*(mainView.width - width) :
-                                                0.25*(mainView.width-9*sudokuBlocksGrid.blockSize-
-                                                      22*sudokuBlocksGrid.blockDistance)+9*sudokuBlocksGrid.blockSize + 35*sudokuBlocksGrid.blockDistance + units.gu(2)
-                    anchors.top: parent.top
-                    anchors.topMargin: !mainView.wideAspect() ?
-                                           9*sudokuBlocksGrid.blockSize + 35*sudokuBlocksGrid.blockDistance :
-                                           mainView.height*0.15
-
-                    //columns: !wideAspect ? 3 : 1
-                    flow: !mainView.wideAspect() ? Flow.LeftToRight : Flow.TopToBottom
-                    spacing: mainView.width/mainView.height < mainView.resizeFactor ? mainView.width/6 : units.gu(50)/6
-                    UbuntuShape {
-                        id: redFlag
-                        color: sudokuBlocksGrid.defaultNotAllowedColor
-                        width: mainView.width/mainView.height < mainView.resizeFactor ? 2*mainView.width/10: 2*units.gu(50)/10
-                        height: mainView.width/mainView.height < mainView.resizeFactor ? mainView.width/10: units.gu(50)/10
-                        //border.color: defaultBorderColor
-                        //radius: "medium"
-                        Label {
-                            id: redFlagText
-                            text: i18n.tr("Not allowed")
-                            fontSize: "x-small"
-                            color: settingsTab.themeIndex != 1 ? "white" : "black"
-                            width:units.gu(5);
-                            wrapMode: TextEdit.WordWrap;
-                            horizontalAlignment: Text.AlignHCenter
-                            anchors.centerIn: parent
-                            //                                    anchors.left: redFlag.right;
-                            //                                    anchors.leftMargin: units.dp(2);
-                            //                                    anchors.verticalCenter: redFlag.verticalCenter;
-                        }
-                    }
-                    UbuntuShape {
-                        id: blueFlag
-                        color: settingsTab.themeIndex === 1 ? "white" : sudokuBlocksGrid.defaultStartingColor
-                        //border.color: defaultBorderColor
-                        width: mainView.width/mainView.height < mainView.resizeFactor ? 2*mainView.width/10: 2*units.gu(50)/10
-                        height: mainView.width/mainView.height < mainView.resizeFactor ? mainView.width/10: units.gu(50)/10
-                        //radius: "medium";
-                        Label {
-                            id: blueFlagText
-                            text: i18n.tr("Start blocks")
-                            fontSize: "x-small"
-                            color: settingsTab.themeIndex != 1 ? "white" : "black"
-                            width:units.gu(5);
-                            wrapMode: TextEdit.WordWrap;
-                            horizontalAlignment: Text.AlignHCenter
-                            anchors.centerIn: parent
-                            //                                    anchors.left: blueFlag.right;
-                            //                                    anchors.leftMargin: units.dp(2);
-                            //                                    anchors.verticalCenter: blueFlag.verticalCenter;
-                        }
-                    }
-
-                    UbuntuShape {
-                        id: orangeFlag
-                        color: sudokuBlocksGrid.defaultHintColor
-                        //border.color: defaultBorderColor
-                        width: mainView.width/mainView.height < mainView.resizeFactor ? 2*mainView.width/10: 2*units.gu(50)/10
-                        height: mainView.width/mainView.height < mainView.resizeFactor ? mainView.width/10: units.gu(50)/10
-                        //radius: "medium";
-                        Label {
-                            text: i18n.tr("Hinted blocks")
-                            fontSize: "x-small"
-                            color: settingsTab.themeIndex != 1 ? "white" : "black"
-                            width:units.gu(5);
-                            wrapMode: TextEdit.WordWrap;
-                            horizontalAlignment: Text.AlignHCenter
-                            anchors.centerIn: parent
-                            //                                    anchors.left: orangeFlag.right;
-                            //                                    anchors.leftMargin: units.dp(2);
-                            //                                    anchors.verticalCenter: orangeFlag.verticalCenter;
-                        }
-                    }
-                }
-
                 //}
             }
 
@@ -1061,6 +977,8 @@
                             objectName: "difficultySelector"
                             id: difficultySelector
                             text: i18n.tr("Default Difficulty")
+                            width: parent.width - units.gu(4)
+                            anchors.horizontalCenter: parent.horizontalCenter
                             model: [i18n.tr("Easy"), i18n.tr("Moderate"), i18n.tr("Hard"), i18n.tr("Ultra Hard"), i18n.tr("Always ask")]
                             onSelectedIndexChanged: {
                                 //print(difficultySelector.selectedIndex)
@@ -1105,6 +1023,8 @@
                             id: themeSelector
                             text: i18n.tr("Theme")
                             model: ["UbuntuColours", "Simple"]
+                            width: parent.width - units.gu(4)
+                            anchors.horizontalCenter: parent.horizontalCenter
                             onSelectedIndexChanged: {
                                 var newColorScheme = null;
                                 if (selectedIndex == 0)
@@ -1157,6 +1077,8 @@
                                 }
                             }
                         }
+                        ListItem.Divider {}
+
                         ListItem.Header {
                             text: i18n.tr("<b>Profiles settings</b>")
                         }


Follow ups