Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
395 commits
Select commit Hold shift + click to select a range
fb6bf4c
fix(settings): correct always_ontop bitwise flag and update default s…
charliewales Jun 29, 2026
9f70519
fix(ui): resolve word wrap layout glitch on startup
charliewales Jun 29, 2026
39d052d
fix(ui): load recent files menu on startup
charliewales Jun 29, 2026
77ea3ec
chore: move documentation.html to docs folder
charliewales Jun 29, 2026
28d1a7c
refactor: remove unused icons_rcs.py and update editor instantiation …
charliewales Jun 29, 2026
f509d0b
refactor: remove pymel dependency
charliewales Jun 29, 2026
d1cf023
fix: indent
charliewales Jun 29, 2026
d86c00f
fix(houdini): ignore legacy kwargs in _houdini.show
charliewales Jun 29, 2026
6140c8e
refactor(core): modernize Houdini styling and remove legacy CSS overr…
charliewales Jun 29, 2026
b14cf26
refactor(core): rename get_h14_style to get_hou_style
charliewales Jun 29, 2026
51c45e4
chore: get rid of css style
charliewales Jun 29, 2026
d72fb3a
feat(ui): add direct save via Ctrl+S for disk-backed tabs
charliewales Jun 29, 2026
0e92d93
fix(ui): close button disabled in PySide6
charliewales Jun 29, 2026
ec05707
fix(editor): prevent autocomplete dialog on comment toggle
charliewales Jun 29, 2026
49bfb8a
fix(editor): prevent crash in theme editor when typing
charliewales Jun 29, 2026
e957391
fix(ui): ensure correct tab input gains focus on startup
charliewales Jun 29, 2026
6cffa89
refactor!: remove Python 2 support
charliewales Jun 29, 2026
4d95ee8
fix(theme): overhaul theme editor synchronization and ui behavior
charliewales Jun 29, 2026
4f2d93f
feat: expand themes and improve theme logic
charliewales Jun 29, 2026
7fbc65f
fix: PySide6 QSS parsing and QAction lambda compatibility
charliewales Jun 29, 2026
6630559
fix: completer text size not applying in custom themes
charliewales Jun 29, 2026
995f572
fix: QSyntaxHighlighter initialization order
charliewales Jun 29, 2026
4d62965
fix: QSyntaxHighlighter TypeError missing arguments
charliewales Jun 29, 2026
7a49be6
fix: completer text size not updating on theme switch
charliewales Jun 29, 2026
08038a2
fix: KeyError exceptions during theme preview update
charliewales Jun 29, 2026
1d8b658
feat: add new predefined color themes
charliewales Jun 29, 2026
bf8ccba
fix: resolve font compatibility and deprecation warnings
charliewales Jun 29, 2026
b510a0b
refactor: simplify base_text_widget by removing hardcoded Houdini/May…
charliewales Jun 29, 2026
4654a29
feat: improve UI styling and theme menu interaction
charliewales Jun 30, 2026
539f4c4
style: unify tab close button icon across Qt versions and adjust QPus…
charliewales Jun 30, 2026
0a92dab
feat: add 'Output At the Bottom' option to toggle output widget place…
charliewales Jun 30, 2026
086e457
fix: toolbar style sheet toggle under Linux and PySide6
charliewales Jun 30, 2026
fdcd598
fix: load tab content from file instead of cached session text
charliewales Jun 30, 2026
cc1426d
feat: add copy file path action to tab context menu
charliewales Jun 30, 2026
f3167a3
feat: scroll to top and highlight line when clicking outline item
charliewales Jun 30, 2026
083d504
feat: add outline filtering with search box and escape shortcut
charliewales Jun 30, 2026
0b018e6
perf: lazy load tab contents on startup to prevent UI freeze
charliewales Jun 30, 2026
b7a15f6
perf: optimize syntax highlighting using python re module instead of …
charliewales Jun 30, 2026
12d0fa4
fix: dynamically adjust line number bar width based on document length
charliewales Jun 30, 2026
05d9881
fix: resolve line number vertical alignment issues on Linux
charliewales Jun 30, 2026
fca0184
style: scale line number font size to 80% of editor font size
charliewales Jun 30, 2026
44ed1dc
refactor: rename showUi14 to showUi
charliewales Jun 30, 2026
ee380a4
chore: do not apply dark style to app, it is set via CSS
charliewales Jun 30, 2026
cef6eb6
chore(ui): update tab colors
charliewales Jun 30, 2026
6e188a6
perf: debounce linter execution to prevent autocomplete stuttering
charliewales Jun 30, 2026
4450844
chore(ui): decrease tab top/bottom padding
charliewales Jun 30, 2026
37262c3
chore: update .gitignore
charliewales Jun 30, 2026
f8466cb
Merge branch 'refactor'
charliewales Jun 30, 2026
2ab0da1
Update readme.md
charliewales Jun 30, 2026
31a702d
docs: update and expand descriptions in documentation.html
charliewales Jun 30, 2026
d334b17
docs: expand docs
charliewales Jul 3, 2026
aee888c
feat: add tab styling options to Code Theme Editor
charliewales Jul 3, 2026
8626811
feat: update default tab colors based on user preference
charliewales Jul 3, 2026
5e069d9
fix: match tab hover border color with hover background
charliewales Jul 3, 2026
05294d1
feat: add color reset context menu and tab spacing
charliewales Jul 3, 2026
1df437a
fix: enhance tab preview in theme editor and adjust tab close button …
charliewales Jul 3, 2026
dc4a982
feat: add tab border radius control and fix completer text size scaling
charliewales Jul 3, 2026
c37e6c5
chore: adjust default window size to 1280x720 and splitter proportions
charliewales Jul 3, 2026
a63f337
feat(theme): enhance Code Theme Editor font customization and UI
charliewales Jul 3, 2026
21dc3cd
feat(editor): synchronize completer font and handle custom theme font…
charliewales Jul 3, 2026
b311329
fix(tabs): correct font application for tab labels
charliewales Jul 3, 2026
f6e94c7
feat(theme): add dedicated configuration for tab label font size
charliewales Jul 3, 2026
5da5c7e
style(theme): align numerical settings to the left
charliewales Jul 3, 2026
4a067ee
feat(theme): refine 'Multi Script Editor Light' theme colors
charliewales Jul 3, 2026
ad597d8
fix(font): use Qt dynamic monospace resolution as default font
charliewales Jul 3, 2026
6542884
feat(theme): dynamic 80% fallback for tab font size
charliewales Jul 3, 2026
b6bfce4
refactor: remove duplicate inline imports
charliewales Jul 3, 2026
a7d8f2b
feat(theme): make menu font override optional and disabled by default
charliewales Jul 3, 2026
22686bd
chore(ui): refine unsaved changes warning text
charliewales Jul 3, 2026
37827c8
feat: add status bar help text for all menu actions
charliewales Jul 3, 2026
b49c2b5
feat: add status bar info, new file filters and extra syntax highligh…
charliewales Jul 3, 2026
83fc192
fix: clear undo stack after initial load
charliewales Jul 3, 2026
79a374f
fix: comprehensive UI updates, text rendering, and whitespace syntax …
charliewales Jul 3, 2026
9bc14e6
feat(editor): improve status bar error clearing and Python linting be…
charliewales Jul 3, 2026
642acda
fix: resolve theme editor crash on initialization and support unknown…
charliewales Jul 3, 2026
2d56bd4
feat: add output text size option and fix preview tab font sizing
charliewales Jul 3, 2026
f6c7bc7
fix: docstring tooltip visibility and text size defaults
charliewales Jul 3, 2026
284accf
feat: enhance autocomplete behavior and add manual trigger
charliewales Jul 3, 2026
6274b06
feat: add Code Outline toggle button to tab bar
charliewales Jul 3, 2026
163974d
refactor: remove unused imports across core and widgets
charliewales Jul 4, 2026
2486b95
fix: resolve toolbar overlapping and background color issues in Houdi…
charliewales Jul 4, 2026
dea4fbd
refactor: remove unused os import in hqt
charliewales Jul 4, 2026
7deaf74
fix: add custom scroll arrow icons for QTabBar to fix Houdini display
charliewales Jul 4, 2026
5840ef3
feat: add status bar text size option to theme editor
charliewales Jul 4, 2026
018799b
feat: add menu text size option to theme editor
charliewales Jul 4, 2026
75514ce
feat: smart quote selection and toggle with Alt+Q
charliewales Jul 5, 2026
d725917
chore: remove inline import
charliewales Jul 5, 2026
90c206a
feat: add go to line feature with Ctrl+G shortcut
charliewales Jul 5, 2026
0823f16
fix: center cursor vertically on go to line
charliewales Jul 5, 2026
2cd7ef6
fix: sync completer and docstring font with editor and make docstring…
charliewales Jul 5, 2026
a145706
fix: preserve completer text size independent of editor font size
charliewales Jul 5, 2026
17019d1
feat: split theme font settings for UI elements
charliewales Jul 5, 2026
6527444
fix: trigger live preview update when theme font options change
charliewales Jul 5, 2026
965b555
feat: add menubar and statusbar to theme editor preview
charliewales Jul 5, 2026
0f1c755
refactor: improve theme editor UI grouping and alignment
charliewales Jul 5, 2026
d56a69a
feat: add export and import functionality for custom themes
charliewales Jul 5, 2026
3af5dda
refactor(ui): update action labels to sentence case
charliewales Jul 5, 2026
a5de63a
chore: CSS cleanup
charliewales Jul 6, 2026
689345f
docs: rename documentation.html to mse.html and update content
charliewales Jul 6, 2026
7bb3e73
refactor: move safe inline imports to top level
charliewales Jul 6, 2026
5325da6
chore: Code Theme Editor, adjust button labels
charliewales Jul 6, 2026
f101684
chore: adjust tab label context menu items, Rename tab shorcut Ctrl+R…
charliewales Jul 6, 2026
2080f29
feat: add Go to Symbol functionality with Ctrl+R
charliewales Jul 6, 2026
e7ff3b4
feat: add theme color and font support for Symbol Widget
charliewales Jul 6, 2026
5541678
fix: outline toggle update and sync symbol colors with theme
charliewales Jul 6, 2026
216ff98
feat: add symbols font size to theme editor and apply to symbol widget
charliewales Jul 6, 2026
b72162b
fix: correct symbol widget font fallback when theme font is disabled
charliewales Jul 6, 2026
2536de8
ui: adjust Code Theme Editor window size and UI labels
charliewales Jul 6, 2026
b726b6b
ui: adjust Code Theme Editor window size and UI labels
charliewales Jul 6, 2026
352b15a
Merge branch 'develop' of https://github.com/charliewales/pw_MultiScr…
charliewales Jul 6, 2026
8f288f5
refactor: extract and reuse symbol item generation logic
charliewales Jul 6, 2026
24fb329
fix: match outline widget CSS with input and output widgets
charliewales Jul 6, 2026
da5adb8
feat: add icons and implement actions for go to line, symbol and spac…
charliewales Jul 6, 2026
c45c226
fix: prevent toolbar borders from clipping in Linux X11
charliewales Jul 6, 2026
0c36364
fix: hide docstring tooltip on escape key press in completer
charliewales Jul 6, 2026
16f1030
fix: suppress autocomplete automatically showing after pressing escape
charliewales Jul 6, 2026
4fa4910
fix: set explicit icon size for QTabWidget corner buttons
charliewales Jul 6, 2026
d003668
docs: update mse.html with recent features and UI changes
charliewales Jul 6, 2026
8cb6000
fix(editor): apply active theme font to new tabs
charliewales Jul 6, 2026
d11b1e2
chore: remove inline imports
charliewales Jul 6, 2026
5a4ddf2
fix(tabs): prevent new tabs from being named False in PySide6
charliewales Jul 6, 2026
6b133e6
chore: bump patch version
charliewales Jul 6, 2026
de41564
feat: add support for Pixar USD files (*.usd, *.usda)
charliewales Jul 7, 2026
0ead6ac
feat: center editor vertically on outline item click
charliewales Jul 7, 2026
d7efedc
fix: apply syntax-specific theme colors to outline and symbol UI
charliewales Jul 7, 2026
26f3fb4
feat: improve outline and symbols styling
charliewales Jul 7, 2026
f0e7522
feat: persist Outline and editor splitter size
charliewales Jul 7, 2026
66ffdfe
feat: enable drag and drop to open files in new tabs
charliewales Jul 7, 2026
0025642
feat: dynamic width for symbol popup based on longest symbol name
charliewales Jul 7, 2026
e0fca20
refactor: clean up unused imports and fix python 3.12 warnings
charliewales Jul 8, 2026
325cbdd
fix: improve docstring tooltip behavior
charliewales Jul 8, 2026
c2212e9
fix: remove WindowStaysOnTopHint for Linux/X11
charliewales Jul 8, 2026
29173d4
fix: use Qt.Tool for completer window on Linux
charliewales Jul 8, 2026
a6c7595
fix: conditionally set docstring tooltip flags by OS
charliewales Jul 8, 2026
11d3e97
fix: update docstring tooltip position on completer move/resize
charliewales Jul 8, 2026
ee08cfc
style: fix missing border on docstring tooltip
charliewales Jul 8, 2026
55349b5
feat: ensure at least one tab remains open by creating a new one when…
charliewales Jul 8, 2026
a9da20e
fix: apply syntax highlighting when opening or saving a file
charliewales Jul 8, 2026
e8ddeaf
feat: add save script as action and update save session shortcut
charliewales Jul 8, 2026
e7fdc1c
fix: hide autocomplete and symbol window on editor focus out
charliewales Jul 8, 2026
0563ae2
fix: remove max-width limit on tabs
charliewales Jul 8, 2026
18f70a3
feat: add copy file path shortcut and fix context menu tab targeting
charliewales Jul 8, 2026
4c08b6a
fix: hide completer and tooltip when they lose focus
charliewales Jul 8, 2026
a94c6b8
chore: change copy file path shortcut
charliewales Jul 8, 2026
de07262
feat: add code snippets feature
charliewales Jul 8, 2026
1f5576f
feat: unify snippet workflows and improve UI
charliewales Jul 8, 2026
bd4f2a5
feat: add separator before close all tabs action
charliewales Jul 8, 2026
c6b011d
feat: migrate snippets settings to separate file and add confirmation…
charliewales Jul 8, 2026
28a878f
feat: append newline when inserting snippet
charliewales Jul 8, 2026
11c8061
feat: order snippets and separate defaults
charliewales Jul 8, 2026
afe7d37
feat: add import snippets option
charliewales Jul 8, 2026
59e3339
fix: resolve Nerd Font name inconsistencies between PySide2 and PySid…
charliewales Jul 8, 2026
84db2e8
fix: resolve font weight scaling mismatches between PySide2 and PySide6
charliewales Jul 8, 2026
8e9f996
chore: remove inline import
charliewales Jul 8, 2026
07241c8
fix: hide default snippets from delete menu and remove redundant warning
charliewales Jul 8, 2026
d2d5692
chore: remove some default snippets
charliewales Jul 8, 2026
5348e6a
docs: update mse.html with latest features and shortcuts
charliewales Jul 8, 2026
e65c3dd
fix: match snippet window font management and size with symbol window
charliewales Jul 8, 2026
9e94e33
fix: resolve DeprecationWarning for exec_ by using exec fallback
charliewales Jul 8, 2026
e740f7a
chore: conform quotes on default snippets
charliewales Jul 8, 2026
d8e2087
fix: correct duplicate and delete line actions and multi-line selection
charliewales Jul 8, 2026
ba907c3
fix: prevent toolbar icons from shrinking and add border radius
charliewales Jul 8, 2026
cd318a2
chore: tweak Basic WIndow snippet
charliewales Jul 9, 2026
f6bd2bf
feat: enable list navigation with Home/End/PageUp/PageDown in symbol …
charliewales Jul 9, 2026
16154e4
chore: hide snippets
charliewales Jul 9, 2026
ce3f1d8
feat: add dynamic window background color to themes
charliewales Jul 9, 2026
179e4ba
fix: use system default font for UI elements when theme font is disabled
charliewales Jul 9, 2026
9052796
fix: apply custom theme font to context menus in text widgets
charliewales Jul 9, 2026
da5c904
refactor: remove Multi Script Editor Light theme
charliewales Jul 9, 2026
014a261
fix: wrong css color
charliewales Jul 9, 2026
a178178
fix: resolve toolbar border rendering and icon transparency
charliewales Jul 9, 2026
ee18eb5
fix: restrict QToolButton styles to QToolBar to fix QTabBar scrollers
charliewales Jul 9, 2026
9a4699c
refactor: simplify Houdini integration and remove legacy hqt.py depen…
charliewales Jul 9, 2026
64adb5c
refactor: minor cleanups in managers and style
charliewales Jul 9, 2026
22b785a
fix: prevent host application freeze on generic show() call
charliewales Jul 9, 2026
ce33347
fix: apply custom theme styles globally across all DCCs
charliewales Jul 9, 2026
374d0b4
fix(ui): apply transparency to checked tool buttons
charliewales Jul 9, 2026
012ac6c
style: fix PySide6 stylesheet warnings and apply theme colors to widgets
charliewales Jul 9, 2026
e692c0b
fix: immediately update highlight line color when changing themes
charliewales Jul 9, 2026
f87844b
refactor: clean up and optimize application stylesheet
charliewales Jul 9, 2026
26e91ef
fix: resolve MultiScriptEditor window parenting issue in Houdini on L…
charliewales Jul 9, 2026
7ed485a
fix: under Houdini and Linux use a QDialog so widget parenting works …
charliewales Jul 9, 2026
9c48dd1
style: apply theme colors to QSplitter handles
charliewales Jul 9, 2026
d07836e
style: add QMenu::tearoff styling for floating menu separator
charliewales Jul 9, 2026
8a512fa
chore: css tweaks
charliewales Jul 9, 2026
cc26340
fix: correct QGroupBox title overlapping with internal content
charliewales Jul 9, 2026
a84419f
refactor: centralize stylesheets and fix tab theming
charliewales Jul 9, 2026
a3d62c1
feat: dynamically derive default tab colors from active theme palette
charliewales Jul 9, 2026
9b2a1eb
ui: close tab grey icon
charliewales Jul 9, 2026
67c950b
fix: preview editor background color not matching theme
charliewales Jul 9, 2026
8c4748c
style: update QCheckBox indicator and checked styles in style.css
charliewales Jul 9, 2026
0723ec9
ui: css tweaks
charliewales Jul 9, 2026
f189e71
ui: more css tweaks
charliewales Jul 9, 2026
7f6ecb3
ui: add_tab.png convert to grayscale
charliewales Jul 9, 2026
60e40bc
feat(ui): sort custom themes alphabetically in Theme Editor list
charliewales Jul 9, 2026
5fc2244
feat(ui): sort custom themes alphabetically in main Theme menu
charliewales Jul 9, 2026
c54934a
fix: apply theme colors to window background and menubar
charliewales Jul 10, 2026
ee39e57
ui: set outline spacing
charliewales Jul 10, 2026
4aa8578
refactor(themes): explicitly define tab colors in all themes
charliewales Jul 10, 2026
f739937
refactor(themes): replace dynamic tab color fallback with explicit th…
charliewales Jul 10, 2026
1a6f921
style: remove custom close-button icons from tabs
charliewales Jul 10, 2026
5d01a19
style(themes): apply highlight_line color to active tabs
charliewales Jul 10, 2026
2753af4
UI: Apply theme styling to entire Code Theme Editor dialog
charliewales Jul 10, 2026
1eea3ad
Refactor: Remove redundant stylesheet setting in Code Theme Editor
charliewales Jul 10, 2026
4402098
Fix Theme Editor initial styling and window size issues
charliewales Jul 10, 2026
25396d9
feat: add Fluorescent theme and fix output_background css rule
charliewales Jul 10, 2026
3a359e5
ui: css tweaks
charliewales Jul 10, 2026
a9f4185
UI: Update outline filter background color to use outline_background
charliewales Jul 10, 2026
04c932f
chore: remove duplicated code
charliewales Jul 10, 2026
23caf25
feat: Use selected text as initial search term in Find and Replace di…
charliewales Jul 10, 2026
418858e
feat: Auto select all occurrences feature and fix autocomplete trigge…
charliewales Jul 10, 2026
cfdb6b3
fix: Remove hallucinated syntax_timer from inputWidget.py
charliewales Jul 10, 2026
b485dc7
Fix multicursor auto-selection bugs and status bar message updates
charliewales Jul 10, 2026
9a50e6a
UI: Move occurrences message to the right side of status bar
charliewales Jul 10, 2026
d531a74
UI: Standardize QTabBar close button styling across OS and PySide ver…
charliewales Jul 10, 2026
11dd60d
ui: update close tab icons
charliewales Jul 10, 2026
8911233
Update status bar widgets order
charliewales Jul 10, 2026
6370c8b
feat: differentiate message for auto and manual occurrences selection
charliewales Jul 10, 2026
66ca1e2
ui: default themes label text tweaks
charliewales Jul 10, 2026
ad49857
UI: Update theme editor preview status bar to match main window
charliewales Jul 10, 2026
2d10fde
Fix: Resolve context detection circular import and path resolution
charliewales Jul 10, 2026
43e90af
chore: do not user Documents for settings
charliewales Jul 10, 2026
bc7bcc0
Fix occurrences label font in status bar to match current theme
charliewales Jul 10, 2026
5841147
fix(theme-editor): reset font size controls on font change
charliewales Jul 10, 2026
9af4f27
refactor(theme): consolidate size menu and reset functions
charliewales Jul 10, 2026
4cf2dc8
fix(theme): prevent QFont zero size error in themeEditor
charliewales Jul 10, 2026
d804f27
chore: menu size default is 90% of editor size
charliewales Jul 10, 2026
1460c7d
ui: css tweaks
charliewales Jul 10, 2026
dc2d9ee
fix(ui): apply theme colors synchronously to outline filter palette t…
charliewales Jul 10, 2026
1be614a
ui: css tweaks
charliewales Jul 10, 2026
7f37470
ui: css tweaks
charliewales Jul 10, 2026
c1f5467
feat(theme): add line_num_text color for line number bar
charliewales Jul 11, 2026
e3c4e32
style(ui): update default widget font sizes to 90% of theme font size
charliewales Jul 11, 2026
dbb69dc
feat: Add line numbers font size configuration to theme editor
charliewales Jul 11, 2026
8960e93
ui: css tweaks
charliewales Jul 11, 2026
b0c0189
feat: add status_bar_text color control to theme editor
charliewales Jul 11, 2026
5da0fb4
ui: css tweaks
charliewales Jul 11, 2026
262cfd3
fix(theme): prevent auto-applying imported themes and update editor U…
charliewales Jul 11, 2026
0c6e4ef
ui: css tweaks
charliewales Jul 11, 2026
65bd3e0
style: fix QComboBox item selection and hover colors for PySide2 and …
charliewales Jul 11, 2026
c8a41de
fix(vendor): suppress DLL load failed warnings in Qt.py
charliewales Jul 11, 2026
d40c183
Update readme.md
charliewales Jul 11, 2026
16b16bf
fix(outline): clear outline items when syntax errors are detected
charliewales Jul 11, 2026
5a143c5
Merge branch 'develop'
charliewales Jul 11, 2026
3199d6e
ui: reorganise Edit menu items
charliewales Jul 11, 2026
34412d2
feat: add trim trailing whitespace options and auto-trim functionality
charliewales Jul 11, 2026
9df19fa
docs: update mse.html with trailing whitespace, layout, and theme con…
charliewales Jul 11, 2026
0467128
Merge branch 'develop'
charliewales Jul 11, 2026
c928cca
fix: save trim_auto_whitespace setting properly
charliewales Jul 11, 2026
cb9831a
Merge branch 'develop'
charliewales Jul 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,6 @@ todo
tmp
_backup
_tmp
*.pyc
.history/
.agents/
21 changes: 21 additions & 0 deletions license.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 Carlos Rico Adega

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
48 changes: 37 additions & 11 deletions multi_script_editor/__init__.py
Original file line number Diff line number Diff line change
@@ -1,37 +1,63 @@
import os, sys
import os
import sys

