Merge branch 'qml_app_ui_aesthetic' into evaluation-II

This commit is contained in:
Gioacchino Mazzurco 2017-07-14 11:09:59 +02:00
commit ee357298c7
55 changed files with 4187 additions and 291 deletions

View File

@ -1,76 +0,0 @@
/*
* RetroShare Android QML App
* Copyright (C) 2017 Gioacchino Mazzurco <gio@eigenlab.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import QtQuick 2.7
Item
{
id: compRoot
property string gxs_id
height: 130
width: height
////////////// The following should be considered privates /////////////////////
property bool has_avatar: false
property int avatarAttemptCnt: 0
function getDetails()
{
++compRoot.avatarAttemptCnt
rsApi.request(
"/identity/get_identity_details",
JSON.stringify({ gxs_id: compRoot.gxs_id }),
function(par)
{
var jData = JSON.parse(par.response).data
setDetails(jData)
if(!compRoot.has_avatar &&
compRoot.avatarAttemptCnt < 3) getDetails()
})
}
function setDetails(data)
{
compRoot.has_avatar = data.avatar.length > 0
if(compRoot.has_avatar)
{
contactAvatar.source =
"data:image/png;base64," + data.avatar
}
}
Component.onCompleted: if(visible && !has_avatar) getDetails()
onVisibleChanged: if(visible && !has_avatar) getDetails()
Image
{
id: contactAvatar
anchors.fill: parent
visible: compRoot.has_avatar
}
ColorHash
{
anchors.fill: parent
visible: !compRoot.has_avatar
hash: compRoot.gxs_id
}
}

View File

@ -0,0 +1,117 @@
import QtQuick 2.7
import QtQuick.Layouts 1.2
import QtQuick.Controls 2.0
import "." // To load styles
import "./components"
Item
{
id: chatBubbleDelegate
height: bubble.height
width: parent.width
property var styles: StyleChat.bubble
Rectangle
{
id: rootBubble
anchors.fill: parent
width: parent.width
height: parent.height
Rectangle
{
id: bubble
width: Math.min (
rootBubble.width * styles.bubbleMaxWidth,
Math.max(mesageText.implicitWidth, sendersName.implicitWidth )
) + timeText.implicitWidth + styles.aditionalBubbleWidth
height: mesageText.height + sendersName.height + styles.aditionalBubbleHeight
anchors.left: (model.incoming)? parent.left : undefined
anchors.right: (!model.incoming)? parent.right : undefined
color: (!model.incoming)? styles.colorOutgoing : styles.colorIncoming
radius: styles.radius
Text
{
id: sendersName
visible: model.incoming
text: (model.incoming)? model.author_name + ":" : ""
color: styles.colorSenderName
font.bold: true
anchors.leftMargin: styles.lMarginBubble
anchors.rightMargin: styles.rMarginBubble
anchors.topMargin: styles.tMarginBubble
anchors.top: bubble.top
anchors.left: (model.incoming)? parent.left : undefined
anchors.right:(!model.incoming)? parent.right : undefined
// Used for give minimum heigh to time when the message is bigger than the bubble in sended messages
height: (model.incoming || !model.incoming &&
mesageText.implicitWidth >= (rootBubble.width * styles.bubbleMaxWidth) )? implicitHeight : 0
}
Text
{
id: timeText
text: getMessageTime()
color: styles.colorMessageTime
anchors.left: (!model.incoming)? parent.left : undefined
anchors.right:(model.incoming)? parent.right : undefined
anchors.top: bubble.top
anchors.leftMargin: styles.lMarginBubble
anchors.rightMargin: styles.rMarginBubble
anchors.topMargin: styles.tMarginBubble
}
Text
{
id: mesageText
text: model.msg
width: rootBubble.width * styles.bubbleMaxWidth + timeText.width
anchors.left: (model.incoming)? parent.left : undefined
anchors.right:(!model.incoming)? parent.right : undefined
anchors.top: sendersName.bottom
anchors.leftMargin: styles.lMarginBubble
anchors.rightMargin: styles.rMarginBubble
// Used for the correct alineation when the message must be on right
horizontalAlignment:(!model.incoming &&
mesageText.implicitWidth <= (rootBubble.width * styles.bubbleMaxWidth)
)? Text.AlignRight : Text.AlignLeft
wrapMode: Text.Wrap
font.pixelSize: styles.messageTextSize
}
}
}
function getMessageTime()
{
var timeFormat = "hh:mm";
var recvDate = new Date(model.recv_time*1000)
var timeString = Qt.formatDateTime(recvDate, timeFormat)
return timeString
}
}

View File

@ -0,0 +1,139 @@
pragma Singleton
import QtQml 2.3
import QtQuick.Controls 2.0
import org.retroshare.qml_components.LibresapiLocalClient 1.0
import Qt.labs.settings 1.0
QtObject
{
id: chatCache
property QtObject lastMessageCache: QtObject
{
id: lastMessageCache
property var lastMessageList: ({})
signal lastMessageChanged(var chatI, var newLastMessage)
function updateLastMessageCache (chatId, chatModel)
{
console.log("updateLastMessageCache (chatId, chatModel)", chatId)
// First creates the chat id object for don't wait to work with the object if is needed to call RS api
if (!lastMessageList[chatId]) {
lastMessageList[chatId] = {}
console.log("Last message cache created!")
}
if (!chatModel) {
rsApi.request( "/chat/messages/"+chatId, "", function (par){
updateLastMessage(chatId, par.response)
})
} else {
updateLastMessage (chatId, chatModel)
}
}
function updateLastMessage (chatId, chatModel)
{
console.log("updateLastMessage (chatId, chatModel)")
var lastMessage = findChatLastMessage (chatModel)
lastMessageList[chatId].lastMessage = lastMessage
lastMessageChanged(chatId, lastMessage)
}
function findChatLastMessage (chatModel)
{
var messagesData = JSON.parse(chatModel).data
return messagesData.slice(-1)[0]
}
function findChatFirstMessage (chatModel)
{
var messagesData = JSON.parse(chatModel).data
return messagesData.slice[0]
}
function setRemoteGXS (chatId, remoteGXS)
{
if (!lastMessageList[chatId]) {
lastMessageList[chatId] = {}
console.log("Last message cache created!")
}
if (lastMessageList[chatId] && !lastMessageList[chatId].remoteGXS){
lastMessageList[chatId].remoteGXS = remoteGXS
return true
}
else {
return false
}
}
function getChatIdFromGxs (gxs)
{
for (var key in lastMessageList) {
if ( lastMessageList[key].remoteGXS &&
lastMessageList[key].remoteGXS.gxs === gxs ) {
return key
}
}
return ""
}
function getGxsFromChatId (chatId)
{
if (lastMessageList[chatId]) return lastMessageList[chatId].remoteGXS
return undefined
}
function getChatLastMessage (chatId)
{
if (lastMessageList[chatId]) {
return lastMessageList[chatId].lastMessage
}
return ""
}
}
property QtObject contactsCache: QtObject
{
id: contactsCache
property var contactsList
property var own
property var identityDetails: ({})
function getContactFromGxsId (gxsId)
{
console.log("getContactFromGxsId (gxsId)", gxsId)
for(var i in contactsList)
{
if (contactsList[i].gxs_id == gxsId) return contactsList[i]
}
}
function getIdentityDetails (gxsId)
{
if (identityDetails[gxsId]) return identityDetails[gxsId]
return ""
}
function setIdentityDetails (jData)
{
identityDetails[jData.gxs_id] = jData
}
function getIdentityAvatar (gxsId)
{
if (identityDetails[gxsId] && identityDetails[gxsId].avatar !== undefined)
{
return identityDetails[gxsId].avatar
}
return ""
}
}
}

View File

@ -18,15 +18,22 @@
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.2
import org.retroshare.qml_components.LibresapiLocalClient 1.0
import "." //Needed for TokensManager singleton
import "./components"
import "./components/emoji"
Item
{
id: chatView
property string chatId
property var gxsInfo: ""
property int token: 0
property string objectName:"chatView"
function refreshData()
{
console.log("chatView.refreshData()", visible)
@ -38,66 +45,342 @@ Item
token = JSON.parse(par.response).statetoken
TokensManager.registerToken(token, refreshData)
ChatCache.lastMessageCache.updateLastMessageCache(chatId, chatModel.json)
if(chatListView.visible)
{
chatListView.positionViewAtEnd()
rsApi.request("/chat/mark_chat_as_read/"+chatId)
}
} )
})
}
Component.onCompleted: refreshData()
Component.onCompleted:
{
refreshData()
}
onFocusChanged: focus && refreshData()
function changeState ()
{
toolBar.state = "CHATVIEW"
gxsInfo= ChatCache.lastMessageCache.getGxsFromChatId(chatView.chatId)
toolBar.gxsSource = gxsInfo.gxs
toolBar.titleText = gxsInfo.name
}
JSONListModel
{
id: chatModel
query: "$.data[*]"
}
Component
{
id: chatMessageDelegate
Item
{
height: 20
Row
{
Text { text: author_name }
Text { text: ": " + msg }
}
}
}
ListView
{
property var styles: StyleChat.chat
id: chatListView
width: parent.width
height: 300
width: parent.width - styles.bubbleMargin
height: parent.height - inferiorPanel.height
anchors.horizontalCenter: parent.horizontalCenter
model: chatModel.model
delegate: chatMessageDelegate
}
delegate: ChatBubbleDelegate {}
spacing: styles.bubbleSpacing
preferredHighlightBegin: 1
TextField
{
id: msgComposer
anchors.bottom: parent.bottom
anchors.left: parent.left
width: chatView.width - sendButton.width
}
Button
{
id: sendButton
text: "Send"
anchors.bottom: parent.bottom
anchors.right: parent.right
onClicked:
onHeightChanged:
{
var jsonData = {"chat_id":chatView.chatId, "msg":msgComposer.text}
rsApi.request( "/chat/send_message", JSON.stringify(jsonData),
function(par) { msgComposer.text = ""; } )
chatListView.currentIndex = count - 1
}
}
EmojiPicker {
id: emojiPicker
anchors.fill: parent
anchors.topMargin: parent.height / 2
anchors.bottomMargin: categorySelectorHeight
property int categorySelectorHeight: 50
color: "white"
buttonWidth: 40
textArea: inferiorPanel.textMessageArea //the TextArea in which EmojiPicker is pasting the Emoji into
state: "EMOJI_HIDDEN"
states: [
State {
name: "EMOJI_HIDDEN"
PropertyChanges { target: emojiPicker; anchors.topMargin: parent.height }
PropertyChanges { target: emojiPicker; anchors.bottomMargin: -1 }
},
State {
name: "EMOJI_SHOWN"
PropertyChanges { target: emojiPicker; anchors.topMargin: parent.height / 2 }
PropertyChanges { target: emojiPicker; anchors.bottomMargin: categorySelectorHeight }
}
]
}
Item
{
property var styles: StyleChat.inferiorPanel
property alias textMessageArea: msgComposer.textMessageArea
id: inferiorPanel
height: ( msgComposer.height > styles.height)? msgComposer.height: styles.height
width: parent.width
anchors.bottom: parent.bottom
Rectangle
{
id: backgroundRectangle
anchors.fill: parent.fill
width: parent.width
height: parent.height
color:inferiorPanel.styles.backgroundColor
border.color: inferiorPanel.styles.borderColor
}
BtnIcon
{
id: attachButton
property var styles: StyleChat.inferiorPanel.btnIcon
height: styles.height
width: styles.width
anchors.left: parent.left
anchors.bottom: parent.bottom
anchors.margins: styles.margin
imgUrl: styles.attachIconUrl
}
RowLayout
{
id: msgComposer
property var styles: StyleChat.inferiorPanel.msgComposer
property alias textMessageArea: flickable.msgField
anchors.verticalCenter: parent.verticalCenter
anchors.left: attachButton.right
width: chatView.width -
(sendButton.width + sendButton.anchors.margins) -
(attachButton.width + attachButton.anchors.margins) -
(emojiButton.width + emojiButton.anchors.margins)
height: (flickable.contentHeight < styles.maxHeight)? flickable.contentHeight : styles.maxHeight
Flickable
{
id: flickable
property alias msgField: msgField
anchors.fill: parent
flickableDirection: Flickable.VerticalFlick
width: parent.width
contentWidth: msgField.width
contentHeight: msgField.height
contentY: contentHeight - height
ScrollBar.vertical: ScrollBar {}
clip: true
TextArea
{
property var styles: StyleChat.inferiorPanel.msgComposer
id: msgField
height: contentHeight + font.pixelSize
width: parent.width
placeholderText: styles.placeHolder
background: styles.background
wrapMode: TextEdit.Wrap
focus: true
inputMethodHints: Qt.ImhMultiLine
font.pixelSize: styles.messageBoxTextSize
onTextChanged:
{
var msgLenght = (msgField.preeditText)? msgField.preeditText.length : msgField.length
if (msgLenght == 0)
{
sendButton.state = ""
}
else if (msgLenght > 0 )
{
sendButton.state = "SENDBTN"
}
}
property bool shiftPressed: false
Keys.onPressed:
{
if ((event.key === Qt.Key_Return || event.key === Qt.Key_Enter)
&& !shiftPressed)
{
if (sendButton.state == "SENDBTN" )
{
chatView.sendMessage ()
}
}
else if (event.key === Qt.Key_Shift)
{
shiftPressed = true
}
}
Keys.onReleased:
{
if (event.key === Qt.Key_Shift)
{
shiftPressed = false
}
}
function reset ()
{
Qt.inputMethod.reset()
}
}
}
}
BtnIcon
{
id: emojiButton
property var styles: StyleChat.inferiorPanel.btnIcon
height: styles.height
width: styles.width
anchors.right: sendButton.left
anchors.bottom: parent.bottom
anchors.margins: styles.margin
imgUrl: styles.emojiIconUrl
onClicked: {
if (emojiPicker.state == "EMOJI_HIDDEN") {
emojiPicker.state = "EMOJI_SHOWN"
} else {
emojiPicker.state = "EMOJI_HIDDEN"
}
}
}
BtnIcon
{
id: sendButton
property var styles: StyleChat.inferiorPanel.btnIcon
property alias icon: sendButton.imgUrl
height: styles.height
width: styles.width
anchors.right: parent.right
anchors.bottom: parent.bottom
anchors.margins: styles.margin
imgUrl: styles.microIconUrl
onClicked:
{
if (sendButton.state == "SENDBTN" )
{
chatView.sendMessage ()
}
}
onPressed:
{
if (sendButton.state == "RECORDING" )
{
sendButton.state = ""
}
else if (sendButton.state == "" )
{
sendButton.state = "RECORDING"
}
}
onReleased:
{
if (sendButton.state == "RECORDING" )
{
sendButton.state = ""
}
}
states:
[
State
{
name: ""
PropertyChanges { target: sendButton; icon: styles.microIconUrl}
},
State
{
name: "RECORDING"
PropertyChanges { target: sendButton; icon: styles.microMuteIconUrl}
},
State
{
name: "SENDBTN"
PropertyChanges { target: sendButton; icon: styles.sendIconUrl}
}
]
}
}
function sendMessage ()
{
if (emojiPicker.state == "EMOJI_SHOWN") emojiPicker.state = "EMOJI_HIDDEN"
var msgText = getCompleteMessageText()
var jsonData = {"chat_id":chatView.chatId, "msg":msgText}
rsApi.request( "/chat/send_message", JSON.stringify(jsonData),
function(par)
{
msgField.text = ""
msgField.reset();
})
}
// This function is needed for the compatibility with auto predictive keyboards
function getCompleteMessageText (){
var completeMsg
if (msgField.preeditText) completeMsg = msgField.text + msgField.preeditText
else completeMsg = msgField.text
return completeMsg
}
}

View File

@ -19,6 +19,7 @@
import QtQuick 2.7
import QtQuick.Controls 2.0
import "." //Needed for ClipboardWrapper singleton
import "./components"
import "URI.js" as UriJs
Item
@ -68,9 +69,10 @@ Item
Image
{
source: cntDt.is_contact ?
"qrc:/icons/rating.png" :
"qrc:/icons/rating-unrated.png"
"qrc:/icons/rating.svg" :
"qrc:/icons/rating-unrated.svg"
height: parent.height - 4
sourceSize.height: height
fillMode: Image.PreserveAspectFit
anchors.verticalCenter: parent.verticalCenter

View File

@ -30,9 +30,20 @@ Item
property bool searching: false
onSearchingChanged: !searching && contactsSortWorker.sendMessage({})
Component.onCompleted: refreshAll()
property string objectName:"contactsView"
Component.onCompleted:
{
refreshAll()
}
onFocusChanged: focus && refreshAll()
function changeState ()
{
toolBar.state = "CONTACTSVIEW"
toolBar.searchBtnCb = toggleSearchBox
}
WorkerScript
{
id: contactsSortWorker
@ -40,6 +51,11 @@ Item
onMessage: contactsListModel.json = JSON.stringify(messageObject)
}
function toggleSearchBox (){
if (searching) searching = false
else searching = true
}
function refreshAll()
{
refreshOwn()
@ -51,6 +67,7 @@ Item
{
console.log("contactsView.refreshContactsCB()", visible)
var token = JSON.parse(par.response).statetoken
ChatCache.contactsCache.contactsList = JSON.parse(par.response).data
TokensManager.registerToken(token, refreshContacts)
contactsSortWorker.sendMessage(
{'action': 'refreshContacts', 'response': par.response})
@ -71,6 +88,7 @@ Item
if(json.data.length > 0)
{
ChatCache.contactsCache.own = json.data[0]
contactsView.own_gxs_id = json.data[0].gxs_id
contactsView.own_nick = json.data[0].name
if(mainWindow.user_name.length === 0)
@ -101,6 +119,11 @@ Item
TokensManager.registerToken(json.statetoken, refreshUnread)
contactsSortWorker.sendMessage(
{'action': 'refreshUnread', 'response': par.response})
json.data.forEach (function (chat)
{
ChatCache.lastMessageCache.updateLastMessageCache(chat.chat_id)
ChatCache.lastMessageCache.setRemoteGXS (chat.chat_id, { gxs: chat.remote_author_id, name: chat.remote_author_name})
})
}
function refreshUnread()
{
@ -143,31 +166,59 @@ Item
Rectangle
{
id: searchBox
visible: contactsView.searching
// visible: contactsView.searching
height: searchText.height
width: searchText.width
height: searchText.height + 10
width: parent.width * 0.9
anchors.right: parent.right
anchors.top: parent.top
Image
{
id: searchIcon
height: searchText.height - 4
width: searchText.height - 4
anchors.verticalCenter: parent.verticalCenter
source: "qrc:/icons/edit-find.png"
}
anchors.leftMargin: 5
anchors.rightMargin: 5
anchors.horizontalCenter: parent.horizontalCenter
color: "white"
TextField
{
id: searchText
anchors.left: searchIcon.right
anchors.verticalCenter: parent.verticalCenter
// placeholderText : "Search contacts..."
width: parent.width
anchors.leftMargin: 5
height: 0
background: Rectangle
{
border.width: 2
radius: 5
border.color: searchText.focus ? "cornflowerblue" : "lightgrey"
color: searchText.focus ? "white" : "ghostwhite"
}
onTextChanged:
contactsSortWorker.sendMessage(
{'action': 'searchContact', 'sexp': text})
}
states:
[
State
{
when: contactsView.searching;
PropertyChanges { target: searchText; height: implicitHeight }
PropertyChanges { target: searchText; placeholderText : "Search contacts..." }
PropertyChanges { target: searchBox; height: searchText.height + 10 }
},
State
{
when: !contactsView.searching;
PropertyChanges { target: searchText; height: 0 }
PropertyChanges { target: searchBox; height: 0 }
}
]
transitions: Transition
{
NumberAnimation { property: "height"; duration: 500; easing.type: Easing.InOutQuad}
}
}
Text
@ -187,4 +238,5 @@ Item
property bool defaultIdentityCreated: false
}
}

View File

@ -18,101 +18,256 @@
import QtQuick 2.7
import QtQuick.Controls 2.0
import "." //Needed for ChatCache singleton
import "./components"
Item
{
id: delegateRoot
height: 40
height: 57
width: parent.width
MouseArea
property var chatId: undefined
property var lastMessageData: ({})
property var locale: Qt.locale()
Rectangle
{
id: contactItem
anchors.fill: parent
onClicked:
color: contactItemArea.containsPress ? "lightgrey" : "transparent"
width: parent.width
height: parent.height
MouseArea
{
console.log("GxsIntentityDelegate onclicked:", model.name,
model.gxs_id)
contactsView.searching = false
if(model.own) contactsView.own_gxs_id = model.gxs_id
else
id: contactItemArea
anchors.fill: parent
onClicked:
{
var jsonData = { "own_gxs_hex": contactsView.own_gxs_id,
"remote_gxs_hex": model.gxs_id }
rsApi.request("/chat/initiate_distant_chat",
JSON.stringify(jsonData),
contactsView.startChatCallback)
}
}
onPressAndHold: showDetails()
ColorHash
{
id: colorHash
hash: model.gxs_id
height: parent.height - 4
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 2
MouseArea
{
anchors.fill: parent
onClicked: delegateRoot.showDetails()
}
}
Text
{
id: nickText
color: model.own ? "blue" : "black"
text: model.name
anchors.left: colorHash.right
anchors.leftMargin: 5
anchors.verticalCenter: parent.verticalCenter
}
Row
{
anchors.right: parent.right
anchors.rightMargin: 10
anchors.verticalCenter: parent.verticalCenter
height: parent.height - 10
spacing: 4
Rectangle
{
visible: model.unread_count > 0
color: "cornflowerblue"
antialiasing: true
border.color: "blue"
border.width: 1
height: parent.height - 4
radius: height/2
width: height
anchors.verticalCenter: parent.verticalCenter
Text
console.log("GxsIntentityDelegate onclicked:", model.name,
model.gxs_id)
contactsView.searching = false
if(model.own) contactsView.own_gxs_id = model.gxs_id
else
{
color: "white"
font.bold: true
text: model.unread_count
anchors.centerIn: parent
var jsonData = { "own_gxs_hex": contactsView.own_gxs_id,
"remote_gxs_hex": model.gxs_id }
rsApi.request("/chat/initiate_distant_chat",
JSON.stringify(jsonData),
startDistantChatCB)
}
}
Image
onPressAndHold: showDetails()
hoverEnabled: true
}
Rectangle
{
id: backgroundRectangle
anchors.fill: parent.fill
anchors.right: parent.right
width: parent.width - colorHash.width - 15
height: parent.height
color:"transparent"
Rectangle
{
source: model.is_contact ?
"qrc:/icons/rating.png" :
"qrc:/icons/rating-unrated.png"
height: parent.height - 4
fillMode: Image.PreserveAspectFit
anchors.verticalCenter: parent.verticalCenter
id: borderBottom
width: parent.width
height: 1
anchors.bottom: parent.bottom
anchors.right: parent.right
color: "lightgrey"
}
}
Rectangle
{
anchors.fill: parent
color: "transparent"
anchors.margins: 5
AvatarOrColorHash
{
id: colorHash
gxs_id: model.gxs_id
height: parent.height - 4
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: 2
onlyCached: true
}
Column
{
id: chatInfoRow
height: parent.height
width: parent.width - isContactRow.width - colorHash.width
anchors.left: colorHash.right
anchors.leftMargin: 10
anchors.right: isContactRow.left
anchors.rightMargin: 5
Item
{
width: parent.width
height: parent.height /2
Text
{
id: nickText
color: model.own ? "blue" : "black"
text: model.name
font.bold: true
anchors.bottom: parent.bottom
}
Text
{
text: setTime()
anchors.right: parent.right
color: "darkslategrey"
anchors.bottom: parent.bottom
}
}
Item
{
id: lastMessageText
width: parent.width
height: (lastMessageData && lastMessageData.msg !== undefined)? parent.height /2 : 0
Text
{
id: lastMessageSender
font.italic: true
color: "royalblue"
text: ((lastMessageData && lastMessageData.incoming !== undefined) && !lastMessageData.incoming)? "You: " : ""
height: parent.height
}
Text
{
id: lastMessageMsg
anchors.left: lastMessageSender.right
text: (lastMessageData && lastMessageData.msg !== undefined)? lastMessageData.msg : ""
rightPadding: 5
elide: Text.ElideRight
color: "darkslategrey"
width: chatInfoRow.width - 30
height: parent.height
}
Rectangle
{
visible: model.unread_count > 0
color: "cornflowerblue"
antialiasing: true
height: parent.height - 6
radius: height/2
width: height
// anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
Text
{
color: "white"
font.bold: true
text: model.unread_count
anchors.centerIn: parent
}
}
}
}
Row
{
id: isContactRow
anchors.right: parent.right
anchors.rightMargin: 10
anchors.verticalCenter: parent.verticalCenter
height: parent.height - 10
spacing: 4
Image
{
source: model.is_contact ?
"qrc:/icons/rating.svg" :
"qrc:/icons/rating-unrated.svg"
height: parent.height - 4
sourceSize.height: height
fillMode: Image.PreserveAspectFit
anchors.verticalCenter: parent.verticalCenter
id: isContactIcon
}
}
}
}
Component.onCompleted:
{
if (!chatId){
chatId = getChatIdFromGXS()
}
if (chatId) {
var last = getChatLastMessage(chatId)
if (last) lastMessageData = last
}
}
Connections
{
target: ChatCache.lastMessageCache
onLastMessageChanged: {
if (!chatId) {
chatId = getChatIdFromGXS()
}
if (chatId && chatId === chatI){
console.log("New last message received!")
lastMessageData = newLastMessage
}
}
}
function getChatLastMessage (chatId)
{
return ChatCache.lastMessageCache.getChatLastMessage(chatId)
}
function getChatIdFromGXS ()
{
var id= ChatCache.lastMessageCache.getChatIdFromGxs(model.gxs_id)
return ChatCache.lastMessageCache.getChatIdFromGxs(model.gxs_id)
}
function setTime()
{
if (!lastMessageData || lastMessageData.recv_time === undefined) return ""
var timeFormat = "dd.MM.yyyy";
var recvDate = new Date(lastMessageData.recv_time*1000)
// Check if is today
if ( new Date (lastMessageData.recv_time*1000).setHours(0,0,0,0) == new Date ().setHours(0,0,0,0))
{
timeFormat = "hh:mm"
}
var timeString = Qt.formatDateTime(recvDate, timeFormat)
return timeString
}
function showDetails()
@ -123,4 +278,11 @@ Item
"qrc:/ContactDetails.qml",
{md: contactsListView.model.get(index)})
}
function startDistantChatCB (par)
{
var chId = JSON.parse(par.response).data.chat_id
ChatCache.lastMessageCache.setRemoteGXS(chId, { gxs: model.gxs_id, name: model.name})
contactsView.startChatCallback (par)
}
}

View File

@ -47,7 +47,7 @@ Item
target: loginView
visible: true
buttonText: qsTr("Save")
iconUrl: "qrc:/icons/edit-image-face-detect.png"
iconUrl: "qrc:/icons/edit-image-face-detect.svg"
suggestionText: qsTr("Create your profile")
onSubmit:
{

View File

@ -24,7 +24,7 @@ Item
{
id: loginView
property string buttonText: qsTr("Unlock")
property string iconUrl: "qrc:/icons/emblem-locked.png"
property string iconUrl: "qrc:/icons/emblem-locked.svg"
property string login
property bool loginPreset: false
property bool advancedMode: false
@ -53,6 +53,8 @@ Item
{
source: loginView.iconUrl
Layout.alignment: Qt.AlignHCenter
height: 128
sourceSize.height: height
}
Text

View File

@ -18,6 +18,7 @@
import QtQuick 2.7
import QtQuick.Controls 2.0
import "components/."
Item
{
@ -25,19 +26,50 @@ Item
property string pgpName
property alias pgpId: pgpIdTxt.text
property bool isOnline
property string nodeCert
property var locations
Image
{
id: nodeStatusImage
source: isOnline?
"icons/state-ok.svg" :
"icons/state-offline.svg"
height: 128
sourceSize.height: height
fillMode: Image.PreserveAspectFit
anchors.top: parent.top
anchors.topMargin: 6
anchors.horizontalCenter: parent.horizontalCenter
}
Column
{
id: pgpColumn
anchors.top: parent.top
anchors.top: nodeStatusImage.bottom
width: parent.width
Text { text: nodeDetailsRoot.pgpName.replace(" (Generated by RetroShare) <>", "") }
Text { id: pgpIdTxt }
Text
{
text: nodeDetailsRoot.pgpName.replace(" (Generated by RetroShare) <>", "")
anchors.horizontalCenter: parent.horizontalCenter
font.pixelSize: 20
}
Text
{
id: pgpIdTxt
anchors.horizontalCenter: parent.horizontalCenter
color: "darkslategrey"
}
}
JSONListModel
@ -48,10 +80,36 @@ Item
ListView
{
width: parent.width
width: parent.width * .75
anchors.top: pgpColumn.bottom
anchors.topMargin: 5
anchors.bottom: buttonsRow.top
model: jsonModel.model
anchors.horizontalCenter: parent.horizontalCenter
headerPositioning: ListView.OverlayHeader
clip: true
snapMode: ListView.SnapToItem
header:Rectangle
{
color: "aliceblue"
width: parent.width
z: 2
height: headetText.contentHeight + 10
radius: 10
Text
{
id: headetText
text: "Node locations ("+jsonModel.model.count+")"
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
font.italic: true
}
}
delegate: Column
{
height: 60
@ -61,17 +119,19 @@ Item
Row
{
id: idRow
height: 30
spacing: 10
spacing: 4
Image
{
id: statusImage
source: model.is_online ?
"icons/state-ok.png" :
"icons/state-offline.png"
"icons/network-connect.svg" :
"icons/network-disconnect.svg"
height: parent.height - 4
sourceSize.height: height
fillMode: Image.PreserveAspectFit
anchors.verticalCenter: parent.verticalCenter
}
@ -83,7 +143,14 @@ Item
}
}
Text { text: model.peer_id }
TextAndIcon
{
width: parent.width
innerText: model.peer_id
anchors.horizontalCenter: parent.horizontalCenter
iconUrl: "/icons/keyring.svg"
}
}
}

View File

@ -67,17 +67,19 @@ Item
model: jsonModel.model
delegate: Item
{
height: 30
property bool isOnline: jsonModel.isOnline(model.pgp_id)
height: 54
width: parent.width
Image
{
id: statusImage
source: jsonModel.isOnline(model.pgp_id) ?
"icons/state-ok.png" :
"icons/state-offline.png"
source: isOnline?
"icons/state-ok.svg" :
"icons/state-offline.svg"
height: parent.height - 4
sourceSize.height: height
fillMode: Image.PreserveAspectFit
anchors.left: parent.left
anchors.leftMargin: 3
@ -89,6 +91,7 @@ Item
anchors.verticalCenter: parent.verticalCenter
anchors.left: statusImage.right
anchors.leftMargin: 10
font.pixelSize: 15
}
MouseArea
{
@ -100,6 +103,7 @@ Item
{
pgpName: model.name,
pgpId: model.pgp_id,
isOnline: isOnline,
locations: jsonModel.getLocations(
model.pgp_id)
}

View File

@ -11,6 +11,7 @@
android:label="RetroShare"
android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation"
android:screenOrientation="unspecified"
android:windowSoftInputMode="adjustResize"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>

View File

@ -0,0 +1,146 @@
/*
* RetroShare Android QML App
* Copyright (C) 2017 Gioacchino Mazzurco <gio@eigenlab.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import QtQuick 2.7
import "../" //Needed for Chat Cache
Item
{
id: compRoot
property string gxs_id
property bool onlyCached: false
signal clicked ()
height: 130
width: height
////////////// The following should be considered privates /////////////////////
property bool has_avatar: false
property bool default_image: false
property int avatarAttemptCnt: 0
property string noGxsImage: "/icons/retroshare06.png"
function getDetails()
{
console.log("getDetails() ", compRoot.gxs_id )
++compRoot.avatarAttemptCnt
if (gxs_id)
{
default_image = false
var hasAvatarCached = hasAvatar (ChatCache.contactsCache.getIdentityAvatar(gxs_id))
if ( !hasAvatarCached )
{
rsApi.request(
"/identity/get_identity_details",
JSON.stringify({ gxs_id: compRoot.gxs_id }),
function(par)
{
var jData = JSON.parse(par.response).data
saveDetails(jData)
if(!compRoot.has_avatar &&
compRoot.avatarAttemptCnt < 3) getDetails()
})
}
else
{
setImage(ChatCache.contactsCache.getIdentityDetails(gxs_id))
}
}
else
{
has_avatar = true
default_image = true
contactAvatar.source = noGxsImage
}
}
function saveDetails(data)
{
ChatCache.contactsCache.setIdentityDetails(data)
setImage(data)
}
function setImage (data)
{
compRoot.has_avatar = hasAvatar (data.avatar)
if(compRoot.has_avatar)
{
contactAvatar.source =
"data:image/png;base64," + data.avatar
}
}
function hasAvatar (avatar)
{
return avatar.length > 0
}
function showDetails()
{
console.log("showDetails() ", gxs_id)
stackView.push(
"qrc:/ContactDetails.qml",
{md: ChatCache.contactsCache.getContactFromGxsId(gxs_id)})
}
Component.onCompleted: startComponent ()
onVisibleChanged: startComponent ()
function startComponent ()
{
if (onlyCached && hasAvatar (ChatCache.contactsCache.getIdentityAvatar(gxs_id) ) )
{
console.log("load cached avatar")
setImage(ChatCache.contactsCache.getIdentityDetails(gxs_id))
}
else if (!onlyCached)
{
if(visible && (!has_avatar || default_image ) ) getDetails()
}
}
Image
{
id: contactAvatar
anchors.fill: parent
visible: compRoot.has_avatar
}
ColorHash
{
anchors.fill: parent
visible: !compRoot.has_avatar
hash: compRoot.gxs_id
}
MouseArea
{
anchors.fill: parent
onClicked:
{
compRoot.clicked()
showDetails()
}
}
}

View File

@ -0,0 +1,127 @@
import QtQuick 2.0
import QtQuick.Controls 1.4
Item
{
id: button
property alias buttonText: innerText.text;
property alias buttonTextPixelSize: innerText.font.pixelSize
property alias innerAnchors: innerElements.anchors;
property alias rectangleButton: rectangleButton;
property var iconUrl
property int iconHeight: 20
property color color
property color hoverColor
property color pressColor
property int fontSize
property int borderWidth
property int borderRadius
property int innerMargin: 10
scale: state === "Pressed" ? 0.96 : 1.0
onEnabledChanged: state = ""
signal clicked
Rectangle
{
id: rectangleButton
anchors.fill: parent
radius: borderRadius
color: button.enabled ? button.color : "grey"
border.width: borderWidth
border.color: "black"
ToolButton {
id: innerElements
Image
{
id: icon
source: (iconUrl)? iconUrl: ""
height: (iconUrl)? iconHeight: 0
width: (iconUrl)? iconHeight: 0
fillMode: Image.PreserveAspectFit
visible: (iconUrl)? true: false
anchors.left: innerElements.left
anchors.margins:(iconUrl)? innerMargin : 0
anchors.verticalCenter: parent.verticalCenter
}
Text
{
anchors.margins: innerMargin
id: innerText
font.pointSize: fontSize
anchors.left: icon.right
anchors.verticalCenter: parent.verticalCenter
}
}
}
states: [
State
{
name: "Hovering"
PropertyChanges
{
target: rectangleButton
color: hoverColor
}
},
State
{
name: "Pressed"
PropertyChanges
{
target: rectangleButton
color: pressColor
}
}
]
transitions: [
Transition
{
from: ""; to: "Hovering"
ColorAnimation { duration: 200 }
},
Transition
{
from: "*"; to: "Pressed"
ColorAnimation { duration: 10 }
}
]
MouseArea
{
hoverEnabled: true
anchors.fill: button
onEntered: { button.state='Hovering'}
onExited: { button.state=''}
onClicked: { button.clicked();}
onPressed: { button.state="Pressed" }
onReleased:
{
if (containsMouse)
button.state="Hovering";
else
button.state="";
}
}
Behavior on scale
{
NumberAnimation
{
duration: 100
easing.type: Easing.InOutQuad
}
}
}

View File

@ -0,0 +1,28 @@
import QtQuick 2.0
Item {
id: root
signal clicked
signal pressed
signal released
property var imgUrl: ""
property alias fillMode: image.fillMode
Image {
id: image
anchors.fill: parent
source: imgUrl
height: parent.height
width: parent.width
}
MouseArea {
anchors.fill: root
onClicked: { root.clicked() }
onPressed: { root.pressed() }
onReleased: { root.released() }
}
}

View File

@ -28,8 +28,13 @@ Rectangle
Image
{
source: "qrc:/icons/edit-image-face-detect.png"
anchors.fill: parent
source: "qrc:/icons/edit-image-face-detect.svg"
anchors.centerIn: parent
height: parent.height
width: parent.width
sourceSize.height: height
sourceSize.width: width
fillMode: Image.PreserveAspectFit
}
Rectangle

View File

@ -0,0 +1,256 @@
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3
import "../URI.js" as UriJs
import "../"
import "../components"
Drawer
{
property var styles: StyleSideBar
id: drawer
height: parent.height
width: Math.min(parent.width, parent.height) / 3 * styles.width
dragMargin: 10
Rectangle
{
width: parent.width
height: parent.height
ListView
{
id: listView
currentIndex: -1
anchors.fill:parent
clip: true
snapMode: ListView.SnapToItem
headerPositioning: ListView.OverlayHeader
header:Rectangle
{
id:header
property var styles: StyleSideBar.header
width: parent.width
height: colorHash.height + nickText.height + gxsText.height + 40
color: styles.color
AvatarOrColorHash
{
id: colorHash
gxs_id: (ChatCache.contactsCache.own)?ChatCache.contactsCache.own.gxs_id : ""
height: styles.avatarHeight
anchors.margins: styles.avatarMargins
anchors.horizontalCenter: header.horizontalCenter
anchors.top: header.top
onClicked: drawer.close()
}
Text
{
id: nickText
text: (ChatCache.contactsCache.own)?ChatCache.contactsCache.own.name : "Retroshare"
height: contentHeight
anchors.top: colorHash.bottom
anchors.left: header.left
anchors.right: header.right
anchors.leftMargin: 10
anchors.rightMargin: 10
horizontalAlignment:Text.AlignHCenter
wrapMode: Text.Wrap
color: styles.textColor
font.bold: true
font.pixelSize: styles.textNickSize
}
Text
{
id: gxsText
text: (ChatCache.contactsCache.own)?ChatCache.contactsCache.own.gxs_id : ""
// height: contentHeight
wrapMode: Text.WrapAnywhere
width: header.width
anchors.top: nickText.bottom
anchors.left: header.left
anchors.right: header.right
anchors.leftMargin: 10
anchors.rightMargin: 10
horizontalAlignment:Text.AlignHCenter
color: styles.textColor
font.pixelSize: styles.textGxsidSize
}
}
delegate: Item
{
property var styles: StyleSideBar.item
id: menuItem
width: parent.width
height: styles.height
Connections
{
target: mainWindow
onCoreReadyChanged:
{
if (model.showOnCoreReady)
{
setVisible(mainWindow.coreReady)
}
}
}
Btn
{
buttonText: model.title
width: parent.width
height: parent.height
color: menuItem.styles.defaultColor
hoverColor: menuItem.styles.hoverColor
innerAnchors.left: rectangleButton.left
innerAnchors.verticalCenter: rectangleButton.verticalCenter
iconUrl: (model.icon)? model.icon : undefined
innerMargin: 20
buttonTextPixelSize: menuItem.styles.pixelSize
}
MouseArea
{
property var lastItem
id: itemArea
width: parent.width
height: parent.height
onClicked:
{
if (listView.currentIndex != index || stackView.currentItem != lastItem)
{
listView.currentIndex = index
menuList.actions[model.title]();
lastItem = stackView.currentItem
// titleLabel.text = model.title
// stackView.replace(model.source)
}
drawer.close()
}
}
visible: (model.showOnCoreReady)? setVisible(mainWindow.coreReady) : true
Component.onCompleted:
{
if (model.showOnOsAndroid && !Q_OS_ANDROID)
{
menuItem.visible = false
menuItem.height = 0
}
}
function setVisible(b)
{
menuItem.visible = b
if (!b)
{
menuItem.height = 0
}
else
{
menuItem.height = styles.height
}
}
}
model: ListModel
{
id: menuList
property var actions :
{
"Contacts": function()
{
stackView.push("qrc:/Contacts.qml" )
},
"Trusted Nodes": function()
{
stackView.push("qrc:/TrustedNodesView.qml");
},
"Paste Link": function()
{
UriJs.URI.withinString(
ClipboardWrapper.getFromClipBoard(),
handleIntentUri);
},
"Terminate Core": function()
{
rsApi.request("/control/shutdown");
}
}
ListElement
{
title: "Contacts"
showOnCoreReady: true
icon: "/icons/search.svg"
}
ListElement
{
title: "Trusted Nodes"
showOnCoreReady: true
icon: "/icons/netgraph.svg"
}
ListElement
{
title: "Paste Link"
showOnCoreReady: true
icon: "/icons/add.svg"
}
ListElement
{
title: "Terminate Core"
showOnOsAndroid: false
icon: "/icons/exit.svg"
}
}
ScrollIndicator.vertical: ScrollIndicator { }
}
Rectangle
{
property var styles: StyleSideBar.footer
width: parent.width
anchors.bottom: parent.bottom
height: Label.contentHeight
color: styles.color
Label
{
horizontalAlignment: Text.AlignRight
anchors.bottom: parent.bottom
anchors.right: parent.right
text: parent.styles.text
color: parent.styles.textColor
anchors.rightMargin: parent.styles.margins
anchors.bottomMargin: parent.styles.margins
}
}
}
}

View File

@ -0,0 +1,37 @@
import QtQuick 2.0
import QtQuick.Controls 2.0
ToolButton
{
height: icon.height + 5
property alias iconUrl: icon.source
property alias innerText: innerText.text
Image
{
id: icon
height: innerText.contentHeight
width: innerText.contentHeight
fillMode: Image.PreserveAspectFit
anchors.left: parent.left
anchors.leftMargin: 4
anchors.verticalCenter: parent.verticalCenter
}
Text
{
id: innerText
wrapMode: Text.WrapAnywhere
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
anchors.left: icon.right
anchors.leftMargin: 5
}
}

View File

@ -0,0 +1,54 @@
import QtQuick 2.7
import QtQuick.Controls.Styles 1.2
Rectangle {
id: emojiButton
Text {
id: emojiText
color: "gray"
text: qsTr(eCatText)
font.pixelSize: emojiButton.width - 8
anchors.centerIn: parent
}
state: "RELEASED"
states: [
State {
name: "PRESSED"
PropertyChanges {
target: emojiText
font.pixelSize: emojiButton.width - 10
}
},
State {
name: "RELEASED"
PropertyChanges {
target: emojiText
font.pixelSize: emojiButton.width - 8
}
}
]
MouseArea {
anchors.fill: parent
hoverEnabled: true
onEntered: {
emojiText.color = "black"
}
onExited: {
emojiText.color = "gray"
}
onPressedChanged: {
emojiButton.state = emojiButton.state == "PRESSED" ? "RELEASED" : "PRESSED"
}
onClicked: {
Qt.emojiClickedHandler(emojiText.text)
}
}
}

View File

@ -0,0 +1,79 @@
import QtQuick 2.7
import QtQuick.Controls.Styles 1.2
Rectangle {
id: emojiCategoryButton
property string categoryName
function completedHandler() {
categoryName = eCatName
//initialize
if (parent.currSelEmojiButton === undefined) {
clickedHandler()
}
}
function pressedHandler() {
if (state != "SELECTED") {
state = state == "PRESSED" ? "RELEASED" : "PRESSED"
}
}
function clickedHandler() {
if (parent.currSelEmojiButton !== undefined) {
parent.currSelEmojiButton.state = "RELEASED"
}
parent.currSelEmojiButton = emojiCategoryButton
state = "SELECTED"
Qt.emojiCategoryChangedHandler(emojiCategoryButton.categoryName)
}
Text {
id: emojiText
color: "gray"
text: qsTr(eCatText)
font.pixelSize: emojiCategoryButton.width - 8
anchors.centerIn: parent
}
state: "RELEASED"
states: [
State {
name: "PRESSED"
PropertyChanges {
target: emojiText
font.pixelSize: emojiCategoryButton.width - 10
}
},
State {
name: "RELEASED"
PropertyChanges {
target: emojiText
font.pixelSize: emojiCategoryButton.width - 8
}
},
State {
name: "SELECTED"
PropertyChanges {
target: emojiCategoryButton
color: "#ADD6FF"
}
}
]
MouseArea {
anchors.fill: parent
hoverEnabled: true
onEntered: emojiText.color = "black"
onExited: emojiText.color = "gray"
onPressedChanged: pressedHandler()
onClicked: clickedHandler()
}
Component.onCompleted: completedHandler()
}

View File

@ -0,0 +1,124 @@
import QtQuick 2.7
import QtQuick.Controls 2.0
import "emoji.js" as EmojiJSON
Rectangle {
id: emojiPicker
property EmojiCategoryButton currSelEmojiButton
property variant emojiParsedJson
property int buttonWidth: 40
property TextArea textArea
//displays all Emoji of one categroy by modifying the ListModel of emojiGrid
function categoryChangedHandler (newCategoryName){
emojiByCategory.clear()
for (var i = 0; i < emojiParsedJson.emoji_by_category[newCategoryName].length; i++) {
var elem = emojiParsedJson.emoji_by_category[newCategoryName][i]
emojiByCategory.append({eCatName: newCategoryName, eCatText: elem})
}
}
//adds the clicked Emoji (and one ' ' if the previous character isn't an Emoji) to textArea
function emojiClickedHandler(selectedEmoji) {
var strAppnd = ""
var plainText = textArea.getText(0, textArea.length)
if (plainText.length > 0) {
var lastChar = plainText[plainText.length-1]
if ((lastChar !== ' ') && (lastChar.charCodeAt(0) < 255)) {
strAppnd = " "
}
}
strAppnd += selectedEmoji
textArea.insert(textArea.cursorPosition, strAppnd)
}
//parses JSON, publishes button handlers and inits textArea
function completedHandler() {
// emojiParsedJson = JSON.parse(EmojiJSON.emoji_json)
emojiParsedJson = EmojiJSON.emoji_json
for (var i = 0; i < emojiParsedJson.emoji_categories.length; i++) {
var elem = emojiParsedJson.emoji_categories[i]
emojiCategoryButtons.append({eCatName: elem.name, eCatText: elem.emoji_unified})
}
Qt.emojiCategoryChangedHandler = categoryChangedHandler
Qt.emojiClickedHandler = emojiClickedHandler
textArea.cursorPosition = textArea.length
textArea.Keys.pressed.connect(keyPressedHandler)
}
//checks if the previous character is an Emoji and adds a ' ' if that's the case
//this is necessary, because Emoji use a bigger font-size, and that font-size is kept using without a ' '
function keyPressedHandler(event) {
var testStr = textArea.getText(textArea.length-2, textArea.length)
var ptrn = new RegExp("[\uD800-\uDBFF][\uDC00-\uDFFF]")
if ((event.key !== Qt.Key_Backspace) && (ptrn.test(testStr))) {
textArea.text += " "
textArea.cursorPosition = textArea.length
}
}
//all emoji of one category
ListModel {
id: emojiByCategory
}
GridView {
id: emojiGrid
width: parent.width
anchors.fill: parent
anchors.bottomMargin: buttonWidth
cellWidth: buttonWidth; cellHeight: buttonWidth
model: emojiByCategory
delegate: EmojiButton {
width: buttonWidth
height: buttonWidth
color: emojiPicker.color
}
}
//seperator
Rectangle {
color: emojiPicker.color
anchors.bottom: parent.bottom
width: parent.width
height: buttonWidth
}
Rectangle {
color: "black"
anchors.bottom: parent.bottom
anchors.bottomMargin: buttonWidth
width: parent.width
height: 1
}
//emoji category selector
ListView {
width: parent.width
anchors.bottom: parent.bottom
anchors.bottomMargin: buttonWidth
orientation: ListView.Horizontal
model: emojiCategoryButtons
delegate: EmojiCategoryButton {
width: buttonWidth
height: buttonWidth
color: emojiPicker.color
}
}
ListModel {
id: emojiCategoryButtons
}
Component.onCompleted: completedHandler()
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg4155"
version="1.1"
inkscape:version="0.91 r13725"
xml:space="preserve"
width="80"
height="80"
viewBox="0 0 80 80"
sodipodi:docname="add.svg"><metadata
id="metadata4161"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs4159" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="706"
id="namedview4157"
showgrid="false"
inkscape:zoom="5.11875"
inkscape:cx="28.462795"
inkscape:cy="38.239659"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g4163" /><g
id="g4163"
inkscape:groupmode="layer"
inkscape:label="ink_ext_XXXXXX"
transform="matrix(1.25,0,0,-1.25,0,80)"><path
inkscape:connector-curvature="0"
id="path4167"
style="fill:#039bd5;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="M 64,32 C 64,14.327 49.673,0 32,0 14.327,0 0,14.327 0,32 0,49.673 14.327,64 32,64 49.673,64 64,49.673 64,32" /><path
inkscape:connector-curvature="0"
style="fill:#ffffff"
d="m 52.357845,35.83752 -15.874967,0 c -0.560293,0 -0.933823,0.373529 -0.933823,0.933822 l 0,15.874965 c 0,1.120588 -0.747056,1.867645 -1.867641,1.867645 l -3.735288,0 c -1.120584,0 -1.867644,-0.747057 -1.867644,-1.867645 l 0,-15.874965 c 0,-0.560293 -0.373527,-0.933822 -0.933819,-0.933822 l -15.874968,0 c -1.120586,0 -1.8676431,-0.747057 -1.8676431,-1.867644 l 0,-3.735285 c 0,-1.120585 0.7470571,-1.867644 1.8676431,-1.867644 l 15.874968,0 c 0.560292,0 0.933819,-0.373527 0.933819,-0.933821 l 0,-15.874967 c 0,-1.120585 0.74706,-1.8676415 1.867644,-1.8676415 l 3.735288,0 c 1.120585,0 1.867641,0.7470565 1.867641,1.8676415 l 0,15.874967 c 0,0.560294 0.37353,0.933821 0.933823,0.933821 l 15.874967,0 c 1.120585,0 1.867641,0.747059 1.867641,1.867644 l 0,3.735285 c 0,1.120587 -0.747056,1.867644 -1.867641,1.867644 z"
id="path4" /></g></svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 387 B

View File

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 2 3 L 2 5 L 14 5 L 14 3 L 2 3 z M 2 7 L 2 9 L 14 9 L 14 7 L 2 7 z M 2 11 L 2 13 L 14 13 L 14 11 L 2 11 z "
class="ColorScheme-Text"
/>
</svg>

After

Width:  |  Height:  |  Size: 443 B

View File

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="80"
style="enable-background:new 0 0 110 110;"
version="1.0"
viewBox="0 0 110 110"
width="80"
xml:space="preserve"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="attach.svg"><metadata
id="metadata20"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs18" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1009"
id="namedview16"
showgrid="false"
inkscape:zoom="3.0341309"
inkscape:cx="-75.947202"
inkscape:cy="16.755676"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" /><g
id="Artboard" /><g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="Layer 1"
style="display:inline"><circle
id="circle6"
style="fill:#039bd5;fill-opacity:1"
r="55"
cy="55"
cx="55" /><path
style="fill:#000000;fill-opacity:0.15686275"
sodipodi:nodetypes="ccccccccccsasccsccccccccccccccsasccccccccccc"
id="use4188"
d="m 32.658016,88.493222 c -3.615848,8.28e-4 -7.263315,-1.424329 -10.041357,-4.202659 -2.77944,-2.779018 -4.205861,-6.427875 -4.204884,-10.04303 -0.0049,-3.403438 1.278081,-6.83375 3.862101,-9.413455 l 0.593216,-0.593494 35.641173,-35.642841 c 3.391596,-3.396336 7.894417,-5.081409 12.383162,-5.075283 4.771078,-0.002 9.594249,1.87938 13.276261,5.560136 3.678385,3.680194 5.559013,8.500861 5.558044,13.271665 0.0042,4.490277 -1.679643,8.991979 -5.075281,12.385393 -10.716723,10.715527 -20.64003,20.648354 -29.983159,29.721144 -1.137853,1.104931 -3.354856,1.236196 -4.391767,0.200648 -1.067827,-1.066425 -1.137299,-3.218296 0.200684,-4.522981 9.420341,-9.185906 29.722264,-29.852779 29.722264,-29.852779 2.153348,-2.157945 3.224312,-4.981261 3.229331,-7.9316 -4.97e-4,-3.126264 -1.22794,-6.331216 -3.714323,-8.818435 -2.48722,-2.488056 -5.693845,-3.714325 -8.821914,-3.716554 -2.949092,0.0058 -5.771848,1.076122 -7.928541,3.230447 L 27.31921,68.693496 26.726551,69.286573 c -1.343545,1.346615 -2.011143,3.098819 -2.016991,4.960511 0.002,1.972136 0.773588,4.003619 2.360607,5.591332 1.585346,1.583812 3.615429,2.354624 5.587991,2.356842 1.861408,-0.0058 3.613479,-0.673018 4.961066,-2.016569 L 62.839621,54.959584 64.95174,52.847599 c 0.506025,-0.509784 0.757852,-1.157881 0.76273,-1.899994 0,-0.782361 -0.304758,-1.604703 -0.959542,-2.259626 -0.656167,-0.656451 -1.478649,-0.960092 -2.260316,-0.962322 -0.741838,0.0064 -1.388963,0.258657 -1.899442,0.765517 0,0 -17.740223,17.818894 -20.832589,21.018568 -1.223513,1.265969 -3.596261,1.141861 -4.639005,3e-6 -1.036591,-1.135117 -0.92155,-3.247964 0.417589,-4.592681 3.215314,-3.228707 20.59883,-20.877036 20.59883,-20.877036 1.744968,-1.750676 4.072705,-2.616475 6.354335,-2.610904 2.425928,-0.002 4.864259,0.956613 6.715226,2.80674 1.845669,1.848595 2.803537,4.284834 2.803537,6.711885 0.0049,2.28024 -0.859952,4.607559 -2.608679,6.353359 l -2.112816,2.111986 -25.22026,25.220118 c -2.576358,2.578305 -5.997345,3.860847 -9.393545,3.860151 l -0.01975,-1.41e-4 0,0 z"
inkscape:connector-curvature="0" /><path
inkscape:connector-curvature="0"
d="m 32.658016,86.241133 c -3.615848,8.27e-4 -7.263315,-1.424329 -10.041357,-4.202659 -2.77944,-2.779019 -4.205861,-6.427875 -4.204884,-10.043031 -0.0049,-3.403437 1.278081,-6.83375 3.862101,-9.413456 l 0.593216,-0.593494 35.641173,-35.642841 c 3.391596,-3.396336 7.894417,-5.081408 12.383162,-5.075281 4.771078,-0.002 9.594249,1.879379 13.276261,5.560134 3.678385,3.680195 5.559013,8.500863 5.558044,13.271665 0.0042,4.490278 -1.679643,8.991981 -5.075281,12.385394 -10.716723,10.715526 -20.64003,20.648355 -29.983159,29.721144 -1.137853,1.10493 -3.354856,1.236196 -4.391767,0.200647 -1.067827,-1.066424 -1.137299,-3.218295 0.200684,-4.522981 9.420341,-9.185904 29.722264,-29.852778 29.722264,-29.852778 2.153348,-2.157945 3.224312,-4.981262 3.229331,-7.9316 -4.97e-4,-3.126264 -1.22794,-6.331217 -3.714323,-8.818435 -2.48722,-2.488056 -5.693845,-3.714325 -8.821914,-3.716555 -2.949092,0.0058 -5.771848,1.076123 -7.928541,3.230448 L 27.31921,66.441405 26.726551,67.034482 c -1.343545,1.346615 -2.011143,3.098821 -2.016991,4.960512 0.002,1.972136 0.773588,4.003619 2.360607,5.591331 1.585346,1.583813 3.615429,2.354624 5.587991,2.356843 1.861408,-0.0058 3.613479,-0.673017 4.961066,-2.01657 L 62.839621,52.707493 64.95174,50.595508 c 0.506025,-0.509784 0.757852,-1.15788 0.76273,-1.899994 0,-0.78236 -0.304758,-1.604703 -0.959542,-2.259625 -0.656167,-0.656452 -1.478649,-0.960092 -2.260316,-0.962321 -0.741838,0.0064 -1.388963,0.258655 -1.899442,0.765515 0,0 -17.740223,17.818896 -20.832589,21.01857 -1.223513,1.265968 -3.596261,1.14186 -4.639005,3e-6 -1.036591,-1.135118 -0.92155,-3.247965 0.417589,-4.592682 3.215314,-3.228708 20.59883,-20.877037 20.59883,-20.877037 1.744968,-1.750675 4.072705,-2.616473 6.354335,-2.610903 2.425928,-0.002 4.864259,0.956612 6.715226,2.806741 1.845669,1.848594 2.803537,4.284833 2.803537,6.711884 0.0049,2.28024 -0.859952,4.607558 -2.608679,6.353358 l -2.112816,2.111987 -25.22026,25.220118 c -2.576358,2.578306 -5.997345,3.860847 -9.393545,3.860151 l -0.01975,-1.4e-4 0,0 z"
id="path3"
sodipodi:nodetypes="ccccccccccsasccsccccccccccccccsasccccccccccc"
style="fill:#ffffff;fill-opacity:1" /></g></svg>

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 2 2 L 2 5 L 3 5 L 3 3 L 5 3 L 5 2 L 2 2 z M 6 2 L 6 3 L 10 3 L 10 2 L 6 2 z M 11 2 L 11 3 L 13 3 L 13 5 L 14 5 L 14 2 L 11 2 z M 6 5 A 1 1 0 0 0 5 6 A 1 1 0 0 0 6 7 A 1 1 0 0 0 7 6 A 1 1 0 0 0 6 5 z M 10 5 A 1 1 0 0 0 9 6 A 1 1 0 0 0 10 7 A 1 1 0 0 0 11 6 A 1 1 0 0 0 10 5 z M 2 6 L 2 10 L 3 10 L 3 6 L 2 6 z M 13 6 L 13 10 L 14 10 L 14 6 L 13 6 z M 4 9 A 4 3 0 0 0 8 12 A 4 3 0 0 0 12 9 L 11 9 A 3 2 0 0 1 8 11 A 3 2 0 0 1 5 9 L 4 9 z M 2 11 L 2 14 L 5 14 L 5 13 L 3 13 L 3 11 L 2 11 z M 13 11 L 13 13 L 11 13 L 11 14 L 14 14 L 14 11 L 13 11 z M 6 13 L 6 14 L 10 14 L 10 13 L 6 13 z "
class="ColorScheme-Text"
/>
</svg>

After

Width:  |  Height:  |  Size: 922 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 8 8">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-NeutralText {
color:#f67400;
}
</style>
</defs>
<path
style="fill:currentColor;fill-opacity:1;stroke:none"
class="ColorScheme-NeutralText"
d="M 1 0 C 0.4459807 0 0 0.446 0 1 L 0 7 C 0 7.5541 0.4459807 8 1 8 L 7 8 C 7.554019 8 8 7.5541 8 7 L 8 1 C 8 0.446 7.554019 0 7 0 L 1 0 z "
/>
<path
style="fill:#ffffff;fill-opacity:1;stroke:none"
d="M 4 1 C 2.8954237 1 1.9999904 1.8954 2 3 L 2.0019531 4 L 1 4 L 1 7 L 7 7 L 7 4 L 6 4 L 6 3 C 6.00001 1.8954 5.104576 1 4 1 z M 4 2 C 4.552285 2 5 2.4477 5 3 L 5 4 L 3 4 L 3 3 C 3 2.4477 3.447715 2 4 2 z "
/>
</svg>

After

Width:  |  Height:  |  Size: 782 B

View File

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg4155"
version="1.1"
inkscape:version="0.91 r13725"
xml:space="preserve"
width="80"
height="80"
viewBox="0 0 80 80"
sodipodi:docname="exit.svg"><metadata
id="metadata4161"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs4159" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="706"
id="namedview4157"
showgrid="true"
inkscape:zoom="5.11875"
inkscape:cx="39.840819"
inkscape:cy="37.23375"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g4163"
showguides="false"><inkscape:grid
type="xygrid"
id="grid4142" /></sodipodi:namedview><g
id="g4163"
inkscape:groupmode="layer"
inkscape:label="ink_ext_XXXXXX"
transform="matrix(1.25,0,0,-1.25,0,80)"><path
inkscape:connector-curvature="0"
id="path4167"
style="fill:#039bd5;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="M 64,32 C 64,14.327 49.673,0 32,0 14.327,0 0,14.327 0,32 0,49.673 14.327,64 32,64 49.673,64 64,49.673 64,32" /><path
inkscape:connector-curvature="0"
style="fill:none;stroke:#ffffff;stroke-width:4.02773762;stroke-linecap:round;stroke-miterlimit:10"
d="m 39.607341,43.825636 c 4.92391,-2.756986 8.252834,-8.023253 8.252834,-14.06788 0,-8.89828 -7.21267,-16.11095 -16.11095,-16.11095 -8.89828,0 -16.110951,7.21267 -16.110951,16.11095 0,5.927822 3.201045,11.107492 7.96888,13.904757"
stroke-miterlimit="10"
id="path13" /><line
style="fill:none;stroke:#ffffff;stroke-width:4.02773762;stroke-linecap:round;stroke-miterlimit:10"
stroke-miterlimit="10"
x1="31.749226"
x2="31.749226"
y1="29.757759"
y2="49.89645"
id="line15" /></g></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 44 44" enable-background="new 0 0 44 44" width="512px" height="512px">
<g>
<circle cx="18" cy="26" r="5" fill="#039bd5"/>
<path d="m22,0c-12.2,0-22,9.8-22,22s9.8,22 22,22 22-9.8 22-22-9.8-22-22-22zm12.7,12.1l-8.8,8.8c-0.2,0.2-0.2,0.4-0.1,0.6 0.8,1.3 1.2,2.8 1.2,4.5 0,5-4,9-9,9s-9-4-9-9 4-9 9-9c1.6,0 3.1,0.4 4.5,1.2 0.2,0.1 0.4,0.1 0.6-0.1l.8-.8c0.2-0.2 0.2-0.5 0-0.7l-.5-.5c-0.4-0.4-0.4-1 0-1.4l1.4-1.4c0.4-0.4 1-0.4 1.4,0l.5,.5c0.2,0.2 0.5,0.2 0.7,0l.5-.5c0.2-0.2 0.2-0.5 0-0.7l-.5-.5c-0.4-0.4-0.4-1 0-1.4l1.4-1.4c0.2-0.2 0.5-0.3 0.7-0.3s0.5,0.1 0.7,0.3l.5,.5c0.2,0.2 0.5,0.2 0.7,0l.5-.5c0.2-0.2 0.5-0.3 0.7-0.3s0.5,0.1 0.7,0.3l1.4,1.4c0.2,0.2 0.3,0.5 0.3,0.7s-0.1,0.5-0.3,0.7z" fill="#039bd5"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 877 B

View File

@ -0,0 +1,148 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
xml:space="preserve"
width="80"
height="80"
viewBox="0 0 80 80"
sodipodi:docname="microphone.svg"><metadata
id="metadata8"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs6"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath16"><path
d="M 0,64 64,64 64,0 0,0 0,64 Z"
id="path18"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath28"><path
d="m 26,52.5 12,0 0,-30 -12,0 0,30 z"
id="path30"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath44"><path
d="m 19,34 26,0 0,-18.25 -26,0 0,18.25 z"
id="path46"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath60"><path
d="m 30.5,18 3,0 0,-9 -3,0 0,9 z"
id="path62"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath76"><path
d="m 25.5,11 13,0 0,-3 -13,0 0,3 z"
id="path78"
inkscape:connector-curvature="0" /></clipPath></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1009"
id="namedview4"
showgrid="false"
inkscape:zoom="5.9"
inkscape:cx="-69.119913"
inkscape:cy="23.011738"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g10" /><g
id="g10"
inkscape:groupmode="layer"
inkscape:label="Elegant_circle-icons"
transform="matrix(1.25,0,0,-1.25,0,80)"><path
inkscape:connector-curvature="0"
id="path22"
style="fill:#039bd5;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="M 64,32 C 64,14.327 49.673,0 32,0 14.327,0 0,14.327 0,32 0,49.673 14.327,64 32,64 49.673,64 64,49.673 64,32" /><g
id="g24"
style="fill:#000000;fill-opacity:0.15686275"><g
id="g26"
style="fill:#000000;fill-opacity:0.15686275" /><g
id="g32"
style="fill:#000000;fill-opacity:0.15686275"><g
clip-path="url(#clipPath28)"
id="g34"
style="fill:#000000;fill-opacity:0.15686275"><g
transform="translate(32,22.5)"
id="g36"
style="fill:#000000;fill-opacity:0.15686275"><path
d="m 0,0 c 3.315,0 6,2.685 6,6 l 0,18 c 0,3.315 -2.685,6 -6,6 -3.315,0 -6,-2.685 -6,-6 L -6,6 C -6,2.685 -3.315,0 0,0"
style="fill:#000000;fill-opacity:0.15686275;fill-rule:nonzero;stroke:none"
id="path38"
inkscape:connector-curvature="0" /></g></g></g></g><g
id="g40"
style="fill:#000000;fill-opacity:0.15686275"><g
id="g42"
style="fill:#000000;fill-opacity:0.15686275" /><g
id="g48"
style="fill:#000000;fill-opacity:0.15686275"><g
clip-path="url(#clipPath44)"
id="g50"
style="fill:#000000;fill-opacity:0.15686275"><g
transform="translate(32,15.75)"
id="g52"
style="fill:#000000;fill-opacity:0.15686275"><path
d="m 0,0 c -7.168,0 -13,5.832 -13,13 l 0,3.75 c 0,0.828 0.672,1.5 1.5,1.5 0.828,0 1.5,-0.672 1.5,-1.5 L -10,13 C -10,7.486 -5.514,3 0,3 5.514,3 10,7.486 10,13 l 0,3.75 c 0,0.828 0.672,1.5 1.5,1.5 0.828,0 1.5,-0.672 1.5,-1.5 L 13,13 C 13,5.832 7.168,0 0,0"
style="fill:#000000;fill-opacity:0.15686275;fill-rule:nonzero;stroke:none"
id="path54"
inkscape:connector-curvature="0" /></g></g></g></g><g
id="g72"
style="fill:#000000;fill-opacity:0.15686275"><g
id="g74"
style="fill:#000000;fill-opacity:0.15686275" /><g
id="g80"
style="fill:#000000;fill-opacity:0.15686275"><g
clip-path="url(#clipPath76)"
id="g82"
style="fill:#000000;fill-opacity:0.15686275"><g
transform="translate(37,8)"
id="g84"
style="fill:#000000;fill-opacity:0.15686275"><path
d="m 0,0 -10,0 c -0.828,0 -1.5,0.672 -1.5,1.5 0,0.828 0.672,1.5 1.5,1.5 L 0,3 C 0.828,3 1.5,2.328 1.5,1.5 1.5,0.672 0.828,0 0,0"
style="fill:#000000;fill-opacity:0.15686275;fill-rule:nonzero;stroke:none"
id="path86"
inkscape:connector-curvature="0" /></g></g></g></g><g
id="g88"
transform="translate(32,24.5)"
style="fill:#036ea7;fill-opacity:1"><path
d="m 0,0 c 3.315,0 6,2.685 6,6 l 0,18 c 0,3.315 -2.685,6 -6,6 -3.315,0 -6,-2.685 -6,-6 L -6,6 C -6,2.685 -3.315,0 0,0"
style="fill:#036ea7;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path90"
inkscape:connector-curvature="0" /></g><g
id="g92"
transform="translate(32,17.75)"><path
d="m 0,0 c -7.168,0 -13,5.832 -13,13 l 0,3.75 c 0,0.828 0.672,1.5 1.5,1.5 0.828,0 1.5,-0.672 1.5,-1.5 L -10,13 C -10,7.486 -5.514,3 0,3 5.514,3 10,7.486 10,13 l 0,3.75 c 0,0.828 0.672,1.5 1.5,1.5 0.828,0 1.5,-0.672 1.5,-1.5 L 13,13 C 13,5.832 7.168,0 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path94"
inkscape:connector-curvature="0" /></g><g
id="g96"
transform="translate(32,11)"><path
d="m 0,0 c -0.828,0 -1.5,0.672 -1.5,1.5 l 0,6 C -1.5,8.328 -0.828,9 0,9 0.828,9 1.5,8.328 1.5,7.5 l 0,-6 C 1.5,0.672 0.828,0 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path98"
inkscape:connector-curvature="0" /></g><g
id="g100"
transform="translate(37,10)"><path
d="m 0,0 -10,0 c -0.828,0 -1.5,0.672 -1.5,1.5 0,0.828 0.672,1.5 1.5,1.5 L 0,3 C 0.828,3 1.5,2.328 1.5,1.5 1.5,0.672 0.828,0 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path102"
inkscape:connector-curvature="0" /></g></g></svg>

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@ -0,0 +1,164 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
xml:space="preserve"
width="80"
height="80"
viewBox="0 0 80 80"
sodipodi:docname="microphone_mute.svg"><metadata
id="metadata8"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs6"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath16"><path
d="M 0,64 64,64 64,0 0,0 0,64 Z"
id="path18"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath28"><path
d="m 26,52.5 12,0 0,-30 -12,0 0,30 z"
id="path30"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath44"><path
d="m 19,34 26,0 0,-18.25 -26,0 0,18.25 z"
id="path46"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath60"><path
d="m 30.5,18 3,0 0,-9 -3,0 0,9 z"
id="path62"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath76"><path
d="m 25.5,11 13,0 0,-3 -13,0 0,3 z"
id="path78"
inkscape:connector-curvature="0" /></clipPath></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1009"
id="namedview4"
showgrid="false"
inkscape:zoom="5.9"
inkscape:cx="-45.462997"
inkscape:cy="30.717304"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g10" /><g
id="g10"
inkscape:groupmode="layer"
inkscape:label="Elegant_circle-icons"
transform="matrix(1.25,0,0,-1.25,0,80)"><path
inkscape:connector-curvature="0"
id="path22"
style="fill:#039bd5;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="M 64,32 C 64,14.327 49.673,0 32,0 14.327,0 0,14.327 0,32 0,49.673 14.327,64 32,64 49.673,64 64,49.673 64,32" /><g
id="g24"
style="fill:#000000;fill-opacity:0.15686275"><g
id="g26"
style="fill:#000000;fill-opacity:0.15686275" /><g
id="g32"
style="fill:#000000;fill-opacity:0.15686275"><g
clip-path="url(#clipPath28)"
id="g34"
style="fill:#000000;fill-opacity:0.15686275"><g
transform="translate(32,22.5)"
id="g36"
style="fill:#000000;fill-opacity:0.15686275"><path
d="m 0,0 c 3.315,0 6,2.685 6,6 l 0,18 c 0,3.315 -2.685,6 -6,6 -3.315,0 -6,-2.685 -6,-6 L -6,6 C -6,2.685 -3.315,0 0,0"
style="fill:#000000;fill-opacity:0.15686275;fill-rule:nonzero;stroke:none"
id="path38"
inkscape:connector-curvature="0" /></g></g></g></g><g
id="g40"
style="fill:#000000;fill-opacity:0.15686275"><g
id="g42"
style="fill:#000000;fill-opacity:0.15686275" /><g
id="g48"
style="fill:#000000;fill-opacity:0.15686275"><g
clip-path="url(#clipPath44)"
id="g50"
style="fill:#000000;fill-opacity:0.15686275"><g
transform="translate(32,15.75)"
id="g52"
style="fill:#000000;fill-opacity:0.15686275"><path
d="m 0,0 c -7.168,0 -13,5.832 -13,13 l 0,3.75 c 0,0.828 0.672,1.5 1.5,1.5 0.828,0 1.5,-0.672 1.5,-1.5 L -10,13 C -10,7.486 -5.514,3 0,3 5.514,3 10,7.486 10,13 l 0,3.75 c 0,0.828 0.672,1.5 1.5,1.5 0.828,0 1.5,-0.672 1.5,-1.5 L 13,13 C 13,5.832 7.168,0 0,0"
style="fill:#000000;fill-opacity:0.15686275;fill-rule:nonzero;stroke:none"
id="path54"
inkscape:connector-curvature="0" /></g></g></g></g><g
id="g72"
style="fill:#000000;fill-opacity:0.15686275"><g
id="g74"
style="fill:#000000;fill-opacity:0.15686275" /><g
id="g80"
style="fill:#000000;fill-opacity:0.15686275"><g
clip-path="url(#clipPath76)"
id="g82"
style="fill:#000000;fill-opacity:0.15686275"><g
transform="translate(37,8)"
id="g84"
style="fill:#000000;fill-opacity:0.15686275"><path
d="m 0,0 -10,0 c -0.828,0 -1.5,0.672 -1.5,1.5 0,0.828 0.672,1.5 1.5,1.5 L 0,3 C 0.828,3 1.5,2.328 1.5,1.5 1.5,0.672 0.828,0 0,0"
style="fill:#000000;fill-opacity:0.15686275;fill-rule:nonzero;stroke:none"
id="path86"
inkscape:connector-curvature="0" /></g></g></g></g><g
id="g88"
transform="translate(32,24.5)"
style="fill:#036ea7;fill-opacity:1"><path
d="m 0,0 c 3.315,0 6,2.685 6,6 l 0,18 c 0,3.315 -2.685,6 -6,6 -3.315,0 -6,-2.685 -6,-6 L -6,6 C -6,2.685 -3.315,0 0,0"
style="fill:#036ea7;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path90"
inkscape:connector-curvature="0" /></g><g
id="g92"
transform="translate(32,17.75)"><path
d="m 0,0 c -7.168,0 -13,5.832 -13,13 l 0,3.75 c 0,0.828 0.672,1.5 1.5,1.5 0.828,0 1.5,-0.672 1.5,-1.5 L -10,13 C -10,7.486 -5.514,3 0,3 5.514,3 10,7.486 10,13 l 0,3.75 c 0,0.828 0.672,1.5 1.5,1.5 0.828,0 1.5,-0.672 1.5,-1.5 L 13,13 C 13,5.832 7.168,0 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path94"
inkscape:connector-curvature="0" /></g><g
id="g96"
transform="translate(32,11)"><path
d="m 0,0 c -0.828,0 -1.5,0.672 -1.5,1.5 l 0,6 C -1.5,8.328 -0.828,9 0,9 0.828,9 1.5,8.328 1.5,7.5 l 0,-6 C 1.5,0.672 0.828,0 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path98"
inkscape:connector-curvature="0" /></g><g
id="g100"
transform="translate(37,10)"><path
d="m 0,0 -10,0 c -0.828,0 -1.5,0.672 -1.5,1.5 0,0.828 0.672,1.5 1.5,1.5 L 0,3 C 0.828,3 1.5,2.328 1.5,1.5 1.5,0.672 0.828,0 0,0"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path102"
inkscape:connector-curvature="0" /></g></g><g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="strike"><g
transform="translate(0.44034251,-0.59776851)"
style="display:inline"
id="g4750"><path
d="m 15.772882,66.54618 c -0.270445,-0.120927 -0.524656,-0.293474 -0.746896,-0.516083 -0.976599,-0.976171 -0.975066,-2.559731 5.96e-4,-3.535189 L 58.523101,19.01632 c 0.976795,-0.974955 2.560753,-0.977346 3.536331,0.0011 0.976599,0.976172 0.975065,2.559732 -5.96e-4,3.53519 l -43.49652,43.478587 c -0.754705,0.753848 -1.870833,0.925722 -2.789434,0.514976"
style="fill:#000000;fill-opacity:0.15686275;fill-rule:nonzero;stroke:none"
id="path4748"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccc" /><path
sodipodi:nodetypes="cccccccc"
inkscape:connector-curvature="0"
id="path70-5"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 15.772882,64.388905 c -0.270445,-0.120927 -0.524656,-0.293474 -0.746896,-0.516083 -0.976599,-0.976171 -0.975066,-2.559731 5.96e-4,-3.535189 L 58.523101,16.859045 c 0.976795,-0.974955 2.560753,-0.977346 3.536331,0.0011 0.976599,0.976172 0.975065,2.559732 -5.96e-4,3.53519 l -43.49652,43.478587 c -0.754705,0.753848 -1.870833,0.925722 -2.789434,0.514976" /></g></g></svg>

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg4155"
version="1.1"
inkscape:version="0.91 r13725"
xml:space="preserve"
width="80"
height="80"
viewBox="0 0 80 80"
sodipodi:docname="netgrapgh.svg"><metadata
id="metadata4161"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs4159" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="706"
id="namedview4157"
showgrid="false"
inkscape:zoom="1.8097514"
inkscape:cx="53.977152"
inkscape:cy="36.227842"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g4163" /><g
id="g4163"
inkscape:groupmode="layer"
inkscape:label="ink_ext_XXXXXX"
transform="matrix(1.25,0,0,-1.25,0,80)"><path
inkscape:connector-curvature="0"
id="path4167"
style="fill:#039bd5;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="M 64,32 C 64,14.327 49.673,0 32,0 14.327,0 0,14.327 0,32 0,49.673 14.327,64 32,64 49.673,64 64,49.673 64,32" /><path
inkscape:connector-curvature="0"
style="fill:#ffffff"
d="m 50.165226,33.471431 c -1.238877,0 -2.334984,-0.620309 -2.996298,-1.566011 l -2.694288,0.466846 c 0.0034,0.101203 0.0084,0.202359 0.0084,0.304408 0,1.196013 -0.237215,2.337248 -0.664254,3.38152 l 4.563237,2.753187 c 0.614041,-0.467639 1.379399,-0.745861 2.209028,-0.745861 2.015199,0 3.654673,1.639473 3.654673,3.654673 0,2.015082 -1.639474,3.654403 -3.654673,3.654403 -2.015082,0 -3.654402,-1.639321 -3.654402,-3.654403 0,-0.214118 0.01943,-0.423558 0.05507,-0.627657 l -4.5405,-2.739434 c -1.377676,1.679533 -3.352275,2.851098 -5.596563,3.187962 l 0,5.606176 c 1.6746,0.56021 2.885699,2.14251 2.885699,4.003299 1.7e-5,2.32777 -1.893787,4.221692 -4.221404,4.221692 -2.327516,0 -4.221168,-1.893787 -4.221168,-4.221692 0,-1.860789 1.210711,-3.442953 2.885429,-4.003299 l 0,-5.606176 C 31.124979,41.082111 28.569337,39.071845 27.34075,36.340166 l -8.361237,2.568195 c 0.02518,0.206636 0.03954,0.416615 0.03954,0.629923 0,2.867536 -2.33272,5.20051 -5.200121,5.20051 -2.867654,0 -5.2005096,-2.332974 -5.2005096,-5.20051 0,-2.867401 2.3328556,-5.200239 5.2006456,-5.200239 1.699047,0 3.210011,0.819205 4.159583,2.083069 l 8.644813,-2.655292 c -0.04342,-0.35731 -0.0686,-0.72023 -0.0686,-1.089012 0,-2.404308 0.95344,-4.588887 2.499684,-6.200312 l -3.766083,-4.008232 c -0.549651,0.245375 -1.157812,0.382958 -1.797752,0.382958 -2.441562,0 -4.427651,-1.986224 -4.427651,-4.427668 0,-2.441174 1.986089,-4.427262 4.427651,-4.427262 2.441173,0 4.427397,1.986088 4.427397,4.427262 0,0.830288 -0.230154,1.60754 -0.629263,2.272335 l 3.890704,4.141015 c 1.286692,-0.715009 2.765875,-1.123885 4.339489,-1.123885 1.503227,0 2.920302,0.373734 4.166139,1.03052 l 3.882141,-5.902965 c -0.945822,-0.942222 -1.532204,-2.245099 -1.532204,-3.682332 0,-2.867536 2.332975,-5.2005097 5.200511,-5.2005097 2.867537,0 5.20051,2.3328377 5.20051,5.2005097 0,2.867401 -2.332973,5.20024 -5.20051,5.20024 -0.467233,0 -0.920056,-0.06285 -1.351099,-0.179112 l -4.043898,6.148731 c 0.955704,0.951582 1.696631,2.11752 2.147848,3.417727 L 46.5488,29.302234 c 0.250969,-1.772104 1.777173,-3.139624 3.6174,-3.139624 2.015218,0 3.654674,1.639472 3.654674,3.654672 -2.2e-4,2.014812 -1.639727,3.654149 -3.654944,3.654149 z M 29.225487,32.67681 c 0,3.4698 2.822915,6.292732 6.292597,6.292732 3.469935,0 6.292731,-2.822932 6.292731,-6.292732 0,-3.469682 -2.822932,-6.292462 -6.292731,-6.292462 -3.469682,0 -6.292597,2.82278 -6.292597,6.292462 z"
id="path3" /></g></svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 19.292969 4 L 15.792969 7.5 L 14.292969 6 L 12.292969 8 L 9 11.292969 L 7 13.292969 L 8.5 14.792969 L 4 19.292969 L 4.7070312 20 L 9.2070312 15.5 L 10.707031 17 L 12.707031 15 L 16 11.707031 L 18 9.7070312 L 16.5 8.2070312 L 20 4.7070312 L 19.292969 4 z "
class="ColorScheme-Text"
/>
</svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@ -0,0 +1,21 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
.ColorScheme-NegativeText {
color:#da4453;
}
</style>
</defs>
<path
style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 19.292969 4 L 15.792969 7.5 L 14.292969 6 L 12.292969 8 L 10.5 9.7929688 L 12 11.292969 L 12.707031 12 L 14.207031 13.5 L 16 11.707031 L 18 9.7070312 L 16.5 8.2070312 L 20 4.7070312 L 19.292969 4 z M 9.7929688 10.5 L 9 11.292969 L 7 13.292969 L 8.5 14.792969 L 4 19.292969 L 4.7070312 20 L 9.2070312 15.5 L 10.707031 17 L 12.707031 15 L 13.5 14.207031 L 12 12.707031 L 11.292969 12 L 9.7929688 10.5 z "
class="ColorScheme-Text"/>
<path
style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 14.990234 14 L 14 14.990234 L 16.009766 17 L 14 19.009766 L 14.990234 20 L 17 17.990234 L 19.009766 20 L 20 19.009766 L 17.990234 17 L 20 14.990234 L 19.009766 14 L 17 16.009766 L 14.990234 14 z "
class="ColorScheme-NegativeText"
/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

View File

@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<path
style="fill:currentColor;fill-opacity:0.6;stroke:none"
d="m8.03 2l-1.875 3.939-4.15.621 2.982 3.08-.732 4.336 3.719-2.037 3.697 2.061-.684-4.34 3.02-3.062-4.143-.645zm-.008 2l1.221 2.635 2.762.432-2.01 2.041.455 2.893-2.463-1.373-2.48 1.357.488-2.891-1.988-2.055 2.766-.412z"
class="ColorScheme-Text" />
</svg>

After

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -0,0 +1,17 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Highlight {
color:#3daee9;
}
</style>
</defs>
<g
transform="translate(-421.71429,-531.79074)">
<path
style="fill:currentColor;fill-opacity:1;stroke:none"
d="m 429.74391,532.79074 -2.1875,4.59602 -4.84212,0.72462 3.47949,3.59343 -0.85449,5.05858 4.33854,-2.37663 4.31348,2.40398 -0.79753,-5.06315 3.52051,-3.57291 -4.83301,-0.75196 z"
id="path4277"
class="ColorScheme-Highlight" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 614 B

View File

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg4925"
version="1.1"
inkscape:version="0.91 r13725"
xml:space="preserve"
width="80"
height="80"
viewBox="0 0 80 80"
sodipodi:docname="search.svg"><metadata
id="metadata4931"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs4929" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1009"
id="namedview4927"
showgrid="false"
inkscape:zoom="5.9"
inkscape:cx="-34.973275"
inkscape:cy="31.754347"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g4933" /><g
id="g4933"
inkscape:groupmode="layer"
inkscape:label="ink_ext_XXXXXX"
transform="matrix(1.25,0,0,-1.25,0,80)"><path
inkscape:connector-curvature="0"
id="path4937"
style="fill:#039bd5;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="M 64,32 C 64,14.327 49.673,0 32,0 14.327,0 0,14.327 0,32 0,49.673 14.327,64 32,64 49.673,64 64,49.673 64,32" /><path
inkscape:connector-curvature="0"
id="path4939"
style="fill:#000000;fill-opacity:0.15686275;fill-rule:nonzero;stroke:none"
d="m 48,11.5 c -0.6395,0 -1.2797,0.2441 -1.7676,0.7324 l -9.4636,9.4637 c 0.3863,0.273 0.7605,0.5656 1.1218,0.8777 l 8.3418,-8.3414 C 46.7203,13.7441 47.3605,13.5 48,13.5 c 0.6395,0 1.2797,0.2441 1.7676,0.7324 0.2281,0.2281 0.4027,0.4891 0.5242,0.7676 C 50.691,14.0852 50.516,12.9809 49.7676,12.2324 49.2797,11.7441 48.6395,11.5 48,11.5 M 33.9215,24.6102 c -0.3543,0.5289 -0.4856,1.1632 -0.3926,1.7699 0.132,0.0734 0.2633,0.1504 0.3926,0.2301 0.0894,-0.1332 0.193,-0.2598 0.3109,-0.3778 l 0.8192,-0.8191 C 34.6891,25.118 34.3113,24.8504 33.9215,24.6102" /><path
inkscape:connector-curvature="0"
id="path4941"
style="fill:#495672;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 48,13.5 c -0.6395,0 -1.2797,0.2441 -1.7676,0.7324 l -12,12 c -0.9765,0.9766 -0.9765,2.5586 0,3.5352 0.9754,0.9765 2.5598,0.9765 3.5352,0 l 12,-12 c 0.9765,-0.9766 0.9765,-2.5586 0,-3.5352 C 49.2797,13.7441 48.6395,13.5 48,13.5" /><path
inkscape:connector-curvature="0"
id="path4943"
style="fill:#7db6d8;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 35.8578,43.0859 c 4.127,-4.1265 4.127,-10.8171 0,-14.9437 -4.1265,-4.127 -10.8172,-4.127 -14.9437,0 -4.127,4.1266 -4.127,10.8172 0,14.9437 4.1265,4.127 10.8172,4.127 14.9437,0" /><path
inkscape:connector-curvature="0"
id="path4945"
style="fill:#000000;fill-opacity:0.15686275;fill-rule:nonzero;stroke:none"
d="m 28.3859,19.0469 c -3.891,0 -7.5492,1.5152 -10.3004,4.2668 -5.6796,5.6797 -5.6796,14.9211 0,20.6008 2.7512,2.7511 6.4094,4.2668 10.3004,4.2668 3.8911,0 7.5493,-1.5157 10.3004,-4.2668 4.7211,-4.7211 5.518,-11.904 2.3903,-17.4555 l -2.9801,2.9801 c 0.7051,1.641 0.9746,3.4246 0.8094,5.175 0.2859,3.0269 -0.7297,6.1539 -3.0481,8.4718 -2.0633,2.0633 -4.7676,3.0954 -7.4719,3.0954 -2.7043,0 -5.4086,-1.0321 -7.4718,-3.0954 -2.318,-2.3179 -3.334,-5.4449 -3.0481,-8.4718 -0.2859,-3.0274 0.7301,-6.1539 3.0481,-8.4719 2.0632,-2.0637 4.7675,-3.0953 7.4718,-3.0953 1.9219,0 3.8438,0.5211 5.5356,1.5633 0.0894,-0.1332 0.193,-0.2598 0.3109,-0.3778 l 2.5364,-2.5363 C 34.332,19.9746 31.4305,19.0469 28.3859,19.0469" /><path
inkscape:connector-curvature="0"
id="path4947"
style="fill:#000000;fill-opacity:0.15686275;fill-rule:nonzero;stroke:none"
d="m 36.7688,21.6961 -2.5364,2.5363 c -0.1179,0.118 -0.2215,0.2446 -0.3109,0.3778 0.3898,0.2402 0.7676,0.5078 1.1301,0.8031 l 2.839,-2.8395 c -0.3613,-0.3121 -0.7355,-0.6047 -1.1218,-0.8777" /><path
inkscape:connector-curvature="0"
id="path4951"
style="fill:#000000;fill-opacity:0.15686275;fill-rule:nonzero;stroke:none"
d="m 17.866,34.6141 c -0.2859,3.0269 0.7301,6.1539 3.0481,8.4718 2.0632,2.0633 4.7675,3.0954 7.4718,3.0954 2.7043,0 5.4086,-1.0321 7.4719,-3.0954 2.3184,-2.3179 3.334,-5.4449 3.0481,-8.4718 -0.2235,2.3621 -1.2391,4.6632 -3.0481,6.4718 -2.0633,2.0633 -4.7676,3.0954 -7.4719,3.0954 -2.7043,0 -5.4086,-1.0321 -7.4718,-3.0954 -1.8086,-1.8086 -2.8246,-4.1097 -3.0481,-6.4718" /><path
inkscape:connector-curvature="0"
id="path4953"
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 28.3859,50.1813 c -3.891,0 -7.5492,-1.5157 -10.3004,-4.2668 -5.6796,-5.6797 -5.6796,-14.9211 0,-20.6008 2.7512,-2.7516 6.4094,-4.2668 10.3004,-4.2668 3.8911,0 7.5493,1.5152 10.3004,4.2668 5.6797,5.6797 5.6797,14.9211 0,20.6008 -2.7511,2.7511 -6.4093,4.2668 -10.3004,4.2668 z m 0,-4 c 2.7043,0 5.4086,-1.0321 7.4719,-3.0954 4.127,-4.1265 4.127,-10.8171 0,-14.9437 -2.0633,-2.0637 -4.7676,-3.0953 -7.4719,-3.0953 -2.7043,0 -5.4086,1.0316 -7.4718,3.0953 -4.127,4.1266 -4.127,10.8172 0,14.9437 2.0632,2.0633 4.7675,3.0954 7.4718,3.0954" /></g></svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="80"
style="enable-background:new 0 0 110 110;"
version="1.0"
viewBox="0 0 110 110"
width="80"
xml:space="preserve"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="send-message.svg"><metadata
id="metadata20"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs18" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1009"
id="namedview16"
showgrid="false"
inkscape:zoom="1.5170655"
inkscape:cx="-223.56963"
inkscape:cy="132.17218"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" /><g
id="Artboard" /><g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="Layer 1"
style="display:inline"><circle
id="circle6"
style="fill:#039bd5;fill-opacity:1"
r="55"
cy="55"
cx="55" /><path
style="fill:#000000;fill-opacity:0.15686275"
d="m 86.25465,28.530776 -73.5093,36.754649 13.782994,9.188663 9.188662,18.377325 7.656472,-7.656472 17.61235,8.805054 25.268822,-65.469219 z"
id="use4142"
inkscape:connector-curvature="0" /><polygon
points="43,83 43,73 49.67,76.33 "
style="fill:#b7bebf;fill-opacity:1"
id="polygon10"
transform="matrix(1.1485828,0,0,1.1485828,-13.672054,-7.0752906)" /><polygon
points="65,84 43,73 43,83 35,67 23,59 87,27 "
style="fill:#ffffff"
id="polygon12"
transform="matrix(1.1485828,0,0,1.1485828,-13.672054,-7.0752906)" /><polygon
points="43,83 43,73 87,27 35,67 "
style="fill:#cfd3d5;fill-opacity:1"
id="polygon14"
transform="matrix(1.1485828,0,0,1.1485828,-13.672054,-7.0752906)" /></g></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
xml:space="preserve"
width="80"
height="80"
viewBox="0 0 80 80"
sodipodi:docname="smiley.svg"><metadata
id="metadata8"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs6"><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath16"><path
d="M 0,64 64,64 64,0 0,0 0,64 Z"
id="path18"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath28"><path
d="m 10,52.0001 44.5,0 L 54.5,8 10,8 10,52.0001 Z"
id="path30"
inkscape:connector-curvature="0" /></clipPath><clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath48"><path
d="m 23.4994,49.0008 17.0012,0 0,-38.0013 -17.0012,0 0,38.0013 z"
id="path50-3"
inkscape:connector-curvature="0" /></clipPath></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1009"
id="namedview4"
showgrid="false"
inkscape:zoom="2.95"
inkscape:cx="28.678265"
inkscape:cy="43.034814"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g10"
showguides="true"
inkscape:guide-bbox="true" /><g
id="g10"
inkscape:groupmode="layer"
inkscape:label="Elegant_circle-icons_3"
transform="matrix(1.25,0,0,-1.25,0,80)"
style="display:inline"><path
inkscape:connector-curvature="0"
id="path22"
style="fill:#039bd5;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="M 64,32 C 64,14.327 49.673,0 32,0 14.327,0 0,14.327 0,32 0,49.673 14.327,64 32,64 49.673,64 64,49.673 64,32" /></g><g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="smiley"
style="display:inline"><circle
r="28.74452"
cy="42.809505"
cx="39.909584"
id="use4269"
style="opacity:1;fill:#000000;fill-opacity:0.17056855;stroke:none;stroke-opacity:1" /><circle
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
id="path4174"
cx="39.909584"
cy="40.210262"
r="28.74452" /><circle
style="opacity:1;fill:#036290;fill-opacity:1;stroke:none;stroke-opacity:1"
id="path4176"
r="4.9137926"
cy="33.378891"
cx="27.565178" /><path
style="opacity:1;fill:#036290;fill-opacity:1;stroke:none;stroke-opacity:1"
d="m 58.609498,44.088438 c 2e-6,10.526248 -8.53321,19.059459 -19.059457,19.059458 -10.526248,0 -19.059458,-8.53321 -19.059456,-19.059458 10.822598,0 26.991722,0 38.118913,0 z"
id="path4176-6"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cscc" /><path
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
d="m 55.758437,46.383882 c 0,1.551486 -0.494738,3.390982 -1.209686,4.542984 -7.470104,0 -21.735573,0.04946 -29.84381,0.04946 -0.953872,-1.281469 -1.224005,-3.022933 -1.224005,-4.592444 z"
id="path4176-6-7"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" /><circle
style="opacity:1;fill:#036290;fill-opacity:1;stroke:none;stroke-opacity:1"
id="path4176-5"
r="4.9137926"
cy="33.360207"
cx="51.260605" /></g></svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

View File

@ -0,0 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
</style>
</defs>
<g
transform="translate(-421.71429,-525.79074)">
<path
style="opacity:1;fill:currentColor;fill-opacity:1;stroke:none"
d="M 11 4 A 6 6 0 0 0 5 10 A 6 6 0 0 0 5.0039062 10.128906 A 4 4 0 0 0 2 14 A 4 4 0 0 0 6 18 L 15 18 A 5 5 0 0 0 20 13 A 5 5 0 0 0 16.757812 8.3242188 A 6 6 0 0 0 11 4 z M 11 5 A 5 5 0 0 1 15.919922 9.1113281 A 4.0000019 4.0000019 0 0 1 19 13 A 4.0000019 4.0000019 0 0 1 15 17 L 6 17 A 2.9999979 2.9999979 0 0 1 3 14 A 2.9999979 2.9999979 0 0 1 6 11 A 2.9999979 2.9999979 0 0 1 6.1074219 11.005859 A 5 5 0 0 1 6 10 A 5 5 0 0 1 11 5 z "
transform="translate(421.71429,525.79074)"
class="ColorScheme-Text"
id="path4196" />
<path
style="opacity:1;fill:#bdc3c7;fill-opacity:1;stroke:none"
d="m 442.71429,540.29071 a 4.5,4.5 0 0 1 -4.5,4.5 4.5,4.5 0 0 1 -4.5,-4.5 4.5,4.5 0 0 1 4.5,-4.5 4.5,4.5 0 0 1 4.5,4.5 z"
id="path4306" />
<path
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke-linecap:round"
d="M 14 14 L 14 15 L 15 15 L 15 14 L 14 14 z M 16 14 L 16 15 L 17 15 L 17 14 L 16 14 z M 18 14 L 18 15 L 19 15 L 19 14 L 18 14 z "
transform="translate(421.71429,525.79074)"
id="rect4521" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

View File

@ -0,0 +1,24 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 22">
<defs id="defs3051">
<style type="text/css" id="current-color-scheme">
.ColorScheme-Text {
color:#4d4d4d;
}
.ColorScheme-PositiveText {
color:#27ae60;
}
</style>
</defs>
<path style="fill:currentColor;fill-opacity:1;stroke:none"
d="M 11 4 A 6 6 0 0 0 5 10 A 6 6 0 0 0 5.0039062 10.128906 A 4 4 0 0 0 2 14 A 4 4 0 0 0 6 18 L 15 18 A 5 5 0 0 0 20 13 A 5 5 0 0 0 16.757812 8.3242188 A 6 6 0 0 0 11 4 z M 11 5 A 5 5 0 0 1 15.919922 9.1113281 A 4.0000019 4.0000019 0 0 1 19 13 A 4.0000019 4.0000019 0 0 1 15 17 L 6 17 A 2.9999979 2.9999979 0 0 1 3 14 A 2.9999979 2.9999979 0 0 1 6 11 A 2.9999979 2.9999979 0 0 1 6.1074219 11.005859 A 5 5 0 0 1 6 10 A 5 5 0 0 1 11 5 z "
class="ColorScheme-Text"
/>
<path
style="fill:currentColor;fill-opacity:1;stroke:none"
class="ColorScheme-PositiveText"
d="M 16 11 C 13.784 11 12 12.784 12 15 C 12 17.216 13.784 19 16 19 C 18.216 19 20 17.216 20 15 C 20 12.784 18.216 11 16 11 z "
/>
<path
style="opacity:1;fill:#ffffff"
d="M 18 13 L 15 16 L 14 15 L 13 16 L 14 17 L 15 18 L 19 14 L 18 13 z " />
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -16,11 +16,13 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import QtQuick 2.7
import QtQuick 2.1
import QtQuick.Controls 2.0
import org.retroshare.qml_components.LibresapiLocalClient 1.0
import "URI.js" as UriJs
import "." //Needed for TokensManager and ClipboardWrapper singleton
import "components/."
ApplicationWindow
{
@ -54,80 +56,173 @@ ApplicationWindow
function addUriHandler(path, fun) { uriHandlersRegister[path] = fun }
function delUriHandler(path, fun) { delete uriHandlersRegister[path] }
header: ToolBar
{
id: toolBar
property alias titleText: toolBarText.text
property alias loaderSource: imageLoader.sourceComponent
property alias gxsSource: imageLoader.gxsSource
property string defaultLabel: "RetroShare"
Image
property var iconsSize: (coreReady)? height - 10 : 0
property var searchBtnCb
function openMainPage ()
{
id: rsIcon
fillMode: Image.PreserveAspectFit
height: Math.max(30, parent.height - 4)
anchors.verticalCenter: parent.verticalCenter
source: "icons/retroshare06.png"
if (stackView.currentItem.objectName != "contactsView" )
{
stackView.push("qrc:/Contacts.qml")
}
}
Label
states:
[
State
{
name: "DEFAULT"
PropertyChanges { target: toolBar; titleText: defaultLabel}
PropertyChanges { target: toolBar; loaderSource: rsIcon}
},
State
{
name: "CHATVIEW"
PropertyChanges { target: toolBarText; mouseA.visible: false }
PropertyChanges { target: toolBar; loaderSource: userHash }
// PropertyChanges { target: toolBar; backBtnVisible: true }
},
State
{
name: "CONTACTSVIEW"
PropertyChanges { target: toolBar; titleText: defaultLabel}
PropertyChanges { target: toolBar; loaderSource: rsIcon}
PropertyChanges { target: searchIcon; searchIconVisibility: true}
}
]
Item
{
text: "RetroShare"
anchors.verticalCenter: parent.verticalCenter
anchors.left: rsIcon.right
anchors.leftMargin: 20
id: tolbarLeftPadding
width: 4
}
MouseArea
{
id: menu
height: parent.height
width: parent.height
anchors.left: tolbarLeftPadding.right
anchors.verticalCenter: parent.verticalCenter
onClicked: sideBar.open()
Image
{
source: "qrc:/icons/application-menu.svg"
height: parent.height - 10
width: height
sourceSize.height: height
sourceSize.width: height
anchors.centerIn: parent
}
SideBar {
id: sideBar
}
}
Label
{
property alias mouseA: mouseA
id: toolBarText
anchors.verticalCenter: parent.verticalCenter
anchors.left: menu.right
anchors.leftMargin: 20
MouseArea {
id: mouseA
visible: true
anchors.fill: parent
onClicked: { toolBar.openMainPage() }
}
}
BtnIcon
{
property bool searchIconVisibility: false
property var onClickCB: function (){}
id: searchIcon
height: toolBar.iconsSize
width: toolBar.iconsSize
anchors.verticalCenter: parent.verticalCenter
imgUrl: "qrc:/icons/search.svg"
anchors.right: imageLoader.left
anchors.rightMargin: 5
visible: searchIconVisibility && coreReady
onClicked:
{
toolBar.searchBtnCb()
}
}
Loader
{
id: imageLoader
height: toolBar.height - 4
asynchronous: true
anchors.right: parent.right
anchors.rightMargin: 2
anchors.verticalCenter: parent.verticalCenter
onClicked: menu.open()
property string gxsSource;
Image
}
Component
{
id: rsIcon
BtnIcon
{
source: "qrc:/icons/application-menu.png"
height: parent.height - 10
width: parent.height - 10
anchors.centerIn: parent
}
Menu
{
id: menu
y: parent.y + parent.height
MenuItem
height: imageLoader.height
width: imageLoader.height
fillMode: Image.PreserveAspectFit
imgUrl: "/icons/retroshare06.png"
onClicked:
{
text: qsTr("Trusted Nodes")
//iconSource: "qrc:/icons/document-share.png"
onTriggered: stackView.push("qrc:/TrustedNodesView.qml")
enabled: mainWindow.coreReady
}
MenuItem
{
text: qsTr("Search Contacts")
onTriggered:
stackView.push("qrc:/Contacts.qml",
{'searching': true} )
enabled: mainWindow.coreReady
}
MenuItem
{
text: "Paste Link"
onTriggered: UriJs.URI.withinString(
ClipboardWrapper.getFromClipBoard(),
handleIntentUri)
enabled: mainWindow.coreReady
}
MenuItem
{
text: "Terminate Core"
onTriggered: rsApi.request("/control/shutdown")
visible: !Q_OS_ANDROID
if (coreReady) toolBar.openMainPage()
}
}
}
Component
{
id: userHash
AvatarOrColorHash
{
id: colorHash
gxs_id: imageLoader.gxsSource
height: toolBar.height - 4
anchors.leftMargin: 2
}
}
}
StackView
@ -135,13 +230,43 @@ ApplicationWindow
id: stackView
anchors.fill: parent
focus: true
onCurrentItemChanged: if (currentItem) currentItem.focus = true
onCurrentItemChanged:
{
if (currentItem)
{
setStatus (currentItem)
}
}
Keys.onReleased:
if (event.key === Qt.Key_Back && stackView.depth > 1)
{
if ((event.key === Qt.Key_Back || Qt.Key_Backspace) && stackView.depth > 1)
{
stackView.pop();
event.accepted = true;
setStatus (stackView.currentItem)
}
}
function setStatus (currentItem)
{
if (currentItem)
{
if (currentItem.objectName != "chatView" &&
currentItem.objectName != "contactsView" &&
toolBar.state != "DEFAULT")
{
toolBar.state = "DEFAULT"
}
else if (typeof currentItem.changeState === 'function')
{
currentItem.changeState ()
}
currentItem.focus = true
}
}
state: "core_down"
initialItem: BusyOverlay { message: qsTr("Connecting to core...") }

View File

@ -10,14 +10,13 @@
<file>TrustedNodesView.qml</file>
<file>ChatView.qml</file>
<file>icons/retroshare06.png</file>
<file>icons/state-offline.png</file>
<file>icons/state-ok.png</file>
<file>icons/state-offline.svg</file>
<file>icons/state-ok.svg</file>
<file>GxsIdentityDelegate.qml</file>
<file>icons/edit-find.png</file>
<file>icons/edit-image-face-detect.png</file>
<file>icons/application-menu.png</file>
<file>icons/edit-image-face-detect.svg</file>
<file>icons/application-menu.svg</file>
<file>ContactSort.js</file>
<file>icons/emblem-locked.png</file>
<file>icons/emblem-locked.svg</file>
<file>BusyOverlay.qml</file>
<file>URI.js</file>
<file>TokensManager.qml</file>
@ -25,10 +24,34 @@
<file>TrustedNodeDetails.qml</file>
<file>ClipboardWrapper.qml</file>
<file>ContactDetails.qml</file>
<file>ColorHash.qml</file>
<file>icons/rating-unrated.png</file>
<file>icons/rating.png</file>
<file>icons/rating-unrated.svg</file>
<file>icons/rating.svg</file>
<file>TimedPopup.qml</file>
<file>AvatarOrColorHash.qml</file>
<file>ChatCache.qml</file>
<file>ChatBubbleDelegate.qml</file>
<file>icons/send-message.svg</file>
<file>icons/attach.svg</file>
<file>components/BtnIcon.qml</file>
<file>icons/smiley.svg</file>
<file>icons/microphone_mute.svg</file>
<file>icons/microphone.svg</file>
<file>components/ColorHash.qml</file>
<file>styles/ChatStyle.qml</file>
<file>components/AvatarOrColorHash.qml</file>
<file>components/SideBar.qml</file>
<file>styles/SideBarStyle.qml</file>
<file>components/Btn.qml</file>
<file>icons/netgraph.svg</file>
<file>icons/search.svg</file>
<file>icons/exit.svg</file>
<file>icons/add.svg</file>
<file>icons/keyring.svg</file>
<file>components/TextAndIcon.qml</file>
<file>components/emoji/EmojiPicker.qml</file>
<file>components/emoji/EmojiCategoryButton.qml</file>
<file>components/emoji/EmojiButton.qml</file>
<file>components/emoji/emoji.js</file>
<file>icons/network-connect.svg</file>
<file>icons/network-disconnect.svg</file>
</qresource>
</RCC>

View File

@ -1,2 +1,6 @@
singleton TokensManager 1.0 TokensManager.qml
singleton ClipboardWrapper 1.0 ClipboardWrapper.qml
singleton ChatCache ChatCache.qml
singleton StyleChat styles/ChatStyle.qml
singleton StyleSideBar styles/SideBarStyle.qml

View File

@ -1,6 +1,6 @@
!include("../../retroshare.pri"): error("Could not include file ../../retroshare.pri")
QT += core network qml quick
QT += core network qml quick svg
CONFIG += c++11

View File

@ -0,0 +1,74 @@
import QtQuick 2.0
pragma Singleton
QtObject {
property QtObject bubble: QtObject{
// Bubble measures
readonly property int lMarginBubble: 10
readonly property int rMarginBubble: 10
readonly property int tMarginBubble: 5
readonly property int bMarginBubble: 10
readonly property int aditionalBubbleHeight: tMarginBubble * 2
readonly property int aditionalBubbleWidth: 30
readonly property real bubbleMaxWidth: 0.5 // % from parent
// BubbleProps
readonly property int radius: 5
// Colors
readonly property string colorIncoming: "lightGreen"
readonly property string colorOutgoing: "aliceblue"
readonly property string colorSenderName: "cornflowerblue"
readonly property string colorMessageTime: "grey"
// Text
readonly property int messageTextSize: 15
}
property QtObject inferiorPanel: QtObject{
// Panel globals
readonly property int height: 50
readonly property string backgroundColor: "white"
readonly property string borderColor: "lightGrey"
property QtObject msgComposer: QtObject{
readonly property string placeHolder: "Send message..."
readonly property int maxHeight: 180
readonly property int messageBoxTextSize: 15
property QtObject background: Rectangle {
color: "transparent"
}
}
// Button Icon
property QtObject btnIcon: QtObject{
readonly property int width: 35
readonly property int height: 35
readonly property int margin: 5
readonly property string sendIconUrl: "/icons/send-message.svg"
readonly property string attachIconUrl: "/icons/attach.svg"
readonly property string microIconUrl: "/icons/microphone.svg"
readonly property string microMuteIconUrl: "/icons/microphone_mute.svg"
readonly property string emojiIconUrl: "/icons/smiley.svg"
}
}
property QtObject chat: QtObject {
// Measures
readonly property int bubbleMargin: 20
readonly property int bubbleSpacing: 10
}
}

View File

@ -0,0 +1,34 @@
import QtQuick 2.0
pragma Singleton
QtObject {
property var width: 2 // Number of third parts of screen (for example 2/3)
property QtObject item: QtObject
{
property var height: 50
property string hoverColor: "lightgrey"
property string defaultColor: "white"
property string pressColor: "slategrey"
property int pixelSize: 14
}
property QtObject header: QtObject
{
property var color: "#0398d5"
property var avatarHeight: 50
property var avatarMargins: 15
property var textColor: "white"
property var textNickSize: 14
property var textGxsidSize: 11
}
property QtObject footer: QtObject
{
property var color: "white"
property var textColor: "grey"
property var margins: 8
property string text: "Retroshare Dev Version"
}
}