fix: fix previous commit remained issues.

- vt encodings in list showcase now works.
- modify some usage of message_box to Operator.report to make it more like blender suggested.
This commit is contained in:
yyc12345 2025-01-08 20:20:10 +08:00
parent 0862ecd269
commit 77315ffbea
8 changed files with 127 additions and 121 deletions

View File

@ -1,5 +1,5 @@
import bpy import bpy
from . import PROP_preferences, UTIL_functions, UTIL_file_browser, UTIL_blender_mesh, UTIL_icons_manager, UTIL_ioport_shared from . import PROP_preferences, UTIL_functions, UTIL_file_browser, UTIL_blender_mesh, UTIL_ioport_shared
class BBP_OT_export_bmfile(bpy.types.Operator, UTIL_file_browser.ExportBmxFile, UTIL_ioport_shared.ExportParams): class BBP_OT_export_bmfile(bpy.types.Operator, UTIL_file_browser.ExportBmxFile, UTIL_ioport_shared.ExportParams):
"""Save a Ballance Map File (BM File Spec 1.4)""" """Save a Ballance Map File (BM File Spec 1.4)"""
@ -12,18 +12,14 @@ class BBP_OT_export_bmfile(bpy.types.Operator, UTIL_file_browser.ExportBmxFile,
return PROP_preferences.get_raw_preferences().has_valid_blc_tex_folder() return PROP_preferences.get_raw_preferences().has_valid_blc_tex_folder()
def execute(self, context): def execute(self, context):
UTIL_functions.message_box( self.report({'ERROR'}, 'This function not supported yet.')
('This function not supported yet.', ), # self.report({'INFO'}, "BM File Exporting Finished.")
'No Implement',
UTIL_icons_manager.BlenderPresetIcons.Error.value
)
self.report({'INFO'}, "BM File Exporting Finished.")
return {'FINISHED'} return {'FINISHED'}
def draw(self, context): def draw(self, context):
layout = self.layout layout = self.layout
layout.label(text = 'Export Target') layout.label(text = 'Export Target')
self.draw_export_params(layout.box()) self.draw_export_params(context, layout.box())
def register() -> None: def register() -> None:
bpy.utils.register_class(BBP_OT_export_bmfile) bpy.utils.register_class(BBP_OT_export_bmfile)

View File

@ -2,7 +2,7 @@ import bpy, mathutils
from bpy_extras.wm_utils.progress_report import ProgressReport from bpy_extras.wm_utils.progress_report import ProgressReport
import tempfile, os, typing import tempfile, os, typing
from . import PROP_preferences, UTIL_ioport_shared from . import PROP_preferences, UTIL_ioport_shared
from . import UTIL_virtools_types, UTIL_functions, UTIL_file_browser, UTIL_blender_mesh, UTIL_ballance_texture, UTIL_icons_manager, UTIL_naming_convension from . import UTIL_virtools_types, UTIL_functions, UTIL_file_browser, UTIL_blender_mesh, UTIL_ballance_texture, UTIL_naming_convension
from . import PROP_virtools_group, PROP_virtools_material, PROP_virtools_mesh, PROP_virtools_texture, PROP_virtools_light from . import PROP_virtools_group, PROP_virtools_material, PROP_virtools_mesh, PROP_virtools_texture, PROP_virtools_light
from .PyBMap import bmap_wrapper as bmap from .PyBMap import bmap_wrapper as bmap
@ -20,30 +20,28 @@ class BBP_OT_export_virtools(bpy.types.Operator, UTIL_file_browser.ExportVirtool
def execute(self, context): def execute(self, context):
# check selecting first # check selecting first
objls: tuple[bpy.types.Object] | None = self.general_get_export_objects() objls: tuple[bpy.types.Object] | None = self.general_get_export_objects(context)
if objls is None: if objls is None:
UTIL_functions.message_box( self.report({'ERROR'}, 'No selected target!')
('No selected target!', ),
'Lost Parameters',
UTIL_icons_manager.BlenderPresetIcons.Error.value
)
return {'CANCELLED'} return {'CANCELLED'}
# check texture save option to prevent real stupid user. # check texture save option to avoid real stupid user.
texture_save_opt = self.general_get_texture_save_opt() texture_save_opt = self.general_get_texture_save_opt()
if texture_save_opt == UTIL_virtools_types.CK_TEXTURE_SAVEOPTIONS.CKTEXTURE_USEGLOBAL: if texture_save_opt == UTIL_virtools_types.CK_TEXTURE_SAVEOPTIONS.CKTEXTURE_USEGLOBAL:
UTIL_functions.message_box( self.report({'ERROR'}, 'You can not specify "Use Global" as global texture save option!')
('You can not specify "Use Global" as global texture save option!', ), return {'CANCELLED'}
'Wrong Parameters',
UTIL_icons_manager.BlenderPresetIcons.Error.value # check whether encoding list is empty to avoid real stupid user.
) encodings = self.general_get_vt_encodings(context)
if len(encodings) == 0:
self.report({'ERROR'}, 'You must specify at least one encoding for file saving (e.g. cp1252, gb2312)!')
return {'CANCELLED'} return {'CANCELLED'}
# start exporting # start exporting
with UTIL_ioport_shared.ExportEditModeBackup() as editmode_guard: with UTIL_ioport_shared.ExportEditModeBackup() as editmode_guard:
_export_virtools( _export_virtools(
self.general_get_filename(), self.general_get_filename(),
self.general_get_vt_encodings(), encodings,
texture_save_opt, texture_save_opt,
self.general_get_use_compress(), self.general_get_use_compress(),
self.general_get_compress_level(), self.general_get_compress_level(),
@ -57,8 +55,8 @@ class BBP_OT_export_virtools(bpy.types.Operator, UTIL_file_browser.ExportVirtool
def draw(self, context): def draw(self, context):
layout = self.layout layout = self.layout
self.draw_export_params(layout) self.draw_export_params(context, layout)
self.draw_virtools_params(layout, False) self.draw_virtools_params(context, layout, False)
self.draw_ballance_params(layout, False) self.draw_ballance_params(layout, False)
_TObj3dPair = tuple[bpy.types.Object, bmap.BM3dObject] _TObj3dPair = tuple[bpy.types.Object, bmap.BM3dObject]

View File

@ -1,5 +1,5 @@
import bpy import bpy
from . import PROP_preferences, UTIL_functions, UTIL_file_browser, UTIL_blender_mesh, UTIL_icons_manager, UTIL_ioport_shared from . import PROP_preferences, UTIL_functions, UTIL_file_browser, UTIL_blender_mesh, UTIL_ioport_shared
class BBP_OT_import_bmfile(bpy.types.Operator, UTIL_file_browser.ImportBmxFile, UTIL_ioport_shared.ImportParams): class BBP_OT_import_bmfile(bpy.types.Operator, UTIL_file_browser.ImportBmxFile, UTIL_ioport_shared.ImportParams):
"""Load a Ballance Map File (BM File Spec 1.4)""" """Load a Ballance Map File (BM File Spec 1.4)"""
@ -12,12 +12,8 @@ class BBP_OT_import_bmfile(bpy.types.Operator, UTIL_file_browser.ImportBmxFile,
return PROP_preferences.get_raw_preferences().has_valid_blc_tex_folder() return PROP_preferences.get_raw_preferences().has_valid_blc_tex_folder()
def execute(self, context): def execute(self, context):
UTIL_functions.message_box( self.report({'ERROR'}, 'This function not supported yet.')
('This function not supported yet.', ), # self.report({'INFO'}, "BM File Importing Finished.")
'No Implement',
UTIL_icons_manager.BlenderPresetIcons.Error.value
)
self.report({'INFO'}, "BM File Importing Finished.")
return {'FINISHED'} return {'FINISHED'}
def draw(self, context): def draw(self, context):

View File

@ -19,9 +19,15 @@ class BBP_OT_import_virtools(bpy.types.Operator, UTIL_file_browser.ImportVirtool
and bmap.is_bmap_available()) and bmap.is_bmap_available())
def execute(self, context): def execute(self, context):
# check whether encoding list is empty to avoid real stupid user.
encodings = self.general_get_vt_encodings(context)
if len(encodings) == 0:
self.report({'ERROR'}, 'You must specify at least one encoding for file loading (e.g. cp1252, gb2312)!')
return {'CANCELLED'}
_import_virtools( _import_virtools(
self.general_get_filename(), self.general_get_filename(),
self.general_get_vt_encodings(), encodings,
self.general_get_conflict_resolver() self.general_get_conflict_resolver()
) )
self.report({'INFO'}, "Virtools File Importing Finished.") self.report({'INFO'}, "Virtools File Importing Finished.")
@ -30,7 +36,7 @@ class BBP_OT_import_virtools(bpy.types.Operator, UTIL_file_browser.ImportVirtool
def draw(self, context): def draw(self, context):
layout = self.layout layout = self.layout
self.draw_import_params(layout) self.draw_import_params(layout)
self.draw_virtools_params(layout, True) self.draw_virtools_params(context, layout, True)
self.draw_ballance_params(layout, True) self.draw_ballance_params(layout, True)
def _import_virtools(file_name_: str, encodings_: tuple[str], resolver: UTIL_ioport_shared.ConflictResolver) -> None: def _import_virtools(file_name_: str, encodings_: tuple[str], resolver: UTIL_ioport_shared.ConflictResolver) -> None:

View File

@ -19,13 +19,10 @@ class BBP_OT_rail_uv(bpy.types.Operator):
def execute(self, context): def execute(self, context):
# check material # check material
mtl: bpy.types.Material = PROP_ptrprop_resolver.PtrPropResolver.get_rail_uv_material() ptrprops = PROP_ptrprop_resolver.PropsVisitor(context.scene)
mtl: bpy.types.Material = ptrprops.get_rail_uv_material()
if mtl is None: if mtl is None:
UTIL_functions.message_box( self.report({'ERROR'}, "Specified material is empty.")
("No specific material", ),
"Lost Parameter",
UTIL_icons_manager.BlenderPresetIcons.Error.value
)
return {'CANCELLED'} return {'CANCELLED'}
# apply rail uv # apply rail uv
@ -34,7 +31,8 @@ class BBP_OT_rail_uv(bpy.types.Operator):
def draw(self, context): def draw(self, context):
layout: bpy.types.UILayout = self.layout layout: bpy.types.UILayout = self.layout
PROP_ptrprop_resolver.PtrPropResolver.draw_rail_uv_material(layout) ptrprops = PROP_ptrprop_resolver.PropsVisitor(context.scene)
ptrprops.draw_rail_uv_material(layout)
#region Real Worker Functions #region Real Worker Functions

View File

@ -1,6 +1,6 @@
import bpy import bpy
from bpy.types import Context, Event from bpy.types import Context, Event
from . import UTIL_functions from . import UTIL_functions, UTIL_virtools_types
## Intent ## Intent
# Operator is not allowed to register Pointer Properties. # Operator is not allowed to register Pointer Properties.
@ -45,15 +45,15 @@ class BBP_PG_ptrprop_resolver(bpy.types.PropertyGroup):
#endregion #endregion
def get_ptrprop_resolver() -> BBP_PG_ptrprop_resolver: def get_ptrprop_resolver(scene: bpy.types.Scene) -> BBP_PG_ptrprop_resolver:
return bpy.context.scene.bbp_ptrprop_resolver return scene.bbp_ptrprop_resolver
def get_ioport_encodings() -> UTIL_functions.CollectionVisitor[BBP_PG_bmap_encoding]: def get_ioport_encodings(scene: bpy.types.Scene) -> UTIL_functions.CollectionVisitor[BBP_PG_bmap_encoding]:
return UTIL_functions.CollectionVisitor(get_ptrprop_resolver().ioport_encodings) return UTIL_functions.CollectionVisitor(get_ptrprop_resolver(scene).ioport_encodings)
def get_active_ioport_encoding() -> int: def get_active_ioport_encoding(scene: bpy.types.Scene) -> int:
return get_ptrprop_resolver().active_ioport_encodings return get_ptrprop_resolver(scene).active_ioport_encodings
def set_active_ioport_encoding(val: int) -> None: def set_active_ioport_encoding(scene: bpy.types.Scene, val: int) -> None:
get_ptrprop_resolver().active_ioport_encodings = val get_ptrprop_resolver(scene).active_ioport_encodings = val
#region Blender Operator Defines for Encodings #region Blender Operator Defines for Encodings
@ -68,7 +68,7 @@ class BBP_OT_add_ioport_encodings(bpy.types.Operator):
return True return True
def execute(self, context): def execute(self, context):
encodings = get_ioport_encodings() encodings = get_ioport_encodings(context.scene)
encodings.add() encodings.add()
return {'FINISHED'} return {'FINISHED'}
@ -80,13 +80,19 @@ class BBP_OT_rm_ioport_encodings(bpy.types.Operator):
@classmethod @classmethod
def poll(cls, context: bpy.types.Context) -> bool: def poll(cls, context: bpy.types.Context) -> bool:
encodings = get_ioport_encodings() encodings = get_ioport_encodings(context.scene)
index = get_active_ioport_encoding() index = get_active_ioport_encoding(context.scene)
return index >= 0 and index < len(encodings) return index >= 0 and index < len(encodings)
def execute(self, context): def execute(self, context):
encodings = get_ioport_encodings() # delete selected item
encodings.remove(get_active_ioport_encoding()) encodings = get_ioport_encodings(context.scene)
index = get_active_ioport_encoding(context.scene)
encodings.remove(index)
# try to correct selected item
if index >= len(encodings): index = len(encodings) - 1
if index < 0: index = 0
set_active_ioport_encoding(context.scene, index)
return {'FINISHED'} return {'FINISHED'}
class BBP_OT_up_ioport_encodings(bpy.types.Operator): class BBP_OT_up_ioport_encodings(bpy.types.Operator):
@ -97,15 +103,15 @@ class BBP_OT_up_ioport_encodings(bpy.types.Operator):
@classmethod @classmethod
def poll(cls, context: bpy.types.Context) -> bool: def poll(cls, context: bpy.types.Context) -> bool:
encodings = get_ioport_encodings() encodings = get_ioport_encodings(context.scene)
index = get_active_ioport_encoding() index = get_active_ioport_encoding(context.scene)
return index >= 1 and index < len(encodings) return index >= 1 and index < len(encodings)
def execute(self, context): def execute(self, context):
encodings = get_ioport_encodings() encodings = get_ioport_encodings(context.scene)
index = get_active_ioport_encoding() index = get_active_ioport_encoding(context.scene)
encodings.move(index, index - 1) encodings.move(index, index - 1)
set_active_ioport_encoding(index - 1) set_active_ioport_encoding(context.scene, index - 1)
return {'FINISHED'} return {'FINISHED'}
class BBP_OT_down_ioport_encodings(bpy.types.Operator): class BBP_OT_down_ioport_encodings(bpy.types.Operator):
@ -116,15 +122,15 @@ class BBP_OT_down_ioport_encodings(bpy.types.Operator):
@classmethod @classmethod
def poll(cls, context: bpy.types.Context) -> bool: def poll(cls, context: bpy.types.Context) -> bool:
encodings = get_ioport_encodings() encodings = get_ioport_encodings(context.scene)
index = get_active_ioport_encoding() index = get_active_ioport_encoding(context.scene)
return index >= 0 and index < len(encodings) - 1 return index >= 0 and index < len(encodings) - 1
def execute(self, context): def execute(self, context):
encodings = get_ioport_encodings() encodings = get_ioport_encodings(context.scene)
index = get_active_ioport_encoding() index = get_active_ioport_encoding(context.scene)
encodings.move(index, index + 1) encodings.move(index, index + 1)
set_active_ioport_encoding(index + 1) set_active_ioport_encoding(context.scene, index + 1)
return {'FINISHED'} return {'FINISHED'}
class BBP_OT_clear_ioport_encodings(bpy.types.Operator): class BBP_OT_clear_ioport_encodings(bpy.types.Operator):
@ -142,55 +148,46 @@ class BBP_OT_clear_ioport_encodings(bpy.types.Operator):
return wm.invoke_confirm(self, event) return wm.invoke_confirm(self, event)
def execute(self, context): def execute(self, context):
encodings = get_ioport_encodings() encodings = get_ioport_encodings(context.scene)
encodings.clear() encodings.clear()
set_active_ioport_encoding(0) set_active_ioport_encoding(context.scene, 0)
return {'FINISHED'} return {'FINISHED'}
#endregion #endregion
class PtrPropResolver(): class PropsVisitor():
""" """
All outside code should use this class static methods to fetch property data or draw property. When outside code want to fetch or draw properties defined in ptrprop_resolver,
All function inside in this module should not be called directly. they should create the instance of this class with given associated scene instance first.
Then use this class provided member function to draw or fetch these properties.
The function located in this module should not be called directly!
""" """
@staticmethod __mAssocScene: bpy.types.Scene
def get_rail_uv_material() -> bpy.types.Material:
return get_ptrprop_resolver().rail_uv_material
@staticmethod
def draw_rail_uv_material(layout: bpy.types.UILayout) -> None:
layout.prop(get_ptrprop_resolver(), 'rail_uv_material')
@staticmethod def __init__(self, assoc_scene: bpy.types.Scene):
def get_export_collection() -> bpy.types.Collection: self.__mAssocScene = assoc_scene
return get_ptrprop_resolver().export_collection
@staticmethod
def draw_export_collection(layout: bpy.types.UILayout) -> None:
layout.prop(get_ptrprop_resolver(), 'export_collection')
@staticmethod def get_rail_uv_material(self) -> bpy.types.Material:
def get_export_object() -> bpy.types.Object: return get_ptrprop_resolver(self.__mAssocScene).rail_uv_material
return get_ptrprop_resolver().export_object def draw_rail_uv_material(self, layout: bpy.types.UILayout) -> None:
@staticmethod layout.prop(get_ptrprop_resolver(self.__mAssocScene), 'rail_uv_material')
def draw_export_object(layout: bpy.types.UILayout) -> None:
layout.prop(get_ptrprop_resolver(), 'export_object')
@staticmethod def get_export_collection(self) -> bpy.types.Collection:
def get_ioport_encodings() -> tuple[str, ...]: return get_ptrprop_resolver(self.__mAssocScene).export_collection
encodings = get_ioport_encodings() def draw_export_collection(self, layout: bpy.types.UILayout) -> None:
layout.prop(get_ptrprop_resolver(self.__mAssocScene), 'export_collection')
def get_export_object(self) -> bpy.types.Object:
return get_ptrprop_resolver(self.__mAssocScene).export_object
def draw_export_object(self, layout: bpy.types.UILayout) -> None:
layout.prop(get_ptrprop_resolver(self.__mAssocScene), 'export_object')
def get_ioport_encodings(self) -> tuple[str, ...]:
encodings = get_ioport_encodings(self.__mAssocScene)
return tuple(i.encoding for i in encodings) return tuple(i.encoding for i in encodings)
@staticmethod def draw_ioport_encodings(self, layout: bpy.types.UILayout) -> None:
def set_ioport_encodings(user_encodings: tuple[str, ...]) -> None: target = get_ptrprop_resolver(self.__mAssocScene)
encodings = get_ioport_encodings()
# clear and apply user encoding one by one
encodings.clear()
for user_encoding in user_encodings:
item = encodings.add()
item.encoding = user_encoding
@staticmethod
def draw_ioport_encodings(layout: bpy.types.UILayout) -> None:
target = get_ptrprop_resolver()
row = layout.row() row = layout.row()
# draw main list # draw main list
@ -212,11 +209,24 @@ class PtrPropResolver():
col.separator() col.separator()
col.operator(BBP_OT_clear_ioport_encodings.bl_idname, icon='TRASH', text='') col.operator(BBP_OT_clear_ioport_encodings.bl_idname, icon='TRASH', text='')
@bpy.app.handlers.persistent
def _ioport_encodings_initializer(file_path: str):
# if we can fetch property, and it is empty after loading file
# we fill it with default value
encodings = get_ioport_encodings(bpy.context.scene)
if len(encodings) == 0:
for default_enc in UTIL_virtools_types.g_PyBMapDefaultEncodings:
item = encodings.add()
item.encoding = default_enc
def register() -> None: def register() -> None:
bpy.utils.register_class(BBP_PG_bmap_encoding) bpy.utils.register_class(BBP_PG_bmap_encoding)
bpy.utils.register_class(BBP_UL_bmap_encoding) bpy.utils.register_class(BBP_UL_bmap_encoding)
bpy.utils.register_class(BBP_PG_ptrprop_resolver) bpy.utils.register_class(BBP_PG_ptrprop_resolver)
# register ioport encodings default value
bpy.app.handlers.load_post.append(_ioport_encodings_initializer)
bpy.utils.register_class(BBP_OT_add_ioport_encodings) bpy.utils.register_class(BBP_OT_add_ioport_encodings)
bpy.utils.register_class(BBP_OT_rm_ioport_encodings) bpy.utils.register_class(BBP_OT_rm_ioport_encodings)
bpy.utils.register_class(BBP_OT_up_ioport_encodings) bpy.utils.register_class(BBP_OT_up_ioport_encodings)
@ -234,6 +244,9 @@ def unregister() -> None:
bpy.utils.unregister_class(BBP_OT_rm_ioport_encodings) bpy.utils.unregister_class(BBP_OT_rm_ioport_encodings)
bpy.utils.unregister_class(BBP_OT_add_ioport_encodings) bpy.utils.unregister_class(BBP_OT_add_ioport_encodings)
# unregister ioport encodings default value
bpy.app.handlers.load_post.remove(_ioport_encodings_initializer)
bpy.utils.unregister_class(BBP_PG_ptrprop_resolver) bpy.utils.unregister_class(BBP_PG_ptrprop_resolver)
bpy.utils.unregister_class(BBP_UL_bmap_encoding) bpy.utils.unregister_class(BBP_UL_bmap_encoding)
bpy.utils.unregister_class(BBP_PG_bmap_encoding) bpy.utils.unregister_class(BBP_PG_bmap_encoding)

View File

@ -242,7 +242,7 @@ class ExportParams():
), ),
) # type: ignore ) # type: ignore
def draw_export_params(self, layout: bpy.types.UILayout) -> None: def draw_export_params(self, context: bpy.types.Context, layout: bpy.types.UILayout) -> None:
header: bpy.types.UILayout header: bpy.types.UILayout
body: bpy.types.UILayout body: bpy.types.UILayout
header, body = layout.panel("BBP_PT_ioport_shared_export_params", default_closed=False) header, body = layout.panel("BBP_PT_ioport_shared_export_params", default_closed=False)
@ -255,22 +255,24 @@ class ExportParams():
horizon_body.prop(self, "export_mode", expand = True) horizon_body.prop(self, "export_mode", expand = True)
# draw picker # draw picker
ptrprops = PROP_ptrprop_resolver.PropsVisitor(context.scene)
if self.export_mode == 'COLLECTION': if self.export_mode == 'COLLECTION':
PROP_ptrprop_resolver.PtrPropResolver.draw_export_collection(body) ptrprops.draw_export_collection(body)
elif self.export_mode == 'OBJECT': elif self.export_mode == 'OBJECT':
PROP_ptrprop_resolver.PtrPropResolver.draw_export_object(body) ptrprops.draw_export_object(body)
def general_get_export_objects(self) -> tuple[bpy.types.Object] | None: def general_get_export_objects(self, context: bpy.types.Context) -> tuple[bpy.types.Object] | None:
""" """
Return resolved exported objects or None if no selection. Return resolved exported objects or None if no selection.
""" """
ptrprops = PROP_ptrprop_resolver.PropsVisitor(context.scene)
if self.export_mode == 'COLLECTION': if self.export_mode == 'COLLECTION':
col: bpy.types.Collection = PROP_ptrprop_resolver.PtrPropResolver.get_export_collection() col: bpy.types.Collection = ptrprops.get_export_collection()
if col is None: return None if col is None: return None
else: else:
return tuple(col.all_objects) return tuple(col.all_objects)
else: else:
obj: bpy.types.Object = PROP_ptrprop_resolver.PtrPropResolver.get_export_object() obj: bpy.types.Object = ptrprops.get_export_object()
if obj is None: return None if obj is None: return None
else: return (obj, ) else: return (obj, )
@ -278,12 +280,6 @@ class ExportParams():
_g_EnumHelper_CK_TEXTURE_SAVEOPTIONS: UTIL_virtools_types.EnumPropHelper = UTIL_virtools_types.EnumPropHelper(UTIL_virtools_types.CK_TEXTURE_SAVEOPTIONS) _g_EnumHelper_CK_TEXTURE_SAVEOPTIONS: UTIL_virtools_types.EnumPropHelper = UTIL_virtools_types.EnumPropHelper(UTIL_virtools_types.CK_TEXTURE_SAVEOPTIONS)
class VirtoolsParams(): class VirtoolsParams():
vt_encodings: bpy.props.StringProperty(
name = "Encodings",
description = "The encoding list used by Virtools engine to resolve object name. Use `;` to split multiple encodings",
default = UTIL_virtools_types.g_PyBMapDefaultEncoding
) # type: ignore
texture_save_opt: bpy.props.EnumProperty( texture_save_opt: bpy.props.EnumProperty(
name = "Global Texture Save Options", name = "Global Texture Save Options",
description = "Decide how texture saved if texture is specified as Use Global as its Save Options.", description = "Decide how texture saved if texture is specified as Use Global as its Save Options.",
@ -304,7 +300,7 @@ class VirtoolsParams():
default = 5, default = 5,
) # type: ignore ) # type: ignore
def draw_virtools_params(self, layout: bpy.types.UILayout, is_importer: bool) -> None: def draw_virtools_params(self, context: bpy.types.Context, layout: bpy.types.UILayout, is_importer: bool) -> None:
header: bpy.types.UILayout header: bpy.types.UILayout
body: bpy.types.UILayout body: bpy.types.UILayout
header, body = layout.panel("BBP_PT_ioport_shared_virtools_params", default_closed=False) header, body = layout.panel("BBP_PT_ioport_shared_virtools_params", default_closed=False)
@ -313,8 +309,8 @@ class VirtoolsParams():
# draw encodings # draw encodings
body.label(text = 'Encodings') body.label(text = 'Encodings')
body.prop(self, 'vt_encodings', text = '') ptrprops = PROP_ptrprop_resolver.PropsVisitor(context.scene)
PROP_ptrprop_resolver.PtrPropResolver.draw_ioport_encodings(body) ptrprops.draw_ioport_encodings(body)
# following field are only valid in exporter # following field are only valid in exporter
if not is_importer: if not is_importer:
@ -329,10 +325,10 @@ class VirtoolsParams():
body.prop(self, 'compress_level') body.prop(self, 'compress_level')
def general_get_vt_encodings(self) -> tuple[str]: def general_get_vt_encodings(self, context: bpy.types.Context) -> tuple[str, ...]:
# get encoding, split it by `;` and strip blank chars. # get from ptrprop resolver then filter empty item
encodings: str = self.vt_encodings ptrprops = PROP_ptrprop_resolver.PropsVisitor(context.scene)
return tuple(map(lambda x: x.strip(), encodings.split(';'))) return tuple(filter(lambda encoding: len(encoding) != 0, ptrprops.get_ioport_encodings()))
def general_get_texture_save_opt(self) -> UTIL_virtools_types.CK_TEXTURE_SAVEOPTIONS: def general_get_texture_save_opt(self) -> UTIL_virtools_types.CK_TEXTURE_SAVEOPTIONS:
return _g_EnumHelper_CK_TEXTURE_SAVEOPTIONS.get_selection(self.texture_save_opt) return _g_EnumHelper_CK_TEXTURE_SAVEOPTIONS.get_selection(self.texture_save_opt)

View File

@ -270,6 +270,9 @@ def virtools_name_regulator(name: str | None) -> str:
# Since LibCmo 0.2, the encoding name of LibCmo become universal encoding which is platfoorm independent. # Since LibCmo 0.2, the encoding name of LibCmo become universal encoding which is platfoorm independent.
# So no need set it according to different platform. # So no need set it according to different platform.
# Use universal encoding name (like Python). # Use universal encoding name (like Python).
g_PyBMapDefaultEncoding: str = 'cp1252;gb2312' g_PyBMapDefaultEncodings: tuple[str, ...] = (
'cp1252',
'gb2312'
)
#endregion #endregion