root = os.path.dirname(__file__)
if not root in sys.path:
sys.path.append(root)


# HOUDINI
def showHoudini(clear=False, ontop=False, name=None, floating=False, position=(), size=(),
pane=None, replacePyPanel=False, hideTitleMenu=True):
def showHoudini(*args, **kwargs):
"""
This method use hqt module. Download it before
Launch Multi Script Editor in Houdini
"""
from .managers import _houdini
reload(_houdini)
_houdini.show(clear=clear, ontop=ontop, name=name, floating=floating, position=position,
size=size, pane=pane, replacePyPanel=replacePyPanel, hideTitleMenu=hideTitleMenu)
return _houdini.show(*args, **kwargs)


# NUKE
def showNuke(panel=False):
"""
Launch Multi Script Editor in Nuke
"""
from .managers import _nuke
reload(_nuke)

_nuke.show(panel)


# MAYA
def showMaya(dock=False):
"""
Launch Multi Script Editor in Maya
"""
from .managers import _maya
reload (_maya)

_maya.show(dock)


# 3DSMAX PLUS
def show3DSMax():
"""
Launch Multi Script Editor in 3DSMax
"""
sys.argv = []
from .managers import _3dsmax
reload (_3dsmax)
_3dsmax.show()

_3dsmax.show()


