Add "Copy Link Address" context menu
Allows copying just the link address of a hyperlink.
This commit is contained in:
@@ -57,6 +57,11 @@ Loader {
|
|||||||
*/
|
*/
|
||||||
property string selectedText: ""
|
property string selectedText: ""
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The link the user has currently hovered.
|
||||||
|
*/
|
||||||
|
property string hoveredLink: ""
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief The list of menu item actions that have sub-actions.
|
* @brief The list of menu item actions that have sub-actions.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -63,6 +63,12 @@ DelegateContextMenu {
|
|||||||
separator: true
|
separator: true
|
||||||
},
|
},
|
||||||
DelegateContextMenu.RemoveMessageAction {},
|
DelegateContextMenu.RemoveMessageAction {},
|
||||||
|
Kirigami.Action {
|
||||||
|
text: i18nc("@action:inmenu", "Copy Link Address")
|
||||||
|
icon.name: "edit-copy"
|
||||||
|
visible: root.hoveredLink.length > 0
|
||||||
|
onTriggered: Clipboard.saveText(root.hoveredLink)
|
||||||
|
},
|
||||||
Kirigami.Action {
|
Kirigami.Action {
|
||||||
text: i18nc("@action:inmenu", "Copy Text")
|
text: i18nc("@action:inmenu", "Copy Text")
|
||||||
icon.name: "edit-copy"
|
icon.name: "edit-copy"
|
||||||
|
|||||||
@@ -245,9 +245,10 @@ Kirigami.Page {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function onShowMessageMenu(eventId, author, messageComponentType, plainText, htmlText, selectedText, isThread) {
|
function onShowMessageMenu(eventId, author, messageComponentType, plainText, htmlText, selectedText, hoveredLink, isThread) {
|
||||||
const contextMenu = messageDelegateContextMenu.createObject(root, {
|
const contextMenu = messageDelegateContextMenu.createObject(root, {
|
||||||
selectedText: selectedText,
|
selectedText: selectedText,
|
||||||
|
hoveredLink: hoveredLink,
|
||||||
author: author,
|
author: author,
|
||||||
eventId: eventId,
|
eventId: eventId,
|
||||||
messageComponentType: messageComponentType,
|
messageComponentType: messageComponentType,
|
||||||
|
|||||||
@@ -195,7 +195,7 @@ void RoomManager::viewEventSource(const QString &eventId)
|
|||||||
Q_EMIT showEventSource(eventId);
|
Q_EMIT showEventSource(eventId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RoomManager::viewEventMenu(const QString &eventId, NeoChatRoom *room, NeochatRoomMember *sender, const QString &selectedText)
|
void RoomManager::viewEventMenu(const QString &eventId, NeoChatRoom *room, NeochatRoomMember *sender, const QString &selectedText, const QString &hoveredLink)
|
||||||
{
|
{
|
||||||
const auto &event = **room->findInTimeline(eventId);
|
const auto &event = **room->findInTimeline(eventId);
|
||||||
|
|
||||||
@@ -214,7 +214,8 @@ void RoomManager::viewEventMenu(const QString &eventId, NeoChatRoom *room, Neoch
|
|||||||
MessageComponentType::typeForEvent(event),
|
MessageComponentType::typeForEvent(event),
|
||||||
EventHandler::plainBody(room, &event),
|
EventHandler::plainBody(room, &event),
|
||||||
EventHandler::richBody(room, &event),
|
EventHandler::richBody(room, &event),
|
||||||
selectedText);
|
selectedText,
|
||||||
|
hoveredLink);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RoomManager::hasOpenRoom() const
|
bool RoomManager::hasOpenRoom() const
|
||||||
|
|||||||
@@ -232,7 +232,8 @@ public:
|
|||||||
/**
|
/**
|
||||||
* @brief Show a context menu for the given event.
|
* @brief Show a context menu for the given event.
|
||||||
*/
|
*/
|
||||||
Q_INVOKABLE void viewEventMenu(const QString &eventId, NeoChatRoom *room, NeochatRoomMember *sender, const QString &selectedText = {});
|
Q_INVOKABLE void
|
||||||
|
viewEventMenu(const QString &eventId, NeoChatRoom *room, NeochatRoomMember *sender, const QString &selectedText = {}, const QString &hoveredLink = {});
|
||||||
|
|
||||||
ChatDocumentHandler *chatDocumentHandler() const;
|
ChatDocumentHandler *chatDocumentHandler() const;
|
||||||
void setChatDocumentHandler(ChatDocumentHandler *handler);
|
void setChatDocumentHandler(ChatDocumentHandler *handler);
|
||||||
@@ -313,7 +314,8 @@ Q_SIGNALS:
|
|||||||
MessageComponentType::Type messageComponentType,
|
MessageComponentType::Type messageComponentType,
|
||||||
const QString &plainText,
|
const QString &plainText,
|
||||||
const QString &htmlText,
|
const QString &htmlText,
|
||||||
const QString &selectedText);
|
const QString &selectedText,
|
||||||
|
const QString &hoveredLink);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Request to show a menu for the given media event.
|
* @brief Request to show a menu for the given media event.
|
||||||
|
|||||||
@@ -78,6 +78,11 @@ QQC2.Control {
|
|||||||
*/
|
*/
|
||||||
signal selectedTextChanged(string selectedText)
|
signal selectedTextChanged(string selectedText)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The user hovered link has changed.
|
||||||
|
*/
|
||||||
|
signal hoveredLinkChanged(string hoveredLink)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Request a context menu be show for the message.
|
* @brief Request a context menu be show for the message.
|
||||||
*/
|
*/
|
||||||
@@ -108,6 +113,9 @@ QQC2.Control {
|
|||||||
onSelectedTextChanged: selectedText => {
|
onSelectedTextChanged: selectedText => {
|
||||||
root.selectedTextChanged(selectedText);
|
root.selectedTextChanged(selectedText);
|
||||||
}
|
}
|
||||||
|
onHoveredLinkChanged: hoveredLink => {
|
||||||
|
root.hoveredLinkChanged(hoveredLink);
|
||||||
|
}
|
||||||
onShowMessageMenu: root.showMessageMenu()
|
onShowMessageMenu: root.showMessageMenu()
|
||||||
onRemoveLinkPreview: index => root.contentModel.closeLinkPreview(index)
|
onRemoveLinkPreview: index => root.contentModel.closeLinkPreview(index)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,6 +42,11 @@ DelegateChooser {
|
|||||||
*/
|
*/
|
||||||
signal selectedTextChanged(string selectedText)
|
signal selectedTextChanged(string selectedText)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The user hovered link has changed.
|
||||||
|
*/
|
||||||
|
signal hoveredLinkChanged(string hoveredLink)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Request a context menu be show for the message.
|
* @brief Request a context menu be show for the message.
|
||||||
*/
|
*/
|
||||||
@@ -63,6 +68,7 @@ DelegateChooser {
|
|||||||
delegate: TextComponent {
|
delegate: TextComponent {
|
||||||
maxContentWidth: root.maxContentWidth
|
maxContentWidth: root.maxContentWidth
|
||||||
onSelectedTextChanged: root.selectedTextChanged(selectedText)
|
onSelectedTextChanged: root.selectedTextChanged(selectedText)
|
||||||
|
onHoveredLinkChanged: root.hoveredLinkChanged(hoveredLink)
|
||||||
onShowMessageMenu: root.showMessageMenu()
|
onShowMessageMenu: root.showMessageMenu()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -182,6 +182,11 @@ TimelineDelegate {
|
|||||||
*/
|
*/
|
||||||
property string selectedText: ""
|
property string selectedText: ""
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The user hovered link.
|
||||||
|
*/
|
||||||
|
property string hoveredLink: ""
|
||||||
|
|
||||||
onIsTemporaryHighlightedChanged: if (isTemporaryHighlighted) {
|
onIsTemporaryHighlightedChanged: if (isTemporaryHighlighted) {
|
||||||
temporaryHighlightTimer.start();
|
temporaryHighlightTimer.start();
|
||||||
}
|
}
|
||||||
@@ -307,6 +312,9 @@ TimelineDelegate {
|
|||||||
onSelectedTextChanged: selectedText => {
|
onSelectedTextChanged: selectedText => {
|
||||||
root.selectedText = selectedText;
|
root.selectedText = selectedText;
|
||||||
}
|
}
|
||||||
|
onHoveredLinkChanged: hoveredLink => {
|
||||||
|
root.hoveredLink = hoveredLink;
|
||||||
|
}
|
||||||
onShowMessageMenu: _private.showMessageMenu()
|
onShowMessageMenu: _private.showMessageMenu()
|
||||||
|
|
||||||
showBackground: root.cardBackground && !NeoChatConfig.compactLayout
|
showBackground: root.cardBackground && !NeoChatConfig.compactLayout
|
||||||
@@ -378,7 +386,7 @@ TimelineDelegate {
|
|||||||
property bool showUserMessageOnRight: NeoChatConfig.showLocalMessagesOnRight && root.author.isLocalMember && !NeoChatConfig.compactLayout && !root.alwaysFillWidth
|
property bool showUserMessageOnRight: NeoChatConfig.showLocalMessagesOnRight && root.author.isLocalMember && !NeoChatConfig.compactLayout && !root.alwaysFillWidth
|
||||||
|
|
||||||
function showMessageMenu() {
|
function showMessageMenu() {
|
||||||
RoomManager.viewEventMenu(root.eventId, root.room, root.author, root.selectedText);
|
RoomManager.viewEventMenu(root.eventId, root.room, root.author, root.selectedText, root.hoveredLink);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user