2
0
mirror of synced 2025-02-19 18:08:10 +00:00

feat(StatusQ.Popups) Adding SearchPopup component

Closes #264
This commit is contained in:
Alexandra Betouni 2021-07-23 19:28:16 +03:00 committed by Pascal Precht
parent 90aa9d76c0
commit 30f5ae4b32
19 changed files with 1085 additions and 230 deletions

View File

@ -299,14 +299,14 @@ Rectangle {
StatusChatList { StatusChatList {
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
chatListItems.model: demoChatListItems chatListItems.model: models.demoChatListItems
selectedChatId: "0" selectedChatId: "0"
onChatItemSelected: selectedChatId = id onChatItemSelected: selectedChatId = id
onChatItemUnmuted: { onChatItemUnmuted: {
for (var i = 0; i < demoChatListItems.count; i++) { for (var i = 0; i < models.demoChatListItems.count; i++) {
let item = demoChatListItems.get(i); let item = models.demoChatListItems.get(i);
if (item.chatId === id) { if (item.chatId === id) {
demoChatListItems.setProperty(i, "muted", false) models.demoChatListItems.setProperty(i, "muted", false)
} }
} }
} }
@ -412,7 +412,7 @@ Rectangle {
handle: Rectangle { handle: Rectangle {
implicitWidth: 5 implicitWidth: 5
color: SplitHandle.pressed ? Theme.palette.baseColor2 color: SplitHandle.pressed ? Theme.palette.baseColor2
: (SplitHandle.hovered ? Qt.darker(Theme.palette.baseColor5, 1.1) : "transparent") : (SplitHandle.hovered ? Qt.darker(Theme.palette.baseColor5, 1.1) : "transparent")
} }
leftPanel: Item { leftPanel: Item {
id: leftPanel id: leftPanel
@ -467,8 +467,8 @@ Rectangle {
width: leftPanel.width width: leftPanel.width
height: implicitHeight > (leftPanel.height - 64) ? implicitHeight + 8 : leftPanel.height - 64 height: implicitHeight > (leftPanel.height - 64) ? implicitHeight + 8 : leftPanel.height - 64
chatList.model: demoCommunityChatListItems chatList.model: models.demoCommunityChatListItems
categoryList.model: demoCommunityCategoryItems categoryList.model: models.demoCommunityCategoryItems
showCategoryActionButtons: true showCategoryActionButtons: true
onChatItemSelected: selectedChatId = id onChatItemSelected: selectedChatId = id
@ -557,6 +557,7 @@ Rectangle {
centerPanel: Item { centerPanel: Item {
StatusChatToolBar { StatusChatToolBar {
id: statusChatToolBar
anchors.top: parent.top anchors.top: parent.top
width: parent.width width: parent.width
@ -564,12 +565,61 @@ Rectangle {
chatInfoButton.subTitle: "Community Chat" chatInfoButton.subTitle: "Community Chat"
chatInfoButton.icon.color: Theme.palette.miscColor6 chatInfoButton.icon.color: Theme.palette.miscColor6
chatInfoButton.type: StatusChatInfoButton.Type.CommunityChat chatInfoButton.type: StatusChatInfoButton.Type.CommunityChat
searchButton.onClicked: searchButton.highlighted = !searchButton.highlighted onSearchButtonClicked: {
searchButton.highlighted = !searchButton.highlighted;
searchPopup.searchSelectionButton.primaryText = demoCommunityDetailModal.header.title;
searchPopup.searchSelectionButton.image.source = demoCommunityDetailModal.header.image.source;
searchPopup.open();
}
membersButton.onClicked: membersButton.highlighted = !membersButton.highlighted membersButton.onClicked: membersButton.highlighted = !membersButton.highlighted
onMembersButtonClicked: { onMembersButtonClicked: {
root.showRightPanel = !root.showRightPanel; root.showRightPanel = !root.showRightPanel;
} }
} }
StatusSearchPopup {
id: searchPopup
searchOptionsPopupMenu: searchPopupMenu
onAboutToHide: {
if (searchPopupMenu.visible) {
searchPopupMenu.close();
}
//clear menu
for (var i = 2; i < searchPopupMenu.count; i++) {
searchPopupMenu.removeItem(searchPopupMenu.takeItem(i));
}
}
onClosed: {
statusChatToolBar.searchButton.highlighted = false
searchPopupMenu.dismiss();
}
onSearchTextChanged: {
if (searchPopup.searchText !== "") {
searchPopup.loading = true;
searchModelSimTimer.start();
} else {
searchPopup.searchResults = [];
searchModelSimTimer.stop();
}
}
Timer {
id: searchModelSimTimer
interval: 500
onTriggered: {
if (searchPopup.searchText.startsWith("c")) {
searchPopup.searchResults = models.searchResultsA;
} else {
searchPopup.searchResults = models.searchResultsB;
}
searchPopup.loading = false;
}
}
}
StatusSearchLocationMenu {
id: searchPopupMenu
searchPopup: searchPopup
locatioModel: models.optionsModel
}
} }
rightPanel: Item { rightPanel: Item {
@ -654,7 +704,7 @@ Rectangle {
spacing: 4 spacing: 4
Repeater { Repeater {
model: demoProfileGeneralMenuItems model: models.demoProfileGeneralMenuItems
delegate: StatusNavigationListItem { delegate: StatusNavigationListItem {
title: model.title title: model.title
icon.name: model.icon icon.name: model.icon
@ -664,7 +714,7 @@ Rectangle {
StatusListSectionHeadline { text: "Settings" } StatusListSectionHeadline { text: "Settings" }
Repeater { Repeater {
model: demoProfileSettingsMenuItems model: models.demoProfileSettingsMenuItems
delegate: StatusNavigationListItem { delegate: StatusNavigationListItem {
title: model.title title: model.title
icon.name: model.icon icon.name: model.icon
@ -678,7 +728,7 @@ Rectangle {
} }
Repeater { Repeater {
model: demoProfileOtherMenuItems model: models.demoProfileOtherMenuItems
delegate: StatusNavigationListItem { delegate: StatusNavigationListItem {
title: model.title title: model.title
icon.name: model.icon icon.name: model.icon
@ -833,194 +883,7 @@ Rectangle {
} }
} }
ListModel { Models {
id: demoChatListItems id: models
ListElement {
chatId: "0"
name: "#status"
chatType: StatusChatListItem.Type.PublicChat
muted: false
unreadMessagesCount: 0
mentionsCount: 0
color: "blue"
}
ListElement {
chatId: "1"
name: "status-desktop"
chatType: StatusChatListItem.Type.PublicChat
muted: false
color: "red"
unreadMessagesCount: 1
mentionsCount: 1
}
ListElement {
chatId: "2"
name: "Amazing Funny Squirrel"
chatType: StatusChatListItem.Type.OneToOneChat
muted: false
color: "green"
identicon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAlklEQVR4nOzW0QmDQBAG4SSkl7SUQlJGCrElq9F3QdjjVhh/5nv3cFhY9vUIYQiNITSG0Bh
CExPynn1gWf9bx498P7/nzPcxEzGExhBdJGYihtAYQlO+tUZvqrPbqeudo5iJGEJjCE15a3VtodH3q2ImYgiNITTlTdG1nUZ5a92VITQxITFiJmIIjSE0htAYQrMHAAD//+wwFVpz+yqXAAAAAElFTkSuQmCC"
unreadMessagesCount: 0
}
ListElement {
chatId: "3"
name: "Black Ops"
chatType: StatusChatListItem.Type.GroupChat
muted: false
color: "purple"
unreadMessagesCount: 0
}
ListElement {
chatId: "4"
name: "Spectacular Growing Otter"
chatType: StatusChatListItem.Type.OneToOneChat
muted: true
color: "Orange"
unreadMessagesCount: 0
}
ListElement {
chatId: "5"
name: "channel-with-a-super-duper-long-name"
chatType: StatusChatListItem.Type.PublicChat
muted: false
color: "green"
unreadMessagesCount: 0
}
}
ListModel {
id: demoCommunityChatListItems
ListElement {
chatId: "0"
name: "general"
chatType: StatusChatListItem.Type.CommunityChat
muted: false
unreadMessagesCount: 0
color: "orange"
}
ListElement {
chatId: "1"
name: "random"
chatType: StatusChatListItem.Type.CommunityChat
muted: false
unreadMessagesCount: 0
color: "orange"
categoryId: "public"
}
ListElement {
chatId: "2"
name: "watercooler"
chatType: StatusChatListItem.Type.CommunityChat
muted: false
unreadMessagesCount: 0
color: "orange"
categoryId: "public"
}
ListElement {
chatId: "3"
name: "language-design"
chatType: StatusChatListItem.Type.CommunityChat
muted: false
unreadMessagesCount: 0
color: "orange"
categoryId: "dev"
}
}
ListModel {
id: demoCommunityCategoryItems
ListElement {
categoryId: "public"
name: "Public"
}
ListElement {
categoryId: "dev"
name: "Development"
}
}
ListModel {
id: demoProfileGeneralMenuItems
ListElement {
title: "My Profile"
icon: "profile"
}
ListElement {
title: "Contacts"
icon: "contact"
}
ListElement {
title: "ENS Usernames"
icon: "username"
}
}
ListModel {
id: demoProfileSettingsMenuItems
ListElement {
title: "Privacy & Security"
icon: "security"
}
ListElement {
title: "Appearance"
icon: "appearance"
}
ListElement {
title: "Browser"
icon: "browser"
}
ListElement {
title: "Sounds"
icon: "sound"
}
ListElement {
title: "Language"
icon: "language"
}
ListElement {
title: "Notifications"
icon: "notification"
}
ListElement {
title: "Sync settings"
icon: "mobile"
}
ListElement {
title: "Advanced"
icon: "settings"
}
}
ListModel {
id: demoProfileOtherMenuItems
ListElement {
title: "Need help?"
icon: "help"
}
ListElement {
title: "About"
icon: "info"
}
ListElement {
title: "Sign out & Quit"
icon: "logout"
}
} }
} }

View File

@ -295,6 +295,27 @@ CExPynn1gWf9bx498P7/nzPcxEzGExhBdJGYihtAYQlO+tUZvqrPbqeudo5iJGEJjCE15a3VtodH3q2I
type: StatusListItem.Type.Danger type: StatusListItem.Type.Danger
} }
StatusListItem {
title: "List Item with Badge"
subTitle: "Subtitle"
image.source: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAlklEQVR4nOzW0QmDQBAG4SSkl7SUQlJGCrElq9F3QdjjVhh/5nv3cFhY9vUIYQiNITSG0Bh
CExPynn1gWf9bx498P7/nzPcxEzGExhBdJGYihtAYQlO+tUZvqrPbqeudo5iJGEJjCE15a3VtodH3q2ImYgiNITTlTdG1nUZ5a92VITQxITFiJmIIjSE0htAYQrMHAAD//+wwFVpz+yqXAAAAAElFTkSuQmCC"
image.isIdenticon: true
badge.image.source: "https://pbs.twimg.com/profile_images/1369221718338895873/T_5fny6o_400x400.jpg"
badge.primaryText: "CryptoKitties"
badge.secondaryText: "#test"
}
StatusListItem {
title: "List Item with Badge 2"
subTitle: "Subtitle"
icon.isLetterIdenticon: true
badge.primaryText: "CryptoKitties"
badge.secondaryText: "#test"
badge.icon.color: "orange"
badge.icon.isLetterIdenticon: true
}
StatusDescriptionListItem { StatusDescriptionListItem {
title: "Title" title: "Title"
subTitle: "Subtitle" subTitle: "Subtitle"

309
sandbox/Models.qml Normal file
View File

@ -0,0 +1,309 @@
import QtQuick 2.14
import StatusQ.Components 0.1
QtObject {
property var demoChatListItems: ListModel {
id: demoChatListItems
ListElement {
chatId: "0"
name: "#status"
chatType: StatusChatListItem.Type.PublicChat
muted: false
unreadMessagesCount: 0
mentionsCount: 0
color: "blue"
}
ListElement {
chatId: "1"
name: "status-desktop"
chatType: StatusChatListItem.Type.PublicChat
muted: false
color: "red"
unreadMessagesCount: 1
mentionsCount: 1
}
ListElement {
chatId: "2"
name: "Amazing Funny Squirrel"
chatType: StatusChatListItem.Type.OneToOneChat
muted: false
color: "green"
identicon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAlklEQVR4nOzW0QmDQBAG4SSkl7SUQlJGCrElq9F3QdjjVhh/5nv3cFhY9vUIYQiNITSG0Bh
CExPynn1gWf9bx498P7/nzPcxEzGExhBdJGYihtAYQlO+tUZvqrPbqeudo5iJGEJjCE15a3VtodH3q2ImYgiNITTlTdG1nUZ5a92VITQxITFiJmIIjSE0htAYQrMHAAD//+wwFVpz+yqXAAAAAElFTkSuQmCC"
unreadMessagesCount: 0
}
ListElement {
chatId: "3"
name: "Black Ops"
chatType: StatusChatListItem.Type.GroupChat
muted: false
color: "purple"
unreadMessagesCount: 0
}
ListElement {
chatId: "4"
name: "Spectacular Growing Otter"
chatType: StatusChatListItem.Type.OneToOneChat
muted: true
color: "Orange"
unreadMessagesCount: 0
}
ListElement {
chatId: "5"
name: "channel-with-a-super-duper-long-name"
chatType: StatusChatListItem.Type.PublicChat
muted: false
color: "green"
unreadMessagesCount: 0
}
}
property var demoCommunityChatListItems: ListModel {
id: demoCommunityChatListItems
ListElement {
chatId: "0"
name: "general"
chatType: StatusChatListItem.Type.CommunityChat
muted: false
unreadMessagesCount: 0
color: "orange"
}
ListElement {
chatId: "1"
name: "random"
chatType: StatusChatListItem.Type.CommunityChat
muted: false
unreadMessagesCount: 0
color: "orange"
categoryId: "public"
}
ListElement {
chatId: "2"
name: "watercooler"
chatType: StatusChatListItem.Type.CommunityChat
muted: false
unreadMessagesCount: 0
color: "orange"
categoryId: "public"
}
ListElement {
chatId: "3"
name: "language-design"
chatType: StatusChatListItem.Type.CommunityChat
muted: false
unreadMessagesCount: 0
color: "orange"
categoryId: "dev"
}
}
property var demoCommunityCategoryItems: ListModel {
id: demoCommunityCategoryItems
ListElement {
categoryId: "public"
name: "Public"
}
ListElement {
categoryId: "dev"
name: "Development"
}
}
property var demoProfileGeneralMenuItems: ListModel {
id: demoProfileGeneralMenuItems
ListElement {
title: "My Profile"
icon: "profile"
}
ListElement {
title: "Contacts"
icon: "contact"
}
ListElement {
title: "ENS Usernames"
icon: "username"
}
}
property var demoProfileSettingsMenuItems: ListModel {
id: demoProfileSettingsMenuItems
ListElement {
title: "Privacy & Security"
icon: "security"
}
ListElement {
title: "Appearance"
icon: "appearance"
}
ListElement {
title: "Browser"
icon: "browser"
}
ListElement {
title: "Sounds"
icon: "sound"
}
ListElement {
title: "Language"
icon: "language"
}
ListElement {
title: "Notifications"
icon: "notification"
}
ListElement {
title: "Sync settings"
icon: "mobile"
}
ListElement {
title: "Advanced"
icon: "settings"
}
}
property var demoProfileOtherMenuItems: ListModel {
id: demoProfileOtherMenuItems
ListElement {
title: "Need help?"
icon: "help"
}
ListElement {
title: "About"
icon: "info"
}
ListElement {
title: "Sign out & Quit"
icon: "logout"
}
}
//dummy search popup models
property var searchResultsA: ListModel {
ListElement { name: "@Flea"; sectionName: "Messages"; time: "18:55 AM"; content: "lorem ipsum <font color='#4360DF'>@Nick</font> dolor sit amet";
badgeImage: "https://pbs.twimg.com/profile_images/1369221718338895873/T_5fny6o_400x400.jpg";
badgePrimaryText: "CryptoKities";
badgeSecondaryText: "";
badgeIdenticonColor: "";
isLetterIdenticon: false }
ListElement { name: "core"; sectionName: "Channels"; time: ""; content: ""; badgeImage: ""; badgePrimaryText: ""; badgeSecondaryText: ""; badgeIdenticonColor: ""; isLetterIdenticon: false }
ListElement { name: "communities-phase3"; sectionName: "Channels"; time: ""; content: ""; badgeImage: ""; badgePrimaryText: ""; badgeSecondaryText: ""; badgeIdenticonColor: ""; isLetterIdenticon: false }
ListElement { name: "core-ui"; sectionName: "Channels"; time: ""; content: ""; badgeImage: ""; badgePrimaryText: ""; badgeSecondaryText: ""; badgeIdenticonColor: ""; isLetterIdenticon: false }
ListElement { name: "desktop"; sectionName: "Channels"; time: ""; content: ""; badgeImage: ""; badgePrimaryText: ""; badgeSecondaryText: ""; badgeIdenticonColor: ""; isLetterIdenticon: false }
ListElement { name: "Crocodile Vanilla Bird"; sectionName: "Chat"; time: ""; content: ""; badgeImage: ""; badgePrimaryText: ""; badgeSecondaryText: ""; badgeIdenticonColor: ""; isLetterIdenticon: false }
ListElement { name: "carmen eth"; sectionName: "Chat"; time: ""; content: ""; badgeImage: ""; badgePrimaryText: ""; badgeSecondaryText: ""; badgeIdenticonColor: ""; isLetterIdenticon: false }
ListElement { name: "CryptoKitties"; sectionName: "Communities"; time: ""; content: ""; badgeImage: ""; badgePrimaryText: ""; badgeSecondaryText: ""; badgeIdenticonColor: ""; isLetterIdenticon: false }
ListElement { name: "MyCommunity"; sectionName: "Communities"; time: ""; content: ""; badgeImage: ""; badgePrimaryText: ""; badgeSecondaryText: ""; badgeIdenticonColor: ""; isLetterIdenticon: false }
ListElement { name: "Foo"; sectionName: "Communities"; time: ""; content: ""; badgeImage: ""; badgePrimaryText: ""; badgeSecondaryText: ""; badgeIdenticonColor: ""; isLetterIdenticon: false }
}
property var searchResultsB: ListModel {
ListElement { name: "@Ant"; sectionName: "Messages"; time: "11:43 AM"; content: "<font color='#4360DF'>@John</font>, lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum ";
badgeImage: "";
badgePrimaryText: "CryptoKities";
badgeSecondaryText: "#design";
badgeIdenticonColor: "pink"; isLetterIdenticon: true }
ListElement { name: "support"; sectionName: "Channels"; time: ""; content: ""; badgeImage: ""; badgePrimaryText: ""; badgeSecondaryText: ""; badgeIdenticonColor: ""; isLetterIdenticon: false }
ListElement { name: "desktop-ui"; sectionName: "Channels"; time: ""; content: ""; badgeImage: ""; badgePrimaryText: ""; badgeSecondaryText: ""; badgeIdenticonColor: ""; isLetterIdenticon: false }
ListElement { name: "climate-change"; sectionName: "Chat"; time: ""; content: ""; badgeImage: ""; badgePrimaryText: ""; badgeSecondaryText: ""; badgeIdenticonColor: ""; isLetterIdenticon: false }
ListElement { name: "food"; sectionName: "Chat"; time: ""; content: ""; badgeImage: ""; badgePrimaryText: ""; badgeSecondaryText: ""; badgeIdenticonColor: "pink"; isLetterIdenticon: true }
ListElement { name: "CryptoKitties"; sectionName: "Communities"; time: ""; content: ""; badgeImage: ""; badgePrimaryText: ""; badgeSecondaryText: ""; badgeIdenticonColor: ""; isLetterIdenticon: false }
ListElement { name: "CryptoRangers"; sectionName: "Communities"; time: ""; content: ""; badgeImage: ""; badgePrimaryText: ""; badgeSecondaryText: ""; badgeIdenticonColor: ""; isLetterIdenticon: false }
ListElement { name: "Foo"; sectionName: "Communities"; time: ""; content: ""; badgeImage: ""; badgePrimaryText: ""; badgeSecondaryText: ""; badgeIdenticonColor: "orange"; isLetterIdenticon: true }
}
property ListModel optionsModel: ListModel {
ListElement {
title: "Item with icon";
imageSource: ""
iconName: "chat"
iconColor: ""
isIdenticon: false
subItems: [
ListElement {
text: "Profile image item"
imageSource: "https://pbs.twimg.com/profile_images/1369221718338895873/T_5fny6o_400x400.jpg"
iconName: ""
iconColor: ""
isIdenticon: false
},
ListElement {
text: "identicon item"
imageSource: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAlklEQVR4nOzW0QmDQBAG4SSkl7SUQlJGCrElq9F3QdjjVhh/5nv3cFhY9vUIYQiNITSG0BhCExPynn1gWf9bx498P7/nzPcxEzGExhBdJGYihtAYQlO+tUZvqrPbqeudo5iJGEJjCE15a3VtodH3q2ImYgiNITTlTdG1nUZ5a92VITQxITFiJmIIjSE0htAYQrMHAAD//+wwFVpz+yqXAAAAAElFTkSuQmCC"
iconName: ""
iconColor: ""
isIdenticon: true
}]}
ListElement {
title: "Community item";
imageSource: "https://pbs.twimg.com/profile_images/1369221718338895873/T_5fny6o_400x400.jpg"
iconName: ""
iconColor: ""
isIdenticon: false
subItems: [
ListElement {
text: "welcome"
imageSource: ""
iconName: "channel"
iconColor: ""
isIdenticon: false
},
ListElement {
text: "support"
imageSource: ""
iconName: "channel"
iconColor: ""
isIdenticon: false
},
ListElement {
text: "news"
imageSource: ""
iconName: "channel"
iconColor: ""
isIdenticon: false
}]}
ListElement {
title: "Other";
imageSource: "";
iconName: "info"
iconColor: ""
isIdenticon: false
subItems: [
ListElement {
text: "news"
imageSource: ""
iconName: "channel"
iconColor: ""
isIdenticon: false
}]}
ListElement {
title: "Letter identicon";
imageSource: "";
iconName: ""
iconColor: "red"
isIdenticon: false
subItems: [
ListElement {
text: "news"
imageSource: ""
iconName: "channel"
iconColor: ""
isIdenticon: false
}]}
}
}

View File

@ -46,7 +46,7 @@ GridLayout {
StatusPopupMenu { StatusPopupMenu {
id: complexMenu id: complexMenu
subMenuItemIcons: ['info'] subMenuItemIcons: [{ icon: 'info' }]
StatusMenuItem { StatusMenuItem {
text: "One" text: "One"
@ -82,7 +82,7 @@ GridLayout {
id: customMenu id: customMenu
subMenuItemIcons: [ subMenuItemIcons: [
"chat", { icon: "chat" },
{ {
source: "https://pbs.twimg.com/profile_images/1369221718338895873/T_5fny6o_400x400.jpg" source: "https://pbs.twimg.com/profile_images/1369221718338895873/T_5fny6o_400x400.jpg"
}, },

View File

@ -14,7 +14,9 @@ Rectangle {
radius: width / 2 radius: width / 2
StatusBaseText { StatusBaseText {
text: (statusLetterIdenticon.name.charAt(0) == "#" ? statusLetterIdenticon.name.charAt(1) : statusLetterIdenticon.name.charAt(0)).toUpperCase() text: ((statusLetterIdenticon.name.charAt(0) === "#")
|| (statusLetterIdenticon.name.charAt(0) === "@") ?
statusLetterIdenticon.name.charAt(1) : statusLetterIdenticon.name.charAt(0)).toUpperCase()
font.weight: Font.Bold font.weight: Font.Bold
font.pixelSize: statusLetterIdenticon.letterSize font.pixelSize: statusLetterIdenticon.letterSize
color: Qt.rgba(255, 255, 255, 0.7) color: Qt.rgba(255, 255, 255, 0.7)

View File

@ -1,4 +1,6 @@
import QtQuick 2.13 import QtQuick 2.13
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import StatusQ.Core 0.1 import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1 import StatusQ.Core.Theme 0.1
import StatusQ.Components 0.1 import StatusQ.Components 0.1
@ -33,8 +35,11 @@ Rectangle {
radius: 8 radius: 8
property string title: "" property string title: ""
property string titleAsideText: ""
property string subTitle: "" property string subTitle: ""
property string tertiaryTitle: "" property string tertiaryTitle: ""
property alias badge: statusListItemBadge
property real leftPadding: 16 property real leftPadding: 16
property real rightPadding: 16 property real rightPadding: 16
property bool enabled: true property bool enabled: true
@ -107,6 +112,7 @@ Rectangle {
} }
return !!statusListItem.icon.name ? statusRoundedIcon : statusRoundedImage return !!statusListItem.icon.name ? statusRoundedIcon : statusRoundedImage
} }
active: statusListItem.icon.isLetterIdenticon || active: statusListItem.icon.isLetterIdenticon ||
!!statusListItem.icon.name || !!statusListItem.icon.name ||
!!statusListItem.image.source.toString() !!statusListItem.image.source.toString()
@ -158,15 +164,15 @@ Rectangle {
anchors.leftMargin: statusListItem.leftPadding anchors.leftMargin: statusListItem.leftPadding
anchors.rightMargin: statusListItem.rightPadding anchors.rightMargin: statusListItem.rightPadding
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
height: statusListItemTitle.height + height: childrenRect.height
(statusListItemSubTitle.visible ? statusListItemSubTitle.height : 0) +
(statusListItemTertiaryTitle.visible ? statusListItemTertiaryTitle.height : 0)
StatusBaseText { StatusBaseText {
id: statusListItemTitle id: statusListItemTitle
text: statusListItem.title text: statusListItem.title
width: parent.width width: contentWidth < (parent.width - statusListItemTitleAsideText.contentWidth) ?
contentWidth : (parent.width - statusListItemTitleAsideText.contentWidth)
font.pixelSize: 15 font.pixelSize: 15
height: visible ? contentHeight : 0
wrapMode: Text.WrapAtWordBoundaryOrAnywhere wrapMode: Text.WrapAtWordBoundaryOrAnywhere
color: { color: {
if (!statusListItem.enabled) { if (!statusListItem.enabled) {
@ -183,6 +189,17 @@ Rectangle {
} }
} }
StatusBaseText {
id: statusListItemTitleAsideText
anchors.left: statusListItemTitle.right
anchors.leftMargin: 4
anchors.verticalCenter: statusListItemTitle.verticalCenter
text: statusListItem.titleAsideText
font.pixelSize: 10
color: Theme.palette.baseColor1
visible: !!statusListItem.titleAsideText
}
StatusBaseText { StatusBaseText {
id: statusListItemSubTitle id: statusListItemSubTitle
anchors.top: statusListItemTitle.bottom anchors.top: statusListItemTitle.bottom
@ -190,6 +207,7 @@ Rectangle {
text: statusListItem.subTitle text: statusListItem.subTitle
font.pixelSize: 15 font.pixelSize: 15
color: !statusListItem.enabled || !statusListItem.tertiaryTitle ? Theme.palette.baseColor1 : Theme.palette.directColor1 color: !statusListItem.enabled || !statusListItem.tertiaryTitle ? Theme.palette.baseColor1 : Theme.palette.directColor1
height: visible ? contentHeight : 0
visible: !!statusListItem.subTitle visible: !!statusListItem.subTitle
wrapMode: Text.WrapAtWordBoundaryOrAnywhere wrapMode: Text.WrapAtWordBoundaryOrAnywhere
} }
@ -198,12 +216,20 @@ Rectangle {
id: statusListItemTertiaryTitle id: statusListItemTertiaryTitle
anchors.top: statusListItemSubTitle.bottom anchors.top: statusListItemSubTitle.bottom
width: parent.width width: parent.width
height: visible ? contentHeight : 0
text: statusListItem.tertiaryTitle text: statusListItem.tertiaryTitle
color: Theme.palette.baseColor1 color: Theme.palette.baseColor1
font.pixelSize: 13 font.pixelSize: 13
visible: !!statusListItem.tertiaryTitle visible: !!statusListItem.tertiaryTitle
wrapMode: Text.WrapAtWordBoundaryOrAnywhere wrapMode: Text.WrapAtWordBoundaryOrAnywhere
} }
StatusListItemBadge {
id: statusListItemBadge
anchors.top: statusListItemTertiaryTitle.bottom
width: contentItem.width
implicitHeight: visible ? 22 : 0
}
} }
StatusBaseText { StatusBaseText {

View File

@ -0,0 +1,80 @@
import QtQuick 2.13
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1
Control {
id: root
implicitWidth: contentItem.width
implicitHeight: visible ? 22 : 0
visible: !!root.primaryText
property string primaryText: ""
property string secondaryText: ""
property StatusImageSettings image: StatusImageSettings {
height: 16
width: 16
isIdenticon: false
}
property StatusIconSettings icon: StatusIconSettings {
height: 16
width: 16
isLetterIdenticon: false
background: StatusIconBackgroundSettings {}
color: "transparent"
}
background: Rectangle {
anchors.fill: parent
color: "transparent"
radius: 11
border.color: Theme.palette.directColor7
}
contentItem: Item {
id: contentItem
width: (contentItemRow.width + 10)
height: parent.height
RowLayout {
id: contentItemRow
anchors.centerIn: parent
anchors.horizontalCenterOffset: -spacing
spacing: 2
StatusRoundedImage {
implicitWidth: root.image.width
implicitHeight: root.image.height
visible: !root.icon.isLetterIdenticon
image.source: root.image.source
border.color: Theme.palette.baseColor1
border.width: root.image.isIdenticon ? 1 : 0
}
StatusLetterIdenticon {
implicitWidth: root.icon.width
implicitHeight: root.icon.width
letterSize: 11
visible: root.icon.isLetterIdenticon
color: root.icon.color
name: root.primaryText
}
StatusBaseText {
font.weight: Font.Medium
color: Theme.palette.baseColor1
text: root.primaryText
}
StatusIcon {
Layout.alignment: Qt.AlignVCenter
visible: !!root.secondaryText
color: Theme.palette.baseColor1
icon: "next"
}
StatusBaseText {
font.weight: Font.Medium
color: Theme.palette.baseColor1
visible: !!root.secondaryText
text: root.secondaryText
}
}
}
}

View File

@ -19,3 +19,4 @@ StatusNavigationPanelHeadline 0.1 StatusNavigationPanelHeadline.qml
StatusRoundIcon 0.1 StatusRoundIcon.qml StatusRoundIcon 0.1 StatusRoundIcon.qml
StatusRoundedImage 0.1 StatusRoundedImage.qml StatusRoundedImage 0.1 StatusRoundedImage.qml
StatusMacWindowButtons 0.1 StatusMacWindowButtons.qml StatusMacWindowButtons 0.1 StatusMacWindowButtons.qml
StatusListItemBadge 0.1 StatusListItemBadge.qml

View File

@ -179,8 +179,8 @@ Item {
StatusFlatRoundButton { StatusFlatRoundButton {
id: clearButtton id: clearButtton
visible: edit.text.length != 0 && visible: edit.text.length != 0 &&
statusBaseInput.clearable && statusBaseInput.clearable &&
!statusBaseInput.multiline && !statusBaseInput.multiline &&
edit.activeFocus edit.activeFocus
anchors.right: parent.right anchors.right: parent.right

View File

@ -4,9 +4,8 @@ import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1 import StatusQ.Core.Theme 0.1
import StatusQ.Controls 0.1 import StatusQ.Controls 0.1
Rectangle { Item {
id: root id: root
implicitWidth: 480 implicitWidth: 480
height: (label.visible ? height: (label.visible ?
label.anchors.topMargin + label.anchors.topMargin +
@ -22,7 +21,6 @@ Rectangle {
errorMessage.height : errorMessage.height :
0) + 8 0) + 8
color: "transparent"
property alias input: statusBaseInput property alias input: statusBaseInput
property string label: "" property string label: ""
property int charLimit: 0 property int charLimit: 0

View File

@ -19,6 +19,8 @@ QC.Popup {
property alias contentComponent: contentLoader.item property alias contentComponent: contentLoader.item
property alias rightButtons: footerImpl.rightButtons property alias rightButtons: footerImpl.rightButtons
property alias leftButtons: footerImpl.leftButtons property alias leftButtons: footerImpl.leftButtons
property bool showHeader: true
property bool showFooter: true
signal editButtonClicked() signal editButtonClicked()
@ -46,8 +48,9 @@ QC.Popup {
width: parent.width width: parent.width
Spares.StatusModalHeader { Spares.StatusModalHeader {
id: headerImpl id: headerImpl
width: 480 width: visible ? parent.width : 0
visible: statusModal.showHeader
title: header.title title: header.title
subTitle: header.subTitle subTitle: header.subTitle
image: header.image image: header.image
@ -59,14 +62,15 @@ QC.Popup {
Loader { Loader {
id: contentLoader id: contentLoader
width: parent.width
active: true active: true
anchors.horizontalCenter: parent.horizontalCenter
sourceComponent: statusModal.content sourceComponent: statusModal.content
} }
Spares.StatusModalFooter { Spares.StatusModalFooter {
id: footerImpl id: footerImpl
width: 480 width: visible ? parent.width : 0
visible: statusModal.showFooter
} }
} }
} }

View File

@ -10,16 +10,18 @@ import StatusQ.Popups 0.1
Menu { Menu {
id: statusPopupMenu id: statusPopupMenu
closePolicy: Popup.CloseOnReleaseOutsideParent | Popup.CloseOnEscape
closePolicy: Popup.CloseOnReleaseOutside | Popup.CloseOnEscape
topPadding: 8 topPadding: 8
bottomPadding: 8 bottomPadding: 8
property int menuItemCount: 0 property int menuItemCount: 0
property var subMenuItemIcons: [] property var subMenuItemIcons: []
property var openHandler property var openHandler
property var closeHandler property var closeHandler
signal menuItemClicked(int menuIndex)
onOpened: { onOpened: {
if (typeof openHandler === "function") { if (typeof openHandler === "function") {
openHandler() openHandler()
@ -34,19 +36,21 @@ Menu {
delegate: MenuItem { delegate: MenuItem {
id: statusPopupMenuItem id: statusPopupMenuItem
implicitWidth: parent ? parent.width : 0
implicitHeight: action.enabled ? 38 : 0 implicitHeight: action.enabled ? 38 : 0
property int subMenuIndex property int subMenuIndex
Component.onCompleted: { Component.onCompleted: {
if (subMenu) { if (!!subMenu) {
subMenuIndex = statusPopupMenu.menuItemCount subMenuIndex = statusPopupMenu.menuItemCount
statusPopupMenu.menuItemCount += 1 statusPopupMenu.menuItemCount += 1
} }
} }
action: StatusMenuItem {} action: StatusMenuItem {
onTriggered: { statusPopupMenu.menuItemClicked(statusPopupMenuItem.subMenuIndex); }
}
Component { Component {
id: indicatorComponent id: indicatorComponent
@ -63,12 +67,17 @@ Menu {
} }
rotation: statusPopupMenuItem.action.iconRotation rotation: statusPopupMenuItem.action.iconRotation
icon: { icon: {
if (statusPopupMenuItem.subMenu) { if (statusPopupMenuItem.subMenu && !!statusPopupMenu.subMenuItemIcons[statusPopupMenuItem.subMenuIndex] &&
return statusPopupMenu.subMenuItemIcons[statusPopupMenuItem.subMenuIndex] statusPopupMenu.subMenuItemIcons[statusPopupMenuItem.subMenuIndex].icon.toString() !== "") {
return statusPopupMenu.subMenuItemIcons[statusPopupMenuItem.subMenuIndex].icon;
} else if (!!statusPopupMenuItem.action && statusPopupMenuItem.action.icon.name !== "") {
return statusPopupMenuItem.action.icon.name;
} else if (statusPopupMenuItem.action.iconSettings.name !== "") {
return statusPopupMenuItem.action.iconSettings.name;
} else {
return "";
} }
return statusPopupMenuItem.action.icon.name || }
statusPopupMenuItem.action.iconSettings.name
}
color: { color: {
let c = statusPopupMenuItem.action.iconSettings.color || let c = statusPopupMenuItem.action.iconSettings.color ||
statusPopupMenuItem.action.icon.color statusPopupMenuItem.action.icon.color
@ -195,7 +204,7 @@ Menu {
background: Rectangle { background: Rectangle {
color: { color: {
if (hovered) { if (statusPopupMenuItem.hovered) {
return statusPopupMenuItem.action.type === StatusMenuItem.Type.Danger ? Theme.palette.dangerColor3 : Theme.palette.statusPopupMenu.hoverBackgroundColor return statusPopupMenuItem.action.type === StatusMenuItem.Type.Danger ? Theme.palette.dangerColor3 : Theme.palette.statusPopupMenu.hoverBackgroundColor
} }
return "transparent" return "transparent"
@ -204,9 +213,8 @@ Menu {
MouseArea { MouseArea {
id: sensor id: sensor
anchors.fill: parent anchors.fill: parent
cursorShape: Qt.PointingHandCursor cursorShape: Qt.PointingHandCursor
hoverEnabled: statusPopupMenuItem.action.enabled hoverEnabled: statusPopupMenuItem.action.enabled
onPressed: mouse.accepted = false onPressed: mouse.accepted = false
} }

View File

@ -0,0 +1,144 @@
import QtQuick 2.12
import QtQuick.Controls 2.14
import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1
import StatusQ.Popups 0.1
StatusPopupMenu {
id: root
property var searchPopup
property var locatioModel
signal subMenuClicked()
signal subMenuItemClicked()
signal anywhereItemClicked()
signal menuItemNoSubMenuClicked()
StatusMenuItem {
text: "Anywhere"
onTriggered: {
searchPopup.resetSelectionBadge();
searchPopup.searchSelectionButton.primaryText = text;
root.anywhereItemClicked();
}
}
StatusMenuSeparator { }
//Dummy item to keep seperator in right position
MenuItem { implicitHeight: 0.00001 }
Instantiator {
model: root.locatioModel
delegate: Loader {
sourceComponent: (!!model.subItems && model.subItems.count > 0) ? subMenus : subMenuItemComponent
onLoaded: {
if (!!model.subItems && model.subItems.count > 0) {
item.title = model.title;
item.subItemsModel = model.subItems;
item.parentIconName = model.iconName;
item.parentImageSource = model.imageSource;
item.parentIdenticonColor = !!model.iconColor ? model.iconColor : Theme.palette.primaryColor1;
item.parentIsIdenticon = model.isIdenticon;
root.subMenuItemIcons.push({
source: model.imageSource,
icon: model.iconName,
isIdenticon: model.isIdenticon,
color: model.iconColor,
isLetterIdenticon: !model.imageSource && !model.iconName
});
root.insertMenu(index+2, item);
} else {
item.text = model.title;
item.iconSettings.name = model.iconName;
item.iconSettings.color = model.iconColor;
item.iconSettings.isLetterIdenticon = !model.imageSource && !model.iconName
item.image.source = model.imageSource;
item.image.isIdenticon = model.isIdenticon;
root.insertItem(index+2, item);
}
}
}
onObjectRemoved: { root.removeItem(root.takeItem(index+2)); }
}
Component {
id: subMenuItemComponent
StatusSearchPopupMenuItem {
onClicked: {
searchPopup.resetSelectionBadge()
searchPopup.searchSelectionButton.primaryText = text;
searchPopup.searchSelectionButton.image.source = image.source;
searchPopup.searchSelectionButton.image.isIdenticon = image.isIdenticon;
searchPopup.searchSelectionButton.iconSettings.name = iconSettings.name;
searchPopup.searchSelectionButton.iconSettings.color = !!iconSettings.color ? iconSettings.color : Theme.palette.primaryColor1
searchPopup.searchSelectionButton.iconSettings.isLetterIdenticon = !iconSettings.name && !image.source
root.menuItemNoSubMenuClicked();
}
}
}
Component {
id: subMenus
StatusPopupMenu {
id: menu
property var subItemsModel
property string parentIconName
property string parentImageSource
property string parentIdenticonColor
property string parentIsIdenticon
Repeater {
id: menuLoader
model: menu.subItemsModel
property string parentTitleText: menu.title
property string parentIconName: menu.parentIconName
property string parentImageSource: menu.parentImageSource
property string parentIdenticonColor: menu.parentIdenticonColor
property string parentIsIdenticon: menu.parentIsIdenticon
Loader {
id: subMenuLoader
sourceComponent: StatusSearchPopupMenuItem {
text: model.text
image.source: model.imageSource
iconSettings.name: model.iconName
iconSettings.color: model.iconColor
image.isIdenticon: model.isIdenticon
onTriggered: {
searchPopup.resetSelectionBadge();
if (menuLoader.parentTitleText === "Chat") {
searchPopup.searchSelectionButton.primaryText = model.text;
searchPopup.searchSelectionButton.image.source = model.imageSource;
searchPopup.searchSelectionButton.image.isIdenticon = model.isIdenticon;
searchPopup.searchSelectionButton.iconSettings.name = model.iconName;
searchPopup.searchSelectionButton.iconSettings.color = !!model.iconColor ? model.iconColor : Theme.palette.primaryColor1;
searchPopup.searchSelectionButton.iconSettings.isLetterIdenticon = !model.iconName && !model.imageSource
} else {
searchPopup.searchSelectionButton.primaryText = menuLoader.parentTitleText;
searchPopup.searchSelectionButton.secondaryText = model.text;
searchPopup.searchSelectionButton.image.source = menuLoader.parentImageSource;
searchPopup.searchSelectionButton.image.isIdenticon = menuLoader.parentIsIdenticon;
searchPopup.searchSelectionButton.iconSettings.name = menuLoader.parentIconName;
searchPopup.searchSelectionButton.iconSettings.color = !!menuLoader.parentIdenticonColor ? menuLoader.parentIdenticonColor : Theme.palette.primaryColor1;
searchPopup.searchSelectionButton.iconSettings.isLetterIdenticon = !menuLoader.parentIconName && !menuLoader.parentImageSource
}
root.subMenuItemClicked();
root.dismiss();
}
}
}
}
}
}
onMenuItemClicked: {
searchPopup.resetSelectionBadge();
let menuItem = root.menuAt(root.currentIndex)
searchPopup.searchSelectionButton.primaryText = menuItem.title;
searchPopup.searchSelectionButton.image.source = menuItem.parentImageSource;
searchPopup.searchSelectionButton.image.isIdenticon = menuItem.parentIsIdenticon;
searchPopup.searchSelectionButton.iconSettings.name = menuItem.parentIconName;
searchPopup.searchSelectionButton.iconSettings.color = menuItem.parentIdenticonColor;
searchPopup.searchSelectionButton.iconSettings.isLetterIdenticon = !menuItem.parentIconName && !menuItem.parentImageSource
root.subMenuClicked();
//TODO fix error "QML StatusPopupMenu: cannot find any window to open popup in."
root.dismiss();
}
}

View File

@ -0,0 +1,315 @@
import QtQuick 2.14
import QtQuick.Controls 2.14
import QtQuick.Layouts 1.12
import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1
import StatusQ.Controls 0.1
import StatusQ.Components 0.1
import StatusQ.Popups 0.1
StatusModal {
id: root
width: 700
height: (!!searchResults && (searchResults.count >= 0) && (searchText !== "")) ? (((searchResults.count < 5)) ? 560 : 770) : 142 //970
anchors.centerIn: parent
showHeader: false
showFooter: false
property string searchText: contentComponent.searchText
property string noResultsLabel: "No results"
property bool loading
property Menu searchOptionsPopupMenu: Menu { }
property var searchResults: [ ]
property var searchSelectionButton
function resetSelectionBadge() {
searchSelectionButton.iconSettings.name = ""
searchSelectionButton.iconSettings.isLetterIdenticon = false
searchSelectionButton.iconSettings.color = "transparent"
searchSelectionButton.image.source = ""
searchSelectionButton.image.isIdenticon = false
searchSelectionButton.primaryText = qsTr("Anywhere");
searchSelectionButton.secondaryText = "";
}
content: Item {
width: parent.width
height: root.height
property alias searchText: inputText.text
ColumnLayout {
id: contentItemColumn
anchors.fill: parent
spacing: 0
Item {
Layout.fillWidth: true
Layout.preferredHeight: 63
StatusIcon {
id: statusIcon
width: 40
height: 40
anchors.left: parent.left
anchors.leftMargin: 12
anchors.verticalCenter: parent.verticalCenter
icon: "search"
color: Theme.palette.baseColor1
}
TextEdit {
id: inputText
anchors.left: statusIcon.right
anchors.leftMargin: 15
anchors.right: parent.right
anchors.rightMargin: 8
anchors.verticalCenter: parent.verticalCenter
focus: true
font.pixelSize: 28
font.family: Theme.palette.baseFont.name
color: Theme.palette.directColor1
}
}
StatusMenuSeparator {
topPadding: 0
Layout.fillWidth: true
}
Item {
Layout.preferredWidth: parent.width
Layout.preferredHeight: 58
Button {
id: searchOptionsMenuButton
Component.onCompleted: {
root.searchSelectionButton = searchOptionsMenuButton
}
property string prefixText: "In"
property string primaryText: ""
property string secondaryText: ""
property StatusIconSettings iconSettings: StatusIconSettings {
name: ""
isLetterIdenticon: false
}
property StatusImageSettings image: StatusImageSettings {
source: ""
isIdenticon: false
}
anchors.left: parent.left
anchors.leftMargin: 16
anchors.verticalCenter: parent.verticalCenter
implicitWidth: (contentItemRowLayout.width + 24)
implicitHeight: 32
background: Rectangle {
anchors.fill: parent
color: Theme.palette.baseColor2
radius: 8
}
contentItem: Item {
anchors.fill: parent
MouseArea {
id: sensor
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: root.searchOptionsPopupMenu.popup();
RowLayout {
id: contentItemRowLayout
anchors.centerIn: parent
spacing: 2
StatusBaseText {
color: Theme.palette.directColor1
text: searchOptionsMenuButton.prefixText + ": "
font.weight: Font.Medium
}
Loader {
Layout.preferredWidth: active ? 16 : 0
Layout.preferredHeight: 16
active: searchOptionsMenuButton.iconSettings.name ||
searchOptionsMenuButton.iconSettings.isLetterIdenticon ||
!!searchOptionsMenuButton.image.source.toString()
sourceComponent: {
if (!!searchOptionsMenuButton.image.source.toString()) {
return statusRoundedImageCmp
}
if (!!searchOptionsMenuButton.iconSettings.isLetterIdenticon || !searchOptionsMenuButton.iconSettings.name) {
return statusLetterIdenticonCmp
}
return statusIconCmp
}
}
Component {
id: statusIconCmp
StatusIcon {
width: 16
icon: searchOptionsMenuButton.iconSettings.name
color: searchOptionsMenuButton.iconSettings.color
}
}
Component {
id: statusRoundedImageCmp
Item {
width: 16
height: 16
StatusRoundedImage {
id: statusRoundedImage
implicitWidth: parent.width
implicitHeight: parent.height
image.source: searchOptionsMenuButton.image.source
color: searchOptionsMenuButton.image.isIdenticon ?
Theme.palette.statusRoundedImage.backgroundColor :
"transparent"
border.width: searchOptionsMenuButton.image.isIdenticon ? 1 : 0
border.color: Theme.palette.directColor7
}
Loader {
sourceComponent: statusLetterIdenticonCmp
active: statusRoundedImage.image.status === Image.Error
}
}
}
Component {
id: statusLetterIdenticonCmp
StatusLetterIdenticon {
implicitWidth: 16
implicitHeight: 16
letterSize: 11
color: searchOptionsMenuButton.iconSettings.color
name: searchOptionsMenuButton.primaryText
}
}
StatusBaseText {
color: Theme.palette.directColor1
text: searchOptionsMenuButton.primaryText
font.weight: Font.Medium
}
StatusIcon {
Layout.preferredWidth: 14.5
Layout.preferredHeight: 17.5
Layout.alignment: Qt.AlignVCenter
visible: !!searchOptionsMenuButton.secondaryText
color: Theme.palette.baseColor1
icon: "next"
}
StatusBaseText {
color: Theme.palette.directColor1
visible: !!searchOptionsMenuButton.secondaryText
text: "# " + searchOptionsMenuButton.secondaryText
font.weight: Font.Medium
}
StatusIcon {
Layout.preferredWidth: 17.5
Layout.preferredHeight: 14.5
Layout.alignment: Qt.AlignVCenter
icon: "chevron-down"
color: Theme.palette.directColor1
}
}
}
}
}
StatusFlatRoundButton {
id: closeButton
width: 32
height: 32
anchors.left: searchOptionsMenuButton.right
anchors.leftMargin: 4
anchors.verticalCenter: parent.verticalCenter
opacity: (searchOptionsMenuButton.primaryText === qsTr("Anywhere")) ? 0.0 : 1.0
visible: (opacity > 0.1)
type: StatusFlatRoundButton.Type.Secondary
icon.name: "close"
icon.color: Theme.palette.directColor1
icon.width: 20
icon.height: 20
onClicked: { root.resetSelectionBadge(); }
}
}
StatusMenuSeparator { Layout.fillWidth: true; visible: (root.height > 142) }
Item {
Layout.fillWidth: true
Layout.fillHeight: true
clip: true
ListView {
id: view
anchors.fill: parent
anchors {
leftMargin: 0
rightMargin: 0
bottomMargin: 67
}
visible: (!root.loading && (count > 0))
model: root.searchResults
ScrollBar.vertical: ScrollBar { }
delegate: StatusListItem {
width: view.width
title: model.name
statusListItemTitle.color: model.name.startsWith("@") ? Theme.palette.primaryColor1 : Theme.palette.directColor1
subTitle: model.content
radius: 0
statusListItemSubTitle.height: model.content !== "" ? 20 : 0
statusListItemSubTitle.elide: Text.ElideRight
statusListItemSubTitle.color: Theme.palette.black
icon.isLetterIdenticon: (model.badgeImage === "")
titleAsideText: model.time
image.source: model.badgeImage
badge.primaryText: model.badgePrimaryText
badge.secondaryText: model.badgeSecondaryText
badge.image.source: model.badgeImage
badge.icon.isLetterIdenticon: model.isLetterIdenticon
badge.icon.color: model.badgeIdenticonColor
}
section.property: "sectionName"
section.criteria: ViewSection.FullString
section.delegate: Item {
height: 34
width: view.width
StatusBaseText {
font.pixelSize: 15
color: Theme.palette.baseColor1
text: section
anchors.left: parent.left
anchors.leftMargin: 16
anchors.bottom: parent.bottom
anchors.bottomMargin: 4
}
}
}
StatusLoadingIndicator {
anchors.centerIn: parent
visible: root.loading
color: Theme.palette.primaryColor1
width: 24
height: 24
}
StatusBaseText {
anchors.centerIn: parent
text: root.noResultsLabel
color: Theme.palette.baseColor1
font.pixelSize: 13
visible: ((inputText.text !== "") && (view.count === 0) && !root.loading)
}
}
}
}
onClosed: {
root.resetSelectionBadge();
root.loading = false;
contentComponent.searchText = "";
}
}

View File

@ -0,0 +1,77 @@
import QtQuick 2.14
import QtQuick.Controls 2.14
import QtQuick.Layouts 1.12
import StatusQ.Components 0.1
import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1
MenuItem {
id: root
implicitHeight: 38
property StatusImageSettings image: StatusImageSettings {
height: 16
width: 16
isIdenticon: false
}
property StatusIconSettings iconSettings: StatusIconSettings {
height: 16
width: 16
isLetterIdenticon: (root.image.source.toString() === ""
&& root.iconSettings.name.toString() === "")
background: StatusIconBackgroundSettings {}
color: "transparent"
}
background: Rectangle {
color: root.hovered ? Theme.palette.statusPopupMenu.hoverBackgroundColor : "transparent"
}
contentItem: RowLayout {
anchors.left: parent.left
anchors.leftMargin: 12
StatusIcon {
Layout.preferredWidth: visible ? root.iconSettings.width : 0
Layout.preferredHeight: visible ? root.iconSettings.height : 0
Layout.alignment: Qt.AlignVCenter
visible: !!root.iconSettings.name && !root.image.source.toString()
icon: root.iconSettings.name
color: root.iconSettings.color
}
StatusRoundedImage {
Layout.preferredWidth: visible ? root.image.width : 0
Layout.preferredHeight: visible ? root.image.height : 0
Layout.alignment: Qt.AlignVCenter
visible: root.image.source.toString() !== ""
image.source: root.image.source
border.width: root.image.isIdenticon ? 1 : 0
border.color: Theme.palette.directColor7
}
StatusLetterIdenticon {
Layout.preferredWidth: visible ? root.iconSettings.width : 0
Layout.preferredHeight: visible ? root.iconSettings.height : 0
visible: root.iconSettings.isLetterIdenticon && !root.iconSettings.name && !root.image.source.toString()
color: root.iconSettings.color
name: root.text
letterSize: 11
}
StatusBaseText {
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
text: root.text
color: Theme.palette.directColor1
font.pixelSize: 13
elide: Text.ElideRight
}
Item {
Layout.fillWidth: true
}
}
MouseArea {
id: sensor
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onPressed: mouse.accepted = false
}
}

View File

@ -5,4 +5,7 @@ StatusPopupMenu 0.1 StatusPopupMenu.qml
StatusMenuItem 0.1 StatusMenuItem.qml StatusMenuItem 0.1 StatusMenuItem.qml
StatusMenuHeadline 0.1 StatusMenuHeadline.qml StatusMenuHeadline 0.1 StatusMenuHeadline.qml
StatusModal 0.1 StatusModal.qml StatusModal 0.1 StatusModal.qml
StatusSearchPopup 0.1 StatusSearchPopup.qml
StatusModalDivider 0.1 StatusModalDivider.qml StatusModalDivider 0.1 StatusModalDivider.qml
StatusSearchPopupMenuItem 0.1 StatusSearchPopupMenuItem.qml
StatusSearchLocationMenu 0.1 StatusSearchLocationMenu.qml

View File

@ -30,7 +30,7 @@ Rectangle {
} }
} }
implicitHeight: rootLayout.implicitHeight + 30 implicitHeight: visible ? rootLayout.implicitHeight + 30 : 0
RowLayout { RowLayout {
id: rootLayout id: rootLayout

View File

@ -20,7 +20,7 @@ Rectangle {
signal editButtonClicked signal editButtonClicked
signal close signal close
implicitHeight: Math.max(closeButton.height, imageWithTitle.implicitHeight) + 32 implicitHeight: visible? Math.max(closeButton.height, imageWithTitle.implicitHeight) + 32 : 0
implicitWidth: 480 implicitWidth: 480
radius: 16 radius: 16

View File

@ -250,5 +250,9 @@
<file>src/StatusQ/Popups/statusModal/StatusModalHeader.qml</file> <file>src/StatusQ/Popups/statusModal/StatusModalHeader.qml</file>
<file>src/StatusQ/Popups/StatusModal.qml</file> <file>src/StatusQ/Popups/StatusModal.qml</file>
<file>src/StatusQ/Core/StatusModalHeaderSettings.qml</file> <file>src/StatusQ/Core/StatusModalHeaderSettings.qml</file>
<file>src/StatusQ/Popups/StatusSearchPopup.qml</file>
<file>src/StatusQ/Components/StatusListItemBadge.qml</file>
<file>src/StatusQ/Popups/StatusSearchPopupMenuItem.qml</file>
<file>src/StatusQ/Popups/StatusSearchLocationMenu.qml</file>
</qresource> </qresource>
</RCC> </RCC>