def show(*args, **kwargs):
from . import managers
if managers.context == 'hou':
return showHoudini(*args, **kwargs)
elif managers.context == 'maya':
# Maya's show takes 'dock' kwarg
return showMaya(kwargs.get('dock', False))
elif managers.context == 'nuke':
# Nuke's show takes 'panel' kwarg
return showNuke(kwargs.get('panel', False))
elif managers.context == 'max':
return show3DSMax()

import scriptEditor
scriptEditor.show()
1 change: 1 addition & 0 deletions multi_script_editor/core/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Core package for Multi Script Editor
102 changes: 102 additions & 0 deletions multi_script_editor/core/autocomplete_provider.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import managers

class CompletionItem:
def __init__(self, name, complete, comp_type, docstring_val="", prefix_length=0):
self.name = name
self.complete = complete
self.type = comp_type
self._docstring = docstring_val
self.prefix_length = prefix_length

def get_completion_prefix_length(self):
return self.prefix_length

def docstring(self):
return self._docstring


class AutocompleteProvider:
def __init__(self):
# Lazy load jedi to avoid heavy startup overhead if possible
self._jedi = None

def _get_jedi(self):
if self._jedi is None:
import jedi
self._jedi = jedi
return self._jedi

def get_completions(self, text, line, column, namespace=None, fuzzy=True, context=None):
"""
Returns a list of CompletionItem objects.
"""
comp_items = []
context_completer = False

