pyqt-code-editor 0.0.5__tar.gz → 0.0.6__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.5 → pyqt_code_editor-0.0.6}/PKG-INFO +1 -1
  2. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/__init__.py +1 -1
  3. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/_settings.py +14 -1
  4. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/app.py +1 -0
  5. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/components/editor_panel.py +6 -1
  6. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/components/jupyter_console.py +18 -1
  7. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/components/project_explorer.py +6 -7
  8. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/mixins/file_link.py +11 -3
  9. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/utils.py +12 -0
  10. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/COPYING +0 -0
  11. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyproject.toml +0 -0
  12. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/code_editors/__init__.py +0 -0
  13. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/code_editors/code_editors.py +0 -0
  14. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/code_editors/languages/__init__.py +0 -0
  15. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/code_editors/languages/generic.py +0 -0
  16. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/code_editors/languages/markdown.py +0 -0
  17. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/code_editors/languages/python.py +0 -0
  18. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/code_editors/languages/text.py +0 -0
  19. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/components/__init__.py +0 -0
  20. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/components/find_in_files.py +0 -0
  21. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/components/settings_panel.py +0 -0
  22. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/components/sigmund.py +0 -0
  23. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/components/workspace_explorer.py +0 -0
  24. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/mixins/__init__.py +0 -0
  25. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/mixins/auto_indent.py +0 -0
  26. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/mixins/auto_pair.py +0 -0
  27. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/mixins/base.py +0 -0
  28. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/mixins/check.py +0 -0
  29. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/mixins/comment.py +0 -0
  30. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/mixins/complete.py +0 -0
  31. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/mixins/execute.py +0 -0
  32. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/mixins/line_number.py +0 -0
  33. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/mixins/python_auto_indent.py +0 -0
  34. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/mixins/search_replace.py +0 -0
  35. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/mixins/shortcuts.py +0 -0
  36. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/mixins/smart_backspace_delete.py +0 -0
  37. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/mixins/symbols.py +0 -0
  38. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/mixins/theme.py +0 -0
  39. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/mixins/widgets/__init__.py +0 -0
  40. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/mixins/zoom.py +0 -0
  41. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/python_utils.py +0 -0
  42. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/signal_router.py +0 -0
  43. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/syntax_highlighters/__init__.py +0 -0
  44. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/syntax_highlighters/languages/__init__.py +0 -0
  45. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/syntax_highlighters/languages/generic.py +0 -0
  46. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/syntax_highlighters/languages/python.py +0 -0
  47. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/syntax_highlighters/syntax_highlighter.py +0 -0
  48. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/themes.py +0 -0
  49. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/watchdog.py +0 -0
  50. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/widgets/__init__.py +0 -0
  51. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/widgets/calltip_widget.py +0 -0
  52. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/widgets/completion_popup.py +0 -0
  53. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/widgets/dock.py +0 -0
  54. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/widgets/quick_open_dialog.py +0 -0
  55. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/widgets/quick_open_file_dialog.py +0 -0
  56. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/widgets/quick_symbol_dialog.py +0 -0
  57. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/widgets/search_replace_frame.py +0 -0
  58. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/widgets/tab_splitter.py +0 -0
  59. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/widgets/tabbed_editor.py +0 -0
  60. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/worker/__init__.py +0 -0
  61. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/worker/languages/__init__.py +0 -0
  62. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/worker/languages/generic.py +0 -0
  63. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/worker/languages/python.py +0 -0
  64. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/worker/manager.py +0 -0
  65. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/worker/process.py +0 -0
  66. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/worker/providers/__init__.py +0 -0
  67. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/worker/providers/codestral.py +0 -0
  68. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/worker/providers/jedi.py +0 -0
  69. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/worker/providers/ruff.py +0 -0
  70. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/worker/providers/sigmund.py +0 -0
  71. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/worker/providers/symbol.py +0 -0
  72. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/pyqt_code_editor/worker/settings.py +0 -0
  73. {pyqt_code_editor-0.0.5 → pyqt_code_editor-0.0.6}/readme.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyqt_code_editor
3
- Version: 0.0.5
3
+ Version: 0.0.6
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.5'
5
+ __version__ = '0.0.6'
@@ -66,7 +66,7 @@ class Settings(QObject):
66
66
 
67
67
  # Appearance
68
68
  font_size = SettingProperty(16, "Appearance")
69
- font_family = SettingProperty('Ubuntu Mono', "Appearance")
69
+ font_family = SettingProperty('default', "Appearance")
70
70
  color_scheme = SettingProperty('monokai', "Appearance")
71
71
  tab_width = SettingProperty(4, "Appearance")
72
72
  default_indent = SettingProperty('\t', "Appearance")
@@ -214,6 +214,19 @@ class Settings(QObject):
214
214
  """Returns all settings as a JSON array of objects."""
215
215
  # todo
216
216
  return json.dumps({name: value for name, value in self})
217
+
218
+ def set_font_family(self):
219
+ """Changes the font family from default to an actual font. This happens
220
+ only after the app has been initialized, because QFontDatase requires
221
+ a QApplication instance.
222
+ """
223
+ if self.font_family != 'default':
224
+ return
225
+ from .utils import get_first_available_font
226
+ self.font_family = get_first_available_font(
227
+ ['Ubuntu Mono', 'Liberation Mono', 'DejaVu Sans Mono', 'Courier New',
228
+ 'monospace'])
229
+ logger.info(f'setting font family to {self.font_family}')
217
230
 
218
231
 
219
232
  # Create the singleton instance
@@ -445,6 +445,7 @@ class MainWindow(QMainWindow):
445
445
 
446
446
  def launch_app():
447
447
  app = QApplication(sys.argv)
