Allow comment, ignore and clear formatting to be applied to all selected text
This commit is contained in:
@@ -736,11 +736,11 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
elif action == nwDocAction.BLOCK_H4:
|
elif action == nwDocAction.BLOCK_H4:
|
||||||
self._formatBlock(nwDocAction.BLOCK_H4)
|
self._formatBlock(nwDocAction.BLOCK_H4)
|
||||||
elif action == nwDocAction.BLOCK_COM:
|
elif action == nwDocAction.BLOCK_COM:
|
||||||
self._formatAllBlocks(nwDocAction.BLOCK_COM)
|
self._iterFormatBlocks(nwDocAction.BLOCK_COM)
|
||||||
elif action == nwDocAction.BLOCK_IGN:
|
elif action == nwDocAction.BLOCK_IGN:
|
||||||
self._formatAllBlocks(nwDocAction.BLOCK_IGN)
|
self._iterFormatBlocks(nwDocAction.BLOCK_IGN)
|
||||||
elif action == nwDocAction.BLOCK_TXT:
|
elif action == nwDocAction.BLOCK_TXT:
|
||||||
self._formatBlock(nwDocAction.BLOCK_TXT)
|
self._iterFormatBlocks(nwDocAction.BLOCK_TXT)
|
||||||
elif action == nwDocAction.BLOCK_TTL:
|
elif action == nwDocAction.BLOCK_TTL:
|
||||||
self._formatBlock(nwDocAction.BLOCK_TTL)
|
self._formatBlock(nwDocAction.BLOCK_TTL)
|
||||||
elif action == nwDocAction.BLOCK_UNN:
|
elif action == nwDocAction.BLOCK_UNN:
|
||||||
@@ -1635,11 +1635,9 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
def _processBlockFormat(
|
def _processBlockFormat(
|
||||||
self, action: nwDocAction, block: QTextBlock
|
self, action: nwDocAction, text: str, toggle: bool = True
|
||||||
) -> tuple[nwDocAction, str, int]:
|
) -> tuple[nwDocAction, str, int]:
|
||||||
"""Process the formatting of a single text block."""
|
"""Process the formatting of a single text block."""
|
||||||
text = block.text()
|
|
||||||
|
|
||||||
# Remove existing format first, if any
|
# Remove existing format first, if any
|
||||||
if text.startswith("@"):
|
if text.startswith("@"):
|
||||||
logger.error("Cannot apply block format to keyword/value line")
|
logger.error("Cannot apply block format to keyword/value line")
|
||||||
@@ -1647,12 +1645,12 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
elif text.startswith("%~"):
|
elif text.startswith("%~"):
|
||||||
temp = text[2:].lstrip()
|
temp = text[2:].lstrip()
|
||||||
offset = len(text) - len(temp)
|
offset = len(text) - len(temp)
|
||||||
if action == nwDocAction.BLOCK_IGN:
|
if toggle and action == nwDocAction.BLOCK_IGN:
|
||||||
action = nwDocAction.BLOCK_TXT
|
action = nwDocAction.BLOCK_TXT
|
||||||
elif text.startswith("%"):
|
elif text.startswith("%"):
|
||||||
temp = text[1:].lstrip()
|
temp = text[1:].lstrip()
|
||||||
offset = len(text) - len(temp)
|
offset = len(text) - len(temp)
|
||||||
if action == nwDocAction.BLOCK_COM:
|
if toggle and action == nwDocAction.BLOCK_COM:
|
||||||
action = nwDocAction.BLOCK_TXT
|
action = nwDocAction.BLOCK_TXT
|
||||||
elif text.startswith("# "):
|
elif text.startswith("# "):
|
||||||
temp = text[2:]
|
temp = text[2:]
|
||||||
@@ -1744,50 +1742,55 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
|
|
||||||
return action, text, offset
|
return action, text, offset
|
||||||
|
|
||||||
def _formatBlock(self, action: nwDocAction, block: QTextBlock | None = None) -> bool:
|
def _formatBlock(self, action: nwDocAction) -> bool:
|
||||||
"""Change the block format of the block under the cursor."""
|
"""Change the block format of the block under the cursor."""
|
||||||
cursor = self.textCursor()
|
cursor = self.textCursor()
|
||||||
if block is None:
|
block = cursor.block()
|
||||||
block = cursor.block()
|
|
||||||
if not block.isValid():
|
if not block.isValid():
|
||||||
logger.debug("Invalid block selected for action '%s'", str(action))
|
logger.debug("Invalid block selected for action '%s'", str(action))
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# Remove existing format first, if any
|
action, text, offset = self._processBlockFormat(action, block.text())
|
||||||
hasText = block.length() > 0
|
|
||||||
action, text, offset = self._processBlockFormat(action, block)
|
|
||||||
if action == nwDocAction.NO_ACTION:
|
if action == nwDocAction.NO_ACTION:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# Replace the block text
|
pos = cursor.position()
|
||||||
|
|
||||||
cursor.beginEditBlock()
|
cursor.beginEditBlock()
|
||||||
posO = cursor.position()
|
self._makeSelection(QTextCursor.SelectionType.BlockUnderCursor, cursor)
|
||||||
cursor.select(QTextCursor.SelectionType.BlockUnderCursor)
|
|
||||||
posS = cursor.selectionStart()
|
|
||||||
cursor.removeSelectedText()
|
|
||||||
cursor.setPosition(posS)
|
|
||||||
|
|
||||||
if posS > 0 and hasText:
|
|
||||||
# If the block already had text, we must insert a new block
|
|
||||||
# first before we can add back the text to it.
|
|
||||||
cursor.insertBlock()
|
|
||||||
|
|
||||||
cursor.insertText(text)
|
cursor.insertText(text)
|
||||||
|
|
||||||
if posO - offset >= 0:
|
|
||||||
cursor.setPosition(posO - offset)
|
|
||||||
|
|
||||||
cursor.endEditBlock()
|
cursor.endEditBlock()
|
||||||
|
|
||||||
|
if (move := pos - offset) >= 0:
|
||||||
|
cursor.setPosition(move)
|
||||||
self.setTextCursor(cursor)
|
self.setTextCursor(cursor)
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _formatAllBlocks(self, action: nwDocAction) -> bool:
|
def _iterFormatBlocks(self, action: nwDocAction) -> bool:
|
||||||
"""Iterate over all selected blocks and apply format. If no
|
"""Iterate over all selected blocks and apply format. If no
|
||||||
selection is made, just forward the call to the single block
|
selection is made, just forward the call to the single block
|
||||||
formatter function.
|
formatter function.
|
||||||
"""
|
"""
|
||||||
self._formatBlock(action)
|
cursor = self.textCursor()
|
||||||
|
blocks = self._selectedBlocks(cursor)
|
||||||
|
if len(blocks) < 1:
|
||||||
|
return self._formatBlock(action)
|
||||||
|
|
||||||
|
toggle = True
|
||||||
|
cursor.beginEditBlock()
|
||||||
|
for block in blocks:
|
||||||
|
blockText = block.text()
|
||||||
|
pAction, text, _ = self._processBlockFormat(action, blockText, toggle)
|
||||||
|
if pAction != nwDocAction.NO_ACTION and blockText.strip():
|
||||||
|
action = pAction # First block decides further actions
|
||||||
|
cursor.setPosition(block.position())
|
||||||
|
self._makeSelection(QTextCursor.SelectionType.BlockUnderCursor, cursor)
|
||||||
|
cursor.insertText(text)
|
||||||
|
toggle = False
|
||||||
|
|
||||||
|
cursor.endEditBlock()
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _selectedBlocks(self, cursor: QTextCursor) -> list[QTextBlock]:
|
def _selectedBlocks(self, cursor: QTextCursor) -> list[QTextBlock]:
|
||||||
@@ -2067,9 +2070,11 @@ class GuiDocEditor(QPlainTextEdit):
|
|||||||
|
|
||||||
return cursor
|
return cursor
|
||||||
|
|
||||||
def _makeSelection(self, mode: QTextCursor.SelectionType) -> None:
|
def _makeSelection(self, mode: QTextCursor.SelectionType,
|
||||||
|
cursor: QTextCursor | None = None) -> None:
|
||||||
"""Select text based on selection mode."""
|
"""Select text based on selection mode."""
|
||||||
cursor = self.textCursor()
|
if cursor is None:
|
||||||
|
cursor = self.textCursor()
|
||||||
cursor.clearSelection()
|
cursor.clearSelection()
|
||||||
cursor.select(mode)
|
cursor.select(mode)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user