# 1. Try Context-Specific Completers (e.g., Maya, Nuke specific cmds)
if context and context in managers.contextCompleters:
current_line_text = text.split('\n')[line - 1] if text else ''
# We don't have exact cursor offset here easily, but managers used it roughly
# The original code passed `line` string to contextCompleters.
comp, extra = managers.contextCompleters[context](current_line_text, namespace)
if comp or extra:
context_completer = True
# Format them as CompletionItem
if comp:
for c in comp:
comp_items.append(CompletionItem(c.name, getattr(c, 'complete', ''), getattr(c, 'type', 'statement'), c.docstring() if hasattr(c, 'docstring') else ''))
if extra:
for c in extra:
comp_items.append(CompletionItem(c.name, getattr(c, 'complete', ''), getattr(c, 'type', 'statement'), c.docstring() if hasattr(c, 'docstring') else ''))

if comp_items:
return comp_items

# 2. Fallback to Jedi Autocompletion
if not context_completer:
jedi = self._get_jedi()

# Prepend autoImports if necessary
offs = 0
if context and context in managers.autoImport:
autoImp = managers.autoImport.get(context, '')
text = autoImp + text
offs = len(autoImp.split('\n')) - 1

# Shift the line number due to autoImports
jedi_line = line + offs

try:
if namespace:
script = jedi.Interpreter(text, namespaces=[namespace])
else:
script = jedi.Script(code=text)

