lui适配
This commit is contained in:
parent
31ab66b95c
commit
1223746dee
@ -79,7 +79,7 @@ Size=93,65
|
|||||||
Collapsed=0
|
Collapsed=0
|
||||||
|
|
||||||
[Window][新建项目]
|
[Window][新建项目]
|
||||||
Pos=724,358
|
Pos=725,358
|
||||||
Size=400,300
|
Size=400,300
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
|
|
||||||
@ -150,10 +150,9 @@ Size=101,226
|
|||||||
Collapsed=0
|
Collapsed=0
|
||||||
|
|
||||||
[Window][LUI编辑器]
|
[Window][LUI编辑器]
|
||||||
Pos=2214,20
|
Pos=160,44
|
||||||
Size=346,1331
|
Size=346,1331
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
DockId=0x00000003,1
|
|
||||||
|
|
||||||
[Window][LUI测试控制面板]
|
[Window][LUI测试控制面板]
|
||||||
Pos=6,10
|
Pos=6,10
|
||||||
|
|||||||
@ -1,5 +1,8 @@
|
|||||||
"""Shared LUI bootstrap and imports."""
|
"""Shared LUI bootstrap and imports."""
|
||||||
|
|
||||||
|
import importlib
|
||||||
|
import importlib.machinery
|
||||||
|
import importlib.util
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@ -25,30 +28,142 @@ if hasattr(os, "add_dll_directory"):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Warning: Failed to add DLL directory: {e}")
|
print(f"Warning: Failed to add DLL directory: {e}")
|
||||||
|
|
||||||
try:
|
LUI_IMPORT_DETAILS = ""
|
||||||
import lui
|
LUI_MODULE_SOURCE = ""
|
||||||
panda3d.lui = lui
|
|
||||||
sys.modules["panda3d.lui"] = lui
|
|
||||||
|
|
||||||
from Builtin.LUIRegion import LUIRegion
|
|
||||||
from Builtin.LUIInputHandler import LUIInputHandler
|
def _format_import_failure(prefix, error):
|
||||||
from Builtin.LUIButton import LUIButton
|
error_name = type(error).__name__
|
||||||
from Builtin.LUILabel import LUILabel
|
return f"{prefix}: {error_name}: {error}"
|
||||||
from Builtin.LUIInputField import LUIInputField
|
|
||||||
from Builtin.LUISlider import LUISlider
|
|
||||||
from Builtin.LUIFrame import LUIFrame
|
def _iter_local_lui_binaries():
|
||||||
from Builtin.LUISkin import LUIDefaultSkin
|
seen = set()
|
||||||
from Builtin.LUISprite import LUISprite
|
for suffix in importlib.machinery.EXTENSION_SUFFIXES:
|
||||||
from Builtin.LUIObject import LUIObject
|
candidate = UI_DIR / f"lui{suffix}"
|
||||||
from Builtin.LUICheckbox import LUICheckbox
|
if candidate.exists():
|
||||||
from Builtin.LUIProgressbar import LUIProgressbar
|
resolved = candidate.resolve()
|
||||||
from Builtin.LUISelectbox import LUISelectbox
|
if resolved not in seen:
|
||||||
from Builtin.LUIScrollableRegion import LUIScrollableRegion
|
seen.add(resolved)
|
||||||
from Builtin.LUITabbedFrame import LUITabbedFrame
|
yield resolved
|
||||||
from Builtin.LUIVerticalLayout import LUIVerticalLayout
|
|
||||||
from Builtin.LUIHorizontalLayout import LUIHorizontalLayout
|
if os.name == "nt":
|
||||||
except ImportError as e:
|
patterns = ("lui*.pyd", "lui*.dll")
|
||||||
print(f"Error: Failed to import LUI: {e}")
|
elif sys.platform == "darwin":
|
||||||
|
patterns = ("lui*.so", "lui*.dylib")
|
||||||
|
else:
|
||||||
|
patterns = ("lui*.so",)
|
||||||
|
|
||||||
|
for pattern in patterns:
|
||||||
|
for candidate in sorted(UI_DIR.glob(pattern)):
|
||||||
|
resolved = candidate.resolve()
|
||||||
|
if resolved not in seen:
|
||||||
|
seen.add(resolved)
|
||||||
|
yield resolved
|
||||||
|
|
||||||
|
|
||||||
|
def _load_lui_from_binary(binary_path):
|
||||||
|
spec = importlib.util.spec_from_file_location("lui", str(binary_path))
|
||||||
|
if spec is None or spec.loader is None:
|
||||||
|
raise ImportError(f"无法从二进制创建模块规范: {binary_path}")
|
||||||
|
module = importlib.util.module_from_spec(spec)
|
||||||
|
spec.loader.exec_module(module)
|
||||||
|
return module
|
||||||
|
|
||||||
|
|
||||||
|
def _bootstrap_lui_module():
|
||||||
|
failures = []
|
||||||
|
|
||||||
|
cached = sys.modules.get("lui") or sys.modules.get("panda3d.lui")
|
||||||
|
if cached is not None:
|
||||||
|
return cached, "sys.modules"
|
||||||
|
|
||||||
|
module_candidates = []
|
||||||
|
env_module = os.environ.get("EG_LUI_MODULE", "").strip()
|
||||||
|
if env_module:
|
||||||
|
for name in (part.strip() for part in env_module.split(",")):
|
||||||
|
if name:
|
||||||
|
module_candidates.append(name)
|
||||||
|
|
||||||
|
for default_name in ("lui", "panda3d.lui"):
|
||||||
|
if default_name not in module_candidates:
|
||||||
|
module_candidates.append(default_name)
|
||||||
|
|
||||||
|
for module_name in module_candidates:
|
||||||
|
try:
|
||||||
|
module = importlib.import_module(module_name)
|
||||||
|
return module, f"module:{module_name}"
|
||||||
|
except Exception as exc:
|
||||||
|
failures.append(_format_import_failure(f"import {module_name}", exc))
|
||||||
|
|
||||||
|
env_binary = os.environ.get("EG_LUI_BINARY", "").strip()
|
||||||
|
explicit_paths = []
|
||||||
|
if env_binary:
|
||||||
|
raw_path = Path(env_binary).expanduser()
|
||||||
|
explicit_paths.append(raw_path if raw_path.is_absolute() else (UI_DIR / raw_path))
|
||||||
|
explicit_paths.append(raw_path)
|
||||||
|
|
||||||
|
checked = set()
|
||||||
|
for path_candidate in explicit_paths:
|
||||||
|
resolved = path_candidate.resolve()
|
||||||
|
if resolved in checked:
|
||||||
|
continue
|
||||||
|
checked.add(resolved)
|
||||||
|
if not resolved.exists():
|
||||||
|
failures.append(f"binary path not found: {resolved}")
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
module = _load_lui_from_binary(resolved)
|
||||||
|
return module, f"binary:{resolved}"
|
||||||
|
except Exception as exc:
|
||||||
|
failures.append(_format_import_failure(f"load {resolved.name}", exc))
|
||||||
|
|
||||||
|
for binary_path in _iter_local_lui_binaries():
|
||||||
|
try:
|
||||||
|
module = _load_lui_from_binary(binary_path)
|
||||||
|
return module, f"binary:{binary_path}"
|
||||||
|
except Exception as exc:
|
||||||
|
failures.append(_format_import_failure(f"load {binary_path.name}", exc))
|
||||||
|
|
||||||
|
return None, " | ".join(failures)
|
||||||
|
|
||||||
|
|
||||||
|
lui = None
|
||||||
|
try:
|
||||||
|
lui, LUI_MODULE_SOURCE = _bootstrap_lui_module()
|
||||||
|
if lui is not None:
|
||||||
|
panda3d.lui = lui
|
||||||
|
sys.modules["panda3d.lui"] = lui
|
||||||
|
if "lui" not in sys.modules:
|
||||||
|
sys.modules["lui"] = lui
|
||||||
|
|
||||||
|
from Builtin.LUIRegion import LUIRegion
|
||||||
|
from Builtin.LUIInputHandler import LUIInputHandler
|
||||||
|
from Builtin.LUIButton import LUIButton
|
||||||
|
from Builtin.LUILabel import LUILabel
|
||||||
|
from Builtin.LUIInputField import LUIInputField
|
||||||
|
from Builtin.LUISlider import LUISlider
|
||||||
|
from Builtin.LUIFrame import LUIFrame
|
||||||
|
from Builtin.LUISkin import LUIDefaultSkin
|
||||||
|
from Builtin.LUISprite import LUISprite
|
||||||
|
from Builtin.LUIObject import LUIObject
|
||||||
|
from Builtin.LUICheckbox import LUICheckbox
|
||||||
|
from Builtin.LUIProgressbar import LUIProgressbar
|
||||||
|
from Builtin.LUISelectbox import LUISelectbox
|
||||||
|
from Builtin.LUIScrollableRegion import LUIScrollableRegion
|
||||||
|
from Builtin.LUITabbedFrame import LUITabbedFrame
|
||||||
|
from Builtin.LUIVerticalLayout import LUIVerticalLayout
|
||||||
|
from Builtin.LUIHorizontalLayout import LUIHorizontalLayout
|
||||||
|
else:
|
||||||
|
raise ImportError(LUI_MODULE_SOURCE or "No available LUI module.")
|
||||||
|
except Exception as e:
|
||||||
|
detail = str(LUI_MODULE_SOURCE or "").strip()
|
||||||
|
if detail:
|
||||||
|
LUI_IMPORT_DETAILS = detail
|
||||||
|
print(f"Error: Failed to import LUI: {detail}")
|
||||||
|
else:
|
||||||
|
LUI_IMPORT_DETAILS = str(e)
|
||||||
|
print(f"Error: Failed to import LUI: {e}")
|
||||||
lui = None
|
lui = None
|
||||||
LUIRegion = None
|
LUIRegion = None
|
||||||
LUIInputHandler = None
|
LUIInputHandler = None
|
||||||
|
|||||||
@ -17,6 +17,7 @@ from ui.LUI.lui_shared import (
|
|||||||
LUIRegion,
|
LUIRegion,
|
||||||
LUISlider,
|
LUISlider,
|
||||||
LUISprite,
|
LUISprite,
|
||||||
|
LUI_IMPORT_DETAILS,
|
||||||
NodePath,
|
NodePath,
|
||||||
Path,
|
Path,
|
||||||
lui,
|
lui,
|
||||||
@ -41,7 +42,11 @@ class LUIManager(LUIManagerInteractionMixin, LUIManagerEditorMixin):
|
|||||||
self._selected_type_index = 0
|
self._selected_type_index = 0
|
||||||
|
|
||||||
if not self.lui_enabled:
|
if not self.lui_enabled:
|
||||||
print("LUI is not available, LUIManager will be disabled.")
|
details = str(LUI_IMPORT_DETAILS or "").strip()
|
||||||
|
if details:
|
||||||
|
print(f"LUI is not available, LUIManager will be disabled. {details}")
|
||||||
|
else:
|
||||||
|
print("LUI is not available, LUIManager will be disabled.")
|
||||||
return
|
return
|
||||||
|
|
||||||
# 1. 优先注册中文字体
|
# 1. 优先注册中文字体
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user