pyqt-code-editor 0.0.11__tar.gz → 0.0.13__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/PKG-INFO +1 -1
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/__init__.py +1 -1
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/app.py +2 -2
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/find_in_files.py +3 -3
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/base.py +24 -4
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/complete.py +30 -5
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/COPYING +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyproject.toml +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/_settings.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/code_editors/__init__.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/code_editors/code_editors.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/code_editors/languages/__init__.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/code_editors/languages/generic.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/code_editors/languages/markdown.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/code_editors/languages/python.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/code_editors/languages/text.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/__init__.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/editor_panel.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/jupyter_console.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/project_explorer.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/settings_panel.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/sigmund.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/workspace_explorer.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/__init__.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/auto_indent.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/auto_pair.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/check.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/comment.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/execute.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/file_link.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/line_number.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/python_auto_indent.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/search_replace.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/shortcuts.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/smart_backspace_delete.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/symbols.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/theme.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/widgets/__init__.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/zoom.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/python_utils.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/signal_router.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/syntax_highlighters/__init__.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/syntax_highlighters/languages/__init__.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/syntax_highlighters/languages/generic.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/syntax_highlighters/languages/python.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/syntax_highlighters/syntax_highlighter.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/themes.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/utils.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/watchdog.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/__init__.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/calltip_widget.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/completion_popup.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/dock.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/quick_open_dialog.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/quick_open_file_dialog.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/quick_symbol_dialog.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/search_replace_frame.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/tab_splitter.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/tabbed_editor.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/__init__.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/languages/__init__.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/languages/generic.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/languages/python.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/manager.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/process.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/providers/__init__.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/providers/codestral.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/providers/jedi.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/providers/ruff.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/providers/sigmund.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/providers/symbol.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/settings.py +0 -0
- {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/readme.md +0 -0
|
@@ -14,7 +14,7 @@ from .components.jupyter_console import JupyterConsole
|
|
|
14
14
|
from .components.workspace_explorer import WorkspaceExplorer
|
|
15
15
|
from .components.sigmund import Sigmund
|
|
16
16
|
from .components.settings_panel import SettingsPanel
|
|
17
|
-
from . import settings, watchdog
|
|
17
|
+
from . import settings, watchdog, __version__
|
|
18
18
|
from pyqt_code_editor.signal_router import signal_router
|
|
19
19
|
|
|
20
20
|
logging.basicConfig(level=logging.INFO, force=True)
|
|
@@ -29,7 +29,7 @@ class MainWindow(QMainWindow):
|
|
|
29
29
|
if not root_path:
|
|
30
30
|
root_path = settings.current_folder
|
|
31
31
|
|
|
32
|
-
self.setWindowTitle("Sigmund Analyst")
|
|
32
|
+
self.setWindowTitle(f"Sigmund Analyst {__version__}")
|
|
33
33
|
# The editor panel provides splittable editor tabs
|
|
34
34
|
self._editor_panel = EditorPanel()
|
|
35
35
|
self._editor_panel.open_folder_requested.connect(self._open_folder)
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/find_in_files.py
RENAMED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import multiprocessing
|
|
3
3
|
from qtpy.QtWidgets import QDockWidget, QWidget, QVBoxLayout, QHBoxLayout, \
|
|
4
|
-
|
|
5
|
-
QAbstractItemView
|
|
4
|
+
QLineEdit, QCheckBox, QPushButton, QTreeWidget, QTreeWidgetItem, \
|
|
5
|
+
QAbstractItemView
|
|
6
6
|
from qtpy.QtCore import Qt, QTimer, Signal
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
|
|
9
9
|
def search_in_files_worker(files, search_text, case_sensitive, whole_word, regex, output_queue):
|
|
10
10
|
"""
|
|
@@ -128,12 +128,32 @@ class Base:
|
|
|
128
128
|
self.modified = modified
|
|
129
129
|
self.modification_changed.emit(self, modified)
|
|
130
130
|
|
|
131
|
-
def jump_to_line(self, line_number=0):
|
|
132
|
-
|
|
131
|
+
def jump_to_line(self, line_number: int = 0):
|
|
132
|
+
"""
|
|
133
|
+
Jump to a specific line (0-based) in the QPlainTextEdit,
|
|
134
|
+
centre it in the viewport and select the whole line.
|
|
135
|
+
"""
|
|
136
|
+
# Sanity-check the requested line number
|
|
137
|
+
if line_number < 0:
|
|
138
|
+
line_number = 0
|
|
139
|
+
max_line = self.document().blockCount() - 1
|
|
140
|
+
line_number = min(line_number, max_line)
|
|
141
|
+
|
|
142
|
+
cursor = QTextCursor(self.document())
|
|
143
|
+
|
|
144
|
+
# Move to the requested line
|
|
133
145
|
cursor.movePosition(QTextCursor.Start)
|
|
134
|
-
cursor.movePosition(QTextCursor.
|
|
146
|
+
cursor.movePosition(QTextCursor.NextBlock, QTextCursor.MoveAnchor,
|
|
147
|
+
line_number - 1)
|
|
148
|
+
|
|
149
|
+
# Select the whole line for visibility
|
|
150
|
+
cursor.select(QTextCursor.LineUnderCursor)
|
|
151
|
+
|
|
152
|
+
# Apply the cursor to the editor
|
|
135
153
|
self.setTextCursor(cursor)
|
|
136
|
-
|
|
154
|
+
|
|
155
|
+
# Scroll so the line sits roughly in the middle of the viewport
|
|
156
|
+
self.centerCursor()
|
|
137
157
|
|
|
138
158
|
def update_theme(self):
|
|
139
159
|
"""Mixins can implement this to update the theme in response to font changes
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
from qtpy.QtCore import QTimer, Qt
|
|
3
3
|
from qtpy.QtGui import QTextCursor
|
|
4
|
+
from qtpy.QtWidgets import QApplication
|
|
4
5
|
from ..widgets.completion_popup import CompletionPopup
|
|
5
6
|
from ..widgets.calltip_widget import CalltipWidget
|
|
6
7
|
from .. import settings
|
|
@@ -70,6 +71,8 @@ class Complete:
|
|
|
70
71
|
pos = self.textCursor().position()
|
|
71
72
|
if self._cm_paren_prefix is None or pos >= len(self._cm_paren_prefix):
|
|
72
73
|
self._update_paren_prefix_cache()
|
|
74
|
+
if pos >= len(self._cm_paren_prefix):
|
|
75
|
+
return False
|
|
73
76
|
return self._cm_paren_prefix[pos] > 0
|
|
74
77
|
|
|
75
78
|
def _is_navigation_key(self, event):
|
|
@@ -445,6 +448,7 @@ class Complete:
|
|
|
445
448
|
"""
|
|
446
449
|
Display the calltip as a small persistent widget below the cursor line,
|
|
447
450
|
horizontally aligned with the cursor, so it doesn't obscure typed text.
|
|
451
|
+
If there's not enough space below, show it above the cursor instead.
|
|
448
452
|
"""
|
|
449
453
|
if self._cm_calltip_widget.isVisible():
|
|
450
454
|
logger.info("Calltip widget already visible, updating text.")
|
|
@@ -458,12 +462,33 @@ class Complete:
|
|
|
458
462
|
# the text cursor relative to the editor's viewport.
|
|
459
463
|
cr = self.cursorRect()
|
|
460
464
|
|
|
461
|
-
#
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
465
|
+
# Get the screen geometry to check boundaries
|
|
466
|
+
screen = QApplication.primaryScreen()
|
|
467
|
+
screen_rect = screen.availableGeometry()
|
|
468
|
+
|
|
469
|
+
# Calculate the calltip size
|
|
470
|
+
self._cm_calltip_widget.adjustSize()
|
|
471
|
+
calltip_height = self._cm_calltip_widget.height()
|
|
472
|
+
|
|
473
|
+
# Convert cursor bottom-left to global coordinates
|
|
474
|
+
global_bottom_left = self.mapToGlobal(cr.bottomLeft())
|
|
475
|
+
global_bottom_left.setX(global_bottom_left.x() + self.viewportMargins().left())
|
|
476
|
+
|
|
477
|
+
# Check if calltip would fit below the cursor
|
|
478
|
+
if global_bottom_left.y() + calltip_height > screen_rect.bottom():
|
|
479
|
+
# Not enough space below, show above cursor instead
|
|
480
|
+
global_pos = self.mapToGlobal(cr.topRight())
|
|
481
|
+
global_pos.setX(global_pos.x() + self.viewportMargins().left())
|
|
482
|
+
global_pos.setY(global_pos.y() - calltip_height)
|
|
483
|
+
logger.info("Positioning calltip above cursor due to screen boundaries.")
|
|
484
|
+
else:
|
|
485
|
+
# Enough space below, use bottom-left position
|
|
486
|
+
global_pos = global_bottom_left
|
|
487
|
+
logger.info("Positioning calltip below cursor.")
|
|
488
|
+
|
|
489
|
+
print(f'intended position: {global_pos}')
|
|
466
490
|
self._cm_calltip_widget.move(global_pos)
|
|
491
|
+
print(f'actual position: {self._cm_calltip_widget.pos()}')
|
|
467
492
|
self._cm_calltip_widget.show()
|
|
468
493
|
|
|
469
494
|
def closeEvent(self, event):
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/code_editors/__init__.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/code_editors/code_editors.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/code_editors/languages/text.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/editor_panel.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/jupyter_console.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/project_explorer.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/settings_panel.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/python_auto_indent.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/search_replace.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/widgets/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/syntax_highlighters/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/calltip_widget.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/completion_popup.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/quick_open_dialog.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/quick_symbol_dialog.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/search_replace_frame.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/tab_splitter.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/tabbed_editor.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/languages/__init__.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/languages/generic.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/languages/python.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/providers/__init__.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/providers/codestral.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/providers/jedi.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/providers/ruff.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/providers/sigmund.py
RENAMED
|
File without changes
|
{pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/providers/symbol.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|