jedi_comps = script.complete(line=jedi_line, column=column, fuzzy=fuzzy)

for c in jedi_comps:
# Filter out 'mro' as original code did
if c.name == 'mro':
continue

doc = ''
try:
doc = c.docstring()
except Exception:
pass

prefix_len = 0
if hasattr(c, 'get_completion_prefix_length'):
prefix_len = c.get_completion_prefix_length()

comp_items.append(CompletionItem(
name=c.name,
complete=c.complete,
comp_type=c.type,
docstring_val=doc,
prefix_length=prefix_len
))
except Exception:
pass

return comp_items
91 changes: 91 additions & 0 deletions multi_script_editor/core/base_text_widget.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
from vendor.Qt.QtGui import QFont, QTextOption, QFontDatabase
from vendor.Qt.QtWidgets import QTextEdit

class BaseTextWidgetMixin:
"""
Mixin class that provides common text editing functionalities
such as font size manipulation, word wrap, and whitespace rendering.
Expects to be mixed into a QTextEdit or QTextBrowser.
"""
def changeFontSize(self, up):
f = self.font()
size = f.pointSize()
if up:
size = min(30, size + 1)
else:
size = max(8, size - 1)
f.setPointSize(size)
self.setFont(f)

def setTextEditFontSize(self, size):
f = self.font()
f.setPointSize(size)
self.setFont(f)

