From a6a78b9513625405c8ad8c702a89b7084139ddf1 Mon Sep 17 00:00:00 2001
From: "tatiana.novikova" <tatiana.novikova@demlabs.net>
Date: Thu, 30 Jan 2020 07:13:57 +0000
Subject: [PATCH] [+] Add history limits and append rules [+] Add automatic
 sending selected by double click command from history [+] Add using KeyUp and
 KeyDown to console history navigation [+] Add DapScrollView to the console
 ListView

---
 .../screen/DapMainApplicationWindow.qml       |  4 +-
 .../desktop/Console/DapConsoleRightPanel.qml  | 48 +++++++++-
 .../Console/DapConsoleRightPanelForm.ui.qml   | 14 +++
 .../desktop/Console/DapConsoleScreen.qml      | 91 ++++++++++++++++++-
 .../Console/DapConsoleScreenForm.ui.qml       | 64 ++++++++++---
 .../screen/desktop/Console/DapConsoleTab.qml  |  4 +-
 .../desktop/Console/DapConsoleTabForm.ui.qml  | 19 +++-
 libdap-qt-ui-qml                              |  2 +-
 8 files changed, 223 insertions(+), 23 deletions(-)

diff --git a/CellFrameDashboardGUI/screen/DapMainApplicationWindow.qml b/CellFrameDashboardGUI/screen/DapMainApplicationWindow.qml
index f7debc100..73e879aae 100644
--- a/CellFrameDashboardGUI/screen/DapMainApplicationWindow.qml
+++ b/CellFrameDashboardGUI/screen/DapMainApplicationWindow.qml
@@ -23,8 +23,8 @@ DapMainApplicationWindowForm
     {
         id: modelMenuTab
         
-        Component.onCompleted: {
-
+        Component.onCompleted:
+        {
             append({
                 name: qsTr("Dashboard"),
                 page: dashboardScreen,
diff --git a/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleRightPanel.qml b/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleRightPanel.qml
index 6bfb0620a..fdd8fd57c 100644
--- a/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleRightPanel.qml
+++ b/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleRightPanel.qml
@@ -2,24 +2,64 @@ import QtQuick 2.4
 
 DapConsoleRightPanelForm
 {
+    ///@detalis commandQuery Command for history.
+    property string commandQuery
+    ///@detalis historyQuery Text of command from the command history.
+    property string historyQuery
+    ///@detalis historySize Num of history command at right panel.
+    property int historySize: 10
+
+    dapRightPanelWidth: visible ? 300 * pt : 0 * pt
+
     ListModel
     {
         id: modelHistoryConsole
         ListElement
         {
-            query: "help"
+            query: "help1"
         }
         ListElement
         {
-            query: "wallet list"
+            query: "wallet list1"
         }
         ListElement
         {
-            query: "help"
+            query: "help2"
         }
         ListElement
         {
-            query: "wallet list"
+            query: "wallet list2"
+        }
+    }
+
+    //Returns true if item 'someElement' is already exist at list 'someModel'.
+    function findElement(someModel, someElement)
+    {
+        console.log("someElement.query", someElement.query)
+        for(var i = 0; i < someModel.count; ++i)
+            if(someModel.get(i).query === someElement.query)
+            {
+                modelHistoryConsole.remove(i);
+                return true;
+            }
+
+        return false;
+    }
+
+    onCommandQueryChanged:
+    {
+        console.log("commandQuery", commandQuery)
+        //Adding only new element
+        if(!findElement(modelHistoryConsole, {query: commandQuery}))
+        {
+            if(commandQuery !== "")
+                modelHistoryConsole.insert(0, {query: commandQuery});
         }
+        else
+            modelHistoryConsole.insert(0, {query: commandQuery});
+
+        //History is limited by historySize and realized as FIFO
+        if(historySize < modelHistoryConsole.count)
+            modelHistoryConsole.remove(modelHistoryConsole.count-1);
     }
 }
diff --git a/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleRightPanelForm.ui.qml b/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleRightPanelForm.ui.qml
index 5a7c8c0fc..cf57d06c3 100644
--- a/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleRightPanelForm.ui.qml
+++ b/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleRightPanelForm.ui.qml
@@ -13,6 +13,7 @@ DapAbstractRightPanel
             {
                 anchors.fill: parent
                 anchors.leftMargin: 16 * pt
+                anchors.rightMargin: 16 * pt
                 text: qsTr("Last actions")
                 verticalAlignment: Qt.AlignVCenter
                 horizontalAlignment: Text.AlignLeft
@@ -54,10 +55,23 @@ DapAbstractRightPanel
                         id: textCommand
                         text: query
                         color: "#070023"
+                        width: parent.width
+                        wrapMode: Text.Wrap
                         font.pixelSize: 14 * pt
                         font.family: "Roboto"
                         font.weight: Font.Normal
+                        //For the automatic sending selected command from history
+                        MouseArea
+                        {
+                            id: historyQueryMouseArea
+                            anchors.fill: textCommand
+                            onDoubleClicked: historyQuery = textCommand.text
+                        }
                     }
+                //It allows to see last element of list by default
+                currentIndex: count - 1
+                highlightFollowsCurrentItem: true
+                highlightRangeMode: ListView.ApplyRange
             }
         }
 }
diff --git a/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleScreen.qml b/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleScreen.qml
index 60a06a8bc..79fc3e611 100644
--- a/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleScreen.qml
+++ b/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleScreen.qml
@@ -4,6 +4,40 @@ import QtQuick.Layouts 1.0
 
 DapConsoleScreenForm
 {
+    ///@detalis sendCommand Text of command from the inputCommand
+    property string sendCommand
+    ///@detalis historyCommand Text of command from the command history
+    property string historyCommand
+    ///@detalis receivedAnswer Answer for the sended command
+    property string receivedAnswer
+
+
+    Component.onCompleted:
+    {
+        //The start point for using history
+        consoleHistoryIndex = modelConsoleCommand.count
+    }
+
+    QtObject
+    {
+        id: themeConsole
+        property font inputCommandFont:
+            Qt.font({
+                        pixelSize: 18 * pt,
+                        family: "Roboto",
+                        styleName: "Normal",
+                        weight: Font.Normal
+                    })
+
+        property font consoleCommandFont:
+            Qt.font({
+                        pixelSize: 18 * pt,
+                        family: "Roboto",
+                        styleName: "Normal",
+                        weight: Font.Normal
+                    })
+    }
+
     ListModel
     {
         id: modelConsoleCommand
@@ -12,6 +46,18 @@ DapConsoleScreenForm
             query: "Command"
             response: "This answer"
         }
+        ListElement
+        {
+            query: "Command"
+            response: "This answer may be very, very, very, very, very, very, very, very, very, very, very, very, very, very, very, very, very, very, very, very, very, very, very, very, very, very, very long"
+        }
+        ListElement
+        {
+            query: "One little query"
+            response: "One little response"
+        }
+
+
     }
 
     Component
@@ -19,18 +65,59 @@ DapConsoleScreenForm
         id: delegateConsoleCommand
         Column
         {
+            width: parent.width
             Text
             {
                 id: textQuery
                 text: "> " + query
-                font.pixelSize: 14 * pt
+                font: themeConsole.consoleCommandFont
             }
             Text
             {
                 id: textResponse
                 text: response
-                font.pixelSize: 14 * pt
+                width: parent.width
+                wrapMode: Text.Wrap
+                font: themeConsole.consoleCommandFont
+            }
+        }
+    }
+
+    //Send command from inputCommand TextArea
+    onSendedCommandChanged:
+    {
+        if(sendedCommand != "")
+        {
+            sendCommand = sendedCommand;
+            modelConsoleCommand.append({query: sendedCommand, response: receivedAnswer});
+            consoleHistoryIndex = modelConsoleCommand.count;
+            sendedCommand = "";
+        }
+    }
+
+    //Send command fron right history panel
+    onHistoryCommandChanged:
+    {
+        sendCommand = historyCommand;
+        modelConsoleCommand.append({query: sendCommand, response: receivedAnswer});
+        consoleHistoryIndex = modelConsoleCommand.count;
+    }
+
+    //Using KeyUp and KeyDown to serf on console history
+    onConsoleHistoryIndexChanged:
+    {
+        if(consoleHistoryIndex >= 0)
+        {
+            if(consoleHistoryIndex >= modelConsoleCommand.count)
+            {
+                consoleHistoryIndex = modelConsoleCommand.count;
+                currentCommand = "";
+                return;
             }
         }
+        else
+            consoleHistoryIndex = 0;
+        currentCommand = modelConsoleCommand.get(consoleHistoryIndex).query;
+        return;
     }
 }
