Skip to content

Commit c71032f

Browse files
TrigamDevCyanVoxel
andauthored
feat(ui): clickable links in text fields (#924)
* feat: links in text fields are clickable * style: fix linting errors * style: remove unnecessary comment * feat: better url pattern * chore: disable Ruff error * style: add trailing line * style: maybe format it? that'd be smart * ui: chance text_label from RichText to Markdown --------- Co-authored-by: Travis Abendshien <[email protected]>
1 parent 77cfa69 commit c71032f

File tree

1 file changed

+19
-1
lines changed

1 file changed

+19
-1
lines changed

src/tagstudio/qt/widgets/text.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
# Created for TagStudio: https://github.com/CyanVoxel/TagStudio
44

55

6+
import re
7+
68
from PySide6.QtCore import Qt
79
from PySide6.QtWidgets import QHBoxLayout, QLabel
810

@@ -19,9 +21,25 @@ def __init__(self, title, text: str) -> None:
1921
self.text_label = QLabel()
2022
self.text_label.setStyleSheet("font-size: 12px")
2123
self.text_label.setWordWrap(True)
22-
self.text_label.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse)
24+
self.text_label.setTextFormat(Qt.TextFormat.MarkdownText)
25+
self.text_label.setOpenExternalLinks(True)
26+
self.text_label.setTextInteractionFlags(Qt.TextInteractionFlag.TextBrowserInteraction)
2327
self.base_layout.addWidget(self.text_label)
2428
self.set_text(text)
2529

2630
def set_text(self, text: str):
31+
text = linkify(text)
2732
self.text_label.setText(text)
33+
34+
35+
# Regex from https://stackoverflow.com/a/6041965
36+
def linkify(text: str):
37+
url_pattern = (
38+
r"(http|ftp|https):\/\/([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:\/~+#-*]*[\w@?^=%&\/~+#-*])"
39+
)
40+
return re.sub(
41+
url_pattern,
42+
lambda url: f'<a href="{url.group(0)}">{url.group(0)}</a>',
43+
text,
44+
flags=re.IGNORECASE,
45+
)

0 commit comments

Comments
 (0)