Good behavior.
All areas can have it own active tab
Bad behavior.
Switch tab in one Area also change tab in other.
How Desynchronize Tabs and its content in single Area type, single Tab Panel?
Good behavior.
All areas can have it own active tab
Bad behavior.
Switch tab in one Area also change tab in other.
How Desynchronize Tabs and its content in single Area type, single Tab Panel?
Ok. Solved.
I done it with region id. And if use UI elements which dont change his visual states (menu)
import bpy
from bpy.props import IntProperty
global reg_map
reg_map = {}
def map_region(id, item = 1):
reg_map[id] = item
return
class tabs_switch(bpy.types.Operator):
bl_idname = "tabs.switch"
bl_label = "Tabs Switch"
menu_item = bpy.props.IntProperty(name="Menu item", default = 1)
def execute(self, context):
if bpy.context.area.type != "VIEW_3D":
return {'FINISHED'}
reg_id = bpy.context.area.regions[1].id
if not reg_id in reg_map:
map_region(id = reg_id)
else:
reg_map[reg_id] = self.menu_item
return{'FINISHED'}
class tabs_menu(bpy.types.Menu):
bl_label = "Switch Tab"
def draw(self, context):
layout = self.layout
layout.operator("tabs.switch", text="Open Tab 1", icon='COLOR_RED')
layout.operator("tabs.switch", text="Open Tab 2", icon='COLOR_GREEN').menu_item = 2
layout.operator("tabs.switch", text="Open Tab 3", icon='COLOR_BLUE').menu_item = 3
layout.separator()
layout.operator("wm.splash", icon='BLENDER')
class TabsPanel(bpy.types.Panel):
bl_label = "Menu"
bl_space_type = 'VIEW_3D'
bl_region_type = 'TOOLS'
selected = 1
def draw(self, context):
layout = self.layout
reg_id = bpy.context.area.regions[1].id
if not reg_id in reg_map:
map_region(id = reg_id)
return
else:
self.selected = reg_map[reg_id]
a_type = bpy.context.area.type
r_type = bpy.context.area.regions[1].type
r_id = bpy.context.area.regions[1].id
layout.menu("tabs_menu")
if self.selected == 1:
row = layout.row()
row.label(icon='COLOR_RED', text ='TAB 1')
row = layout.row()
row.label('area type: '+ a_type)
row = layout.row()
row.label('region type: ' + r_type)
row = layout.row()
row.label('region id: ' + str(r_id))
elif self.selected == 2:
row = layout.row(align=True)
row.label(icon='COLOR_GREEN', text ='TAB 2')
row = layout.row()
row.label('area type: '+ a_type)
row = layout.row()
row.label('region type: ' + r_type)
row = layout.row()
row.label('region id: ' + str(r_id))
elif self.selected == 3:
row = layout.row(align=True)
row.label(icon='COLOR_BLUE', text ='TAB 3')
row = layout.row()
row.label('area type: '+ a_type)
row = layout.row()
row.label('region type: ' + r_type)
row = layout.row()
row.label('region id: ' + str(r_id))
else:
row = layout.row()
row.label('Unknown TAB selected!')
def register():
bpy.utils.register_class(tabs_switch)
bpy.utils.register_class(tabs_menu)
bpy.utils.register_class(TabsPanel)
def unregister():
bpy.utils.unregister_class(tabs_switch)
bpy.utils.register_class(tabs_menu)
bpy.utils.unregister_class(TabsPanel)
if __name__ == "__main__":
register()
Anybody know how get Area identificator?
In old Blender was GetAreaID() function
It usable without Area ID
You can replace this:
reg_id = bpy.context.area.regions[1].id
if not reg_id in reg_map:
map_region(id = reg_id)
else:
reg_map[reg_id] = self.menu_item
To this:
ar = bpy.context.area
if not ar in reg_map:
map_region(id = ar)
else:
reg_map[ar] = self.menu_item
Experiments with this metod
Remember selected Editor and Tools in dictionary and use Area as identificator.