diff --git a/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleScreenForm.ui.qml b/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleScreenForm.ui.qml
index 52a42384b..f2bf41aae 100644
--- a/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleScreenForm.ui.qml
+++ b/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleScreenForm.ui.qml
@@ -1,16 +1,31 @@
 import QtQuick 2.4
 import QtQuick.Controls 2.0
 import QtQuick.Layouts 1.0
+import "qrc:/widgets"
 import "../../"
 
 DapAbstractScreen
 {
+    id: consoleScreen
+
+    ///@detalis sendedCommand Text of command from the inputCommand.
+    property string sendedCommand
+    ///@detalis isCommandSended Sing of sending.
+    property bool isCommandSended
+    ///@detalis currentCommand Current text in consoleCmd.
+    property alias currentCommand: consoleCmd.text
+    ///@detalis consoleHistoryIndex Index for using KeyUp and KeyDown to the navigation in console history.
+    property int consoleHistoryIndex
+
     Rectangle
     {
+        id: consoleRectangle
         anchors.fill: parent
         anchors.topMargin: 24 * pt
         anchors.leftMargin: 20 * pt
         anchors.rightMargin: 20 * pt
+        anchors.bottomMargin: 20 * pt
+
 
         ListView
         {
@@ -18,21 +33,29 @@ DapAbstractScreen
             anchors.top: parent.top
             anchors.left: parent.left
             anchors.right: parent.right
-            anchors.bottom: inputCommand.top
+            height: (contentHeight < consoleRectangle.height - inputCommand.height) ? contentHeight : consoleRectangle.height - inputCommand.height
             clip: true
             model: modelConsoleCommand
             delegate: delegateConsoleCommand
+            currentIndex: count - 1
+            highlightFollowsCurrentItem: true
+            highlightRangeMode: ListView.ApplyRange
+            DapScrollViewHandling
+            {
+                id: scrollHandler
+                viewData: listViewConsoleCommand
+                scrollMouseAtArrow: consoleScroll.mouseAtArrow
+            }
         }
 
         RowLayout
         {
             id: inputCommand
-
             spacing: 0
-
-            anchors.bottom: parent.bottom
             anchors.left: parent.left
             anchors.right: parent.right
+            anchors.top: listViewConsoleCommand.bottom
+            height: consoleCmd.contentHeight
 
             Text
             {
@@ -40,9 +63,7 @@ DapAbstractScreen
                 verticalAlignment: Qt.AlignVCenter
                 text: ">"
                 color: "#070023"
-                font.pixelSize: 18 * pt
-                font.family: "Roboto"
-                font.weight: Font.Normal
+                font: themeConsole.inputCommandFont
             }
 
             TextArea
@@ -53,10 +74,31 @@ DapAbstractScreen
                 placeholderText: qsTr("Type here...")
                 selectByMouse: true
                 focus: true
-                font.pixelSize: 18 * pt
-                font.family: "Roboto"
-                font.weight: Font.Normal
-            }
+                font: themeConsole.inputCommandFont
+                Keys.onReturnPressed: text.length > 0 ? sendedCommand = text : sendedCommand = ""
+                Keys.onEnterPressed: text.length > 0 ? sendedCommand = text : sendedCommand = ""
+                Keys.onUpPressed: consoleHistoryIndex -= 1
+                Keys.onDownPressed: consoleHistoryIndex += 1
+             }
         }
