diff --git a/resources/icons/create_swarm.svg b/resources/icons/create_swarm.svg new file mode 100644 index 0000000000000000000000000000000000000000..d590be27909ac0c603ef6d5ac0b96adbc3bc0e77 --- /dev/null +++ b/resources/icons/create_swarm.svg @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve"> +<path d="M20,8.4c-0.4-0.3-0.8-0.5-1.2-0.7c0.2-0.2,0.4-0.5,0.6-0.8c0.4-0.8,0.4-1.8,0-2.6c-0.5-0.9-1.5-1.6-2.6-1.6 + c-0.7,0-1.5,0.3-2,0.8c-0.6,0.6-1,1.6-0.8,2.5c0.1,0.6,0.4,1.2,0.8,1.6c-0.3,0.1-0.6,0.3-0.9,0.5c-0.5-0.4-1.2-0.6-1.9-0.6 + c-0.6,0-1.3,0.2-1.8,0.6C9.9,8,9.5,7.9,9.2,7.7c0.2-0.2,0.4-0.5,0.6-0.8c0.4-0.8,0.4-1.7,0-2.5c-0.5-1-1.5-1.6-2.6-1.6 + c-0.7,0-1.4,0.3-1.9,0.8c-0.7,0.6-1,1.6-0.9,2.5c0.1,0.6,0.4,1.2,0.8,1.6c-1.8,0.7-3.1,2.5-3.4,4.4c0,0.3,0,0.7,0,1 + c0,0.2,0,0.2,0.1,0.3c0.1,0.2,0.4,0.3,0.6,0.3c0.3,0,0.5-0.2,0.5-0.5c0,0,0-0.1,0-0.1v-0.3c0-1.4,0.7-2.7,1.8-3.5 + c1.3-0.9,3-1,4.4-0.2C9.2,9.2,9.1,9.4,9,9.5c-0.4,0.9-0.5,2,0,3c0.2,0.4,0.5,0.8,0.8,1.1c-1.2,0.5-2.3,1.3-3,2.3 + C6,17,5.6,18.3,5.6,19.6l0,0.1c0,0.2,0,0.4,0.1,0.6c0.1,0.2,0.4,0.3,0.6,0.3c0.3,0,0.5-0.2,0.5-0.5c0,0,0-0.1,0-0.1v-0.4 + c0-1.5,0.6-2.9,1.7-3.9c1.4-1.3,3.6-1.7,5.4-1c1.7,0.7,2.9,2.3,3.2,4c0.1,0.4,0.1,0.8,0.1,1.2c0,0,0,0.1,0,0.1 + c0,0.1,0.1,0.2,0.2,0.3c0.1,0.1,0.2,0.2,0.4,0.2c0.1,0,0.2,0,0.2,0c0.2-0.1,0.4-0.3,0.4-0.6v-0.4c0-1.4-0.4-2.7-1.2-3.8 + c-0.7-1-1.8-1.8-3-2.2c0.3-0.3,0.6-0.7,0.8-1.1c0.4-0.9,0.4-2,0-3c-0.1-0.1-0.1-0.3-0.2-0.4c1.1-0.6,2.4-0.7,3.6-0.3 + c1.4,0.5,2.4,1.9,2.6,3.4c0,0.3,0,0.5,0,0.9c0,0.2,0,0.2,0.1,0.3c0.1,0.2,0.4,0.3,0.6,0.3c0.3,0,0.5-0.2,0.5-0.5c0,0,0-0.1,0-0.1 + v-0.3C22.2,11.1,21.4,9.5,20,8.4z M8.8,5.9C8.7,6.5,8.3,7,7.8,7.2C7.2,7.5,6.5,7.3,6.1,6.9c-0.4-0.4-0.6-1-0.5-1.5 + C5.8,4.6,6.5,4,7.2,4c0,0,0.1,0,0.1,0c0.4,0,0.8,0.2,1.1,0.6C8.7,5,8.9,5.5,8.8,5.9z M14.1,11.3C14,12,13.5,12.7,12.8,13 + c-0.7,0.3-1.7,0.1-2.3-0.4C10,12,9.8,11.3,9.9,10.6c0.2-0.9,1.1-1.7,2-1.7c0.3,0,0.6,0.1,0.9,0.2C13.7,9.5,14.2,10.4,14.1,11.3z + M16.8,3.8l0,0.2c0.7,0,1.4,0.6,1.6,1.3c0.1,0.7-0.3,1.5-1,1.8c-0.6,0.2-1.3,0.1-1.8-0.3c-0.4-0.4-0.6-1-0.5-1.5 + C15.4,4.6,16,4,16.8,4L16.8,3.8L16.8,3.8z"/> +</svg> diff --git a/src/constant/JamiStrings.qml b/src/constant/JamiStrings.qml index 722f829ae09cf238b1c1814ae151b52c4823a73b..d0db3dcea1e90ab919079477c28afd3039c3bbfd 100644 --- a/src/constant/JamiStrings.qml +++ b/src/constant/JamiStrings.qml @@ -37,6 +37,7 @@ Item { property string incomingAudioCallFrom: qsTr("Incoming audio call from {}") property string incomingVideoCallFrom: qsTr("Incoming video call from {}") property string contactSearchConversation: qsTr("Find a user or search for a conversation") + property string startASwarm: qsTr("Start a swarm") property string contactSearchInvitations: qsTr("Search your invitations") property string invitations: qsTr("Invitations") property string description: qsTr("Jami is free software for universal communication which respects the freedoms and the privacy of its users.") diff --git a/src/conversationsadapter.cpp b/src/conversationsadapter.cpp index 11b7bfc977650534335b8612c0d6d3d9697aa519..02786c5878241ec92148c3515aee0a4a1bcf6b72 100644 --- a/src/conversationsadapter.cpp +++ b/src/conversationsadapter.cpp @@ -549,3 +549,10 @@ ConversationsAdapter::connectConversationModel() return true; } + +void +ConversationsAdapter::createSwarm() +{ + auto convModel = lrcInstance_->getCurrentConversationModel(); + convModel->createConversation({}, ""); +} \ No newline at end of file diff --git a/src/conversationsadapter.h b/src/conversationsadapter.h index 3302bd55831437ff6e1b60aa347c8b125c13bbc5..72da591eafdf4fb79f6a5e900c4bf8449b24fafe 100644 --- a/src/conversationsadapter.h +++ b/src/conversationsadapter.h @@ -48,6 +48,7 @@ protected: public: Q_INVOKABLE bool connectConversationModel(); + Q_INVOKABLE void createSwarm(); Q_INVOKABLE void setFilter(const QString& filterString); Q_INVOKABLE QVariantMap getConvInfoMap(const QString& convId); Q_INVOKABLE void restartConversation(const QString& convId); diff --git a/src/mainview/components/SidePanel.qml b/src/mainview/components/SidePanel.qml index 45feb8af4cbc17ca905a638e0ec2e0288c250dfb..f0ad5fcb7d069b65e04c93de8fe079199ed9d4a9 100644 --- a/src/mainview/components/SidePanel.qml +++ b/src/mainview/components/SidePanel.qml @@ -56,8 +56,8 @@ Rectangle { sidePanelTabBar.selectTab(tabIndex) } - ContactSearchBar { - id: contactSearchBar + RowLayout { + id: startBar height: 40 anchors.top: sidePanelRect.top @@ -67,19 +67,46 @@ Rectangle { anchors.right: sidePanelRect.right anchors.rightMargin: 15 - onContactSearchBarTextChanged: function (text) { - // not calling positionViewAtBeginning will cause - // sort animation visual bugs - conversationListView.positionViewAtBeginning() - ConversationsAdapter.setFilter(text) + ContactSearchBar { + id: contactSearchBar + + Layout.fillHeight: true + Layout.fillWidth: true + + onContactSearchBarTextChanged: function (text) { + // not calling positionViewAtBeginning will cause + // sort animation visual bugs + conversationListView.positionViewAtBeginning() + ConversationsAdapter.setFilter(text) + } + + onReturnPressedWhileSearching: { + var listView = searchResultsListView.count ? + searchResultsListView : + conversationListView + if (listView.count) + listView.model.select(0) + } } - onReturnPressedWhileSearching: { - var listView = searchResultsListView.count ? - searchResultsListView : - conversationListView - if (listView.count) - listView.model.select(0) + PushButton { + id: startConversation + + Layout.alignment: Qt.AlignLeft + radius: JamiTheme.primaryRadius + + imageColor: JamiTheme.textColor + imagePadding: 8 + normalColor: JamiTheme.secondaryBackgroundColor + + preferredSize: startBar.height + + source: JamiResources.create_swarm_svg + toolTipText: JamiStrings.startASwarm + + onClicked: { + ConversationsAdapter.createSwarm() + } } } @@ -88,7 +115,7 @@ Rectangle { visible: ConversationsAdapter.pendingRequestCount && !contactSearchBar.textContent - anchors.top: contactSearchBar.bottom + anchors.top: startBar.bottom anchors.topMargin: visible ? 10 : 0 width: sidePanelRect.width height: visible ? 42 : 0