View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0017618 | Scribus | Scripter | public | 2025-09-06 07:55 | 2025-09-07 19:52 |
Reporter | ale | Assigned To | |||
Priority | normal | Severity | minor | Reproducibility | N/A |
Status | new | Resolution | open | ||
Product Version | 1.7.1.svn | ||||
Summary | 0017618: [PATCH] Modify the behavior of scripter's getSelectedTextRange() | ||||
Description | Currently, getSelectedTextRange() returns (0, 0) if there is no selection. On the the other side, there is no way (or at least I could not find one) for knowing where the cursor is. I suggest to modify the behavior of getSelectedTextRange() to: - return (pos, length) if there is a text selection, - return (pos, 0) if the text frame is in edit mode but there is no selection, - return None if the the selected frame is a text frame but it's not in edit mode, - trigger an error if there is no active item or if the item is not a text frame. | ||||
Tags | No tags attached. | ||||
Patch | Yes | ||||
|
- selectText() now "tries" (like many other scripter functions) to set the frame in edit mode. - detects the cursor position text-selection.diff (5,801 bytes)
From 7997270862a7dd8c89e1b6e3aeebc7350ed90d7b Mon Sep 17 00:00:00 2001 From: ale rimoldi <ale@graphicslab.org> Date: Sun, 7 Sep 2025 21:46:25 +0200 Subject: getTextSelectionRange() also for no selection diff --git a/scribus/plugins/scriptplugin/cmdtext.cpp b/scribus/plugins/scriptplugin/cmdtext.cpp index 8a2d26502..378aa88da 100644 --- a/scribus/plugins/scriptplugin/cmdtext.cpp +++ b/scribus/plugins/scriptplugin/cmdtext.cpp @@ -1236,6 +1236,7 @@ PyObject *scribus_selectframetext(PyObject* /* self */, PyObject* args) item->itemText.select(start, selcount, true); item->itemText.setCursorPosition(start + selcount); item->HasSel = (selcount != 0); + ScCore->primaryMainWindow()->doc->appMode = modeEdit; Py_RETURN_NONE; } @@ -1275,6 +1276,7 @@ PyObject *scribus_selecttext(PyObject* /* self */, PyObject* args) item->itemText.select(start, selcount, true); item->itemText.setCursorPosition(start + selcount); item->HasSel = (selcount != 0); + ScCore->primaryMainWindow()->doc->appMode = modeEdit; Py_RETURN_NONE; } @@ -1294,7 +1296,20 @@ PyObject *scribus_getselectedtextrange(PyObject* /* self */, PyObject* args) PyErr_SetString(WrongFrameTypeError, QObject::tr("Cannot get text selection for non-text frame.","python error").toLocal8Bit().constData()); return nullptr; } - return Py_BuildValue("(ii)", item->itemText.startOfSelection(), item->itemText.selectionLength()); + + const StoryText& story = item->itemText; + + if (story.hasSelection()) { + return Py_BuildValue("(ii)", story.startOfSelection(), story.selectionLength()); + } + + if (ScCore->primaryMainWindow()->doc->appMode == modeEdit) { + return Py_BuildValue("(ii)", story.cursorPosition(), 0); + } + + // Return (None, None) if Scribus is not in edit mode + // (and no selection has been set with selectText()) + return Py_BuildValue("(OO)", Py_None, Py_None); } PyObject *scribus_getframeselectedtextrange(PyObject* /* self */, PyObject* args) @@ -1313,7 +1328,20 @@ PyObject *scribus_getframeselectedtextrange(PyObject* /* self */, PyObject* args return nullptr; } - return Py_BuildValue("(ii)", item->itemText.startOfSelection() - item->firstInFrame(), item->itemText.selectionLength()); + // return Py_BuildValue("(ii)", item->itemText.startOfSelection() - item->firstInFrame(), item->itemText.selectionLength()); + const StoryText& story = item->itemText; + + if (story.hasSelection()) { + return Py_BuildValue("(ii)", story.startOfSelection() - item->firstInFrame(), story.selectionLength()); + } + + if (ScCore->primaryMainWindow()->doc->appMode == modeEdit) { + return Py_BuildValue("(ii)", story.cursorPosition() - item->firstInFrame(), 0); + } + + // Return (None, None) if Scribus is not in edit mode + // (and no selection has been set with selectText()) + return Py_BuildValue("(OO)", Py_None, Py_None); } PyObject *scribus_deletetext(PyObject* /* self */, PyObject* args) diff --git a/scribus/plugins/scriptplugin/cmdtext.h b/scribus/plugins/scriptplugin/cmdtext.h index 9a02dd373..df6c53324 100644 --- a/scribus/plugins/scriptplugin/cmdtext.h +++ b/scribus/plugins/scriptplugin/cmdtext.h @@ -526,11 +526,16 @@ PyDoc_STRVAR(scribus_selecttext__doc__, QT_TR_NOOP("selectText(start, count, [\"name\"])\n\ \n\ Selects \"count\" characters of text in the story of the text frame \"name\" starting from the\n\ -character \"start\". Character counting starts at 0. If \"count\" is zero, any\n\ -text selection will be cleared. If \"name\" is not given the currently\n\ -selected item is used.\n\ +character \"start\".\n\ \n\ -May throw IndexError if the selection is outside the bounds of the text.\n\ +Character counting starts at 0.\n\ +If \"count\" is zero, any text selection will be cleared.\n\ +If \"count\" is -1, the selection goes to the end of the frame.\n\ +\n\ +If \"name\" is not given the currently selected item is used.\n\ +\n\ +Throws IndexError if the selection is outside the bounds of the text.\n\ +Throws WrongFrameTypeError if the item is not a text frame.\n\ ")); /*! Select text */ PyObject *scribus_selecttext(PyObject * /*self*/, PyObject* args); @@ -540,11 +545,16 @@ PyDoc_STRVAR(scribus_getselectedtextrange__doc__, QT_TR_NOOP("getSelectedTextRange([\"name\"])\n\ \n\ Gets the start index and length of the current text selection in the text chain.\n\ +\n\ Results relate to the entire story across multiple text frames.\n\ -Start will be 0 if none is selected\n\ -Length will be 0 if none is selected\n\ \n\ -May throw IndexError if the selection is outside the bounds of the text.\n\ +If there is no text selection, Start is the cursor position and length is 0.\n\ +Both start and length will be None if the frame is not in edit mode.\n\ +(Calling \"selectText()\" sets the frame in edit mode, even if it's not visible.)\n\ +\n\ +If \"name\" is not given the currently selected item is used.\n\ +\n\ +Throws WrongFrameTypeError if the item is not a text frame.\n\ ")); /*! Select text */ PyObject *scribus_getselectedtextrange(PyObject * /*self*/, PyObject* args); @@ -553,11 +563,9 @@ PyObject *scribus_getselectedtextrange(PyObject * /*self*/, PyObject* args); PyDoc_STRVAR(scribus_getframeselectedtextrange__doc__, QT_TR_NOOP("getFrameSelectedTextRange([\"name\"])\n\ \n\ -Gets the start index and length of the current text selection of the currently selected frame.\n\ -Start will be 0 if none is selected\n\ -Length will be 0 if none is selected\n\ +Gets the start index and length of the current text selection and only consider the currently selected frame.\n\ \n\ -May throw IndexError if the selection is outside the bounds of the text.\n\ +See getFrameSelectedTextRange() for further details.\n\ ")); /*! Select text */ PyObject *scribus_getframeselectedtextrange(PyObject * /*self*/, PyObject* args); |
Date Modified | Username | Field | Change |
---|---|---|---|
2025-09-06 07:55 | ale | New Issue | |
2025-09-07 19:48 | ale | Relationship added | related to 0017619 |
2025-09-07 19:51 | ale | Note Added: 0053010 | |
2025-09-07 19:51 | ale | File Added: text-selection.diff | |
2025-09-07 19:52 | ale | Summary | Modify the behavior of scripter's getSelectedTextRange() => [PATCH] Modify the behavior of scripter's getSelectedTextRange() |
2025-09-07 19:52 | ale | Patch | No => Yes |