def wordWrap(self, state):
if state:
self.setLineWrapMode(QTextEdit.WidgetWidth)
else:
self.setLineWrapMode(QTextEdit.NoWrap)

def set_font(self, font):
self.setFont(font)

def render_whitespace(self, state):
text_option = self.document().defaultTextOption()
if state:
text_option.setFlags(text_option.flags() | QTextOption.ShowTabsAndSpaces)
else:
text_option.setFlags(text_option.flags() & ~QTextOption.ShowTabsAndSpaces)
self.document().setDefaultTextOption(text_option)

def set_start_font(self, font_d=None):
if not font_d:
return
family = font_d.get('family', 'monospace')
pointSize = font_d.get('pointSize', 14)
italic = font_d.get('italic', False)
weight = font_d.get('weight', 1)

# Cross-compatibility patch for PySide2 (NF) vs PySide6 (Nerd Font)
try:
families = QFontDatabase.families()
except TypeError:
db = QFontDatabase()
families = db.families()

if family not in families:
variations = [
family.replace(" NFM", " Nerd Font Mono"),
family.replace(" Nerd Font Mono", " NFM"),
family.replace(" NFP", " Nerd Font Propo"),
family.replace(" Nerd Font Propo", " NFP"),
family.replace(" NF", " Nerd Font"),
family.replace(" Nerd Font", " NF"),
family.replace(" Nerd Font Mono", " Nerd Font"),
family.replace(" Nerd Font Propo", " Nerd Font"),
family.replace(" Nerd Font", " Nerd Font Mono"),
family.replace(" Nerd Font", " Nerd Font Propo")
]
for alt in variations:
if alt in families:
family = alt
break