+
+    }
+
+    DapScrollView
+    {
+        id: consoleScroll
+        scrollDownButtonImageSource: "qrc:/res/icons/ic_scroll-down.png"
+        scrollDownButtonHoveredImageSource: "qrc:/res/icons/ic_scroll-down_hover.png"
+        scrollUpButtonImageSource: "qrc:/res/icons/ic_scroll-up.png"
+        scrollUpButtonHoveredImageSource: "qrc:/res/icons/ic_scroll-up_hover.png"
+        viewData: listViewConsoleCommand
+        //Assign DapScrollView with DapScrollViewHandling which must have no parent-child relationship
+        onClicked: scrollHandler.scrollDirectionUp = !scrollHandler.scrollDirectionUp
+        scrollButtonVisible: scrollHandler.scrollVisible
+        scrollButtonArrowUp: scrollHandler.scrollDirectionUp
+        scrollButtonTopMargin: 10 * pt
+        scrollButtonBottomMargin: 10 * pt
+        scrollButtonLeftMargin: 10 * pt
+        scrollButtonRightMargin: 10 * pt
     }
 }
diff --git a/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleTab.qml b/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleTab.qml
index f50b551a9..aa7a4b51a 100644
--- a/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleTab.qml
+++ b/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleTab.qml
@@ -1,6 +1,8 @@
 import QtQuick 2.4
+import "qrc:/"
 
 DapConsoleTabForm
 {
-
+    //The console interface need in command handler
+    // Handler answer must be set to rAnswer
 }
diff --git a/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleTabForm.ui.qml b/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleTabForm.ui.qml
index 4576be55a..c27d9ef11 100644
--- a/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleTabForm.ui.qml
+++ b/CellFrameDashboardGUI/screen/desktop/Console/DapConsoleTabForm.ui.qml
@@ -6,9 +6,24 @@ DapAbstractTab
 {
     id: consoleTab
 
+    ///@detalis rAnswer Answer for the sended command
+    property string rAnswer
+
     dapTopPanel: DapConsoleTopPanel { }
 
-    dapScreen: DapConsoleScreen { }
+    dapScreen:
+        DapConsoleScreen
+        {
+            //Set receivedAnswer of dapScreen to the external variable rAnswer for the displaying it in console
+            receivedAnswer: rAnswer
+            //Assign historyCommand of dapScreen with dapRightPanel.historyQuery for ability to use right history panel to send command to the console
+            historyCommand: dapRightPanel.historyQuery
+        }
 
-    dapRightPanel: DapConsoleRightPanel { }
+    dapRightPanel:
+        DapConsoleRightPanel
+        {
+            //Assign commandQuery of dapRightPanel with dapScreen.sendCommand for set it to right history panelfrome console
+            commandQuery: dapScreen.sendCommand
+        }
 }
diff --git a/libdap-qt-ui-qml b/libdap-qt-ui-qml
index a86e079ef..5b93902e0 160000
--- a/libdap-qt-ui-qml
+++ b/libdap-qt-ui-qml
@@ -1 +1 @@
-Subproject commit a86e079efd20140004ed48a36bba6c46b8efd628
+Subproject commit 5b93902e0b1197f5e1fffbb0881091341322b541
-- 
GitLab