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.
Files changed (73) hide show
  1. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/PKG-INFO +1 -1
  2. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/__init__.py +1 -1
  3. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/app.py +2 -2
  4. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/find_in_files.py +3 -3
  5. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/base.py +24 -4
  6. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/complete.py +30 -5
  7. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/COPYING +0 -0
  8. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyproject.toml +0 -0
  9. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/_settings.py +0 -0
  10. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/code_editors/__init__.py +0 -0
  11. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/code_editors/code_editors.py +0 -0
  12. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/code_editors/languages/__init__.py +0 -0
  13. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/code_editors/languages/generic.py +0 -0
  14. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/code_editors/languages/markdown.py +0 -0
  15. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/code_editors/languages/python.py +0 -0
  16. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/code_editors/languages/text.py +0 -0
  17. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/__init__.py +0 -0
  18. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/editor_panel.py +0 -0
  19. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/jupyter_console.py +0 -0
  20. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/project_explorer.py +0 -0
  21. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/settings_panel.py +0 -0
  22. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/sigmund.py +0 -0
  23. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/components/workspace_explorer.py +0 -0
  24. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/__init__.py +0 -0
  25. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/auto_indent.py +0 -0
  26. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/auto_pair.py +0 -0
  27. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/check.py +0 -0
  28. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/comment.py +0 -0
  29. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/execute.py +0 -0
  30. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/file_link.py +0 -0
  31. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/line_number.py +0 -0
  32. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/python_auto_indent.py +0 -0
  33. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/search_replace.py +0 -0
  34. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/shortcuts.py +0 -0
  35. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/smart_backspace_delete.py +0 -0
  36. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/symbols.py +0 -0
  37. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/theme.py +0 -0
  38. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/widgets/__init__.py +0 -0
  39. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/mixins/zoom.py +0 -0
  40. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/python_utils.py +0 -0
  41. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/signal_router.py +0 -0
  42. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/syntax_highlighters/__init__.py +0 -0
  43. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/syntax_highlighters/languages/__init__.py +0 -0
  44. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/syntax_highlighters/languages/generic.py +0 -0
  45. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/syntax_highlighters/languages/python.py +0 -0
  46. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/syntax_highlighters/syntax_highlighter.py +0 -0
  47. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/themes.py +0 -0
  48. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/utils.py +0 -0
  49. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/watchdog.py +0 -0
  50. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/__init__.py +0 -0
  51. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/calltip_widget.py +0 -0
  52. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/completion_popup.py +0 -0
  53. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/dock.py +0 -0
  54. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/quick_open_dialog.py +0 -0
  55. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/quick_open_file_dialog.py +0 -0
  56. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/quick_symbol_dialog.py +0 -0
  57. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/search_replace_frame.py +0 -0
  58. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/tab_splitter.py +0 -0
  59. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/widgets/tabbed_editor.py +0 -0
  60. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/__init__.py +0 -0
  61. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/languages/__init__.py +0 -0
  62. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/languages/generic.py +0 -0
  63. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/languages/python.py +0 -0
  64. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/manager.py +0 -0
  65. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/process.py +0 -0
  66. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/providers/__init__.py +0 -0
  67. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/providers/codestral.py +0 -0
  68. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/providers/jedi.py +0 -0
  69. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/providers/ruff.py +0 -0
  70. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/providers/sigmund.py +0 -0
  71. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/providers/symbol.py +0 -0
  72. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/pyqt_code_editor/worker/settings.py +0 -0
  73. {pyqt_code_editor-0.0.11 → pyqt_code_editor-0.0.13}/readme.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyqt_code_editor
3
- Version: 0.0.11
3
+ Version: 0.0.13
4
4
  Summary: Fully featured code-editor widgets for PyQt
5
5
  Keywords: code editor,pyqt,ide
6
6
  Author-email: Sebastiaan Mathôt <s.mathot@cogsci.nl>
@@ -2,4 +2,4 @@
2
2
 
3
3
  from ._settings import settings
4
4
 
5
- __version__ = '0.0.11'
5
+ __version__ = '0.0.13'
@@ -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)
@@ -1,10 +1,10 @@
1
1
  import os
2
2
  import multiprocessing
3
3
  from qtpy.QtWidgets import QDockWidget, QWidget, QVBoxLayout, QHBoxLayout, \
4
- QLabel, QLineEdit, QCheckBox, QPushButton, QTreeWidget, QTreeWidgetItem, \
5
- QAbstractItemView, QShortcut
4
+ QLineEdit, QCheckBox, QPushButton, QTreeWidget, QTreeWidgetItem, \
5
+ QAbstractItemView
6
6
  from qtpy.QtCore import Qt, QTimer, Signal
7
- from qtpy.QtGui import QKeySequence
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
- cursor = self.textCursor()
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.Down, QTextCursor.MoveAnchor, line_number)
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
- self.ensureCursorVisible()
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
- # Convert its bottom-left to global coordinates, then shift down
462
- global_pos = self.mapToGlobal(cr.bottomLeft())
463
- global_pos.setX(global_pos.x() + self.viewportMargins().left())
464
- # global_pos.setY(global_pos.y() + cr.height())
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):