editor_font = QFont(family, pointSize, weight, italic)
editor_font.setStyleHint(QFont.Monospace)
self.setFont(editor_font)

if hasattr(self, 'completer') and self.completer:
self.completer.setFont(editor_font)
if hasattr(self.completer, 'doc_tooltip') and self.completer.doc_tooltip:
self.completer.doc_tooltip.setFont(editor_font)

def contextMenuEvent(self, event):
menu = self.createStandardContextMenu()
main_win = self.window()
if hasattr(main_win, 'menubar'):
menu.setFont(main_win.menubar.font())
menu.setStyleSheet(main_win.menubar.styleSheet())
menu.exec_(event.globalPos())
del menu
60 changes: 60 additions & 0 deletions multi_script_editor/core/execution_manager.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import sys
import traceback
from vendor.Qt.QtCore import QCoreApplication

class StdoutProxy:
def __init__(self, write_func):
self.write_func = write_func
self.skip = False

def write(self, text):
if not self.skip:
stripped_text = text.rstrip('\n')
self.write_func(stripped_text)
# Process events so UI doesn't freeze entirely if output is heavy
QCoreApplication.processEvents()
self.skip = not self.skip

def flush(self):
pass


class ExecutionManager:
def __init__(self):
# We can store execution context or state here
pass

