// Copyright (c) 2014-2018, The Monero Project // // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, are // permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, this list of // conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright notice, this list // of conditions and the following disclaimer in the documentation and/or other // materials provided with the distribution. // // 3. Neither the name of the copyright holder nor the names of its contributors may be // used to endorse or promote products derived from this software without specific // prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import QtQuick 2.7 import QtQuick.Layouts 1.1 import QtQuick.Controls 2.0 import "../../js/Utils.js" as Utils import "../../components" as MoneroComponents Rectangle { property alias consoleArea: consoleArea color: "transparent" height: 1400 Layout.fillWidth: true ColumnLayout { id: settingsLog property int itemHeight: 60 * scaleRatio Layout.fillWidth: true anchors.left: parent.left anchors.top: parent.top anchors.right: parent.right anchors.margins: (isMobile)? 17 : 20 anchors.topMargin: 0 spacing: 10 // Rectangle { // // divider // Layout.preferredHeight: 1 * scaleRatio // Layout.fillWidth: true // Layout.bottomMargin: 8 * scaleRatio // color: MoneroComponents.Style.dividerColor // opacity: MoneroComponents.Style.dividerOpacity // } Text { Layout.bottomMargin: 2 * scaleRatio color: MoneroComponents.Style.defaultFontColor font.pixelSize: 18 * scaleRatio font.family: MoneroComponents.Style.fontRegular.name text: qsTr("Log level") + translationManager.emptyString } GridLayout { id: logGrid columns: appWindow.persistentSettings.logLevel === 5 ? 2 : 1 Layout.fillWidth: true columnSpacing: 32 * scaleRatio z: parent.z + 1 ColumnLayout { spacing: 0 Layout.fillWidth: true ListModel { id: logLevel ListElement { column1: "0"; name: "none"; } ListElement { column1: "1"; } ListElement { column1: "2"; } ListElement { column1: "3"; } ListElement { column1: "4"; } ListElement { column1: "custom"; } } MoneroComponents.StandardDropdown { id: logLevelDropdown dataModel: logLevel itemTopMargin: 2 * scaleRatio currentIndex: appWindow.persistentSettings.logLevel; onChanged: { if (currentIndex == 5) { console.log("log categories changed: ", logCategories.text); walletManager.setLogCategories(logCategories.text); } else { console.log("log level changed: ",currentIndex); walletManager.setLogLevel(currentIndex); } appWindow.persistentSettings.logLevel = currentIndex; } Layout.fillWidth: true Layout.preferredWidth: logGrid.width / 2 shadowReleasedColor: "#FF4304" shadowPressedColor: "#B32D00" releasedColor: "#363636" pressedColor: "#202020" } } MoneroComponents.LineEdit { id: logCategories visible: persistentSettings.logLevel === 5 Layout.fillWidth: true Layout.preferredWidth: logGrid.width / 2 text: appWindow.persistentSettings.logCategories placeholderText: "(e.g. *:WARNING,net.p2p:DEBUG)" placeholderFontSize: 14 * scaleRatio fontSize: 14 * scaleRatio enabled: logLevelDropdown.currentIndex === 5 onEditingFinished: { if(enabled) { console.log("log categories changed: ", text); walletManager.setLogCategories(text); appWindow.persistentSettings.logCategories = text; } } } } Text { Layout.topMargin: 10 * scaleRatio Layout.bottomMargin: 2 * scaleRatio color: MoneroComponents.Style.defaultFontColor font.pixelSize: 18 * scaleRatio font.family: MoneroComponents.Style.fontRegular.name text: qsTr("Daemon log") + translationManager.emptyString } Flickable { id: flickable Layout.fillWidth: true Layout.preferredHeight: 240 * scaleRatio TextArea.flickable: TextArea { id : consoleArea anchors.fill: parent color: MoneroComponents.Style.defaultFontColor selectionColor: MoneroComponents.Style.dimmedFontColor textFormat: TextEdit.RichText selectByMouse: true selectByKeyboard: true font.family: "Ariel" font.pixelSize: 14 * scaleRatio wrapMode: TextEdit.Wrap readOnly: true background: Rectangle { color: "transparent" anchors.fill: parent border.color: Qt.rgba(255, 255, 255, 0.25); border.width: 1 radius: 4 } function logCommand(msg){ msg = log_color(msg, "lime"); consoleArea.append(msg); } function logMessage(msg){ msg = msg.trim(); var color = "white"; if(msg.toLowerCase().indexOf('error') >= 0){ color = "red"; } else if (msg.toLowerCase().indexOf('warning') >= 0){ color = "yellow"; } // format multi-lines if(msg.split("\n").length >= 2){ msg = msg.split("\n").join('
'); } log(msg, color); } function log_color(msg, color){ return "" + msg + ""; } function log(msg, color){ var timestamp = Utils.formatDate(new Date(), { weekday: undefined, month: "numeric", timeZoneName: undefined }); var _timestamp = log_color("[" + timestamp + "]", "#FFFFFF"); var _msg = log_color(msg, color); consoleArea.append(_timestamp + " " + _msg); // scroll to bottom //if(flickable.contentHeight > content.height){ // flickable.contentY = flickable.contentHeight; //} } } ScrollBar.vertical: ScrollBar { // TODO: scrollbar always visible is buggy. // QT 5.9 introduces `policy: ScrollBar.AlwaysOn` contentItem.opacity: 1 anchors.top: flickable.top anchors.left: flickable.right anchors.leftMargin: 10 * scaleRatio anchors.bottom: flickable.bottom } } MoneroComponents.LineEdit { id: sendCommandText Layout.fillWidth: true fontBold: false placeholderText: qsTr("command + enter (e.g 'help' or 'status')") + translationManager.emptyString placeholderFontSize: 16 * scaleRatio onAccepted: { if(text.length > 0) { consoleArea.logCommand(">>> " + text) daemonManager.sendCommand(text, currentWallet.nettype); } text = "" } } } Component.onCompleted: { logLevelDropdown.currentIndex = persistentSettings.logLevel; logLevelDropdown.update(); if(typeof daemonManager != "undefined") daemonManager.daemonConsoleUpdated.connect(onDaemonConsoleUpdated) } }