D7: editor multi-cursor support
Add secondary_cursors field to Editor with insert_char_multi, delete_back_multi, delete_forward_multi methods. Right-to-left processing ensures position shifts don't corrupt earlier insertions. 7 new tests: add/clear, all_positions, insert, delete_back, delete_forward, unicode, duplicate-add.
This commit is contained in:
+31
@@ -0,0 +1,31 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# SPDX-FileCopyrightText: 2025 Nicolas Fella <nicolas.fella@gmx.de>
|
||||
# SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
|
||||
import sys
|
||||
|
||||
from KGuiAddons import KColorSchemeWatcher
|
||||
|
||||
from PySide6 import QtCore
|
||||
|
||||
def print_preference(preference):
|
||||
if preference == KColorSchemeWatcher.NoPreference:
|
||||
print("No preference")
|
||||
if preference == KColorSchemeWatcher.PreferDark:
|
||||
print("Dark")
|
||||
if preference == KColorSchemeWatcher.PreferLight:
|
||||
print("Light")
|
||||
if preference == KColorSchemeWatcher.PreferHighContrast:
|
||||
print("High Contrast")
|
||||
|
||||
|
||||
app = QtCore.QCoreApplication()
|
||||
|
||||
watcher = KColorSchemeWatcher()
|
||||
|
||||
print_preference(watcher.systemPreference())
|
||||
|
||||
watcher.systemPreferenceChanged.connect(lambda: print_preference(watcher.systemPreference()))
|
||||
|
||||
sys.exit(app.exec())
|
||||
@@ -0,0 +1,34 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# SPDX-FileCopyrightText: 2025 Nicolas Fella <nicolas.fella@gmx.de>
|
||||
# SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
|
||||
import sys
|
||||
from PySide6 import QtCore, QtWidgets, QtGui
|
||||
from KGuiAddons import KDateValidator
|
||||
|
||||
class MyWidget(QtWidgets.QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
self.input = QtWidgets.QLineEdit()
|
||||
self.input.editingFinished.connect(self.onEditFinished)
|
||||
|
||||
validator = KDateValidator()
|
||||
self.input.setValidator(validator)
|
||||
|
||||
self.layout = QtWidgets.QVBoxLayout(self)
|
||||
self.layout.addWidget(self.input)
|
||||
|
||||
@QtCore.Slot()
|
||||
def onEditFinished(self):
|
||||
print("Got valid input")
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = QtWidgets.QApplication([])
|
||||
|
||||
widget = MyWidget()
|
||||
widget.resize(800, 600)
|
||||
widget.show()
|
||||
|
||||
sys.exit(app.exec())
|
||||
@@ -0,0 +1,29 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# SPDX-FileCopyrightText: 2025 Nicolas Fella <nicolas.fella@gmx.de>
|
||||
# SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
|
||||
import sys
|
||||
from PySide6 import QtCore, QtWidgets, QtGui
|
||||
from KGuiAddons import KIconUtils
|
||||
|
||||
class MyWidget(QtWidgets.QWidget):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
self.icon = KIconUtils.addOverlays(QtGui.QIcon.fromTheme("cuttlefish"), ["edit-entry", "edit-delete"])
|
||||
|
||||
self.label = QtWidgets.QLabel()
|
||||
self.label.setPixmap(self.icon.pixmap(64))
|
||||
|
||||
self.layout = QtWidgets.QVBoxLayout(self)
|
||||
self.layout.addWidget(self.label)
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = QtWidgets.QApplication([])
|
||||
|
||||
widget = MyWidget()
|
||||
widget.resize(800, 600)
|
||||
widget.show()
|
||||
|
||||
sys.exit(app.exec())
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
SPDX-FileCopyrightText: 2025 David Edmundson <davidedmundson@kde.org>
|
||||
SPDX-FileCopyrightText: 2026 Fushan Wen <qydwhotmail@gmail.com>
|
||||
SPDX-License-Identifier: LGPL-2.0-or-later
|
||||
"""
|
||||
|
||||
import sys
|
||||
|
||||
from KGuiAddons import KSystemClipboard
|
||||
from PySide6.QtCore import QMimeData, Slot
|
||||
from PySide6.QtGui import QClipboard
|
||||
from PySide6.QtWidgets import (QApplication, QHBoxLayout, QLabel, QPushButton, QSizePolicy, QTextEdit, QVBoxLayout, QWidget)
|
||||
|
||||
|
||||
class KSystemClipboardExample(QWidget):
|
||||
|
||||
def __init__(self) -> None:
|
||||
super().__init__()
|
||||
self.setWindowTitle("KSystemClipboard")
|
||||
self.__setup_ui()
|
||||
|
||||
def __setup_ui(self) -> None:
|
||||
self.system_clipboard_view = QTextEdit()
|
||||
self.system_text_edit = QTextEdit()
|
||||
self.__setup_system_clipboard()
|
||||
|
||||
self.resize(600, 500)
|
||||
|
||||
def __setup_system_clipboard(self) -> None:
|
||||
clipboard = KSystemClipboard.instance()
|
||||
|
||||
layout = QVBoxLayout(self)
|
||||
|
||||
title_label = QLabel("System Clipboard (KSystemClipboard)")
|
||||
layout.addWidget(title_label)
|
||||
|
||||
self.system_clipboard_view.setReadOnly(True)
|
||||
self.system_clipboard_view.setMinimumHeight(200)
|
||||
self.system_clipboard_view.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
|
||||
|
||||
clipboard.changed.connect(self.on_system_clipboard_changed)
|
||||
|
||||
self.system_clipboard_view.setText(clipboard.text(QClipboard.Mode.Clipboard))
|
||||
|
||||
layout.addWidget(self.system_clipboard_view)
|
||||
|
||||
self.system_text_edit.setPlaceholderText("Enter clipboard content here…")
|
||||
self.system_text_edit.setMinimumHeight(120)
|
||||
self.system_text_edit.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
|
||||
layout.addWidget(self.system_text_edit)
|
||||
|
||||
btn_row = QHBoxLayout()
|
||||
btn_row.addStretch()
|
||||
|
||||
submit_btn = QPushButton("Submit")
|
||||
submit_btn.clicked.connect(self.submit_system_clipboard)
|
||||
btn_row.addWidget(submit_btn)
|
||||
|
||||
layout.addLayout(btn_row)
|
||||
|
||||
@Slot(QClipboard.Mode)
|
||||
def on_system_clipboard_changed(self, mode) -> None:
|
||||
if mode != QClipboard.Mode.Clipboard:
|
||||
return
|
||||
clipboard = KSystemClipboard.instance()
|
||||
self.system_clipboard_view.setText(clipboard.text(mode))
|
||||
|
||||
@Slot()
|
||||
def submit_system_clipboard(self) -> None:
|
||||
clipboard = KSystemClipboard.instance()
|
||||
mime_data = QMimeData()
|
||||
mime_data.setText(self.system_text_edit.toPlainText())
|
||||
clipboard.setMimeData(mime_data, QClipboard.Mode.Clipboard)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = QApplication(sys.argv)
|
||||
|
||||
window = KSystemClipboardExample()
|
||||
window.show()
|
||||
|
||||
sys.exit(app.exec())
|
||||
Reference in New Issue
Block a user