def run_command(self, command, namespace, output_callback, close_callback):
"""
Executes a python command within the given namespace.
Output is redirected to output_callback.
If a SystemExit is raised, close_callback is called.
"""
if not command:
return

tmp_stdout = sys.stdout
sys.stdout = StdoutProxy(output_callback)

try:
try:
# Try evaluating first to see if it's an expression that returns a value
result = eval(command, namespace, namespace)
if result is not None:
output_callback(repr(result))
except SyntaxError:
# If it's a statement, exec it
exec(command, namespace)
except SystemExit:
close_callback()
except:
traceback_lines = traceback.format_exc().split('\n')
# Remove eval/exec internal traceback lines for cleaner output
try:
for i in (3, 2, 1, -1):
traceback_lines.pop(i)
except IndexError:
pass
output_callback('\n'.join(traceback_lines))
finally:
sys.stdout = tmp_stdout
15 changes: 15 additions & 0 deletions multi_script_editor/core/linter_provider.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class LinterProvider:
def check_syntax(self, code):
"""
Validates the python syntax using compile().
Returns a dictionary of errors: {line_number: error_message}
"""
syntax_errors = {}
if code.strip():
try:
compile(code.encode('utf-8'), '<string>', 'exec')
except SyntaxError as e:
syntax_errors[e.lineno] = e.msg
except Exception:
pass
return syntax_errors
Loading