448
+ settings.set_font_family()
448
449
  window = MainWindow()
449
450
  window.show()
450
451
  sys.exit(app.exec_())
@@ -82,8 +82,13 @@ class EditorPanel(QWidget):
82
82
  active_editor.save_file_as()
83
83
 
84
84
  def select_and_open_file(self):
85
+ options = QFileDialog.Options()
86
+ if os.environ.get("DONT_USE_NATIVE_FILE_DIALOG", False):
87
+ options |= QFileDialog.Option.DontUseNativeDialog
88
+ logger.info('not using native file dialog')
85
89
  path, _ = QFileDialog.getOpenFileName(
86
- self, "Open File", settings.current_folder, "All Files (*.*)")
90
+ self, "Open File", settings.current_folder, "All Files (*.*)",
91
+ options=options)
87
92
  if path:
88
93
  settings.current_folder = os.path.dirname(path)
89
94
  self.open_file(path)
@@ -17,6 +17,23 @@ from .. import watchdog
17
17
  logger = logging.getLogger(__name__)
18
18
 
19
19
 
20
+ class HomeAwareKernelSpecManager(KernelSpecManager):
21
+ """Reimplements the KernelSpecManager to always search in the Linux home
22
+ folder. This for example ensures that the local kernels are picked up in a
23
+ flatpak environment.
24
+ """
25
+ def _kernel_dirs_default(self) -> list[str]:
26
+ dirs = super()._kernel_dirs_default()
27
+ home_dir = os.path.expanduser("~")
28
+ jupyter_kernel_dir = os.path.join(
29
+ home_dir, '.local', 'share', 'jupyter', 'kernels')
30
+ if os.path.isdir(jupyter_kernel_dir) and os.access(jupyter_kernel_dir,
31
+ os.R_OK):
32
+ if jupyter_kernel_dir not in dirs:
33
+ dirs.append(jupyter_kernel_dir)
34
+ return dirs
35
+
36
+
20
37
  class JupyterConsoleTab(QWidget):
21
38
  """Individual tab containing a Jupyter console with its own kernel"""
22
39
 
@@ -389,7 +406,7 @@ class JupyterConsole(Dock):
389
406
  self.kernel_menu.clear()
390
407
 
391
408
  # Get available kernelspecs
392
- kernel_spec_manager = KernelSpecManager()
409
+ kernel_spec_manager = HomeAwareKernelSpecManager()
393
410
  specs = kernel_spec_manager.get_all_specs()
394
411
 
395
412
  for spec_name, spec in specs.items():
@@ -8,7 +8,6 @@ from qtpy.QtWidgets import (
8
8
  QFileDialog,
9
9
  QMenu,
10
10
  QMessageBox,
11
- QShortcut,
12
11
  QInputDialog,
13
12
  QWidget,
14
13
  QVBoxLayout,
@@ -249,12 +248,12 @@ class ProjectExplorer(QDockWidget):
249
248
  If a folder is selected, a ProjectExplorer instance is created and returned.
250
249
  Otherwise None is returned.
251
250
  """
252
- selected_dir = QFileDialog.getExistingDirectory(
253
- parent,
254
- "Open Project Folder",
255
- "",
256
- QFileDialog.ShowDirsOnly
257
- )
251
+ options = QFileDialog.Options(QFileDialog.ShowDirsOnly)
252
+ if os.environ.get("DONT_USE_NATIVE_FILE_DIALOG", False):
253
+ options |= QFileDialog.Option.DontUseNativeDialog
254
+ logger.info('not using native file dialog')
255
+ selected_dir = QFileDialog.getExistingDirectory(parent,
256
+ "Open Project Folder", "", options=options)
258
257
  if not selected_dir:
259
258
  return None
260
259
  settings.current_folder = selected_dir
@@ -93,10 +93,10 @@ class FileLink:
93
93
  self.set_modified(False)
94
94
  self.file_saved.emit(self, self.code_editor_encoding)
95
95
 
96
- def save_file_as(self, path: Path | str = None):
96
+ def save_file_as(self, path: Path | str = None):
97
97
  """
98
98
  Saves the editor content to file and updates code_editor_file_path.
99
- If no path is provided, the user asked to choose.
99
+ If no path is provided, the user is asked to choose.
100
100
  """
101
101
  if path is None:
102
102
  if self.code_editor_file_path is None:
@@ -104,10 +104,18 @@ class FileLink:
104
104
  settings.default_filename)
105
105
  else:
106
106
  suggested_name = self.code_editor_file_path
107
+
108
+ options = QFileDialog.Options()
109
+ if os.environ.get("DONT_USE_NATIVE_FILE_DIALOG", False):
110
+ options |= QFileDialog.Option.DontUseNativeDialog
111
+ logger.info('not using native file dialog')
107
112
  path, _ = QFileDialog.getSaveFileName(
108
- self, "Save As", suggested_name, "All Files (*.*)")
113
+ self, "Save As", suggested_name, "All Files (*.*)", options=options
114
+ )
115
+
109
116
  if not path:
110
117
  return
118
+
111
119
  old_path = self.code_editor_encoding
112
120
  settings.current_folder = os.path.dirname(path)
113
121
  self.code_editor_file_path = str(path)
@@ -94,3 +94,15 @@ def shorten_paths(paths):
94
94
 
95
95
  return results
96
96
 
97
+
98
+ def get_first_available_font(font_candidates):
99
+ """
100
+ Takes a list of font family names and returns the first
101
+ that is available on the system, or None if none are found.
102
+ """
103
+ from qtpy.QtGui import QFontDatabase
104
+ available_families = QFontDatabase.families()
105
+ for candidate in font_candidates:
106
+ if candidate in available_families:
107
+ return candidate
108
+ return None